menu-icon
anue logo
熱門時事鉅亨號鉅亨買幣
search icon

區塊鏈

Solidity極簡入門|第二十五講:Create2

BlockBeats 律動財經 2022-08-26 09:30

cover image of news article
律動財經圖片

我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每周更新 1-3 講。

所有代碼和教程開源在 github:github.com/AmazingAng/WTFSolidity

CREATE2

CREATE2 操作碼使我們在智能合約部署在以太坊網路之前就能預測合約的地址。Uniswap 創建 Pair 合約用的就是 CREATE2。這一講,我將介紹 CREATE2 的用法。


CREATE 如何計算地址

智能合約可以由其他合約和普通帳戶利用 CREATE 操作碼創建。在這兩種情況下,新合約的地址都以相同的方式計算:創建者的地址和 nonce(該地址發送交易的總數) 的哈希。



創建者地址不會變,但 nonce 可能會隨時間而改變,因此用 CREATE 創建的合約地址不好預測。

CREATE2 如何計算地址

CREATE2 的目的是為了讓合約地址獨立於未來的事件。不管未來區塊鏈上發生了什麼,你都可以把合約部署在事先計算好的地址上。用 CREATE2 創建的合約地址由 4 個部分決定:

0xFF:一個常數,避免和 CREATE 衝突

創建者地址 

salt(鹽):一個創建者給定的數值

待部署合約的字節碼(bytecode)  

CREATE2 確保,如果創建者使用 CREATE2 和提供的 salt 部署給定的合約 bytecode,它將儲存在 新地址 中。

如何使用 CREATE2

CREATE2 的用法和之前講的 Create 類似,同樣是 new 一個合約,並傳入新合約構造函數所需的參數,只不過要多傳一個 salt 參數:



其中 Contract 是要創建的合約名,x 是合約對象(地址),_salt 是指定的鹽;如果構造函數是 payable,可以創建時轉入_value 數量的 ETH,params 是新合約構造函數的參數。

極簡 Uniswap2

跟上一講類似,我們用 Create2 來實現極簡 Uniswap。

Pair  



Pair 合約很簡單,包含 3 個狀態變量:factory,token0 和 token1。

構造函數 constructor 在部署時將 factory 賦值為工廠合約地址。initialize 函數會在 Pair 合約創建的時候被工廠合約調用一次,將 token0 和 token1 更新為幣對中兩種Token的地址。

PairFactory2  



工廠合約(PairFactory2)有兩個狀態變量 getPair 是兩個 Token 地址到幣對地址的 map,方便根據 Token 找到幣對地址;allPairs 是幣對地址的數組,儲存了所有 Token 地址。

PairFactory2 合約只有一個 createPair2 函數,使用 CREATE2 根據輸入的兩個 Token 地址 tokenA 和 tokenB 來創建新的 Pair 合約。其中



就是利用 CREATE2 創建合約的代碼,非常簡單,而 salt 為 token1 和 token2 的 hash:

  



事先計算 Pair 地址  



我們寫了一個 calculateAddr 函數來事先計算 tokenA 和 tokenB 將會生成的 Pair 地址。通過它,我們可以驗證我們事先計算的地址和實際地址是否相同。

大家可以部署好 PairFactory2 合約,然後用下面兩個地址作為參數調用 createPair2,看看創建的幣對地址是什麼,是否與事先計算的地址一樣:



總結



這一講,我們介紹了 CREATE2 操作碼的原理,使用方法,並用它完成了極簡版的 Uniswap 並提前計算幣對合約地址。CREATE2 讓我們可以在部署合約前確定它的合約地址,這也反事實系統和很多 layer2 的基礎。

原文連結

暢行幣圈交易全攻略,專家駐群實戰交流

▌立即加入鉅亨買幣實戰交流 LINE 社群(點此入群
不管是新手發問,還是老手交流,只要你想參與虛擬貨幣現貨交易、合約跟單、合約網格、量化交易、理財產品的投資,都歡迎入群討論學習!

前往鉅亨買幣找交易所優惠

文章標籤


Empty