以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads

探索以太坊合約委托調用(DelegateCall)_CAL

Author:

Time:1900/1/1 0:00:00

譯文出自:登鏈翻譯計劃

譯者:翻譯小組

校對:Tiny熊

在本文中,我們看看如何調用另一個合約的函數,并更深入討論delegatecall委托調用。

有時,需要在編寫以太坊智能合約代碼中,與其他合約進行交互。在Solidity中,有幾種方法可以實現此目標:

如果知道目標合約的ABI,可以直接使用函數簽名

假設已經部署了一個簡單的合約,稱為“Storage”,該合約允許用戶保存val。

pragmasolidity^0

functionsetValue(uintv)public{val=v;}}

現在我們部署另一個稱為“Machine”的合約,它是“Storage”合約的調用方。“Machine”引用“Storage”合約并更改其val。

pragmasolidity^0

functionsaveValue(uintx)publicreturns(bool){s

functiongetValue()publicviewreturns(uint){returns

}

在此案例中,我們知道Storage合約的ABI及其地址,以便我們可以使用該地址初始化現有的Storage合約,而ABI的作用是告訴我們如何調用Storage合約的函數。可以看到Machine合約調用了Storage

);describe('#saveValue()',()=>{it('shouldsuccessfullysavevalue',async()=>{awaitMachine

中非共和國探索將國家加密貨幣納入國家經濟:金色財經報道,根據政府周二的一份聲明,中非共和國(CAR)已經成立了一個工作組,探索將其國家加密貨幣(稱為桑戈幣)納入國家經濟的方式。CAR的新加密貨幣委員會將致力于起草一部關于在該國使用加密貨幣的法律。該工作組還將提交該國資產代幣化的指導方針。該委員會的15名成員從幾個政府部門中選出,包括礦山和地質、農村發展和城市規劃。[2023/1/19 11:19:59]

);});});

測試通過了!

Contract:MachineAfterinitalize#saveValue()?shouldsuccessfullysavevalue(56ms)1passing(56ms)

如果不知道目標合約的ABI,請使用call或delegatecall

但是,如果調用者(在本例中為“Machine”合約)不知道目標合約的ABI,該怎么辦?

其實,我們仍然可以使用call()和delegatecall()來調用目標合約的函數。

在解釋以太坊Solidity的call()和delegatecall()之前,了解EVM如何保存合約變量對于了解call()和delegatecall()會有所幫助。

EVM如何將字段變量保存到存儲

在以太坊中,有兩種空間可以保存合約的字段變量。一個是“內存”,另一個是“存儲”。而且,“foo”保存到存儲意味著“foo”的值會永久記錄到區塊鏈狀態中。

那么,單個合約中的如此多的變量又是怎樣讓彼此不重疊呢?EVM將插槽號分配給字段變量。

印尼央行行長稱該國正在積極探索加密資產:7月12日消息,印度尼西亞銀行 (BI) 行長Doni Primanto Joewono在巴厘島巴東舉行的G20數字經濟會外活動中表示,需要一個監管框架來克服與加密資產相關的穩定性問題。他認為加密貨幣具有發展包容性和提高金融系統效率的潛力。加密資產已促使許多國家的中央銀行探索設計和發行中央銀行數字貨幣(CBDC)。Joewono稱,該國正在探索將加密貨幣納入其金融體系的可能性。 印度尼西亞銀行一直在研究CBDC,旨在發布有關數字印尼盾發展的白皮書。(Finbold)[2022/7/13 2:08:42]

