Solidity:呼叫另一個合約方法總是返回 0
我有簡單的程式碼來部署和呼叫其他合約的方法。我總是得到 0 (通過呼叫
Test.get()
)而不是其他契約的實際值。我正在使用 Geth 1.8.11(專用網路,只有單個節點)和 Remix IDE。pragma solidity ^0.4.17; contract Test { address public d_address; function deployOther() public { d_address = new Referred(123); } function get() public returns (uint){ return Referred(d_address).toReturn(); } function set() public payable { Referred(d_address).set.gas(21000).value(msg.value)(456); } } contract Referred { uint public val; constructor(uint v) public { val = v; } function set(uint nv) public payable{ val = nv; } function toReturn() public view returns (uint){ return val; } }
我在 geth 日誌中看到了這個錯誤,
DEBUG[06-25|19:34:00|core/state_transition.go:216] VM returned with error err="out of gas".
調試
$$ 06-25|19:34:00|core/state_transition.go:216 $$VM 返回錯誤 err=“out of gas”。
這意味著您提供的氣體不足以完成您的合約操作。您確定您的交易設置值實際上成功了嗎?您可以在交易的 Remix IDE 收據日誌中檢查這一點。我猜它可能由於沒有足夠的氣體(氣體不足錯誤)而失敗,因此
val
在你的Referred
契約中總是為零。將氣體升高到足夠的量。以 4700000 為例。您可以在 Remix IDE 的收據日誌中查看使用的氣體,以便您可以更準確地使用該氣體量。
根據您在下面的評論,我進行了此編輯。我已經在 Remix IDE 中成功執行了這個合約。我懷疑您沒有正確執行契約操作。請注意,您應該在部署兩個合約後首先呼叫函式 deployOther()。在這個 deployOther 函式中建立了 Test 和 Referred 合約之間的連結。您應該使用被推薦合約的地址代替 123。
1)首先部署Referred Contract。
現在在 deployOther 函式中更改引用合約的地址。並部署測試合約
現在呼叫 deployOther 函式。
執行設置操作。
您在這裡硬編碼了引用合約的地址,我建議將此地址作為參數發送到 deployOther 函式中。
我將您的程式碼放入 Remix 中,它對我來說非常好用。
transact to Test.get pending ...
transaction cost 23745 gas decoded output { "0": "uint256: 123" }
之後
transact to Test.set pending ...
transact to Test.get pending ...
transaction cost 23745 gas decoded output { "0": "uint256: 456" }