Transaction trong Sui
Nội dung sẽ giới thiệu về các loại transactions trên sui và làm thế nào để được executed.
- Transaction là khái niệm cơ bản trong blockchain, dùng để tương tác với blockchain Sui.
- Transaction được sử dụng để thay đổi trạng thái (state) của blockchain thông qua việc tương tác với các đối tượng (objects).
- Trong move, Các transactions được sử dụng để gọi từ call các functions ở trong smart contract, khi publish một packages mới và khi upgrade package đã có sẵn.
Các loại Transaction
Trên Sui, các data được update thông qua transactions. Sui hỗ trợ 2 loại transaction là:
Programmable transaction blocks (PTB)
Bất kì ai cũng có thể gửi các giao dịch này đến mạng. PTBs chứa nhiều commands khác nhau để cùng thực thi ra được outcome của transaction. Bạn có thể call nhiều move functions, quản lý objects và tokens trong một transaction mà không cần phải publish một move package mới. Điều này cho phép user gom lại nhiều lệnh tính toán một lần. Điều này giúp ích lớn cho việc giảm chi phí và tăng thông lượng mạng.
System Transactions
Chỉ những người là validator nodes có thể submit những transaction này. Họ chịu trách nghiệm trong việc maintain mạng bao gồm init checkpoint, thay đổi epoch...
Cấu trúc của transaction
Toàn bộ Sui transactions đều sẽ có chi tiết những metadata sau:
- Transaction Type: Loại transaction trên SUI
- Digest : Mã hash của transaction
- Checkpoint : Tương tự khái niệm blocks trên một số blockchain khác
- Timestamp: Thời gian transaction executed
- Sender: Địa chỉ của người gửi transaction
- Total Gas Fee: Phí gas tổng cộng để thực thi transaction này
- Gas budget: Số đơn vị gas tối đa sẽ được sử dụng để thanh toán transaction này
- Gas Payment Object: Gas Object Id nào được sử dụng để charge phí
- Gas Object Owner: Address sở hữu gas Object
- Authenticator: Cryptographic signature và public key.
- User Signature: Signature của user khi thực hiện transaction
Ví dụ về transaction flow
Dưới đây là một ví dụ về transaction flow
Giả sử chúng ta có 2 object:
Object A
: là Sui token có balance là 5 Sui do account tên Tom sỡ hữuObject B
: Chứa 2 Sui do John sỡ hữu
Theo ví dụ trên thì Tom gửi 1 Sui sang Alice. Object A chính là input cho transaction này và output của transaction là 2 objects:
- Object changed là object A giờ chỉ còn 4 SUI token
- Object mới được tạo ra là Object C chứa 1 Sui sỡ hữu bởi Alice
Cùng lúc đó, John quyết định gửi 2 Sui token sang Anna. Do hai giao dịch này tương tác với các đối tượng khác nhau, chúng có thể được thực thi song song. Sau khi nhận 2 Sui, Anna quyết định gửi lại cho Tom. Giờ thì Tom đã có 2 tokens.
Cuối cùng thì Tom gửi toàn bộ Sui token cho John. Input của transaction này là Object A
Transaction Inputs, Commands, Effects ()
Transaction inputs đều là các tham số đầu vào cho transactions. Có 2 kiểu tham số:
- Pure Agruments : Đây là những tham số kiểu dữ liệu primitive như là bool, address, UTF8 String,
vector<T>
... - Object Arguments: Là những object hoặc tham chiếu của object đó. Chi tiết về object model sẽ ở các nội dung tiếp theo
Sui transactions sẽ chứa nhiều commands. Mỗi command có thể là publishing một package hoặc call một function từ package đã được published. Các command đều sẽ chạy theo thứ tự mà đã được đặt trong transaction, Có thể sử dụng output từ command trước để input vào command tiếp theo như mỗi chuỗi ( chain). Đây là ví dụ minh hoạ cho luồng này:
Trong hình trên, ta có sender là 0xa11ce
thực thi các commands sau:
SplitCoins
- split một coin từ object đã có sẵn, trong trường hợp này làgas
object.MoveCall
- Lệnh call function purchase trong package0xAAA
, modulemarket
với tham số làpayment
objectyTransferObjects
- Lệnh transfer object sang địa chỉ khác
Sau khi call thành công, ta sẽ có Transaction Effects
thể hiện sự thay đổi của một transaction đến state đó. Cụ thể hơn một transaction thay đổi sẽ bao gồm một trong các cách sau:
- Sử dụng gas object để thanh toán một transaction
- Tạo, cập nhập hay xoá object đó ( Create, update hoặc delete)
- Phát ra sự kiện ( emit events)
Output của transaction bao gồm:
- Transaction digest: Mã hash của transaction
- Transaction data: Thông tin inputs, commands và gas object được dùng trong transaction.
- Transaction Effect: Trạng thái và những ảnh hưởng của transactions
- Events: Các event được phát trong transaction
- Object changes: Các thay đổi của các objects, bao gồm cả tính ownership
- Balance changes: Những thay đổi đến balances của account trong transaction
Ví dụ output của 1 transaction
Transaction Digest: 2zSX9dfsMUAAG8qYtGHy7scXM2d4jgEurohHrSUtYrGB
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Data │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Sender: 0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f │
│ Gas Owner: 0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f │
│ Gas Budget: 100000000 MIST │
│ Gas Price: 1000 MIST │
│ Gas Payment: │
│ ┌── │
│ │ ID: 0x9f830e09ef34783e7fba678030a7e2dafce5a8bef1012b4e27fad06d70db1b70 │
│ │ Version: 7 │
│ │ Digest: 68NHQhDagzFW3US6hxqwo5Kg948M7pgmq6akHU5aMXVR │
│ └── │
│ │
│ Transaction Kind: Programmable │
│ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ Input Objects │ │
│ ├──────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ 0 Pure Arg: Type: address, Value: "0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f" │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────────────────────────────╮ │
│ │ Commands │ │
│ ├─────────────────────────────────────────────────────────────────────────┤ │
│ │ 0 Publish: │ │
│ │ ┌ │ │
│ │ │ Dependencies: │ │
│ │ │ 0x0000000000000000000000000000000000000000000000000000000000000001 │ │
│ │ │ 0x0000000000000000000000000000000000000000000000000000000000000002 │ │
│ │ └ │ │
│ │ │ │
│ │ 1 TransferObjects: │ │
│ │ ┌ │ │
│ │ │ Arguments: │ │
│ │ │ Result 0 │ │
│ │ │ Address: Input 0 │ │
│ │ └ │ │
│ ╰─────────────────────────────────────────────────────────────────────────╯ │
│ │
│ Signatures: │
│ h2foMg640sscAuasItZSOGtBy0GXMouFgvBQwjUK0X0ERJv4YhS2a0tSoVguI50lWOUmd58kKApa4CQ8x72WCw== │
│ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Effects │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Digest: 2zSX9dfsMUAAG8qYtGHy7scXM2d4jgEurohHrSUtYrGB │
│ Status: Success │
│ Executed Epoch: 10 │
│ │
│ Created Objects: │
│ ┌── │
│ │ ID: 0x431b31b72639bff5109fcb23656f8891d4a98324eb146126d7d8526a7bc0c4dd │
│ │ Owner: Immutable │
│ │ Version: 1 │
│ │ Digest: 6zsDSiib5Yk2vAeGhLapFiKTUpHGicPoe8xPrasVghM │
│ └── │
│ ┌── │
│ │ ID: 0xcd9f8e96341ee1d5f30e2880002b06a1a80f50c4630552e0c6e9ec7e004ff912 │
│ │ Owner: Account Address ( 0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f ) │
│ │ Version: 8 │
│ │ Digest: F4WUtwwV7ymL7dFQnqX4T6AiRkbP2ukzoxDcsFBjrcbV │
│ └── │
│ Mutated Objects: │
│ ┌── │
│ │ ID: 0x9f830e09ef34783e7fba678030a7e2dafce5a8bef1012b4e27fad06d70db1b70 │
│ │ Owner: Account Address ( 0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f ) │
│ │ Version: 8 │
│ │ Digest: ECftyjH5LM4JcXEsLtMmHdiRYEobMA417ZF8w3nnQUvp │
│ └── │
│ Gas Object: │
│ ┌── │
│ │ ID: 0x9f830e09ef34783e7fba678030a7e2dafce5a8bef1012b4e27fad06d70db1b70 │
│ │ Owner: Account Address ( 0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f ) │
│ │ Version: 8 │
│ │ Digest: ECftyjH5LM4JcXEsLtMmHdiRYEobMA417ZF8w3nnQUvp │
│ └── │
│ Gas Cost Summary: │
│ Storage Cost: 7911600 MIST │
│ Computation Cost: 1000000 MIST │
│ Storage Rebate: 978120 MIST │
│ Non-refundable Storage Fee: 9880 MIST │
│ │
│ Transaction Dependencies: │
│ V58JkCa5qyDaoRoUrsGjn8kaH6tLhrvbfDkQG7TczWt │
│ 9a5y4cEDXa6piUnWAm1pah5JvxkwfJWHSx1NPg6ctaar │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────╮
│ No transaction block events │
╰─────────────────────────────╯
╭──────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Object Changes │
├──────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Created Objects: │
│ ┌── │
│ │ ObjectID: 0xcd9f8e96341ee1d5f30e2880002b06a1a80f50c4630552e0c6e9ec7e004ff912 │
│ │ Sender: 0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f │
│ │ Owner: Account Address ( 0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f ) │
│ │ ObjectType: 0x2::package::UpgradeCap │
│ │ Version: 8 │
│ │ Digest: F4WUtwwV7ymL7dFQnqX4T6AiRkbP2ukzoxDcsFBjrcbV │
│ └── │
│ Mutated Objects: │
│ ┌── │
│ │ ObjectID: 0x9f830e09ef34783e7fba678030a7e2dafce5a8bef1012b4e27fad06d70db1b70 │
│ │ Sender: 0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f │
│ │ Owner: Account Address ( 0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f ) │
│ │ ObjectType: 0x2::coin::Coin<0x2::sui::SUI> │
│ │ Version: 8 │
│ │ Digest: ECftyjH5LM4JcXEsLtMmHdiRYEobMA417ZF8w3nnQUvp │
│ └── │
│ Published Objects: │
│ ┌── │
│ │ PackageID: 0x431b31b72639bff5109fcb23656f8891d4a98324eb146126d7d8526a7bc0c4dd │
│ │ Version: 1 │
│ │ Digest: 6zsDSiib5Yk2vAeGhLapFiKTUpHGicPoe8xPrasVghM │
│ │ Modules: hello_world │
│ └── │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Balance Changes │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌── │
│ │ Owner: Account Address ( 0x9d38536027abeec2274f2b750fadba202174da9fbd9fa75a760ee99c8b3ad82f ) │
│ │ CoinType: 0x2::sui::SUI │
│ │ Amount: -7933480 │
│ └── │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
Lifecycle of a Transaction(optional)
Nếu bạn thắc mắc và muốn tìm hiểu về Lifecycle of a Transaction
từ lúc tạo ra đến lúc hoàn thành.
Bạn có thể đọc bài từ đây (opens in a new tab)
Đây là ví dụ Payment Transaction minh hoạ ở vòng đời trên:
- Creating the transaction: Giả sử bạn muốn thanh toán 10 SUI ở tiệm coffee. Bạn sẽ mở wallet app và scan Qr code, khởi tạo và sign transaction transfer 10 Sui đến địa chỉ tiệm Coffee đó. 2: Boardcasting the transaction: App Wallet của bạn sẽ submit transaction đến fullnode, nghĩa là sẽ đến tất cả các Validators
- Authenticating the Transaction: Các validator sẽ check chính xác của transaction này và sign nó, để đảm bảo transaction của bạn là valide hay không
- Finalizing the Transaction: Fullnode sẽ broadcasts transaction certificate, validators sẽ validate và execute transaction và trả về Effect
- Generating the Effects Certificate: Bạn sẽ nhận được bằng chứng là bạn là người làm giao dịch này và đưa cho tiệm coffee bằng chứng là giao dịch bạn thành công.
Further reading:
- Bạn có thể xem thêm về profile của một transaction qua Gas profiler tool để biết chi tiết từng cost của mỗi function khi call trên Sui: Video (opens in a new tab)
- Sui Programmable Transactions workshop (opens in a new tab)