日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 物聯(lián)網(wǎng) > 區(qū)塊鏈
[導讀] Solidity(或者更概略的說,EVM),在軟件工程師的生產(chǎn)效率和語言表達能力都還有好長一段路需要走。如果你曾經(jīng)在以太坊上開發(fā)智能合約,到現(xiàn)在你應該已經(jīng)察覺,Solidity真是個綁手綁腳的語

Solidity(或者更概略的說,EVM),在軟件工程師的生產(chǎn)效率和語言表達能力都還有好長一段路需要走。如果你曾經(jīng)在以太坊上開發(fā)智能合約,到現(xiàn)在你應該已經(jīng)察覺,Solidity真是個綁手綁腳的語言。

特別是在你是從Swift或Javascript轉行過來開發(fā)Solidity。用Solidity開發(fā)程序,這個語言允許軟件工程師能做的事情,還有整個語言的表達能力,都讓人有種倒退走的感覺。

這種感覺有時候真的會讓人發(fā)飆。

但為什么它是受限的語言

Solidity和其他能夠被編譯成能夠在EVM(以太坊虛擬機)上運作的bytecode(位組碼),都會受到某些限制,因為:

· 當你要執(zhí)行你的程序的時候,你的程序會在整個系統(tǒng)上的每一臺節(jié)點上運作。當一個節(jié)點收到新的區(qū)塊的時候,這個節(jié)點就會驗證這個區(qū)塊的完整性。在以太坊上這些驗證包含了,這個區(qū)塊所包含的所有計算是正確的,而且合約的每個狀態(tài)都是計算正確的。

· 這造成了,即便EVM是圖靈完備,大量的計算會十分昂貴(甚至會因為超過燃料(gas)上限而直接不被允許),因為每個節(jié)點都需要把這些計算計算一遍。也就因此把整個以太網(wǎng)絡拖慢。

· 標準函式庫(standard library)還沒被開發(fā)完成。尤其是數(shù)組和字串都很難用。我本人都還曾經(jīng)自己實作過操作字串的函式庫,就為了一些很基本,我們之前都習以為常的功能。

· 你所寫的合約沒辦法從外界(EVM之外)獲得任何數(shù)據(jù),除非透過交易(Oracle)。而且當一筆交易被布署到網(wǎng)絡上,他就沒把辦法再升級改版(除非是透過migration或是純儲存合約(pure storage contract))。

這些限制有些是以太坊必須一定存在的限制(就像是你永遠不可能會有辦法儲存你Google Photos上照片的備份在鏈上,或者單純透過鏈上的計算資源去做圖像辨識,但這也沒什么關系啦)。但其他限制會存在,只是因為這是一個十分新的科技(雖然真的進步的超級快),但這個技術也將會一直改善。

好的所以我到底要怎么解決這個問題?

當我們在開發(fā)項目的時候,我們可能在未來會對合約做更改。我們可以透過橫跨不同合約間信息傳遞的方式去間接解決這個問題。在進入可升級智能合約(Upgradable Smart Contracts)的實作之前,讓我們先來了解它的限制。

在Solidity,函式庫(library)是一種特殊的合約,這種合約不會儲存任何數(shù)據(jù)(storage),并且也不能持有任何以太幣。有時候我們可以試著把函式庫當成一種以太坊虛擬機(EVM)的單例(Singleton)就好。這個單例是一段可以被其他合約呼叫的代碼,而且這段代碼在被呼叫的時候不需要重新布署。這個特性解決了一些我們所面對的大問題,比如說:

· 布署所需的燃料(gas)花費:因為同樣的代碼不需要一而再再而三地被布署,所以一個很明顯的優(yōu)勢就是能夠節(jié)省大量的燃料。并且不同的合約可以都倚賴同一個已經(jīng)被布署出去的函式庫。

· 繁冗的代碼在區(qū)塊鏈重復出現(xiàn):這明顯的是上面那點所伴隨來的好處,布署的次數(shù)比較少,區(qū)塊鏈上的紀錄也就比較少。

· 代碼升級:在之前的狀況是,如果需要修改程序錯誤或者幫合約改版,就需要重新布署一個新的,因而與之前合約獨立的合約(甚至更慘的狀況是像之前一樣要對以太方進行硬分岔)。這個問題因此被解決了

有沒有開始覺得函式庫是一個很厲害的東西了阿?不幸的是,函式庫也有一些限制,下面是幾點是關于函式庫我們必須知道的重要信息:

· 沒有儲存(storage)的能力

· 函式庫能夠操縱其他合約的儲存(storage)

· 函式庫不能有任何payable的函式(funcTIon)。

· 函式庫不能有任何fallback的函式(funcTIon)。

· 函式庫不能有事件日志(event log)。

· Libraries can be used to fire event logs for the contract which uses it.

· 函式庫是不能被繼承的

· 雖然函式庫不能直接被繼承,但是函式庫可以跟其他函式庫接在一起,就能像一個一般合約一樣的使用被接上的函式庫,單這樣使用,函式庫本身的限制依然還會在。

這幾點可能在一開始會讓人聽起來很混亂,但是別灰心,這邊有一個非常棒的資源可以協(xié)助你了解函式庫。

但至少接下來,我們只會用上一些,因為了解、實作可升級智能合約所必須了解的部分就好了。

函式庫是如何運作的?

函式庫是一種特殊的合約,這種合約不能有任何payable函式,而且也不能有任何fallback函式(這些限制在編譯期間就被強行限制了,因此可以讓函式庫這種合約絕無可能持有任何資金)。函式庫是透過函式庫關鍵字(library L{})去定義的,就像一個合約會透過(contract C{})去定義一樣。

