-
Notifications
You must be signed in to change notification settings - Fork 7
Specification
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:
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ềnBuffer.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 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.
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ộ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]
Lưu ý: Tham số thao tác cần được chuyển đổi thành Buffer trước khi đưa vào giao dịch.
const CreateAccountParams = vstruct([
{ name: 'address', type: vstruct.Buffer(35) },
]);const PaymentParams = vstruct([
{ name: 'address', type: vstruct.Buffer(35) },
{ name: 'amount', type: vstruct.UInt64BE },
]);const PostParams = vstruct([
{ name: 'content', type: vstruct.VarBuffer(vstruct.UInt16BE) },
{ name: 'keys', type: vstruct.VarArray(vstruct.UInt8, vstruct.Buffer(42)) },
]);content được tổ chức theo cấu trúc như sau. Hiện tại type là 1 tương ứng với nội dung text đơn giản:
const PlainTextContent = vstruct([
{ name: 'type', type: vstruct.UInt8 },
{ name: 'text', type: vstruct.VarString(vstruct.UInt16BE) },
]);Cho keys = [] để đăng bài viết chế độ công khai (không mã hóa).
Ví dụ: https://forest.network/transactions/1B170AE893B1FA37AAF347780F59FE274B1CE2DE4DFE8B5D4115FD69ABE4B937
const UpdateAccountParams = vstruct([
{ name: 'key', type: vstruct.VarString(vstruct.UInt8) },
{ name: 'value', type: vstruct.VarBuffer(vstruct.UInt16BE) },
]);Các thông tin của tài khoản có thể được cập nhật theo thời gian, value sau sẽ thay thế cho value trước đó nếu cùng key. Lưu ý: KHÔNG CÓ chức năng cập nhật khóa công khai/bí mật của tài khoản do không thể thay đổi.
Các key chuẩn:
-
'name':value.toString('utf-8')là tên hiển thị của tài khoản trên mạng xã hội. Ví dụ: https://forest.network/transactions/480F366CE167F70CFE674D6BAE054F63F46A0C4226E4BA487791475FCA9B1EAB -
'picture':valuelà dạng nhị phân của hình ảnh JPEG/PNG/GIF. Hiện tại các tài khoản bị giới hạn bandwidth ~ 21kB/24 tiếng, do đó chỉ cập nhật được hình ảnh tối đa ~20kB, phải resize kích thước hợp lý => sẽ bổ sung tiền cho các account. Ví dụ: https://forest.network/transactions/0F6A2312C606A0B493638E5519E05CDBDB6EDB56B324345C9C1FF5C973D214E6 và hiển thị hình ảnh tài khoản https://forest.network/accounts/GAO4J5RXQHUVVONBDQZSRTBC42E3EIK66WZA5ZSGKMFCS6UNYMZSIDBI -
'followings': Giá trị củakeylà ,valuecó cấu trúc như sau
const Followings = vstruct([
{ name: 'addresses', type: vstruct.VarArray(vstruct.UInt16BE, vstruct.Buffer(35)) },
]);Dùng base32 để chuyển về địa chỉ/khóa công khai của tài khoản được người dùng.
const InteractParams = vstruct([
{ name: 'object', type: vstruct.Buffer(32) },
{ name: 'content', type: vstruct.VarBuffer(vstruct.UInt16BE) },
]);Object là mã giao dịch của hoạt động (giao dịch/bài viết) được tương tác. Hiện tại có 2 loại nội dung tương tác:
-
PlainTextContent(tham khảo phần đăng nội dung):typebằng 1, bình luận trên hoạt động -
ReactContent:typebằng 2, phản ứng hoạt động, nếu trước đó đã có phản ứng thì phản ứng sau sẽ THAY THẾ phản ứng trước
const ReactContent = vstruct([
{ name: 'type', type: vstruct.UInt8 },
{ name: 'reaction', type: vstruct.UInt8 },
]);-
reaction = 0: Không phản ứng (hủy bỏ phản ứng trước đó) -
reaction = 1: Like -
reaction = 2: Love -
reaction = 3: Haha -
reaction = 4: Wow -
reaction = 5: Sad -
reaction = 6: Angry
Gợi ý: Tạo struct Content chỉ với thuộc tính type để biết loại của nội dung hoặc try... catch từng loại (tham khảo các dò phiên bản giao dịch ở máy chủ)