以太坊私有鏈挖礦操作指南


什么是Ethereum(以太坊)

  以太坊(Ethereum)並不是一個機構,而是一款能夠在區塊鏈上實現智能合約、開源的底層系統,以太坊從誕生到2017年5月,短短3年半時間,全球已有200多個以太坊應用誕生。以太坊是一個平台和一種編程語言,使開發人員能夠建立和發布下一代分布式應用。 以太坊可以用來編程,分散,擔保和交易任何事物:投票,域名,金融交易所,眾籌,公司管理, 合同和大部分的協議,知識產權,還有得益於硬件集成的智能資產。

以太坊的幾個基本概念:

以太坊簡單來說就是區塊鏈與智能合約的結合,是基於solidity語言實現的。在以太坊中,智能合約也有一個帳戶地址。

  • EVM

  以太坊虛擬機(EVM)是以太坊中智能合約的運行環境。它不僅被沙箱封裝起來,事實上它被完全隔離,運行在EVM內部的代碼不能接觸到網絡、文件系統或者其它進程。甚至智能合約之間也只有有限的調用。

  • Accounts

  以太坊中有兩類賬戶,它們共用同一個地址空間。外部賬戶,該類賬戶被公鑰-私鑰對控制。合約賬戶,該類賬戶被存儲在賬戶中的代碼控制。 外部賬戶的地址是由公鑰決定的,合約賬戶的地址是在創建合約時確定的。

  每個賬戶都有一個以太幣余額(單位是“Wei”),該賬戶余額可以通過向它發送帶有以太幣的交易來改變。

  • Transactions

  每一筆交易都是一條信息,可以通過交易,將余額從一個帳戶發至另一個帳戶。

  • Gas

  每一筆交易需要支付一定的gasgas price是由創建者設置的,調用合約的發送賬戶需要交易費用 = gas price * gas amount。

  

  • Go-Ethereum

  Go-Ethereum是由以太坊基金會提供的官方客戶端軟件。它是用Go編程語言編寫的,簡稱Geth

  • Geth 客戶端

  當你開始這個客戶程序,它連接到其他客戶端(也稱為節點)的網絡下載同步區塊。它將不斷地與其他節點進行通信來保持它的副本是最新的。它還具有挖掘區塊並將交易添加到塊鏈的能力,驗證並執行區塊中的交易。它還可以充當服務器,您可以通過RPC來訪問暴露的API接口。

  • Geth 終端

  這是一個命令行工具,可以讓您連接到正在運行的節點,並執行各種操作,如創建和管理帳戶,查詢區塊鏈,簽署並將交易提交給區塊鏈等等

 

 

 

先總體說一下創建以太坊私有鏈的步驟:

1.操作系統准備 linux(centos6.7)

2. golang安裝

3.下載以太坊

4. 安裝以太坊

5. 創世區塊文件的准備

6. 創世區塊初始化

7. 以太坊啟動

 

=====================================

1.最好是centos6.5以上的操作系統

2. 使用yum命令安裝golang語言

先更新下yum 源:
 [root@localhost src]# rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm

  [root@localhost src]# yum install golang

 

3. 下載以太坊源碼,演示用的鏈接是 https://github.com/ethereum/go-ethereum/archive/v1.7.3.zip

  [root@localhost src]# wget  https://github.com/ethereum/go-ethereum/archive/v1.7.3.zip

  [root@localhost src]#  unzip v1.7.3.zip

  [root@localhost src]#  cd go-ethereum-1.7.3/

 

4. 安裝以太坊

  [root@localhost src]#  make

 

5. 創世區塊文件的准備

在go-ethereum-1.7.3/build/bin目錄下創建init.json的文本文件,內容如下:

