天天看點

ubuntu下geth安裝及搭建虛拟區塊鍊

文章目錄

轉載請注明連結

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,初步操作到此為止。

繼續閱讀