我需要进行递归的evm消息调用。根据我对稳健性的理解,同一契约中的调用不会触发evm消息。但是对于我的用例,我希望每个递归调用都是evm消息调用。这是斐波纳契的合同。这是正常的版本
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递归链调用(或者我认为是这样)。以下是实现
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消息调用。
发布于 2022-06-28 17:14:34
通过使用foo调用函数,您可以强制“外部调用”(即调用而不是跳转)到函数this.foo()。这在文档这里中有详细的描述。这是您在第二个示例中使用的。当然,你不应该在生产中使用它,或者只有当你有很好的理由这样做的时候。
https://stackoverflow.com/questions/72777482
复制相似问题