简体   繁体   English

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

[英]Send ERC20 token with web3.py using a local private key

I am trying to send ERC20 tokens in python with web3.py using a local private key. 我试图使用本地私钥使用web3.py在python中发送ERC20令牌。

With this code I can send ether: 使用此代码我可以发送以太:

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)

Then I found this too, but always get an error for the estimateGas and it seems to me that I can't specify the address where I am sending from like this or prove that its my address by some kind of signing? 然后我也找到了这个,但是总是得到一个估计气体的错误,在我看来,我不能指定我发送的地址,或者通过某种签名证明我的地址?

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

So I have the JSON abi, the bytecode, the addresses and my private key, can I somehow build a working script out of the code I found? 所以我有JSON abi,​​字节码,地址和我的私钥,我能以某种方式从我找到的代码中构建一个工作脚本吗?

Thanks in advance! 提前致谢!

always get an error for the estimateGas 总是得到估计气体的错误

You will get errors, sometimes, if your transaction would fail. 如果您的交易失败,您有时会收到错误。 That can happen if you are sending "from" the wrong address while estimating gas. 如果您在估算气体时从“错误的地址”发送,则会发生这种情况。 Try specifying the from address in estimateGas() like so: 尝试在estimateGas()指定from地址,如下所示:

acct = w3.eth.account.privateKeyToAccount(private_key)
contract.functions.transfer(to_address, 121212).estimateGas({'from': acct.address})

can I somehow build a working script out of the code I found? 我可以用我发现的代码以某种方式构建一个工作脚本吗?

One problem with the second approach is that transact() will try to use your node to sign the transaction. 第二种方法的一个问题是transact()将尝试使用您的节点对事务进行签名。 Since you have a local private key, you'll want to use buildTransaction() to then sign locally. 由于您有本地私钥,因此您需要使用buildTransaction()然后在本地签名。

See this Web3.py guide , which is generally about locally signing contract transactions, but happens to use an ERC20 example. 请参阅此Web3.py指南 ,该指南通常涉及本地签署合同事务,但恰好使用ERC20示例。

Outline 大纲

  1. Initialize your Contract object 初始化Contract对象
  2. Build the transaction 建立交易
  3. Sign the transaction, with w3.eth.account.signTransaction() 使用w3.eth.account.signTransaction()对事务进行签名
  4. Broadcast the transaction with sendRawTransaction() 使用sendRawTransaction()广播事务

Example

>>> 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'

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

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