Hyperledger Fabric開(kāi)發(fā)實(shí)戰(zhàn)-06使用SDK

本文是在閱讀《區(qū)塊鏈開(kāi)發(fā)實(shí)戰(zhàn)-Hyperledger Fabric關(guān)鍵技術(shù)與案例分析》一書(shū)的同時(shí)皿伺,在實(shí)踐中記錄的一些實(shí)踐步驟與經(jīng)驗(yàn)分享。

Hyperledger Fabric開(kāi)發(fā)實(shí)戰(zhàn)-07 開(kāi)發(fā)流程

Fabric的Orderer節(jié)點(diǎn)和Peer節(jié)點(diǎn)都提供了基于Grpc協(xié)議的接口,通過(guò)這些接口可以和這些節(jié)點(diǎn)進(jìn)行交互举庶,但是如果直接使用這些接口,需要自己定義很多protobuf協(xié)議的文件,為了簡(jiǎn)化開(kāi)發(fā)琳轿,F(xiàn)abric提供了Node.js,Go,Java等語(yǔ)言的相關(guān)SDK,方便用戶與相關(guān)節(jié)點(diǎn)進(jìn)行交互耿芹。在項(xiàng)目的開(kāi)發(fā)中崭篡,我們大都通過(guò)調(diào)用Peer模塊的Grpc接口,與系統(tǒng)進(jìn)行交互吧秕。

Fabric Node.js SDK是目前相對(duì)比較完善且成熟的SDK琉闪,因此以Node.js為例進(jìn)行學(xué)## 習(xí)。

環(huán)境準(zhǔn)備

由于需要使用到Node.js砸彬,需要先安裝颠毙,由于我的8.11.1版本在安裝依賴(lài)時(shí)一直報(bào)錯(cuò)斯入,之后重新安裝了8.9.3版本,才能正常使用

wget https://nodejs.org/dist/v8.9.3/node-v8.9.3-linux-x64.tar.xz
tar -xvf node-v8.9.3-linux-x64.tar.xz
sudo mv node-v8.9.3-linux-x64 /usr/local
sudo ln -s /usr/local/node-v8.9.3-linux-x64/bin/node /usr/local/bin/node 
sudo ln -s /usr/local/node-v8.9.3-linux-x64/bin/npm /usr/local/bin/npm 

驗(yàn)證版本

node -v
npm -v

編寫(xiě)Node.js時(shí)蛀蜜,為了調(diào)試方便刻两,推薦使用Visual Studio Code

編寫(xiě)程序

1.安裝依賴(lài)

首先創(chuàng)建一個(gè)目錄sdkstudy涵防,用來(lái)存放需要源代碼闹伪,之后在里面創(chuàng)建package.json文件,

{
    "name": "fabric-sdk-node-study",
    "version": "0.0.1",
    "description": "fabric-sdk-node-study",
    "main": "main.js",
    "keywords": [],
    "engines": {
        "node": ">=8.0.0",
        "npm": ">=3.10.10"
    },
    "dependencies": {
        "fabric-ca-client": "^1.0.0",
        "fabric-client": "^1.0.0"
    },
    "license": "Apache-2.0"
}

dependencies里面是我們需要使用到的sdk壮池,在sdkstudy中輸入npm install命令安裝偏瓤。如果出現(xiàn)錯(cuò)誤,請(qǐng)嘗試使用sudo npm install --unsafe-perm

2.編寫(xiě)代碼

在使用sdk時(shí)椰憋,我們首先要?jiǎng)?chuàng)建client對(duì)象厅克,并指定Orderer,Peer和Channel橙依,之后通過(guò)本地證書(shū)或caserver獲取證書(shū)证舟,最后再與Peer進(jìn)行交互。

// import 
var co = require("co")
var path = require("path")
var fs = require("fs")
var util = require("util")
var hfclient = require("fabric-client")
var Peer = require("fabric-client/lib/Peer.js");
var EventHub = require("fabric-client/lib/ChannelEventHub");
var User = require("fabric-client/lib/User.js");
var crypto = require("crypto")
var FabricCAService = require("fabric-ca-client")

// 證書(shū)文件的緩存目錄
var tempdir = "/home/shisj/mycode/github_wksp/fabric/nodejs-client/client-study/kvs";

// fabric client agent
var client = new hfclient();
var cryptoSuite = hfclient.newCryptoSuite()
cryptoSuite.setCryptoKeyStore(hfclient.newCryptoKeyStore({path:tempdir}))
client.setCryptoSuite(cryptoSuite);
const ORDERER_IP = "xxx.xx.xxx.xxx";
const PEER_IP = "xx.xxx.xx.xxx";
// 創(chuàng)建CA客戶端 
var channel = client.newChannel("cmbcchannel666");
var order = client.newOrderer("grpc://" + ORDERER_IP + ":7050");
channel.addOrderer(order);

