Solidity

公共變數 getter 在 Remix 中顯示為事務

  • January 14, 2020

從 Solidity 0.6.0+ 編譯器開始,我的 remix 將由公共變數建構的 getter 函式顯示為事務,因此不返回值。我搜尋了solidity 0.6.0 的重大更改,但沒有找到任何解釋。我錯過了什麼?

關於solidity pragma <= 0.5.16的範例: 在此處輸入圖像描述

關於solidity pragma >=0.6.0的範例: 在此處輸入圖像描述

該問題與編譯器生成的ABI JSON以及工具如何使用它來確定函式是view還是pure.

正如您在文件中看到的:

欄位constantpayable已棄用,將來將被刪除。相反,該stateMutability欄位可用於確定相同的屬性。

現在,看看使用以下簡單合約生成的 JSON 有何不同:

contract C1 {

   uint x;

   function setX(uint _x) public {
       x = _x;
   }

   function getX() public view returns (uint) {
       return x;
   }
}

請注意,僅getX()顯示該功能的 ABI。


v0.6.0 的 JSON 格式

{
   "inputs": [],
   "name": "getX",
   "outputs": [
       {
           "internalType": "uint256",
           "name": "",
           "type": "uint256"
       }
   ],
   "stateMutability": "view",
   "type": "function"
},

v0.5.13 的 JSON 格式

{
   "constant": true,
   "inputs": [],
   "name": "getX",
   "outputs": [
       {
           "internalType": "uint256",
           "name": "",
           "type": "uint256"
       }
   ],
   "payable": false,
   "stateMutability": "view",
   "type": "function"
},

編輯:

正如我們在此處看到的,Remix 僅使用constant欄位來確定函式是viewor pure

var lookupOnly = args.funABI.constant

現在,這是解決了,我們可以在這裡看到。

const lookupOnly = args.funABI.stateMutability === 'view' || args.funABI.stateMutability === 'pure' || args.funABI.constant

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