【问题标题】:How to get an unsigned transaction data from web3.py using contract interaction如何使用合约交互从 web3.py 获取未签名的交易数据
【发布时间】:2022-01-04 19:12:51
【问题描述】:

目前我正在做一个项目,我有以下流程:

  1. 用户想要进行交易,他们选择chaintoken
  2. 从数据库中检索合同(可能是代理合同)和其他数据
  3. 我计算了 data 键值对,用于我对 Metamask 的前端调用
transaction = await ethereum.request({
   method: 'eth_sendTransaction',
   params: [
      {
          to: '{{ paymentrequest.paymentaddress }}',
          from: ethereum.selectedAddress,
          data: '{{ paymentrequest.transhex }}',
          chainId: '{{ paymentrequest.chain.chainid }}'
   }],
});
  1. 用户会收到一个元掩码弹出窗口,其中包含要求他们进行交易的上述数据。

第 3 步是我遇到问题的地方。为了从 web3.py 计算的 tx 中获取数据属性,我必须使用 .call().transact()。它们都适用于以太坊链。但是当我将这些调用应用于 Polygon 或 BSC 链上的合约时,它们会报告错误,例如:

错误 1:BEP20: transfer to zero address - 我什至不明白这是怎么可能的,因为我四倍检查了我没有将零地址输入函数,但是它仍然报告了这个错误而没有“to”参数即使在函数调用中定义收件人。

错误 2:BEP20: transfer amount exceeds balance - 我不想使用来自其他人的带有一堆令牌的地址来绕过此错误。我想远离别人钱包里有一堆硬币的限制。

这是我使用的代码:

def bnbTXCompute(paymentrequest, tokenamount, contractaddress, tokenaddress):
    w3 = Web3(Web3.HTTPProvider(paymentrequest.chain.rpc, request_kwargs={'timeout': 60}))
    w3.middleware_onion.inject(geth_poa_middleware, layer=0)

    contract = w3.eth.contract(address=contractaddress, abi=paymentrequest.token.abi)

    txn = contract.functions.transfer(paymentrequest.wallet,
                                      tokenamount * pow(10, paymentrequest.token.decimals)).call({"to": tokenaddress, "from": "0xbunchoflettersandnumbers"}, )
                                      # I have tried to remove both the "to" and "from" parameters, but they both result in either error 1 or 2

    return txn["data"]

def polyTXCompute(paymentrequest, tokenamount, contractaddress, tokenaddress):
    w3 = Web3(Web3.HTTPProvider(paymentrequest.chain.rpc, request_kwargs={'timeout': 60}))
    w3.middleware_onion.inject(geth_poa_middleware, layer=0)

    contract = w3.eth.contract(address=contractaddress, abi=paymentrequest.token.abi)

    txn = contract.functions.transfer(paymentrequest.wallet,
                                      tokenamount * pow(10, paymentrequest.token.decimals)).transact({"to": tokenaddress, "from": "0xbunchoflettersandnumbers"})

    return txn["data"]

def ethTXCompute(paymentrequest, tokenamount, contractaddress):

    w3 = Web3(Web3.HTTPProvider(paymentrequest.chain.rpc, request_kwargs={'timeout': 60}))
    w3.middleware_onion.inject(geth_poa_middleware, layer=0)

    contract = w3.eth.contract(address=contractaddress, abi=paymentrequest.token.abi)

    txn = contract.functions.transfer(paymentrequest.wallet,
                                      tokenamount * pow(10, paymentrequest.token.decimals)).transact()

    return txn["data"]

我想到的解决方案是在返回数据哈希之前跳过 web3.py 正在执行的所有这些检查。但是我无法做到这样的事情。任何帮助表示赞赏。

web3.py 文档:https://web3py.readthedocs.io/en/latest/

【问题讨论】:

    标签: python ethereum polygon binance-smart-chain web3py


    【解决方案1】:

    和往常一样,开发者应该更好地阅读:

    替换:

    txn = contract.functions.transfer(paymentrequest.wallet, tokenamount * pow(10, paymentrequest.token.decimals)).call({"to": tokenaddress, "from": "0xbunchoflettersandnumbers"}, )
    

    与:

    txn = contract.encodeABI(fn_name="transfer", args=[paymentrequest.wallet, tokenamount * pow(10, paymentrequest.token.decimals)])
    

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 2021-12-28
      • 2023-01-19
      • 2022-01-04
      • 2020-08-25
      • 2021-05-29
      • 2021-10-07
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多