本文所搭建的環境是在 Mac 上的開發環境,其餘操做系統上與此很是類似,依然有參考價值。
做爲一枚區塊鏈開發工程師,本地的開發環境是必不可少的。咱們首先看看須要哪些工具:git
這些工具的安裝在官方文檔上都有很是詳細的講解,這邊就很少贅述了。github
下文中的文件均已該目錄爲當前路徑。
先新建好以下初始目錄,web
. ├── data └── genesis.json
genesis.json
:初始化私有鏈的配置文件。data
:存放區塊鏈數據的目錄。以太坊支持自定義創世區塊,要運行私有鏈那麼就必須定義本身的創世區塊。創世區塊的信息就寫在 genesis.json
中,內容以下:json
{ "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "alloc": {}, "nonce": "0x0000000000000042", "difficulty": "0x020000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0x4c4b40" }
大概解釋下其中的幾個參數:瀏覽器
接下來咱們就須要將創世區塊的初始信息寫入區塊鏈中,使用 geth init
命令。網絡
# geth --datadir "./data" --networkid 31415926 --rpc --rpccorsdomain "*" init ./genesis.json
大體會輸出以下信息:app
INFO [03-12|19:36:02] Allocated cache and file handles INFO [03-12|19:36:02] Writing custom genesis block INFO [03-12|19:36:02] Persisted trie from memory database INFO [03-12|19:36:02] Successfully wrote genesis state
此時的目錄結構就變成以下:cors
. ├── data │ ├── geth │ │ ├── chaindata │ │ │ ├── 000001.log │ │ │ ├── CURRENT │ │ │ ├── LOCK │ │ │ ├── LOG │ │ │ └── MANIFEST-000000 │ │ └── lightchaindata │ │ ├── 000001.log │ │ ├── CURRENT │ │ ├── LOCK │ │ ├── LOG │ │ └── MANIFEST-000000 │ └── keystore └── genesis.json
其中 keystore
目錄用來保存帳戶信息,geth
目錄用來保存區塊信息。dom
讓咱們接下來啓動私有鏈吧!工具
# geth --datadir data --networkid 31415926 --rpc --rpccorsdomain "*" --nodiscover console
輸出以下即表示成功進入 geth
的控制檯:
Welcome to the Geth JavaScript console! instance: Geth/v1.8.2-stable/darwin-amd64/go1.10 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.0 >
先別急着去挖礦,咱們得先建立一個帳戶,否則挖出的 ether 塞哪裏去呢!
ether 也就是咱們說的以太幣(ETH)。
先來看看是否已存在帳戶了,
> eth.accounts []
那咱們新建兩個(用於後面帳戶間的轉帳演示),
> personal.newAccount() Passphrase: Repeat passphrase: "0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a" > personal.newAccount() Passphrase: Repeat passphrase: "0x29a079bdbc6d4d122178fbe01558e5df2d008523"
如今咱們就有兩個帳戶了,
> eth.accounts ["0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a", "0x29a079bdbc6d4d122178fbe01558e5df2d008523"]
多說一句,咱們此時去看看 keystore
目錄,多出了兩個文件,也就是咱們剛纔建立的兩個帳戶密鑰(丟了它,你就等於丟了幣)
. ├── UTC--2018-03-12T11-46-09.722094891Z--880004bb64282fb01a3a2500ddf1f4bb5ad4b64a └── UTC--2018-03-12T11-48-04.771328116Z--29a079bdbc6d4d122178fbe01558e5df2d008523
這時候讓咱們看看帳戶裏有沒有 ether,
> eth.getBalance(eth.accounts[0]) 0
一開始你們的帳戶裏都沒有 ether,那麼都須要經過挖礦來獲取。使用 miner.start()
命令開啓挖礦,默認挖出的 ether 是存到 eth.coinbase
帳戶中的,也就是第一個帳戶。
> eth.coinbase INFO [03-12|19:55:13] Etherbase automatically configured address=0x880004Bb64282fb01A3A2500DDF1F4bB5AD4b64A "0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a"
若是咱們想要把挖到的礦存入其餘帳戶,能夠這樣:
> miner.setEtherbase(eth.accounts[1]) true
好了,咱們開始挖吧~
> miner.start(1) > INFO [03-12|20:00:44] Commit new mining work number=1 txs=0 uncles=0 elapsed=513.188µs INFO [03-12|20:00:47] Generating DAG in progress epoch=0 percentage=0 elapsed=1.668s INFO [03-12|20:00:49] Generating DAG in progress epoch=0 percentage=1 elapsed=3.368s
等到 percentage 達到100就能挖出來了,請耐心等待~
INFO [03-12|20:04:15] Successfully sealed new block number=4 hash=81db99…4db568 INFO [03-12|20:04:15] 🔨 mined potential block number=4 hash=81db99…4db568
出現小錘頭的時候意味着你挖到了!
那麼咱們先暫停挖礦,
> miner.stop() true
而後看看帳戶餘額,
> eth.getBalance(eth.accounts[0]) 85000000000000000000
不要被這個零的個數嚇到,這裏默認顯示的以 wei
爲單位的,而 1 ether = 10^18 wei
,因此咱們轉換一下單位立馬就清晰了,
> web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether') 85
嗯,其實咱們目前就挖了 85 個 ether~
既然手頭有了錢,分點給好朋友吧!
記得在轉帳前把本身解鎖,類比銀行卡轉帳,你得先輸入密碼才能轉帳。
> personal.unlockAccount(eth.accounts[0]) Unlock account 0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a Passphrase: true
我決定轉給好朋友 8 個 ether!
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(8,'ether')}) INFO [03-12|20:24:15] Submitted transaction fullhash=0x996a3037b75585415ece5b1dc28181833691760176b3f24066c93e7093a967e5 recipient=0x29a079BdbC6D4d122178FBe01558E5DF2D008523 "0x996a3037b75585415ece5b1dc28181833691760176b3f24066c93e7093a967e5"
咱們能夠看到目前只是向區塊鏈提交了這筆轉帳交易,誰來執行這筆交易呢?礦工
咱們仍是得開啓挖礦模式,把這筆轉帳交易執行掉。而後咱們再來看看好朋友的帳戶裏面有多少 ether 了,
> eth.getBalance(eth.accounts[1]) 8000000000000000000
遙想當初第一次安裝以太坊錢包的時候,爲了下載以太坊主網絡的全節點數據,整整下了5天,而後卡在最後幾個區塊死活動不了,最後棄療。。。
這段磨人的經歷想一想都心塞,不事後來用了 Ethfans 的星火節點計劃,導入了超級節點,peers 一會兒增多,下載確實快多了。說回正題,此次咱們須要讓 Ethereum Wallet 連上咱們的私有鏈,而後利用錢包的 UI 界面快速開發部署智能合約。
/Applications/Ethereum\ Wallet.app/Contents/MacOS/Ethereum\ Wallet --rpc "/path/to/data/geth.ipc"
注意這裏的 --ipc
參數值是剛纔項目裏面 data
目錄下的 geth.ipc
,就是讓錢包鏈接上本地的私有鏈。
若是出現 miner.start() 直接返回 null 的狀況,請先查看是否還未建立過帳戶。
若是以前有搭建過本地私有鏈,那麼請先將以前的 .ethash 目錄刪除,該目錄在當前登陸用戶的家目錄下。
筆者一開始是選擇最簡單的開發流程去實踐的:下載官方的 Ethereum Wallet 而後同步主網全節點,而後開發合約並部署。可是下載全節點的經歷實在是不想回想,沒日沒夜同步了好幾天還沒同步全(離當前最新區塊老是差那麼幾塊同步不了,固然後來是解決了)。後來請教技術羣友告知了我可使用 Remix + MetaMask 這種輕量級開發流程,確實方便不少,調試開發用基於瀏覽器的 Remix IDE,部署合約用基於瀏覽器插件的 MetaMask。
可是有時候 Remix 加載很慢,並且這個解決方案沒網絡就不行了(大部分都有 WIFI 能夠連,可是有的時候真的是沒網絡。。。)私有鏈挺好的解決了上述兩個困擾個人問題,並且在搭建和使用私有鏈的過程,就是一次比較完整的區塊鏈體驗~
歡迎關注公衆號:『比特扣』,與我一塊兒探索區塊鏈的世界。