以太坊硬编码常数如何解决“重入攻击”风险?:鸭脖官方网站

本文摘要:当我写另一篇不相关的文章时,我知道了以太坊生态系统中创造的假设。

鸭脖官方网站

当我写另一篇不相关的文章时,我知道了以太坊生态系统中创造的假设。这句话,我不会解释为什么以太的假设有缺陷,出现了适当的解决方案。首先,我们要说以太的假设是什么。

假设的内容是为了给以太坊智能合同发送ETH,同时为了防止轻微的反击,调用智能合同的gas limit必须在2300以上。魔术手和STATICALL在transfer函数用于寄钱的所有现代智能合同(如果我没记错的话,是Solidity3.0以后)中有软编码的常数33542300。例如,这个非常简单的例子是contract tester { function()external { address payable payment address=0x5a 0b 54d 5d c17e 0 ADC 383 D2 db 43b 0a}}Transfer位转换为EVM字节码后,使用CALL 2300,address,这个数字为什么那么重要?这样要求是有原因的。这是避免不属于“京津”的智能合同漏洞的最有效方法。

接管的概念是,一个智能合同调用另一个智能合同,最后(同一持续进行中)再次调用原来的智能合同。交接是臭名昭著的the DAO黑客事件中使用的主要漏洞。

当时明确提出的解决方案不是改变以太坊协议,允许合同阻止这种不道德,而是最终改变Solidity,让通过智能合同发送到ETH的个人资料不道德地用于极少量的gas。这么轻的问题不能再被利用了。当然,花钱的智能合同也有不能在日志中记录事件、不能改变状态或做其他事情的副作用。但是最近泰邦引进了STATICCALL作为避免京津问题的灵丹妙药。

