智能合约安全审计入门篇——delegatecall(1)_期货基金_智行理财网

智能合约安全审计入门篇——delegatecall(1)

admin 0

By:小白@慢雾安全团队

背景概述

上篇文章中我们学习了合约中数据的存储方式以及如何读取合约中的各种数据。这次我们将带大家了解delegatecall函数。

前置知识

首先,我们先来了解合约中常见的两种外部函数调用:calldelegatecall,下面我们通过一个简单的小实验来看看这两者的区别。

首先来看 A 合约:

contract A { 
    address public a;
    function test() public returns (address b){ b = address(this); a = b;}
}

部署后得到 A 合约的地址,我们再利用 A 合约的地址部署 B 合约:

contract B { 
    address public a;
    address Aaddress = //这里填入 A 合约的地址; 
    function testCall() public{ Aaddress.call(abi.encodeWithSignature(test())); } 
    function testDelegatecall() public{ Aaddress.delegatecall(abi.encodeWithSignature(test())); }
}

当我们调用B.testCall()或者B.testDelegatecall()函数时,这两个函数都会去调用 A.test() ,我们需要做的是观察 B 合约与 A 合约中的 address a 的变化。

总结一下,从上面的小实验中我们可以很明显的看到calldelegatecall的区别:

call:调用后内置变量msg的值会修改为调用者,执行环境为被调用者的运行环境;

delegatecall:调用后内置变量msg的值不会修改为调用者,但执行环境为调用者的运行环境;

callcode:调用后

相关内容

标签:
智能合约安全审计入门篇——delegatecall(1)文档下载: PDF DOC TXT