---
# System prepended metadata

title: 'Solidity - call, delegateCall'
tags: [Solidity語法]

---

# Solidity - call, delegateCall


## delegatecall

delegatecall與call類似，
是solidity中地址類型的==低級成員函數(Low Level Call)== 

<br>

>當用戶A通過合約B來**call**合約C的時候，
執行的是合約C的函數，
語境(Context，可以理解為包含變量和狀態的環境)也是合約C的
像是msg.sender是B的地址，
並且如果函數改變一些狀態變量，產生的效果會作用於合約C的變量上。

![](https://i.imgur.com/zj0khQC.png)

<br>

>當用戶A通過合約B來**delegatecall**合約C的時候，
執行的是合約C的函數，
但是語境仍是合約B的，
像是msg.sender是A的地址，
並且如果函數改變一些狀態變量，產生的效果會作用於合約B的變量上。

![](https://i.imgur.com/kpFxe5C.png)

### 比喻
一個富商把它的資產（狀態變量）都交給一個VC代理（目標合約的函數）來打理。執行的是VC的函數，但是改變的是富商的狀態。

### 實作
```solidity=
目標合约地址.delegatecall(二进制编码);
//二進制编码 = abi.encodeWithSignature("函数签名", 逗号分隔的具体参数)
```

### 使用場景
#### 代理合約（Proxy Contract）
將智能合約的存儲合約和邏輯合約分開：代理合約（Proxy Contract）存儲所有相關的變量，並且保存邏輯合約的地址；所有函數存在邏輯合約（Logic Contract）裡，通過delegatecall執行。當升級時，只需要將代理合約指向新的邏輯合約即可。
==重點為可升級合約==

#### EIP-2535 Diamonds（鑽石）
鑽石是一個支持構建可在生產中擴展的模塊化智能合約系統的標準。鑽石是具有多個實施合同的代理合同。更多信息請查看：鑽石標準簡介。

### 備註
1. 本來還有Callcode但目前已經被棄用
2. 



















###### tags: `Solidity語法`