你知道是灵丹妙药吗?问题是,——并不是全部。首先,我们想强制测试协议的fallback函数将Solidity用于Static Call: pragma Solidity 0.5.9。contract tester { function()external view { } function foo()external view { } }然后编译器会访问browser/test . sol 336000function()external view {(relevant source part starts here and spans across multiple lines)。

然后,从Fallback函数中删除view关键字,并检查ABI: [{‘constant’ :true,’ inputs ‘ 3360[],’ name ‘ : ‘ foo但是我们允许Solidity假装没那么糟糕,那样做。并且可以让Solidity向STATICCALL签约的fallback转账。一切正常吗?你还敢。STATICCALL的设计非常相似。

当然,您可以逻辑上使用fallback函数,但STATICCALL旨在允许外部合同调用,而不产生副作用,并只返回计算结果中的数据。Fallback函数基本上不返回数据的概念。

如果上升到调用者和调用者的编制水平,就可以构建。所以STATICCALL在这个场景中没有用,除非你是很少听到的操作员。但是如果你要做一些罕见的事情,为什么你不用常用的函数调用来使用fallback函数呢?好吧,我有点跑题了。

STATICCALL特别强调没有副作用。也就是说,不能更改状态、调用不更改状态的其他合同、拟定合同、自行存档、在日志中记录事件、发送到其他合同、发送到ETH或更改一个合同的馀额。因为一份合同被STATICCALL接收到ETH,所以可以预计无法更改状态。

因为,我没想到在日志中记录事件也被禁止。在日志中记录事件是智能合同中看不到的实际副作用。

事件记录在日志中后,外部(或内部)智能协议无法看到此状态被记录。这几乎是空白输入。

鸭脖官方网站

它还损害了以太坊协定内的潜在未来想法。例如,EIP-1293 [2],SSTORE的gas净测量是创造性协议的改进,不会减少包括存储在内的许多智能协议的不道德成本。

存储的gas成本可以表示为区块链的实际成本。也就是说,在一次持续运行中加载第二个保存的密钥值时,不需要很少的gas。

这是因为,从区块链的角度来看,第二个状态变更完全不需要费用,而第一个状态变更会为区块链支付足够的费用。该议案多次被纳入君士坦丁堡的结尾,但在最后一刻[3]被清除。这是因为不会对现有的很多智能合同造成危险[4]。

这个识别是对的。这一改善不会增加状态储存费用,可能会造成交接类的反击危险。

即使只有非常激进的2300分gas limit也是如此。该事件中嘲讽的一点是,议案的设计本质上不会增加智能合同的京津维护的gas费用。

另外,这主要是适用于剧本的。目前,EIP-1283接管的明确解决方案是EIP-1706 [5]。

可以得出结论,该议案的转换将在gas净值测定下的费用增长高于目前持续进行的GAS LIMIT 2300时继续实施。因此,这一神秘常数现在在以太坊协议中显得更加根深蒂固。

这将在今后EVM语言调用合同时用于软编码的2300 gas limit,以避免轻微反击的危险。这个神秘的家庭基本上消除了存储看起来更便宜的可能性,以太坊以后不需要修理扩张性问题和其他问题。即使有一天发明者将所有存储移动到链下,使存储基本上免费,存储的实际gas成本仍然不能超过2300。否则就不会面临接任反击的危险。

我说了很多可能的解决方案,但这显然是个难题。对吧?我们在讨论区块链,所有关于区块链的技术都很难。这也是事实,但与此同时,我倾向于不尊重以太坊团队特别强调改善协议协议的技术的纯粹性。

本质上,网络卓新闻网络,我真的是EIP-1706软编码问题,因为以太网广场主网络不允许,所以太纯了。我个人预计EIP-1283不会无限期延期。最终可能不会再次加入以太坊2.0。

我如何解决问题,减轻问题?有两个可能的方案。第一个比较简单:加上一个操作码,但特别简单。我的建议是重新加入这个Opcode 3360 Magiccallwithoutreentrancyexploits。这显然是一个需要读太久的简单名字。

但是老实说,这个opcode就像CALL的基本一样,除了以下变化外,像STATICCALL一样允许SSTORE(状态变化),其他一切都可以说,老实说,我不太喜欢这个解决方案。我更喜欢解决问题的本质问题,允许任何智能合同轻松进入。理想情况下,可能没有非常简单的操作码。

KILLMEIFREENTRANT不会在当前合同已在调用堆栈中时暂停执行。这个功能只要一个经验丰富的开发者工作,一夜就能完成,然后还要进行一天的安全测试。这在避免轻微反击的时候,不会允许与储存相关的东西,可以用以下非常简单的代码使if call stack . exists(current address)then throw非常便宜,但回去后,我真的有一天会考虑“纯”的opcode
还有更纯粹的替代方案,例如将所有调用堆栈暴露在智能合同中。

告诉调用堆栈中有什么,您可以编写Solidity函数,在堆栈中递归。通过确认是否包含该地址,可以证明现有的继续运行时正在接管。

鸭脖官网

约翰肯尼迪,北方Exposure(美国电视),成功)当然,如果不可预测,合同不会抛出例外,以防止不需要或意外的不道德。这也不会允许在智能合同中再增加其他功能。

例如,想象一下你做了一个需要参与智能合同的众筹。但是,你用黑名单侵入了与恐怖分子相关的智能合同。

恐怖分子可以简单地部署“通过”智能合同,然后让黑名单阻止的智能合同“通过”合同。那么最终可以调用你的众筹合同。

如果有调用堆栈的信息,就可以找到这种不道德性。目前,以太网在链上很少能用智能合同逻辑检测到这一点。现在在以太坊制止轻微反击的设计本身就没有安全危险。

通常,当协议继续运行时,变量未设置为1,表示正在运行。继续运行完成后,此变量不会重置为0。这样,如果你在此过程中继续调用合同,希望外部合同新转入现有合同,那么该合同没有看到变量设置为1,就会停止执行。(威廉莎士比亚、哈姆雷特、契约、契约、契约、契约、契约、契约)但是,如果由于一些逻辑问题而继续执行结束,变量不重置,零不返回,会怎么样呢?(*译者注:译者注:译者注:译者注)基本上,这份智能合同被禁止,不能再成为运营商。

因为它指出,它仍然受到反击。收购交接是以太坊生态内第一、讨论最少的问题,部分网站也包含在制定智能合同时需要注意的1号安全问题中。这是导致the DAO反击和其他反击和异常发生的元凶。这是智能合同开发人员没有妥善处理的最好问题之一,大部分智能合同从根本原因上非常简单地消除了这种可能性。

对我来说,以太尚未实施任何必要的方法来制止京津冀是非常不可思议的。忽略,依赖于允许许多STATICCALL机制或神秘的2300 gas limit常数,优先级可能会更高。在我心里,这不是以假设为基础的古怪变化,而是有一流的解决方案。相关的读者1 .Reddit员额:https://www . Reddit.com/r/ethereum/comments/57n 2 QL/why _ I _ believe _ the Eip-12833.003nop le enables new reen trancy attack:https://medium.com/chain security/constantino ple-enables-new-reen track。

本文关键词:鸭脖官网,鸭脖官方网站

本文来源:鸭脖官网-www.bquoqa.com

相关文章