文章目錄
轉載請注明連結
ubuntu系統安裝geth,并搭建私有鍊進行挖礦測試。
#1. geth安裝:
環境:ubuntu 14.04 64bit
由于網絡代理或是防火牆的原因,無法使用網上大多數人提供的apt-get方式安裝,隻能手動下載下傳安裝包進行安裝。
geth的安裝包需要go語言環境進行編譯,是以先安裝go語言環境
##1) go語言環境安裝:
https://www.golangtc.com/download
下載下傳go1.9.2.linux-amd64.tar.gz,由于geth預設的go指令位置在/usr/local/go/bin,是以将go語言包解壓至/usr/local/下
##2) go-ethereum安裝:
https://github.com/ethereum/go-ethereum/releases
下載下傳tar.gz包,同樣放在/usr/local/go-ethereum/下,執行安裝:
$ make geth
##3) 配置~/.bashrc:
export PATH=$PATH:/usr/local/go-ethereum/build/bin/:/usr/local/go/bin。
執行環境生效:
$ source ~/.bashrc
#2. 私有鍊搭建:
安裝geth主要用以開發,公有鍊挖礦此處不做研讨。
##1) 配置檔案genesis.json:
需要配置genesis.json用以産生創世區塊,具體内容如下
{
"config": {
"chainId": 22,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x400",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000038",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
配置檔案各項說明如下:
-
mixhash
與nonce配合用于挖礦,由上一個區塊的一部分生成的hash。注意他和nonce的設定需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。.
-
nonce
nonce就是一個64位随機數,用于挖礦,注意他和mixhash的設定需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。
-
difficulty
設定目前區塊的難度,如果難度過大,cpu挖礦就很難,這裡設定較小難度。
-
alloc
用來預置賬号以及賬号的以太币數量,因為私有鍊挖礦比較容易,是以我們不需要預置有币的賬号,需要的時候自己建立即可以。預置方式如下:
“alloc”: {
“7df9a875a174b3bc565e6424a0050ebc1b2d1d82”: { “balance”: “300000” },
“f41c74c9ae680c1aa78f42e5647a62f353b7bdde”: { “balance”: “400000” }
}
-
coinbase
礦工的賬号,随便填,下面會執行eth指令建立賬戶。
-
timestamp
設定創世塊的時間戳。
-
parentHash
上一個區塊的hash值,因為是創世塊,是以這個值是0。
-
extraData
附加資訊,随便填,可以填你的個性資訊,網上有執行個體給此項指派0x0,這會init時報錯:invalid genesis file: hex string has odd length,必須為0x00。
-
gasLimit
該值設定對GAS的消耗總量限制,用來限制區塊能包含的交易資訊總和,因為我們是私有鍊,是以填最大。
該檔案對于下面的init執行時發生的常見錯誤如下:
-
Fatal: invalid genesis file: missing 0x prefix for hex data
這個錯誤資訊意思很明白,就是你的json檔案中,對于16進制資料,需要加上0x字首
-
Fatal: invalid genesis file: hex string has odd length
從v1.6開始,設定的十六進制數值,不能是奇數位, 比如不能是0x0,而應該是0x00。
-
Fatal: failed to write genesis block: genesis has no chain configuration
這個錯誤資訊,就是說,你的json檔案中,缺少config部分。看到這個資訊,我們不需要把geth退回到v1.5版本,而是需要加上config部分
-
Error: invalid sender undefined
這個錯誤不會導緻初始化失敗,但是會在以後的轉賬(eth.sendTransaction),或者部署智能合約的時候産生。解決方法就是chainId不能設定為0。 如果你完全按照github上給的官方配置檔案,就會産生這個錯誤。
##2) 建立創世區塊:
一個比較簡單的指令如下,僅僅指定了data目錄及init json。
$ geth --datadir "/home/username/data0" init genesis.json
或是下面這條比較複雜的指令:
$ geth --identity "MyNodeName" --rpc --rpcport "8080" --rpccorsdomain "*" --datadir "/home/username/data0" --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --networkid 1999 init genesis.json
上述私有化指令的參數詳細說明如下:
-
nodiscover
使用這個參數,你的節點就不會被其他人發現,除非手動添加你的節點。否則,就隻有一個被無意添加到一個陌生區塊鍊上的機會,那就是跟你有相同的genesis檔案和networkID。
-
maxpeers 0
如果你不想有人連上你的測試鍊,就用maxpeers 0。或者,你可以調整參數,當你确切的知道有幾個節點要連接配接上來的時候。
-
rpc
允許RPC操作你的節點。這個參數在Geth上是預設的。
-
rpcapi “db,eth,net,web3”
這個指令訓示了允許通過RPC通路的指令。預設情況下,Geth允許web3。
- rpcport “8080”
- rpccorsdomain “http://chriseth.github.io/browser-solidity/”
-
datadir
私有鍊存放路徑(最好跟公有鍊路徑不同)
-
port “30303”
網絡監聽端口,用來和其他節點手動連接配接
-
identity “MyNodeName"
用來辨別你的節點的,友善在一大群節點中識别出自己的節點
創世區塊初始化成功後,會在資料目錄data0中生成geth和keystore兩個檔案夾,此時目錄結構如下:
privatechain
├── data0
│ ├── geth
│ │ └── chaindata
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ └── keystore
└── genesis.json
其中geth/chaindata中存放的是區塊資料,keystore中存放的是賬戶資料。
##3) 啟動私有鍊:
$ geth --datadir data0 --networkid 1999 console
–datadir選項指定使用data0作為資料目錄,
–networkid選項為私有鍊的網絡id,如前所述為1999。網絡id在連接配接到其他節點的時候會用到,以太坊公網的網絡id是1,不能與其沖突。
#3. 挖礦及交易測試:
啟用私有鍊後會進入以太坊Javascript Console後,就可以使用裡面的内置對象做一些操作,這些内置對象提供的功能很豐富,比如檢視區塊和交易、建立賬戶、挖礦、發送交易、部署智能合約等。
Welcome to the Geth JavaScript console!
instance: Geth/v1.8.12-stable/linux-amd64/go1.9.2
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
##1) 賬戶建立:
console下的指令tab鍵可以自動補全。
建立方式1:
> personal.newAccount("123456")
"0x5ee8bdf8543e00f3cccea9651d2f1e372591cba3"
建立方式2:
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0xeabdde05da845490d24d7492275fd256b28c05b9"
檢視目前的賬戶清單:
> eth.accounts
["0x5ee8bdf8543e00f3cccea9651d2f1e372591cba3", "0xeabdde05da845490d24d7492275fd256b28c05b9"]
賬戶預設會儲存在資料目錄的keystore檔案夾中。檢視目錄結構,發現data0/keystore中多了兩個檔案,這兩個檔案就對應剛才建立的兩個賬戶,這是json格式的文本檔案,可以打開檢視,裡面存的是私鑰經過密碼加密後的資訊。此時tree如下:
├── data0
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000002.ldb
│ │ │ ├── 000003.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000004
│ │ ├── lightchaindata
│ │ │ ├── 000001.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ ├── LOCK
│ │ ├── nodekey
│ │ ├── nodes
│ │ │ ├── 000001.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ └── transactions.rlp
│ ├── history
│ └── keystore
│ ├── UTC--2018-07-24T07-44-30.884353877Z--5ee8bdf8543e00f3cccea9651d2f1e372591cba3
│ └── UTC--2018-07-24T07-44-43.711728811Z--eabdde05da845490d24d7492275fd256b28c05b9
##2) 挖礦:
啟動挖礦:
> miner.start(2)
其中start的參數表示挖礦使用的線程數。第一次啟動挖礦會先生成挖礦所需的DAG檔案,等進度達到100%後,就會開始挖礦。多線程可能并行執行。
停止挖礦:
> miner.stop()
挖到一個區塊會獎勵5個以太币,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做coinbase,預設情況下coinbase是本地賬戶中的第一個賬戶:
檢視目前挖礦獎勵入賬賬戶,預設為建立的第一個賬戶:
> eth.coinbase
INFO [07-24|14:59:12.890] Etherbase automatically configured address=0xB9d7fA2DaB728AbA0738BEdfD48d352d0EDff32a
"0xb9d7fa2dab728aba0738bedfd48d352d0edff32a"
更改入賬賬戶:
> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0xeabdde05da845490d24d7492275fd256b28c05b9"
檢視挖礦收入:
> eth.getBalance(eth.coinbase)
50000000000000000000
機關wei,以太币的最小機關,1個以太币=10的18次方個wei。
要檢視有多少個以太币,可以用web3.fromWei()将傳回值換算成以太币:
> web3.fromWei(eth.getBalance(eth.coinbase))
50
##3) 交易:
開始一筆交易,從賬戶0轉移10個以太币到賬戶1:
> amount = web3.toWei(10,'ether')
"10000000000000000000"
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
Error: authentication needed: password or unlock
at web3.js:3143:20
at web3.js:6347:15
at web3.js:5081:36
at <anonymous>:1:1
提示失敗,沒有授權,這是因為一段時間不操作賬戶,自動lock,解除lock:
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x5ee8bdf8543e00f3cccea9651d2f1e372591cba3
Passphrase:
true
再次轉帳:
> amount = web3.toWei(10,'ether')
"10000000000000000000"
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
INFO [07-24|15:55:44.646] Submitted transaction fullhash=0x8ec15449376791daedfb34e0a8f0dc2f249de4e7587c267a857db2d3443e6e17 recipient=0xEABDDe05da845490d24d7492275fD256b28C05b9
"0x8ec15449376791daedfb34e0a8f0dc2f249de4e7587c267a857db2d3443e6e17"
檢視賬戶1是否收到:
> eth.getBalance(eth.accounts[1])
0
仍舊是0,沒有收到。這說明這筆交易沒有人确認,需要礦工挖礦記錄。
先看一下交易池的狀況:
> txpool.status
{
pending: 1,
queued: 0
}
很明顯有一筆交易pending狀态,未确認。
自己挖礦确認下,這裡僅僅挖出一個區塊就可以了:
> miner.start(1);admin.sleepBlocks(1);miner.stop();
INFO [07-24|15:59:00.308] Updated mining threads threads=1
INFO [07-24|15:59:00.308] Transaction pool price threshold updated price=18000000000
INFO [07-24|15:59:00.309] Starting mining operation
INFO [07-24|15:59:00.309] Commit new mining work number=11 txs=1 uncles=0 elapsed=183.92µs
INFO [07-24|15:59:03.009] Successfully sealed new block number=11 hash=2dad01…7e68d3
INFO [07-24|15:59:03.010] ? mined potential block number=11 hash=2dad01…7e68d3
INFO [07-24|15:59:03.010] Commit new mining work number=12 txs=0 uncles=0 elapsed=144.847µs
true
再檢視下賬戶1到的餘額:
> web3.fromWei(eth.getBalance(eth.coinbase))
15.000378
為什麼是15呢?還有小數,這是怎麼回事?
這是因為之前執行了更改入賬賬戶:
> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0xeabdde05da845490d24d7492275fd256b28c05b9"
這次挖礦獎勵就會打入賬戶1,這樣餘額就是轉入的10個币加上5個挖礦獎勵,小數是交易費收入。
ok,初步操作到此為止。