当前位置:首页 > 企业新闻 >

停止使用Solidity的transfer()函数|快三平台app

编辑:快三平台注册 来源:快三平台注册 创发布时间:2021-05-20阅读91859次
  

快三平台_以太似乎EIP 1884正在伊斯坦布尔软叉游行。这种变化降低了sload运营商的gas成本,超过了传统的智能合同。这样的合同会出现裂痕,因为fallback函数过去消耗了2300多个gas。

现在会消耗更多。为什么2300gas最重要?通过Solidity的transfer()或send()方法调用协议的fallback函数时,协议的fallback函数。自引入Transfer()以来,它通常被安全社区推荐。

因为它有助于避免反击。假设Gas费用恒定,这个指导意见有意义,但事实证明这个假设是错误的。现在最好避免transfer()和send()。

气体成本还可以转换EVM反对的每个Opcode相关的gas成本。例如,sload从内存中加载单词,但现在必须是200个气体。Gas的价格不随便。

他们的目的是反映包含以太坊的节点的各运营者消耗的基本资源。EIP的动机部分:运营商价格和资源消耗(CPU时间、内存等)之间的不平衡有一些缺点。

也就是说,通过块填充和价格过低的操作员,块处理时间可能会变长。价格过低的opcode不会弯曲块gas限制,有时块气体完成得很慢,但其他类似gas的块完成得很慢。如果运营商平衡,我们不仅可以最大限度地提高区块气体限度,还可以有更柔软的处置时间。

快三平台注册

Sload多年来价格过低,EIP 1884错过了这一点。智能合同不能依靠燃气费用。如果gas费用不变,智能合同就不能依赖特定的gas费用。用于Transfer()或send()的所有智能协议都将发送相同的gas数量2300,非常依赖gas成本。

建议您在代码中暂停transfer()和send(),然后重新更改为call():contract vulnerable { function with draw(uint 256 amount)exteraw} } contractfixed { function withdraw(uint 256 amount)external {//this forwards all available gas . be sure to checkRequire (success,‘transfer failed’));}}这两个智能合同除了gas的传输数量之外都是大的。接管的可能性?(Reentrancy)在查看上述代码时,期待先考虑这个问题。引入Transfer()和send()的所有理由都是为了解决问题DAO臭名昭著的黑客攻击的原因。

想法是,2300 gas不足以接收日志条目,但足以接收切换调用和更改存储。但是,我们要求您忘记gas费用可能会发生变化的事实。也就是说,不管怎样,这是一个轻松解决问题的糟糕方法。

(大卫亚设,Northern Exposure(美国电视),成功)今年年初君士坦丁堡叉子延期,由于gas费用的节省,导致以前安全的代码无法再转移。如果我们仍然用在transfer()和send()上,我们可能需要以更强的方式避免京津冀。幸运的是,这个问题有一个好的解决方法。检查-效果-交互模式防止轻量级错误的最简单方法是检查-效果-交互模式。

这是一个典型的可传输错误示例:1 contractvulnerable {2.34 function withdraw()external { 5u int 256 amount=balance of[msg].6 (bool success,)=msg . sender . call . value(amount)(' ');7require (success,‘transfer failed’));8 balanceof[msg . sender]=0;9}10}如果msg.sender是智能合同,则可以在第6行到第7行再次出现之前再次调用withdraw()。在第二次调用中,balanceOf [msg.sender]仍然是全部金额,因此将再次发送。

这可以根据需要反复多次,消费智能合同。检查-效果-交互模式的想法是让所有交互(外部调用)最后再次发生。 上述代码的一般维修方法是1 contractfixed {2.34 function withdraw()external { 5u int 256 amount=balance of[msg . sender]。

6 balance of[msg . sender]=0;7 (bool success,)=msg . sender . call . value(amount)(' ');8require (success,‘transfer failed’));9}10}在此代码中,馀额在传输前被清除为0,因此,如果尝试对withdraw()进行可传输的调用,则对攻击者有帮助。为了维护冗馀,防止接管的另一种方法是具体检查和拒绝这些调用。这是reentrancy维护的一个非常简单的版本。1 contract guarded {2.34 bool locked=false56 function withdraw()external { 7 require(!Locked,“Reentrant call detected!”);8locked=true9.10locked=false11}12}用于代码、网络桌面报纸网,如果想轻轻调用,第7行的require将拒绝接受,因为lock仍然设置为true。

在OpenZeppelin的ReentrancyGuard合同中可以找到更简单、更节省gas的版本。如果从ReentrancyGuard继承,则仅对nonReentrant标记函数使用时不会很轻。只有明确应用于所有正确的函数时,此方法才会保留用户。

因为需要对存储保持一定的价值,所以gas成本也降低了。Vyper怎么样?Vyper的send()函数用于与Solidity快三平台app的transfer()完全相同的硬编码gas,因此不应避免这种情况。

可以切换到Raw_call。Vyper内置了@nonreentrant(unique_key)修改器,其工作方式与OpenZeppelin的ReentrancyGuard类似。摘要1 .假设gas费用恒定,推荐transfer()是有意义的。

Gas费用不统一。智能合同必须对这个事实完美。

Solidity的transfer()和send()是用于软编码的gas量。这些方法必须加以防止。

快三平台

call.value(.)(“”)。这带来了新的搬迁风险。要求保证,作为避免京津漏洞的强有力方法之一。

5.vyper的send()也存在一定的问题。_快三平台。

本文来源:快三平台-www.seamtheworld.com

0641-498274457

联系我们

Copyright © 2010-2014 通辽市快三平台股份有限公司 版权所有  内蒙古ICP备41386998号-3