Solidity
為什麼狀態修改功能在 Truffle 控制台中有效,但在從 web3 呼叫時無效?
我有一份提供兩個功能的契約:
接受兩個參數的狀態修改函式
一個常數函式
我在 React 中有一個 Web 前端呼叫這些函式。當我從 React 前端呼叫常量函式時,一切正常。但是當我使用 web3 從前端呼叫狀態修改函式時,我得到一個無效的操作碼錯誤。但是,當我從 Truffle 控制台呼叫它時,該函式確實有效,因此 Solidity 函式本身是正確的。
這是我從 web3 1.0 呼叫的方式:
contract.methods.createNewPlayer( '0x35000f8407c2358Fbb089C2aE4e70fE005f4F6cD', 100 ).send({ from: '0xc7edb363e01f7964f9fac9bf883afeee64fb2d93' }) .then((receipt) => { console.log(receipt) }) .catch((error) => { console.log(error); });
這會導致無效的操作碼。當我像這樣從 Truffle 控制台呼叫時:
inst.createPlayer( '0x35000f8407c2358Fbb089C2aE4e70fE005f4F6cD', 100, { from: '0xc7edb363e01f7964f9fac9bf883afeee64fb2d93'})
一切正常。
這可能有什麼原因?合約部署在 TestRPC 上。
發現問題。
所以我嘗試從我的前端呼叫另一個狀態修改函式並且它有效。
在這一點上,我知道一個狀態修改功能可以在前端工作,而另一個不能。雖然兩者都來自松露。
憑直覺,我添加了一個gas: value 到一個沒有像這樣工作的:
contract.methods.createNewPlayer( '0x0728f10c5a118883ecfb113a7b43bc627849fb45', 100 ).send({ from: '0xf3b22a49ad7f5ad0ffe9693e4a22121ed3738f73', gas: 3000000 })
它奏效了。我有一個錯誤的假設,即 web3 正在後台處理所需的氣體量,但這是錯誤的。此外,web3 沒有使用實際的預設氣體值。