標籤:

構建一個以太坊私有鏈(Windows版)

如果我們想要進行基於以太坊的開發,那麼使用私有鏈或者testnet都是個不錯的選擇,其中私有鏈因其安全性以及靈活性更是廣受眾多以太坊開發者的歡迎,本文講述如何在 Windows 10 下構建一個以太坊私有鏈。

一、安裝Geth

這裡我們使用最流行的以太坊客戶端-Geth。首先到Go Ethereum Downloads下載Windows客戶端並安裝。

在安裝過程中,需要注意的是要勾選Development tools.

安裝完成後,打開Powershell, 輸入geth version,安裝成功的話應該出現和以下類似的信息:

PS C:Usersliang> geth versionnGethnVersion: 1.7.2-stablenGit Commit: 1db4ecdc0b9e828ff65777fb466fc7c1d04e0de9nArchitecture: amd64nProtocol Versions: [63 62]nNetwork Id: 1nGo Version: go1.9nOperating System: windowsnGOPATH=nGOROOT=c:gon

至此 Geth安裝完成。

二、生成賬戶

這一步我們需要決定數據存放的位置以及生成新的以太坊賬戶。

PS C:Usersliang> geth account new --datadir C:UsersliangDocumentsethereumnWARN [10-24|16:32:32] No etherbase set and no accounts found as defaultnYour new account is locked with a password. Please give a password. Do not forget this password.nPassphrase:nRepeat passphrase:nAddress: {e0803904cbfce8e07745e1b404de43ce6f1e43bc}n

在創建賬戶的過程中需要輸入密碼,最後返回一個生成的地址。將該地址記錄下來,後面會使用。

另外這裡的數據目錄選擇了C:UsersliangDocumentsethereum, 在創建完賬戶以後該目錄下會生成一個『keystore』文件夾,用於保存加密後的私鑰等信息。

三、配置創世區塊文件

我們需要有一個初始化文件,用來生成一些基本的配置和創世區塊

在目錄C:UsersliangDocumentsethereum里創建genesis.json文件,寫入以下內容

{n "config": {n "chainId": 15,n "homesteadBlock": 0,n "eip155Block": 0,n "eip158Block": 0n },n "difficulty": "0x400",n "gasLimit": "0x2100000",n "alloc": {n "e0803904cbfce8e07745e1b404de43ce6f1e43bc": n { "balance": "0x1337000000000000000000" } n }n}n

在上面的文件中,我們配置了初始難度、網路id(15)、費用以及給上一步我們創建的賬戶分配了ETH。

執行以下命令,進行初始化

PS C:Usersliang> geth -datadir C:UsersliangDocumentsethereum init C:UsersliangDocumentsethereumgenesis.jsonnINFO [10-24|16:39:15] Allocated cache and file handles database=C:UsersliangDocumentsethereumgethchanindata cache=16 handles=16nINFO [10-24|16:39:15] Writing custom genesis blocknINFO [10-24|16:39:15] Successfully wrote genesis state database=chaindatan hash=a703b2…9ce84cnINFO [10-24|16:39:15] Allocated cache and file handles database=C:UsersliangDocumentsethereumgethlignhtchaindata cache=16 handles=16nINFO [10-24|16:39:15] Writing custom genesis blocknINFO [10-24|16:39:15] Successfully wrote genesis state database=lightchaindatan hash=a703b2…9ce84cn

看到最後的Successfully wrote genesis state就說明初始化成功了。

四、啟動私有鏈

我們可以根據自己的需求,對geth使用不同的參數進行啟動。常見的參數如下:

--datadir

私有鏈數據存放目錄,包括Ethereum使用的Leveldb數據

--nodiscover

既然是私有鏈,就要儘可能的避免和其他節點的自動交互。這裡的設置為除非手工添加其他節點,否則不會自動發現。

--rpc

打開RPC介面

--rpcport

RPC監聽埠,一般私有鏈是8545

--rpcapi

在RPC介面上打開哪些功能,私有鏈可以盡情開放,但是注意公鏈上這一部分的設置一定要小心。因為第三方可以通過調用你的這個RPC來實現你打開的所有功能。

--rpccorsdomain

設置哪些URL可以連接你的RPC介面。

--identity

給節點起名,標記節點

--networkid

和genesis.json里的chainId一致,這裡是15

--nat

根據自己網路情況選擇是否添加

--port

配置geth的埠

geth --datadir "C:UsersliangDocumentsethereum" --nodiscover --rpc --rpcport "8545" --rpccorsdomain "*" --rpcapi eth,web3,personal,net --ipcpath="C:UsersliangDocumentsethereumgeth.ipc" --identity MyFirstNode --networkid 15 --nat "any" --port "30303"n

為了方便以後使用,我們可以把上面的命令寫入到startnode.bat這樣一個批處理文件。

啟動過程如下:

