译文出自:登链翻译计划
译者:翻译小组
校对:Tiny熊
由于EIP1884已经在伊斯坦布尔硬分叉实施,EIP1884增加了SLOAD操作的Gas成本,因此_破坏了一些现有的智能合约_。
这些合约将被破坏,因为它们的fallback函数以前消耗的Gas不到2300,而现在会消耗更多。为什么2300Gas这么重要?这是合约的fallback函数通过Solidity的transfer()或send()方法调用时可使用的Gas量。
刚才是简化的描述,2300是Gas”津贴“,如果是非零的以太币量转账,则Gas”津贴“明确传递给CALL。Solidity的transfer()将Gas参数设置为0,如果以太币的转账量为非零。在加上gas”津贴“后,一共是2300。如果是零以太币转账,Solidity明确地将Gas参数设置为2300,因此在两种情况下都会是2300Gas。
自推出以来,transfer()通常被安全界推荐,因为它有助于防范重入攻击。在Gas成本不会改变的假设下,这一指导意见是有意义的,但事实证明这一假设是不正确的。我们现在建议避免使用transfer()和send()。
Gas成本可以改变
EVM支持的每个操作码都有相关的Gas成本。例如,SLOAD,从存储中读取一个字,在EIP1884中gas由200修改为800。
Gas费用不是随意的。它们旨在反映组成以太坊的节点上每个操作所消耗的基本资源。
Lido将于8月1日停止在Polkadot、Kusama上的质押计划:金色财经报道,据Lido开发商MixBytes的博客文章,DeFi质押服务Lido将于8月1日停止其在Polkadot和Kusama上的质押计划。Polkadot和Kusama不再接受存款,6月22日所有资产将自动取消质押。正式终止日期为8月1日。目前Lido上总共有价值400万美元的DOT代币和价值75,000美元的KSM。[2023/3/29 13:33:12]
来自EIP的动机部分。
操作的价格和资源消耗之间的不平衡有几个缺点:
可能被用于攻击,通过用低Gas操作填充区块,导致区块处理时间过长。
价格过低的操作码会歪曲区块Gas限制,有时区块完成得很快,但其他Gas使用量相似的区块完成得很慢。
如果操作定价更均衡,我们可以最大限度地提高块Gas限制,并有一个更稳定的处理时间。
SLOAD历来价格偏低,EIP1884纠正了这一问题。
智能合约不能依赖Gas成本
如果Gas成本是可以变化的,那么智能合约就不能依赖于任何特定的Gas成本。
任何使用transfer()或send()的智能合约,都是通过转发固定数量的Gas来而产生2300Gas成本的硬性依赖。
因此建议停止在代码中使用transfer()和send(),而改用call()。
contractVulnerable{functionwithdraw(uint256amount)external{//Thisforwards2300gas,whichmaynotbeenoughiftherecipient//isacontractandgascostschange
美国政府:Binance.US收购Voyager的交易应该停止:金色财经报道,美国政府在一份文件中表示,Binance.US提出的10亿美元购买破产加密货币借贷平台Voyager资产的交易应暂停,同时应解决关键的法律异议。
此前,负责破产案件的司法部分支机构美国受托人 (?US Trustee) 提出上诉,该机构担心这笔交易将有效免除 Voyager 及其员工违反税法或证券法的责任。[2023/3/15 13:06:07]
}contractFixed{functionwithdraw(uint256amount)external{//Thisforwardsallavailablegas
}
除了转发固定的2300Gas之外,这两个合约是等价的。
关于重入攻击怎么办?
重入攻击,希望是你看到上述代码后的第一反应。引入transfer()和send()的全部原因是为了解决TheDAO上臭名昭著的黑客事件的原因。当时的想法是,2300Gas足够触发一个日志条目,但不足以进行再重入的调用来修改存储状态。
不过请记住,Gas成本是会变化的,这意味着无论如何这都不是解决再重入攻击的好办法。19年初,君士坦丁堡分叉被推迟,就是因为gas成本的降低,导致以前重入攻击安全的代码不再安全。
如果我们不打算再使用transfer()和send(),我们就必须用更强大的方式来防止重入。幸运的是,这个问题有很好的解决办法。
检查-生效-交互模式
市场消息:交易平台币安(Binance)将暂时停止取款:市场消息:交易平台币安(Binance)将暂时停止取款,是因为大额提款请求大量增加。(金十)[2021/1/29 14:21:46]
消除重入性bug最简单的方法是使用检查-生效-交互(checks-effects-interactions)。这是一个典型的重入bug的例子:
contractVulnerable{..
}
如果msg.sender是一个智能合约,它在第6行有机会在第7行发生之前再次调用withdraw()。在那第二次调用中,balanceOf还是原来的金额,所以会再次转账。这可以根据需要重复多次,以耗尽智能合约。
检查-生效-交互模式的想法是确保你所有的交互都发生在最后。上述代码的典型修复方法如下:
1contractFixed{2...34functionwithdraw()external{5uint256amount=balanceOf;6balanceOf=0;7(boolsuccess,)=msg.sender.call.value(amount)("");8require(success,"Transferfailed.");9}10}
请注意,在这段代码中,余额在转账之前就被清零了,所以试图对withdraw()进行重入调用对攻击者来说没有收益。
使用重入防护
另一种防止重入的方法是明确地检查和拒绝这种调用。下面是一个简单版的重入防护,大家可以看看思路:
动态 | Dash LatAm社区停止运营:在拉丁美洲推广Dash的组织DashLatAm已经宣布停止运营。Dash LatAm宣布最终关闭其在8个国家和20个城市的业务,他们此前在这些国家和城市与各自社区开展合作。Dash LatAm活跃在哥伦比亚、委内瑞拉、秘鲁、厄瓜多尔、危地马拉、巴西、西班牙以及特立尼达和多巴哥。DashLatAm执行董事George Donnelly表示,DashLatAm在将近六周前资金告罄后决定关闭,这导致Donnelly解雇了约80名员工,并停止了其活跃的所有城市的业务。(Cointelegraph)[2019/11/4]
1contractGuarded{2...34boollocked=false;56functionwithdraw()external{7require(!locked,"Reentrantcalldetected!");8locked=true;9...10locked=false;11}12}
在这段代码中,如果尝试重入调用,第7行的require将拒绝它,因为lock仍然被设置为true。
在OpenZeppelin的ReentrancyGuard合约中可以找到一个更复杂、更节省gas的版本。如果你继承了ReentrancyGuard,你只需要用nonReentrant来修饰函数,防止重入。
请注意,这个方法只应该用于保护重入,如果你明确地将其应用于所有正确的函数。由于需要在储存中保持一个值,它也会增加Gas成本。
Vyper语言有出现这个情况吗?
双优宣布停止BTG矿池运营:双优矿池今日发布通告称:近一个月以来双优BTG矿池出块极其不顺利,由于矿池模式为PPS,按照理论给矿工计算收益导致矿池亏损严重。双优矿池经过一系列评估,猜测该情况下出现的原因有如下:1,算力极度集中,根据全网出块统计,全网出块集中在少数地址,甚至一家超过70%出块,和分叉之前打破算力中心化的初衷严重不符。2,基础设施欠缺,导致出块信息无法快速广播,小算力矿池产生大量无用工作量,大算力占据绝对优势。鉴于此,双优矿池决定将在2月1日0:00起无限期停止BTG矿池的运营。[2018/1/26]
Vyper的send()函数与Solidity的transfer()一样使用硬编码Gas”津贴“,所以也要避免使用。你可以使用raw_call代替。
Vyper内置了一个@nonreentrant()修饰器,其工作原理类似于OpenZeppelin的ReentrancyGuard。
总结
在Gas成本不变的假设下,推荐transfer()是有道理的。
但Gas成本不是不变的。智能合约应该有力地应对这一事实。
Solidity的transfer()和send()使用一个硬编码的Gas成本。
这些方法应避免使用。使用.call.value(...)("")代替。
这就存在着重入的风险。一定要使用现有的一种强大的方法来防止重入漏洞。
Vyper的send()也有同样的问题。
本翻译由CellNetwork赞助支持。
来源:https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/
参考资料
登链翻译计划:https://github.com/lbc-team/Pioneer
翻译小组:https://learnblockchain.cn/people/412
Tiny熊:https://learnblockchain.cn/people/15
EIP1884:https://learnblockchain.cn/docs/eips/eip-1884.html
伊斯坦布尔硬分叉:https://learnblockchain.cn/2019/11/21/istanbul-update
EIP1884:https://learnblockchain.cn/docs/eips/eip-1884.html
破坏了一些现有的智能合约:https://docs.google.com/presentation/d/1IiRYSjwle02zQUmWId06Bss8GrxGyw6nQAiZdCRFEPk/edit
fallback函数:https://learnblockchain.cn/docs/solidity/contracts.html#fallback
Solidity的transfer()或send()方法:https://solidity.readthedocs.io/en/v0.5.11/units-and-global-variables.html#members-of-address-types
动机部分:https://eips.ethereum.org/EIPS/eip-1884#motivation
重入攻击:https://learnblockchain.cn/docs/solidity/security-considerations.html#re-entance
TheDAO:https://learnblockchain.cn/2019/04/07/dao
君士坦丁堡分叉被推迟:https://blog.ethereum.org/2019/01/15/security-alert-ethereum-constantinople-postponement/
检查-生效-交互(checks-effects-interactions):https://learnblockchain.cn/docs/solidity/security-considerations.html#checks-effects-interactions
OpenZeppelin的ReentrancyGuard:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol
Vyper的send()函数:https://vyper.readthedocs.io/en/v0.1.0-beta.12/built-in-functions.html#send
raw_call:https://vyper.readthedocs.io/en/v0.1.0-beta.10/built-in-functions.html#raw-call
@nonreentrant()修饰器:https://vyper.readthedocs.io/en/v0.1.0-beta.12/structure-of-a-contract.html#decorators
CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain
免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。
本文来源于非小号媒体平台:
登链社区
现已在非小号资讯平台发布105篇作品,
非小号开放平台欢迎币圈作者入驻
入驻指南:
/apply_guide/
本文网址:
/news/9729855.html
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场
上一篇:
盘点零知识证明代表性项目:如何影响和塑造区块链生态系统?
比特币市场 二月的最后一周,比特币开启了下探行情。在连续四周收涨后,比特币在本周持续回落,连续跌破50000美元和45000美元整数关口,最低触及43200美元,最终收于43395美元,周内跌幅.
Gate.io直播间作为行业内首个交易所内置直播功能,通过多样性的直播形式为平台用户带来具有深度、有趣、开放的信息内容.
最近,一股去中心化融资热潮席卷区块链行业。在Polkastarter平台上,Paid以$0.042的价格进行IDO,$150,000额度瞬间抢购一空.
美国加密投资巨头DCG集团旗下的MOMO基金会近日与灰度集团达成联盟,DCG集团是是全球最强大的币圈投资机构,也是Filecoin在ICO时的八大投资方之一.
据成都链安安全舆情监控数据显示:2021年2月,据不完全统计,整个区块链生态发生的典型安全事件超26起,整体安全风险评级为.
亲爱的用户:币安逐仓杠杆已增加CTXC、FIO资产,并开放CTXC/BTC、CTXC/USDT、FIO/BTC、FIO/USDT逐仓交易对.