我是靠谱客的博主 无聊小鸽子,最近开发中收集的这篇文章主要介绍《我学区块链》—— 十八、以太坊安全之 call depth 调用深度限制十八、以太坊安全之 call depth(调用深度限制),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
十八、以太坊安全之 call depth(调用深度限制)
调用深度(call depth)被限制为 1024。EVM 中一个智能合约可以通过 message call 调用其它智能合约,被调用的智能合约可以继续通过 message call 再调用其它合约,甚至是再调用回来(recursive)。嵌套调用的深度被限定为 1024。
看下面这段代码:
function sendether() {
address addr = 0x6c8f2a135f6ed072de4503bd7c4999a1a17f824b;
addr.send(20 ether);
//you think the send should return true
var thesendok = true;
//do something regarding send returns ok
...
}
并且对方的 fallback 函数定义为:
function() {
//do nothing
}
你认为你的代码肯定是安全的,因为对方已经明确定义了 fallback 方法。但是你错了,攻击者只需要制造出 1023 个嵌套调用,然后再调用 sendether(),就可以让 add.send(20 ether) 失败,而其它执行成功。代码如下:
function hack() {
var count = 0;
while (count < 1023) {
this.hack();
//this keyword makes it a message call
count++;
}
if (count == 1023) {
thecallingaddr.call("sendether");
}
}
所以为了解决深度限制的问题,正确的写法应该是在每次涉及到 call depth 增加的地方都检查调用返回是否正确,如下:
function sendether() {
address addr = 0x6c8f2a135f6ed072de4503bd7c4999a1a17f824b;
if (!addr.send(20 ether)) {
throw;
//somebody hacks me
}
//you think the send should return true
var thesendok = true;
//do something regarding send returns ok
...
}
以上为调用深度问题的演示,与防治,希望对小伙伴们有用。
最后
以上就是无聊小鸽子为你收集整理的《我学区块链》—— 十八、以太坊安全之 call depth 调用深度限制十八、以太坊安全之 call depth(调用深度限制)的全部内容,希望文章能够帮你解决《我学区块链》—— 十八、以太坊安全之 call depth 调用深度限制十八、以太坊安全之 call depth(调用深度限制)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复