Solidity

在純函式中使用 Solidity 常量數組(不支持)的標準解決方法?

  • April 2, 2021

我的契約中有一個像這樣的數組和一個像這樣使用它的純方法(簡化的例子,因為我真正的例子是更多的行):

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;
   }
}

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