不管是想專一於Composer開發的,仍是本身搭建Fabric網絡的,都繞不開Fabric構架這一關。(發現繞過方法的人,請於文末留言,頂禮膜拜~)。本文將經過一個網絡組建的實踐重點介紹Fabric網絡。html
tx: transaction 交易,操做。node
好比去超市買狗糧的時候,從本身的電子錢包轉賬到咖啡店這個請求,能夠看做是一個tx。docker
好比你收到快遞,你經過快遞公司的應用,點擊了「查收」,這個操做能夠看做一個tx。編程
每次一你準備更新帳本的操做,均可以視爲tx。微信
Fabric是作聯盟鏈的。跟公鏈不一樣,任何你想對帳本的操做,讀取,寫入,都須要經過 智能合約 才能夠發生的。網絡
Hyperledger Fabric smart contracts are written in chaincode and are invoked by an application external to the blockchain when that application needs to interact with the ledger.app
因此,在Fabric裏,智能合約 = chaincodecomposer
chaincode很重要,也很關鍵了。不懂chaincode就麼有辦法玩Fabric網絡,但chaincode是用Go寫的,你須要先回去學習Go語言,怕怕了吧?o(∩∩)o...哈哈,這個部分通過Composer的封裝後,能夠用JS來寫了。比起徹底本身寫chaincode,用composer的話,能夠簡化很多流程呢。因此,將來的鏟S官寫完這篇博文後,就去學JS。tcp
In most cases, chaincode interacts ONLY with the database component of the ledger, the world state (querying it, for example), and NOT the transaction log.學習
Chaincode can be implemented in several programming languages. The currently supported chaincode language is Go with support for Java and other languages coming in future releases.
細心的童靴應該注意到了 the world state 這個詞。這個就是帳本的意思麼?跟帳本是什麼關係呢?
Ledger
原來,一個帳本里麪包含了兩部分: the world state 和 Blockchain
The world state represents the current values of all ledger states.
簡單粗暴的說,就是區塊鏈裏面記錄的信息,最終的狀態,是由 the world state 來儲存的。主要用於上面chaincode的快速查詢使用。不用反推全部區塊鏈裏面的交易真假。百無聊賴的時候,就能夠從 Blockchain 來計算一下,獲得新的 the world state。目前存儲 the world state能夠用: an embedded LevelDB 或者 an external CouchDB。
而帳本里面的區塊鏈是: 任何操做的記錄
The blockchain is a transaction log, structured as interlinked blocks, where each block contains a sequence of transactions, each of which represents a query or update to the world state.
智能合約 又叫作 chaincode,全部的對區塊鏈的操做,都須要經過 chaincode。chaincode 目前支持Go語言,對於這個部分的編程,若是使用 Composer 的話,能夠簡化流程和節約時間。
經過 chaincode ,咱們能夠查詢,讀寫 Blockchain Ledger,Blockchain Ledger 又叫作帳本。由 the world state 和 Blockchain 組成。the world state 主要服務於 chaincode 的查詢。而 Blockchain是用於流水線式記錄交易。
目標
經過動手啓動一個最簡單的Hyperledger Fabric網絡,來進一步瞭解Hyperledger Fabric的網絡構成。
這裏介紹的步驟,以及代碼可能不適用於最新Docker Image,咱們在這裏主要關注網絡結構。
這個網絡將包含:
兩個參與方
每一個參與方有兩個節點
有一個 排序節點
準備
Prerequisites(http://hyperledger-fabric.readthedocs.io/en/release-1.1/prereqs.html)
Hyperledger Fabric Samples(http://hyperledger-fabric.readthedocs.io/en/release-1.1/samples.html)
咱們將會使用: first-network來演示。
開啓咱們的第一網絡
打開目標目錄
cd fabric-samples/first-network
在first-network的文件夾下面,有一個包含了咱們啓動所須要所有步驟(兩個參與方,每一個參與方維護兩個節點,有一個獨立的排序節點)的腳本文件 byfn.sh,這個腳本文件附帶註解,有興趣的童靴能夠研究一下。
* 查詢 byfn.sh的文檔 ./byfn.sh --help Usage: byfn.sh -m up|down|restart|generate Typically, one would first generate the required certificates and genesis block, then bring up the network. e.g.: byfn.sh -m generate -c mychannel byfn.sh -m up -c mychannel -s couchdb byfn.sh -m up -c mychannel -s couchdb -i 1.0.6 byfn.sh -m down -c mychannel Taking all defaults: byfn.sh -m generate byfn.sh -m up byfn.sh -m down
生成網絡須要的要素
./byfn.sh -m generate Generating certs and genesis block for with channel 'mychannel' and CLI timeout of '10' Continue (y/n)?
生成證書,以及一個叫作'mychannel'的通道,併爲此通道配置一個區塊,最長等待請求的時長爲10秒? 輸入y。 你能夠經過參數來個性化配置網絡
而後屏幕上就生成了一大堆的輸出。根本就不想看對吧?不想看的童鞋能夠直接跳到下一個步驟。
########################################################## ##### Generate certificates using cryptogen tool ################################################################### org1.example.com org2.example.com 經過 cryptogen tool 生成數字證書 ########################################################## ######### Generating Orderer Genesis block ############### ######################################################### 2018-06-23 13:32:34.246 JST [common/configtx/tool] main -> INFO 001 Loading configuration 2018-06-23 13:32:34.416 JST [common/configtx/tool] doOutputBlock -> INFO 002 Generating genesis block 2018-06-23 13:32:34.417 JST [common/configtx/tool] doOutputBlock -> INFO 003 Writing genesis block 生成排序節點,以及創世紀區塊(第一個區塊) ################################################################# ### Generating channel configuration transaction 'channel.tx' ### ################################################################# 2018-06-23 13:32:34.462 JST [common/configtx/tool] main -> INFO 001 Loading configuration 2018-06-23 13:32:34.464 JST [common/configtx/tool] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx 2018-06-23 13:32:34.464 JST [common/configtx/tool] doOutputChannelCreateTx -> INFO 003 Writing new channel tx 生成渠道配置交易:'channel.tx' ################################################################# ####### Generating anchor peer update for Org1MSP ########## ################################################################# 2018-06-23 13:32:34.475 JST [common/configtx/tool] main -> INFO 001 Loading configuration 2018-06-23 13:32:34.479 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update 2018-06-23 13:32:34.480 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update ################################################################# ####### Generating anchor peer update for Org2MSP ######### ################################################################## 2018-06-23 13:32:34.490 JST [common/configtx/tool] main -> INFO 001 Loading configuration 2018-06-23 13:32:34.494 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update 2018-06-23 13:32:34.494 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update
生成anchor peer,別且將其分配給各個參與方
啓動網絡
./byfn.sh -m up Starting with channel 'mychannel' and CLI timeout of '10'Continue (y/n)? 啓動'mychannel'? 輸入y。
而後屏幕上又出現了一堆代碼,不想看的童靴能夠跳過。
Creating network "net_byfn" with the default driver 生成網絡 Creating volume "net_orderer.example.com" with default driver 生成排序節點數據 volume是Docker裏面,存儲數據的一種方法。詳細能夠參照:https://docs.docker.com/storage/volumes/ Creating volume "net_peer0.org1.example.com" with default driver Creating volume "net_peer1.org1.example.com" with default driver Creating volume "net_peer0.org2.example.com" with default driver Creating volume "net_peer1.org2.example.com" with default driver 生成四個節點數據 Creating peer0.org2.example.com ... done Creating peer1.org1.example.com ... done Creating peer1.org2.example.com ... done Creating peer0.org1.example.com ... done 生成四個節點 Creating orderer.example.com ... done 生成排序節點 Creating cli ... done生成命令行接口
Channel name : mychannel Creating channel...
生成渠道
Query Result: 90 2018-06-23 04:57:52.496 UTC [main] main -> INFO 008 Exiting..... ===================== Query on PEER3 on channel 'mychannel' is successful ===================== ========= All GOOD, BYFN execution completed ===========
網絡啓動後,而後自動執行一連串的點對點的交易,若是交易都順利完成了,你將看到這個提示。
具體交易流程和內容,能夠更加輸出的log來確認。咱們下次再學習了。
docker ps
查看Docker的狀態
CONTAINER ID IMAGE COMMAND PORTS NAMES 91f7854cce55 dev-peer1.org2.example.com-mycc-1.0-26c2ef32838554aac4f7ad6f100aca865e87959c9a126e86d764c8d01f8346ab "chaincode -peer.add…" dev-peer1.org2.example.com-mycc-1.0dc4a6df35ca5 dev-peer0.org1.example.com-mycc-1.0-384f11f484b9302df90b453200cfb25174305fce8f53f4e94d45ee3b6cab0ce9 "chaincode -peer.add…" dev-peer0.org1.example.com-mycc-1.0d60e45ed340a dev-peer0.org2.example.com-mycc-1.0-15b571b3ce849066b7ec74497da3b27e54e0df1345daff3951b94245ce09c42b "chaincode -peer.add…" dev-peer0.org2.example.com-mycc-1.0各個節點上生成的智能合約。(好像少了一個,沒有dev-peer1.org1.example.com-mycc-1.0) ec0de22dfda5 hyperledger/fabric-peer:latest "peer node start" 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.comfbbddcc6e511 hyperledger/fabric-peer:latest "peer node start" 0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp peer1.org2.example.comacb521a4dff8 hyperledger/fabric-peer:latest "peer node start" 0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp peer1.org1.example.com555938e16fcb hyperledger/fabric-peer:latest "peer node start" 0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp peer0.org2.example.com節點7f6f7b69635c hyperledger/fabric-orderer:latest "orderer" 0.0.0.0:7050->7050/tcp orderer.example.com
排序節點
關閉網絡
在完成交易以後,你但願Docker釋放生成的全部: containers, the crypto material, four artifacts, 以及the chaincode images
./byfn.sh -m down Stopping with channel 'mychannel' and CLI timeout of '10'Continue (y/n)? 關閉通道'mychannel'? 輸入y。 Stopping orderer.example.com ... done Stopping peer1.org2.example.com ... done Stopping peer1.org2.example.com ... done Stopping peer1.org1.example.com ... done Stopping peer0.org2.example.com ... done Removing cli ... done Removing orderer.example.com ... done Removing peer0.org1.example.com ... done Removing peer1.org2.example.com ... done Removing peer1.org1.example.com ... done Removing peer0.org2.example.com ... done Removing network net_byfn
再次查看Docker的狀態
docker ps
全部的containers都消失了。
本文做者:HiBlock區塊鏈技術佈道羣-AmyWu
原文發佈於簡書
加微信baobaotalk_com,加入技術佈道羣
如下是咱們的社區介紹,歡迎各類合做、交流、學習:)