如何減少transaction gas cost

Brian Po-han Chen
Taipei Ethereum Meetup
3 min readOct 27, 2017

因為做產品的時候,當然希望成本越低越好,所以簡單的做了一個實驗,測試合約大致如下(跟原來做實驗的合約有一點不一樣,但是邏輯是一樣的):

contract Test {
mapping (uint => bytes32[]) Data;
function setData0(uint idx, bytes32[] dataSet) returns (bool) {
Data[idx] = dataSet;
}
function setData1(uint[] idxs, bytes32[] dataSet) returns (bool) {
uint index_dataset = 0;
for (uint i = 0; i < idxs.length; i += 2) {
for (uint j = 0; j < idxs[i+1]; j++) {
Data[idxs[i]].push(dataSet[index_dataset + j]);
}
index_dataset += idxs[i+1];
}
}
}

我希望在某一個key底下放一個bytes32 array,希望用最少的交易來達到,第一個function是一筆一筆送;而第二個function則是在第一個參數放入下述定義的array,

[idx, idx_num, idx, idx_num, …, idx, idx_num]

第二個參數則是把所有要放進去的bytes32值,藉由第一個參數的idx要放idx_num個bytes32去全部塞在同一個交易中.

實驗結果如下:

在Execution Gas Cost上,setData0大概都會略少於setData1,這樣似乎告訴我們不要做這麼複雜比較好?那我們來看一下Transaction Gas Cost

結果setData0的gas cost就漸漸的越來越大,這是因為每次送交易,都會有base gas cost大約在20000左右,也會隨變數增加漸漸變大,所以一次把資料全部送進去合約雖然一開始沒有太大差異,但隨著資料量增加,可以省下不少gas.

另外,得注意block gas limit以免超過限制,還有礦工可能會因為gas消耗太大不願意幫你打包等等,所以應該要適量的控制gas consume.

--

--