Solana协议:交易和指令
虽然从基本层面上看,一个Solana交易可能只包含一个或多个指令,但实际上涉及更深的结构元素。

一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK
欢迎来到这六篇系列博客中的第一篇,我将分享我在Solana核心协议方面的笔记。我的目标是帮助你理解Solana协议的工作原理,并附上了一些图表来使内容更清晰。
几天前,我开始用Rust编程并成功运行了我的第一个Solana程序。虽然程序已经可以工作,但我仍然对典型交易的生命周期有很多疑问。
1、我们如何与Solana网络交互?
交易是用户通过区块链及其程序进行交互的机制。一个交易包含一个或多个指令。每个指令代表将在Solana网络上执行的操作。

在报告“Solana:它是如何工作的”中解释说,一个交易,更正式地称为“交易消息”,由四个主要部分组成:头信息、账户地址列表、最近的区块哈希和一组指令。
这个解释让我意识到,虽然从基本层面上看,一个交易可能只包含一个或多个指令,但实际上涉及更深的结构元素。
Solana交易由两个主要部分组成:
- 签名:用户使用其私钥签署交易。该签名随后附加到交易数据中,并且可以通过发送者的公钥由其他网络参与者验证。
- 交易消息:这是交易的核心,包括四个部分:头信息、账户地址列表、最近的区块哈希(防止重放攻击)以及定义要执行的具体操作的指令。
基于这些基础知识,现在让我们深入探讨Solana交易及其组件的结构。
2、理解Solana交易

