1、以太坊客戶端:
- go-ethereum
語言:Go
簡介:官方推薦,開發使用最多
地址:https://github.com/ethereum/go-ethereum
還有其他類型的客戶端,有興趣的可以了解一下。
2、Geth客戶端安裝(Linux)
如果安裝在linux上,想要使用metamask錢包連接私鏈,為了安全起見,metamask提供以localhost連接,所以最好是安裝在有圖形化界面的linux系統,然后安裝google瀏覽器,安裝metamask插件,添加私有網絡然后連接。
前提:linux上有git環境,Go環境
- 安裝Go環境
- 下載Go的軟件包go1.16.3.linux-amd64.tar.gz,上傳到linux,(在/usr/local/ether/go目錄下)
下載地址:https://golang.org/dl/或者https://golang.google.cn/dl/
- 解壓縮包,解壓完后會出現一個go文件夾
tar -xzf go1.16.3.linux-amd64.tar.gz
- 將 /usr/local/ether/go//go/bin 目錄添加至PATH環境變量:
export PATH=$PATH:/usr/local/ether/go/go/bin
- 使用go version檢查是否配合成功
2.1、安裝Geth客戶端(以太坊節點)
(1)在linux上初始化一個倉庫
git init
(2)克隆github上的go-ethereum倉庫
git clone https://github.com/ethereum/go-ethereum.git
直接下載:https://geth.ethereum.org/downloads/# geth壓縮包
(3)Go客戶端叫做Geth,進入代碼目錄,編譯克隆下的代碼
make geth
- 如果出現如下錯誤:
修改build目錄下的env.sh文件格式為unix,原來為dos
vi編輯文件,然后輸入命令查看文件格式
set ff?
命令:set ff=dos #強制轉化為dos格式,如果是要轉化成unix格式就是 set ff=unix
保存: w!
- 如果出現如下錯誤:
設置使用過國內的代理地址
go env -w GOPROXY=https://goproxy.cn
然后重新執行make geth
(4)查看geth的版本
./build/bin/geth version
stable:穩定的版本
(5)啟動區塊鏈,指定數據目錄為當前的data文件夾(可以不指定),啟動后就會一直同步區塊鏈上的數據,大概90G以上,同步完成后然后就可以參與挖礦。
./build/bin/geth --datadir ./data
可以使用--syncmode "fast"設置同步數據的模式為快速同步,不驗證區塊中的交易,只下載每個區塊頭和區塊體,直到區塊同步完成再獲取區塊鏈當前的狀態,還有full模式和light模式,full是所有的區塊下載並驗證,light不下載區塊,只獲取最新的區塊鏈狀態。
2.2、搭建私有鏈
geth目錄為:/usr/local/ether/go-ether/go-ethereum/build/bin/geth
privateChain目錄創建在ether下:/usr/local/ether/go-ether/privateChain
genesis.json文件放入:/usr/local/ether/go-ether/privateChain目錄下
官方文檔說明地址:https://geth.ethereum.org/docs/interface/private-network 包含搭建多個節點互相連接的私鏈
(1)創建一個文件夾用來存放私有鏈的數據,並進入
mkdir privateChain
cd privateChain
(2)創建創世紀塊(私鏈的第一個區塊),編輯文本genesis.json,寫入官方提供的創世區塊,默認會分給alloc中的地址以太幣,可以替換為自己的以太坊地址。
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"ethash": {}
},
"difficulty": "2000",
"gasLimit": "8000000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}
difficulty:挖礦難度,控制礦工的挖礦時間
gasLimit:一個區塊內最大的Gas費,單個塊中可以進行的EVM計算量,可以在啟動后使用--miner.gastarget
命令行標志來調整塊Gas費限制。
chainId:網絡ID是一個整數,用於隔離以太坊對等網絡。僅當兩個對等方都使用相同的創世塊和網絡ID時,區塊鏈節點之間的連接才會發生。使用--networkid
命令行選項設置geth使用的網絡ID。主網絡的ID為1。如果自定義網絡ID與主網絡不同,則節點將不會連接到其他節點並形成專用網絡。如果打算連接到Internet上的專用鏈,則最好選擇一個尚未使用的網絡ID。可以在https://chainid.network上找到由社區運營的以太坊網絡ChainId
alloc:初始分配ether(alloc
)。這決定在創世紀塊中列出的地址有多少以太幣可用。隨着鏈的發展,可以通過挖掘來創建額外的以太幣。
以下命令都在/usr/local/ether/go-ether/go-ethereum/目錄下執行
(3)初始化Geth數據庫
./build/bin/geth init --datadir ../privateChain ../privateChain/genesis.json
(4)啟動Geth,使用data下的自定義的創世紀塊,networkid與創世紀塊中的chainId保持一致,
-
啟動同時進入控制台,命令行加上console
-
啟動時,如果添加--dev參數,會創建開發者默認賬戶,並且分配給該賬戶一定的幣。
-
--dev.period 1:表示可以直接挖礦,不需要有交易產生,默認該參數為0,表示需要有交易產生才能挖到礦,為了測試直接修改為1。
-
可以添加--nodiscover就不會去尋找其他節點。
-
如果不希望控制台一直打印信息可以在console后面改變為:console 2>>geth.log
./build/bin/geth --datadir ../privateChain --networkid 15 --nodiscover --dev --dev.period 1 console 2>>geth.log
注意:以下圖片中在測試時啟動沒有直接以--dev方式啟動,就需要自己手動創建地址,然后再去挖礦,也出現了一些問題,都已解決,建議直接以上述命令啟動。如果沒有以--dev方式啟動,也沒關系,只是在測試挖礦時會有一點問題,文章的末尾列出了我遇到的一些問題以及解決辦法。
(6)控制台命令,首先使用web3查看內部的所有的方法
-
admin對象的方法,
查看所有節點:admin.peers
添加節點:admin.addPeer
獲取數據目錄:admin.getDatadir
獲取節點信息:admin.getNodeInfo
等。
- eth對象的方法
獲取私鏈所有賬戶 :eth.accounts
獲取gas單價:eth.gasPrice
獲取chainId:eth.chainId
獲取賬戶余額:eth.getBalance("地址")
等。
-
礦工挖礦
開始挖礦:miner.start()
停止挖礦:miner.stop()
設置GasPrice:miner.setGasPrice("")
其他對象可以輸入web3回車查看。
(7)例如
- 查看當前鏈上所有賬戶:
eth.accounts
- 查看初始區塊創建時賬戶默認分配的以太幣(genesis.json中配置的),單位是Wei
eth.getBalance("")
通過we3的fromWei方法轉為以太幣單位“ether”,只有0.000003個以太幣
- 當前區塊高度
eth.blockNumber
- 創建一個賬戶
personal.newAccount()
輸入賬戶密碼:123456,生成一個地址:
得到的地址就是:0xcd9dc4ee443a2d6bdc1355ac4f72d131f8c5a33b
然后查看私鏈上的賬戶:eth.accounts,就看到已經有了一個賬戶
查看數據存儲的位置:在privateChain目錄下:此時的keystore目錄下就產生了一個文件
文件內容為:
格式化后:
{
"address": "c63735581fc36429444cb58ce22ea7fb712c7860", //賬戶地址
"crypto": {
//加密算法
"cipher": "aes-128-ctr",
//加密內容
"ciphertext": "251424971692b3bef9dabaf0fac440882c7105dba4fb4e089e80b71cda8a58c4",
//加密的參數
"cipherparams": {
"iv": "54e8f0f8ae71d62b541bf923e5c4d495"
},
"kdf": "scrypt",
"kdfparams": {
"dklen": 32,
"n": 262144,
"p": 1,
"r": 8,
//加密使用的鹽
"salt": "609b7cc53db3ccd9ab0625601c5aa51600174be9113ab05c4ecd9737ebcdaeb8"
},
"mac": "361a8da722d73eab8d1e988a8b55adc85faef7d33c66bd0f03367cb496a395aa"
},
"id": "ae97aca0-b577-486a-9e1d-fd3890bdfe51",
"version": 3
}
- 此時使用初始的賬戶給創建的賬戶轉賬,如果是在控制台操作賬戶,可以使用eth.accounts[0],來代表第0個賬戶
eth.sendTransaction({from:"0xf98D275eF33f54AA311E3cA353Db53Fc1577cB31",to:eth.accounts[0],value:200000})
顯示未知的賬戶,這是因為發送交易時必須是自己管理的賬戶才能發,類似於當前這兩個賬戶不在同一個錢包下,無法轉賬。from的初始地址不在私鏈中,不是由私鏈管理的。
如果使用自己剛才創建的賬戶去發送呢?把它兩調換一下,
eth.sendTransaction({from:eth.accounts[0],to:"0xf98D275eF33f54AA311E3cA353Db53Fc1577cB31",value:200000})
這里提示的是轉賬資金不足,這是正確的,因為該賬戶剛創建出來,沒有以太幣,說明由私鏈管理的賬戶是可以轉賬的。
如果出現需要解鎖賬戶,使用如下命令:
personal.unlockAccount("地址")
- 如果需要挖礦
查看當前的賬戶地址:
eth.coinbase
注意:如果啟動時添加了--dev參數
新版本默認挖礦時,新加了一個參數,挖礦是在有交易時才能挖到礦,如果沒有交易產生直接去挖礦,是挖不到礦的,需要添加兩個參數--dev --dev.period 1,重新啟動:
./build/bin/geth --datadir ../privateChain --networkid 15 --nodiscover --dev --dev.period 1 console
開始挖礦:
miner.start(1)
挖到礦后會顯示如下:
停止挖礦:
miner.stop()
我在停止挖礦時,一直停不下來,只能退出重啟。最好還是把控制台日志信息打印到文件中(使用console 2>>geth.log)。
列出我在搭建時遇到的一些問題:
(1)使用miner.start(1)啟動時,控制台返回null,而且挖不到礦,百度了很多后都說是新版本添加“--dev.period 1”這個參數,官方文檔對這個參數也有說明,默認參數值為0,挖礦時要有交易產生才可以挖礦,修改為其他值,例如1表示挖礦時不需要有交易產生。添加了之后發現返回還是null,不過多等了一會后,發現挖到礦了。
./build/bin/geth --datadir ../privateChain --networkid 15 --nodiscover --dev --dev.period 1 console
(2)如果啟動時沒有添加--dev參數,使用自己手動創建的賬戶開始挖礦,需要重啟添加上”--dev --dev.period 1“這兩個參數,如果出現如下圖所示出錯:
這是因為啟用開發者模式發現已經有賬戶了,就不會去新創建賬戶,會默認使用創建的第0個賬戶,作為開發者賬戶。為了安全起見,啟動時需要告訴客戶端該賬戶的密碼,如果是在第一次啟動,就以dev模式啟動,會默認創建一個賬戶作為開發者賬戶也就是第0個賬戶,並分配以太幣。
添加參數--password,將創建的第0個賬戶的密碼放入txt文件,加載
./build/bin/geth --datadir ../privateChain --networkid 15 --nodiscover --dev --dev.period 1 --password '../privateChain/password.txt' console 2>>geth.log
3、Geth客戶端安裝(Windows)
2.1、下載Geth客戶端文件
官方網址:https://geth.ethereum.org/downloads/
2.2、雙擊安裝,安裝完成后,會出現如下列表(geth.log除外):
2.3、搭建私有鏈與linux相同
- 創建一個文件夾,作為私有鏈的數據文件夾(文件位置可以隨意),同時創建一個創世紀塊文件。
- cmd進入geth安裝目錄,初始化私有鏈,--datadir指向創建的存放數據的文件夾(根據自己的數據文件地址為准)。
geth init --datadir ../privateChain ../privateChain/genesis.json
- 啟動即可:
geth --datadir mychain --networkid 15 --nodiscover --dev --dev.period 1 --rpc console 2>>geth.log
--rpc參數表示啟動遠程rpc連接,此時就可以使用metamask連接私鏈。
如果描述有什么問題?歡迎留言提問,共同學習
2.3、Geth命令選項
官網命令文檔:https://geth.ethereum.org/docs/interface/command-line-options
以下命令原文鏈接:https://www.jianshu.com/p/d4cdc060b5c4
account 管理賬戶
attach 啟動交互式JavaScript環境(連接到節點)
bug 上報bug Issuesconsole 啟動交互式JavaScript環境
copydb 從文件夾創建本地鏈dump Dump(分析)一個特定的塊存儲
dumpconfig 顯示配置值
export 導出區塊鏈到文件import 導入一個區塊鏈文件init 啟動並初始化一個新的創世紀塊
js 執行指定的JavaScript文件(多個)
license 顯示許可信息
makecache 生成ethash驗證緩存(用於測試)
makedag 生成ethash 挖礦DAG(用於測試)
monitor 監控和可視化節點指標
removedb 刪除區塊鏈和狀態數據庫
version 打印版本號
wallet 管理Ethereum預售錢包
help,h 顯示一個命令或幫助一個命令列表
ETHEREUM選項:
--config value TOML 配置文件
--datadir “xxx” 數據庫和keystore密鑰的數據目錄
--keystore keystore存放目錄(默認在datadir內)
--nousb 禁用監控和管理USB硬件錢包
--networkid value 網絡標識符(整型, 1=Frontier, 2=Morden (棄用), 3=Ropsten, 4=Rinkeby) (默認: 1)
--testnet Ropsten網絡:預先配置的POW(proof-of-work)測試網絡
--rinkeby Rinkeby網絡: 預先配置的POA(proof-of-authority)測試網絡
--syncmode "fast" 同步模式 ("fast", "full", or "light")
--ethstats value 上報ethstats service URL (nodename:secret@host:port)
--identity value 自定義節點名
--lightserv value 允許LES請求時間最大百分比(0 – 90)(默認值:0)
--lightpeers value 最大LES client peers數量(默認值:20)
--lightkdf 在KDF強度消費時降低key-derivation RAM&CPU使用
開發者(模式)選項:
--dev 使用POA共識網絡,默認預分配一個開發者賬戶並且會自動開啟挖礦。
--dev.period value 開發者模式下挖礦周期 (0 = 僅在交易時) (默認: 0)
ETHASH 選項:
--ethash.cachedir ethash驗證緩存目錄(默認 = datadir目錄內)
--ethash.cachesinmem value 在內存保存的最近的ethash緩存個數 (每個緩存16MB ) (默認: 2)
--ethash.cachesondisk value 在磁盤保存的最近的ethash緩存個數 (每個緩存16MB) (默認: 3)
--ethash.dagdir "" 存ethash DAGs目錄 (默認 = 用戶hom目錄)
--ethash.dagsinmem value 在內存保存的最近的ethash DAGs 個數 (每個1GB以上) (默認: 1)
--ethash.dagsondisk value 在磁盤保存的最近的ethash DAGs 個數 (每個1GB以上) (默認: 2)
交易池選項:
--txpool.nolocals為本地提交交易禁用價格豁免
--txpool.journalvalue本地交易的磁盤日志:用於節點重啟 (默認: "transactions.rlp")
--txpool.rejournalvalue重新生成本地交易日志的時間間隔 (默認: 1小時)
--txpool.pricelimitvalue加入交易池的最小的gas價格限制(默認: 1)
--txpool.pricebumpvalue價格波動百分比(相對之前已有交易) (默認: 10)
--txpool.accountslotsvalue每個帳戶保證可執行的最少交易槽數量 (默認: 16)-
-txpool.globalslotsvalue所有帳戶可執行的最大交易槽數量 (默認: 4096)
--txpool.accountqueuevalue每個帳戶允許的最多非可執行交易槽數量 (默認: 64)
--txpool.globalqueuevalue所有帳戶非可執行交易最大槽數量 (默認: 1024)
--txpool.lifetimevalue非可執行交易最大入隊時間(默認: 3小時)
性能調優的選項:
--cache value 分配給內部緩存的內存MB數量,緩存值(最低16mb /數據庫強制要求)(默認:128)
--trie-cache-gens value 保持在內存中產生的trie node數量(默認:120)
帳戶選項:
--unlock value需解鎖賬戶用逗號分隔
--password value用於非交互式密碼輸入的密碼文件
API和控制台選項:
--rpc 啟用HTTP-RPC服務器
--rpcaddr value HTTP-RPC服務器接口地址(默認值:“localhost”)
--rpcport value HTTP-RPC服務器監聽端口(默認值:8545)
--rpcapi value 基於HTTP-RPC接口提供的API
--ws 啟用WS-RPC服務器
--wsaddr value WS-RPC服務器監聽接口地址(默認值:“localhost”)
--wsport value WS-RPC服務器監聽端口(默認值:8546)
--wsapi value 基於WS-RPC的接口提供的API
--wsorigins value websockets請求允許的源
--ipcdisable 禁用IPC-RPC服務器
--ipcpath 包含在datadir里的IPC socket/pipe文件名(轉義過的顯式路徑)
--rpccorsdomain value 允許跨域請求的域名列表(逗號分隔)(瀏覽器強制)
--jspath loadScript JavaScript加載腳本的根路徑(默認值:“.”)
--exec value 執行JavaScript語句(只能結合console/attach使用)
--preload value 預加載到控制台的JavaScript文件列表(逗號分隔)
網絡選項:
--bootnodes value 用於P2P發現引導的enode urls(逗號分隔)(對於light servers用v4+v5代替)
--bootnodesv4 value 用於P2P v4發現引導的enode urls(逗號分隔)(light server, 全節點)
--bootnodesv5 value 用於P2P v5發現引導的enode urls(逗號分隔)(light server, 輕節點)
--port value 網卡監聽端口(默認值:30303)
--maxpeers value 最大的網絡節點數量(如果設置為0,網絡將被禁用)(默認值:25)
--maxpendpeers value 最大嘗試連接的數量(如果設置為0,則將使用默認值)(默認值:0)
--nat value NAT端口映射機制(any|none|upnp|pmp|extip:)(默認: “any”)
--nodiscover 禁用節點發現機制(手動添加節點),私鏈可以啟動不被其他節點發現,只能手動添加節點
--v5disc 啟用實驗性的RLPx V5(Topic發現)機制
--nodekey value P2P節點密鑰文件
--nodekeyhex value 十六進制的P2P節點密鑰(用於測試)
礦工選項:
--mine 打開挖礦
--minerthreads value 挖礦使用的CPU線程數量(默認值:8)
--etherbase value 挖礦獎勵地址(默認=第一個創建的帳戶)(默認值:“0”)
--targetgaslimit value 目標gas限制:設置最低gas限制(低於這個不會被挖?) (默認值:“4712388”)
--gasprice value 挖礦接受交易的最低gas價格-
-extradata value 礦工設置的額外塊數據(默認=client version)
GAS價格選項:
--gpoblocks value 用於檢查gas價格的最近塊的個數 (默認:10)
--gpopercentile value 建議gas價參考最近交易的gas價的百分位數,(默認:50)
虛擬機的選項:
--vmdebug 記錄VM及合約調試信息
日志和調試選項:
--metrics 啟用metrics收集和報告
--fakepow 禁用proof-of-work驗證
--verbosity value 日志詳細度:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)
--vmodule value 每個模塊詳細度:以 =的逗號分隔列表 (比如 eth/*=6,p2p=5)
--backtrace value 請求特定日志記錄堆棧跟蹤 (比如 “block.go:271”)
--debug 突出顯示調用位置日志(文件名及行號)
--pprof 啟用pprof HTTP服務器
--pprofaddr value pprof HTTP服務器監聽接口(默認值:127.0.0.1)
--pprofport value pprof HTTP服務器監聽端口(默認值:6060)
--memprofilerate value 按指定頻率打開memory profiling (默認:524288)
--blockprofilerate value 按指定頻率打開block profiling (默認值:0)
--cpuprofile value 將CPU profile寫入指定文件
--trace value 將execution trace寫入指定文件