PS C:Usersliang> geth --datadir "C:UsersliangDocumentsethereum" --nodiscover --rpc --rpcport "8545" --rpccorsdomain "*" --rpcapi eth,web3,personal,net --identity MyFirstNode --networkid 15 --nat "any" --port "30303"nINFO [10-24|16:47:39] Starting peer-to-peer node instance=Geth/MyFirstNode/v1.7.2-stable-1db4ecdc/windows-amd64/go1.9nINFO [10-24|16:47:39] Allocated cache and file handles database=C:UsersliangDocumentsethereumgethchaindata cache=128 handles=1024nWARN [10-24|16:47:39] Upgrading database to use lookup entriesnINFO [10-24|16:47:39] Database deduplication successful deduped=0nINFO [10-24|16:47:39] Initialised chain configuration config="{ChainID: 15 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Engine: unknown}"nINFO [10-24|16:47:39] Disk storage enabled for ethash caches dir=C:UsersliangDocumentsethereumgethethash count=3nINFO [10-24|16:47:39] Disk storage enabled for ethash DAGs dir=C:UsersliangAppDataEthash count=2nINFO [10-24|16:47:39] Initialising Ethereum protocol versions="[63 62]" network=15nINFO [10-24|16:47:39] Loaded most recent local header number=0 hash=a703b2…9ce84c td=1024nINFO [10-24|16:47:39] Loaded most recent local full block number=0 hash=a703b2…9ce84c td=1024nINFO [10-24|16:47:39] Loaded most recent local fast block number=0 hash=a703b2…9ce84c td=1024nINFO [10-24|16:47:39] Regenerated local transaction journal transactions=0 accounts=0nINFO [10-24|16:47:39] Starting P2P networkingnINFO [10-24|16:47:39] RLPx listener up self="enode://24ddd369b1581a21775a9567da330fa5312fe8d523e7d470b3809358266e3c5c2bc8cd1388d71296135585ea0c727bdfd3b1c2f07644a3d6e22fcc7d4983e122@[::]:30303?discport=0"nINFO [10-24|16:47:39] HTTP endpoint opened: http://127.0.0.1:8545nINFO [10-24|16:47:39] IPC endpoint opened: .pipegeth.ipcn

五、連接到私有鏈

這一步需要打開一個新的Powershell窗口。我們可以通過ipc或者rpc兩種方式連接到私有鏈。

1. RPC方式

PS C:Usersliang> geth attach http://localhost:8545nWelcome to the Geth JavaScript console!nninstance: Geth/MyFirstNode/v1.7.2-stable-1db4ecdc/windows-amd64/go1.9ncoinbase: 0xe0803904cbfce8e07745e1b404de43ce6f1e43bcnat block: 0 (Thu, 01 Jan 1970 08:00:00 CST)n modules: eth:1.0 net:1.0 personal:1.0 rpc:1.0 web3:1.0nn>n

2. IPC方式

PS C:Usersliang> geth attachnWelcome to the Geth JavaScript console!nninstance: Geth/MyFirstNode/v1.7.2-stable-1db4ecdc/windows-amd64/go1.9ncoinbase: 0xe0803904cbfce8e07745e1b404de43ce6f1e43bcnat block: 0 (Thu, 01 Jan 1970 08:00:00 CST)n datadir: C:UsersliangDocumentsethereumn 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.0nn> n

六、基本操作

連接到私有鏈以後,我們可以進行一些基本的操作。比如查詢餘額,轉賬等。

> miner.start(2) // 使用2個線程進行挖礦nnulln> eth.accounts // 列出當前賬戶n["0xe0803904cbfce8e07745e1b404de43ce6f1e43bc"]n> eth.getBalance(eth.accounts[0]) // 查詢當前賬戶餘額,單位是wein2.3229435729235784806170624e+25n> personal.newAccount(password) // 創建新賬戶n"0x1219058b07201110d7c9a16dd22d8eca4d099d33"n> web3.fromWei(eth.getBalance(eth.coinbase), ether) // 查詢賬戶餘額,單位是ETHn23229620.729235784806170624n> net.version // 查詢網路idn"15"n> personal.unlockAccount(eth.accounts[0], password, 300) // 解鎖賬戶ntruen> web3.fromWei(eth.getBalance(eth.accounts[1]), ether) // 查詢賬戶餘額n0n> eth.sendTransaction({from: eth.coinbase, to: eth.accounts[1], value: web3.toWei(100, "ether")}) // 發起一筆轉賬n"0xd62ad2aa1a1b6b471e713ddd0bf35e070738da43e373b3ce17b3857a0dec3e87"n> web3.fromWei(eth.getBalance(eth.accounts[1]), ether) // 查看轉賬後的餘額n100n

另外挖礦啟動後,日誌應該顯示如下:

INFO [10-24|17:09:37] Mining too far in the future wait=2snINFO [10-24|17:09:39] Commit new mining work number=147 txs=0 uncles=0 elapsed=2nINFO [10-24|17:09:41] Successfully sealed new block number=147 hash=b78dcf…0d5a90nINFO [10-24|17:09:41] ?? block reached canonical chain number=142 hash=074752…74cdd2nINFO [10-24|17:09:41] Commit new mining work number=148 txs=0 uncles=0 elapsed=0nINFO [10-24|17:09:41] ?? mined potential block number=147 hash=b78dcf…0d5a90n

七、連接其他錢包

本地私有鏈搭建完成以後,可以連接到本地安裝的Metamask或者Mist錢包,以下是Mist連接到私有鏈後的界面:

參考資料:

Ethereum Tutorials and Tips by Hudson

build-your-own-blockchain


推薦閱讀:

深入解析以太坊中調用合約的三種方法
入坑比特幣投資第一步——場外交易
合約的另一種調用方式——IPC

TAG:以太坊 |