创建TransactionInstruction时账户列表需按特定顺序排列还是可随机排序?
Solana TransactionInstruction 账户列表排序规则说明
结论
账户列表绝对不可以随机排序,必须严格遵循你所调用的目标链上程序约定的固定顺序
原因说明
- Solana链上程序执行时,只会按照
keys数组的索引下标读取对应账户,不会根据公钥、isSigner/isWritable属性自动匹配账户用途 - 比如你调用的指令约定第1位是付款签名账户、第2位是收款账户,你把两者顺序调换后,程序会直接尝试从第1位的收款账户扣除转账金额,几乎必然导致交易失败,极端情况甚至会触发不符合预期的业务逻辑
- 不同程序、同一程序的不同指令,要求的账户顺序都可能完全不同,没有通用的全局排序规则,完全由目标程序的业务逻辑决定
开发注意事项
构造
keys数组前,请先核对对应程序的官方文档、IDL(接口描述文件)中对应指令的账户列表要求,确保账户顺序、isSigner/isWritable属性都和约定完全一致,避免交易执行报错。
你给出的示例代码中的keys数组,就是按照对应PROGRAM_ID下目标指令的账户顺序要求构造的。
内容的提问来源于stack exchange,提问作者Noldorin Zhang
相关产品推荐
相关产品推荐

