Solana协议:交易和指令

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

Solana协议:交易和指令
一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK

欢迎来到这六篇系列博客中的第一篇,我将分享我在Solana核心协议方面的笔记。我的目标是帮助你理解Solana协议的工作原理,并附上了一些图表来使内容更清晰。

几天前,我开始用Rust编程并成功运行了我的第一个Solana程序。虽然程序已经可以工作,但我仍然对典型交易的生命周期有很多疑问。

1、我们如何与Solana网络交互?

交易是用户通过区块链及其程序进行交互的机制。一个交易包含一个或多个指令。每个指令代表将在Solana网络上执行的操作。

图2:Solana交易

在报告“Solana:它是如何工作的”中解释说,一个交易,更正式地称为“交易消息”,由四个主要部分组成:头信息、账户地址列表、最近的区块哈希和一组指令。

这个解释让我意识到,虽然从基本层面上看,一个交易可能只包含一个或多个指令,但实际上涉及更深的结构元素。

Solana交易由两个主要部分组成:

  1. 签名:用户使用其私钥签署交易。该签名随后附加到交易数据中,并且可以通过发送者的公钥由其他网络参与者验证。
  2. 交易消息:这是交易的核心,包括四个部分:头信息、账户地址列表、最近的区块哈希(防止重放攻击)以及定义要执行的具体操作的指令。

基于这些基础知识,现在让我们深入探讨Solana交易及其组件的结构。

2、理解Solana交易

Solana交易所有组件的图表

让我们进一步分解交易消息:

  1. 账户地址:此列表包括在交易期间将被读取或写入的所有账户。为每次交易创建此列表是Solana特有的,对于开发人员来说可能会有挑战。
  2. 头信息:头信息引用账户地址列表,指示哪些账户必须签署交易。
  3. 最近的区块哈希:这可以防止重复和过时的交易。一个区块哈希在151个块后过期(大约1分钟)。默认情况下,RPC尝试每2秒转发一次交易,直到交易最终确定或区块哈希过期,之后交易将被丢弃。
  4. 指令:这些是交易的核心。每个指令表示特定的操作(例如,转账、铸造、销毁、创建账户、关闭账户)。每个指令指定要执行的程序、所需的账户以及执行所需的数据。

Solana交易受以下限制:

  1. 大小限制:交易最大可达1,232字节。
  2. 账户限制:交易中可引用的账户数量有限制。
  3. 计算单位(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"   // 代币转账发送者的签名  
    ]  
  }  
}

结构分解:

  1. 头信息
  • 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翻译整理,转载请标明出处

免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。
通过 NowPayments 打赏