使用本地私钥向web3.py发送ERC20令牌

时间:2018-06-08 16:15:19

标签: python token ethereum web3 erc20

我正在尝试使用本地私钥在web3.py中使用python发送ERC20令牌。

使用此代码我可以发送以太:

w3 = Web3(HTTPProvider('https://api.myetherapi.com/eth'))
signed_txn = w3.eth.account.signTransaction(dict(
                nonce=w3.eth.getTransactionCount(from_address),
                gasPrice=w3.eth.gasPrice,
                gas=100000,
                to=to_address,
                value=12345,
                data=b'',
            ),
                private_key,
            )
w3.eth.sendRawTransaction(signed_txn.rawTransaction)

然后我也找到了这个,但是总是得到一个估计气的错误,在我看来,我不能像这样指定我发送的地址,或者通过某种签名证明我的地址?< / p>

contract = w3.eth.contract(address=address, abi=EIP20_ABI, bytecode=bytecode)
contract.functions.transfer(to_address, 121212).transact()

所以我有JSON abi,​​字节码,地址和我的私钥,我可以用我发现的代码以某种方式构建一个工作脚本吗?

提前致谢!

1 个答案:

答案 0 :(得分:3)

  

始终会对estimateGas

产生错误

如果您的交易失败,您有时会收到错误。如果您在估算气体时从“错误的地址”发送,则会发生这种情况。尝试在estimateGas()中指定acct = w3.eth.account.privateKeyToAccount(private_key) contract.functions.transfer(to_address, 121212).estimateGas({'from': acct.address}) 地址,如下所示:

transact()
  

我可以用我发现的代码以某种方式构建一个工作脚本吗?

第二种方法的一个问题是buildTransaction()将尝试使用您的节点对事务进行签名。由于您拥有本地私钥,因此您需要使用>>> from ethtoken.abi import EIP20_ABI >>> from web3.auto import w3 >>> unicorns = w3.eth.contract(address="0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359", abi=EIP20_ABI) >>> nonce = w3.eth.getTransactionCount('0x5ce9454909639D2D17A3F753ce7d93fa0b9aB12E') # Build a transaction that invokes this contract's function, called transfer >>> unicorn_txn = unicorns.functions.transfer( ... '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359', ... 1, ... ).buildTransaction({ ... 'chainId': 1, ... 'gas': 70000, ... 'gasPrice': w3.toWei('1', 'gwei'), ... 'nonce': nonce, ... }) >>> unicorn_txn {'value': 0, 'chainId': 1, 'gas': 70000, 'gasPrice': 1000000000, 'nonce': 0, 'to': '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359', 'data': '0xa9059cbb000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d3590000000000000000000000000000000000000000000000000000000000000001'} >>> private_key = b"\xb2\\}\xb3\x1f\xee\xd9\x12''\xbf\t9\xdcv\x9a\x96VK-\xe4\xc4rm\x03[6\xec\xf1\xe5\xb3d" >>> signed_txn = w3.eth.account.signTransaction(unicorn_txn, private_key=private_key) >>> signed_txn.hash HexBytes('0x4795adc6a719fa64fa21822630c0218c04996e2689ded114b6553cef1ae36618') >>> signed_txn.rawTransaction HexBytes('0xf8a980843b9aca008301117094fb6916095ca1df60bb79ce92ce3ea74c37c5d35980b844a9059cbb000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d359000000000000000000000000000000000000000000000000000000000000000125a00fb532eea06b8f17d858d82ad61986efd0647124406be65d359e96cac3e004f0a02e5d7ffcfb7a6073a723be38e6733f353cf9367743ae94e2ccd6f1eba37116f4') >>> signed_txn.r 7104843568152743554992057394334744036860247658813231830421570918634460546288 >>> signed_txn.s 20971591154030974221209741174186570949918731455961098911091818811306894497524 >>> signed_txn.v 37 >>> w3.eth.sendRawTransaction(signed_txn.rawTransaction) # When you run sendRawTransaction, you get the same result as the hash of the transaction: >>> w3.toHex(w3.sha3(signed_txn.rawTransaction)) '0x4795adc6a719fa64fa21822630c0218c04996e2689ded114b6553cef1ae36618' 然后在本地签名。

请参阅this Web3.py guide,这通常是关于本地签署合同交易,但碰巧使用ERC20示例。

<强>概要

  1. 初始化您的合约对象
  2. 构建交易
  3. 使用w3.eth.account.signTransaction()
  4. 对交易签名
  5. 使用sendRawTransaction()
  6. 广播事务

    示例

    {{#items}}
    Name: {{name}}
    Price: {{price}}
      {{#features}}
      Feature: {{description}}
      {{/features}}
    {{/items}}