搭建區塊鏈技術開發和執行環境(一)
最近在研究區塊鏈。打算先搭建一個測試環境開始執行。這裡記錄整個搭建過程,供後來人參考。 整體上,分為三個步驟,安裝相關軟體,初始化系統,建立叢集,以及最後一步,挖礦。 我們採用的是以太坊,相對其他區塊鏈,這是一個成熟的環境。 雖然近期有硬分支的事件,對企業應用來說,功能上還算是比較完善的。
安裝部署
1.安裝 Go 環境
如果機器無法上外網,還得配置一下代理。 Ubuntu配置代理的方式網上很多,這裡不介紹。
curl -O https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.5.1.linux-amd64.tar.gz
mkdir -p ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc
echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
source ~/.bashrc
2.安裝 ethereum
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum
在執行 sudo add-apt-repository -y ppa:ethereum/ethereum
的時候碰到這個問題:
root@ubuntu-KVM:~# sudo add-apt-repository -y ppa:ethereum/ethereum
Cannot add PPA: 'ppa:ethereum/ethereum'.
Please check that the PPA name or format is correct.
按照Ask Ubuntu 的意見,修改為:
sudo apt-get install software-properties-common
sudo -E add-apt-repository -y ppa:ethereum/ethereum
sudo -E add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum
3.安裝 solc 編譯器
sudo add-apt-repository ppa:ethereum/ethereum-qt
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install cpp-ethereum
同樣的,如果碰到PPA Name錯誤的警示,則執行如下操作:
sudo -E add-apt-repository ppa:ethereum/ethereum-qt
sudo -E add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install cpp-ethereum
這樣相關軟體已經安裝完畢。
搭建私鏈
1.啟動geth服務
geth --datadir "/root/chain" console
其中 datadir用於指定資料目錄。這個目錄不能夠預先建立,否則命令會失敗。 執行結果如下:
2.建立賬號
執行之後,進入geth
的互動模式。 接著建立一個賬號,然後退出。 這個賬號用於執行創世操作。 然後exit
退出
> personal.newAccount("密碼");
"0xea5c99831c2e4a0e094facdbac1befcf6c92e543"
> exit
3.建立創世區塊
編譯建立創世區塊所需要的指令碼, 注意alloc下的key需要和上述的賬號保持一致。
{
"alloc": {
"0xea5c99831c2e4a0e094facdbac1befcf6c92e543": {
"balance": "1000"
}
},
"nonce": "0x0000000000000042",
"difficulty": "0x020000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "CNNMoney Jack Ma interview: Wars start when trade stops, 20160902",
"gasLimit": "0xffffffff"
}
各個引數的含義如下:
mixhash:與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。注意他和nonce的設定需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。.
nonce: nonce就是一個64位隨機數,用於挖礦,注意他和mixhash的設定需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。
difficulty: 設定當前區塊的難度,如果難度過大,cpu挖礦就很難,這裡設定較小難度
alloc: 用來預置賬號以及賬號的以太幣數量,因為私有鏈挖礦比較容易,所以我們不需要預置有幣的賬號,需要的時候自己建立即可以。
coinbase: 礦工的賬號,隨便填
timestamp: 設定創世塊的時間戳
parentHash: 上一個區塊的hash值,因為是創世塊,所以這個值是0
extraData: 附加資訊,隨便填,可以填你的個性資訊
gasLimit: 該值設定對GAS的消耗總量限制,用來限制區塊能包含的交易資訊總和,因為我們是私有鏈,所以填最大。
建立資料存放地址並初始化創世塊
geth --datadir "/root/chain" init genesis.json
執行結果如下:
4.啟動私鏈
執行如下指令碼
geth --identity "phoenix" --rpc --rpccorsdomain "*" --datadir "/root/chain" --port "30303" --rpcapi "db,eth,net,web3" --networkid 98888 console
各引數說明如下:
identity :區塊鏈的標示,隨便填寫,用於標示目前網路的名字
init :指定創世塊檔案的位置,並建立初始塊
datadir :設定當前區塊鏈網路資料存放的位置
port:網路監聽埠,預設是8080
rpc:啟動rpc通訊,可以進行智慧合約的部署和除錯。它在geth中通常被預設啟用。
rpcapi: 設定允許連線的rpc的客戶端,一般為db,eth,net,web3
networkid: 設定當前區塊鏈的網路ID,用於區分不同的網路,是一個數字
console:啟動命令列模式,可以在Geth中執行命令
此外,還可以使用如下引數:
nodiscover : 使用這個命令可以確保你的節點不會被非手動新增你的人發現。否則,你的節點可能被陌生人的區塊鏈無意新增,如果他和你有相同的初始檔案和網路ID。
maxpeers : 如果你不希望其他人連線到你的測試鏈,可以使用maxpeers 0。反之,如果你確切知道希望多少人連線到你的節點,你也可以通過調整數字來實現。
rpcapi : 這個命令可以決定允許什麼API通過RPC進入。在預設情況下,geth可以在RPC啟用web3介面。請注意在RPC/IPC介面提供API,會使每個可以進入這個介面(例如dapp’s)的人都有許可權訪問這個API。注意你啟用的是哪個API。Geth會預設啟用IPC介面上所有的API,以及RPC介面上的db,eth,net和web3 API。
rpccorsdomain : 這個可以指示什麼URL能連線到你的節點來執行RPC定製端任務。務必謹慎,輸入一個特定的URL而不是wildcard ( * ),後者會使所有的URL都能連線到你的RPC例項。
啟動後介面如下,游標停留在最後的命令列上,可以執行以太坊命令。 可以看到Listening on [::]:30303
和Welcome to the Geth JavaScript console!
的提示,說明已經啟動成功
注意:如果想將Ubuntu作為永久區塊鏈節點使用,當使用
nohup
命令時,Geth啟動引數console
必須去掉,否則Geth會自動停止。
執行結果如下:
5.檢視節點資訊
常用命令:
- net.listening:檢視網路是否在監聽;
- admin.peers: 檢視當前連線的節點。 目前還是空的。
- admin.nodeInfo:檢視當前節點的資訊。
執行:
> admin.nodeInfo
得到當前節點資訊如下:
{
enode: "enode://dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094@[::]:30303",
id: "dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094",
ip: "::",
listenAddr: "[::]:30303",
name: "Geth/v1.5.0-unstable/linux/go1.5.1/phoenix",
ports: {
discovery: 30303,
listener: 30303
},
protocols: {
eth: {
difficulty: 131072,
genesis: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
head: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
network: 98888
}
}
}
注意enode節點,這是當前節點的標識。 後續會用到這個值。
6.檢視賬戶資訊
在建立創世節點時,我們建立了個預設賬戶。可以通過如下命令檢視賬戶餘額。
> eth.accounts
["0x4b691e86c622127ed8e1d49899ad8c1d19834327"]
> primary=eth.accounts[0]
"0x4b691e86c622127ed8e1d49899ad8c1d19834327"
> balance = web3.fromWei(eth.getBalance(primary), "ether");
20
配置第二臺私鏈伺服器
第二臺私鏈伺服器,需要把第一臺的步驟基本都要重複一遍。兩臺伺服器配置一樣才可以通訊。 需要改變的地方是:
第三步建立genesis.json的時候,完全使用第一臺伺服器的配置,不要用新建的account來建立。
需要將第一臺伺服器新增到靜態節點列表中。
7.新增靜態節點列表
在{datadir}下新增檔案 static-nodes.json,內容如下:
[
"enode://dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094@第一個節點的IP地址:30303"
]
執行如下指令碼啟動節點:
geth --identity "phoenix" --rpc --rpccorsdomain "*" --datadir "/root/chain" --port "30303" --rpcapi "db,eth,net,web3" --networkid 98888 console
啟動成功後,檢視當前連線的節點:
> admin.peers
[{
caps: ["eth/62", "eth/63"],
id: "dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094",
name: "Geth/v1.5.0-unstable/linux/go1.5.1/phoenix",
network: {
localAddress: "10.15.244.204:56808",
remoteAddress: "10.15.244.203:30303"
},
protocols: {
eth: {
difficulty: 131072,
head: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
version: 63
}
}
}]
挖礦
激動人心的時刻到了。 作為一個偽金融圈人士,最大的夢想,古時候叫擁有一個聚寶盆,現在叫擁有一個印鈔權,在數字貨幣時代,叫擁有一個挖礦機。 自己搭建的區塊鏈,想怎麼挖就怎麼挖吧。
私鏈啟動起來之後,挖礦其實很簡單了。 首先必須保證的有一個賬號:
> eth.accounts
["0x1b39aa2446de648dd6928a759c542690cc32757b"]
> eth.getBalance(eth.accounts[0]).toNumber();
0
賬號裡沒錢。 那就開始挖吧。挖礦其實很簡單,一個命令就開始了。預設的,挖到的錢,都放在當前賬號中。如果有多個賬號,預設的放到第一個賬號中。 在geth環境下,執行:
> miner.start();
或者執行命令列:
geth --mine --minerthreads=4
minerthreads用來指定執行的執行緒數。預設為當前CPU的核數。 如果有多個賬號,可以指定挖礦收入放到第幾個賬號,注意編號是從0開始的:
miner.setEtherbase(eth.accounts[0])
或者命令列執行:
geth --etherbase 0 --mine 2>> geth.log // 0 is index: first account by creation order OR
geth --etherbase '0x1b39aa2446de648dd6928a759c542690cc32757b' --mine 2>> geth.log
半小時後,檢視下賬戶餘額:
> eth.getBalance(eth.accounts[0]).toNumber();
1.5971875e+21
話說, e+21,那是多大的數字啊??一輩子還沒見過這麼多錢。 頭條的同學們,記得幫忙點贊啊。
【補充】從0開始搭建區塊鏈開發環境視訊 http://www.8btc.com/video/104371
以太坊生態系統中的工具和技術
如果你是一個以太坊或區塊鏈的新手開發者,那麼你可能正費力地(至少我是)試圖瞭解以太坊生態系統中的所有工具和技術。 所以在開始學習以太坊之時,我決定簡單介紹一下你經常遇到的各種元件。 希望這將有助於您全面地瞭解以太坊生態系統,以及每一部分是如何聯絡在一起。
1 . 以太坊
以太坊是一個聰明的智慧合約區塊鏈,您可以在上面建立去中心化的應用程式(稱為DApp)。 如果您是技術專家,這本白皮書值得一讀:
https://github.com/ethereum/wiki/wiki/White-Paper.
如果您之前已經建立了Web應用程式,我寫了一篇文章,比較了以太坊區塊鏈和Web應用程式架構,這可能有助於更深入地瞭解以太坊。
2 . Geth
Geth是由以太坊基金會提供的官方客戶端軟體。它是用Go程式語言編寫的。 這個軟體包幾個值得了解的元件:
Geth 守護程式
當您啟動Geth 守護程式時,它將連線到網路中的以太坊節點,並下載同步區塊。 它將不斷與其他節點進行通訊,以使其區塊不斷更新至最新。 它還具有挖掘區塊並將交易新增到塊鏈的能力,驗證並執行區塊中的交易。 它還可以充當伺服器,您可以通過RPC來訪問暴露的API介面。Geth 終端 (https://github.com/ethereum/go-ethereum/wiki/geth)
這是一個命令列工具,可以讓您連線到正在執行的節點,並執行各種操作,如建立和管理帳戶,查詢區塊鏈,簽署並將交易提交給區塊鏈等等。Mist 瀏覽器
這是一個用於與您的節點通訊的桌面應用程式。 您使用 Geth 終端 執行的任何操作都可以通過此圖形使用者介面來完成。
3 . Parity
Parity 是對以太坊協議的另一個很好的實現,並且是用Rust程式語言編寫的。 這是一個由一家名為Parity Inc (https://parity.io/)的公司來維護的非官方客戶端。任何人都可以實現這個客戶端軟體,並加入以太坊網路。 您可以按照本黃皮書 (https://ethereum.github.io/yellowpaper/paper.pdf) 中的規範來實施您自己的客戶端!
4 . Web3.js
就像你用 geth,mist 瀏覽器等等,來與以太坊節點進行通訊,還有一個名為Web3.js的javascript庫,可以用來與一個節點進行互動。 由於它是一個 JavaScript 庫,您可以使用它來構建基於Web的dapps。
5 . Solidity
Solidity是用於編寫在以太坊區塊鏈上執行的智慧合約的最流行的程式語言。 它是一種高階語言,當編譯轉換為 EVM 位元組碼。 這與 Java 非常相似,其中有諸如 Scala,Groovy,Clojure,JRuby等JVM語言。所有這些編譯都生成在JVM(Java虛擬機器)中執行的位元組碼。 只要遵循規範,你也可以建立一個像 Solidity 這樣的語言,編譯成的 EVN 執行的位元組碼。
還有一個非常棒的瀏覽器,它基於IDE,您可以在這裡編寫合同、編譯和部署到區塊鏈: http://remix.ethereum.org/
就像您擁有Ruby on Rails,Python / Django等Web應用程式開發框架一樣,Truffle 和 Embark 是用於開發以太坊 DApps的兩個最常用的框架。 它們抽象出在區塊鏈上編譯和部署合同的許多複雜的東西。
7 . Metamask
如果你在經常關注以太坊社群,你一定會聽過 Metamask 。 它是一個用於與以太坊節點進行互動的Chrome 外掛。 讓全世界的人都執行一個節點與區塊鏈互動是不切實際的。 所以,Metamask會擁有一部分節點。 你只需要安裝 Metamask ,它就會自動連線到他們的節點。
8 . ENS
ENS 以太坊域名服務是以太坊世界的DNS。 就像你將 IP 地址對映到可讀取的名稱一樣,您可以將任何以太坊合約或錢包地址對映到一個易讀的名稱。
例如: 146.115.22.177 → google.com. 您不需要在瀏覽器中輸入IP地址,而是輸入google.com就可以解析該IP地址。
例如: 0x80C013d980aB049471c88E1603b8b4a60E03295C 是我的錢包地址。如果你想轉給我一些以太幣,你並不需要記住這個地址。 一旦 ENS 啟動,我可能會將其對映到mvmurthy.eth,你可以很輕鬆地用它給我轉錢 :)。
9 . Swarm
區塊鏈能很好地儲存少量的資料。 如果您要儲存病歷,銷售合同或是需要公開時間戳的大型檔案,該怎麼辦?在區塊鏈中儲存資料的代價很大,同時它不可擴充套件。 Swarm 解決了這個問題。 Swarm 是一個去中心化的內容儲存和分發服務。 您可以將它視為 CDN,但它並不是在一家公司的伺服器上託管的所有 CDN,而是通過網際網路在計算機上分發。 就像執行一個以太坊節點一樣,來執行一個 Swarm 節點連線到 Swarm 網路。
當您將一個以太坊合同部署到區塊鏈時,您會獲得ABI (https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABIJSON介面(類似於API的合約介面)。)的部署地址和 當您希望有人使用您的合約時,您必須提供部署的地址和ABI。 將來,ABI會儲存在Swarm中,所以每個人都可以通過檢視以太坊地址來查詢ABI。
10 . IPFS
IPFS(Inter Planetary檔案系統)在概念上與Swarm完全相似。 它是一個去中心化的儲存系統。 它與以太坊沒有直接關聯,但可與以太坊整合。
您可以在以下網址閱讀Swarm和IPFS之間的區別: https://github.com/ethersphere/go-ethereum/wiki/IPFS-&-SWARM
11 . Whisper
你可能聽到很多關於 Whisper的談論,但是在以太坊生態系統中,它是一項有趣的技術。 它是Dapps與其他......互動的互通協議。 點選以下網址閱讀更多關於Whisper的內容: https://github.com/ethereum/wiki/wiki/Whisper
下圖嘗試把所有的東西放在一起:
希望以上能讓您對以太坊生態系統有一個概括性的瞭解,並能深入地、更好地瞭解它。
相關文章
- 搭建區塊鏈技術開發和執行環境(二)區塊鏈
- 區塊鏈技術開發區塊鏈
- 區塊鏈技術發展_區塊鏈技術開發新方向區塊鏈
- 區塊鏈DApp開發 | 跨鏈智慧合約技術搭建開發區塊鏈APP
- 區塊鏈baas平臺搭建,區塊鏈技術應用開發,合約系統搭建區塊鏈
- 區塊鏈溯源技術是什麼?區塊鏈溯源技術開發區塊鏈
- 區塊鏈2.0以太坊環境搭建區塊鏈
- 區塊鏈交易所繫統開發技術搭建區塊鏈
- 區塊鏈技術應用開發,公鏈搭建服務商區塊鏈
- Hyperledger Fabric 超級賬本 java開發區塊鏈環境搭建Java區塊鏈
- BAAS平臺_區塊鏈baas平臺技術_區塊鏈技術開發區塊鏈
- 區塊鏈開發平臺_區塊鏈技術服務區塊鏈
- 區塊鏈技術開發 區塊鏈錢包交易所開發區塊鏈
- 區塊鏈設計聊天直播平臺搭建,區塊鏈技術應用開發方案區塊鏈
- 區塊鏈技術應用開發、區塊鏈版權應用搭建解決方案區塊鏈
- 區塊鏈技術應用及發展 區塊鏈技術開發公司哪家好區塊鏈
- 區塊鏈技術開發公司談區塊鏈對環保事業的影響區塊鏈
- 區塊鏈技術開發公司談區塊鏈如何良性發展區塊鏈
- 區塊鏈技術開發公司 聊區塊鏈“主鏈”價值區塊鏈
- 區塊鏈技術開發主鏈區塊鏈的應用分析區塊鏈
- 區塊鏈挖礦錢包系統開發技術搭建區塊鏈
- 區塊鏈技術火爆,但真正懂區塊鏈技術開發的人又有幾人區塊鏈
- 區塊鏈技術開發公司淺析區塊鏈對能源行業的影響區塊鏈行業
- 區塊鏈學習之Fabric的環境搭建區塊鏈
- 淺談公司java開發執行環境搭建(ubuntu環境)JavaUbuntu
- 區塊鏈應技術應用開發方案,區塊鏈技術為企業賦能區塊鏈
- 區塊鏈社交直播app軟體開發,區塊鏈技術應用落地開發區塊鏈APP
- 區塊鏈IM社交直播軟體開發方案,區塊鏈技術應用開發區塊鏈
- 區塊鏈技術開發公司談區塊鏈保險的特點區塊鏈
- swap開發/區塊鏈跨鏈技術系統開發教程區塊鏈
- 區塊鏈技術研發,如今最契合區塊鏈技術應用方向區塊鏈
- 區塊鏈為何發展如此迅速 區塊鏈技術開發公司哪家好區塊鏈
- 區塊鏈技術開發主鏈 區塊鏈的企業級應用剖析區塊鏈
- 區塊鏈應用技術開發 區塊鏈數字資產交易所開發區塊鏈
- 區塊鏈社交直播軟體開發app,區塊鏈技術應用落地開發方案區塊鏈APP
- 區塊鏈技術區塊鏈
- 區塊鏈技術開發怎麼做?區塊鏈如何實施才可靠?區塊鏈
- 區塊鏈技術開發公司談區塊鏈的含義是什麼區塊鏈