帶參數(shù)的函數(shù)修飾符
之前我們已經(jīng)讀過(guò)一個(gè)簡(jiǎn)單的函數(shù)修飾符了:onlyOwner
咬摇。函數(shù)修飾符也可以帶參數(shù)伐蒂。例如:
// 存儲(chǔ)用戶年齡的映射
mapping (uint => uint) public age;
// 限定用戶年齡的修飾符
modifier olderThan(uint _age, uint _userId) {
require(age[_userId] >= _age);
_;
}
// 必須年滿16周歲才允許開(kāi)車 (至少在美國(guó)是這樣的).
// 我們可以用如下參數(shù)調(diào)用`olderThan` 修飾符:
function driveCar(uint _userId) public olderThan(16, _userId) {
// 其余的程序邏輯
}
利用 'View' 函數(shù)節(jié)省 Gas
當(dāng)從外部調(diào)用一個(gè)view
函數(shù),是不需要支付一分 gas 的肛鹏。這是因?yàn)?view 函數(shù)不會(huì)真正改變區(qū)塊鏈上的任何數(shù)據(jù) - 它們只是讀取逸邦。
存儲(chǔ)非常昂貴
Solidity
使用storage
(存儲(chǔ))是相當(dāng)昂貴的恩沛,”寫入“操作尤其貴。這是因?yàn)槁萍酰瑹o(wú)論是寫入還是更改一段數(shù)據(jù)雷客, 這都將永久性地寫入?yún)^(qū)塊鏈。
需要在全球數(shù)千個(gè)節(jié)點(diǎn)的硬盤上存入這些數(shù)據(jù)烛卧,隨著區(qū)塊鏈的增長(zhǎng)佛纫,拷貝份數(shù)更多,存儲(chǔ)量也就越大总放。這是需要成本的!
為了降低成本好爬,不到萬(wàn)不得已局雄,避免將數(shù)據(jù)寫入存儲(chǔ)。
在大多數(shù)編程語(yǔ)言中存炮,遍歷大數(shù)據(jù)集合都是昂貴的炬搭。但是在 Solidity
中,使用一個(gè)標(biāo)記了external view
的函數(shù)穆桂,遍歷比 storage
要便宜太多宫盔,因?yàn)?view
函數(shù)不會(huì)產(chǎn)生任何花銷。
在內(nèi)存中聲明數(shù)組
數(shù)組后面加上 memory
關(guān)鍵字享完, 表明這個(gè)數(shù)組是僅僅在內(nèi)存中創(chuàng)建灼芭,不需要寫入外部存儲(chǔ),并且在函數(shù)調(diào)用結(jié)束時(shí)它就解散了般又。
function getArray() external pure returns(uint[]) {
// 初始化一個(gè)長(zhǎng)度為3的內(nèi)存數(shù)組
uint[] memory values = new uint[](3);
// 賦值
values.push(1);
values.push(2);
values.push(3);
// 返回?cái)?shù)組
return values;
}
** For 循環(huán)**
來(lái)看一個(gè)創(chuàng)建偶數(shù)數(shù)組的例子:
function getEvens() pure external returns(uint[]) {
uint[] memory evens = new uint[](5);
// 在新數(shù)組中記錄序列號(hào)
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;
//索引加一彼绷, 指向下一個(gè)空的‘even’
counter++;
}
}
return evens;
}
這個(gè)函數(shù)將返回一個(gè)形為 [2,4,6,8,10]
的數(shù)組。