Stellar là gì? Stellar hoạt động như thế nào?

I. Tổng quan về stellar

Stellar là một dự án mạng mã nguồn mở, hướng tới việc giải quyết các vấn đề về tiền tệ và thanh toán. Stellar cung cấp khả năng tạo, gửi và trao đổi các token biểu diễn các loại tiền như dollars, pesos, bitcoin,... dưới dạng kĩ thuật số. Nó được thiết kế với mục tiêu đưa toàn bộ hệ thống tài chính thế giới vào trong một mạng lưới duy nhất.

Stellar không được sở hữu bởi bất kì cá nhân hay tổ chức nào, mà thuộc về toàn bộ cộng đồng. Hệ thống được chạy trên một mạng lưới mở, phi tập trung và xử lý hàng triệu giao dịch mỗi ngày. Giống như Bitcoin và Ethereum, Stellar dựa vào blockchain để giữ cho mạng được đồng bộ hóa, nhưng lại mang lại trải nghiệm giống với sử dụng tiền mặt cho người dùng. Stellar nhanh hơn, rẻ hơn và tiết kiệm năng lượng hơn các hệ thống dựa trên blockchain thông thường.

II. Stellar dùng để làm gì?

Mạng lưới Stellar ra mắt vào năm 2015. Kể từ đó đến nay, nó đã xử lý hơn 450 triệu hoạt động được thực hiện bởi hơn 4 triệu tài khoản cá nhân. Các công ty lớn như IBM và Franklin Templeton hay các công ty nhỏ như các công ty khởi nghiệp đã chọn Stellar để chuyển tiền và tiếp cận các thị trường mới.

Ngay từ ban đầu, Stellar đã mang những đặc điểm của hệ thống tiền điện tử, tuy nhiên stellar luôn hướng tới việc nâng cao thay vì hủy hoại hay thay thế hệ thống tài chính hiện có. Trong khi mạng Bitcoin sinh ra chỉ để giao dịch Bitcoin thì Stellar là một hệ thống phi tập trung tuyệt vời để giao dịch bất kì loại tiền nào một cách minh bạch và hiệu quả.

Ví dụ : Bạn muốn tạo một biểu diễn kĩ thuật số của đồng US dollar trên Stellar và gọi nó là "dollar token". Sau đó bạn sẽ bảo với thế giới rằng, bất cứ khi nào ai mang 1 dollar đến cho bạn, bạn sẽ đưa họ 1 "dollar token" và ngược lại, khi một người mang "dollar token" trở lại thì bạn phải đảm bảo có thể đưa lại cho họ dollar. Khi đó bạn đã tạo mối quan hệ 1:1 giữa đồng tiền kĩ thuật số của bạn và dollar . Vậy nên khi mọi người giữ đồng dollar token, họ có thể sử dụng với các tính năng như tiền truyền thống và có thể quy đổi ra tiền khi họ muốn. Tất nhiên ngoài dollar bạn cũng có thể tạo biểu diễn kĩ thuật số cho bất cứ loại tiền nào khác.

Điều này khá giống với công việc mà các ngân hàng lớn nhỏ trên toàn thế giới đang hoạt động mỗi ngày. Tuy nhiên điểm khác biệt ở đây nằm ở chỗ token có thể dùng để trao đổi và mua bán trên toàn thế giới mà không cần phải qua giải quyết và phê duyệt của ngân hàng. Chính nhờ điều này, Stellar network khiến cho tiền tệ không có bất cứ biên giới nào. Một người làm việc ở Mỹ hay châu Âu có thể gửi dollar token về Việt Nam bất cứ khi nào. Một công ty Việt Nam có thể trả tiền cho công nhân đang ở Lào qua Stellar network,...

Stellar còn cho phép người dùng gửi một loại tiền và người nhận sẽ nhận được một loại tiền khác. Về cơ bản, bạn có thể gửi và trao đổi tiền trong một automic transaction ( tức các token sẽ được tự động trao đổi theo tỉ giá hiện tại trên stellar network).

