Solidity

Solidity:呼叫另一個合約方法總是返回 0

  • March 8, 2022

我有簡單的程式碼來部署和呼叫其他合約的方法。我總是得到 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。

  1. 現在在 deployOther 函式中更改引用合約的地址。並部署測試合約

  2. 現在呼叫 deployOther 函式。

  3. 執行設置操作。

您在這裡硬編碼了引用合約的地址,我建議將此地址作為參數發送到 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"
}

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