# Solidity - call, delegateCall ## delegatecall delegatecall與call類似, 是solidity中地址類型的==低級成員函數(Low Level Call)== <br> >當用戶A通過合約B來**call**合約C的時候, 執行的是合約C的函數, 語境(Context,可以理解為包含變量和狀態的環境)也是合約C的 像是msg.sender是B的地址, 並且如果函數改變一些狀態變量,產生的效果會作用於合約C的變量上。  <br> >當用戶A通過合約B來**delegatecall**合約C的時候, 執行的是合約C的函數, 但是語境仍是合約B的, 像是msg.sender是A的地址, 並且如果函數改變一些狀態變量,產生的效果會作用於合約B的變量上。  ### 比喻 一個富商把它的資產(狀態變量)都交給一個VC代理(目標合約的函數)來打理。執行的是VC的函數,但是改變的是富商的狀態。 ### 實作 ```solidity= 目標合约地址.delegatecall(二进制编码); //二進制编码 = abi.encodeWithSignature("函数签名", 逗号分隔的具体参数) ``` ### 使用場景 #### 代理合約(Proxy Contract) 將智能合約的存儲合約和邏輯合約分開:代理合約(Proxy Contract)存儲所有相關的變量,並且保存邏輯合約的地址;所有函數存在邏輯合約(Logic Contract)裡,通過delegatecall執行。當升級時,只需要將代理合約指向新的邏輯合約即可。 ==重點為可升級合約== #### EIP-2535 Diamonds(鑽石) 鑽石是一個支持構建可在生產中擴展的模塊化智能合約系統的標準。鑽石是具有多個實施合同的代理合同。更多信息請查看:鑽石標準簡介。 ### 備註 1. 本來還有Callcode但目前已經被棄用 2. ###### tags: `Solidity語法`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up