Giống như các mạng blockchain khác, Stellar cũng có native crypto currency là lumen. Hệ thống sẽ yêu cầu người dùng phải có một lượng rất nhỏ lumen để khởi tạo tài khoản cũng như gửi transaction ( 0.00001 lumen mỗi giao dịch). Ngoài yêu cầu trên thì Stellar không ưu tiên bất cứ loại tiền nào.

III. Stellar hoạt động như thế nào?

Ở mức thấp nhất, Stellar có thể hiểu là một hệ thống để theo dõi quyền sở hữu. Giống như việc kế toán đã làm nhiều thế kỷ, nó sử dụng một sổ cái để làm như vậy. Sự khác biệt là Stellar không có kế toán viên thực sự. Thay vào đó, có một mạng lưới các máy tính độc lập, mỗi máy tính kiểm tra và rà soát lại công việc của các máy tính khác. Stellar là một hệ thống không có cơ quan trung ương, có nghĩa là không ai có thể dừng mạng hoặc bí mật điều chỉnh các số theo ý thích của mình ngay cả khi không có cơ quan trung ương, các sổ cái được xác minh và cập nhật, cứ sau 5 giây.

Một thuật toán được gọi là Stellar Consensus Protocol (SCP), giữ mọi thứ đồng bộ. Có nhiều cách để đạt được đồng thuận trên một hệ thống phi tập trung, proof of work của Bitcoin là phương pháp đầu tiên và vẫn là nổi tiếng nhất. Tuy nhiên chính vì việc là người tiên phong, proof of work còn rất nhiều vấn đề để cải thiện. SCP phấn đấu để trở nên tốt hơn bằng cách có thể cấu hình, hệ thống chạy nhanh hơn và tiết kiệm năng lượng. Tìm hiểu thêm về SCP tại đây

Đối với mọi chủ tài khoản, Stellar’s ledger lưu trữ hai thứ quan trọng: những gì họ sở hữu (số dư tài khoản, như số tiền 100 peso tokens hay hoặc 5000 5000 lumens) và những gì họ muốn làm với những gì họ sở hữu (hoạt động, như cách bán 10 token trong 50 lumens, hoặc, gửi 100 peso token vào tài khoản tương tự như vậy.) Cứ sau năm giây, tất cả số dư và tất cả các hành động được giải quyết và lan truyền toàn bộ mạng.

Các máy tính chạy Stellar core, lưu trữ và kiểm tra ledger được gọi là các nodes. Vì vậy, khi bạn gửi cho ai đó euro token trên ứng dụng sử dụng Stellar, các nodes sẽ kiểm tra xem số dư chính xác đã được ghi hay chưa, và mỗi node đảm bảo mọi node khác đều thấy và đồng thuận với giao dịch. Mạng Stellar hiện tại được xác minh bởi hàng trăm nodes trên toàn cầu; các nodes và cách chúng giao tiếp là thông tin công khai và bất kỳ ai cũng có thể cài đặt phần mềm Stellar và tham gia vào quy trình đồng thuận. Điều này khác với cách hoạt động của kế toán tại một ngân hàng, nơi một tập đoàn đơn phương quyết định những gì xảy ra.

Ngay bên trên lớp lõi này chứa API để để xây dựng trên Stellar, cung cấp cho các developer khả năng xây dựng ứng dụng Stellar mà không cần phải tìm hiểu quá sâu về các thuật toán đồng thuận. Đọc thêm về Stellar SDK tại đây

III. Kiến trúc hệ thống Stellar

Sử dụng mạng Stellar, bạn có thể xây dựng ví di động, công cụ ngân hàng, thiết bị thông minh tự trả tiền và bất kỳ thứ gì khác bạn muốn liên quan đến thanh toán! Mặc dù Stellar là một hệ thống phân tán phức tạp, nhưng làm việc với nó không hề phức tạp chút nào.

