如何在Solana团队场景下实现无需共享密钥的multisig多签功能
Solana 2/2多签跨设备无密钥交互签名流程
前提:已完成多签账户创建,多签签名阈值设为2,两个签名者的公钥已写入多签账户配置,双方各自独立持有自身密钥对,互不掌握对方私钥。
完整操作流程
- 第一步:交易构造(任意一方均可操作)
确认交易内容(如SPL Token转账、权限调整等)后,构造未签名交易,将多签账户设为交易的权限主体,同时在交易签名者列表中填入两个签名者的公钥。构造完成后将未签名交易序列化为base64格式的明文报文,该报文不含任何私钥信息,可直接传输给另一方。
代码示例(@solana/web3.js):const unsignedTxBase64 = transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64') - 第二步:双方独立校验+签名
收到未签名交易报文的一方,先将base64报文反序列化为交易对象,逐一校验所有交易字段(转账金额、收款地址、手续费、操作类型等)和预期完全一致后,用本地存储的自身私钥对交易签名,签名完成后将附加了自身签名的交易报文重新转为base64格式,回传给另一方即可。
代码示例(@solana/web3.js):const transaction = Transaction.from(Buffer.from(unsignedTxBase64, 'base64')) // 此处自行添加交易字段校验逻辑 transaction.sign(myKeypair) const partiallySignedTxBase64 = transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64') - 第三步:合并签名并上链
收到带部分签名的交易报文后,再次校验交易内容未被篡改,确认无误后用自身私钥完成签名,此时交易已集齐2个符合阈值要求的有效签名,直接广播到Solana链上即可完成全部操作。
CLI操作示例(基于spl-token命令行工具)
如果使用官方CLI工具操作,流程对应命令如下:
- 构造未签名交易导出到本地文件
$ spl-token transfer --multisig <你的多签账户地址> --signer <签名方1公钥> --signer <签名方2公钥> --output unsigned_tx.dat <SPL代币地址> <转账金额> <收款地址> - 任意一方签名后导出带部分签名的文件
$ spl-token sign unsigned_tx.dat --keypair <你的本地密钥对文件路径> --output partially_signed_tx.dat - 另一方完成签名后直接广播上链
$ spl-token broadcast partially_signed_tx.dat --keypair <你的本地密钥对文件路径>
注意事项
- 每次签名前必须完整校验所有交易字段,不要对内容不明的交易报文签名,避免恶意构造的交易造成资产损失
- 所有交易报文仅包含公钥、交易内容、签名信息,不会泄露私钥,传输过程无需加密,如担心报文被篡改,可双方提前核对交易哈希值一致后再签名
内容的提问来源于stack exchange,提问作者wxecqz123
相关产品推荐
相关产品推荐

