手機(jī)版網(wǎng)站建設(shè)seo優(yōu)化的搜索排名影響因素主要有
知識點(diǎn)
- 源碼編譯
- 主機(jī)編譯
- 容器編譯
- 手動部署(docker-compose)
- 單peer
- 多peer
- 中途加peer
- 多主機(jī)多peer
- 鏈碼
- 語法, 接口 (go版)
- 命令行調(diào)用
- ca server
- 在DApp中使用SDK調(diào)用 (js版)
部署的幾個階段
- 部署1排序和1節(jié)點(diǎn), 1組織1通道
- 光部署
- 能Dapp
- 帶ca server (每個組織一個)
- 帶TLS
- 部署1排序和2節(jié)點(diǎn), 1組織1通道
- 一開始就是2節(jié)點(diǎn)
- cryptogen
- 能Dapp
- 帶ca server(每個組織一個)
- 帶TLS
- 新節(jié)點(diǎn)中途加入
- ca server
- 一開始就是2節(jié)點(diǎn)
名詞解釋
-
Transaction:?次Chaincode函數(shù)的運(yùn)?。
Transaction存儲chaincode執(zhí)?的相關(guān)信息,?如chaincodeID、函數(shù)名稱、參數(shù)等,并不包含操作的數(shù)據(jù)。 -
World State:Fabric區(qū)塊鏈系統(tǒng)中所有變量的值的集合。
Transaction實(shí)際操作的是數(shù)據(jù),每個chaincode都有??的數(shù)據(jù)。
Fabric使?Rocksdb存儲數(shù)據(jù),?個key-value數(shù)據(jù)庫。Key -> 變量,value -> 值。
Fabric將每?對key-value叫做?個state,?所有的chaincode的state的合集就是World State。 -
錨節(jié)點(diǎn)Anchor
- 通道中每個組織(Org)都有一個錨節(jié)點(diǎn),用于同一通道中不同組織的Peer節(jié)點(diǎn)發(fā)現(xiàn)通道內(nèi)所有Peer節(jié)點(diǎn)。
-
Fabric的賬號體系,Fabric的有兩種方法獲取賬號,分別是:
- cryptogen模塊根據(jù)配置文件生成賬號
- Fabric-ca-server服務(wù)器生成賬號
-
一般只有網(wǎng)絡(luò)組件配備了 TLS 服務(wù)器證書,而網(wǎng)絡(luò)用戶(例如 Admin、User1)沒有。因?yàn)?TLS 中大多數(shù)只需要設(shè)置服務(wù)器身份驗(yàn)證(單向身份驗(yàn)證)。
模塊組成
組織和證書生成器cryptogen
我們將使用該cryptogen
工具為我們的各種網(wǎng)絡(luò)實(shí)體生成加密材料(x509 證書和簽名密鑰)。這些證書代表身份,它們允許在我們的實(shí)體進(jìn)行通信和交易時進(jìn)行簽名/驗(yàn)證身份驗(yàn)證。
Cryptogen
使用一個文件——crypto-config.yaml
它包含網(wǎng)絡(luò)拓?fù)?#xff0c;并允許我們?yōu)榻M織和屬于這些組織的組件生成一組證書和密鑰。每個組織都提供了一個唯一的根證書 ( ca-cert
),它將特定組件(對等節(jié)點(diǎn)和排序節(jié)點(diǎn))綁定到該組織。通過為每個組織分配一個唯一的 CA 證書,我們模擬了一個典型的網(wǎng)絡(luò),在該網(wǎng)絡(luò)中,參與成員將使用自己的證書頒發(fā)機(jī)構(gòu)。Hyperledger Fabric 中的交易和通信由實(shí)體的私鑰 ( keystore
)簽名,然后通過公鑰 ( ) 進(jìn)行驗(yàn)證signcerts
。
區(qū)塊和交易生成器configtxgen
該configtxgen
工具用于創(chuàng)建四個配置工件:
- orderer
genesis block
, - channel
configuration transaction
, - and two
anchor peer transactions
- one for each Peer Org.
orderer塊是ordering服務(wù)的Genesis Block,通道配置交易文件在Channel創(chuàng)建時廣播給orderer 。顧名思義,錨點(diǎn)交易指定了該通道上每個組織的錨點(diǎn)。
Fabric-ca