让我们进一步分解交易消息:
- 账户地址:此列表包括在交易期间将被读取或写入的所有账户。为每次交易创建此列表是Solana特有的,对于开发人员来说可能会有挑战。
- 头信息:头信息引用账户地址列表,指示哪些账户必须签署交易。
- 最近的区块哈希:这可以防止重复和过时的交易。一个区块哈希在151个块后过期(大约1分钟)。默认情况下,RPC尝试每2秒转发一次交易,直到交易最终确定或区块哈希过期,之后交易将被丢弃。
- 指令:这些是交易的核心。每个指令表示特定的操作(例如,转账、铸造、销毁、创建账户、关闭账户)。每个指令指定要执行的程序、所需的账户以及执行所需的数据。
Solana交易受以下限制:
- 大小限制:交易最大可达1,232字节。
- 账户限制:交易中可引用的账户数量有限制。
- 计算单位(CUs):交易的复杂性也有限制,以计算单位衡量,量化处理交易所需的计算资源。
让我们进一步分解指令:
指令指定了将由Solana的程序(链上智能合约)执行的动作。每个指令包括:
- 程序地址,指向负责处理指令的链上程序。
- 账户列表,指令将与其交互的账户(读取或修改)。
- 指令数据(参数),传递给程序以指定要采取的操作(例如,转账金额、目标账户)。
3、包含两个指令的Solana交易结构示例
使用Solana文档中的示例交易结构和ChatGPT生成的自定义示例,我重新排列了组件顺序以匹配前面图表中概述的顺序。你可以在此处找到官方文档以供参考 这里。
以下是包含两个指令的Solana交易结构示例:一个是SOL转账,另一个是使用Solana Token Program的代币转账。此示例遵循标准交易结构,包括头信息、账户密钥、最近的区块哈希、指令和签名。
示例详情:
- 两个指令包含在这个交易中:一个是使用系统程序进行SOL转账,另一个是使用Token Program进行代币转账。
- 每个指令使用索引引用accountKeys数组,便于跟踪涉及的账户。
- SOL发送者和代币发送者都必须签署交易,这反映在签名数组中。
包含两个指令的示例交易结构:
{
"transaction": {
"message": {
"header": {
"numReadonlySignedAccounts": 0,
"numReadonlyUnsignedAccounts": 2,
"numRequiredSignatures": 2
},
"accountKeys": [
"3z9vL1zjN6qyAFHhHQdWYRTFAcy69pJydkZmSFBKHg1R", // SOL转账发送者
"5snoUseZG8s8CDFHrXY2ZHaCrJYsW457piktDmhyb5Jd", // SOL转账接收者
"9qkuytG8RPy8mzvU35PTzVh59xHjcrEbKnqcW9NY6Sdp", // 代币发送者
"87rp1egTCRqrWEsSfG9HPUFiGrxsjXbpAUJ2hx5n9WrF", // 代币接收者
"7V1rLpMkDrN5tJovHrjvDUttrJEswyNodRSpwYrkh9ZT", // 代币铸币
"11111111111111111111111111111111", // 系统程序ID(用于SOL转账)
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" // 代币程序ID(用于代币转账)
],
"recentBlockhash": "DzfXchZJoLMG3cNftcf2sw7qatkkuwQf4xH15N5wkKAb",
"instructions": [
{
"accounts": [
0, // SOL发送者(accountKeys数组中的索引)
1 // SOL接收者(accountKeys数组中的索引)
],
"data": "3Bxs4NN8M2Yn4TLb", // 编码后的SOL转账金额
"programIdIndex": 5 // 系统程序ID(accountKeys数组中的索引)
},
{
"accounts": [
2, // 代币发送者(accountKeys数组中的索引)
3, // 代币接收者(accountKeys数组中的索引)
4 // 代币铸币(accountKeys数组中的索引)
],
"data": "9Bxs4TYzF3dW3PLs", // 编码后的代币转账金额
"programIdIndex": 6 // 代币程序ID(accountKeys数组中的索引)
}
],
"indexToProgramIds": {}
},
"signatures": [
"5LrcE2f6uvydKRquEJ8xp19heGxSvqsVbcqUeFoiWbXe8JNip7ftPQNTAVPyTK7ijVdpkzmKKaAQR7MWMmujAhXD", // SOL转账发送者的签名
"6KRlc2J8cyuXeGZgJ9qKb3CwvFGqivQS6wEh9S2Nb7E5CMuB7ZwKftxzR34nAkGQexkSBLDdzpx91Q6MuNgnXH4A" // 代币转账发送者的签名
]
}
}
结构分解:
- 头信息:
- numReadonlySignedAccounts:0(没有签名账户是只读的)。
- numReadonlyUnsignedAccounts:2(两个未签名账户是只读的,例如代币铸币和系统程序)。
- numRequiredSignatures:2(SOL转账发送者和代币转账发送者都需要签署交易)。
2. 账户密钥:交易中使用的账户公钥列表。这些账户的索引在指令中引用。
- 0:SOL转账发送者。
- 1:SOL转账接收者。
- 2:代币转账发送者。
- 3:代币转账接收者。
- 4:代币铸币账户。
- 5:系统程序ID(用于SOL转账)。
- 6:代币程序ID(用于代币转账)。
3. 最近的区块哈希:确保交易在特定时间内处理,防止重放攻击的最近的区块哈希。
示例:"recentBlockhash": "DzfXchZJoLMG3cNftcf2sw7qatkkuwQf4xH15N5wkKAb"
4. 指令:交易中包含的指令数组:
SOL转账:
- 账户:索引0(SOL发送者)和索引1(SOL接收者)。
- 数据:编码后的SOL转账金额(以Lamports为单位)。
- programIdIndex:5(系统程序ID用于SOL转账)。
代币转账:
- 账户:索引2(代币发送者)、索引3(代币接收者)和索引4(代币铸币)。
- 数据:编码后的代币转账金额。
- programIdIndex:6(代币程序ID用于代币转账)。
5. 签名:需要账户的签名数组。
在这种情况下:
- 第一个签名来自SOL转账发送者。
- 第二个签名来自代币转账发送者。
4、结束语
理解Solana交易的结构是掌握协议底层工作原理的关键。每个交易,包括其签名、账户密钥、最近的区块哈希和指令等组件,定义了网络上的动作。
敬请期待下一篇文章,我们将更深入地探讨Solana的关键要素,并揭示使其成为高性能区块链的原因。让我们继续这段旅程!
我参考了Turbin3和Helius的报告“Solana:它是如何工作的”。你可以在 这里 查看它,Solana文档则位于 这里。
原文链接:Understanding the core Solana protocol: Transactions and Instructions
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。