区块见闻 区块见闻
Ctrl+D收藏区块见闻
首页 > SOL > 正文

POS:SMTChecker 检查合约漏洞的超能力_POSI

作者:

时间:

译文出自:登链翻译计划

译者:翻译小组

校对:Tiny熊

理论:什么是SMTChecker?

你是否敢打保证,你刚刚部署的合约没有严重的漏洞吗?如果你像我一样,想必答案是一个响亮的不。

我在传统的软件工程中见过足够多的黑客,知道你永远不可能100%确定。这很可怕,但不同技术的组合使用可以让我们相当接近到所需要的信心。

SMTChecker就是这样给我信心的技术之一。

SMTChecker是一个对合约进行形式化验证的工具:你定义一个规范,SMTChecker以证明该合约符合该规范。如果不符合,SMTChecker通常会给你一个具体的反例:一个破坏规范的交易序列。

最重要的是什么?如果你使用Solidity,你已经有了SMTChecker-它是Solidity编译器的一部分。

不过它决不是一个无懈可击的解决方案--验证错误是慢的。最重要的是,要定义一个完整的规范是非常困难的。但即使如此,SMTChecker仍然值得一试。

以跳棋合约为例

该合约实现了一个计数器--一个在8x8棋盘上玩的跳棋游戏的棋子。

我们将设计一个LazyCounter:它不能移动,但可以通过捕获(capture)相邻的“支点”棋子,跳到对角线格子:如果当前在,想要支点棋子是,我最终会跳在,很简单吧。

//SPDX-License-Identifier:MITpragmasolidity>=0

//////}

代码很简单:我们在一个给定的位置创建一个计数器。然后它可以捕捉其他棋子。

有趣的是最后一个函数(invariant),它定义了一个在任何时候都必须保持的不变性。这个不变性很简单--计数器不能离开棋盘。让我们编译合约,看看我们的不变性是否被破坏。

~/hide/smtchecker_demo???solc1

functionmove1()public{x=1;y=2;require(isValidPosition());}functionmove2()public{x=2;y=1;require(isValidPosition());}functionmove3()public{x=2;y-=1;require(isValidPosition());}functionmove4()public{x-=1;y-=2;require(isValidPosition());}functionmove5()public{x-=1;y=2;require(isValidPosition());}functionmove6()public{x-=2;y=1;require(isValidPosition());}functionmove7()public{x-=2;y-=1;require(isValidPosition());}functionmove8()public{x-=1;y-=2;require(isValidPosition());}functionget_to_7_7()publicview{assert(!(x==7&&y==7));}}

受监管的DeFi交易平台Swarm Markets推出SMT代币:总部位于德国且受德国联邦金融监管局(BaFin)监管的DeFi交易平台Swarm Markets 已宣布推出SMT代币,SMT代币将用于在其他用例中为Swarm Markets平台上的流动性提供动力。官方表示,50%的SMT代币将用于奖励池,没有为团队预留代币。SMT用户可以享受协议交易费用50%的折扣。(zycrypto)[2021/7/9 0:40:35]

~/hide/smtchecker_demo???solc2

