iT邦幫忙

2023 iThome 鐵人賽

DAY 24
1
Web 3

淺談ZK Rollup系列 第 24

Day 24 - ZK Rollup SP01: Geth私有鏈

  • 分享至 

  • xImage
  •  

昨天講了ZK Rollup常見的架構,還不太清楚的可以點這邊觀看,而今天開始要來實作出一個小型的ZK Rollup。

測試鏈

而在開發之前,我們應該先要有一條區塊鏈才對,畢竟開發這種東西,總是需要測試吧!如果直接在以太坊上直接開發的話,成本會非常高,所以通常來說開發這種項目的時候,都會開發在測試鏈上,以現在我撰寫這篇文章的時間點來看,以太坊比較著名的測試鏈有兩條,分別是Goerli跟Sepolia,但是通常在開發鏈上程式的時候,要測試也不會從測試鏈開始,主要原因是因為測試鏈上的資訊是公開的,所以你在鏈上做的一舉一動都會被看到,除此之外,因為測試鏈也是要等到礦工成功把你的交易包進區塊,交易才算完成,所以如果是用測試鏈進行測試,在這過程中也會需要耗費不少時間,所以一般來說在開發鏈上程式的時候,都會使用私有鏈,就是自己建一條自己的私有鏈出來,我們可以設定私有鏈的出塊速度以及礦工數量,這樣可以快速將我們的交易上鏈,而且因為是私有的關係,我們做的任何交易都不會公開,因此在開發之前要先有一條自己的私有鏈才行,在這邊我使用的是Go-ethereum提供的功能,大家也可以根據自己的習慣使用自己的測試鏈。

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做示範,因為使用這種方式不太佔效能,裡面要注意的是以下幾點:

  • chainId
    • 每個區塊鏈都會有自己的chainId,通常就是自己設定,而以太坊主網的chainId為1。
  • difficulty
    • 挖礦難度,愈高則出塊速度愈慢
  • gasLimit
    • 一次交易的gas上限,防止有人操作錯誤,不小心一次交易花過多手續費。
  • extradata
    • 這邊是要提供礦工的簽章,裡面的xx代表的是一剛開始設定的礦工地址。
  • alloc
    • 可以設定最初哪幾個帳號擁有多少錢,而這裡balance的單位是wei,可以設定一剛開始礦工有多少錢,也可以把自己創的其他帳號地址加進來,使自己有多一點錢可以進行交易。

設定好這個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有多帶幾個參數,以下便是那幾個參數的意思:

  • datadir
    • 要將區塊儲存在哪個資料夾
  • networkid
    • 這邊要帶入的是原本初始區塊設定的chainId
  • http
    • 我需要開啟RPC功能,要讓我的程式連的進來,來對區塊鏈進行交易、搜尋等功能,而這裡需要設定http的地址、開啟的port、允許使用人的domain跟允許使用的api,我這裡暫且將他設定成在8000的port,所有人都可以來使用,使用的功能有eth、net、web3、personal跟admin,當然這邊可以根據你們所需要做一定程度的調整
  • nodiscover
    • 不公開這條區塊鏈
  • unlock
    • 這邊是要解鎖在裡面使用礦工的帳號,後面接的是礦工的地址,這是為了之後要在上面挖礦所準備的,如果有輸入這個,在輸入指令之後,會要你輸入當初設定這個帳戶的密碼,記得不要打錯!
  • console
    • 打開區塊鏈的command line

基本上輸入指令以及打完密碼後,就會發現進入區塊鏈的command了!


而要讓區塊鏈增加區塊或者使自己的交易能夠上鏈,這時候就需要有礦工來挖礦,因為剛剛已經解鎖了礦工帳號,所以可以在裡面輸入以下指令:

> eth.accounts

這個可以用來確認是否有把礦工帳戶加進來,如果是空的那需要再另外加,但如果剛開始有打unlock,就會有帳戶,除此之外,還需要輸入以下指令:

> miner.setEtherbase("0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")

來將礦工帳戶加入etherbase才行,這邊的xx就是礦工的地址,輸入完後可以輸入以下指令來進行確認:

> eth.coinbase

等到一切就緒過後,就可以輸入以下指令:

> miner.start()

輸入完之後,礦工就會開始挖礦,區塊長度便會開始增加,在這條鏈上的交易都會被打包進區塊鏈中,而我們就算完成了一條自己的私有鏈,之後可以透過RPC打當初設定的地址以及PORT對這條鏈進行操作,至於能進行什麼樣的操作呢?就等到明天再繼續談了,而接下來將要開始寫程式的內容了!


上一篇
Day 23 - ZK Rollup EP01:架構
下一篇
Day 25 - ZK Rollup SP02: Geth基本操作(交易)
系列文
淺談ZK Rollup30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
雷N
iT邦研究生 1 級 ‧ 2023-10-10 00:26:57

水拉, nodiscover看到這個我眼睛發亮
應該就是服務發現跟註冊用的XD

我要留言

立即登入留言