昨天講了ZK Rollup常見的架構,還不太清楚的可以點這邊觀看,而今天開始要來實作出一個小型的ZK Rollup。
而在開發之前,我們應該先要有一條區塊鏈才對,畢竟開發這種東西,總是需要測試吧!如果直接在以太坊上直接開發的話,成本會非常高,所以通常來說開發這種項目的時候,都會開發在測試鏈上,以現在我撰寫這篇文章的時間點來看,以太坊比較著名的測試鏈有兩條,分別是Goerli跟Sepolia,但是通常在開發鏈上程式的時候,要測試也不會從測試鏈開始,主要原因是因為測試鏈上的資訊是公開的,所以你在鏈上做的一舉一動都會被看到,除此之外,因為測試鏈也是要等到礦工成功把你的交易包進區塊,交易才算完成,所以如果是用測試鏈進行測試,在這過程中也會需要耗費不少時間,所以一般來說在開發鏈上程式的時候,都會使用私有鏈,就是自己建一條自己的私有鏈出來,我們可以設定私有鏈的出塊速度以及礦工數量,這樣可以快速將我們的交易上鏈,而且因為是私有的關係,我們做的任何交易都不會公開,因此在開發之前要先有一條自己的私有鏈才行,在這邊我使用的是Go-ethereum提供的功能,大家也可以根據自己的習慣使用自己的測試鏈。
我會使用Go-ethereum主要是因為這次實作我想使用Golang程式語言做為開發工具,而Golang在Web3裡面最知名的工具就屬Go-ethereum了!Go-ethereum簡稱又稱Geth,他是以太坊區塊鏈平臺的官方Golang語言實現版本之一,他提供了一個用戶界面和命令行工具,使開發者可以運行以太坊節點,進行智能合約的部署、交易處理等操作。而在這次開發的過程中,我會使用他蠻多的工具,要使用他的工具,需要先安裝他的安裝包,因為我的電腦作業系統是Windows,所以就去這個地方下載,如果使用Mac可以透過Homebrew來安裝,在安裝的過程中記得順便連他提供的Developer Tools一起安裝,因為他裡面提供許多好用的工具,安裝好後記得把他安裝的路徑設在系統的Path環境變數中,這樣可以在command line輸入geth來執行他,安裝好且設定好環境變數後,可以在command line輸入以下指令看是否完成安裝:
$ geth --version
如果安裝成功,會跳出你所安裝的版本,而我這次使用的版本是1.13.2版。
確定安裝好後,就可以開始建立自己的私有鏈了,要建立私有鏈之前要先建立一個資料夾,這個資料夾是要用來放區塊鏈資料以及礦工資料的,我暫時稱這個資料夾名稱叫做「data」吧!在data資料夾裡面要先準備一個帳號,進入data的資料夾後,輸入以下指令:
/data$ geth --datadir ./ account new
輸入完後,他會要你設定一組密碼,設定完後,會要你再次輸入,檢驗成功後,螢幕上會出現剛剛新增的帳戶的地址,記得把他記下來,同時也把你設定的密碼也給記下來。
設定好後,會發現在data資料夾中,多出一個名叫keystore的資料夾,這樣我們要準備的礦工帳號就準備好了,回到data資料夾的 上一層 ,我們要設定一個區塊鏈的初始區塊,也就是第一個區塊,要先準備一個json檔,裡面存放著初始區塊的資訊,我把他叫做genesis.json,他的內容如下:
{
"config": {
"chainId": 12345,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"clique": {
"period": 5,
"epoch": 30000
}
},
"difficulty": "1",
"gasLimit": "8000000",
"extradata": "0x0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"alloc": {
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": {
"balance": "1000"
}
}
}
我這邊是用PoA做示範,因為使用這種方式不太佔效能,裡面要注意的是以下幾點:
設定好這個genesis.json檔案後,可以打以下指令:
$ geth --datadir data init genesis.json
注意打這個指令的時候要在data資料夾的外面,且跟genesis.json同層,打完這個指令後,可以發現data資料夾裡面多出了一個名叫「geth」的資料夾,這個資料夾裡面便放有區塊鏈區塊的資料。
有了初始區塊過後,就可以開始跑我們的區塊鏈了,這時候在同一層資料夾裡面輸入以下指令:
$ geth --datadir data --networkid 12345 --http --http.addr "127.0.0.1" --http.port "8000" --http.corsdomain "*" --http.api "eth,net,web3,personal,admin" --nodiscover --unlock 0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --allow-insecure-unlock console
可以發現這時候呼叫geth有多帶幾個參數,以下便是那幾個參數的意思:
基本上輸入指令以及打完密碼後,就會發現進入區塊鏈的command了!
而要讓區塊鏈增加區塊或者使自己的交易能夠上鏈,這時候就需要有礦工來挖礦,因為剛剛已經解鎖了礦工帳號,所以可以在裡面輸入以下指令:
> eth.accounts
這個可以用來確認是否有把礦工帳戶加進來,如果是空的那需要再另外加,但如果剛開始有打unlock,就會有帳戶,除此之外,還需要輸入以下指令:
> miner.setEtherbase("0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
來將礦工帳戶加入etherbase才行,這邊的xx就是礦工的地址,輸入完後可以輸入以下指令來進行確認:
> eth.coinbase
等到一切就緒過後,就可以輸入以下指令:
> miner.start()
輸入完之後,礦工就會開始挖礦,區塊長度便會開始增加,在這條鏈上的交易都會被打包進區塊鏈中,而我們就算完成了一條自己的私有鏈,之後可以透過RPC打當初設定的地址以及PORT對這條鏈進行操作,至於能進行什麼樣的操作呢?就等到明天再繼續談了,而接下來將要開始寫程式的內容了!