ethereum(Geth)

Ethereum Geth (go-ethereum) 教學

簡介

Geth 為 ethereum的Go語言實現

https://geth.ethereum.org/

安裝

[2024/2 更新]

查看此連結:https://geth.ethereum.org/docs/getting-started/installing-geth

https://geth.ethereum.org/downloads/

git clone https://github.com/ethereum/go-ethereum

sudo apt-get update

sudo apt-get install -y build-essential golang

cd go-ethereum

make geth

Mac

Arm embeded system

http://ethembedded.com/?page_id=171

使用

https://github.com/ethereum/go-ethereum/wiki/geth

如果是從source安裝(或可加入環境變數)

如果是從安裝檔可直接輸入

可用命令 https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

1.創建創世區塊(genesis block)

custom_genesis.json

然後輸入

上面將會創建一個privatechain資料夾,裡面存放我們private chain的資訊,genesis blcok會放在/privatechain資料夾/geth/chaindata/...ldb,而account會放在keystore裡面

(如果是1.6之前版本要改為如下)

如果出現Fatal: invalid genesis file: json: cannot unmarshal hex string of odd length into Go struct field Genesis.extraData of type hexutil.Bytes 為版本>1.6 請參考上面

https://ethereum.stackexchange.com/questions/15283/getting-error-on-max-invalid-genesis-file-hex-string-has-odd-length

然後輸入以下,之後開啟Mist wallet就會進入private network

上面要寫上--ipcpath原因是我們指定了datadir

以下為各os路徑 後面記得加geth.ipc

Mac

~/Library/Ethereum/

Linux

~/.ethereum/

Windows

~/AppData/Roaming/Ethereum

方法2

也可使用下面產生private network

這樣打開錢包也可進入private network

如果出現錯誤:Fatal: Failed to write genesis block: database already contains an incompatible genesis block

把路徑下的chaindata資料夾刪除即可 ~/Library/Ethereum/geth/chaindata

2.預先分配ether給account

先把剛才的節點啟動

然後打開Mist錢包後先創建帳戶,然後把帳戶號碼複製,之後貼到剛才genesis的alloc下面的一串hash,然後重新init 即可

每次init genesis chaindata資料夾下都會多一個ldb但他會去讀取最新的

有時上面訊息有Success 但下面又有Fatal可以不用理會

之後再次啟動

點選Mist圖案打開錢包即可看到帳戶餘額增加

試著挖礦

打開另一個termianl輸入以下,進入console

或是可在剛才啟動ethereum後面加上console字樣,而geth attach預設只會找ipc不會找rpc

可在mist新增地址或是在console輸入personal.newAccount("密碼") 加入挖礦要放錢的地址

開始挖礦(需稍等)

(目前新版1.6有可能卡在dag產生完後)

停止

3.加入其他節點

https://github.com/ethereum/go-ethereum/wiki/Setting-up-private-network-or-local-cluster

https://github.com/ethereum/go-ethereum/wiki/Connecting-to-the-network#connecting-to-the-network

1.用RPC,記得要使用--rpc

2.每個節點要使用同一個創世區塊,才能找到彼此,我們先輸入如下指令,分別創建兩個節點的資料夾,並且用同一個genesis.json個別於兩資料夾產生相同創世區塊

先把剛privatechain資料夾刪除,重新創建一個./privatechain/src 然後裡面放入剛才的custom_genesis.json

3.再來分別啟動兩個節點(networkid要相同,而--rpcport--port要不同)

4.之後於01節點的console輸入

enode部分複製

5.於02節點輸入

6.之後於兩個節點分別輸入admin.peers即可找到彼此

注意 1. 我們沒有設預設bootnode所以要手動加入 2. 如果有三個節點ABC,A加入B之後,A再加入C 這時B仍然找不到C要B主動加入C才可 3. 一開始沒有加入peers時會發現有時輸入admin.peers會出現有時沒有,原因是在連線到任何peers時他會試著去連接其他網路上的節點 4. 節點互相找不到的原因通常為你沒有輸入init genesis.json,所以兩個節點間的genesis.json不相同以及沒有輸入--nodiscover 所以他會加上網路上其他相同genesis和networkid的陌生人 5. 重新啟動某節點該節點的peer會斷掉,要重新加入

7.測試RPC-JSON server

之後錢包連線會使用

成功會出現下圖

8.這時開啟Mist要設定錢包要連線到哪個位置,所以這次我們不能直接點選圖案開啟,要使用命令列開啟,並加上--rpc <PORT>

(你可能直接從圖案開啟應用程式,也看到他有開啟時有顯示private net,但其實他還是連到MainNet)

OSX

Windows

# 1.6新增之puppeth CLI可用來產生genesis_block

1.記得先產生account

2.直接在terminal輸入 `puppeth` 之後會出現如下圖

然後造著步驟走即可,最後會產生一個創世.json

但要記得如果共識方法選的是Poa,之後其他節點要挖礦會產生

記得要

clique指令只有POA才有

注意事項

1.

注意:每次從terminal啟動其他ethereum程序後開啟錢包,如果你沒有指定RPC 或IPC port,錢包都只會去讀取最新開啟的terminal的程序

2.

如果進入到錢包,但是testnet與main都無法點選,表示你嘗試進入到private network但是參數沒有下成功

3.

每個 -- 參數都要和前面空一格,否則無效

4

windows作業系統的terminal如果不好複製,可以使用git bash

5.

節點互相找不到的原因通常為你沒有輸入init genesis.json,所以兩個節點間的genesis.json不相同以及沒有輸入--nodiscover 所以他會加上網路上其他相同genesis和networkid的陌生人

6.

32位元版本的geth無法挖礦,需下載64位元

https://github.com/ethereum/go-ethereum/issues/14633

  1. 兩節點加入後新加入節點不用挖礦就會自動同步,但如果有產生合約或是廣播交易網路上的其中一個節點必須挖礦

使用DEV Chain

不用自己init genesis block 和指定datadir 以及自動幫你配好一些參數 可直接啟動私有鏈

開放Remote 連線

https://ethereum.stackexchange.com/questions/3163/how-can-i-expose-geths-rpc-server-to-external-connections

設定Bootnode

以為步驟

之後資料夾下會產一個bootnode.key檔案

然後輸入

會產生如下

之後我們開啟terminal輸入以下啟動節點

> 記得--nodiscover要拿掉 然後--bootnodes後面填上剛才出現的enode:

並且把enode[::]換成ip地址

bootnode本身不算是節點 只啟動下面一個時在admin.peers還是空的

之後在其中一個terminal輸入`admin.peers`

即可看到如下

Geth版本升級

之後會顯示geth安裝路徑

然後下載https://geth.ethereum.org/downloads/ 最新版本後在安裝時覆蓋原本路徑即可。

Last updated

Was this helpful?