Solidity
在純函式中使用 Solidity 常量數組(不支持)的標準解決方法?
我的契約中有一個像這樣的數組和一個像這樣使用它的純方法(簡化的例子,因為我真正的例子是更多的行):
uint[16] constant x = [10, 2, 6, 42, 19, 5, 4, 36, 6, 6, 5, 5, 5, 46, 4, 4]; function foo(uint i, uint j) external pure returns (uint) { return x[i] + x[j] * 12; }
但是solidity似乎不支持這一點,所以我只能想辦法將其更改為非常數,但是即使我的函式是純的,我也被迫切換到視圖。
uint[16] x = [10, 2, 6, 42, 19, 5, 4, 36, 6, 6, 5, 5, 5, 46, 4, 4]; function foo(uint i, uint j) external view returns (uint) { return x[i] + x[j] * 12; }
如果我將它更改為一堆單獨的 uint insted of uint,似乎我只能保持函式的純淨
$$ 16 $$但這很亂。 是否有一種工作方法可以使我的功能保持純淨?只是讓它查看標準的解決方法嗎?
似乎這是一個待定的功能 https://github.com/ethereum/solidity/issues/1772
但是,如果所需的範圍是從 0 到 255,則有一個竅門。
bytes public constant TEST_MAP = hex"000804"; function test(uint8 key) external pure returns (byte) { return TEST_MAP[uint256(key)]; }
我認為這應該有效。
pragma solidity >=0.7.0 <0.9.0; contract MyContract { function foo(uint i, uint j) external pure returns (uint) { uint8[16] memory x = [10, 2, 6, 42, 19, 5, 4, 36, 6, 6, 5, 5, 5, 46, 4, 4]; return x[i] + x[j] * 12; } }