繁体   English   中英

无法使用 solana-py 签署 Solana 交易会引发签名者不足

[英]Unable to Sign Solana Transaction using solana-py throws not enough signers

使用来自 pip 的 solana 库

pip install solana

然后尝试执行withdraw_from_vote_account

txn = txlib.Transaction(fee_payer=wallet_keypair.pubkey())
# txn.recent_blockhash = blockhash
txn.add(
        vp.withdraw_from_vote_account(
            vp.WithdrawFromVoteAccountParams(
                vote_account_from_pubkey=vote_account_keypair.pubkey(),
                to_pubkey=validator_keypair.pubkey(),
                withdrawer=wallet_keypair.pubkey(),
                lamports=2_000_000_000,
            )
        )
    )
txn.sign(wallet_keypair)
txn.serialize_message()
solana_client.send_transaction(txn).value

这给我一个错误

Traceback (most recent call last):
  File "main.py", line 119, in <module>
    solana_client.send_transaction(txn).value
  File "venv/lib/python3.8/site-packages/solana/rpc/api.py", line 1057, in send_transaction
    txn.sign(*signers)
  File "venv/lib/python3.8/site-packages/solana/transaction.py", line 239, in sign
    self._solders.sign(signers, self._solders.message.recent_blockhash)
solders.SignerError: not enough signers

我尝试通过添加更多密钥对进行签名来解决

txn.sign(wallet_keypair,validator_keypair)

这样做会让我在sign方法上出错

self._solders.sign(signers, self._solders.message.recent_blockhash)
solders.SignerError: keypair-pubkey mismatch

不知道如何解决这个任何帮助表示赞赏

当您尝试发送从钱包中取款的交易时,您需要持有资产的钱包签署交易以将资产发送给取款人。

无论如何,从我看到的你试图退出vote_account_keypair和取款人 os wallet_keypair ,在你写的代码中你只有一个签名者wallet_keypair但你还需要vote_account_keypair来签署交易因为你正在从他们的账户中取款。

我希望这有帮助

错误消息不是很有用,但您需要对交易中的消息进行区块哈希才能正确签名,即:

blockhash = solana_client.get_latest_blockhash().value['blockhash']
txn = txlib.Transaction(recent_blockhash=blockhash, fee_payer=wallet_keypair.pubkey())

其他一些注意事项: txn.serialize_message()不会就地修改事务,而是返回事务字节,因此根本不需要调用它。

最后, send_transaction实际上完成了获取区块哈希和签署交易的工作,因此您可以将整个事情简化为:

txn = txlib.Transaction(fee_payer=wallet_keypair.pubkey())
txn.add(
        vp.withdraw_from_vote_account(
            vp.WithdrawFromVoteAccountParams(
                vote_account_from_pubkey=vote_account_keypair.pubkey(),
                to_pubkey=validator_keypair.pubkey(),
                withdrawer=wallet_keypair.pubkey(),
                lamports=2_000_000_000,
            )
        )
    )
solana_client.send_transaction(txn, wallet_keypair).value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM