fabric node api 1.4簡明教程
fabric-sdk-node最新版本為1.4,本文將介紹如何使用最新版本的fabric node sdk開發node.js應用,以實現與fabric區塊鏈的互動,例如查詢鏈碼狀態,或者提交鏈碼交易。
本文分五個部分來介紹node.js開發人員如何快速上手fabric node sdk:
- 工作原理:介紹fabric node sdk的工作機制與實現原理
- 身份標識:介紹在fabric node sdk中如何標識應用的身份(證書與金鑰)
- 通道配置:介紹在fabric node sdk中如何配置通道的網路拓撲
- 鏈碼狀態查詢:介紹使用fabric node sdk查詢鏈碼狀態的方法
- 鏈碼交易提交:介紹使用fabric node sdk提交鏈碼交易的方法
如果希望高效系統地掌握Fabric區塊鏈的鏈碼及應用開發,建議訪問匯智網的線上互動課程:
1、fabric node sdk 工作原理
在hyperledger Fabric區塊鏈架構中,應用是通過節點的RPC協議API介面訪問安裝在peer節點上的鏈碼:
類似於shim api對鏈碼通訊協議的封裝,Fabric Node SDK提供了對節點RPC協議介面的封裝,其入口類為Client
,通道操作則封裝在Channel
類中:
2、fabric node sdk中的身份標識
由於hyperledger fabric是許可制(Permissioned)區塊鏈,每一個參與fabric區塊鏈的成員都需要有明確的身份標識,因此fabric node sdk中的Client
User
例項來表徵其訪問Fabric區塊鏈網路的身份。例如,下面的node.js程式碼載入本地msp目錄中的PEM編碼的使用者證書與相應的金鑰並生成User
物件,然後設定為Client
例項的當前身份:
let client = new Client let keyPem = fs.readFileSync('.msp/keystore/user-key.pem','utf-8') let certPem = fs.readFileSync('./msp/signcerts/user-cert.pem','utf-8') let user = await client.createUser({ //建立User物件 username: 'user', //使用者名稱稱 mspid: 'SampleOrg', //所屬MSP的ID cryptoContent: { privateKeyPEM: keyPem, //使用者私鑰 signedCertPEM: certPem //使用者證書 }, skipPersistence: true //不計入快取 }) client.setUserContext(user,true) //設定為client的當前身份
2、fabric node sdk通道配置
使用Client
例項的newChannel()
方法可以建立一個空的通道物件,我們還需要新增Peer
和Orderer
例項,以便該通道物件瞭解要訪問的fabric網路的拓撲結構。例如,下面的node.js程式碼為通道物件配置
部署在本機的peer對等節點和orderer排序節點,在預設配置下,對等節點在7051埠監聽,而排序節點在7052埠監聽:
let channel = client.newChannel('ch1')
channel.addPeer(client.newPeer('grpc://127.0.0.1:7051'))
channel.addOrderer(client.newOrderer('grpc://127.0.0.1:7050'))
3、fabric node sdk查詢鏈碼狀態
在fabric node sdk中,通道物件的queryByChaincode()
方法用於鏈碼狀態查詢。例如,下面的node.js程式碼呼叫鏈碼counter-cc
中定義的value()
方法,以獲取計數器的當前值:
let req = {
chaincodeId: 'counter-cc',
fcn: 'value',
args: []
}
let ret = await channel.queryByChaincode(req)
4、fabric node sdk提交鏈碼交易
在fabric node sdk中,向鏈碼提交交易則複雜一些,需要依次使用sendTransactionProposal()
和sendTransaction()
這兩個方法,這是因為hyperledger fabric引入了背書(endorsement)機制,在應用向排序節點提交交易之前,需要按照既定的策略首先獲取對等節點的背書。
提交鏈碼交易的時序表示如下:
下面的程式碼展示了在fabric node sdk中鏈碼交易的兩階段提交過程:
let req = {
chaincodeId: 'counter-cc',
fcn: 'inc',
args: ['10'],
txId: client.newTransactionID()
}
let prsp = await channel.sendTransactionProposal(req) //獲取peer背書
let rsp = await channel.sendTransaction({ //提交交易
proposalResponses: prsp[0],
proposal: prsp[1]
})