译文出自:登链翻译计划
译者:翻译小组
校对:Tiny熊
你可能认为在ERC-20调用几个函数非常简单,对吗?很不幸,不是的。有些事情我们必须要考虑,而且还可能出现一些很常见的问题。
我们从最简单的开始,下面我们要处理一个非常普通的token交易,下面的代码会导入并直接使用IERC20
对于像DAI这样的token来说这段代码是很完美的,调用transfer函数并在出错的时候回退调用。
但是,如果我们调用的是0x会发生什么?ZRX代码在这里。
functiontransferFrom(address_from,address_to,uint_value)returns(bool){if(balances>=_value&&allowed>=_value&&balances_value>=balances){balances=_value;balances-=_value;allowed-=_value;Transfer(_from,_to,_value);returntrue;}else{returnfalse;}}
Flashbots核心贡献者等人发表新论文,研究DeFi智能合约经济安全的形式化验证框架CFF:9月18日消息,Flashbots核心贡献者PhilipDaian、康奈尔大学计算机安全博士生KushalBabel和MahimnaKelkar以及康奈尔理工学院教授AriJuels共同发布关于ClockworkFinanceFramework(CFF)的新论文,这是一种DeFi智能合约经济安全的形式化验证框架。论文中表示,CFF具有三个关键特性,合约完备、以渐近最优的模型大小实现、在构造上穷举攻击。CFF可以支持多个目标,开发者对合约的经济安全性分析、用户对DeFi交易风险的分析、机器人或矿工对套利机会的优化。此外,CFF框架引入了一个新的DeFi合约经济安全概念,可提取价值(EV)。[2021/9/18 23:35:18]
我们可以看到,与DAI不同,当出错时0x不会回退交易,而是返回false,但是我们在代码中不管这个返回值。本质上,任何人都可以与我们合约的interactWithToken交易,合约会认为成功交易了一个token,但实际上什么也没有做。很糟糕!
亚利桑那州立大学:区块链可帮助大学提供更好更安全的在线教育:8月24日消息,亚利桑那州立大学EdPlus首席技术官Donna Kidwell在接受采访时表示,区块链可帮助大学提供更好更安全的在线教育。在与身份管理技术相结合时,区块链和普通分类帐可以在每个学生的成绩单上建立“透明的信任”,使亚利桑那州立大学等教学机构更好地跟踪和认证每个学生的“学习成就”。Kidwell还表示,到2025年,区块链将成为帮助该大学向超过10万名学生提供在线教育的关键。(ZDNet)[2020/8/24]
ZRX仍然符合ERC-20标准,因为没有任何地方规定ERC-20合约必须在发生失败时回退交易。这两种方法都有优点和缺点。在上面的例子中,很明显我们只需要检查返回值就知道是否成功,一段简单的代码require(token
catchError(stringmemory/*reason*/){success=false;//specialhandlingdependingonerrormessagepossible}catch(bytesmemory/*lowLevelData*/){success=false;}if(success){//handlesuccesscase}else{//handlefailurecasewithoutreverting}}
声音 | OKEx金融市场总监:用数字货币缔造一个自由、开放、安全的交易环境:欧洲时间1月21日,OKEx 金融市场总监Lennix受邀参加达沃斯2020年度新技术投资峰会。一起参会的还有来自Forbes、Coindesk、Galaxy、SDX等多家世界知名企业高管。Lennix表示,全球有20亿以上人口还没有基本的金融服务,区块链及数字资产的技术革新,可以缔造了一种自由、开放、安全、低成本的新交易环境。OKEx也将会在稳定币、钱包、交易衍生品等领域持续发力,跟各行业合作来降低基本金融服务的门槛。[2020/1/22]
这样你就可以为两个版本的ERC-20合约做错误处理。
怎样支持所有token
现在你已经支持了ERC-20标准的token,然而有相当多的token看起来像ERC-20,但是它的有些行为却不像,有些出现缺少返回值的错误。
有一段时间,OpenZeppelin有一个bug,他们在失败的时候回退交易,但没有在成功时返回true。这个bug让很多token都受到了影响,包括USDT、OmiseGo和BNB。你期望返回一个布尔值,却没有任何值返回,这种情况,如果用Solidity0
分析 | 攻击者控制了 GateHub 数据库里的部分账号 API 权限,不过用户私钥是安全的:慢雾安全团队通过链上行为分析可以得知:攻击者最早于 05/29/2019 12:14 UTC 时间通过 CoinPayments 创建并激活了攻击者的第一个“攻击者账号”(rN5Gm1FijbTVeYFfpTRfGKfNZQY7hc9TbN),攻击者在 05/30/2019 12:23 UTC 时间攻击 GateHub 第一个账号(控制了这个账号的有关权限),并通过这个被攻击的账号创建并激活了第二个“攻击者账号”(r9do2Ar8k64NxgLD6oJoywaxQhUS57Ck8k),之后第二个“攻击者账号”还创建并激活了第三个“攻击者账号”(rpBDxqWArAQTEfPeWwkUvBh1cbc885nirX),之后攻击者攻击了 GateHub 至少 103 个账号,最后一次攻击时间是 06/01/2019 18:40 UTC 时间,并通过这三个“攻击者账号”完成洗币操作。慢雾安全团队通过相关分析推测攻击者至少是控制了 GateHub 数据库里的部分账号 API 权限,不过用户私钥是安全的。攻击持续三天多的时间才被阻止,该平台的用户应立即转移资产并更新账号相关权限。[2019/6/8]
其先检查返回数据的大小,如果是0,我们就假定它是行为不正常的token。如果调用没有回退交易,那就意味着交易成功了,应该返回true。
科罗拉多州通过支持利用区块链保管政府记录和网络安全的法案:据cointelegraph消息,美国科罗拉多州参议院5月7日通过了一项法案,涉及利用区块链技术进行政府记录的保管及网络安全。参议院法案(SB)18-086要求州长信息技术办公室(OIT),州政府部门和监管机构部门考虑使用加密技术和区块链技术,以保护机密状态的记录免受犯罪,未经授权,无意的操纵或盗窃。[2018/5/9]
随着Solidity的版本更新,我们可以简化这段代码,像Uniswap是这样做的:
functionsafeTransfer(addresstoken,addressto,uintvalue)internal{//bytes4(keccak256(bytes('transfer(address,uint256)')));(boolsuccess,bytesmemorydata)=token
这种实现方法只是稍有不同而已,因为abi
你应该怎么做?
那么,现在最好的方法是什么呢?一个很简单的方法就是,使用OpenZeppelinSafeERC20来实现。
这是一个围绕ERC-20调用的包装库。不要感到困惑,这不是为了创建自己的token,而是为了安全地交易。SafeERC20的实现基本上就是像上面的Uniswap版本一样,你可以像下面这样用它:
import"https://github
}
本翻译由CellNetwork赞助支持。
来源:https://soliditydeveloper.com/safe-erc20
参考资料
登链翻译计划:https://github.com/lbc-team/Pioneer
翻译小组:https://learnblockchain.cn/people/412
Tiny熊:https://learnblockchain.cn/people/15
DAI:https://etherscan.io/address/0x6b175474e89094c44da98b954eedeac495271d0f#code
这里:https://etherscan.io/address/0xe41d2489571d322189246dafa5ebde1f4699f498#code
代码:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol
try/catch:https://solidity.readthedocs.io/en/latest/control-structures.html#try-catch
缺少返回值的错误:https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca
影响到了Uniswap:https://twitter.com/UniswapProtocol/status/1072286773554876416
Compound版本:https://github.com/compound-finance/compound-money-market/blob/241541a62d0611118fb4e7eb324ac0f84bb58c48/contracts/SafeToken.sol#L97
Uniswap是这样做的:https://github.com/Uniswap/uniswap-lib/blob/9642a0705fdaf36b477354a4167a8cd765250860/contracts/libraries/TransferHelper.sol#L13-L17
OpenZeppelinSafeERC20:https://docs.openzeppelin.com/contracts/3.x/api/token/erc20#SafeERC20
CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain
免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。
本文来源于非小号媒体平台:
登链社区
现已在非小号资讯平台发布105篇作品,
非小号开放平台欢迎币圈作者入驻
入驻指南:
/apply_guide/
本文网址:
/news/10381498.html
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场
上一篇:
每周编辑精选WeeklyEditors'Picks
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。