全网服务最佳

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

假设的内容是为了给以太坊智能合同发送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,所以可以预计无法更改状态。

因为,我没想到在日志中记录事件也被禁止。在日志中记录事件是智能合同中看不到的实际副作用。事件记录在日志中后,外部(或内部)智能协议无法看到此状态被记录。这几乎是空白输入。

向空中发送了数据,但不能再接收该数据,甚至不能仔细观察该数据的传输。阿尔伯特爱因斯坦)这种副作用只有在区块链以外的世界才能看到。事件通常用于通知外部接口转入区块链。

就像说:“这里又发生了可以感兴趣的事情。”因此,假设STATICCALL以技术纯粹性的名义,继续非常严厉地实施“无副作用”的规则。

没有副作用的副作用还包括只能在外部看到的副作用。还有一个效果,就是ETH不能在STATICCALL展开。这有效地超越了作为解决问题的竞争对手的局面。一般来说,调用fallback函数时犯了错误,或者想将合同发送到ETH。

合同收到ETH时,它一般不在日志中记录事件,告诉他外部程序。“嘿,我拿到钱了,你可能想做点什么,给那个用户信息等。”如果存在神秘的2300 gas limit,则不能将其他合同发送到部分ETH,也不能更改合同内的状态(例如,“更改预期余额”变量等)。

STATICCALL的唯一用途是从想传达ETH合同的广义函数制止轻微的反击。也就是说,有效制止轻微反击并发送到ETH的唯一方法是神秘的gas limit常数33542300中使用的转移方法。为什么这不会成为一个大问题呢?不是指出软编码数字在计算机科学中不好(这提醒我们肯定很不好),而是说,软编码数字本质上是在某些合同必须在以太坊周围的生态环境中做出一些改变时,使其看起来不可操作。(比尔盖茨、计算机科学、计算机科学、计算机科学、计算机科学、计算机科学、计算机科学)动态区块链的常数Reddit post[1]得到了以太在一次升级中减少了CALL命令和其他命令的成本的简单细节。

(如果我没记错的话,比当时的支出多100,现在是500)。这种怀疑在今后所有gas price调整时,大部分仍然受到限制。

Nick Johnson认为:“对特定gas limit的调用很少。”当这句话明确提出时,Solidity在做比transfer大的运营商时,没有将所有可用的gas转移到一个合同上,从而留下了利用接管运营商进行反击的可能性。

Solidity在the DAO反击再次发生后,引进了2300的gas limit,防止类似事件再次发生。现在,即使在配置文件中调用外部合同函数(不需要transfer),Solidity也不会将配置文件配置为将所有gas发送到过去。而且,文件中还有很多关于该运营商隐藏危险的警告。

神秘的2300 gas limit常数意味着其Reddit帖子中思考的问题有所提高。例如,请想象一个合同,其中包含payable的fallback函数,该函数用于在2300 gas limit内以足够低的价格部署的部分opcode,以便继续运行。

但是为了应对反击或以前找不到的问题,该操作码的价格大幅上涨。该合同将不会显得不可用,不能拒绝gas limit未具体提高到2300(Solidity警告的不道德性)以下的合同中接受ETH。

更糟糕的是,即使具体上传gas limit,开始调用的合同也不会面临接管反击的危险。因此,该合同很有可能必须废弃。根据收购ETH的实际逻辑(例如,依赖特定合同发送到ETH),就像堵在墙壁上一样,其中的钱也很有可能不会被提取出来。

假设这个2300 gas limit对向后兼容性有一定的危害。它还损害了以太坊协定内的潜在未来想法。

例如,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.1mudah.com

相关文章