Solidity

為什麼要使用數組作為輸入?

  • February 11, 2018

我有以下契約:

pragma solidity ^0.4.17;

contract one{
   uint firstNum;
   uint secondNum;
   uint thirdNum;
   function getNumber(uint _num, uint _num2,uint _num3) public{
      firstNum = _num;
      secondNum = _num2;
      thirdNum = _num3;
   }
}

contract two{
   uint firstNum;
   uint secondNum;
   uint thirdNum;
   function getNumber(uint[3] numValues) public{
      firstNum = numValues[0];
      secondNum =numValues[1];
      thirdNum = numValues[2];
   }
}

從字面上看,唯一的區別是輸入功能。現在是費用:

契約一創作:

  • 交易成本:102814 gas。
  • 執行成本:37682 gas。

和函式呼叫 1,2,3 作為輸入:

  • 交易成本:82106 gas。
  • 執行成本:60258 gas。

合約二創作:

  • 交易成本:121264 gas。
  • 執行成本:51500 gas。

和函式呼叫

$$ 1,2,3 $$作為輸入:

  • 交易成本:82296 gas。
  • 執行成本:60448 gas。

所以有幾個問題……為什麼它更貴?現在為什麼像 0x 這樣的合約使用數組而不是單獨輸入它們?

你的合約非常簡單,執行成本主要是儲存成本。

將每個儲存uint在您的合約儲存中使用 20000 氣體。您的合約中有三個儲存它們將使用 60000 氣體。

solidity中的數組需要一些額外的處理,請參閱Diving Into The Ethereum VM Part 3 — The Hidden Costs of Arrays(檢查越界情況)。所以使用它們的函式會更長。

這導致合約規模更大,部署成本更高。但是部署只進行一次,所以這不是很嚴重的問題。

0x 使用數組作為參數的可能原因之一是在函式中使用太多參數會導致編譯器錯誤“堆棧太深”。

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