在 Solana 上,我们通过发送交易来与网络交互。
交易包含一个或多个指令,每个指令代表一个特定的操作,
指令的执行逻辑存储在部署到 Solana 网络的程序中。
以下是交易执行的关键细节:
交易执行顺序与原子性
- 执行顺序:如果一个交易包含多个指令,这些指令会按照它们在交易中的顺序依次处理。
- 原子性:交易是原子的,要么所有指令全部成功执行,要么全部失败。 如果任何一个指令失败,整个交易都不会执行。
可以简单地将交易看作是处理一个或多个指令的请求。
交易中的关键点
- Solana 交易由与网络上各种程序交互的指令组成,每个指令代表一个特定的操作。
- 每个指令指定要执行指令的程序、指令所需的账户以及指令执行所需的数据。
- 交易中的指令按列出的顺序处理。
- 交易是原子的,要么所有指令全部成功执行,要么整个交易失败。
- 交易的最大大小为
1232
字节。
基本示例
下面是一个包含单个指令的交易的示意图,该指令用于将 SOL
从发送方转移到接收方。
在 Solana 上,钱包是由系统程序拥有的账户。
根据 Solana 账户模型,只有拥有账户的程序才可以修改账户上的数据。
因此,从“钱包”账户转移 SOL
需要发送一个交易,以调用系统程序上的转移指令。
发送方账户必须包含在交易的签名者(is_signer
)中,以批准扣除其lamport
余额。
发送方和接收方账户都必须是可变的(is_writable
),
因为该指令会修改两个账户的lamport
余额。
一旦交易发送,系统程序将被调用来处理转账指令。
然后,系统程序将相应地更新发送方和接收方帐户的lamport
余额。
简单的SOL转账
以下是一个 Solana Playground 示例,
演示如何使用 SystemProgram.transfer
方法构建 SOL
转账指令:
// Define the amount to transfer
const transferAmount = 0.01; // 0.01 SOL
// Create a transfer instruction for transferring SOL from wallet_1 to wallet_2
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: transferAmount * LAMPORTS_PER_SOL, // Convert transferAmount to lamports
});
// Add the transfer instruction to a new transaction
const transaction = new Transaction().add(transferInstruction);
运行脚本并检查记录在控制台的交易详细信息。在下面的部分中,我们将逐步讲解发生在幕后的细节。