首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可靠的递归evm消息调用

可靠的递归evm消息调用
EN

Stack Overflow用户
提问于 2022-06-27 19:35:05
回答 1查看 65关注 0票数 2

我需要进行递归的evm消息调用。根据我对稳健性的理解,同一契约中的调用不会触发evm消息。但是对于我的用例,我希望每个递归调用都是evm消息调用。这是斐波纳契的合同。这是正常的版本

代码语言:javascript
复制
contract Fibonacci {
    function fibonacci(uint32 n) public pure returns(uint32) {
        if (n == 0 || n == 1) {
            return n;
        }
    
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

在上面,fibonacci的递归调用不触发evm链调用,因为它们发生在同一契约中。要从另一个智能契约调用代码,您需要要调用的契约的地址。因此,我使用了同样的想法来强制evm递归链调用(或者我认为是这样)。以下是实现

代码语言:javascript
复制
contract Fibonacci {
    function fibonacciIndirect(uint32 n) public view returns(uint32) {
        if (n == 0 || n == 1) {
            return n;
        }
        uint32 n1;
        uint32 n2;
        n1 = Fibonacci(this).fibonacciIndirect(n - 1);
        n2 = Fibonacci(this).fibonacciIndirect(n - 2);
        return n1 + n2;
    }
}

因此,我使用this作为Fibonacci协议的地址,并使用它触发evm链调用。我的测试表明,函数正确地计算了fibonacci序列的第n个值,并且比普通版本消耗更多的气体,但是由于我在文档中没有看到这个,所以我不确定这是否是正确的方法。是的,我知道更多的evm调用意味着更多的气体,因此没有人会选择fibonacci的第二个实现而不是第一个。但是作为测试的一部分,我需要能够强制递归的evm消息调用。

EN

回答 1

Stack Overflow用户

发布于 2022-06-28 17:14:34

通过使用foo调用函数,您可以强制“外部调用”(即调用而不是跳转)到函数this.foo()。这在文档这里中有详细的描述。这是您在第二个示例中使用的。当然,你不应该在生产中使用它,或者只有当你有很好的理由这样做的时候。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72777482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档