使用Python发送Solana链交易及与Program ID交互问题咨询
Solana Python交易开发问题解答
1. 报错invalid transaction: index out of bounds解决方法
你出现该报错的核心原因是签名者传入不全:create_account指令要求付款账户(account)和新创建的账户(new_account)都对交易签名,你调用cli.send_transaction时仅传入了new_account,缺少account签名者,导致指令要求的签名索引和实际传入的签名列表不匹配,触发越界错误。
正确的调用写法为:
send_tx = cli.send_transaction(transaction, account, new_account)
2. 与Program ID交互的通用流程
所有和链上程序交互的交易都遵循以下逻辑:
- 确认目标程序的ID,以及对应指令的规则:包括需要传入的账户列表(每个账户的可写权限、是否需要签名)、指令数据的序列化格式
- 构造
TransactionInstruction对象,核心参数如下:program_id:目标程序的公钥keys:按程序要求的顺序排列的AccountMeta列表data:序列化后的指令参数字节数组
- 将构造好的指令添加到
Transaction实例中 - 传入所有需要签名的账户,调用RPC接口发送签名后的交易
3. 交易Data相关问题解答
你在区块浏览器中看到的交易Data就是指令的
data字段,是链上程序执行所需的参数序列化后的字节内容,必须随交易发送。
- 插入位置:构造
TransactionInstruction对象时,直接将序列化好的字节数组赋值给data参数即可 - 是否随交易变化:每笔交易的Data都会随交易内容变化,不同的指令类型、不同的入参(比如购买不同的NFT、支付不同金额的SOL)都会生成完全不同的Data字节内容,Data是和当前交易的业务逻辑强绑定的。
4. 现有代码的逻辑说明
你当前编写的代码仅调用系统程序的create_account指令,创建了一个归目标NFT市场程序所有的独立账户,这只是NFT购买完整流程中的其中一个前置步骤,不是完整的购买交易。如果要实现NFT购买,你需要参考对应交易市场程序的接口文档,构造对应的买入指令,传入正确的账户列表和参数序列化后的Data。
内容的提问来源于stack exchange,提问作者questionmaster69
相关产品推荐
相关产品推荐

