Web3js
契約呼叫不適用於 web3
當我從後端呼叫站點時,我的合約方法
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 個帳戶之間轉移。這樣做是為了合併方法的重複功能transfer
和transferFrom
(參見 ERC20 令牌介面)。但這是錯誤的。因此,在站點的後端呼叫了 2 種方法,使用
await
:
- 批准
- 從轉移
但是當
approve
已經等待並收到響應時,它實際上並沒有被網路探勘,並且approved
映射不包含所需的數量。因此聲明require(approved[_from][_to] >= _amount)
失敗。解決方案:不合併邏輯上不可合併。