API: Horizon

Hầu hết các ứng dụng tương tác với mạng Stellar thông qua Horizon, máy chủ API RESTful. Horizon cung cấp cho bạn một cách đơn giản để gửi giao dịch, kiểm tra tài khoản và theo dõi các sự kiện. Bởi vì nó chỉ là HTTP, bạn có thể giao tiếp với Horizon bằng trình duyệt web, các công cụ dòng lệnh đơn giản như cURL hoặc Stellar SDK cho ngôn ngữ lập trình yêu thích của bạn. Cách dễ nhất để cài đặt Horizon là sử dụng stellar / quickstart docker image.

Stellar.org duy trì các SDK dựa trên JavaScript, JavaGo để giao tiếp với Horizon. Ngoài ra còn có SDK do cộng đồng duy trì cho Ruby, PythonC #.

Stellar Core

Mọi máy chủ Horizon kết nối với Stellar Core, xương sống của mạng Stellar. Phần mềm Stellar Core thực hiện công việc xác nhận trạng thái của mọi giao dịch thông qua Stellar Consensus Protocol (SCP).

Mạng lưới Stellar là một tập hợp các Stellar Cores trên toàn thế giới, mỗi nhóm được duy trì bởi những người và tổ chức khác nhau. Tất cả các nodes cùng đồng thuận về các giao dịch. Mỗi giao dịch trên mạng có chi phí nhỏ: 100 stroops (0,00001 XLM). Phí này giúp ngăn chặn các tác nhân xấu gửi spam mạng.

IV. Demo

Trước khi bắt tay vào code , chúng ta cùng xem qua Stellar Laboratory - cho phép tương tác với mạng stellar thông qua UI. Stellar Laboratory cho phép bạn tạo tài khoản, nhận tiền trên Stellar testnet, xây dựng giao dịch, chạy các hành động bất kì và kiểm tra phản hồi từ Horizon thông qua Endpoint Explorer.

1. Tạo tài khoản Stellar

Ok. Cũng như việc bạn đã thực hiện thông qua Laboratory, việc đầu tiên cần làm để tương tác với Stellar network chính là tạo một tài khoản. Các tài khoản giữ tất cả tiền của bạn bên trong Stellar và cho phép bạn gửi và nhận thanh toán, trên thực tế, hầu hết mọi thứ trong Stellar đều theo một cách nào đó gắn liền với một tài khoản.

Mỗi tài khoản Stellar đều có public key và hạt private seed. Stellar sử dụng public key cryptography để đảm bảo mọi giao dịch đều an toàn. Những người khác sử dụng public key để xác định tài khoản của bạn và xác minh rằng bạn đã ủy quyền giao dịch. Trong khi đó, private seed, là thông tin riêng tư chứng minh bạn sở hữu tài khoản của mình. Bạn không bao giờ nên chia sẻ private seed với bất cứ ai bởi người đó có thể nắm quyền sở hữu tài khoản của bạn.

// create a completely new and unique pair of keys
// see more about KeyPair objects: https://stellar.github.io/js-stellar-sdk/Keypair.html
const pair = StellarSdk.Keypair.random();

pair.secret();
// SAV76USXIJOBMEQXPANUOQM6F5LIOTLPDIDVRJBFFE2MDJXG24TAPUU7
pair.publicKey();
// GCFXHS4GXL6BVUCXBWXGTITROWLVYXQKQLF4YH5O5JT3YZXCYPAFBJZB

Bây giờ đã có seed và public key, bạn đã có thể tạo stellar account. Để ngăn ngừa việc tạo ra một loạt các tài khoản không cần thiết, mỗi account phải có ít nhất 1 lumens. Tuy nhiên trên Stellar testnet bạn có thể yêu cầu Friendbot để tạo tài khoản.

