Web3js

契約呼叫不適用於 web3

  • January 4, 2018

當我從後端呼叫站點時,我的合約方法transferFrom失敗了,但同時它在 Remix 中工作。

這兩個呼叫都是通過 Metamask 執行的。最初我認為它可能與氣體量有關,但是當我從 Remix 呼叫方法並指定用於失敗交易的氣體量時 - 它起作用了,所以我不知道是什麼問題。

這是使用此程式碼呼叫的失敗事務

Eth.contract._approve(toAddress, fromAddress, amount)
.then(async result => {
 const tx = await Eth.contract.transferFrom.sendTransaction(fromAddress, toAddress, amount);

 return res.json({success: true, data: {from: fromAddress, to: toAddress, amount: amount, tx: tx}});
})
.catch(error => {
 return res.boom.badImplementation('Unable to approve transfer ' + amount + ' tokens to the address ' + fromAddress, {success: false});
});

_approve是合約中的特殊功能,只能由合約所有者訪問,並且具有 3 個參數,而不是 ERC20 介面所需的 2 個參數。

這是從 Remix 呼叫的工作事務,載入了相同的合約。

終於我明白了。問題與合約程式碼無關,除了其中的幾個require語句。

方法transferFrom依賴於approved包含分配金額的內部成員在 2 個帳戶之間轉移。這樣做是為了合併方法的重複功能transfertransferFrom(參見 ERC20 令牌介面)。但這是錯誤的。

因此,在站點的後端呼叫了 2 種方法,使用await

  • 批准
  • 從轉移

但是當approve已經等待並收到響應時,它實際上並沒有被網路探勘,並且approved映射不包含所需的數量。因此聲明require(approved[_from][_to] >= _amount)失敗。

解決方案:不合併邏輯上不可合併。

引用自:https://ethereum.stackexchange.com/questions/30785