前言
本篇文章簡單介紹使用go-ethereum連接以太坊的主網(wǎng)和測試網(wǎng)以及一些基礎(chǔ)開發(fā)須知,著重介紹如何搭建一個私網(wǎng)的以太坊单匣,至于以太坊應(yīng)用開發(fā)伍纫,有機(jī)會的話,將在后面的文章中重點(diǎn)介紹插爹。
本篇文章中包含筆者花費(fèi)大量心血理解并整理的配置和參數(shù)說明資料,望可以為諸位道友提供一些幫助。
安裝
Go Ethereum可以安裝的操作系統(tǒng)平臺有Mac OS X赠尾,Windows以及Linux/Unix力穗。詳情請看Installation Instructions。
這里介紹在Linux上气嫁,從go-ethereum源碼構(gòu)建的安裝流程当窗。官方提到的Linux/Unix平臺包括Ubuntu,Arch和FreeBSD寸宵。這里以Ubuntu為例崖面。
編譯環(huán)境準(zhǔn)備
編譯環(huán)境要求有 Go 和 C編譯程序。安裝方法如下:
apt-get install -y build-essential golang
獲取源碼并編譯
獲取源碼
切換到你準(zhǔn)備編譯go-ethereum源碼的目錄邓馒,執(zhí)行命令:
git clone https://github.com/ethereum/go-ethereum
上述命令會clone go-ethereum的主干分支代碼嘶朱,該分支代碼是持續(xù)開發(fā)代碼,如果想要使用發(fā)布代碼光酣,參見go-ethereum release。這里以當(dāng)時最新的發(fā)布代碼 v1.8.7 為例:
- 下載代碼
wget https://github.com/ethereum/go-ethereum/archive/v1.8.7.tar.gz
- 解壓
tar zxvf v1.8.7.tar.gz
將解壓后的代碼移動到你準(zhǔn)備編譯go-ethereum源碼的目錄脉课。
編譯源碼
當(dāng)你準(zhǔn)備好go-ethereum的源碼后救军,進(jìn)入go-ethereum源碼工程頂級目錄,執(zhí)行命令:
make geth
(推薦)如果你想要編譯出所有工具倘零,執(zhí)行:
make all
編譯完成后唱遭,所有工具可以在 build/bin 目錄下找到,將這些二進(jìn)制文件取出來放到你選好的安裝目錄呈驶,或者就在原來的位置放著拷泽,這里我放到 /opt/xingweidong/eth/bin 目錄下,接下來根據(jù)你的喜好設(shè)置系統(tǒng)環(huán)境變量袖瞻,添加如下內(nèi)容:
export ETH_HOME=/opt/xingweidong/eth
export PATH=$PATH:$ETH_HOME/bin
別忘了使用 source /etc/profile 或者其他你喜歡的方法更新你的環(huán)境變量信息司致。
運(yùn)行g(shù)eth
geth命令,主要的Ethereum CLI客戶端聋迎,是Ethereum網(wǎng)(main-, test- 或 private網(wǎng))的入口脂矫,有能力作為一個full node(默認(rèn))存檔節(jié)點(diǎn)(保留所有歷史數(shù)據(jù))或者一個light node(現(xiàn)場檢索數(shù)據(jù))節(jié)點(diǎn)運(yùn)行。經(jīng)由暴露在HTTP, WebSocket 或 IPC傳輸?shù)捻敳康腏SON RPC端點(diǎn)霉晕,它可以被其他過程用作Ethereum網(wǎng)的網(wǎng)關(guān)庭再。
提示:查看 geth 所有命令行選項(xiàng)使用 geth --help 或者查看 CLI Wiki page。
Ethereum main網(wǎng)的full node
目前為止牺堰,大多數(shù)情況是人們想要簡單地與Ethereum網(wǎng)進(jìn)行交互:創(chuàng)建賬戶拄轻;轉(zhuǎn)移資金;部署并與合約交互伟葫。對于這種特殊的使用情況恨搓,用戶不關(guān)心以前的歷史數(shù)據(jù),所以我們能快速的同步當(dāng)前的Ethereum網(wǎng)狀態(tài)扒俯。執(zhí)行命令:
geth console
命令作用:
- 開始 geth 進(jìn)入快速同步模式(默認(rèn)模式奶卓,可以使用 --syncmode 選項(xiàng)改變同步模式)一疯,由于它為了避免處理整個Ethereum網(wǎng)的歷史數(shù)據(jù),會下載大量的事務(wù)數(shù)據(jù)夺姑,所以會占用大量CPU資源墩邀。
- 啟動 Geth 內(nèi)在的交互式 JavaScript console,(經(jīng)由 console 子命令)通過這個盏浙,你能調(diào)用所有官方 web3 methods 以及Geth自己的 management APIs眉睹。這個也是可選的,如果你離開废膘,你能使用 geth attach 連接一個已經(jīng)存在的 Geth 實(shí)例竹海。
Ethereum test網(wǎng)的full node
向開發(fā)者過渡,如果你想要創(chuàng)造合約丐黄,你幾乎肯定想要在沒有任何真實(shí)資金的情況下做到這一點(diǎn)斋配,直到你掌握整個系統(tǒng)。換句話說灌闺,代替連接到Ethereum main網(wǎng)艰争,你會想要加入到一個 test網(wǎng),它是和 main網(wǎng)完全等價(jià)的桂对,只需要:
geth --testnet console
console子命令與上面的含義完全相同并且它們在一個測試網(wǎng)上也同樣有用甩卓。如果你跳到這一步,請看上面對它們的解釋蕉斜。
然而逾柿,指定 --testnet 將重新配置你的 Geth 實(shí)例一小部分:
- 代替使用默認(rèn)數(shù)據(jù)目錄(例如Linux上的 ~/.ethereum),Geth將會深入一層目錄創(chuàng)建 testnet 子文件夾(在Linux上是 ~/.ethereum/testnet)宅此。注意机错,在OSX和Linux上,這也意味著連接一個運(yùn)行的testnet節(jié)點(diǎn)要求使用一個自定義的端點(diǎn)诽凌,因?yàn)?geth attach 默認(rèn)將連接一個生產(chǎn)節(jié)點(diǎn)毡熏。例如:geth attach <datadir>/testnet/geth.ipc。Windows用戶不受影響侣诵。
- 代替連接 Ethereum main網(wǎng)痢法,客戶端將連接到一個 test網(wǎng),使用不同的P2P bootnodes杜顺,不同的網(wǎng)絡(luò)ID和創(chuàng)世狀態(tài)财搁。
注意:盡管有一些內(nèi)部安全措施防止main網(wǎng)和test網(wǎng)的交易互換,你也應(yīng)該確認(rèn)總是為測試資產(chǎn)和真實(shí)資產(chǎn)使用分開的賬戶躬络。除非你手動移動賬戶尖奔,Geth將默認(rèn)正確分開兩個網(wǎng)絡(luò),并且在它們之間將不會有任何賬戶可用。
Rinkeby test網(wǎng)的full node
上述測試網(wǎng)絡(luò)是基于ethash工作證明共識算法的跨客戶端網(wǎng)絡(luò)提茁。因此淹禾,由于網(wǎng)絡(luò)的低難度/安全性,它有一定的額外開銷茴扁,并且更容易受到重組攻擊铃岔。Go Ethereum還支持連接到稱為Rinkeby的權(quán)威證明測試網(wǎng)絡(luò)(由社區(qū)成員運(yùn)營)。這個網(wǎng)絡(luò)更輕峭火,更安全毁习,但只受到go-ethereum的支持。
geth --rinkeby console
配置
代替?zhèn)鬟f大量選項(xiàng)給 geth 二進(jìn)制卖丸,你能傳遞一個配置文件經(jīng)由:
geth --config /path/to/your_config.toml
為了理解這個文件的寫法纺且,你能使用 dumpconfig 子命令export你的現(xiàn)有配置:
geth --your-favourite-flags dumpconfig
eg:geth --testnet dumpconfig
注意:這個只在 geth v1.6.0以及以上版本有效。
Docker quick start
通過使用Docker稍浆,你可以在你的機(jī)器上快速啟動Ethereum并運(yùn)行:
docker run -d --name ethereum-node -v /Users/alice/ethereum:/root \
-p 8545:8545 -p 30303:30303 \
ethereum/client-go
上述命令將以快速同步模式啟動geth载碌,并具有1GB的DB內(nèi)存容量。它也將在你的home目錄下創(chuàng)建一個永久卷來儲存你的區(qū)塊鏈和映射的默認(rèn)端口衅枫。還有一個 alpine 標(biāo)簽可用于image的精簡版本恐仑。
如果你想要從其他容器或主機(jī)訪問RPC,不要忘了 --rpcaddr 0.0.0.0为鳄。默認(rèn)情況下,geth 綁定本地接口并且不可從外訪問RPC端點(diǎn)腕让。
可編程接口 Geth nodes
作為一個開發(fā)者孤钦,你將想要及早開始經(jīng)由你自己的程序而不是手動控制臺與Geth和Ethereum網(wǎng)交互。為此纯丸,Geth已經(jīng)內(nèi)置支持一個基于APIs(standard APIs 和 Geth specific APIs)的JSON-RPC偏形。它能夠經(jīng)由HTTP, WebSockets 和 IPC (unix sockets on unix based platforms, and named pipes on Windows)暴露。
IPC接口默認(rèn)是激活的并暴露所有Geth支持的APIs觉鼻,然而HTTP 和 WS接口需要手動激活并且由于安全原因只能暴露一個APIs子集俊扭。這些可以根據(jù)你的需要打開或關(guān)閉并被配置。
詳情請看 Programatically interfacing Geth nodes
操作一個私網(wǎng)
維護(hù)你自己的私網(wǎng)是十分復(fù)雜的坠陈,因?yàn)樵谝粋€正規(guī)的網(wǎng)絡(luò)中萨惑,大量配置的獲取和授權(quán)需要手動設(shè)置。下面仇矾,我們建立一個簡單的私網(wǎng)以太坊庸蔼。
說明:為了使下面創(chuàng)建私網(wǎng)以太坊的步驟更加直白,筆者將默認(rèn)使用以下的geth選項(xiàng)值(請自行查看選項(xiàng)含義):
- --datadir /root/privatenet/.ethereum
- --config config/privatenet.toml
在開始之前贮匕,筆者先介紹一下如何創(chuàng)建以太坊賬戶:
- 創(chuàng)建主網(wǎng)以太坊賬戶姐仅,執(zhí)行命令:
geth account new
- 創(chuàng)建私網(wǎng)以太坊賬戶,執(zhí)行命令:
geth --datadir /root/privatenet/.ethereum account new
按照提示輸入賬戶密碼即可。
注意:創(chuàng)建私網(wǎng)以太坊賬戶時掏膏,務(wù)必指定 --datadir 選項(xiàng)劳翰,否則會默認(rèn)創(chuàng)建主網(wǎng)以太坊賬戶。
定義一個私有的創(chuàng)世狀態(tài)
首先馒疹,你需要創(chuàng)造你的網(wǎng)絡(luò)的所有節(jié)點(diǎn)需要意識到并同意的創(chuàng)世狀態(tài)佳簸。這個由一個小JSON文件組成(例如,稱它為 genesis.json):
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000001993",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
參數(shù)說明(下表是筆者參考go-ethereum源碼README和ethereum_yellow_paper整理所得行冰,如有錯誤溺蕉,請幫忙指正):
參數(shù) | 描述 |
---|---|
alloc | 可以預(yù)置賬號以及賬號的以太幣數(shù)量 |
coinbase | 區(qū)塊受益者地址,可以設(shè)置成已存在的賬戶悼做。后面挖出的區(qū)塊的受益者將是挖掘出那個區(qū)塊的賬戶(礦工) |
difficulty | 代表當(dāng)前區(qū)塊的難度等級(十六進(jìn)制)疯特,這里定義創(chuàng)世區(qū)塊的難度等級,難度等級越高肛走,挖礦越難漓雅。后面生成的區(qū)塊難度等級根據(jù)前一個區(qū)塊的難度等級和時間戳計(jì)算得到 |
extraData | 一個包含這個區(qū)塊相關(guān)數(shù)據(jù)的字節(jié)數(shù)組,任意填寫朽色。必須是32位以內(nèi) |
gasLimit | 執(zhí)行這個事務(wù)應(yīng)該被使用的gas的最大量邻吞。這個在任何計(jì)算被做之前是預(yù)付的,并且在之后不會增加 |
nonce | 代表從這個地址發(fā)送的事務(wù)數(shù)目葫男,或者在關(guān)聯(lián)代碼的賬戶情況下抱冷,這代表這個賬戶創(chuàng)造的合約數(shù)目。(在Yellow Paper中對nonce有多處描述梢褐,這里選擇了4.1章節(jié)的描述旺遮,) |
mixhash | 一個256位的hash,由nonce合并盈咳,證明在這個區(qū)塊上已經(jīng)執(zhí)行足夠量的計(jì)算 |
parentHash | 前一個(父級)區(qū)塊的header的keccak256算法hash |
timestamp | 這個區(qū)塊開始的Unix的time()和合理輸出 |
上面這些域應(yīng)該可以滿足大多數(shù)需求耿眉,不過我們建議改變 nonce 為一些隨機(jī)值,這樣你就能阻止不知名的遠(yuǎn)程節(jié)點(diǎn)訪問你鱼响。如果你想要為了更早測試鸣剪,預(yù)儲備一些賬戶,你能在 alloc 域進(jìn)行賬戶配置:
"alloc": {
"0x0000000000000000000000000000000000000001": {"balance": "111111111"},
"0x0000000000000000000000000000000000000002": {"balance": "222222222"}
}
隨著創(chuàng)世狀態(tài)定義在上面的JSON文件丈积,你應(yīng)該在啟動每個節(jié)點(diǎn)之前筐骇,優(yōu)先初始化它,以確認(rèn)所有區(qū)塊鏈參數(shù)被正確設(shè)置:
geth --datadir /root/privatenet/.ethereum init genesis.json
啟動bootstrap
當(dāng)所有你想要運(yùn)行的節(jié)點(diǎn)初始化到期望的創(chuàng)世狀態(tài)桶癣,你將需要開始一個bootstrap節(jié)點(diǎn)拥褂,其他節(jié)點(diǎn)可以使用它在你的網(wǎng)絡(luò)或因特網(wǎng)中找到彼此。干凈的方式是配置并運(yùn)行一個獨(dú)立的bootnode:
- 每個ethereum節(jié)點(diǎn)牙寞,包括一個bootnode饺鹃,通過一個enode標(biāo)識符聯(lián)系莫秆。這些標(biāo)識符源自一個key。于是你將需要給bootnode這樣一個key悔详。因?yàn)槲覀儺?dāng)前沒有這樣的key镊屎,所以我們可以在bootnode啟動前生成一個key(并存儲它到一個文件):
bootnode -genkey bootnode.key
- 為了bootnode每次啟動都使用相同的enode,需要在bootnode啟動時指定一個key:
bootnode -nodekey bootnode.key
當(dāng)bootnode上線茄螃,它將展示一個 enode URL缝驳,例如:
INFO [05-09|01:47:05] UDP listener up self=enode://75535ebac1f5b2a644edb134dbe91c6c288353be1a5301864edae529630b35c5ff0c0ae9e07b2bcdef578c3ac1b72b2cda105c061c2c77067f1fd8ec54d852b7@[::]:30301
其他節(jié)點(diǎn)可以使用這個 enode URL 連接它并交換對等信息。確認(rèn)用你的外部訪問IP替換展示的IP地址信息(很可能是 [::])去得到真正的 enode URL归苍。例如:
enode://75535ebac1f5b2a644edb134dbe91c6c288353be1a5301864edae529630b35c5ff0c0ae9e07b2bcdef578c3ac1b72b2cda105c061c2c77067f1fd8ec54d852b7@192.168.1.214:30301
保存這個準(zhǔn)確的 enode URL 到你的一個文本中或者其他什么地方用狱,下面需要用到。
注意:你也可以使用完全成熟的Geth節(jié)點(diǎn)作為引導(dǎo)節(jié)點(diǎn)拼弃,但這是不太推薦的方式夏伊。
定義一個配置文件
為了成員節(jié)點(diǎn)啟動時使用的配置一致,需要寫一個配置文件吻氧,例如 privatenet.toml(參考自 testnet 的配置, 執(zhí)行命令 geth --testnet dumpconfig 可見):
# Note: this config doesn't contain the genesis block.
[Eth]
NetworkId = 3369
DatabaseCache = 768
GasPrice = 18000000000
[Eth.Ethash]
CacheDir = "ethash"
CachesInMem = 2
CachesOnDisk = 3
DatasetDir = "/root/privatenet/.ethash"
DatasetsInMem = 1
DatasetsOnDisk = 2
[Eth.TxPool]
NoLocals = false
Journal = "transactions.rlp"
Rejournal = 3600000000000
PriceLimit = 1
PriceBump = 10
AccountSlots = 16
GlobalSlots = 4096
AccountQueue = 64
GlobalQueue = 1024
Lifetime = 10800000000000
[Eth.GPO]
Blocks = 20
Percentile = 60
[Shh]
MaxMessageSize = 1048576
MinimumAcceptedPOW = 2e-01
[Node]
DataDir = "/root/privatenet/.ethereum"
IPCPath = "geth.ipc"
HTTPPort = 8545
HTTPVirtualHosts = ["localhost"]
HTTPModules = ["net", "web3", "eth", "shh"]
WSPort = 8546
WSModules = ["net", "web3", "eth", "shh"]
[Node.P2P]
MaxPeers = 25
NoDiscovery = false
BootstrapNodes = ["enode://75535ebac1f5b2a644edb134dbe91c6c288353be1a5301864edae529630b35c5ff0c0ae9e07b2bcdef578c3ac1b72b2cda105c061c2c77067f1fd8ec54d852b7@1
92.168.1.214:30301"]StaticNodes = []
TrustedNodes = []
ListenAddr = ":30303"
EnableMsgEvents = false
[Dashboard]
Host = "localhost"
Port = 8080
Refresh = 5000000000
配置說明(下表是筆者參考geth參數(shù)說明和go-ethereum相關(guān)配置項(xiàng)代碼整理所得溺忧,如有錯誤,請幫忙指正):
域 | 配置項(xiàng) | 對應(yīng)參數(shù) | 說明 |
---|---|---|---|
Eth | NetworkId | --networkid value | Network標(biāo)識符(integer類型盯孙,1=Frontier鲁森,2=Morden(disused),3=Ropsten振惰,4=Rinkeby)歌溉,默認(rèn)為1。如果建立在私網(wǎng)上骑晶,使用另外的任意值研底,比如:3369 |
Eth | DatabaseCache | null | (個人理解)為database申請的系統(tǒng)內(nèi)存,單位為MB透罢,最小值和默認(rèn)值是16MB |
Eth | GasPrice | --gasprice “18000000000” | 接受挖掘事務(wù)的最低gas價(jià)格」诮可能指miner的報(bào)酬 |
Eth.Ethash | CacheDir | --ethash.cachedir | 存儲ethash證明緩存的目錄(默認(rèn)在 datadir 目錄里) |
Eth.Ethash | CachesInMem | --ethash.cachesinmem value | 保留在內(nèi)存中的最新ethash緩存的數(shù)目(每16MB)(默認(rèn):2)羽圃。 |
Eth.Ethash | CachesOnDisk | --ethash.cachesondisk value | 保留在磁盤中的最新ethash緩存的數(shù)目(每16MB)(默認(rèn):3)。 |
Eth.Ethash | DatasetDir | --ethash.dagdir "/home/karalabe/.ethash" | 存儲ethash挖掘DAGs的目錄(默認(rèn)在home目錄里) |
Eth.Ethash | DatasetsInMem | --ethash.dagsinmem value | 保留在內(nèi)存中的最新ethash挖掘DAGs(每1+GB)(默認(rèn):1)抖剿。 |
Eth.Ethash | DatasetsOnDisk | --ethash.dagsondisk value | 保留在磁盤中的最新ethash挖掘DAGs(每1+GB)(默認(rèn):2)朽寞。 |
Eth.TxPool | NoLocals | --txpool.nolocals | 免除本地提交事務(wù)的費(fèi)用 |
Eth.TxPool | Journal | --txpool.journal value | 用于節(jié)點(diǎn)重啟的本地事務(wù)磁盤日志(默認(rèn):"transactions.rlp") |
Eth.TxPool | Rejournal | --txpool.rejournal value | 重新生成本地事務(wù)日志的時間間隔(默認(rèn):1h0m0s) |
Eth.TxPool | PriceLimit | --txpool.pricelimit value | 強(qiáng)制接納入池的最小gas價(jià)格限制(默認(rèn):1) |
Eth.TxPool | PriceBump | --txpool.pricebump value | 替代一個已經(jīng)存在的事務(wù)的價(jià)格碰撞百分比(默認(rèn):10) |
Eth.TxPool | AccountSlots | --txpool.accountslots value | 每個賬戶擔(dān)保的可執(zhí)行事務(wù)時隙的最小數(shù)目(默認(rèn):16) |
Eth.TxPool | GlobalSlots | --txpool.globalslots value | 所有賬戶的可執(zhí)行事務(wù)時隙的最大數(shù)目(默認(rèn):4096) |
Eth.TxPool | AccountQueue | --txpool.accountqueue value | 每個賬戶許可的非可執(zhí)行事務(wù)時隙的最大數(shù)目(默認(rèn):64) |
Eth.TxPool | GlobalQueue | --txpool.globalqueue | 所有賬戶的非可執(zhí)行事務(wù)時隙的最大數(shù)目(默認(rèn):1024) |
Eth.TxPool | Lifetime | --txpool.lifetime value | 非可執(zhí)行事務(wù)的排隊(duì)最大時間(默認(rèn):3h0m0s) |
Eth.GPO | Blocks | --gpoblocks value | 檢查gas價(jià)格的最新區(qū)塊的數(shù)目(默認(rèn):10) |
Eth.GPO | Percentile | --gpopercentile value | 建議的gas價(jià)格是一組最新事務(wù)gas價(jià)格的百分位(默認(rèn):50) |
Shh | MaxMessageSize | --shh.maxmessagesize value | 可接受的最大信息大小(默認(rèn):1048576) |
Shh | MinimumAcceptedPOW | --shh.pow value | 可接受的最小POW(默認(rèn):0.2) |
Node | DataDir | --datadir "/home/karalabe/.ethereum" | databases和keystore的數(shù)據(jù)目錄 |
Node | IPCPath | --ipcpath | datadir里的IPC socket/pipe的文件名 |
Node | HTTPPort | --rpcport value | HTTP-RPC服務(wù)監(jiān)聽端口(默認(rèn):8545) |
Node | HTTPVirtualHosts | --rpcaddr value | HTTP-RPC服務(wù)監(jiān)聽接口(默認(rèn):"localhost") |
Node | HTTPModules | null | 經(jīng)由HTTP RPC接口暴露的API modules列表 |
Node | WSPort | --wsport value | WS-RPC 服務(wù)監(jiān)聽端口(默認(rèn):8546) |
Node | WSModules | null | 經(jīng)由websocket RPC接口暴露的API modules列表,如果modules是空的斩郎,所有指向public的RPC API端點(diǎn)將會被暴露 |
Node.P2P | MaxPeers | --maxpeers value | network peers的最大數(shù)目(如果設(shè)置為0脑融,network失效)(默認(rèn):25) |
Node.P2P | NoDiscovery | --nodiscover | 使peer發(fā)現(xiàn)機(jī)制無效(手動peer添加)。這里設(shè)置為false缩宜,以便使用這個配置文件的新節(jié)點(diǎn)可以被發(fā)現(xiàn)肘迎。 |
Node.P2P | BootstrapNodes | --bootnodes value | 逗號分割的P2P discovery bootstrap enode URLs(對于 light servers甥温,設(shè)置 v4+v5 代替)。將上面啟動bootnodes時獲取的enode URL替換IP后添加到這里妓布。 |
Node.P2P | BootstrapNodesV5 | --bootnodesv5 value | 逗號分割的P2P v5 discovery bootstrap enode URLs(light server姻蚓,light nodes) |
Node.P2P | StaticNodes | null | 配置作為static nodes的節(jié)點(diǎn)enode URLs列表 |
Node.P2P | TrustedNodes | null | 配置作為trusted nodes的節(jié)點(diǎn)enode URLs列表 |
Node.P2P | ListenAddr | --port | network監(jiān)聽端口(默認(rèn):30303) |
Node.P2P | EnableMsgEvents | null | 如果EnableMsgEvents被設(shè)置,服務(wù)器將發(fā)出PeerEvents匣沼,無論一個peer何時發(fā)送或接收一條信息 |
Dashboard | Host | null | 啟動dashboard服務(wù)的主機(jī)接口狰挡,如果這個域?yàn)榭眨瑒t沒有dashboard將被啟動 |
Dashboard | Port | null | 啟動dashboard服務(wù)的TCP端口數(shù)字释涛。默認(rèn)0值是有效的加叁,并將使用一個隨機(jī)端口數(shù)字(用于臨時節(jié)點(diǎn)) |
Dashboard | Refresh | null | 數(shù)據(jù)更新的刷新速率,chartEntry將被經(jīng)常收集 |
在你的操作目錄創(chuàng)建config文件夾唇撬,將寫好的配置文件privatenet.toml移動到config目錄里它匕。
啟動你的成員節(jié)點(diǎn)
以太坊的成員節(jié)點(diǎn),之間是完全對等的局荚,每個節(jié)點(diǎn)都可以有多個賬戶超凳。
啟動私網(wǎng)以太坊的成員節(jié)點(diǎn):
geth --config config/privatenet.toml
連接到剛剛啟動的或者已經(jīng)在運(yùn)行的node,開始一個交互式JavaScript環(huán)境:
geth attach privatenet/.ethereum/geth.ipc
官方說明: 當(dāng)bootnode運(yùn)轉(zhuǎn)起來并且外部可達(dá)(你能嘗試 telnet <ip> <port> 去確認(rèn)它的確可達(dá))耀态,開始隨后的Geth節(jié)點(diǎn)轮傍,為了對等發(fā)現(xiàn),經(jīng)由 --bootnodes 選項(xiàng)指向bootnode首装。保持你的私網(wǎng)的數(shù)據(jù)目錄單獨(dú)將很可能是明智的選擇创夜,所以也指定一個自定義的 --datadir 選項(xiàng)。
geth --datadir=path/to/custom/data/folder --bootnodes=<bootnode-enode-url-from-above>
注意:因?yàn)槟愕木W(wǎng)絡(luò)將被從main和test網(wǎng)完全切除仙逻,所以你將需要配置一個 miner 去處理交易并為你創(chuàng)造新塊驰吓。
運(yùn)行一個私有的miner
公共Ethereum網(wǎng)的mining是一個復(fù)雜的任務(wù),因?yàn)樗ㄒ豢尚械氖鞘褂肎PUs系奉,要求一個OpenCL 或 CUDA激活 ethminer 實(shí)例檬贰。更多信息請查閱 EtherMining subreddit和 Genoil miner 倉庫。
然而在一個私網(wǎng)的設(shè)置缺亮,一個單一的 CPU miner實(shí)例是足夠滿足實(shí)際需求的翁涤,因?yàn)樗恍枰林氐馁Y源(考慮到運(yùn)行在一個單一的線程上,也不需要多個)就能在一個正確的間隔內(nèi)生產(chǎn)一個穩(wěn)定的區(qū)塊流(stable stream of blocks)萌踱。為mining開始一個Geth實(shí)例葵礼,指定你通常使用的選項(xiàng)運(yùn)行它,通過以下方法擴(kuò)展:
geth --config config/privatenet.toml --mine --minerthreads=1 --etherbase=0x0000000000000000000000000000000000000000
這將開始mining區(qū)塊并在一個單一CPU線程上交易并鸵,存入所有事件到一個 --etherbase 選項(xiàng)指定的賬戶鸳粉,如果不指定賬戶,則會默認(rèn)指定當(dāng)前節(jié)點(diǎn)上的第一個賬戶园担。你能進(jìn)一步調(diào)節(jié)mining届谈,通過(--targetgaslimit)改變默認(rèn)gas限制區(qū)塊并且在(--gasprice)處接受價(jià)格交易枯夜。
另外,也可以在交互式JavaScript環(huán)境中控制mining實(shí)例:
- 開始一個4線程的mining實(shí)例:
miner.start(4)
- 停止mining實(shí)例:
miner.stop()
更多Mining相關(guān)信息疼约,請參看Mining
至此卤档,私網(wǎng)以太坊搭建完成,感謝閱讀程剥!
原創(chuàng)不易劝枣,與君共勉!
所有玩世不恭的生靈织鲸,都有一顆至真至純的心舔腾!