1. 程式人生 > >以太坊本地私有鏈開發環境搭建

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

ethereum-bootstrap是我建立的一個github專案,目的是幫助剛接觸以太坊的同學快速的搭建起自己的本地開發環境,體驗智慧合約的開發。閱讀本文需要有基本的程式設計知識。專案地址:https://github.com/janx/ethereum-bootstrap

Ethereum Bootstrap

通過本文所述方法和專案中的指令碼,我們可以快速的搭建好自己的私鏈進行開發測試。

倉庫中包含的工具有:

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

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

準備

  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可執行檔案的路徑。例如:

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

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

contracts目錄下有一個智慧合約樣例檔案Token.sol, 通過Solidity語言實現了基本的代幣功能, 合約持有者可以發行代幣, 使用者可以互相轉賬.

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

第一步,我們先把合約程式碼壓縮為一行.新建一個ssh session, 切換到geth使用者環境su - geth, 然後輸入:cat contracts/Token.sol | tr '\n' ' '.

切換到以太坊控制檯,把合約程式碼儲存為一個變數:

<code><span class="kd">var</span> <span class="nx">tokenSource</span> <span class="o">=</span> <span class="s1">'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];     } }'</span><span class="p">;</span></code>

然後編譯合約程式碼:

<code><span class="kd">var</span> <span class="nx">tokenCompiled</span> <span class="o">=</span> <span class="nx">web3</span><span class="p">.</span><span class="nx">eth</span><span class="p">.</span><span class="nx">compile</span><span class="p">.</span><span class="nx">solidity</span><span class="p">(</span><span class="nx">tokenSource</span><span class="p">);</span></code>

通過tokenCompiled.Token.code可以看到編譯好的二進位制程式碼,通過tokenCompiled.Token.info.abiDefinition可以看到合約的ABI

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

首先我們用ABI來建立一個JavaScript環境中的合約物件:

<code><span class="kd">var</span> <span class="nx">contract</span> <span class="o">=</span> <span class="nx">web3</span><span class="p">.</span><span class="nx">eth</span><span class="p">.</span><span class="nx">contract</span><span class="p">(</span><span class="nx">tokenCompiled</span><span class="p">.</span><span class="nx">Token</span><span class="p">.</span><span class="nx">info</span><span class="p">.</span><span class="nx">abiDefinition</span><span class="p">);</span></code>

我們通過合約物件來部署合約:

<code><span class="kd">var</span> <span class="nx">initializer</span> <span class="o">=</span> <span class="p">{</span><span class="na">from</span><span class="p">:</span> <span class="nx">web3</span><span class="p">.</span><span class="nx">eth</span><span class="p">.</span><span class="nx">accounts</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="na">data</span><span class="p">:</span> <span class="nx">tokenCompiled</span><span class="p">.</span><span class="nx">Token</span><span class="p">.</span><span class="nx">code</span><span class="p">,</span> <span class="na">gas</span><span class="p">:</span> <span class="mi">300000</span><span class="p">};</span>

