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 gasP2 — {M consecutive jumpdests} → {jumpdest}, M≥2
jumpdests是jump的目的地址一个jumpdests取代多个连续的jumpdests,因他们是相同操作deploy多花68×(M−1)gas, execution多花(M−1)gasP3 — {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) gasP4 — {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) gasP5 — {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如果呼叫较多次还是叫efficientP6 — {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) gasP7 — {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 gasP8 — {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 gasP10 — {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 gasP11 — {swap(X), X+1 consecutive pops} → {X+1 consecutive pops}, 1≤X≤16
设X为1,因连续两个pop会消除stack上方两个元素,因此swap1无作用deploy多花68 gas, execution多花3 gasP12 — {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 gasP13 — {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 gasP16 — {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 gasP17 — {$swap$1, OP} → {OP}, OP∈add,mul,and,or,xor
因为OP是可交换的(commutative),所以swap无效deploy多花68 gas, execution多花3 gasP18 — {OP, iszero, iszero} → {OP}, OP∈lt,gt,slt,sgt,eq
例如: gt的结果是0或1,取决于stack的第一个元素是否大于第二个元素两个连续的iszero不会改变OP的结果deploy多花136 gas, execution多花6 gasP19 — {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 gasP20 — {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 gasP21 — {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 gasP22 — {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 gasP23 — {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 gasP24 — {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可以帮助您解决问题,能够解决大家的实际问题是塔岸网一直努力的方向和目标。
香港持牌加密货币交易所HashKey Exchange 周三(1日)正式推出行动端应用程序,为专业投资人和零售用户提供服务。HashKey 营运长Livio Weng 受访表示,HashKey 还计划铸造自己的ERC-20 应用型代币HSK,可能会在明年年中上市。App 正式上线根据《The Blo...
11-15
Sushi 社群成员在治理论坛发布提案,拟议恢复SUSHI 代币的价值与功能,并让DAO 重新掌握协议治理权。Sushi 社群起义重拾治理权社群成员Trantor 表示,自从Kanpai 2.0 于2022 年12 月推出以来,所有协议费用都流入国库,尽管这有助于确保国库能够获得充足的资金,但核心团...
11-15
继贝莱德的IBTC 之后,景顺(Invesco)与Galaxy 共同提交的比特币现货ETF 也在美国证券存托清算公司的清单(DTCC)上架,股票代码为BTCO。标志着这两档ETF 申请正朝着标准程序持续推进。需要再次重申的是,许多人甚至会误将「上架DTCC」视为比特币现货ETF 批准的预告,但事实上...
11-15
由于传统金融体系缺乏信任而诞生的加密行业,逐渐崭露头角,并引发了人们的思考以及全球范围内的广泛关注,迄今已经成长为万亿美元市场。但作为没有任何参考的新兴行业,加密市场为传统金融市场带来创新与注入活力的同时,各种突现的黑天鹅事件也不容忽视,合规透明正成为其未来发展的主旋律。作为全球领先的加密资产交易所...
11-15
根据英国金融行为监理总署 (Financial Conduct Authority, FCA) 官方公告显示,知名交易所 Bitfinex 被列为未经当局授权的警告名单。FCA:Bitfinex 在未经授权下推广英国金融行为监理总署 (Financial Conduct Authority, FCA...
11-15