译者 | 李睿
审校 | 孙淑娟
对一些人来说,编写安保默认合约很难。本文将引见Web3中的一些安保工具,以提高默认合约的安保性。
毫无不懂,编写安保默认合约比拟艰巨,即使是初级开发人员编写的默认合约也或许被黑客攻打。由于这些默认合约通常具备很高的经济价值,因此黑客攻打和破解它们的动机也很高。再加上Web3的不变性,安保性变得愈减轻要。安保性因此成为了默认合约开发人员的首要义务。
本文将引见默认合约开发的每个阶段可用的一些安保工具,并对驳回这些工具提供一些倡导。
1、为开发做好预备
当开局开发默认合约时,安保性应该是开发人员首要思考的疑问,而一些工具可以在预备编写代码时提供协助,这其中包括文档、检测和编写可重用代码。
首先,文档是任何开发名目标关键,默认合约开发也不例外。以太坊人造规范格局(NatSpec)是一种记载默认合约的好方法。
NatSpec是一种不凡方式的注释,用于为合约、接口、库、函数和事情提供丰盛的文档。例如以下Tree Contract的稳固性代码片段:
SPDXLicenseIdentifier GPL pragma solidity @title A simulator for trees @author Larry A. Gardner @notice You can use this contract for only the most basic simulation contract Tree @notice Calculate tree age years rounded up for live trees @dev The Alexandr N. Tetearing algorithm could increase @param rings The number of rings dendrochronological sample @return Age years rounded up for partial yearsfunction ageuint256 rings external virtual pure returns uint256 return rings
NatSpec 对Solidity Contract的注释
经过经常使用NatSpec注释,可以很容易地向其余开发人员、审核人员或只想与合约交互的人解释代码。便捷地说,它是洁净的、可读的、容易了解的。
其次,重用经过实战测试的代码是降落默认合约中破绽危险的另一种经过验证的方法。目前有许多宽泛经常使用的开源默认合约库,例如OpenZeppelin,其中蕴含用于成功访问控制、暂停配置、更新等的预先编写的逻辑,以及用于提升经常使用的Solmate合约。
最后,检测是在默认合约代码中发现潜在疑问的具备价值的工具。它可以在代码中发现格调错误、违犯编程商定和不安保的结构。有很多很好的检测工具可用,例如ETHLint(以前的Solium)。检测可以协助发现潜在的疑问(例如重入破绽这样的安保疑问),甚至在它们成为代价高昂的错误之前。
经过在默认合约开发环节中思考文档、检测和可重用代码,可以提高合约的安保性。从久远来看,花期间正确地设置这些将会在安保性和效率方面获取报答。
2、开发
如今了解可以在编码时提供协助的两类工具——单元测试和基于属性的测试。
单元测试显然是创立安保牢靠代码的关键组成局部。经过测试代码的单个单元,可以确保合约依照预期的方式运转,并宿愿在消费中出现疑问之前发现任何潜在疑问。
有几种不同的工具可用于为默认合约编写单元测试。Foundry、Truffle和Brownie都是支持各种编程言语的盛行框架。
Foundry(用Rust编写)是一个用于编写默认合约的框架,其中包括测试框架Forge。伪造单元测试可以间接在Solidity中编写,包括许多诈骗代码,这些代码可以提供断言、扭转EVM形态的才干、模拟数据等等。Foundry还带有内置的Fuzzing(将在前面的文章中详细探讨)。
SPDXLicenseIdentifier Unlicense pragma solidity import import import contract StakeContractTest DSTest StakeContract public stakeContractMockERC20 public mockTokenfunction setUp public stakeContract new StakeContractmockToken new MockERC20 @notice Test token staking with different amountfunction test_staking_tokens public uint256 amount mockTokenaddressstakeContract amount stakePassed stakeContractamount addressmockTokenassertTruestakePassed
在Foundry中的Solidity单元测试示例
Truffle也是构建默认合约的框架。Truffle中的单元测试可以用Solidity或JavaScript编写。开发人员通经常常使用基于JavaScript的测试与合同启动外部交互,并经常使用Solidity测试评价合同在实践区块链上的行为。Truffle经常使用Mocha启动异步测试,经常使用Chai启动断言。
Brownie是一个基于python的框架,用于开发和测试默认合约。Brownie与pytest集成用于单元测试,并提供了一个堆栈跟踪剖析工具来测量代码笼罩率。
在编写单元测试时,经过测试尽或许多的代码不同局部来成功高测试笼罩率,以确保一切配置都能按预期上班。Foundry不须要额外的插件来测量测试笼罩率。关于其余框架,或许至少可以减少一个插件来权衡这一点。
只管单元测试是确保默认合约正确性的牢靠方法,但基于属性的测试准许对默认合约启动更深化的验证。这是一个相对较新的概念,与传统的单元测试相比,它提供了一系列长处。基于属性的测试并重于测试默认合约的属性,而不是单个组件。
在指南中,“属性形容了默认合约的预期行为,并申明了关于其口头的逻辑断言。属性必定一直为真。基于属性的测试工具将默认合约的代码和用户定义的属性汇协作为输入,并审核口头能否在任何期间点违犯了它们。”
基于属性的测试基于含糊概念,这是一种经过引入随机输入来测试系统的技术。这象征着基于属性的测试可以在更宽泛的层面上审核默认合约,由于它不依赖于开发人员提供的特定输入。正由于如此,它正成为一种越来越盛行的测试默认合约的方法。
以之前的合约为例,经常使用基于属性的方法来测试一个便捷的staking函数。为此,将经常使用Scribble,这是一种规范言语和运转时工具,它使这一切变得愈加容易。
SPDXLicenseIdentifier MITpragma solidity import error TransferFailedcontract StakeContract mappingaddress uint256 public s_balances #if_succeeds msg $result function stakeuint256 amount address token external returns s_balancesmsg amount success IERC20tokenmsg addressthis amountif success revert TransferFailedreturn success
经常使用Scribble Notation启动的样品牢靠性测试
不同的工具可以经常使用Scribble规范启动属性测试
为了评价staking函数,必定审核它能否在成功口头的状况下前往true。这可以经过向stake函数代码减少注释来成功,正如下面所标明的那样,不须要独自的测试文件。而后可以运转Scribble CLI工具将Scribble注释转换为断言。接上去,这些断言必定经过含糊器(如Diligence Fuzzing或Mythril)运转,以确定能否存在任何违犯属性的状况。
来自Diligence Fuzzing优惠示例的报告
还有一些其余工具可用于基于属性的测试,例如Foundry。Scribble(以上经常使用的)、Diligence Fuzzing和Mythril是最值得介绍的几种工具。Scribble和Diligence Fuzzing是由ConsenSys Diligence构建的收费开源工具。Mythril是一个旨在检测以太坊默认合约中潜在破绽的工具。
Scribble这种工具令人青睐,由于把可这些测试放在一同就像减少函数注释一样便捷。
3、前期开发
最后一组工具是前期开发。详细来说,就是监控。
由于大少数区块链上的默认合约代码是无法变的,一旦代码被推送到主网,就简直无法控制它。监控可以协助开发人员了解代码中的任何疑问或更改,以便可以极速处置它们。这不只可以协助开发人员提高合约的安保性,还可以协助提升和改良其配置。
OpenZepplin的Defender Sentinels和Tenderly的实时警报工具十分适宜监控区块链上合约和钱包。
Tenderly Alerts提供了一组自定义触发器以供选用,准许极速设置各种优惠的警报,例如部署新合同时、发送或接纳事务时以及特定地址时。
Defender Sentinel经过定义的一系列自定义参数提供实时安保监控和警报,例如,假设取款超越特定阈值,假设有人口头关键操作(例如调用转账一切权),或许假设黑名单地址试图与合约交互的时刻。
4、论断
默认合约安保工具十分关键。宿愿本文能够协助人们了解适宜工具,以便编写更安保的默认合约。
原文链接: