链资讯 链资讯
Ctrl+D收藏链资讯

ION:以太坊智能合约安全开发建议_RAC

作者:

时间:

译文出自:登链翻译计划

译者:六天

校对:Tiny熊

协议相关的建议

以下建议适用于以太坊上任何智能合约的开发。

外部调用

在合约中请求外部合约时需谨慎

请求不可信的合约时可能会引入一些意外风险或错误。在调用外部合约时,外部合约或其依赖的其它合约中可能存在恶意代码。因此,每个外部合约的请求都应该被认为是有风险的。如必须请求外部合约,请参考本节中的建议以最大程度的减小风险。

标记不可信合约

在自己开发的合约调用外部合约时,可以明确的将相关的变量、方法以及合约接口标记为非安全。

//badBank

//goodUntrustedBank

避免调用外部合约后更改自身合约状态

无论使用底层调用(形式someAddress

}//goodcontractFixed{functionwithdraw(uint256amount)external{//使用所有可用的gas//使用该方式请确认检查返回值(boolsuccess,)=msg

}

需要注意的是,

}//goodcontractauction{addresshighestBidder;uinthighestBid;mapping(address=>uint)refunds;functionbid()payableexternal{require(msg

functionwithdrawRefund()external{uintrefund=refunds;refunds=0;(boolsuccess,)=msg

}

详见SWC-128

不要委托调用不可信的合约

使用delegatecall调用其它合约方法时,就像是调用本地合约一样,这也造成被调合约可以更改调用合约的状态,这是不安全的。下面示例展示了使用delegatecall导致合约被销毁或造成了资金损失。

contractDestructor{functiondoWork()external{selfdestruct(0);}}contractWorker{functiondoWork(address_internalWorker)public{//unsafe_internalWorker

}

如果使用Destructor的合约地址为参数,调用Worker

functionnegate16(int16_i)publicpurereturns(int16){return-_i;}int8publica=negate8(-128);//-128int16publicb=negate16(-128);//128int16publicc=negate16(-32768);//-32768}

处理此问题的一种方法是在否定之前检查变量的值,如果值等于最小整数则抛出异常。另一种方法是使用长度更大的数据类型,使得变量的值不会达到边界值。

以太坊扩容方案zkSync将通过OKEx实现法币出入金通道:11月11日消息,以太坊扩容方案zkSync开发团队Matter Labs宣布与OKEx达成合作关系,双方的第一个合作目标是在OKEx上支持直接向zkSync的二层网络提供法定货币的提现和充值功能。zkSync表示此次集成正在进行中,后续OKEx还会提供更多在zkSync上的业务。(Medium)[2021/11/11 6:46:17]

对int类型进行乘或除以-1时,也会有类似的问题。

Solidity特定建议

以下是针对Solidity语言的特定建议,但对于使用其他语言开发智能合约时也有指导意义。

使用assert()验证不变量

断言失败时将会触发断言保护,如不变量被更改。例如,在以太坊发行的Token的总量是可以固定的,可以通过assert()进行验证。断言经常和其他逻辑结合使用,比如暂停合约和允许升级。(否则,可能会出现断言一直失败。)

例如:

contractToken{mapping(address=>uint)publicbalanceOf;uintpublictotalSupply;functiondeposit()publicpayable{balanceOf=msg

}

注意,断言通过不代表以太币余额一定相等,因为可以不通过deposit()方法,强制向合约地址发送以太币。

正确使用assert(),require(),revert()

assert和require函数可以用于参数校验,如果不通过则抛出异常。assert函数应仅用于检查内部错误和检查不变量。require函数更适合用于确保条件满足,如输入或合约状态变量被满足,也可以验证调用外部合约的返回值。*

遵循此范例,形式分析工具可以验证永远不会到达的无效的操作码:这意味着不会违反代码中的不变式且代码将被形式化验证。

pragmasolidity^0

}

详见SWC-110&SWC-123

函数修饰器仅用于检查

modifier中的代码通常是在主函数体之前执行的,因此任何状态变量的改变或外部合约调用都会违反Checks-Effects-Interactions模式。而且,由于修饰器的代码和主函数体的代码不在一块,开发者可能会忽略修饰器中的代码。例如,在修饰器中的代码调用外部合约时,可能导致重入攻击。

contractRegistry{addressowner;functionisVoter(address_addr)externalreturns(bool){//Code}}contractElection{Registryregistry;modifierisEligible(address_addr){require(registry

functionvote()isEligible(msg

//goodfunctiondeposit()payableexternal{balances=msg

Yearn.Finance新增以太坊机池:DeFi聚合收益协议Yearn.Finance更新:

1. 新增以太坊机池,支持存入ETH和WETH,当前年化收益率(APY)均为63.8%;

2. 更新了SNX资产;

3. 添加了链接页脚。

官方提示:当前存款手续费为0.5%,并且这是一个基于债务的机池,请注意资产风险。[2020/9/2]

function()payable{require(msg

在fallback函数中检查消息长度

由于fallback函数可以在无消息数据或未匹配到合约方法时被触发,因此,如果仅仅是使用fallback函数接收以太币,建议检查消息是否为空。否则,调用者可能因使用不正确调用了不存在的函数而得不到通知。

//badfunction()payable{emitLogDepositReceived(msg

//goodfunction()payable{require(msg

在方法和状态变量中明确标记payable

StartingfromSolidity0

}contractGame{functionbuyCoins()payablepublic{//5%goestocharitycharity

}

上述合约中,Game合约内部调用了Charity

}contractGame{functionbuyCoins()payablepublic{//5%goestocharitycharity

}

上述合约中,通过Charity合约进行交易都会记录在该合约的事件列表中,以及捐赠的金额。

注意:优先使用新版本Solidity的构造函数优先使用selfdestruct(而不是suicide),keccak256(而不是sha3)类似的构造/别名。类似的模式require(msg

}

合约用户应了解他们打算使用的所有合约源代码。

避免使用tx

functionsendTo(addressreceiver,uintamount)public{require(tx

}contractAttackingContract{MyContractmyContract;addressattacker;functionAttackingContract(addressmyContractAddress)public{myContract=MyContract(myContractAddress);attacker=msg

function()public{myContract

}

应该使用msg

}contractBisFinal{intpublicfee;functionB(uintf)Final(f)public{}functionsetFee()public{fee=3;}}contractCisFinal{intpublicfee;functionC(uintf)Final(f)public{}functionsetFee()public{fee=5;}}contractAisB,C{functionA()publicB(3)C(5){setFee();}}

动态 | Dapper Labs推出游戏化探索以太坊应用的平台Drip测试版本:CryptoKitties开发团队Dapper Labs推出游戏化探索以太坊及DeFi领域应用的平台Drip测试版本。[2020/2/28]

合约被部署时,按照从右到左的顺序线性继承(在关键字_is_之后,按从最基层父类到最派生的子类的顺序列出)。合约A的继承顺序:

Final<-B<-C<-A

示例合约中最终fee的值是5。开发人员可以通过对布尔类型的排序,可以隐藏子合约中一些关键信息。对于这种多重继承,需要仔细检查。

有关安全性和继承的更多信息,请查看本文。

详见SWC-125

使用接口类型代替地址以确保安全

当函数将合同地址作为参数时,最好传递接口或合约类型,而不是地址类型。如果该函数在源代码中的其他位置调用,则编译器将提供其他类型安全保证。

下方代码给出了两种方式:

contractValidator{functionvalidate(uint)externalreturns(bool);}contractTypeSafeAuction{//goodfunctionvalidateBet(Validator_validator,uint_value)internalreturns(bool){boolvalid=_validator

}contractTypeUnsafeAuction{//badfunctionvalidateBet(address_addr,uint_value)internalreturns(bool){Validatorvalidator=Validator(_addr);boolvalid=validator

}

从下面的示例中可以看出上方合约TypeSafeAuction的好处。如果方法validateBet()不是使用合约Validator类型作为参数调用,则编译器将抛出以下错误:

contractNonValidator{}contractAuctionisTypeSafeAuction{NonValidatornonValidator;functionbet(uint_value){boolvalid=validateBet(nonValidator,_value);//TypeError:Invalidtypeforargumentinfunctioncall.//InvalidimplicitconversionfromcontractNonValidator//tocontractValidatorrequested.}}

避免使用extcodesize检查是否为外部帐户

通常使用以下修饰符来验证是从外部帐户还是合约帐户进行请求:

//badmodifierisNotContract(address_a){uintsize;assembly{size:=extcodesize(_a。require(size==0);_;}

这个想法很简单:如果一个地址包含代码,则它不是EOA,而是合约帐户。但是合约在构造期间没有源代码。使用extcodesize来检查合约地址会返回0.下面示例,展示了如何规避此检查:

声音 | ConsenSys创始人Joseph Lubin:以太坊不会失败:据CCN消息, 以太坊联合创始人、ConsenSys创始人Joseph Lubin在SXSW 2019上表示,以太坊不会消失。它不会失败,仍然非常重要。他表示,现在的生态系统活动比一年或18个月前更多。Ethereum 2.0即将到来,有八个团队在构建它,目前处于四个阶段中的0阶段;将继续构建第2层可扩展性解决案,其基础层将在未来18-24个月内扩展至少1000倍,之后将继续扩张。[2019/3/15]

contractOnlyForEOA{uintpublicflag;//badmodifierisNotContract(address_a){uintlen;assembly{len:=extcodesize(_a。require(len==0);_;}functionsetFlag(uinti)publicisNotContract(msg

}contractFakeEOA{constructor(address_a)public{OnlyForEOAc=OnlyForEOA(_a);c

}

由于合约地址可以预先计算,所以在某个区块中,对该地址的检查可能会失败。

警告:这是一个比较细小的问题。如果只是为了防止其他合约能够调用您的合同,那么使用extcodesize来检查足矣。还有一种替代方法是检查的值,这种方式也有自己的缺点。在其他情况下,extcodesize检查可以满足需求。可以了解EVM的基本原理来判断。

过时的/历史的建议

以下这些建议由于协议的更改或solidity版本升级而不再相关。在此仅作记录。

小心被0除(Solidity<0.4)

在Solidity0.4版本之前,除0返回零而不是引发异常。确保您至少运行版本0.4。

区分函数和事件(Solidity<0.4.21)

在events中建议使用大写字母和添加前缀,以防止functions和events之间混淆的风险。对于functions,除构造函数外,始终以小写字母开头。

注意:Solidity在v0.4.21版本中,引入了emit关键字来提交事件emitEventName();。从0.5.0开始,必需使用这个方式。

来源:https://consensys.github.io/smart-contract-best-practices/recommendations/

本翻译由CellNetwork赞助支持。

参考资料

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

六天:https://learnblockchain.cn/people/436

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

重入攻击:https://consensys.github.io/smart-contract-best-practices/known_attacks#reentrancy

历史上的朝鲜和平宣言被记录在以太坊的区块链上:4月27日,韩国和朝鲜领导人举行会晤,签署了两国间的和平协议,这一历史性时刻已被永久地记录在以太坊的区块链上。据报道,一名27岁的韩国游戏开发者,已经编写了板门店宣言,其中包括“朝鲜半岛将不再有战争”,包括韩语和英语两种语言版本,并将两个版本存储在两个以太坊的交易中。[2018/5/2]

checks-effects-interactions模式:https://learnblockchain.cn/docs/solidity/security-considerations.html#checks-effects-interactions

SWC-107:https://swcregistry.io/docs/SWC-107

重入攻击:https://consensys.github.io/smart-contract-best-practices/known_attacks#reentrancy

EIP1884:https://eips.ethereum.org/EIPS/eip-1884

checks-effects-interactionspattern:https://learnblockchain.cn/docs/solidity/security-considerations.html#checks-effects-interactions

SWC-104:https://swcregistry.io/docs/SWC-104

gaslimit的问题:https://consensys.github.io/smart-contract-best-practices/known_attacks#dos-with-block-gas-limit

SWC-128:https://swcregistry.io/docs/SWC-128

issue61:https://github.com/ConsenSys/smart-contract-best-practices/issues/61

SWC-112:https://swcregistry.io/docs/SWC-112

SWC-132:https://swcregistry.io/docs/SWC-132

Vickreyauctions:https://en.wikipedia.org/wiki/Vickrey_auction

承诺方案:https://en.wikipedia.org/wiki/Commitment_scheme

http://btcrelay.org:_http://btcrelay.org_

RANDAO:http://github.com/randao/randao

*:https://ethereum.stackexchange.com/questions/419/when-can-blockhash-be-safely-used-for-a-random-number-when-would-it-be-unsafe

将导致相同的数字:https://en.wikipedia.org/wiki/Two's_complement#Most_negative_number

强制向合约地址发送以太币:#remember-that-ether-can-be-forcibly-sent-to-an-account

*:https://learnblockchain.cn/docs/solidity/control-structures.html#assert-require-revert

SWC-110:https://swcregistry.io/docs/SWC-110

SWC-123:https://swcregistry.io/docs/SWC-123

Checks-Effects-Interactions:https://learnblockchain.cn/docs/solidity/security-considerations.html#checks-effects-interactions

modifiers:https://solidity.readthedocs.io/en/develop/contracts.html#function-modifiers

浮点型:https://solidity.readthedocs.io/en/develop/types.html#fixed-point-numbers

Fallback函数:http://solidity.readthedocs.io/en/latest/contracts.html#fallback-function

fallback函数:http://solidity.readthedocs.io/en/latest/contracts.html#fallback-function

exceptwhenforced:https://consensys.github.io/smart-contract-best-practices/recommendations/#remember-that-ether-can-be-forcibly-sent-to-an-account

*:https://solidity.readthedocs.io/en/develop/contracts.html?#visibility-and-getters

SWC-100:https://swcregistry.io/docs/SWC-100

SWC-108:https://swcregistry.io/docs/SWC-108

SWC-103:https://swcregistry.io/docs/SWC-103

Solidity更新日志:https://github.com/ethereum/solidity/blob/develop/Changelog.md

覆盖:https://en.wikipedia.org/wiki/Variable_shadowing

有意为之:https://github.com/ethereum/solidity/issues/1249

Solidity文档:https://learnblockchain.cn/docs/solidity/security-considerations.html#tx-origin

Vitalik:'DoNOTassumethattx.originwillcontinuetobeusableormeaningful.':https://ethereum.stackexchange.com/questions/196/how-do-i-make-my-dapp-serenity-proof/200#200

SWC-115:https://swcregistry.io/docs/SWC-115

SWC-115:https://swcregistry.io/docs/SWC-115

合约:https://etherscan.io/address/0xcac337492149bdb66b088bf5914bedfbf78ccc18#code

以太坊黄皮书:https://ethereum.github.io/yellowpaper/paper.pdf

没有规定区块间隔时间区间:https://ethereum.stackexchange.com/a/5926/46821

Geth:https://github.com/ethereum/go-ethereum/blob/4e474c74dc2ac1d26b339c32064d0bac98775e77/consensus/ethash/consensus.go#L45

Parity:https://github.com/paritytech/parity-ethereum/blob/73db5dda8c0109bb6bc1392624875078f973be14/ethcore/hide/verification/verification.rs#L296-L307

平均区块时间:https://etherscan.io/chart/blocktime

分叉重组:https://blog.ethereum.org/2015/08/08/chain-reorganisation-depth-expectations/

难度炸弹:https://github.com/ethereum/EIPs/issues/649

SWC-116:https://swcregistry.io/docs/SWC-116

SWC-125:https://swcregistry.io/docs/SWC-125

也有自己的缺点:https://consensys.github.io/smart-contract-best-practices/recommendations/#avoid-using-txorigin

v0.4.21:https://github.com/ethereum/solidity/blob/develop/Changelog.md#0421-2018-03-07

CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain

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

登链社区

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

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

入驻指南:

/apply_guide/

本文网址:

/news/9558539.html

免责声明:

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

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

上一篇:

币安为何推出第三条链?这对BNB意味着什么?

标签:IONCONACTRACANATION币ARCONA价格SunContractDrac (BRC)

欧易交易所app下载热门资讯
COM:Deribit:简析 DeFi 流动性挖矿与比特币挖矿异同_COMPLUS NETWORK

流动性挖矿的工作方式和工作量证明挖矿非常相似,不同之处在于优先级和实现方式。撰文:DeribitMarketResearch翻译:Moni尽管流动性挖矿的概念已经存在一段时间了,但之前一直不温不.

POS:Vitalik 解释为何权益证明 PoS 更安全_reth币有投资价值吗

在PoS中,总体奖励将非常低;在eth2中,我们预计验证者每年的奖励等于ETH总供应量的?0.5-2%。网络中验证者质押的币总量越多,收益率就越低.

COM:当我们谈论加密资产估值时,我们谈论什么?_Kompass

本文《加密资产估值》作者ChrisBurniske是Placeholder加密资产投资基金的创始人合伙人.

ION:加密货币与加密商品:加密世界,人们口中的价值究竟是什么?_draco币今日价格

「价值」是加密世界中,长期,反复,被讨论的话题。是否有价值,是哪种价值?如何捕获价值?到底什么是ValueCapture?什么样的加密项目可以具备ValueCapture能力?价值判断的波动性,

比特币:从 Bystack 的世界观说起,未来资产上链的大幕已悄然掀起_区块链

本文从万向董事长肖风对资产的三个状态的定义出发,以道德经中的「道生一、一生二、二生三、三生万物」做比喻,说明数字资产的可信任性、可信任性、可分割性这三大特性。未来资产上链的大幕已悄然掀起.

比特币:比特币日内震荡整理,后市整理结束后有望进一步抬升_USD

笔者最近几天出去散散心了,好多天都没有写了文章,错过了前几天比特币暴涨至2万美金的报道了。不过的,虽然当时笔者在外面游玩的时候,还是及时的在2万美金之前告诉大家要拉盘的,那天傍晚提醒了之后晚上就.