<span class="kd">var</span> <span class="nx">callback</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">,</span> <span class="nx">contract</span><span class="p">){</span>
    <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">contract</span><span class="p">.</span><span class="nx">address</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"Contract transaction send: TransactionHash: "</span> <span class="o">+</span> <span class="nx">contract</span><span class="p">.</span><span class="nx">transactionHash</span> <span class="o">+</span> <span class="s2">" waiting to be mined..."</span><span class="p">);</span>
      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"Contract mined!"</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">contract</span><span class="p">);</span>
      <span class="p">}</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="kd">var</span> <span class="nx">token</span> <span class="o">=</span> <span class="nx">contract</span><span class="p">.</span><span class="k">new</span><span class="p">(</span><span class="nx">initializer</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span></code>

contract.new方法的第一個引數設定了這個新合約的建立者地址from, 這個新合約的程式碼data, 和用於建立新合約的費用gasgas是一個估計值,只要比所需要的gas多就可以,合約建立完成後剩下的gas會退還給合約建立者.

contract.new方法的第二個引數設定了一個回撥函式,可以告訴我們部署是否成功.

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

在公有鏈上,礦工打包平均需要15秒,在私有鏈上,我們需要自己來做這件事情.首先開啟挖礦:

<code><span class="nx">miner</span><span class="p">.</span><span class="nx">start</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span></code>

此時需要等待一段時間,以太坊節點會生成挖礦必須的資料,這些資料都會放到記憶體裡面.在資料生成好之後,挖礦就會開始,稍後就能在控制檯輸出中看到類似:

<code>:hammer:Mined block</code>

的資訊,這說明挖到了一個塊,合約已經部署到以太坊網路上了!此時我們可以把挖礦關閉:

<code><span class="nx">miner</span><span class="p">.</span><span class="nx">stop</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span></code>

接下來我們就可以呼叫合約了.先通過token.address獲得合約部署到的地址, 以後新建合約物件時可以使用.這裡我們直接使用原來的contract物件:

<code>// 本地錢包的第一個地址所持有的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</code>

其他

私有鏈的所有資料都會放在倉庫根目錄下的data目錄中,刪除這個目錄可以清除所有資料,重新啟動新環境。

做完這些之後你應該對在以太坊私有鏈上進行開發有了一個大概的瞭解吧,如果還想學習更多知識,一可以看一看上面執行的指令碼程式碼,到底幹了些什麼,用了哪些命令列引數,二可以閱讀正在ethfans上更新的solidity文件中文版

相關推薦

本地私有開發環境搭建

ethereum-bootstrap是我建立的一個github專案,目的是幫助剛接觸以太坊的同學快速的搭建起自己的本地開發環境,體驗智慧合約的開發。閱讀本文需要有基本的程式設計知識。專案地址:https://github.com/janx/ethereum-boots

區塊開發(一)Windows平臺搭建基於的區塊開發環境

引言 Ethereum(以太坊)是一個使開發人員能夠建立和釋出下一代分散式應用的公共區塊鏈平臺。 通過其專用加密貨幣以太幣(Ether)提供去中心化的虛擬機器(稱為“以太虛擬機器”Ethereum Virtual Machine)來處理點對點合約。具體可以訪問

【區塊】從0開始搭建基於的區塊開發環境

Ethereum(以太坊)是一個使開發人員能夠建立和釋出下一代分散式應用的公共區塊鏈平臺。 通過其專用加密貨幣以太幣(Ether)提供去中心化的虛擬機器(稱為“以太虛擬機器”Ethereum Virtual Machine)來處理點對點合約。本文從0開始搭建了以太坊的開發環境,猶如當年初學其他語言一樣,這是我

區塊開發(一)基於私有環境搭建介紹

Window上安裝ubuntu系統搭建私有鏈操作步驟 前提是 geth 已經安裝,可以參考上一節內容講解 Step 1: 建立目錄和genesis.json 在命令列模式建立一個目錄,例如geths ,這裡geths目錄命名任意。 命令:mkdir geths

基於私有環境搭建介紹

本文是基於virtalbox的ubuntu1804的虛擬機器環境,配置是1核2GB記憶體(建議記憶體越多越好)。 安裝geth apt-get install software-properties-common add-apt-repository -y ppa:ethereum/et

系列-001】基於私有環境搭建-以及搭建過程的問題記錄

本文是基於virtalbox的ubuntu1804(ubuntu-18.04.1-server-amd64,不要使用live-server安裝)的虛擬機器環境,配置是1核2GB記憶體(建議記憶體越多越好)。 本文基於網上的文件,加上自己安裝部署過程遇到的問題,進行了整理。

-windows-私有-搭建(非源碼)

消耗cpu log 由於 復制 () diff ror 文件 道理 初 接觸以太坊,只安裝,不講道理: 1.win10系統,64位 2.以太坊錢包 3.以太坊geth客戶端 geth 和 錢包可以到ethfans.org的資料庫裏下載,那裏提供國內鏡像和官網地址。 錢包工具

(Ethereum)開發環境(geth)搭建 —— 基於ubuntu 16.04 LTS

geth = g(Go 語言) + eth go 語言適合開發高效能程式。 可以建立賬戶、建立區塊鏈、挖礦。   1. 從原始碼編譯安裝(安裝go 語言的開發環境),初學者並不建議使用這種方法。 2. Mac平臺        

(ETH)私有搭建指南

前期準備 Git sudo yum install -y git Go Geth git clone https://github.com/ethereum/go-ethereum cd go-ethereum/ make geth #測試是否安裝正確

私有和聯盟的機會與挑戰》報告

以太坊平臺評估 私有鏈和聯盟鏈的機會與挑戰 作者:Vitalik Buterin  翻譯:萬向區塊鏈實驗室/ChinaLedger 聯盟  排版/校對:區塊鏈鉛筆(ChainB.com) (注:本文屬於學習資料,請勿用於商業用途。轉載請註明作者與出處。)

如何配置PoA私有

NOTE: This chapter is work in progress. TurboEthereum supports Proof-of-Authority (PoA) private chains through the Fluidity core ethereu

私有和測試網的區別

一、概述 我們想要學習一門新技術,那麼一般都是先網上查查相關概念,然後下載下來demo進行測試,本地跑通之後就可以嘗試在專案中使用。那麼學習以太坊該如何學習呢? 博主也是一位初學者,這裡和大家一起學習下。 二、以太坊測試網路 TestNet 以太坊的

區塊--構建私有

構建私有鏈 構建私有鏈,其實最大目的還是為了挖礦,所以需要注意,網路埠一定不要選擇和主網一樣的 –networked 1,而是取與1 不同的,這樣就避免了同步環節。 創世區塊位置: 建立多個賬號備用:personal.newAccount(“123456”) 初始化上帝

(go-ethereum)編譯除錯環境搭建

以下步驟都是在MacOs上操作的,但同樣適合Ubuntu,只是有幾個小點有所不同,我會標註出來編譯1. Go環境搭建    Mac: (brew是一個類似ubuntu apt-get的工具,用來在終端安裝軟體的)brew update && brew upgr

nodejs之truffle-contract 和web3 環境搭建之實現web寵物原始碼

  package.json配置檔案依賴包! "dependencies": { "bootstrap": "^4.2.1", "jquery": "^3.3.1", "popper.js": "^1.14.6", "truffle-contract"

F3D系統開發Fomo3D區塊模式

inno 定制 dap 擁有 style 獎勵 開發 最終 理論 Fomo3D(F3D)以太坊ETH底層技術系統開發空氣-陳洋1 5 0 1*3 1 5 1*7 4 0電T微。現代經濟體系正在朝著分布式、點對點、網絡化的結構進行演化。分布式賬本技術吸收了現代密碼學、安全通訊

基於的區塊瀏覽器(java web開發

效果圖如下:這裡的交易值並不是以太幣,而是根據自己寫的智慧合約建立的代幣。交易詳情檢視賬號詳情,這裡賬號餘額是以太幣,不過是按照最小單位wei,這裡沒有換算程式碼下載地址:連結:https://github.com/haochaowu/spring-boot詳情可以看我之前發

區塊開發(零)如何開始學習及區塊

轉載:http://blog.csdn.net/sportshark/article/details/52351415 博主總結的內容非常詳細,收藏了! 一、    以太坊和區塊鏈的關係      從區塊鏈歷史上來說,先誕生了比特幣,當時並沒有區塊鏈這個技術和名詞,然

智能合約開發之代幣合約

智能合約 合約 以太坊 以太坊開發 ethereum truffle solidity 區塊鏈 區塊鏈開發 blockchain 智能合約開發是以太坊開發的核心,而代幣合約的編寫是智能合約開發的核心,用solidity開發一個代幣合約的例子是學習以太坊開發智能合約

如何用python和flask智能合約開發

庫函數 編寫 本地化 實用程序 註冊 同步 ring getting and 將數據存儲在數據庫中是任何軟件應用程序不可或缺的一部分。無論如何控制該數據庫都有一個該數據的主控。區塊鏈技術將數據存儲到區塊鏈網絡內的區塊中。因此,只要某個節點與網絡同步,它們就會獲得區塊中數據的