library L{

funcTIon a() returns (address) {

return address(this);

}

}

contract C{

funcTIon a() constant returns (address) {

//This will behave as if the library code was written within this contract

return L.a();

}

}

要呼叫一個函式庫里面的函式必須用特別的指令(DELEGATECALL),這個指令會傳遞呼叫函式的信息(calling context)到函式庫,因此就幾乎像是一個都在同個合約里面,合約自己處理自己的指令。我真的蠻喜歡在Solidity文件里面闡述這件事情的角度。

函式庫可以被視為給其他智能合約使用的固有基礎合約

從上面的的代碼可以知道,如果合約C的函式a()被呼叫,a()會回傳合約C的地址而非函式庫L的地址。同樣這點也適用所有msg的性質:msg.sender,msg.value,msg.sig,msg.data以及msg.gas(Solidity文件里面所寫的與這相反,但是在做了一些實驗之后,似乎我這樣解釋才是正確的)。

一件我們在這邊會注意到的事情是,我們還是不太清楚類型C(class C)和函式庫L(library L)是怎么被連在一起的,因此接下來我們就會試著了解這件事情。

函式庫們是如何被連接起來的?

與顯式繼承不同的是,一個倚賴函式庫合約(contract C is B {}),他與函式庫之間的連接(link)方式是沒有那么清楚的。在上述例子,合約C在他自己的函式a()中用到函式庫L。但是在上面這短短的代碼中,我們都沒有提到函式庫要使用什么地址,而且函式庫L不會出現(xiàn)在合約C編譯完的位組碼(byecode)中。

函式庫的連接是發(fā)生在位組碼等級。當合約C被編譯完成后,合約C會替函式庫的地址給一個像是下面這種形式的預留位置0073__L_____________________________________630dbe671f(0dbe671f是a()的function signature),如果我們完全不更動合約C就布署合約C,這樣就會因為位組碼是不合法的導致布署失敗。

簡單解釋就是,函式庫連接就是簡單的把所有在合約位組碼里面預留給函式庫的位置,全部都用函式庫的地址填上就完成了。這樣填完的位組碼就可以順利的布署到區(qū)塊鏈上。

好的我們現(xiàn)在介紹了函式庫的基本概念后,我們就可以了解怎么用函式庫去開發(fā)可升級智能合約了。

函式庫本身是沒辦法升級的

對的函式庫沒辦法升級,而且合約也沒辦法升級。就像我們本篇文章前面所提到的,對函式庫的參考(reference)是位組碼(bytecode)等級的事情,而不是儲存(storage)等級的事情。在合約一布署后,就無法修改合約的位組碼。因此對于函式庫的參考就會被隨著合約永存。

所以我們必須問這個問題「為什么還是有人提出可升級這個特點呢?」

最后,他到底怎么運作的?

這邊我們會用到一些小技巧,讓我們一起仔細了解。

我們沒有直接將給使用者使用的主合約C和布署所需的函式庫連接,而是將給使用者使用的主合約C跟一個調度員(Dispatcher)合約連接起來。在編譯時期和布署時期,因為調度員合約沒有實作函式庫內任何函數(shù),所以一切都不會出現(xiàn)問題。這也就意味著,調度員合約并沒有用到任何函式庫內的代碼,調度員合約僅僅是位組碼(就像是我們在上面看到合約C的位組碼一樣),在調度員的位組碼中,并不需要引用(include)函式庫的地址。我們就沒有將任何地址寫死(hardcode)在位元組碼等級,也因此我們就可以隨時把函式庫替換成任何我們所需的函式庫。

然而,如果我們沒有在調度員合約中用任何函式庫的代碼,這樣我們要如何執(zhí)行函式庫中的函式?

當一筆交易進來的時候,主合約(Token contract,代幣合約)發(fā)現(xiàn)這筆交易需要從主合約所連接的函式庫(TokenLib1)呼叫delegatecall,然而呼叫delegatecall這件事情不會直接請函式庫直接回傳,而是會先透過調度員合約呼叫delegatecall。

接下來的事情就會變得很有趣了。一當調度員合約在他自己的fallback function中接收到delegatecall,調度員合約會在fallback function中判斷所需的正確版本函式庫是哪個,然后將呼叫delegatecall的要求導向正確的函式庫。當函式庫回傳數(shù)據(jù)后,數(shù)據(jù)就會一路回到主合約。

雖然這個解法運作起來還不錯,但是他還是有些限制。

限制

調度員合約必須知道呼叫函式庫,函式庫回傳值的內存大小?,F(xiàn)在這個問題可以透過mapping解決,會以function signature去取得回傳值大小。為了簡化說明,所以我們故意避免對這方面多做解釋。

上述方法在以太坊虛擬機中可以成功運行,但是我們只能在不同合約間儲存足跡(storage footprint)都相同的狀況下才能使用。因為函式庫沒有任何儲存,所以我們必須讓調度員合約里面也沒有任何儲存。這也就是為什么需要有另外一個分離的Dispatcher Storage(見上圖下面方塊)去儲存調度員合約所需的數(shù)據(jù)。還有,Dispatcher Storage的地址必須寫死在調度員合約的位組碼里面。

可以發(fā)現(xiàn),使用者所會面使用到的合約(Token contract)其實沒有使用到任何特別的技術,唯一不一樣的地方就是,不能像之前一樣連接到某特定版本的函式庫,而是連接到調度員合約。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