Contract-Development

適用於 Remix 的 Solidity 版本 0.4.24 的智能合約互動(與另一個合約)範例

  • September 4, 2018

我正在瀏覽這段程式碼,我決定在 RemixIDE 上對其進行測試… 創建一個呼叫另一個合約的函式

當我從呼叫者合約執行函式時,我不斷收到“處理事務時出現 VM 異常:還原”。我用Google搜尋了這個錯誤,嘗試了所有解決問題的建議,但沒有一個奏效。

我之前曾嘗試執行本教程中的程式碼(仍然是關於智能合約互動)https://www.youtube.com/watch?v=zjUbLC21avw&t=425s出現錯誤,然後經過研究發現程式碼語法過時,因此出現錯誤.

所以我的問題是……是來自創建呼叫另一個合約的函式的程式碼,過時的,還是 Remix/Solidity 中的錯誤……如果是錯誤,你如何擺脫它?0.4.24 版是否有目前有效的契約互動範例?

我在混音 IDE 上執行的程式碼是……

pragma solidity ^0.4.24;

contract Caller {

   Called public called_address;

   function set_address(address _addy) public {
       called_address = Called(_addy);
   }

   function set(uint256 _var) public {
       called_address.set(_var);
   } 

   function set_call(address _called, uint256 _var) public {
       require(_called.call(bytes4(keccak256("set(uint256)")), _var));
   }
}

interface Called{
   function set(uint) external;
   function get() external view returns (uint);
}

被呼叫合約的程式碼

pragma solidity ^0.4.24;

contract Called{
   uint public myuint;

   function myuint() public view returns(uint _myuint) {
       _myuint = myuint;
   }

   function set(uint _var) public {
       myuint = _var;
   }

   function get() public view returns (uint){
       return myuint;
   }
}

另外要注意的是,我必須自己定義一個 getter 函式,因為 IDE 給我一個錯誤,說一些函式沒有定義/使用……謝謝你的幫助。

我正在通過 Genache 將 web3 提供程序與區塊鏈的本地實例一起使用

最後…我有有效的程式碼…

來電程式碼:

pragma solidity ^0.4.24;

contract Caller {

   address public called_address;

   function set_address(address _addy) public {
       called_address = address(_addy);
   }
   function getCalleeValue() public view returns (uint){
       Called c = Called(called_address);
       return c.get();
   }
   function setCalleeValue(uint newValue) public returns (uint){
       Called c = Called(called_address);
       c.set(newValue);

}

interface Called{

   function set(uint) external;
   function get() external view returns (uint);
}

呼叫合約程式碼:

pragma solidity ^0.4.24;

contract Called{
   uint public myuint;

   function myuint() public view returns(uint _myuint) {
       _myuint = myuint;
   }

   function set(uint _var) public {
       myuint = _var;
   }

   function get() public view returns (uint){
       return myuint;
   }
}

第一個程式碼如何儲存地址似乎存在問題。現在我已更改程式碼以將地址顯式儲存為地址類型,在使用 Web3 提供程序和 Genache 作為本地區塊鏈的 Remix IDE 中沒有問題。

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