24种增加gas的anti-pattern

时间:2023-11-29 04:14:20 浏览:14次

24种增加gas的anti-pattern
2018年的「Towards Saving Money in Using Smart Contracts」paper中提出会使Ethereum上执行Smart contract所花费的gas变高的24种anti-pattern,此文章中分别说明此24种anti-pattern的形式与解决方法。

P1 — {swap(X), swap(X)} →delete, 1≤X≤16

swap(X)交换第一个和第(X+1)个stack中的元素两个连续的swap(X)等于对元素无作用,应该删除deploy多花136 gas, execution多花6 gas

P2 — {M consecutive jumpdests} → {jumpdest}, M≥2

jumpdests是jump的目的地址一个jumpdests取代多个连续的jumpdests,因他们是相同操作deploy多花68×(M−1)gas, execution多花(M−1)gas

P3 — {OP, pop} → {pop}, OP∈iszero,not,balance,calldataload,extcodesize,blockhash,mload,sload

OP会存取stack最上方的元素做运算,再push运算结果回stack如果再pop会把该元素移除,因此等于没有做过运算deploy多花68 gas, execution多花(gas_cost of OP) gas

P4 — {OP, pop} → {pop, pop}, OP∈add,sub,mul,div,sdiv,mod,smod,exp,sigextnd,lt,gt,slt,sgt,eq,and,or,xor,byte,sha3

类似P3,此类操作会pop stack最上方的2个元素做运算,再push运算结果回stackP4相当于两个poppopdeploy多花0 gas, execution多花(gas_costgas_cost of OPOP) gas

P5 — {OP, pop} → {pop, pop, pop}, OP∈addmod,mulmod

类似P3,此类操作会pop stack最上方的3个元素做运算,再push运算结果回stackP5相当于三个pop此pattern取代后在deploy时会增加68 gas但在呼叫时OP会花8 gas,pop会花2 gas如果呼叫较多次还是叫efficient

P6 — {OP, pop} → delete, OP∈address,origin,caller,callvalue,calldatasize,codesize,gasprice,coinbase,timestamp,number,difficulty,gaslimit,pc,msize,gas

类似P3,但此操作不会消耗stack中的元素,而是产生一个值之后push回stack因此此操作可以被删除deploy多花136 gas, execution多花(gas_cost of OP) gas

P7 — {swap1, swap(X), OP, dup(X), OP} → {dup2, swap(X+1), OP, OP}, 2≤X≤15,OP∈add,mul,and,or,xor

dup(X)会复制stack中第X个元素并放至stack最上方设最上方三个元素为i0, i1, i2,X为2,OP为add因此其中一个swap可以被删除,因为OP(add)是可交换的(commutative)deploy多花68 gas, execution多花3 gas

P8 — {OP, stop} → {stop}, OP can be any operation except jumpdest, jump, jumpi and all operations that change storage.

stop会终止smart contract的执行,且stack及memory会被清空假设OP是add,计算完add的结果后被stop,stack的元素被清空,等于没有操作过add另一方面如果OP跟control flow transfer或storage space相关,则无法删去

P9 — {swap(X), dup(X+1), swap1} → {dup1, swap(X+1)}, 1≤X≤15

假设stack最上方两个元素为i0, i1,X为1执行此anti-pattern后stack元素个数加一,且最上方三个元素为i1, i0, i0deploy多花68 gas, execution多花3 gas

P10 — {push(X), swap(Y), Y consecutive pops} → {Y consecutive pops, push(X)}, 1≤X≤32,1≤Y≤16

假设stack最上方两个元素为i0,push1为i1,Y为1执行此anti-pattern后最上方的元素为i1因此其中anti-pattern可以被pops, push1取代。一个swap操作可以被移除deploy多花68 gas, execution多花3 gas

P11 — {swap(X), X+1 consecutive pops} → {X+1 consecutive pops}, 1≤X≤16

设X为1,因连续两个pop会消除stack上方两个元素,因此swap1无作用deploy多花68 gas, execution多花3 gas

P12 — {swap(X), swap(Y), Y consecutive pops} → {X consecutive pops, swap(Y−X), (YX) consecutive pops}, 1≤X≤15,X<Y

假设最上方三个元素为i0, i1, i2,X为1,Y为2经过此anti-pattern操过后,stack的元素减少2个,且最上方的元素为i1deploy多花68 gas, execution多花3 gas

