Solidity

為什麼狀態修改功能在 Truffle 控制台中有效,但在從 web3 呼叫時無效?

  • January 16, 2018

我有一份提供兩個功能的契約:

  1. 接受兩個參數的狀態修改函式

  2. 一個常數函式

我在 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 沒有使用實際的預設氣體值。

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