Skip to content

Specification

Kha N. Do edited this page Dec 3, 2018 · 15 revisions

Đặc tả hệ thống

Một khối (block) có thể bao gồm nhiều giao dịch (transaction), khối do các nút xác thực (validator node) tạo ra và đưa và chuỗi khối. Cấu trúc của một giao dịch (tham khảo (vstruct)[https://github.com/varstruct/varstruct] phiên bản 1:

Giao dịch

const Transaction = vstruct([
  { name: 'version', type: vstruct.UInt8 },
  { name: 'account', type: vstruct.Buffer(35) },
  { name: 'sequence', type: vstruct.UInt64BE },
  { name: 'memo', type: vstruct.VarBuffer(vstruct.UInt8) },
  { name: 'operation', type: vstruct.UInt8 },
  { name: 'params', type: vstruct.VarBuffer(vstruct.UInt16BE) },
  { name: 'signature', type: vstruct.Buffer(64) },
]);
  • version: Phiên bản đặc tả giao dịch (hiện tại là 1)
  • account: Địa chỉ (address)/Khóa công khai (public key) của tài khoản
  • sequence: Thứ tự giao dịch của tài khoản, bắt đầu từ 1 và PHẢI tăng dần sau mỗi giao dịch thực hiện thành công
  • memo: Ghi chú giao dịch (tùy chọn), nếu bỏ qua thì điền Buffer.alloc(0)
  • operation: Thao tác thực hiện
    • 1: Tạo tài khoản
    • 2: Chuyển khoản
    • 3: Đăng nội dung
    • 4: Cập nhật tài khoản
  • params: Tham số tùy vào thao tác
  • signature: Chữ ký

Tài khoản

Tài khoản trong hệ thống được định danh bằng khóa công khai hoặc địa chỉ. Sử dụng thuật toán ed25519 và thư viện stellar-base. Để tạo ra một cặp khóa sử dụng lệnh:

const { Keypair } = require('stellar-base');

const key = Keypair.random();
console.log(key.secret());
console.log(key.publicKey());

Một cặp khóa được tạo ra cần được tạo một tài khoản tương ứng bởi một tài khoản đã có sẵn trên hệ thống. Các thành viên cung cấp địa chỉ (không được cung cấp khóa bí mật) để được tạo tài khoản và chuyển tiền sử dụng để phát triển đồ án.

Chữ ký

Sử dụng hàm sign của Keypair trên SHA256 của giao dịch (đã loại trừ chữ ký, điền 64 byte 0):

tx.signature = Buffer.alloc(64, 0);
const data = Transaction.encode(tx);
const unsignedHash = crypto
  .createHash('sha256')
  .update(data)
  .digest();
tx.signature = key.sign(data);

Mã giao dịch

Một giao dịch được định danh bằng mã giao dịch là 20 bytes SHA256 của giao dịch:

const hash = crypto.createHash('sha256')
  .update(Transaction.encode(tx))
  .digest()
  .slice(0, 20)
  .toString('hex')
  .toUpperCase(); 

Giao dịch của thể tìm thấy bằng cách sử dụng API host/tx?hash=0x[hash]

Thao tác

Tạo tài khoản

const CreateAccountParams = vstruct([
  { name: 'address', type: vstruct.Buffer(35) },
]);

Thanh toán

const PaymentParams = vstruct([
  { name: 'address', type: vstruct.Buffer(35) },
  { name: 'amount', type: vstruct.UInt64BE },
]);

Đăng nội dung

const EncryptionKey = vstruct([
  { name: 'nonce', type: vstruct.Buffer(24) },
  { name: 'box', type: vstruct.Buffer(42) },
]);

const PostParams = vstruct([
  { name: 'content', type: vstruct.VarBuffer(vstruct.UInt16BE) },
  { name: 'keys', type: vstruct.VarArray(vstruct.UInt8, EncryptionKey) }
]);

Cho keys = [] để đăng bài viết chế độ công khai (không mã hóa).

Cập nhật tài khoản

const UpdateAccountParams = vstruct([
  { name: 'name', type: vstruct.VarString(vstruct.UInt8) },
]);

Cập nhật tên hiển thị của tài khoản.

Clone this wiki locally