contractAMMPair{IERC20Metadatax;IERC20Metadatay;uint256xReserves;uint256yReserves;uint256totalSupply;constructor(IERC20Metadata_x,IERC20Metadata_y,uint256depositX,uint256depositY){require(_x

functionaddLiquidity(uint256depositX,uint256depositY)publicreturns(uint256){require(depositX!=0,"depositX!=0");require(depositY!=0,"depositY!=0");require(depositX*1e18/depositY==xReserves*1e18/yReserves,"unbalancing");uint256extraSupply=depositX*totalSupply/xReserves;xReserves=depositX;yReserves=depositY;totalSupply=extraSupply;x

}

我们可以添加什么样不变性?不多--也许储备不为空,仅此而已。

让我们把不变性的定义扩展,称之为动态不变性:知道执行addLiquidity之前和之后的状态,我们可以断言什么?

contractAMMPair{//..

}

注意结尾处的revert()--它确保了此不变函数没有副作用,让我们试试吧

Gate.io Startup 首发项目SMTY最高涨幅达2021.2%:据Gate.io芝麻开门行情显示,截至今日14:10,Gate.io Startup 首发项目SMTY24H最高涨幅2021.2%,最高价格10.606美元,为首发认购价格2美元的5倍,当前价格为1.967美元,24H现货交易量达467.25万美元。近期行情波动较大,请注意控制风险。[2021/4/28 21:07:00]

~/hide/smtchecker_demo???solc--model-checker-enginechc--model-checker-show-unproved--model-checker-timeout0--model-checker-contracts3

functionaddLiquidityStateChange(uint256depositX,uint256depositY)internalreturns(uint256){require(depositX!=0,"depositX!=0");require(depositY!=0,"depositY!=0");require((depositX*1e18)/depositY==(xReserves*1e18)/yReserves,"unbalancing");uint256extraSupply=(depositX*totalSupply)/xReserves;xReserves=depositX;yReserves=depositY;totalSupply=extraSupply;returnextraSupply;}functioninvariant1()publicview{assert(xReserves>0);assert(yReserves>0);}functioninvariantAddLiquidity(uint256depositX,uint256depositY)public{uint256oldSupply=totalSupply;uint256oldXReserves=xReserves;uint256supplyAdded=addLiquidityStateChange(depositX,depositY);assert(depositX/oldXReserves==supplyAdded/oldSupply);revert("alldone");}}contractAMMPairisAMMPairEngine{IERC20x;IERC20y;constructor(IERC20_x,IERC20_y,uint256depositX,uint256depositY)AMMPairEngine(depositX,depositY){require(_x

公告 | 火币全球站将关闭18C和SMT的旧币充值业务:据火币公告,18C和SMT已换链完成,截至目前, 旧币已陆续被兑换成新币。经过和项目方的沟通,火币全球站决定将于4月4日18:00关闭18C和SMT旧币充值业务,但新币的充值业务不受影响。[2019/4/3]

functionaddLiquidity(uint256depositX,uint256depositY)public{addLiquidityStateChange(depositX,depositY);x

}

AMMPairEngine有addLiquidityStateChange作为一个内部函数。它是由AMMPair调用的。AMMPairEngine唯一的公共函数是不变性函数。如果我们不希望它们出现在部署的代码中,则它们可以被移到AMMPairEngineTestisAMMPairEngine合约中。

~/hide/smtchecker_demo???timesolc--model-checker-enginechc--model-checker-show-unproved--model-checker-timeout0--model-checker-contracts3.sol:AMMPairEngine3.solWarning:CHC:Divisionbyzerohappenshere.Counterexample:xReserves=2,yReserves=2,totalSupply=0depositX=1depositY=1oldSupply=0oldXReserves=1supplyAdded=0Transactiontrace:AMMPairEngine.constructor(1,1)State:xReserves=1,yReserves=1,totalSupply=0AMMPairEngine.invariantAddLiquidity(1,1)AMMPairEngine.addLiquidityStateChange(1,1)--internalcall-->3.sol:117:43:|117|assert(depositX/oldXReserves==supplyAdded/oldSupply);|^^^^^^^^^^^^^^^^^^^^^^^Warning:CHC:Assertionviolationhappenshere.-->3.sol:117:9:|117|assert(depositX/oldXReserves==supplyAdded/oldSupply);|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^solc--model-checker-enginechc--model-checker-show-unproved03.sol7.11suser0.17ssystem98%cpu7.357total

OKEx将于今日18时开放SMT提币:OKEx今日发布公告,SMT智能合约地址已更换完毕,新币发放工作已全部完成,OKEX将于北京时间2018年6月6日18时开放提币服务。由于SMT风险保障金尚未缴纳,其交易服务开放时间以后续公告为准。[2018/6/6]

可以看到会出现除以0会导致违反断言。反例使问题很明显:合约创建者存入了1e-18的X和1e-18的Y代币。这使得合约发行了0个LP代币。我们将切换到36进制的数学,这应该可以解决这个问题。

contractAMMPairEngine{//...constructor(uint256depositX,uint256depositY){//...totalSupply=depositX*depositY;//removed'/1e18'}//...}

~/hide/smtchecker_demo???timesolc--model-checker-enginechc--model-checker-show-unproved--model-checker-timeout0--model-checker-contracts3.sol:AMMPairEngine3.solWarning:CHC:Assertionviolationmighthappenhere.-->3.sol:117:9:|117|assert(depositX/oldXReserves==supplyAdded/oldSupply);|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^solc--model-checker-enginechc--model-checker-show-unproved03.sol75.19suser0.50ssystem99%cpu1:16.27total

注意这个变化:现在没有除以0违反断言的情况,现在是Assertionviolationmighthappenhere。这里表达了不确定。我需要做更多的调查以更好地了解这里发生了什么。

更新09/05/2021:LeoAlt指出,可能发生并不足以称之为部分成功--而是SMTChecker真的很难证明这个断言,所以我们不能真的依赖它。

SMT/BTC折合人民币约0.96元 涨幅为6.72%:截止北京时间11:30,火币Pro平台SMT对BTC价格为0.00000995,折合人民币约0.96元,当前涨幅为6.72%。[2018/1/5]

WechatIMG386image-20210909173722020

顺便说一句,你可以手动证明最后一个例子中的数学公式,但这显然没有扩展性,原代码中有断言违反,有一个反例:

1_H28r2hdKhCL9JAgarE53iA

证明新代码中没有违反断言的情况:

1_F9k9Dwa8_Lba-4zTG68q9w

结论

当我们编写合约的时候考虑到它,那每个人都可以享受到SMTChecke自动形式化验证的好处。

我希望能花些时间深入研究SMTChecker,敬请关注。

其他的替代品

Manticore是一个符号执行引擎,可以做与SMTChecker类似的事情。一方面它是高度可编程的,但它做更少的事情。另一方面,这些事情是可实现的,另外我们对验证过程有更多的控制

Echidna是一个模糊工具--使用类似于不变性的想法,随机地试图找到破坏它们的输入。它并不能证明不变性的成立,但可以快速发现很多非边缘案例的缺陷。Echidna使用与Manticore相同的语法,因此它们都可以并行使用。

Scribble采取了一种不同的方法--用动态不变性对每个函数进行注解。它使用自己的语言来描述不变性,并且可以用物化的不变性来记录你的代码。

大量的静态分析/其他模糊分析工具--它们非常有用,但不在本文的讨论范围之内。

鸣谢

AlbertoCuestaCa?ada为上述大多数参考资料和最小AMM的想法。

本翻译由CellETF赞助支持。

来源:https://medium.com/@sblowpckcr/smtchecker-almost-practical-superpower-5a3efdb3cf19

参考资料

登链翻译计划:https://github.com/lbc-team/Pioneer

翻译小组:https://learnblockchain.cn/people/412

Tiny熊:https://learnblockchain.cn/people/15

SMTChecker:https://docs.soliditylang.org/en/v0.8.7/smtchecker.html

积极(aggressive):https://docs.soliditylang.org/en/v0.8.7/smtchecker.html#timeout

准确(accurate):https://docs.soliditylang.org/en/v0.8.7/smtchecker.html#constrained-horn-clauses-chc

这里:https://docs.soliditylang.org/en/v0.8.7/smtchecker.html#smt-and-horn-solvers

可以可以帮助发现重入问题:https://docs.soliditylang.org/en/v0.8.7/smtchecker.html#external-calls-and-reentrancy

LeoAlt:https://twitter.com/leonardoalt

你可以手动证明最后一个例子中的数学公式:https://github.com/sblOWPCKCR/smtchecker_demo/blob/main/z3.ipynb

Manticore:https://github.com/trailofbits/manticore

Echidna:https://github.com/crytic/echidna

Scribble:https://consensys.net/diligence/scribble/

AlbertoCuestaCa?ada:https://medium.com/u/8206cbb70805?source=post_page-----5a3efdb3cf19--------------------------------

CellETF:https://celletf.io/?utm_souce=learnblockchain

免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。

本文来源于非小号媒体平台:

登链社区

现已在非小号资讯平台发布105篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/10351087.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

每周编辑精选WeeklyEditors'Picks

标签:POSPOSIDEPOHECpos币也会集中Position TokenProphecy

SOL热门资讯
tether:彭博社:美国财政部确认稳定币风险,或引发对加密更严格监管_算法稳定币哪个最值得买

据彭博社9月17日消息,美国财政部官员已经确定了由Tether和其他稳定币构成的最紧迫的风险,并准备了对加密货币进行更严格监管的建议.

GATE:Gate.io 已经完成比原链(BTM)主网升级公告_CHTT价格

Gate已经完成主网络升级。升级后,充值地址已经变更,请到BTM充值页面生成新的地址,使用新地址充值。用户提现时也请使用新版主网地址.

SER:Huobi Global将于9月16日上线EDEN新币活动_sero币最新消息

尊敬的用户: Huobi?Global即将开启EDEN新币活动。即刻参与,领取奖励。充值EDEN,瓜分20,000USDT等值EDEN奖励池充值活动时间:2021年9月16日18:00:00——.

SHIBA:关于上线SHIB(Shiba Inu)及其交易的公告_SHI

尊敬的EXX用户:? ???您好!根据市场的情况及用户的建议,EXX将于香港时间2021年5月10日15:00上线开放SHIB/USDT、SHIB/ETH交易市场,用户可提前准备.

KEN:imToken 和 NFTGO 达成战略合作_TOKE

我们很高兴地宣布,imToken与NFTGO达成了战略合作,将共同促进NFT推广普及,一起帮助?imToken用户更好地探索NFT市场,管理NFT资产.

GAT:Gate.io 质押KSM,一键参与KSM插槽拍卖活动公告 (AIR新项目上线)_GATENet

为支持Kusama平行链插槽竞拍,Gate.io开启“质押KSM,一键参与KSM插槽拍卖活动”,第八次平行链拍卖活动已于北京时间9月15日20:00开启,用户锁仓KSM即可为支持的项目助力.