Solidity知識點集 — 函數(shù)修飾符、GAS節(jié)省、For循環(huán)(六)

帶參數(shù)的函數(shù)修飾符

之前我們已經(jīng)讀過一個簡單的函數(shù)修飾符了:onlyOwner。函數(shù)修飾符也可以帶參數(shù)。例如:

// 存儲用戶年齡的映射
mapping (uint => uint) public age;

// 限定用戶年齡的修飾符
modifier olderThan(uint _age, uint _userId) {
  require(age[_userId] >= _age);
  _;
}

// 必須年滿16周歲才允許開車 (至少在美國是這樣的).
// 我們可以用如下參數(shù)調(diào)用`olderThan` 修飾符:
function driveCar(uint _userId) public olderThan(16, _userId) {
  // 其余的程序邏輯
}

利用 'View' 函數(shù)節(jié)省 Gas

當(dāng)從外部調(diào)用一個view函數(shù),是不需要支付一分 gas 的。這是因為 view 函數(shù)不會真正改變區(qū)塊鏈上的任何數(shù)據(jù) - 它們只是讀取。

存儲非常昂貴

Solidity 使用storage(存儲)是相當(dāng)昂貴的,”寫入“操作尤其貴。這是因為,無論是寫入還是更改一段數(shù)據(jù), 這都將永久性地寫入?yún)^(qū)塊鏈。

需要在全球數(shù)千個節(jié)點的硬盤上存入這些數(shù)據(jù),隨著區(qū)塊鏈的增長,拷貝份數(shù)更多,存儲量也就越大。這是需要成本的!

為了降低成本,不到萬不得已,避免將數(shù)據(jù)寫入存儲。

在大多數(shù)編程語言中,遍歷大數(shù)據(jù)集合都是昂貴的。但是在 Solidity 中,使用一個標(biāo)記了external view的函數(shù),遍歷比 storage 要便宜太多,因為 view 函數(shù)不會產(chǎn)生任何花銷。

在內(nèi)存中聲明數(shù)組

數(shù)組后面加上 memory關(guān)鍵字, 表明這個數(shù)組是僅僅在內(nèi)存中創(chuàng)建,不需要寫入外部存儲,并且在函數(shù)調(diào)用結(jié)束時它就解散了。

function getArray() external pure returns(uint[]) {
  // 初始化一個長度為3的內(nèi)存數(shù)組
  uint[] memory values = new uint[](3);
  // 賦值
  values.push(1);
  values.push(2);
  values.push(3);
  // 返回數(shù)組
  return values;
}

** For 循環(huán)**

來看一個創(chuàng)建偶數(shù)數(shù)組的例子:

function getEvens() pure external returns(uint[]) {
  uint[] memory evens = new uint[](5);
  // 在新數(shù)組中記錄序列號
  uint counter = 0;
  // 在循環(huán)從1迭代到10:
  for (uint i = 1; i <= 10; i++) {
    // 如果 `i` 是偶數(shù)...
    if (i % 2 == 0) {
      // 把它加入偶數(shù)數(shù)組
      evens[counter] = i;
      //索引加一, 指向下一個空的‘even’
      counter++;
    }
  }
  return evens;
}

這個函數(shù)將返回一個形為 [2,4,6,8,10] 的數(shù)組。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容