contractSample1{uint256first;//slot0uint256second;//slot1}

ImageforpostEVM使用插槽保存字段變量

因為first在Sample1合約中最先聲明,所以分配了0個插槽。每個不同的變量都通過其插槽號來區分。

在EVM中,智能合約存儲中具有2256個插槽,每個插槽可以保存32字節大小的數據。

如何調用智能合約函數

像Java,Python這樣的通用編程代碼一樣,Solidity函數可以看作是一組命令。當我們說“函數被調用”時,這意味著我們將特定的上下文(如參數)注入到該組命令(函數)中,并且在此上下文中一個接一個地執行命令。

函數、命令組、地址空間可以通過其名稱找到。

在以太坊函數中,調用可以用字節碼表示,使用432*N個字節表達。這個字節碼由兩部分組成。

函數選擇器:這是函數調用字節碼的前4個字節。函數選擇器是通過對目標函數的名稱加上其參數類型(不包括空格)進行哈希取前4個字節得到,例如bytes4(keccak-256(“saveValue(uint)”))。基于此函數選擇器,EVM可以決定應在合約中調用哪個函數。

宇信科技正研究并探索NFT業務:4月6日消息,宇信科技(300674.SZ)今日在投資者互動平臺表示,公司一直在關注新技術在金融行業的應用,以便更好地實現金融科技賦能。公司的研發團隊和合作伙伴正在就NFT做前瞻性研究,以便未來能更好在業務上落地,這也是公司今年的重要探索方向之一。(每日經濟新聞)[2022/4/6 14:08:10]

函數參數:將參數的每個值轉換為固定長度為32bytes的十六進制字符串。如果有多個參數,則串聯在一起。

如果用戶將此432*N字節字節代碼傳遞給交易的數據字段。EVM可以找到應執行的函數,然后將參數注入該函數。

用測試用例解釋DelegateCall

上下文

當我們談論智能合約函數的調用方式時,有一個“上下文”一詞。實際上,“上下文”一詞在軟件中是很籠統的概念,其含義根據場合不同有所改變。

當我們談論程序的執行時,我們可以說“上下文”是指執行時所有環境(如變量或狀態)。例如,在執行程序“A”時,執行該程序的用戶名是“zeroFruit”,則用戶名“zeroFruit”可以是程序“A”的上下文。

在以太坊智能合約中,有很多上下文,其中一個代表性的事情是誰執行這個合約。你可能會在很多Solidity代碼中看到msg

..

functionaddValuesWithCall(addresscalculator,uint256a,uint256b)publicreturns(uint256){(boolsuccess,bytesmemoryresult)=calculator

深圳:探索數字人民幣應用及數字資產交易先行先試:金色財經報道,據深圳特區報消息,日前,2021年度深圳市金融發展咨詢委員會全體會議召開,評選出2020年度深圳市金融創新獎,獎金總額2550萬元。深圳市委副書記艾學峰出席會議并表示,下一步深圳將在金融改革創新發展方面積極探索,推動深圳金融中心建設,打造數字人民幣國際合作平臺,研究設立數字交易平臺,探索數字人民幣應用及數字資產交易先行先試。[2021/11/22 22:08:01]

}

下面是目標合約Calculator,它也有calculateResult和user。

pragmasolidity^0

}

測試addValuesWithCall

下面是addValuesWithCall的測試代碼。需要測試的有:

由于上下文位于“Calculator”而非“Machine”上,因此add結果應保存到“Calculator”合約存儲中

因此,Calculator的calculateResult應該為3,而user的地址應該設置為Machine的地址。

并且Machine的calculateResult應該為0,user為零地址。