- fabric-ca server
- root
- intermediate
- cluster
- fabric-ca client
- db
- sqlite3
- postgres
- mysql
系統(tǒng)組織架構(gòu)圖
(1)Fabric系統(tǒng)組織架構(gòu)圖
(2) 應(yīng)收賬款融資業(yè)務(wù)場景系統(tǒng)架構(gòu)圖
Fabric項(xiàng)目開發(fā)流程圖
上圖中每個步驟分為3個部分,分別表示當(dāng)前步驟需要的Fabric模塊、配置文件以及需要完成的工作。
鏈碼chaincode
和以太坊相比,Fabric鏈碼和底層賬本是分開的,升級鏈碼時并不需要遷移賬本數(shù)據(jù)到新鏈碼當(dāng)中,真正實(shí)現(xiàn)了邏輯與數(shù)據(jù)的分離。
鏈碼被編譯成一個獨(dú)立的應(yīng)用程序,fabric用Docker容器來運(yùn)行chaincode,里面的base鏡像都是經(jīng)過簽名驗(yàn)證的安全鏡像,包括OS層和開發(fā)chaincode的語言、runtime和SDK層。一旦chaincode容器被啟動,它就會通過gRPC與啟動這個chaincode的Peer節(jié)點(diǎn)連接。
Fabric的智能合約稱為鏈碼(chaincode),分為系統(tǒng)鏈碼和用戶鏈碼。
系統(tǒng)鏈碼
-
系統(tǒng)鏈碼: 包括系統(tǒng)的配置, 僅支持Go語言, 在Peer節(jié)點(diǎn)啟動時會自動完成注冊和部署
- 配置系統(tǒng)鏈碼CSCC:負(fù)責(zé)管理記賬節(jié)點(diǎn)上的配置信息,加入通道等
- 背書系統(tǒng)鏈碼ESCC:對讀寫集轉(zhuǎn)換和簽名背書(msp管理). 背書節(jié)點(diǎn)執(zhí)行用戶鏈碼之后會執(zhí)行ESCC
- 生命周期系統(tǒng)鏈碼LSCC:負(fù)責(zé)管理鏈碼的生命周期,如安裝、實(shí)例化、升級、查詢
- 驗(yàn)證系統(tǒng)鏈碼VSCC:負(fù)責(zé)簽名驗(yàn)證/策略驗(yàn)證. 節(jié)點(diǎn)寫入賬本之前需要運(yùn)行VSCC。
- 查詢系統(tǒng)鏈碼QSCC:負(fù)責(zé)ledger查詢,如區(qū)塊、交易數(shù)據(jù)、區(qū)塊鏈信息等
- MVCC: 比對讀寫集的版本
用戶鏈碼
-
用戶鏈碼: 用戶鏈碼用于實(shí)現(xiàn)用戶的功能,真正實(shí)現(xiàn)了邏輯與數(shù)據(jù)的分離。
- 運(yùn)行在鏈碼容器中,通過Fabric提供的接口與賬本平臺進(jìn)行交互。
- 開發(fā)語言:go、java、python、node.js, 目前fabric對go語言的鏈碼支持的最好
鏈碼的生命周期
1. 鏈碼的安裝是單次單節(jié)點(diǎn)的。
2. 鏈碼的存儲(install)是可以多個鏈共享的,實(shí)例化(instantiate)的時候才會記錄到不同鏈的賬本數(shù)據(jù)里,不同鏈的數(shù)據(jù)是獨(dú)立隔離的。
3. Chaincode**必須**安裝在對等方上,才能成功地對賬本執(zhí)行讀/寫操作。此外,直到`init`對該鏈代碼執(zhí)行或傳統(tǒng)事務(wù)(讀/寫)(例如查詢“a”的值)之前,不會為對等方啟動鏈代碼容器。模擬執(zhí)行事務(wù)時會容器啟動。
鏈碼內(nèi)常用的系統(tǒng)方法
shim.ChaincodeStubInterface APIs 分為五類
? State 操作:
GetState(key string) ([]byte, error)
PutState(key string, value []byte) error
DelState(key string) error
RangeQueryState(startKey, endKey string) (StateRangeQueryIteratorInterface, error)
? Chaincode相互調(diào)?:
InvokeChaincode(chaincodeName string, args [][]byte) ([]byte, error)
QueryChaincode(chaincodeName string, args [][]byte) ([]byte, error)
? Table 操作:
CreateTable(name string, columnDefiniGons []*ColumnDefiniGon) error
GetTable(tableName string) (*Table, error)
DeleteTable(tableName string) error
InsertRow(tableName string, row Row) (bool, error) ReplaceRow(tableName string, row Row) (bool, error)
GetRow(tableName string, key []Column) (Row, error)
GetRows(tableName string, key []Column) (<-chan Row, error)
DeleteRow(tableName string, key []Column) error
? TransacGon操作:
GetArgs() [][]byte
GetStringArgs() []string
GetTxID() string
ReadCertAttribute(attributeName string) ([]byte, error) GetCallerCerGficate() ([]byte, error)
GetCallerMetadata() ([]byte, error)
GetBinding() ([]byte, error)
GetPayload() ([]byte, error)
GetTxTimestamp() (*Gmestamp.Timestamp, error)
VerifyAttribute(attributeName string, attributeValue []byte) (bool, error)
VerifyAttributes(attrs ...*attt.Attribute) (bool, error)
VerifySignature(cerGficate, signature, message []byte) (bool, error)
? Event操作:
SetEvent(name string, payload []byte) error
如何調(diào)用鏈碼
-
終端里輸入命令調(diào)用
- 更改:
peer chaincode invoke
- 查詢:
peer chaincode query
- 更改:
-
應(yīng)用程序(DApp)使用sdk(HFC - HyperledgerFabricClient)提供的接口調(diào)用 (API包含了交易處理、 安全的成員管理服務(wù)、 區(qū)塊鏈查詢和事件處理等)
-
fabric-client
- NewChannel: 接口可以創(chuàng)建通道
- sendTransactionProposal: 可以調(diào)用鏈碼里的函數(shù)
-
fabric-ca
- enroll: 用戶登錄 (如:用Admin登錄)
- register: 新用戶注冊 (如: 用Admin登錄后, 注冊一個新用戶User1)
-
fabric-network
evaluateTransaction
: 讀數(shù)據(jù)- 它只是選擇連接配置文件中定義的對等點(diǎn)并將請求發(fā)送給它,在那里對其進(jìn)行評估。
- 此交互不會導(dǎo)致更新分類帳
submitTransaction
: 寫數(shù)據(jù)- SDK 不會與單個對等點(diǎn)交互,而是將
submitTransaction
提案發(fā)送 到區(qū)塊鏈網(wǎng)絡(luò)中每個所需組織的對等點(diǎn)。這些節(jié)點(diǎn)中的每一個都將使用這個提議執(zhí)行請求的智能合約,以生成一個交易響應(yīng),它簽名并返回給 SDK。SDK 將所有已簽名的交易響應(yīng)收集到單個交易中,然后將其發(fā)送給排序節(jié)點(diǎn)。排序節(jié)點(diǎn)收集來自每個應(yīng)用程序的交易并將其排序?yàn)橐粋€交易塊。然后它將這些塊分發(fā)到網(wǎng)絡(luò)中的每個對等點(diǎn),在那里驗(yàn)證和提交每個事務(wù)。最后,SDK 會收到通知,允許其將控制權(quán)返回給應(yīng)用程序。
- SDK 不會與單個對等點(diǎn)交互,而是將
-
SDK調(diào)用鏈碼示例 (老版本, 1.4版本之前)
var Fabric_Client = require('fabric-client'); //加載sdk模塊 var channel = fabric_client.newChannel('mychannel'); //創(chuàng)建通道 var peer = fabric_client.newPeer('grpc://localhost:7051'); //連接peer節(jié)點(diǎn) channel.addPeer(peer); var order = fabric_client.newOrderer('grpc://localhost:7050') //連接排序節(jié)點(diǎn) channel.addOrderer(order);var request = {chaincodeId: 'myChaincode', //調(diào)用哪個鏈碼fcn: 'testFunc', //調(diào)用鏈碼里的哪個函數(shù)args: ['arg1', 'arg2', 'arg3'], //參數(shù)chainId: 'mychannel', //哪個通道的鏈碼txId: tx_id}; channel.sendTransactionProposal(request); //發(fā)送交易
-
開發(fā)鏈碼主要用到的語言是golang,因?yàn)閒abric對它的支持目前最好。而應(yīng)用層使用sdk的開發(fā)其它語言也可以,nodejs是比較通用和快速的選擇。
部署和調(diào)用鏈碼之前需要先創(chuàng)建通道、加入通道、更新錨節(jié)點(diǎn),然后才能進(jìn)行有關(guān)鏈碼的操作,比如安裝鏈碼、實(shí)例化鏈碼、invoke和query等。
往現(xiàn)有網(wǎng)絡(luò)中添加新 Peer 的步驟
channel創(chuàng)建時可指定允許哪些組織內(nèi)的peer加入, 但組織內(nèi)的peer仍需手動加入channel
將向Org1添加一個peer1.org1.example.com。目標(biāo)是這個新的 peer 將成為通道的一部分,并且能夠在需要時處理鏈碼查詢和背書。
- 為peer1.org1.example.com生成加密材料
- 可使用
**cryptogen**
- 推薦使用
**fabric-ca**
- 可使用
- 創(chuàng)建一個包含此新peer的 docker compose 文件
- 將此新對等點(diǎn)加入現(xiàn)有頻道
peer channel join
- 將鏈碼安裝到該節(jié)點(diǎn)
peer chaincode install
- 但不需要再次實(shí)例化
構(gòu)建多主機(jī)多節(jié)點(diǎn)部署
不同的order由誰來布, 中途怎么加order?
構(gòu)建多節(jié)點(diǎn)部署的挑戰(zhàn)之一是 docker 容器之間的通信。
extra_hosts
Hyperledger Fabric 中三節(jié)點(diǎn)雙通道設(shè)置演示
Hyperledger-fabric 區(qū)塊鏈多主機(jī)
-
簡單,不需要依賴任何外部組件
-
不利的一面是IP是靜態(tài)配置的
-
操作方法
-
docker-compose.yaml
中為每個組件增加extra_hosts:- "orderer.example.com:127.0.0.1"- "peer0.org1.example.com:127.0.0.1"- "peer1.org1.example.com:127.0.0.1"
-
Docker Swarm
多臺主機(jī)上的 Hyperledger Fabric 使用 Docker Swarm 和 Compose
使用基于 RAFT 的訂購服務(wù)進(jìn)行多主機(jī)設(shè)置
- 好的一面,顯然是原始配置只需少量修改即可使用,并且配置中沒有編碼IP等靜態(tài)信息。
- 結(jié)構(gòu)網(wǎng)絡(luò)依賴于外部組件(Docker Swarm),這可能會使設(shè)置和操作復(fù)雜化
Kubernetes (k8s)
- 實(shí)現(xiàn)起來似乎比前兩種機(jī)制更具挑戰(zhàn)性