Solidity
公共變數 getter 在 Remix 中顯示為事務
從 Solidity 0.6.0+ 編譯器開始,我的 remix 將由公共變數建構的 getter 函式顯示為事務,因此不返回值。我搜尋了solidity 0.6.0 的重大更改,但沒有找到任何解釋。我錯過了什麼?
該問題與編譯器生成的ABI JSON以及工具如何使用它來確定函式是
view
還是pure
.正如您在文件中看到的:
欄位
constant
和payable
已棄用,將來將被刪除。相反,該stateMutability
欄位可用於確定相同的屬性。現在,看看使用以下簡單合約生成的 JSON 有何不同:
contract C1 { uint x; function setX(uint _x) public { x = _x; } function getX() public view returns (uint) { return x; } }
請注意,僅
getX()
顯示該功能的 ABI。{ "inputs": [], "name": "getX", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" },
{ "constant": true, "inputs": [], "name": "getX", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" },
編輯:
正如我們在此處看到的,Remix 僅使用
constant
欄位來確定函式是view
orpure
。var lookupOnly = args.funABI.constant
現在,這是解決了,我們可以在這裡看到。
const lookupOnly = args.funABI.stateMutability === 'view' || args.funABI.stateMutability === 'pure' || args.funABI.constant