搭建以太坊私有鏈完整版

可以直接下載程序進行安裝,也可以下載源碼自己進行編譯安裝,本文介紹源碼編譯方式。

源碼編譯

環境需求

從github下載源碼

go get github.com/ethereum/go-ethereum

編譯

Ubuntu和Mac下編譯

cd go-ethereum
make geth   或者 make all 

Windows下編譯

  1. 按以下目錄結構才能正確編譯,需要下載的包請自行下載
    $GOPATH$/src  
    ├── github.com  
    │   └── ethereum  
    │       └── go-ethereum  
    └── golang.org  
     └── x  
         └── net 
  2. 在CMD命令行下,執行以下命令進行編譯:
    go install -v github.com/ethereum/go-ethereum/cmd/geth
    go install -v github.com/ethereum/go-ethereum/cmd/evm

    編譯成功,在$GOPATH$/bin下會出現:geth.exe和evm.exe

配置環境變量

將 geth 添加到環境變量中

# ubuntu下
vi ~/.bashrc
# mac下
vi ~/.bash_profile

# 打開配置文件後,把以下內容添加到文件中
export GETH="$GOPATH/src/github.com/ethereum/go-ethereum/build"
export PATH="$PATH:$GETH/bin"

然後執行,使配置生效。

source ~/.bashrc

windows下,直接將bin路徑添加到Path環境變量中

檢查是否安裝成功

geth --help

如果輸出一些幫助提示命令,則說明安裝成功。

搭建私有鏈

啓動私有鏈

1. 創建私有鏈數據存放目錄,例:

# ubuntu和mac
mkdir ~/privatechain
mkdir ~/privatechain/data  # data用於存放賬戶和區塊數據

# windows,在D盤建立文件夾privatechain,並在其下建立data文件夾

2. 啓動私有鏈,命令行下進入privatechain目錄,執行:

geth --datadir data --nodiscover console

則進入geth控制檯(交互式的 Javascript 執行環境),默認端口爲8545和30303端口

3. 創建兩個賬戶

personal.newAccount("123456")  # 123456爲密碼

# 出現的以下一串字符,則爲創建的賬戶
"0x3bfd5f0306ffe7b93e56989fd11d5678ce32cfe6"

4. 查詢賬戶餘額

eth.getBalance(eth.accounts[0])

# 此時會顯示爲 0

創建創世區塊

1. 退出geth的控制檯

exit

1. 在privatechain目錄下,新建gensis.json,內容如下:

{  
   "alloc": {  
      "0x3bfd5f0306ffe7b93e56989fd11d5678ce32cfe6": {  
      "balance": "100000000000000000000000000"  
      }  
   },  
    "config":{  
        "chainId":10,  
        "homesteadBlock":0,  
        "eip155Block":0,  
        "eip158Block":0  
    },  
    "nonce":"0x0000000000000042",  
    "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",  
    "difficulty": "0x2000",  
    "alloc": {},  
    "coinbase":"0x0000000000000000000000000000000000000000",  
    "timestamp": "0x00",  
    "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",  
    "extraData": "",  
    "gasLimit":"0xffffffff"  
}  

創世區塊信息寫在一個 JSON 格式的配置文件中

此處我的配置,在"0x3bfd5f0306ffe7b93e56989fd11d5678ce32cfe6"中預置了1億的幣

各個參數的含義如下:

  • mixhash:與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。
  • nonce: nonce就是一個64位隨機數,用於挖礦。
  • difficulty: 設置當前區塊的難度,如果難度過大,cpu挖礦就很難,這裏設置較小難度
  • alloc: 用來預置賬號以及賬號的以太幣數量,因爲私有鏈挖礦比較容易,所以我們也可以不預置有幣的賬號,需要的時候自己創建即可以。
  • coinbase: 礦工的賬號,隨便填
  • timestamp: 設置創世塊的時間戳
  • parentHash: 上一個區塊的hash值,因爲是創世塊,所以這個值是0
  • extraData: 附加信息,隨便填,可以填你的個性信息
  • gasLimit: 該值設置對GAS的消耗總量限制,用來限制區塊能包含的交易信息總和,因爲我們是私有鏈,所以填最大。
  • chainId:區塊鏈的ID,公鏈以太坊是1,我們要與其不同,以免衝突

2. 創建創世塊

geth --datadir data init genesis.json

如果出現錯誤提示,可以先刪除原來的創世塊

geth removedb --datadir data

再次執行

geth --datadir data init genesis.json

初始化成功後,會在數據目錄 data 中生成 geth 和 keystore 兩個文件夾,此時目錄結構如下:

privatechain
├── data
│   ├── geth
│   │   ├── chaindata
│   │   │   ├── 000001.log
│   │   │   ├── CURRENT
│   │   │   ├── LOCK
│   │   │   ├── LOG
│   │   │   └── MANIFEST-000000
│   │   └── lightchaindata
│   │       ├── 000001.log
│   │       ├── CURRENT
│   │       ├── LOCK
│   │       ├── LOG
│   │       └── MANIFEST-000000
│   └── keystore
└── genesis.json

其中 geth/chaindata 中存放的是區塊數據,keystore 中存放的是賬戶數據。

更多操作

1. 轉賬交易

  1. 進入geth控制檯

    geth --datadir data --networkid 10 console

    指定網絡id(networkid)爲上面設置的10

  2. 解鎖賬戶
    # 123456爲密碼
    personal.unlockAccount(eth.accounts[0],"123456") 
  3. 發送交易
    amount = web3.toWei(10,'ether')
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})

    此時查詢賬戶餘額沒發生變化,需要進行挖礦確認打包交易

