Skip to content

Commit

Permalink
Merge pull request #499 from 0xKaso/patch-1
Browse files Browse the repository at this point in the history
Update readme.md
  • Loading branch information
AmazingAng committed May 20, 2023
2 parents 23a4003 + e016e14 commit e7a616f
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions 23_Delegatecall/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ tags:
## `delegatecall`
`delegatecall``call`类似,是`solidity`中地址类型的低级成员函数。`delegate`中是委托/代表的意思,那么`delegatecall`委托了什么?

当用户`A`通过合约`B``call`合约`C`的时候,执行的是合约`C`的函数,`语境`(`Context`,可以理解为包含变量和状态的环境)也是合约`C`的:`msg.sender``B`的地址,并且如果函数改变一些状态变量,产生的效果会作用于合约`C`的变量上。
当用户`A`通过合约`B``call`合约`C`的时候,执行的是合约`C`的函数,`上下文`(`Context`,可以理解为包含变量和状态的环境)也是合约`C`的:`msg.sender``B`的地址,并且如果函数改变一些状态变量,产生的效果会作用于合约`C`的变量上。

![call的语境](https://images.mirror-media.xyz/publication-images/VgMR533pA8WYtE5Lr65mQ.png?height=698&width=1860)
![call的上下文](https://images.mirror-media.xyz/publication-images/VgMR533pA8WYtE5Lr65mQ.png?height=698&width=1860)

而当用户`A`通过合约`B``delegatecall`合约`C`的时候,执行的是合约`C`的函数,但是`语境`仍是合约`B`的:`msg.sender``A`的地址,并且如果函数改变一些状态变量,产生的效果会作用于合约`B`的变量上。
而当用户`A`通过合约`B``delegatecall`合约`C`的时候,执行的是合约`C`的函数,但是`上下文`仍是合约`B`的:`msg.sender``A`的地址,并且如果函数改变一些状态变量,产生的效果会作用于合约`B`的变量上。

![delegatecall的语境](https://images.mirror-media.xyz/publication-images/JucQiWVixdlmJl6zHjCSI.png?height=702&width=1862)
![delegatecall的上下文](https://images.mirror-media.xyz/publication-images/JucQiWVixdlmJl6zHjCSI.png?height=702&width=1862)

大家可以这样理解:一个`富商`把它的资产(`状态变量`)都交给一个`VC`代理(`目标合约`的函数)来打理。执行的是`VC`的函数,但是改变的是`富商`的状态。

Expand Down Expand Up @@ -127,9 +127,9 @@ contract B {

![delegatecall.png](./img/23-5.png)

6. 由于是`delegatecall`语境为合约`B`。在运行后,合约`B`中的状态变量将被修改:`num`被改为`100``sender`变为你的钱包地址。合约`C`中的状态变量不会被修改。
6. 由于是`delegatecall`上下文为合约`B`。在运行后,合约`B`中的状态变量将被修改:`num`被改为`100``sender`变为你的钱包地址。合约`C`中的状态变量不会被修改。

![resultdelegatecall.png](./img/23-6.png)

## 总结
这一讲我们介绍了`solidity`中的另一个低级函数`delegatecall`。与`call`类似,它可以用来调用其他合约;不同点在于运行的语境`B call C`语境为`C`;而`B delegatecall C`语境为`B`。目前`delegatecall`最大的应用是代理合约和`EIP-2535 Diamonds`(钻石)。
这一讲我们介绍了`solidity`中的另一个低级函数`delegatecall`。与`call`类似,它可以用来调用其他合约;不同点在于运行的上下文`B call C`上下文为`C`;而`B delegatecall C`上下文为`B`。目前`delegatecall`最大的应用是代理合约和`EIP-2535 Diamonds`(钻石)。

0 comments on commit e7a616f

Please sign in to comment.