// The SDK does not have tools for creating test accounts, so you'll have to
// make your own HTTP request.

// if you're trying this on Node, install the `node-fetch` library and
// uncomment the next line:
// const fetch = require('node-fetch');

(async function main() {
  try {
    const response = await fetch(
      `https://friendbot.stellar.org?addr=${encodeURIComponent(pair.publicKey())}`
    );
    const responseJSON = await response.json();
    console.log("SUCCESS! You have a new account :)\n", responseJSON);
  } catch (e) {
    console.error("ERROR!", e);
  }
})()

Ok. Giờ chỉ việc kiểm tra thông tin tài khoản mà bạn vừa nhận được thôi. Mỗi tài khoản có thể chứa nhiều loại token khác nhau.

const server = new StellarSdk.Server("https://horizon-testnet.stellar.org");

// the JS SDK uses promises for most actions, such as retrieving an account
const account = await server.loadAccount(pair.publicKey());
console.log("Balances for account: " + pair.publicKey());
account.balances.forEach(function(balance) {
  console.log("Type:", balance.asset_type, ", Balance:", balance.balance);
});

2. Gửi/ nhận tiền

Gửi tiền

Các hành động mà tạo nên sự thay đổi trên Stellar network như gửi thanh toán, thay đổi tài khoản của bạn hoặc thực hiện các đề nghị để giao dịch các loại tiền tệ khác nhau được gọi là operation.

Để thực sự thực hiện một operation, bạn tạo một transaction, đó chỉ là một tập các operation kèm theo một số thông tin bổ sung, như tài khoản nào đang thực hiện giao dịch và chữ ký điện tử để xác minh rằng giao dịch là xác thực. Nếu một operation bất kì bị fail thì toàn bộ trasaction cũng bị fail.

Ví dụ: Bạn có 100 lumen và bạn thực hiện 2 hành động gửi 60 lumen. Nếu 2 hành động được thực hiện ở 2 transaction khác nhau thì bạn sẽ thực hiện thành công 1 giao dịch và còn lại 40 lumen. Tuy nhiên nếu 2 hành động cùng được gửi trong 1 transaction thì giao dịch sẽ bị fail và bạn còn lại 100 lumen trong tài khoản.

Stellar lưu trữ và truyền đạt dữ liệu giao dịch ở định dạng nhị phân gọi là XDR. May mắn thay, SDK Stellar cung cấp các công cụ xử lý tất cả những thứ đó. Dưới đây là cách bạn có thể gửi 10 lumens đến một tài khoản khác:

var StellarSdk = require('stellar-sdk');
var server = new StellarSdk.Server('https://horizon-testnet.stellar.org');
var sourceKeys = StellarSdk.Keypair
  .fromSecret('SCZANGBA5YHTNYVVV4C3U252E2B6P6F5T3U6MM63WBSBZATAQI3EBTQ4');
var destinationId = 'GA2C5RFPE6GCKMY3US5PAB6UZLKIGSPIUKSLRB6Q723BM2OARMDUYEJ5';
// Transaction will hold a built transaction we can resubmit if the result is unknown.
var transaction;