2. 啓動&停止挖礦

通過 miner.start() 啓動挖礦

> miner.start(3)

其中 start 的參數表示挖礦使用的線程數。第一次啓動挖礦會先生成挖礦所需的 DAG 文件,這個過程有點慢,等進度達到 100% 後,就會開始挖礦,此時屏幕會被挖礦信息刷屏。

停止挖礦,在 console 中輸入:

miner.stop()

挖到一個區塊會獎勵5個以太幣,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做coinbase,默認情況下coinbase是本地賬戶中的第一個賬戶:

> eth.coinbase
"0xfb9cc019fc650a1699d05b7fb564b83c3a72b64d"

可以通過 miner.setEtherbase() 將其他賬戶設置成 coinbase 即可

> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0xc6b5702b15a3794374e28f41f36e1e8dbdd564df"

重新啓動挖礦,查看 eth.accounts[1] 是否可以獲得以太幣

> miner.start(3)

//等待幾秒後
> miner.stop()

查詢賬戶餘額:

> eth.getBalance(eth.accounts[0])
280000000000000000000 # wei
> eth.getBalance(eth.accounts[1])
210000000000000000000
> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether') # wei換算成ether
210

發現賬戶0 和 賬號1 都有以太幣,說明 miner.setEtherbase() 設置成功。

getBalance() 返回值的單位是wei,wei是以太幣的最小單位,1個以太幣=10的18次方個wei。要查看有多少個以太幣,可以用web3.fromWei()將返回值換算成以太幣:

> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
280

> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
210

3. 查看交易信息

查看當前區塊總數:

eth.blockNumber

通過區塊號查看區塊:

eth.getBlock(6)

通過交易hash(hash 值包含在上面交易返回值中)查看交易:

eth.getTransaction("0x493e8aa2bcb6b2a362bdbd86b2c454279e14beea43b444aeb45c7f667bf572e2")

4. 控制檯操作命令介紹

控制檯內置了一些用來操作以太坊的 Javascript 對象,可以直接使用這些對象。這些對象主要包括:

  • eth:包含一些跟操作區塊鏈相關的方法;
  • net:包含一些查看p2p網絡狀態的方法;
  • admin:包含一些與管理節點相關的方法;
  • miner:包含啓動&停止挖礦的一些方法;
  • personal:主要包含一些管理賬戶的方法;
  • txpool:包含一些查看交易內存池的方法;
  • web3:包含了以上對象,還包含一些單位換算的方法。

常用命令有:

  • personal.newAccount():創建賬戶;
  • personal.unlockAccount():解鎖賬戶;
  • eth.accounts:枚舉系統中的賬戶;
  • eth.getBalance():查看賬戶餘額,返回值的單位是 Wei(Wei 是以太坊中最小貨幣面額單位,類似比特幣中的聰,1 ether = 10^18 Wei);
  • eth.blockNumber:列出區塊總數;
  • eth.getTransaction():獲取交易;
  • eth.getBlock():獲取區塊;
  • miner.start():開始挖礦;
  • miner.stop():停止挖礦;
  • eth.coinbase:挖礦獎勵的賬戶
  • web3.fromWei():Wei 換算成以太幣;
  • web3.toWei():以太幣換算成 Wei;
  • txpool.status:交易池中的狀態;
  • admin.addPeer():連接到其他節點;

多節點運行

  1. 按同樣的方法在另一臺電腦上重新啓動一個節點,注意:genesis.json的內容必須完全相同
  2. 獲取第一個節點的enode信息

    admin.nodeInfo.enode

    結果如下:

    "enode://fe6dd2e69ceea3eb8daddc4cb1453a00d7094df6486c214062a5d0ec5b020b9d832508b80594a323cbbd6ddb4ddd06257103a2f08173ef7e31e19f302f4e5f9e@[::]:30303?discport=0"
  3. 在第二個節點中執行添加第一個節點的操作

    admin.addPeer("enode://fe6dd2e69ceea3eb8daddc4cb1453a00d7094df6486c214062a5d0ec5b020b9d832508b80594a323cbbd6ddb4ddd06257103a2f08173ef7e31e19f302f4e5f9e@192.168.137.1:30303")

    注意:enode信息中的[::]替換成第一個節點的ip,問號及後面部分不需要

  4. 查看連接的節點
    // 查看連接的節點數量,此處爲1
    net.peerCount
    // 查看連接的節點信息
    admin.peers

結果如下:

[{
    caps: ["eth/63"],
    id: "352c2a755ea629dba803dda4e8e2708fca746838b2c91ea329713fd2c2ccbc0d1dd34fe905c1157fafb775383cf6f4f21e94a4b2533a8282806dd4fda81a5bd7",
    name: "Geth/v1.8.10-unstable-998f6564/darwin-amd64/go1.10.2",
    network: {
      inbound: true,
      localAddress: "192.168.137.1:30303",
      remoteAddress: "192.168.137.16:53022",
      static: false,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 131072,
        head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
        version: 63
      }
    }
}]

此時,節點1和節點2都可以進行挖礦,並且只要有一個節點在進行挖礦,其他節點的交易也都能正常進行。在節點1可以查詢節點2中賬戶的餘額,也可以在不同節點之間進行轉賬。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章