var peer = client.newPeer("grpc://"+PEER_IP+":7051");
channel.addPeer(peer);

使用本地證書(shū)

使用本地證書(shū)的時(shí)候窗骑,首先需要獲取Org1組織的Admin的證書(shū)和私鑰女责,再創(chuàng)建用戶


function readAllFiles(dirPath){
    var files = fs.readdirSync(dirPath);  
    var data = fs.readFileSync(path.join(dirPath,files[0]), 'utf8');
    return data;
}

/**
 * 根據(jù)cryptogen模塊生成的帳號(hào)通過(guò)Fabric接口進(jìn)行相關(guān)的操作
 */
function getOrgUser4Local(){
    var keyPath = "/home/shisj/mycode/github_wksp/fabric/nodejs-client/client-study/fabric-config/msp/keystore";
    var keyPEM = Buffer.from(readAllFiles(keyPath)).toString()
    var certPath = "/home/shisj/mycode/github_wksp/fabric/nodejs-client/client-study/fabric-config/msp/signcerts";
    var certPEM = readAllFiles(certPath).toString()

    return hfclient.newDefaultKeyValueStore({path:tempdir})
    .then((store) =>{
        client.setStateStore(store);
        return client.createUser({
            username:"user87",
            mspid:"Org1MSP",
            cryptoContent:{
                privateKeyPEM:keyPEM,
                signedCertPEM:certPEM
            }
        })
    })
    
}

最后,就可以連接到Peer查看賬本的相關(guān)信息了


co((function *(){
    let member = yield getOrgUser4Local()
    let resultPeerInfo = yield channel.queryInfo(peer)
    console.info("============當(dāng)前peer加入的某個(gè)channel的區(qū)塊數(shù)============");
    console.info(JSON.stringify(resultPeerInfo))

    console.info("============當(dāng)前peer加入了那些channel============");
    var result = yield client.queryChannels(peer)
    console.info(JSON.stringify(result))

    //console.info("============當(dāng)前peer加入的某個(gè)channel的區(qū)塊數(shù)的區(qū)塊號(hào)============");
    //result = yield client.queryChannels(2,peer,null)
    //console.info(JSON.stringify(result))

    console.info("============當(dāng)前peer加入chaincode[install]的信息============");
    result = yield client.queryInstalledChaincodes(peer)
    var chaincodes = result.chaincodes;
    chaincodes.forEach(element => {
        console.info("chaincode name is %s, version is %s ",element.name,element.version);
    });
    // console.info(JSON.stringify(result))
})())

與Peer通信時(shí)创译,還可以調(diào)用Chaincode

   let tx_id = client.newTransactionID();
   var request = {
       targets: peer,
       chaincodeId:"statechaincode",
       fcn:"invoke",
       args:["a","b","1"],
       chainId:"cmbcchannel666",
       txId:tx_id
   };
  // 
   let chaincodeInvokeResult = yield channel.sendTransactionProposal(request);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抵知,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子软族,更是在濱河造成了極大的恐慌刷喜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件立砸,死亡現(xiàn)場(chǎng)離奇詭異掖疮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)颗祝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)浊闪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人螺戳,你說(shuō)我怎么就攤上這事规揪。” “怎么了温峭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵猛铅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我凤藏,道長(zhǎng)奸忽,這世上最難降的妖魔是什么堕伪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮栗菜,結(jié)果婚禮上欠雌,老公的妹妹穿的比我還像新娘。我一直安慰自己疙筹,他們只是感情好富俄,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著而咆,像睡著了一般霍比。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上暴备,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天悠瞬,我揣著相機(jī)與錄音,去河邊找鬼涯捻。 笑死浅妆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的障癌。 我是一名探鬼主播凌外,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涛浙!你這毒婦竟也來(lái)了康辑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝗拿,失蹤者是張志新(化名)和其女友劉穎晾捏,沒(méi)想到半個(gè)月后蒿涎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體哀托,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年劳秋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仓手。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玻淑,死狀恐怖嗽冒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情补履,我是刑警寧澤添坊,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站箫锤,受9級(jí)特大地震影響贬蛙,放射性物質(zhì)發(fā)生泄漏雨女。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一阳准、第九天 我趴在偏房一處隱蔽的房頂上張望氛堕。 院中可真熱鬧,春花似錦野蝇、人聲如沸讼稚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锐想。三九已至,卻和暖如春七冲,著一層夾襖步出監(jiān)牢的瞬間痛倚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工澜躺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝉稳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓掘鄙,卻偏偏與公主長(zhǎng)得像耘戚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子操漠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容