Mac環境搭建以太坊私有鏈


原文地址: 石匠的blog

為了測試以太坊智能合約,最方便的是在本地搭建一個以太坊私有鏈。在mac上搭建環境主要需要以下步驟。

geth安裝

geth是go-ethereum的簡寫,是一個用go語言編寫的以太坊客戶端,是在以太坊智能合約開發中最常用的命令行工具。
在mac上可以通過brew工具直接安裝:

brew tap ethereum/ethereum
brew install ethereum

詳細的安裝說明也可以查看官方文檔

安裝完成后,可以再mac的terminal中,用以下命令測試工具是否正常:

geth -h

創建私有鏈創世區塊

為了創建一個自己測試的私有鏈,需要首先創建一個創世區塊,可以自定義創世區塊信息信息genesis.json:

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

區塊參數釋義:

chainId: 指定了獨立的區塊鏈網絡ID。網絡ID在連接到其他節點的時候會用到,以太坊公網的網絡ID是 1,為了不與公有鏈網絡沖突,運行私有鏈節點的時候要指定自己的網絡ID。不同ID網絡的節點無法相互連接。
HomesteadBlock:	當設置為0表示使用Homestead發布該鏈。
nonce:	一個64位隨機數,用於挖礦,注意它和mixhash的設置需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。
mixhash: 與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。注意它和nonce的設置需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。
difficulty: 設置設置當前區塊的難度,值越大挖礦就越難。
alloc: 用來預置賬號以及賬號的以太幣數量。
coinbase: 礦工賬號
timestamp: 設置創世塊的時間戳
parentHash: 上一個區塊的hash,創世塊就為0
extraData: 附加信息,自己可以填寫任意信息
gasLimit: 該值設置對GAS的消耗總量限制,用來限制區塊能包含的交易信息總和

找一個合適的目錄,執行命令,創建創世區塊:

geth --datadir "./" init genesis.json

運行成功后會在當前目錄創建geth和keystore兩個文件夾

  • geth目錄:保存鏈上的區塊數據
  • keystore目錄:保存鏈上的用戶信息

私有鏈測試

啟動私有鏈

前面建立創世區塊成功后,啟動區塊鏈程序:

geth --datadir "./" --nodiscover console 2>>geth.log

相關參數:

--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 "/home/TestChain1" 私有鏈存放路徑(最好跟公有鏈路徑不同)
--port "30303" 網絡監聽端口,用來和其他節點手動連接
--identity “TestnetMainNode" 用來標識你的節點的,方便在一大群節點中識別出自己的節點

console指定了啟動成功后進入命令行界面,2>>將日志重定向到geth.log中,不然日志也會輸出到界面上,會和命令行界面混在一起,不方便命令行測試。

創建賬號

在命令行中創建賬號:

>personal.newAccount()

然后會提示輸入賬號密碼,成功后會返回一個賬號地址,比如:0xc7ca64442b98cbfdb6f056841ccd40f8b7f054bb

也可以通過給newAccount傳遞密碼作為參數,一次性完成創建:

>personal.newAccount("123456")

查看余額

查看賬戶的余額:

>eth.getBalance("0xc7ca64442b98cbfdb6f056841ccd40f8b7f054bb")

挖礦

開始挖礦:

>miner.start()

開始后,可以tailf geth.log看看挖礦初始化是否成功,以及挖礦過程細節。
停止挖坑:

>miner.stop()

轉賬

將一個賬戶的代幣轉移到另外一個賬戶,需要通過事務接口完成 eth.sendTransaction({from: acc0, to: acc1, value: amount}),比如:

>eth.sendTransaction({from: "0x01b5ecbcd8d46c1a9ee52e8b8a30bb6426dffb1b", to: "0xe6e4e20c95abc11dca8b3e9c292a34725bf89930", value: 20})

轉出的賬戶需要密碼解鎖,不然會發生類似以下錯誤:

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

很好理解,如果轉出別人賬戶的代幣,不需要密碼驗證,那就毫無安全可言了,可以通過以下方式,解鎖賬戶后繼續轉賬:

>personal.unlockAccount("0xab04698365ed79ef22921edad8f6f516ca40cecb")

轉賬完成后,可以通過eth.getBalance()查看余額,但是馬上查詢卻發現並沒有變化,這是因為sendTransaction這是發起了一筆交易事務,還沒有得到確認,只是將這個事務放到了待提交池中。區塊鏈的機制中是新創建區塊的時候,會就從事務池中找出所有事務,進行有效性驗證,驗證成功后進行挖礦並將所有相關事務打包到區塊中,待新的去區塊成功加入到區塊鏈中后,之前的轉賬就得到了最終的確認和永久固話。

所以,sendTransaction成功后,需要調用挖礦命令miner.start()創建區塊,然后再查看余額會發現轉賬金額變化已經生效。


免責聲明!

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



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