以太坊本地開發環境搭建

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
本文所搭建的環境是在 Mac 上的開發環境,其他動作系統上與此非常相似,依然有參考價值。

作為一枚區塊鏈開發工程師,本地的開發環境是必不可少的。我們首先看看需要哪些工具:

  1. go-ethereum
  2. solc
  3. Ethereum Wallet

這些工具的安裝在官方文檔上都有非常詳細的講解,這邊就不多贅述了。

目錄結構

下文中的檔案均已該目錄為當前路徑。

先建立好如下初始目錄,

.├── data└── genesis.json
  • genesis.json:初始化私人鏈的設定檔。
  • data:存放區塊鏈資料的目錄。

設定檔

以太坊支援自訂創世區塊,要運行私人鏈那麼就必須定義自己的創世區塊。創世區塊的資訊就寫在 genesis.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"}

大概解釋下其中的幾個參數:

  • alloc:用來預設定帳號以及帳號的 ether 數量。因為私人鏈挖礦比較容易,所以我們不需要預設定帳號。比如,{"0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a":{"balance":"100000000000000000000000000000"}}
  • nonce:一個64位隨機數,用於挖礦。
  • mixhash:和 nonce 配合用於挖礦,由上一個區塊的一部分產生的 hash。
  • difficulty:設定當前區塊的難度,如果難度過大,cpu挖礦就很難,所以這邊設定的很小,不要跟自己過不去嘛。
  • coinbase:預設挖礦的礦工帳號。
  • timestamp:設定創世塊的時間戳記。
  • parentHash:上一個區塊的hash值,因為是創世塊,所以值是0。
  • extraData:附加資訊,隨便填。
  • gasLimit:設定對GAS的消耗總量限制,用來限制區塊能包含的交易資訊總和。因為我們是私人鏈,所以可以寫的大一些,方便開發測試。

初始化

接下來我們就需要將創世區塊的初始資訊寫入區塊鏈中,使用 geth init 命令。

# geth --datadir "./data" --networkid 31415926 --rpc --rpccorsdomain "*" init ./genesis.json

大致會輸出如下資訊:

INFO [03-12|19:36:02] Allocated cache and file handlesINFO [03-12|19:36:02] Writing custom genesis blockINFO [03-12|19:36:02] Persisted trie from memory databaseINFO [03-12|19:36:02] Successfully wrote genesis state

此時的目錄結構就變成如下:

.├── data│  ├── geth│  │  ├── chaindata│  │  │  ├── 000001.log│  │  │  ├── CURRENT│  │  │  ├── LOCK│  │  │  ├── LOG│  │  │  └── MANIFEST-000000│  │  └── lightchaindata│  │      ├── 000001.log│  │      ├── CURRENT│  │      ├── LOCK│  │      ├── LOG│  │      └── MANIFEST-000000│  └── keystore└── genesis.json

其中 keystore 目錄用來儲存賬戶資訊,geth 目錄用來儲存區塊資訊。

啟動

讓我們接下來啟動私人鏈吧!

# 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.coinbaseINFO [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µsINFO [03-12|20:00:47] Generating DAG in progress               epoch=0 percentage=0 elapsed=1.668sINFO [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…4db568INFO [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 0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64aPassphrase: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 可以連,但是有的時候真的是沒網路。。。)私人鏈挺好的解決了上述兩個困擾我的問題,而且在搭建和使用私人鏈的過程,就是一次比較完整的區塊鏈體驗~

歡迎關注公眾號:『位元扣』,與我一起探索區塊鏈的世界。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.