帶參數(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ù)組。