停止使用Solidity的transfer()函数_完美体育365
- 发表时间:2024-11-16
- 来源:
- 人气:
以太坊看上去EIP 1884正在伊斯坦布尔软叉行进。这一变化减少了sload操作者的gas成本,因此超越了一些现有的智能合约。这些合约将裂痕,因为它们的fallback函数过去消耗的gas多于2300,现在它们将消耗更加多。为什么2300gas是最重要的? 如果通过Solidity的transfer()或send()方法调用合约的fallback函数,则它是合约的fallback函数。
自从transfer()引进以来,它一般来说被安全性社区引荐,因为它有助避免轻进反击。在gas成本恒定的假设下,这一指导意见是有意义的,但事实证明这一假设是错误的。我们现在建议防止transfer()和send()。气体成本可以也将转变evm反对的每个操作码都有一个涉及的gas成本。
例如,sload从存储器中加载一个单词,目前(但不是很长时间)必须200气体。gas的价格不是随便的。
它们目的体现包含以太坊的节点上每个操作者所消耗的底层资源。EIP的动机部分:操作者价格与资源消耗(CPU时间、内存等)之间的不均衡有几个缺点:· 它可以用作反击,通过填满区块与定价过较低的操作者,造成区块处置时间过长。· 定价过较低的操作码不会造成区块gas限值弯曲,有时区块气体较慢已完成,但其他类似于gas用于的块体较慢已完成。
· 如果操作者均衡,我们可以最大限度地提升区块气限,并有一个更加平稳的处置时间。sload历年来定价过较低,而eip 1884缺失了这一点。智能合约无法倚赖气体成本如果gas成本不会发生变化,那么智能合约就无法依赖任何特定的gas成本。
任何用于transfer()或send()的智能合约都会通过发送相同gas数量2300来严苛倚赖gas成本。我们的建议是暂停在代码中用于transfer()和send(),改回用于call():contract Vulnerable {function withdraw(uint256 amount) external {// This forwards 2300 gas, which may not be enough if the recipient// is a contract and gas costs change.msg.sender.transfer(amount);}}contract Fixed {function withdraw(uint256 amount) external {// This forwards all available gas. Be sure to check the return value!(bool success, ) = msg.sender.call.value(amount)("");require(success, "Transfer failed.");}}这两份智能合约除了gas的传输数量有所不同,其余都是大于的。可交接性?(Reentrancy )期望您在看见上述代码时首先考虑过这个问题。引进transfer()和send()的全部原因是为了解决问题DAO臭名昭着的黑客攻击的原因。
其思想是2300 gas不足以收到一个日志条目,但足以收到一个可交接调用,然后改动存储。不过,请求忘记,gas成本可能会发生变化,这意味著无论如何,这是解决问题轻进问题的差劲方法。今年早些时候,君士坦丁堡叉子被延期了,因为减少gas成本造成先前安全性的代码无法再行转入。
如果我们仍然用于transfer()和send(),我们将被迫以更加强壮的方式避免轻进。幸运地的是,这个问题有很好的解决方案。检查 - 效果 - 交互模式避免轻进错误的最简单方法是用于检查-效果-交互模式。这是一个可交接错误的典型例子:1contract Vulnerable {2...34function withdraw() external {5uint256 amount = balanceOf[msg.sender];6(bool success, ) = msg.sender.call.value(amount)("");7require(success, "Transfer failed.");8balanceOf[msg.sender] = 0;9}10}如果msg.sender是智能合约,它在第6行有机会在第7行再次发生之前再度调用withdraw()。
在第二次调用中,balanceOf [msg.sender]依然是完整金额,因此将再度传输。这可以根据必须反复多次以消耗智能合约。检查 - 效果 - 交互模式的点子是保证所有交互(外部调用)最后再次发生。上述代码的典型修缮方法如下:1contract Fixed {2...34function withdraw() external {5uint256 amount = balanceOf[msg.sender];6balanceOf[msg.sender] = 0;7(bool success, ) = msg.sender.call.value(amount)("");8require(success, "Transfer failed.");9}10}请注意,在此代码中,余额在传输之前被清零,因此尝试对withdraw()展开可交接调用将会使攻击者获益。
用于Reentrancy 维护避免交接的另一种方法是具体检查和拒绝接受此类调用。这是一个非常简单版本的reentrancy 维护,你可以看见这个点子:1contract Guarded {2...34bool locked = false;56function withdraw() external {7require(!locked, "Reentrant call detected!");8locked = true;9...10locked = false;11}12}用于此代码,网卓新闻网,如果尝试轻进调用,第7行上的require将拒绝接受它,因为lock仍设置为true。
在OpenZeppelin的ReentrancyGuard合约中可以寻找一个更加简单、更加省gas的版本。如果从ReentrancyGuard承继,则只需用于nonReentrant标记函数以避免轻进。请注意,此方法仅有在显式将其应用于所有准确的函数时才维护您。
由于必须在储存中维持一定的价值,这也减少了gas成本。Vyper如何?Vyper的send()函数用于与Solidity的transfer()完全相同的硬编码gas,因此也不应防止用于。你可以转用raw_call。
Vyper内置了一个@nonreentrant(unique_key)装饰器,其工作方式与OpenZeppelin的ReentrancyGuard类似于。总结1. 在假设gas成本恒定的情况下,引荐transfer()是有意义的。2. gas成本并不恒定。
智能合约对这个事实应当是完善的。Solidity的transfer()和send()用于软编码的gas量。3. 应当防止这些方法。
请求转用.call.value(...)(“”)。4. 这就带给了新的转入的风险。
请求保证用于可用作避免轻进漏洞的强壮方法之一。5. vyper的send()也有某种程度的问题。
本文关键词:完美体育365
本文来源:完美体育365-www.redsquirrelempire.com
- 2024-12-22完美体育365:库克单节突破惊人,再一次找到了手感
- 2024-12-22完美体育365_KD首次当选了全明星MVP 杜兰特竖起球迷心中的榜样
- 2024-12-22新年换新颜,用新衣诉说我们的故事【完美体育365】
- 2024-12-22完美体育365:虎牙重制版邀请赛6点开战 TeD钦定的男人会放嘲讽吗?
- 2024-12-22虎牙天命杯总决赛落幕,Snake-TC勇夺冠军‘完美体育365’
- 2024-12-22完美体育365|新加坡赛次日预测:EG异军突起 LGD难取胜
- 2024-12-22眼皮一单一双该怎么办|完美体育365
- 2024-12-22小秘诀:冰卷心菜叶贴胸可缓解乳房胀痛|完美体育365
- 2024-12-22取消“方便门诊”须有替代措施‘完美体育365’
- 2024-12-19完美体育365_爆森林狼与快船达成一致,锡伯杜希望巴特勒归队
- 2024-12-19完美体育365:火箭赛季总结:建灯泡组合 称霸惯例赛憾负西决
- 2024-12-19卡佩拉大帽杜兰特提士气 库里遭虐一哥眼神忧郁:完美体育365
- 2024-12-19“完美体育365”营销风向标,2017梅花网传播业大展北京站圆满落幕!
- 2024-12-19完美体育365_联盟情报局:未来战士锤石新皮肤即将上线!致命的一勾
- 2024-12-19完美体育365:T1大胜SB!老板Faker心情不错做了个手势
- 2024-12-19完美体育365-LOL宇宙更新 下一位新英雄是艾欧尼亚射手 网友:终于不是AD的爹了
- 产品中心标题一
用于生产保险粉,磺胺二甲基嘧啶安乃近,己内酰胺等以及氯仿,苯丙砜和苯甲醛的净化。照相工业用作定影剂的配料。香料工业用于生产香草醛。用作酿造工业防腐剂,橡胶凝固剂和
- 产品中心标题二
用于生产保险粉,磺胺二甲基嘧啶安乃近,己内酰胺等以及氯仿,苯丙砜和苯甲醛的净化。照相工业用作定影剂的配料。香料工业用于生产香草醛。用作酿造工业防腐剂,橡胶凝固剂和
- 产品中心标题九
岗亭,英文名字为Watch House,字面理解就是岗哨工作的小房子。在车场管理中,岗亭常常也称之为收费亭,是停车场管理人员收取停车费的工作场所,除此以外还可用作小区保安门卫值
- 产品中心标题八
岗亭,英文名字为Watch House,字面理解就是岗哨工作的小房子。在车场管理中,岗亭常常也称之为收费亭,是停车场管理人员收取停车费的工作场所,除此以外还可用作小区保安门卫值
- 0完美体育365-联盟情报局:LOL全球十周年庆典 免费限定皮肤大放送!
- 1“完美体育365”视频惊心!广西男子酒驾冲卡撞倒辅警,逃逸后竟趴在这躲避追捕
- 2打造视频营销新一极,西瓜视频将与抖音深度联动打造微综艺:完美体育365
- 3完美体育365-后羿嫦娥限定爆料!辅助梯度揭秘,瑶或成最大赢家!
- 4大帝与西蒙斯里应外合 最终76人大胜尼克斯取得连胜|完美体育365
- 5【完美体育365】接连作案!打包还原空首饰盒,这个“心细小偷”被抓了
- 6警惕自媒体“虚假繁荣”‘完美体育365’
- 7【完美体育365】不可思议!曾经王者马努-吉诺比利宣布退役
- 8正确饮水 女白领轻松排毒【完美体育365】
- 9完美体育365|放飞奇思妙想 谷歌科学挑战赛正在进行