.delegatecall(...)
.delegatecall() 是 Solidity 中的一个方法,用于从一个原始合约中调用目标合约中的一个函数。然而,与其他方法不同的是,当使用.delegatecall()在目标合约中执行函数时,上下文从原始合约中传递,即代码在目标合约中执行,但变量在原始合约中被修改。
通过本教程,我们将了解为什么正确理解.delegatecall()的工作原理很重要,否则会产生一些严重后果。
等等,什么?
让我们先了解它是如何工作的。
使用.delegatecall()时需要注意的是,原始合约的上下文被传递给目标合约,目标合约的所有状态变化都反映在原始合约的状态上,而不是目标合约的状态上,即使该函数是在目标合约上执行的。
嗯,不是很清楚,我明白你的意思。所以让我们试着通过一个例子来理解。
在以太坊中,一个函数可以表示为 4+32*N
个字节,其中 4 个字节为函数选择器,32*N
个字节为函数参数。
- 函数选择器。为了得到函数选择器,我们将函数的名称和它的参数类型进行散列,不留空隙,例如,对于像
putValue(uint value)
这样的东西,你将使用keccak-256
散列putValue(uint)