Solidity

視圖功能的氣體不足錯誤

  • May 29, 2019

在乙太坊主網路中呼叫我部署的合約的方法時遇到問題。

我有一個返回使用者退款餘額的“查看”功能,在我的本地區塊鏈(Ganache)中一切正常,但在主網路中不起作用:(

所以在這裡我從 web3 呼叫該方法:

this.myContract.methods.checkFunds().call().then((refunds) => {
     return refunds;
});

這是我的合約函式,在這裡我呼叫另一個合約函式:

mapping(address => uint256) private funds;

function checkFunds() external view returns(uint256) {
   return contract2.checkFunds(msg.sender);
}

這是契約2:

function checkFunds(address _owner) public view returns(uint256) {
   return funds[_owner];
}

如果使用者沒有資金,那麼它應該返回 0 並且它是 uint256,那麼它應該沒問題,但是我收到這樣一個錯誤:

Uncaught (in promise) Error: Returned values aren't valid, did it run Out of Gas?
at ABICoder.decodeParameters (app.js:37038)
at Contract._decodeMethodReturn (app.js:36366)
at Method.outputFormatter (app.js:36719)
at Method.formatOutput (app.js:9201)
at sendTxCallback (app.js:9511)
at app.js:96628
at inpage.js:1
at inpage.js:1
at o (inpage.js:1)
at inpage.js:1

我有最新版本的 web3 順便說一句:"react-web3": "1.2.0",

視圖功能需要消耗氣體嗎?這很奇怪,因為我呼叫了該契約的另一種方法來讀取項目並且它不需要任何成本。

謝謝你!

你正在做一個call(),沒有設置msg.sender. 嘗試addr作為參數添加到checkFunds()函式中,相應地修改 web3 呼叫,看看是否可以修復它。

this.myContract.methods.checkFunds().call({
 from: 0x123...
}).then((refunds) => {
 return refunds;
});

call() 中的輸入地址

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