P13 — {X consecutive push(N)s, Y consecutive pops} → {(XY) consecutive push(N)s, if X>Y; (YX) consecutive pops, otherwise}, 1≤N≤32

pop接在push后的操作可以移除,因为两者互相抵消当push(N)多于如pop时,Y个pop及Y个push(N)可以被移除,deploy浪费136Y(68Yx2),execution浪费5Y(3Y+2Y)否则,X个push(N)及X个pop可以被移除,deploy浪费136X(68Xx2),execution浪费5X(3X+2X)

P14 — {X consecutive dup(N)s, Y consecutive pops} → {(XY) consecutive dup(N)s, ifX>Y; (YX) consecutive pops, otherwise}, 1≤N≤16

与P13类似,dup(N)的作用与pop会互相抵消当X>Y时,deploy浪费136Y(68Yx2),execution浪费5Y(3Y+2Y)反之X≤Y时,deploy浪费136X(68Xx2),execution浪费5X(3X+2X)

P15 — {dup(X), swap(X)} → {dup(X)}, 1≤X≤16

若X为1,dup1第一个stack上的item,再swap并没有效果deploy多花68 gas, execution多花3 gas

P16 — {swap1,swap2,…,swap(X),swap(X−1),…,swap1, X-1 consecutive pops} → {X-1 consecutive pops, swap1}, 2≤X≤16

假设最上方三个元素为i0, i1, i2,X为2经过此anti-pattern操过后,stack的元素减少1个,且最上方的两个元素为i2, i1若先pop在swap之前,则需要较少次的swapdeploy多花68 gas, execution多花3 gas

P17 — {$swap$1, OP} → {OP}, OP∈add,mul,and,or,xor

因为OP是可交换的(commutative),所以swap无效deploy多花68 gas, execution多花3 gas

P18 — {OP, iszero, iszero} → {OP}, OP∈lt,gt,slt,sgt,eq

例如: gt的结果是0或1,取决于stack的第一个元素是否大于第二个元素两个连续的iszero不会改变OP的结果deploy多花136 gas, execution多花6 gas

P19 — {N consecutive push(X),M consecutive swap(Y)} → {N consecutive push(X)}, Y<N,1≤X≤32,1≤Y≤16

push(X)是唯一有运算元(operand)的运算push(X), push(X), swap(1)可以最佳化为push(X), push(X)deploy多花68M gas, execution多花3M gas

P20 — {push(X), swap(Y), push(M), swap1} → {push(M), push(X), swap(Y+1)}, 1≤X≤32,1≤Y≤15,1≤M≤32

因P19的原因,所以一个swap可以被移除deploy多花68 gas, execution多花3 gas

P21 — {consecutive Xpush(N), dup(Y), swap(Z)} → {combination of Xpush(N) and dup(M)}, Y<=X,Z<=X,M<=X,1≤N≤32,1≤Y≤16,1≤Z≤16,1≤M≤16

因P19的原因,所以一个swap可以被移除deploy多花68 gas, execution多花3 gas

P22 — {swap(N), M consecutive OPs,(N+M) consecutive and same OP′} → {M consecutive OPs,(N+M) consecutive and same OP'}, OP∈push(X),dup(Y), OP′∈add,mul,and,or,xor,1≤X≤32,1≤N≤16,1≤Y≤16

因OP′是可交换的(commutative),且push(X)和dup(Y)增加stack数1,swap(N)可以被移除deploy多花68 gas, execution多花3 gas

P23 — {dup1, swap(X), dup2, swap1} → {dup1, dup2, swap(X+1)}, 1≤X≤15

假设stack最上方两个元素为i0, i1,X为2执行此anti-pattern后stack数增加2,最上方4个元素为i1,i0,i0,i0deploy多花68 gas, execution多花3 gas

P24 — {dup(X), swap(X−1), swap1, dup(X), swap1} → {dup(X), dup1, swap(X), swap2}, 3≤X≤16

假设stack最上方两个元素为i0, i1, i2,X为3执行此anti-pattern后stack数增加2,最上方4个元素为i0,i2,i1,i2,i2deploy多花68 gas, execution多花3 gas

以上就是24种增加gas的anti-pattern的全部内容,望能这篇24种增加gas的anti-pattern可以帮助您解决问题,能够解决大家的实际问题是塔岸网一直努力的方向和目标。

评论
评论
发 布