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) + f