主要目的:代碼復(fù)用。也是一個合約跟畅。
一般性約束:1咽筋,不能有成員變量。2徊件,不能有ether奸攻,函數(shù)不能payable。3虱痕,不能繼承睹耐。4,不能selfdestruct部翘。5硝训,關(guān)于modifier,不能外部合約調(diào)用略就。
using關(guān)鍵字:本質(zhì)上是一個語法糖捎迫。(語法糖:代碼更加簡潔,代碼語義更加自然表牢。語法鹽:通過反人類的語法窄绒,讓人更痛苦的寫代碼)。比如有一個Math的庫崔兴,在一個合約中使用 using Math for uint; 表示:讓庫的方法跟它所操作的第一個參數(shù)綁定彰导,成為第一個參數(shù)的數(shù)據(jù)類型的方法蛔翅。這樣會是的代碼外觀上顯得更加面向?qū)ο螅瑑H僅是編譯器做了一些操作位谋。
機制與內(nèi)幕
1山析,庫的internal方法是inline(嵌入)到調(diào)用者代碼中了。不同的調(diào)用者對代碼進行的復(fù)制掏父。如果庫中的方法都是internal的不會被單獨處理笋轨,不會單獨部署,只要有一個public方法都會被單獨處理赊淑。
2爵政,庫的public方法是library單獨部署為合約,然后用delegatecall調(diào)用陶缺。所以钾挟,如果library有public方法,則必然是要單獨部署的(Linked Library)饱岸。如果全是internal方法掺出,則可以不部署(Embedded Library)。
3苫费,當(dāng)library因為有public 而單獨部署時汤锨,與proxy pattern相比照,都是利用另一個合約承載邏輯黍衙,但方法不用泥畅,一個利用存儲布局,一個直接傳遞storage引用琅翻,上下文變量都保持在調(diào)用者一邊位仁。(調(diào)用者以delegatecall調(diào)用,由于library沒有成員方椎,被調(diào)用者只操作傳入?yún)?shù)聂抢,因此delegatecall不是像proxy pattern中的那樣通過兼容存儲布局利用另一個合約邏輯的作用,而是通過操作storage屬性的參數(shù)利用另一個合約的邏輯)棠众。合約里的方法不能傳入storage的變量琳疏。
4,library的public,external函數(shù)傳入storage參數(shù)闸拿,從這一點上看空盼,說它是普通合約并不準(zhǔn)確。
5新荤,調(diào)用者對單獨部署的library的引用是在編譯時完成揽趾,不是運行時,無法實現(xiàn)動態(tài)升級苛骨。
6篱瞎,internal:只對調(diào)用者可見苟呐,并且內(nèi)聯(lián)編譯;private:library內(nèi)部用俐筋,對library使用者不可見(僅從可見性解釋上牵素,library類似超類)。public:對library使用者可見澄者,但是合約要單獨部署笆呆。
7,交易屬性:解釋為對storage類型參數(shù)的操作闷哆,而不是成員腰奋;或者解釋為對調(diào)用者成員變量的操作单起;兩者等價抱怔。
我是溫馭臣,一個Solidity的開發(fā)學(xué)習(xí)者嘀倒,以上是我的簡單總結(jié)屈留,如果有缺陷,希望在評論區(qū)看到您的補充测蘑。