从 Trezor 硬件钱包发送签名交易

Posted

技术标签:

【中文标题】从 Trezor 硬件钱包发送签名交易【英文标题】:Send signed transaction from Trezor hardware wallet 【发布时间】:2020-12-15 21:46:43 【问题描述】:

我一直在尝试编写一个简单的 web3.py 程序来从我的 Trezor 发送交易。我可以在我的 Trezor 上签署交易,执行此操作的函数 (ethereum.sign_tx()) 返回交易的 V、R 和 S 签名的元组,如下所示:

(42, b"\xa1\xd8blablablax883", b'<\x7f\xd0Eblablabla6\xe7\xe2Fc')

我的问题是如何将这些签名转换为可以使用 Web3.eth.sendRawTransaction() 函数发送的序列化形式。完整代码为:

from trezorlib.client import get_default_client
from trezorlib.tools import parse_path
from trezorlib import ethereum
from web3 import Web3


def main():
    # Use first connected device
    client = get_default_client()
    ropsten = Web3(Web3.HTTPProvider("https://ropsten.infura.io/v3/7xxxxxxxxx23dee70e4aa"))


    # Get the first address of first BIP44 account
    # (should be the same address as shown in wallet.trezor.io)
    bip32_path = parse_path("44'/60'/0'/0/0")
    address = ethereum.get_address(client, bip32_path)
    nonce = ropsten.eth.getTransactionCount(address)
    tx = ethereum.sign_tx(client, bip32_path, nonce, Web3.toWei(1, 'gwei'), 21000, "0x7ccc4a67eB76b5B1C8Efc62672A6884A9B7bFDb7", Web3.toWei(1, 'ether'), chain_id=3)
    #sent = ropsten.eth.sendRawTransaction(tx)


if __name__ == "__main__":
    main()

【问题讨论】:

【参考方案1】:

您可以做trezorctl 所做的事情并使用rlp.encode

import rlp

gas_price = Web3.toWei(1, 'gwei')
gas_limit = 21000
to_addr = "0x7ccc4a67eB76b5B1C8Efc62672A6884A9B7bFDb7"
amount = Web3.toWei(1, 'ether')
data = b""
rlp_prefix = (nonce, gas_price, gas_limit, to_addr, amount, data)

sent = ropsten.eth.sendRawTransaction(rlp.encode(rlp_prefix + tx))

【讨论】:

以上是关于从 Trezor 硬件钱包发送签名交易的主要内容,如果未能解决你的问题,请参考以下文章

一分钟了解硬件钱包

以太坊钱包开发系列1 - 创建钱包账号

多重签名钱包未转换。为啥聚合交易不返回错误?

以太坊钱包开发系列4 - 发送Token(代币)

以太坊钱包开发系列4 - 发送Token(代币)

FileCoin 挖矿教程之三:发送与接收 FIL