// First, check to make sure that the destination account exists.
// You could skip this, but if the account does not exist, you will be charged
// the transaction fee when the transaction fails.
server.loadAccount(destinationId)
  // If the account is not found, surface a nicer error message for logging.
  .catch(function (error) {
    if (error instanceof StellarSdk.NotFoundError) {
      throw new Error('The destination account does not exist!');
    } else return error
  })
  // If there was no error, load up-to-date information on your account.
  .then(function() {
    return server.loadAccount(sourceKeys.publicKey());
  })
  .then(function(sourceAccount) {
    // Start building the transaction.
    transaction = new StellarSdk.TransactionBuilder(sourceAccount, {
      fee: StellarSdk.BASE_FEE,
      networkPassphrase: StellarSdk.Networks.TESTNET
    })
      .addOperation(StellarSdk.Operation.payment({
        destination: destinationId,
        // Because Stellar allows transaction in many currencies, you must
        // specify the asset type. The special "native" asset represents Lumens.
        asset: StellarSdk.Asset.native(),
        amount: "10"
      }))
      // A memo allows you to add your own metadata to a transaction. It's
      // optional and does not affect how Stellar treats the transaction.
      .addMemo(StellarSdk.Memo.text('Test Transaction'))
      // Wait a maximum of three minutes for the transaction
      .setTimeout(180)
      .build();
    // Sign the transaction to prove you are actually the person sending it.
    transaction.sign(sourceKeys);
    // And finally, send it off to Stellar!
    return server.submitTransaction(transaction);
  })
  .then(function(result) {
    console.log('Success! Results:', result);
  })
  .catch(function(error) {
    console.error('Something went wrong!', error);
    // If the result is unknown (no response body, timeout etc.) we simply resubmit
    // already built transaction:
    // server.submitTransaction(transaction);
  });

Cùng phân tích đoạn code trên:

  1. Đầu tiên cân xác nhận rằng ID tài khoản bạn đang gửi thực sự tồn tại bằng cách tải dữ liệu tài khoản được liên kết từ mạng Stellar. Mọi thứ sẽ thực sự ổn nếu bạn bỏ qua bước này, nhưng thực hiện nó mang lại cho bạn cơ hội để tránh thực hiện một giao dịch mà bạn biết sẽ thất bại. Bạn cũng có thể sử dụng cuộc gọi này để thực hiện bất kỳ xác minh nào khác mà bạn có thể muốn thực hiện trên tài khoản đích:
server.loadAccount(destinationId)
  .then(function(account) { /* validate the account */ })
  1. Tải dữ liệu cho tài khoản bạn đang gửi. Một tài khoản chỉ có thể thực hiện một giao dịch tại một thời điểm và có một thứ gọi là sequence number, giúp Stellar xác minh thứ tự giao dịch. Số thứ tự chuỗi giao dịch cần khớp với số thứ tự của tài khoản, vì vậy bạn cần lấy số thứ tự hiện tại của tài khoản từ mạng.
.then(function() {
    return server.loadAccount(sourceKeys.publicKey());
})
  1. Bây giờ chúng ta mới đầu xây dựng một giao dịch. Điều này đòi hỏi một đối tượng tài khoản, không chỉ ID tài khoản, bởi vì nó sẽ tăng số thứ tự của tài khoản.
var transaction = new StellarSdk.TransactionBuilder(sourceAccount)
  1. Thêm operation vào tài khoản. Lưu ý rằng bạn cần chỉ định loại tài sản mà bạn đang gửi - Stellar native token là lumen, nhưng bạn có thể gửi bất kỳ loại tài sản hoặc loại tiền nào bạn muốn, từ dollar đến bitcoin đến bất kỳ loại tài sản nào bạn tin tưởng.
.addOperation(StellarSdk.Operation.payment({
  destination: destinationId,
  asset: StellarSdk.Asset.native(),
  amount: "10"
}))

Lưu ý: Số lượng là chuỗi chứ không phải dạng số. 5. Bạn cũng có thể tùy ý thêm vào các metadata thông qua memo tuy nhiên stellar sẽ không sử dụng đến dữ liệu này/

.addMemo(StellarSdk.Memo.text('Test Transaction'))
  1. Bây giờ giao dịch có tất cả dữ liệu cần thiết, bạn phải ký bằng cách sử dụng private seed của mình. Điều này chứng tỏ rằng dữ liệu thực sự đến từ bạn chứ không phải ai đó mạo danh.
transaction.sign(sourceKeys);
  1. Cuối cùng là gửi lên Stellar network:
server.submitTransaction(transaction);

Nhận tiền