{ "config": 
  {
    "chainId": 10,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x02000000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}

 

參數名稱 參數描述
mixhash 與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。注意他和nonce的設置需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, 
nonce nonce就是一個64位隨機數,用於挖礦,注意他和mixhash的設置需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, 
difficulty 設置當前區塊的難度,如果難度過大,cpu挖礦就很難,這里設置較小難度
alloc 用來預置賬號以及賬號的以太幣數量,因為私有鏈挖礦比較容易,所以我們不需要預置有幣的賬號,需要的時候自己創建即可以。
coinbase 礦工的賬號,隨便填
timestamp 設置創世塊的時間戳
parentHash 上一個區塊的hash值,因為是創世塊,所以這個值是0
extraData 附加信息,隨便填,可以填你的個性信息
gasLimit 該值設置對GAS的消耗總量限制,用來限制區塊能包含的交易信息總和,因為我們是私有鏈,所以填最大。

  

 

 

 

6. 創世區塊初始化

在go-ethereum-1.7.3/build/bin目錄下執行以下命令以完成創世區塊的創建:

[root@localhost bin]# ./geth  --datadir "/root/chain" init init.json

注意:上面命令中–datadir后面的 /root/chain可以任意指定,無需提前創建,但是一定要保證有足夠的磁盤空間。init.json是我們在上一步創建的文件,注意文件名要一致。

 

7. 以太坊啟動

[root@localhost bin]# ./geth --rpc --rpccorsdomain "*" --datadir "/root/chain" --port "30303" --rpcapi "db,eth,net,web3" --networkid 100000 console
注意:上面命令中–datadir 后的”/root/chain”要跟我們上一步的–datadir 參數一致。
一直到出現Welcome to the Geth JavaScript console! 句話,並自動進入geth的命令行則說明以太坊私有鏈安裝成功了。

到目前為止,我們的私有鏈就搭建成功了。

 

8. 啟動網絡時間同步:

Linux的時間分為System Clock(系統時間)和Real Time Clock (硬件時間,簡稱RTC)。

系統時間:指當前Linux Kernel中的時間。

硬件時間:主板上有電池供電的時間。

查看系統時間的命令: #date

設置系統時間的命令: #date –set(月/日/年 時:分:秒)

例:#date –set “10/11/10 10:15”

查看硬件時間的命令: # hwclock

設置硬件時間的命令: # hwclock –set –date = (月/日/年 時:分:秒)

上述提到的是手動設置時間到一個時間點,可能與當前網絡的時間有誤差。下面介紹一下與時間服務器上的時間同步的方法

1.  安裝ntpdate工具

# yum -y install ntp ntpdate

2.  設置系統時間與網絡時間同步

# ntpdate cn.pool.ntp.org

3.  將系統時間寫入硬件時間

# hwclock --systohc

 

 參考:http://blog.csdn.net/xc70203/article/details/77988473



9.查看日志的方法
啟動以太坊的時候使用命令:
./geth --rpc --rpccorsdomain "*" --datadir "/root/chain" --port "30303" --rpcapi "db,eth,net,web3" --networkid 100000 console 2>>eth_output.log

這樣啟動后日志記錄到 文件eth_output.log

查看日志:

tail -f eth_output.log

  

10. 查看帳戶余額

開始挖礦后通過命令查看賬戶錢包有多少礦
eth.getBalance(eth.accounts[0])

  或者web3.eth.getBalance(eth.accounts["0x6c24c7e7114726a73b217af292681de445e071c7"])

查詢查看格式化的以太幣余額

web3.fromWei(eth.getBalance(eth.coinbase), "ether")  

如果有多個賬戶可以一起查看:

定義一個這樣的函數:

function checkAllBalances() {
     var totalBal = 0;
     for (var acctNum in eth.accounts) {
         var acct = eth.accounts[acctNum];
         var acctBal = web3.fromWei(eth.getBalance(acct), "ether");
         totalBal += parseFloat(acctBal);
         console.log("  eth.accounts[" + acctNum + "]: \t" + acct + " \tbalance: " + acctBal + " ether");
     }
     console.log("  Total balance: " + totalBal + " ether");
 };
//可以保存到一個腳本里,使用命令載入腳本:loadScript('/path/script/here.js')

使用命令查看所有賬戶余額:

 

 

11. 轉賬

先對賬戶解鎖:

personal.unlockAccount("0x6c24c7e7114726a73b217af292681de445e071c7", "123456");

  或者

personal.unlockAccount(eth.accounts[0], "123456");

每次記一長串的地址很麻煩,我們可以通過設置變量來acc0表示帳戶10xbe323cc4fde114269a9513a27d3e985f82b9e25d,acc1表示帳戶20x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70

> acc0 = web3.eth.accounts[0]
"0xbe323cc4fde114269a9513a27d3e985f82b9e25d"
> acc1 = web3.eth.accounts[1]
"0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70"
> web3.eth.getBalance(acc0)
1.245e+21
> web3.eth.getBalance(acc1)
0

  

然后查看余額:

> function checkAllBalances() {
     var totalBal = 0;
     for (var acctNum in eth.accounts) {
         var acct = eth.accounts[acctNum];
         var acctBal = web3.fromWei(eth.getBalance(acct), "ether");
         totalBal += parseFloat(acctBal);
         console.log("  eth.accounts[" + acctNum + "]: \t" + acct + " \tbalance: " + acctBal + " ether");
     }
     console.log("  Total balance: " + totalBal + " ether");
 };
> checkAllBalances()
  eth.accounts[0]:  0xbe323cc4fde114269a9513a27d3e985f82b9e25d  balance: 1245 ether
  eth.accounts[1]:  0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70  balance: 0 ether
  Total balance: 1245 ether

 

解鎖完成之后,即可執行轉賬操作:

web3.eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(3,"ether")})

執行轉賬后要進行挖礦操作,才會把轉賬真正完成
可以再次查看余額,驗證是否轉賬成功



多個節點創建:
第一台主機:
./geth --rpc --rpcaddr 192.168.31.149 --rpcport 9000 --datadir /root/chain --port 30303  --networkid 100000 console
第二台主機:ip不同
./geth --rpc --rpcaddr 192.168.31.40 --rpcport 9000 --datadir /root/chain --port 30303  --networkid 100000 console
查看節點信息:
admin.nodeInfo.enode
admin.peers
查看節點數
net.peerCount
添加節點:admin.addPeer("enode://.........@ip:port")







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM