如何建立私鏈
教程簡介:
本教程描述瞭如何搭建Ethereum私鏈用於在以太坊鏈上進行開發實驗。
建立私鏈的目的:
搭建私鏈的目的是方便在鏈上做實驗。在日常區塊鏈開發中當然可以使用公網主鏈,但是這樣會造成不必要的金錢浪費。因為在以太坊鏈上幹任何事都需要消耗gas。所以對於日常實驗性開發,一般都是在自己的私鏈上做實驗。
環境搭建:
本教程開發環境
作業系統:Windows10
以太坊客戶端:Windows版Geth 1.6.7
可以從這裡下載:
https://gethstore.blob.core.windows.net/builds/geth-windows-amd64-1.7.0-6c6c7b2a.exe
如何建立私鏈:
建立創世配置檔案:
首先需要建立一個“創世”json配置檔案,此檔案描述了創世區塊的一些引數。下面就是檔案中的內容:
{ "coinbase": "0x0000000000000000000000000000000000000000", "config": { "homesteadBlock": 5 }, "difficulty": "0x20000", "extraData": "0x", "gasLimit": "0x2FEFD8", "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578", "nonce": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp": "0x00", "alloc": { "dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6": { "balance":"100000000000000000000000000000" } } }
將上面這段程式碼複製到一個文字檔案裡並起名為genesis.json
創世!:
為了不和主鏈的資料衝突,這裡建議建立自己的私鏈資料資料夾。在我的電腦上在E盤建了一個EthDBSpace作為以太坊實驗工作區,並在裡面建立了一個PrivChain資料夾作為我的第一個私鏈的資料存放資料夾
這裡為了方便管理將genesis.json放在了EthDBSpace資料夾下
開啟Windows命令列
鍵入如下命令
geth --identity"mydev" --rpc --rpccoradomain "*" datadir "E:\EthDBSpace\PrivChain" --rpcapi "db,eth,net.web3" --network 99 init "E:\EthDBSpace\genesis.json"
–datadir 選項用來指定我們私鏈的資料目錄。在我的電腦上是E:\EthDBSpace\PrivChain
init 命令為創世命令,後面緊跟著我們的創世配置檔案路徑。初始化改變network和identity就可以了,直接寫成.bat檔案
點選回車後執行結果如下
此時創世完成!
建立賬戶:
為了在私鏈上做實驗,我們還需要在私鏈上建立自己的賬戶
Windows命令列鍵入
geth --datadir "E:\EthDBSpace\PrivChain" --port 30303 --identity "mydev" --rpccorsdomain "*" --networkid 99 console
我們由於已經創世成功所以第二次進入客戶端時我們不用再次指定genesis.json檔案路徑,而是直接–datadir 指明私鏈資料路徑即可。
console命令用來開啟geth的命令列。
點選回車後,客戶端會先經過一陣初始化。在命令提示符出現後,說明已經進入geth console
在geth命令列中鍵入
personal.newAccount('Your Password')
personal.newAccount 函式用來建立賬戶,其中引數為賬戶密碼
點選回車後會出現
賬戶建立成功後會在命令下方以綠色字元列明建立賬戶的地址,也即賬戶的公鑰
我們可以先查下賬戶餘額,在geth命令列中鍵入:
my=eth.accounts[0]
eth.getBalance(my)
my=eth.accounts[0],此句的目的是將我們剛建立的賬戶地址賦值給my變數。這樣可以簡化後續賬戶地址輸入。其中eth.accounts記錄了本機上所有賬戶地址。由於我們第一次建立賬戶,所以目前電腦上只有一個賬戶。所以這裡我們用eth.accounts[0]提取第一個賬戶地址。eth.getBalance函式用來獲得賬戶餘額,引數填入賬戶地址。這裡的my變數記錄的就是第一個賬戶的地址。
執行結果如下:
可以看到此時賬戶裡沒錢。在以太坊上轉賬、釋出合約、執行合約都需要費錢。而錢來自挖礦,下面我們先挖礦賺些錢。
挖礦賺錢:
目前的以太坊使用POW(Proof of Work)共識機制來激勵人們去維護賬本記賬。此機制的核心是系統出一道題,讓全網有意記賬節點來求解,第一個求解出題目答案的節點會獲得新區塊的記賬權並獲得eth作為獎勵。其中有意記賬的節點叫做礦工節點。下面我們在我們的私鏈上挖礦賺一些錢便於我們後續的轉賬實驗。
繼續在geth命令列鍵入如下命令開始挖礦:
miner.start()
1
點選回車後會看見客戶端開始挖礦,命令列裡不斷顯示出塊進度
第一次需要初始化時間比較長並且無法stop
由於是私鏈,目前就一個節點在挖礦不存在競爭。所以開挖若干秒即可停止挖礦,挖得得錢已經可以進行後續實現。
鍵入如下命令停止挖礦
miner.stop()
此時再次檢視我們的賬戶餘額
eth.getBalance(my)
會看到我們的餘額多了一大筆錢,顯示的餘額以以太坊貨幣單位wei來計算。關於wei到eth的換算表參見http://www.ethdocs.org/en/latest/ether.html
轉賬實驗:
下面我們嘗試下在我們自己建立的私鏈上進行轉賬
- 先建立第二賬戶,繼續在geth命令列鍵入如下命令
personal.newAccount('123')
other=eth.accounts[1]
將第二賬戶地址賦值給other變數,便於後續輸入
在轉賬前需要對轉出賬戶進行解鎖,繼續在geth命令列鍵入如下命令
personal.unlockAccount(my)
由於目前是my賬戶中有錢,other賬戶沒錢,所以這裡解鎖我們的轉出賬戶my
回車後會提示輸入密碼,我這個賬戶的密碼為123,輸入後回車即可解鎖
開始轉賬,在geth命令列鍵入
eth.sendTransaction({from:my, to:other, value:10000})
其中from為轉出賬戶,這裡我們輸入記錄了第一個賬戶地址的my變數
to為轉入賬戶,這裡我們輸入記錄額第二個賬戶地址的other變數
value指定了轉出金額,單位為wei,這裡我們轉出10000wei
鍵入後結果如下
可以看到轉賬請求已經提交
此時我們再次檢視兩個賬戶的餘額
eth.getBalance(my)
eth.getBalance(other)
查詢餘額結果如下:
此時會發現一個奇怪現象,前面的轉賬請求已經提交,為什麼兩個賬戶的餘額沒有發生任何變化?回想剛才我們講到的,以太坊使用POW共識激勵礦工記賬,而由於我們建立的是私鏈目前只有我們一個節點,所以此時並沒有其它節點參與記賬。所以我們需要通過挖礦把這筆轉賬記錄到塊中。
繼續挖礦,在geth 控制檯中鍵入
miner.start()
等待挖一會後停止挖礦
miner.stop()
再次查詢,發現轉賬已到位