describe('#addValuesWithCall()',()=>{letCalculator;beforeEach(async()=>{Calculator=awaitCalculatorFactory

);it('shouldsuccessfullyaddvalueswithcall',async()=>{constresult=awaitMachine

聲音 | 互金協會楊農:金融科技要積極探索動態監管、監管沙盒、負面清單等新技術:中國互聯網金融協會副秘書長楊農出席變革與夢想·2019鳳凰網財經高峰論壇”時表示,全部的金融業務都是金融科技的應用場景,要理性地看待金融科技熱,金融監管既要強化也要科學。他進一步表示,要想準確地理解諸如區塊鏈和數字貨幣這樣現代的金融技術,如果沒有學習過密碼學,沒有學習過數據庫技術和具備相應的計算機、系統管理方面的知識,要想準確地理解和把握實際上是相當困難的。楊農還表示,對于涉及到國家重大金融安全、投資人利益和消費者權益保護等方面,必須要實施最嚴格的監管。但是對于一般性的金融產品和服務,應該提倡實施科學、有效、合理的監管,同時要避免因為監管動作自身不當誘發風險事件的發生。要創新監管技術,在堅持“凡是金融活動都應納入監管”的總體原則下,要積極地探索動態監管、監管沙盒、負面清單等新技術,穩步提升監管的水平。

楊農還表示,中國互聯網金融協會正在推動區塊鏈技術的相關應用以及金融機構的數字化轉型,正在組織建設中國供應鏈金融數字信息服務平臺和中國數字金融綜合服務平臺,正在試點推動全國金融機構的移動APP備案管理等相關工作。明年針對以上工作的一系列業務規范和技術標準將會陸續出臺。[2019/12/1]

);});

按預期通過了所有測試:

Contract:MachineAfterinitalize#addValuesWithCall()?shouldsuccessfullyaddvalueswithcall(116ms)1passing(116ms)

測試addValuesWithDelegateCall

下面是我們的addValuesWithCall測試代碼。我們需要測試的有:

由于上下文位于“Machine”而非“Calculator”上,因此add結果應保存到“Machine”存儲中。

因此,Calculator的calculateResult應該為0,而user的地址應為0地址。

而Machine的calculateResult應為3,而user的則為用戶地址。

describe('#addValuesWithDelegateCall()',()=>{letCalculator;beforeEach(async()=>{Calculator=awaitCalculatorFactory

);it('shouldsuccessfullyaddvalueswithdelegatecall',async()=>{constresult=awaitMachine

);});

但是失敗了!什么呢?“562046206989085878832492993516240920558397288279”來自哪里?

0passing(236ms)1failing1)Contract:MachineAfterinitalize#addValuesWithDelegateCall()shouldsuccessfullyaddvalueswithdelegatecall:AssertionError:expected'562046206989085878832492993516240920558397288279'toequal'3'expected-actual-5620462069890858788324929935162409205583972882793

如前所述,每個字段變量都有其自己的插槽。當我們委托調用Calculator時,上下文位于Machine上,但是插槽編號基于Calculator。

因此,由于Calculator用calculateResult覆蓋了Storage地址,而user覆蓋了calculateResult,因此測試失敗。

基于此知識,我們可以找到“562046206989085875878832492993516240920558397288279”的來源。它是EOA的十進制版本。

Imageforpost“Calculator”合約字段變量將覆蓋“Machine”合約字段變量

因此,要解決此問題,我們需要更改“Machine”字段變量的順序。

contractMachine{uint256publiccalculateResult;addresspublicuser;Storagepublics;...}

最后,測試通過了!

Contract:MachineAfterinitalize#addValuesWithDelegateCall()?shouldsuccessfullyaddvalueswithdelegatecall(106ms)1passing(247ms)

總結一下

在本文中,我們已經看到了如何從合約中調用另一個合約的函數。

如果我們知道目標函數的ABI,就可以直接使用目標函數簽名

如果我們不知道目標函數的ABI,可以使用call()或delegatecall()。但是在delegatecall()的情況下,我們需要關心字段變量的順序。

源代碼

如果你想自己進行測試,可以在此代碼庫中找到代碼。

本翻譯由CellNetwork贊助支持。

來源:https://medium.com/coinmonks/delegatecall-calling-another-contract-function-in-solidity-b579f804178c

參考資料

登鏈翻譯計劃:https://github.com/lbc-team/Pioneer

翻譯小組:https://learnblockchain.cn/people/412

Tiny熊:https://learnblockchain.cn/people/15

ABI:https://learnblockchain.cn/docs/solidity/abi-spec.html

此代碼庫:https://github.com/zeroFruit/upgradable-contract/tree/feat/delegatecall

CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain

本文來源于非小號媒體平臺:

登鏈社區

現已在非小號資訊平臺發布105篇作品,

非小號開放平臺歡迎幣圈作者入駐

入駐指南:

/apply_guide/

本文網址:

/news/9569963.html

免責聲明:

1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險

2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場

上一篇:

幣安為何推出第三條鏈?這對BNB意味著什么?

Tags:CALALLTORALCethicaljudgementcallacartoro幣APPRentalChain

火幣交易所
比特幣屬于高風險類資產 不提倡年輕人加杠桿“炒幣”_比特幣

“21萬一枚的比特幣,見證歷史!”北京時間1月2日晚間,95后徐舟就被比特幣行情“震驚了”。2021年的第一個工作日還沒到,比特幣的價格再度站上歷史新高,一度接近3.1萬美元.

1900/1/1 0:00:00
BKEX Global 關于FILPool礦池FIL6第二期兌換完成的公告_KEX

親愛的BKEXer:????BKEXGlobal現已完成FILPool礦池FIL6第二期交割兌換.

1900/1/1 0:00:00
炒幣教父:1.3 比特幣35000關口,后續看漲或是回調?_比特幣

消息面: 1、加密分析師和經濟學家AlexKruger表示,世界主要央行將不可避免地持有比特幣作為儲備資產。他稱,“主要央行最終將把比特幣作為儲備資產持有.

1900/1/1 0:00:00
NewBloc:解析造就比特幣牛市的兩大重要因素_比特幣

本文作者為NewBloc策略分析師Barry,5年外匯黃金市場交易經歷。2021年新的周末,比特幣仍在突飛猛漲.

1900/1/1 0:00:00
熱門的算法穩定幣怎么玩?了解穩定機制與參與方式_BAS

簡單了解BasisCash與ESD等算法穩定幣參與方式與風險。原文標題:《算法穩定幣解讀墨客年末分享|直播回顧》演講:墨客,BlockArk首席分析師2020年12月31日下午4點,BlockA.

1900/1/1 0:00:00
BigONE 關于杠桿 ETF 產品 BCH3S、DOT3S、FLM3L、LINK3S、LTC3S、UNI3S 進行份額合并的公告_BIG

親愛的用戶: 由于杠桿ETF產品BCH3S、DOT3S、FLM3L、LINK3S、LTC3S和UNI3S單價低于0.05USDT,觸發了BigONE杠桿ETF產品份額合并機制.

1900/1/1 0:00:00
ads