delegatecall与call操作产生的普通智能合约函数调用的最大区别就在于"执行环境不会切换":也就是账户状态、储存状态都保留当前的调用者智能合约对应的状态,并且msg.sender和msg.value也不会改变;仅仅是把目标地址上的代码,拿到智能合约的当前执行环境中来执行。
但是如果是调用的"有状态"的库智能合约是会影响当前智能合约的状态。
FibonacciLib合约示例:
contract FibonacciLib{//数列开始的数字uint public start;uint public calculatedFibNumber;//修改数列开始的数字function setStart(uint _start) public {start = _start;}function setFibonacci(uint n) public {calculatedFibNumber = fibonacci(n);}function fibonacci(uint n) internal returns (uint) {if (n == 0) return start;else if (n == 1) return start + 1;else return fibonacci(n - 1) + fibonacci(n - 2)}}
另一个合约使

本文深入探讨了delegatecall在智能合约中的工作原理及其潜在风险。通过一个FibonacciLib合约示例,展示了如何因delegatecall调用有状态库智能合约导致状态异常,从而引发安全问题。具体表现为攻击者可以通过特定方式修改合约状态,导致转账失败或钱包资金被锁定。2017年parity多重签名钱包漏洞事件再次强调了智能合约在设计时必须谨慎处理库合约的依赖和自毁情况,以防止类似问题发生。
最低0.47元/天 解锁文章
2627

被折叠的 条评论
为什么被折叠?



