以太坊本地私有鏈開發環境搭建

Ethereum Bootstrap

經過本文所述方法和項目中的腳本,咱們能夠快速的搭建好本身的私鏈進行開發測試。javascript

倉庫中包含的工具備:java

  • 一個測試帳戶導入腳本,在首次部署時將五個測試帳戶私鑰導入以太坊節點。
  • 一個genesis.json配置文件,爲對應的五個測試帳戶提供初始資金(以太幣),方便開發測試。
  • 一個快速啓動私有鏈節點並進入交互模式的腳本。
  • 一個合約樣例:contracts/Token.sol。這是一個使用合約語言Solidity編寫的智能合約。Token合約的功能是發行一種token(能夠理解爲貨幣,積分等等),只有合約的建立者有發行權,token的擁有者有使用權,而且能夠自由轉帳。

測試帳戶私鑰是放在Github上的公開數據,千萬不要用於正式環境中或者公有鏈上。若是在測試環境以外的地方使用這些私鑰,你的資金將會被竊取!git

準備

  1. 在本地安裝好go-ethereumsolc, 能夠執行gethsolc命令。若是操做系統是ubuntu, 安裝官方的ethereum安裝包便可。
  2. 將本倉庫經過git clone命令下載到本地。
  3. 安裝expect,工具腳本用它來自動化一些過程。例如在ubuntu上: sudo apt-get install expect

啓動geth

  1. 進入本倉庫目錄: cd ethereum-bootstrap
  2. 導入測試帳戶私鑰: ./bin/import_keys.sh
  3. 啓動私有鏈節點: ./bin/private_blockchain.sh. 啓動成功後能夠看到相似以下輸出: 
  4. 此時以太坊交互式控制檯已經啓動,咱們能夠開始測試和開發了。

注意:工具腳本假設你的geth安裝在默認位置, 能夠直接經過geth執行。若是geth命令安裝在非標準的位置,能夠設置GETH環境變量指定geth可執行文件的路徑。例如:github

GETH=/some/weird/dir/geth ./bin/import_keys.shweb

使用以太坊控制檯編譯和部署智能合約

contracts目錄下有一個智能合約樣例文件Token.sol, 經過Solidity語言實現了基本的代幣功能, 合約持有者能夠發行代幣, 使用者能夠互相轉帳.json

咱們可使用以太坊控制檯來編譯部署這個合約.以太坊控制檯是最基本的工具,使用會比較繁瑣.社區也提供了其餘更加方便的部署工具,此處不作討論.bootstrap

第一步,咱們先把合約代碼壓縮爲一行.新建一個ssh session, 切換到geth用戶環境su - geth, 而後輸入:cat contracts/Token.sol | tr '\n' ' '.ubuntu

切換到以太坊控制檯,把合約代碼保存爲一個變量:網絡

var tokenSource = 'contract Token {     address issuer;     mapping (address => uint) balances;      event Issue(address account, uint amount);     event Transfer(address from, address to, uint amount);      function Token() {         issuer = msg.sender;     }      function issue(address account, uint amount) {         if (msg.sender != issuer) throw;         balances[account] += amount;     }      function transfer(address to, uint amount) {         if (balances[msg.sender] < amount) throw;          balances[msg.sender] -= amount;         balances[to] += amount;          Transfer(msg.sender, to, amount);     }      function getBalance(address account) constant returns (uint) {         return balances[account];     } }';

而後編譯合約代碼:session

var tokenCompiled = web3.eth.compile.solidity(tokenSource);

經過tokenCompiled.Token.code能夠看到編譯好的二進制代碼,經過tokenCompiled.Token.info.abiDefinition能夠看到合約的ABI

接下來咱們要把編譯好的合約部署到網絡上去.

首先咱們用ABI來建立一個javascript環境中的合約對象:

var contract = web3.eth.contract(tokenCompiled.Token.info.abiDefinition);

咱們經過合約對象來部署合約:

var initializer = {from: web3.eth.accounts[0], data: tokenCompiled.Token.code, gas: 300000};

var callback = function(e, contract){
    if(!e) {
      if(!contract.address) {
        console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined...");
      } else {
        console.log("Contract mined!");
        console.log(contract);
      }
    }
};

var token = contract.new(initializer, callback);

contract.new方法的第一個參數設置了這個新合約的建立者地址from, 這個新合約的代碼data, 和用於建立新合約的費用gasgas是一個估計值,只要比所須要的gas多就能夠,合約建立完成後剩下的gas會退還給合約建立者.

contract.new方法的第二個參數設置了一個回調函數,能夠告訴咱們部署是否成功.

contract.new執行時會提示輸入錢包密碼.執行成功後,咱們的合約Token就已經廣播到網絡上了.此時只要等待礦工把咱們的合約打包保存到以太坊區塊鏈上,部署就完成了.

在公有鏈上,礦工打包平均須要15秒,在私有鏈上,咱們須要本身來作這件事情.首先開啓挖礦:

miner.start(1)

此時須要等待一段時間,以太坊節點會生成挖礦必須的數據,這些數據都會放到內存裏面.在數據生成好以後,挖礦就會開始,稍後就能在控制檯輸出中看到相似:

:hammer:Mined block

的信息,這說明挖到了一個塊,合約已經部署到以太坊網絡上了!此時咱們能夠把挖礦關閉:

miner.stop(1)

接下來咱們就能夠調用合約了.先經過token.address得到合約部署到的地址, 之後新建合約對象時可使用.這裏咱們直接使用原來的contract對象:

// 本地錢包的第一個地址所持有的token數量
> token.getBalance(web3.eth.accounts[0])
0

// 發行100個token給本地錢包的第一個地址
> token.issue.sendTransaction(web3.eth.accounts[0], 100, {from: web3.eth.accounts[0]});
I1221 11:48:30.512296   11155 xeth.go:1055] Tx(0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef) to: 0x37dc85ae239ec39556ae7cc35a129698152afe3c
"0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef"

// 發行token是一個transaction, 所以須要挖礦使之生效
> miner.start(1)
:hammer:Mined block
> miner.stop(1)

// 再次查詢本地錢包第一個地址的token數量
> token.getBalance(web3.eth.accounts[0])
100

// 從第一個地址轉30個token給本地錢包的第二個地址
> token.transfer.sendTransaction(web3.eth.accounts[1], 30, {from: web3.eth.accounts[0]})
I1221 11:53:31.852541   11155 xeth.go:1055] Tx(0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b) to: 0x37dc85ae239ec39556ae7cc35a129698152afe3c
"0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b"
> miner.start(1)
> miner.stop(2)
> token.getBalance(web3.eth.accounts[0])
70
> token.getBalance(web3.eth.accounts[1])
30

其餘

私有鏈的全部數據都會放在倉庫根目錄下的data目錄中,刪除這個目錄能夠清除全部數據,從新啓動新環境。

作完這些以後你應該對在以太坊私有鏈上進行開發有了一個大概的瞭解吧,若是還想學習更多知識,一能夠看一看上面執行的腳本代碼,到底幹了些什麼,用了哪些命令行參數,二能夠閱讀正在ethfans上更新的solidity文檔中文版

相關文章
相關標籤/搜索