以太坊私有鏈部署
1. 區塊鏈正式進入3.0時代,房地產、供應鏈等將成應用重點領域
隨著區塊鏈的不斷發展,區塊鏈的應用覆蓋的范圍越來越廣,伴隨可擴展性和效率的提高,區塊鏈應用范圍將超越金融范疇,拓展到物流、地產和物聯網等領域,成為未來 社會 的一種最底層的協議,這也就意味著區塊鏈將進入3.0時代。
區塊鏈1.0時代是以BTC(去中心化概念)為代表,更多的是起到一種分布式記賬的作用如BTC、Ripple、BCH、萊特幣、狗狗幣等。更多的是充當數字貨幣記賬用的。當然第一個階段發展的也並不完美,比特幣還有很多問題需要解決,比如擴容,閃電支付,硬分叉等。
隨著進一步完成,區塊鏈來到了2.0時代,以ETH(智能合約)代表,進入合約階段。
ETH為代表的區塊鏈2.0是一大進步,但仍然存在著很多問題,比如通道擁堵,交易速度慢,分叉風險,高額手續費等等。舉例來說,風靡一時的加密貓( CryptoKitties)在以太坊平台上線後,最高時占據了約25%的以太坊網路,造成了整個以太坊網路的擁堵,嚴重地影響了其他以太坊用戶的體驗。目前的發展就是處於第一個階段到第二個階段的過度過程。
在告別了1.0和2.0時代之後,得益於技術的不斷發展,區塊鏈變得更加實用。這也意味著區塊鏈將徹底脫離去初創時期的金融屬性,憑借其去中心化等特性,進入到各行各業的實際應用場景中去。
這也意味著區塊鏈正式開啟其3.0時代——全面應用的時代。而3.0時代的區塊鏈產業結構,也更加復雜,今天就為大家簡單分析一下。
3.0時代區塊鏈產業分為基礎層、服務層、應用層三個層次。
(1)、基礎層
對應的產業鏈上中下游包括:上游底層技術及基礎設施(核心技術、設備、底層平台部署方式),中游服務層主要是面向開發者提供基於區塊鏈技術的應用;下游應用層包括金融、供應鏈管理、智能製造、政府企業、服務、 社會 應用等。
硬體、技術及基礎設施廠商主要提供區塊鏈應用所必備的晶元、礦機、礦池、硬碟、路由器等基礎設施。
底層平台部署方式可以分為公有鏈、聯盟鏈、私有鏈。
底層技術包括核心基礎組件、協議和演算法。基於底層核心技術組件,針對不同應用場景提供不同功能,包括智能合約、可編程資產、激勵機制、成員管理等。
基礎層提供底層區塊鏈或分布式賬本技術框架,主要包括以太坊、Hyperledger Fabric、R3 Corda、FISCO BCOS等。
(2)、服務層
服務層是指BaaS(Blockchain as a Service)平台,國內主要的BaaS平台有螞蟻區塊鏈BaaS平台、騰訊雲TBaaS、平安壹賬鏈BaaS平台等。
主要是面向開發者提供基於區塊鏈技術的應用,是在底層技術的基礎上提供智能合約、信息安全、數據服務等產品化服務,提高開發者在平台層開發應用的便捷性和可拓展性。
應用及服務廠商負責區塊鏈通用技術及技術擴展平台研發、數字貨幣教育與存儲平台搭建等工作,為行業應用層提供技術支持。
(3)、應用層
應用層表現為核心應用組件,包括智能合約、可編程資產、激勵機制、成員管理等。
是指區塊鏈的終端使用者或服務供應商,現在區塊鏈的主要應用場景有跨境支付、防偽溯源、供應鏈金融、貿易融資、電子票據、ABS等。
服務對象分為兩大類:B端(起步階段):區塊鏈+(金融、供應鏈管理、版權保護、教育);C端(率先落地):區塊鏈+(共享經濟、泛 娛樂 )。
下游區塊鏈應用領域為區塊鏈技術與現有行業的結合運作,現在,多個行業已經開啟了區塊鏈3.0的應用時代。
(1)、區塊鏈+供應鏈
區塊鏈+供應鏈實現商品信息全流程追溯。傳統供應鏈的溯源防偽系統存在信息不透明、數據容易篡改、安全性差和相對封閉等弊端,而利用區塊鏈技術和物聯網技術,可將商品的原材料采買過程,生產過程和流通過程的信息進行整合和追溯,真正實現跨越品牌商、渠道商、零售商、消費者,精細到一物一碼的全流程正品追溯,顯著提升用戶信任體驗。
(2)、區塊鏈+物聯網
搭建萬物互聯時代的信息交流網路。隨著物聯網中設備數量的增長,區塊鏈的分布式特性為物聯網自我治理提供了途徑,可以幫助物聯網中的設備理解彼此,並了解不同設備間的關聯,從而實現對物聯網的分布式控制。
(3)、區塊鏈+醫療
保障醫療數據安全共享。運用區塊鏈技術對醫療數據進行數學加密,可有效防止醫療數據被惡意修改等風險。應用區塊鏈技術開發的醫療數據共享和交換系統,將加密後的醫療數據上傳,可以實現數據在患者、各醫療機構之間快速、高效、安全地進行共享和流通,有效簡化了醫療數據的調用流程,為精確診斷病情提供數據保障。
(4)、區塊鏈+房地產
區塊鏈在房地產行業的潛在應用場景非常多,常見的如房產交易。買賣產權的過程中的痛點在於:交易過程中和交易後缺乏透明,大量的文書工作,潛在的欺詐行為,公共記錄中的錯誤等等,而這些還僅僅只是一部分。區塊鏈提供了一個途徑去實現無紙化和快速交易的需求。此外,房地地產區塊鏈應用可以幫助記錄、追溯和轉移地契、房契、留置權等等,還給金融公司、產權公司和抵押公司提供了一個平台。區塊鏈技術致力於安全保存文件,同時增強透明性,降低成本。此外,區塊鏈還應用建築工程領域,在當前大火的城市更新也有很多企業在應用這一技術。例如深圳的蘭房鏈就基於區塊鏈提出了區塊鏈+城市更新/建築工程/房地產開發等一攬子解決方案,全面服務於房地產行業諸多領域,目前其官網、移動應用均已上線。
此外,區塊鏈在供應鏈金融、股票交易、銀行業等已經有了很多的應用,此處不再一一贅述。
作為我國十四五規劃的重要內容之一,官方早已提出要加快推動 區塊鏈技術和產業創新發展 ,積極推進 區塊鏈和經濟 社會 融合發展 。
而要實現上述兩個發展,其關鍵在於以下兩點:
1、區塊鏈技術核心技術突破。
區塊鏈技術是目前我國和歐美差距最小的技術,官方特別強調在這個新興領域我國要走在理論最前沿、占據創新制高點、取得產業新優勢。要推動協同攻關,加快推進核心技術突破,為區塊鏈應用發展提供安全可控的技術支撐。
目前區塊鏈技術大多數依然停留在概念炒作階段,很多業務場景單純為了區塊鏈而區塊鏈。目前為止我國還沒有人能在全球范圍內解決三元悖論等核心技術困境,因此我們必須回歸基礎理論和核心技術,通過長期潛心研究,才能取得重大突破。
事實上,官方對區塊鏈技術理論技術和後續的應用發展提出了非常高的要求,做好區塊鏈基礎理論研究,著力攻克一批關鍵核心技術,真正把技術研發的擔子挑起來,是當前區塊鏈發展的關鍵。
2、提升國際話語權和規則制定權。
不同於以往的信息技術,區塊鏈技術具有很強的擴張性,或者叫侵略性,它的規則或者話語權決定了它的影響范圍,因為每一個上鏈開展業務的個體或機構必須服從區塊鏈所定的規則,無論中外均是如此。舉個例子,大家使用windows系統時必須要服從windows的規則,但是windows只是為用戶規定了信息交互的規則,這對我們來說是可以接受的,而區塊鏈則規定了產業治理規則,區塊鏈的治理規則憑借其分布式特徵,其影響力可迅速超越國界和地域限制。
為了實現上述兩點,我們要加強人才隊伍建設,建立完善人才培養體系,打造多種形式的高層次人才培養平台,培育一批領軍人物和高水平創新團隊。
區塊鏈作為架構性創新技術,對復合型人才需求巨大,要求從事者掌握涉及密碼學、信息科學、基礎數學等多種專業技術知識。發展區塊鏈,必須加強學科深度交叉融合的人才隊伍建設,從基礎研究、應用研發、產業融合等方面前瞻和系統性地建立人才培育體系。
區塊鏈技術是未來數字經濟的重要組成部分,對於各行各業,它都有著豐富的優勢。盡管已經進入3.0時代,但區塊鏈在各行各業的垂直落地應用,才剛剛開始。
對於區塊鏈的未來,你怎麼看?
2. 如何創建私鏈
創建創世配置文件:
首先需要創建一個「創世」json配置文件,此文件描述了創世區塊的一些參數。下面就是文件中的內容:
{
"coinbase": "",
"config": {
"homesteadBlock": 5
},
"difficulty": "0x20000",
"extraData": "0x",
"gasLimit": "0x2FEFD8",
"mixhash": "",
"nonce": "0x0",
"parentHash": "000000000000000000000000",
"timestamp": "0x00",
"alloc": {
"":
{
"balance":""
}
}
}12345678910111213141516171819
將上面這段代碼復制到一個文本文件里並起名為genesis.json
創世!:
為了不和主鏈的數據沖突,這里建議建立自己的私鏈數據文件夾。在我的電腦上在E盤建了一個EthDBSpace作為以太坊實驗工作區,並在裡面創建了一個PrivChain文件夾作為我的第一個私鏈的數據存放文件夾
這里為了方便管理將genesis.json放在了EthDBSpace文件夾下
打開Windows命令行
鍵入如下命令
geth --datadir "E:\EthDBSpace\PrivChain" init "E:\EthDBSpace\genesis.json"1
–datadir 選項用來指定我們私鏈的數據目錄。在我的電腦上是E:\EthDBSpace\PrivChain
init 命令為創世命令,後面緊跟著我們的創世配置文件路徑。
點擊回車後執行結果如下
此時創世完成!
創建賬戶:
為了在私鏈上做實驗,我們還需要在私鏈上建立自己的賬戶
Windows命令行鍵入
geth --datadir "E:\EthDBSpace\PrivChain" console1
我們由於已經創世成功所以第二次進入客戶端時我們不用再次指定genesis.json文件路徑,而是直接–datadir 指明私鏈數據路徑即可。
console命令用來開啟geth的命令行。
點擊回車後,客戶端會先經過一陣初始化。在命令提示符出現後,說明已經進入geth console
在geth命令行中鍵入
personal.newAccount('Your Password')1
personal.newAccount 函數用來創建賬戶,其中參數為賬戶密碼
點擊回車後會出現
賬戶創建成功後會在命令下方以綠色字元列明創建賬戶的地址,也即賬戶的公鑰
我們可以先查下賬戶余額,在geth命令行中鍵入:
my=eth.accounts[0]
eth.getBalance(my)12
my=eth.accounts[0],此句的目的是將我們剛創建的賬戶地址賦值給my變數。這樣可以簡化後續賬戶地址輸入。其中eth.accounts記錄了本機上所有賬戶地址。由於我們第一次創建賬戶,所以目前電腦上只有一個賬戶。所以這里我們用eth.accounts[0]提取第一個賬戶地址。eth.getBalance函數用來獲得賬戶余額,參數填入賬戶地址。這里的my變數記錄的就是第一個賬戶的地址。
希望我的回答可以幫到您哦
3. 以太坊多節點私有鏈部署
假設兩台電腦A和B
要求:
1、兩台電腦要在一個網路中,能ping通
2、兩個節點使用相同的創世區塊文件
3、禁用ipc;同時使用參數--nodiscover
4、networkid要相同,埠號可以不同
1.4 搭建私有鏈
1.4.1 創建目錄和genesis.json文件
創建私有鏈根目錄./testnet
創建數據存儲目錄./testnet/data0
創建創世區塊配置文件./testnet/genesis.json
1.4.2 初始化操作
cd ./eth_test
geth --datadir data0 init genesis.json
1.4.3 啟動私有節點
1.4.4 創建賬號
personal.newAccount()
1.4.5 查看賬號
eth.accounts
1.4.6 查看賬號余額
eth.getBalance(eth.accounts[0])
1.4.7 啟動&停止挖礦
啟動挖礦:
miner.start(1)
其中 start 的參數表示挖礦使用的線程數。第一次啟動挖礦會先生成挖礦所需的 DAG 文件,這個過程有點慢,等進度達到 100% 後,就會開始挖礦,此時屏幕會被挖礦信息刷屏。
停止挖礦,在 console 中輸入:
miner.stop()
挖到一個區塊會獎勵5個以太幣,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做 coinbase,默認情況下 coinbase 是本地賬戶中的第一個賬戶,可以通過 miner.setEtherbase() 將其他賬戶設置成 coinbase。
1.4.8 轉賬
目前,賬戶 0 已經挖到了 3 個塊的獎勵,賬戶 1 的余額還是0:
我們要從賬戶 0 向賬戶 1 轉賬,所以要先解鎖賬戶 0,才能發起交易:
發送交易,賬戶 0 -> 賬戶 1:
需要輸入密碼 123456
此時如果沒有挖礦,用 txpool.status 命令可以看到本地交易池中有一個待確認的交易,可以使用 eth.getBlock("pending", true).transactions 查看當前待確認交易。
使用 miner.start() 命令開始挖礦:
miner.start(1);admin.sleepBlocks(1);miner.stop();
新區塊挖出後,挖礦結束,查看賬戶 1 的余額,已經收到了賬戶 0 的以太幣:
web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
用同樣的genesis.json初始化操作
cd ./eth_test
geth --datadir data1 init genesis.json
啟動私有節點一,修改 rpcport 和port
可以通過 admin.addPeer() 方法連接到其他節點,兩個節點要要指定相同的 chainID。
假設有兩個節點:節點一和節點二,chainID 都是 1024,通過下面的步驟就可以從節點二連接到節點一。
首先要知道節點一的 enode 信息,在節點一的 JavaScript console 中執行下面的命令查看 enode 信息:
admin.nodeInfo.enode
" enode://@[::]:30303 "
然後在節點二的 JavaScript console 中執行 admin.addPeer(),就可以連接到節點一:
addPeer() 的參數就是節點一的 enode 信息,注意要把 enode 中的 [::] 替換成節點一的 IP 地址。連接成功後,節點一就會開始同步節點二的區塊,同步完成後,任意一個節點開始挖礦,另一個節點會自動同步區塊,向任意一個節點發送交易,另一個節點也會收到該筆交易。
通過 admin.peers 可以查看連接到的其他節點信息,通過 net.peerCount 可以查看已連接到的節點數量。
除了上面的方法,也可以在啟動節點的時候指定 --bootnodes 選項連接到其他節點。 bootnode 是一個輕量級的引導節點,方便聯盟鏈的搭建 下一節講 通過 bootnode 自動找到節點
參考: https://cloud.tencent.com/developer/article/1332424
4. 以太坊私有鏈搭建(2)--修改挖礦難度
官放解釋就不多說了,Difficulty值越大,越難出區塊,意味著交易不容易確認,默認的機制是難度越來越大,對私有鏈一般是不可接受的,當然這個值也不是越小越好,這樣的話也會讓機器的很卡,所以這個值要根據項目自己確定。
創世區塊中的的難度能影響整體的挖礦速度,但是並不能改變難度上升這個趨勢,所以在自己的項目中,僅僅在創世區塊中指定難度是不夠的。
當前geth版本 1.7 unstable
源文件 consensus/ethash/consensus.go 行290
好了,這里也不多想怎麼實現了,我也看不懂,簡單改下返回難度為恆定值就會~~
將這個函數改為
重新make geth,試試看出塊難度是不是恆定了。
5. 區塊鏈並不是一條鏈三種鏈都跑哪些應用
當前區塊鏈的應用部署類型有三種——公有鏈、私有鏈、聯盟鏈,看看他們有什麼區別?都有哪些典型的應用?
公有鏈:對所有人開放,任何人都可以參與
私有鏈:對單獨的個人或實體開放
聯盟鏈:對特定的組織團體開放
6. 以太坊開發(2):在以太坊私有鏈上的基本操作
在上一講 如何使用geth搭建以太坊私有鏈 完成了私有鏈的搭建,下面介紹在私有鏈上的基本操作。
啟動私有鏈後在命令行輸入:
執行完之後可以查看到生成的賬戶地址為
查詢賬戶余額:
剛剛創建的私有鏈賬戶都是沒有餘額的,需要通過挖礦才會產生eth,下面介紹如何在私有鏈上挖礦。
在geth環境下執行:
這時候查看日誌geth.log可以看到以太坊私有鏈有個啟動的百分比,到100就正式啟動了:
挖礦開始:
這時候有個疑問,挖礦挖到的eth到哪了,其實默認到了eth.account[0],就是第一個賬戶上:
如何修改挖礦所得的賬戶:
命令如下:
下面開始進行轉賬:
這時候出現報錯,原因是轉賬的賬戶沒有解鎖,需要輸入密碼解鎖轉賬的賬戶才能完成轉賬操作:
7. Docker 搭建以太坊私有鏈
首先需要安裝 Docker,Docker 的安裝和使用可以參看阮一峰老師的 《Docker 入門教程》 。
Ethereum 官方是支持 docker 的,可以參看 官方文檔 。
centOS
其中 -v /home/linshan/works/block-chain/ethereum:/root 是把我們當前的 ethereum 目錄,掛到了docker 的 /root 下。
在 Windows 環境下使用 -v /home/linshan/works/block-chain/ethereum:/root 不能啟動容器,原因不明,所以在 Windows 下先不要使用目錄掛載。
各欄位具體用途參看 官方文檔 。
Windows
Windows 不必創建 start-ethereum.sh 文件, genesis.json 也可以在 Docker 容器啟動後創建。
centOS
Windows
運行成功後執行
進入 docker 容器命令行
因為 Windows 沒有掛載共享目錄,所以 root 目錄下沒有 genesis.json 文件,我們要在這裏手動創建 genesis.json 文件,內容要和 centOS 的一致。
data 用來存放區塊數據
geth 的參數參看 以太坊客戶端Geth命令用法-參數詳解
啟動私有節點後進入 geth 命令行執行:
輸出的內容就是節點信息,我們在手動連接節點是會用到,注意要把「0.0.0.0「換成你自己的IP,然後將這個信息發送給其他節點。手動連接節點有兩種方式:
當然不管使用哪種方法連接節點都要保證創世區塊文件 genesis.json 一致,還有在啟動時 networkid 也要一致。
至此以太坊私有鏈已搭建完畢。
geth命令
docker命令
8. 搭建geth私有鏈和聯盟鏈網路
操作系統:linux或Mac OS
安裝geth執行以下命令:
linux:sudo apt-get install ethereum
Mac OS:brew install ethereum
直接創建兩個geth的工作目錄,用於之後的組建聯盟鏈的使用:
mkdir eth-private1
mkdir eth-private2
首先 cd eth-private1 進入節點1的工作目錄該目錄下執行下面命令
geth --datadir data --nodiscover console (data是之後geth節點的數據目錄,可自行修改)
使用geth自帶的工具 puppeth 用於生成創世區塊,過程如下:
puppeth
+-----------------------------------------------------------+
| Welcome to puppeth, your Ethereum private network manager |
| |
| This tool lets you create a new Ethereum network down to |
| the genesis block, bootnodes, miners and ethstats servers |
| without the hassle that it would normally entail. |
| |
| Puppeth uses SSH to dial in to remote servers, and builds |
| its network components out of Docker containers using the |
| docker-compose toolset. |
+-----------------------------------------------------------+
Please specify a network name to administer (no spaces, please)
輸入私鏈名稱後,會出現二級菜單,現在2:配置一個新的創世快
What would you like to do? (default = stats)
再次出現二級菜單,讓你選擇共識機制(這里採用poa共識)
Which consensus engine to use? (default = clique)
Ethash - proof-of-work(PoW) :工作量證明,通過算力達成共識 (以太坊就是使用這種方式)
Clique - proof-of-authority(PoA): 權威證明、通過預先設定的權威節點來負責達成共識 (不消耗算力,一般用於私有鏈測試開發)
如果選擇Pow的共識方法,直接輸入1,回車即可。
如果選擇PoA的共識方法,輸入2後會提示讓你選擇處快的間隔時間,一般測試開發使用可以設置相對的將處快時間設置較少5秒即可,然後會讓你選擇哪個賬戶來作為權威生成區塊(至少有一個,輸入剛才創建的賬戶,若只是單節點就輸入那個節點目錄生成的地址,若想組建聯盟鏈就填寫生成的兩個地址)
How many seconds should blocks take? (default = 15)
選擇好共識機制後會讓你指定給那些賬號初始化ether(至少有一個),輸入我們剛才創建的賬戶地址回車即可。
Which accounts should be pre-funded? (advisable at least one)
選擇輸入私有鏈的網路ID,任意數字即可(不能為1,1是公鏈),也可以不輸入會給定一個隨機數作為私有鏈的網路ID
Specify your chain/network ID if you want an explicit one (default = random)
選擇導出創世區塊配置文件
選擇導出創世區塊配置文件的保存路徑,可以保存到當前目錄,直接按回車即可
Which file to save the genesis into? (default = my-private-chain.json)
INFO [02-09|14:56:33] Exported existing genesis block
這樣就完成了創世區塊文件的配置了,直接退出puppeth即可。
輸入命令 geth --datadir data init private.json 其中data自己制定,private.json就是剛才生成的創世區塊
若出現如圖錯誤:
輸入命令:
geth --datadir data --syncmode full --port 2001 --networkid 1234 --rpc --rpcport "8545" --rpccorsdomain "*" --rpcaddr "0.0.0.0" --rpcapi "db,eth,net,web3,personal,admin,clique" --nodiscover console 進入控制台
--datadir data:節點的數據目錄
--syncmode full:塊同步的方式(若只是單節點可不填)
--port 2001: 網卡監聽埠
--networkid 1234:網路標識符
--rpc:開啟rpc服務
--rpcport "8545":rpc服務的埠
--rpccorsdomain "*":允許跨域請求的域名列表(逗號分隔)(瀏覽器強制)
--rpcaddr "0.0.0.0" :HTTP-RPC伺服器介面地址(默認值:「localhost」)
--rpcapi "db,eth,net,web3,personal,admin,clique":基於HTTP-RPC介面提供的API(私有鏈可以任意開發,公有鏈需要謹慎)
--nodiscover:不允許節點自動加入
若想搭建聯盟鏈,必須保證創世區塊一致,進入到剛才創建的eth-private2的目錄
將之前生成的創世區塊拷貝過來,初始化創世區塊,然後使用啟動命令啟動分別啟動兩個節點,進入控制台,使用 admin.nodeInfo 命令獲取節點的信息
總結:
兩個伺服器部署兩個節點是可以聯通的,但是只能使用兩個節點對應的地址進行挖礦,所以只能是兩個節點對應兩個地址進行挖礦,使用poa共識,當一個節點掛掉,挖礦停止,因為poa共識挖礦必須超過50%的節點進行錢增,現在只是兩個節點,掛掉一個節點挖礦就會停止等待另一個節點的確認,停掉的節點可以通過正常運作的節點信息重新連接到網路中。
問題:
同步塊有可能報錯情況:
1:Synchronisation failed "retrieved hash chain is invalid" 解決目前找到的方法是removedb 數據目錄 ,重新init創世區塊
2:內存溢出初步確認為開啟rpc服務造成的,有可能伺服器惡意被黑,暴力破解密碼,佔有內存,解決,將伺服器的ip設置一條防火牆
若存在問題可給本人留言或訪問本人的github: https://github.com/qi-shuo/geth-document 記錄了一些本人搭建使用的命令
9. 可以用雲伺服器搭建以太坊私有鏈節點嗎
可以的,但是建議使用海外伺服器會比較好,另外伺服器的配置要中等或以上。
10. CentOS 6.5上搭建以太坊私有鏈,編譯時報錯: make: *** [geth] Error 1,請各位大神指教
build/env.sh go run build/ci.go install ./cmd/geth
make: *** [geth] Error 1
沒有這個目錄,或者這個目錄許可權不夠