搭建乙太坊私有鏈
乙太坊網路是一個公有鏈,在上面部署智能合約與調用都需要消耗乙太幣,因此可以先自行搭建一個本地端的乙太坊私有鏈,去測試與開發智能合約。
安裝Geth
Ethereum Go語言的客戶端為geth,下載網址https://geth.ethereum.org/downloads/,根據你的作業系統下載相應的檔案解壓縮/安裝。當然,也可以自行去go-Ethereum Github網站下載原始碼自行編譯。安裝完成後會有一個geth執行檔,那就是Ethereum的客戶端。
連上乙太坊主網路Main Network
要快速進入主網路,輸入以下指令
geth --fast --cache=512 console
- –fast:不需要下載所有的區塊鏈資料,節省CPU資源與時間
- –cache=512:不用用超過512MB的快取資源
- console:開啟Javascript互動式指令介面
執行後出現以下介面,可以看到右上角console的ChainID:1,代表成功進入Ethereum主網路 在這介面我們就可以創建帳戶與挖礦,這些指令稍後介紹
建立私有鏈
因為主網路一舉一動都要花錢,所以我們來創造一個私有鏈。在乙太坊區塊鏈中,最一開始需要生成一個創始區塊,裡面定義之後區塊的基本限制。同一網路中,創始區塊必須一樣才可以連通。現在我們來設定創始塊的參數,請在跟geth.exe同一個資料夾內新增一個genesis.json
{
"config": {
"chainId": 394,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "0x4000",
"gasLimit": "0xffffffff",
"alloc": {}
}
- chainId:1為主網路,2為測試網路,不要設定為這兩個就好
- homesteadBlock:創始區塊,設定為0
- eip155Block:創始區塊,設定為0
- eip158Block:創始區塊,設定為0
- difficult:挖礦難度,因為我們是私有鏈,不用設定很大,區塊生成會比較快也比較不吃資源
- gasLimit:跟智能合約可以跑的大小有關,因為是私有鏈自己測試,這裡填上最大
- alloc:設定預設帳號與餘額,因為是私有鏈挖礦很簡單,不需要先設定,填空白即可
設定完後執行以下指令,就會生成創始區塊,之後的區塊資料也會都存在此目錄
geth --datadir "\eth-chain-data" init genesis.json
接下來就可以啟動geth,輸入以下指令,會看到與上面進入主網路時一樣的介面。
geth --identity "Magica's testnet" --rpc --rpccorsdomain "*" --datadir "\eth-chain-data" --port "30303" --rpcapi "db,eth,net,web3" --networkid 394 console
- –identity:隨便寫,用於標註網路
- –rpc:開啟rpc通信,用於進行智能合約部署測試
- –rpccorsdomain:用於設定rpc通訊限制,只有允許的domain可以連接,這裡設定所有”*”
- –datadir:區塊鏈資訊存放資料夾
- –port:開啟節點與節點間的通訊端口,視電腦設定
- –rpcapi:允許的rpc指令,這邊設定db,eth,net,web3
- –networkid:設定網路ID,1為主網路,2為測試網路,其他都可以設定
- console:開啟Javascript互動式指令介面
指令
因為我們沒有設定預設帳號,所以就先來創建帳號,geth會幫你生成公鑰地址與私鑰存放在eth-chain-data/keystore。下以下指令新增帳號
personal.newAccount()
輸入密碼兩次後,會回傳給你公鑰地址,那就是你要別人傳乙太幣給你的地址。因為我們沒有預設礦工帳號,所以第一個創建帳號會成為礦工帳號coinbase,也就是本機此節點挖礦會獎勵的地址。
# 開始挖礦(數字為多少執行序)
miner.start(1)
#停止挖礦
miner.stop()
開始挖礦後會看到console一直跳,下stop停止後,查看地址餘額與設定礦工地址用以下指令
# 查看餘額
eth.getBalance(eth.accounts[0]).toNumber()
eth.getBalance(eth.coinbase).toNumber()
# 設定本機礦工地址(預設eth.accounts[0])
miner.setEtherbase(eth.accounts[1])
更多指令可以參考https://github.com/ethereum/go-ethereum/wiki/Management-APIs
加入節點
假如兩個節點想要互相加入,則首先兩個節點創建的genesis.json必須一致,啟動geth console的networkid也必須一致。兩邊都成功啟動之後,在其中一個節點的console端輸入以下指令
admin.nodeInfo
會看到下圖 把紅線地方複製下來,並在另一台節點上輸入以下指令
# 括弧裡面換成上圖紅線處,並把[::]那裡換成你第一台電腦節點的ip
admin.addPeer("enode://e8433884615ea51440ed11270e71eb0f0d7eccf80aed1b99afff0bbc5f78264325db289231d8d0e0c1656e6eb21b6b6b5c0754576efb26fee6067f17b58cd082@0.0.0.0:30301")
# 查看是否加入成功
admin.peers()
如果加入成功,兩邊可以互相看到彼此節點的資訊,如下圖 之後你可以兩邊都開始挖礦,看看哪台電腦比較厲害了。