Bạn không cần phải làm gì để có thể nhận tiền trên stellar network. Nếu một người gửi tiền cho bạn thì số tiền đó sẽ được tự động chuyển vào tài khoản.

Tuy nhiên, bạn vẫn cần phải biết thông tin của người gửi tiền đến cho mình.

var StellarSdk = require('stellar-sdk');

var server = new StellarSdk.Server('https://horizon-testnet.stellar.org');
var accountId = 'GC2BKLYOOYPDEFJKLKY6FNNRQMGFLVHJKQRGNSSRRGSMPGF32LHCQVGF';

// Create an API call to query payments involving the account.
var payments = server.payments().forAccount(accountId);

// If some payments have already been handled, start the results from the
// last seen payment. (See below in `handlePayment` where it gets saved.)
var lastToken = loadLastPagingToken();
if (lastToken) {
  payments.cursor(lastToken);
}

// `stream` will send each recorded payment, one by one, then keep the
// connection open and continue to send you new payments as they occur.
payments.stream({
  onmessage: function(payment) {
    // Record the paging token so we can start from here next time.
    savePagingToken(payment.paging_token);

    // The payments stream includes both sent and received payments. We only
    // want to process received payments here.
    if (payment.to !== accountId) {
      return;
    }

    // In Stellar’s API, Lumens are referred to as the “native” type. Other
    // asset types have more detailed information.
    var asset;
    if (payment.asset_type === 'native') {
      asset = 'lumens';
    }
    else {
      asset = payment.asset_code + ':' + payment.asset_issuer;
    }

    console.log(payment.amount + ' ' + asset + ' from ' + payment.from);
  },

  onerror: function(error) {
    console.error('Error in payment stream');
  }
});

function savePagingToken(token) {
  // In most cases, you should save this to a local database or file so that
  // you can load it next time you stream new payments.
}

function loadLastPagingToken() {
  // Get the last paging token from a local database or file
}

Có hai phần chính của chương trình này. Đầu tiên, bạn tạo một truy vấn cho các khoản thanh toán liên quan đến một tài khoản nhất định.

Giống như hầu hết các truy vấn trong Stellar, điều này có thể trả về một số lượng lớn các mục, do đó API trả về các mã thông báo phân trang, mà bạn có thể sử dụng sau này để bắt đầu truy vấn của mình từ cùng một điểm mà trước đó bạn đã bỏ đi. Trong ví dụ trên, các chức năng lưu và tải mã thông báo phân trang được để trống, nhưng trong một ứng dụng thực, bạn muốn lưu mã thông báo phân trang vào một tệp hoặc cơ sở dữ liệu để bạn có thể chọn nơi bạn rời khỏi trong trường hợp chương trình sự cố hoặc người dùng đóng nó.

var payments = server.payments().forAccount(accountId);
var lastToken = loadLastPagingToken();
if (lastToken) {
  payments.cursor(lastToken);
}

Thứ hai, kết quả của truy vấn được streamed. Đây là cách dễ nhất để xem thanh toán hoặc các giao dịch khác. Mỗi khoản thanh toán hiện tại được gửi qua stream, từng cái một. Khi tất cả các khoản thanh toán hiện tại đã được gửi, luồng vẫn mở và các khoản thanh toán mới được gửi ngay khi chúng được thực hiện.

payments.stream({
  onmessage: function(payment) {
    // handle a payment
  }
});

Bạn cũng có thể yêu cầu thanh toán theo nhóm hoặc trang. Khi bạn đã xử lý từng trang thanh toán, bạn sẽ cần yêu cầu trang tiếp theo cho đến khi không còn thanh toán nào.

payments.call().then(function handlePage(paymentsPage) {
  paymentsPage.records.forEach(function(payment) {
    // handle a payment
  });
  return paymentsPage.next().then(handlePage);
});

V. Source

Các ứng dụng của stellar: https://galactictalk.org/t/winners

Document: https://www.stellar.org/