區(qū)塊鏈從零起步(P3)創(chuàng)建第一個應(yīng)用

參考
https://hyperledger-fabric.readthedocs.io

該文教程分一下三步:

  1. 啟動一個用于測試的區(qū)塊鏈網(wǎng)絡(luò)
  2. 學(xué)習(xí)如何使用智能合約
  3. 開發(fā)一個可以查詢和修改的應(yīng)用

啟動網(wǎng)絡(luò)

這次我們定位到fabcar文件夾:

git clone https://github.com/hyperledger/fabric-samples.git
cd fabric-samples/fabcar

啟動:

./startFabric.sh

這個腳本做了以下事情:

  • 啟動一個peer節(jié)點(diǎn),order節(jié)點(diǎn),證書和CLI容器
  • 創(chuàng)建一個channel,并把peer添加到channel
  • 安裝智能合約(例如chaincode)到peer的文件系統(tǒng),然后初始化chaincode到channel,實(shí)例化一個chaincode容器
  • 調(diào)用initLedger方法來初始化10輛汽車到channel賬本

可以通過docker ps命令來查看當(dāng)前腳本運(yùn)行后的進(jìn)程情況,接下來我們將重點(diǎn)放在應(yīng)用上。下圖描述了一個應(yīng)用是如何與區(qū)塊鏈網(wǎng)絡(luò)交互的:

應(yīng)用與網(wǎng)絡(luò)的交互

應(yīng)用使用API來調(diào)用智能合約(即這個demo中的chaincode),這些智能合約在主機(jī)的網(wǎng)絡(luò)中用名字和版本唯一標(biāo)識。例如,我們的chaincode容器名為dev-peer0.org1.example.com-fabcar-1.0,名字是fabcar,版本是1.0,peer運(yùn)行在dev-peer0.org1.example.com

查詢賬本

你可以通過單參數(shù)、多參數(shù)、或者是JSON形式的參數(shù)來查詢賬本

我們之前已經(jīng)把賬本中初始化了10輛汽車,現(xiàn)在我們可以用query.js的代碼來查詢這些數(shù)據(jù)了。
再次之前,我們需要先安裝一些node模塊的sdk,定位到fabcar文件夾,執(zhí)行:

npm install

然后運(yùn)行腳本query.js,來得到賬本中的汽車列表,這腳本中我們使用了queryAllCars方法:

node query.js

Query result count =  1
Response is  [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},
{"Key":"CAR1",   "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},
{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},
{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},
{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},
{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},
{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},
{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},
{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},
{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]

現(xiàn)在我們來看一下query.js代碼里面到底發(fā)生了什么。
首先定義了一些變量,例如chaincode ID、channel名字以及網(wǎng)絡(luò)端點(diǎn)等:

var options = {
      wallet_path : path.join(__dirname, './network/creds'),
      user_id: 'PeerAdmin',
      channel_id: 'mychannel',
      chaincode_id: 'fabcar',
      network_url: 'grpc://localhost:7051',

下面是構(gòu)造一個查詢請求:

// queryCar - requires 1 argument, ex: args: ['CAR4'],
// queryAllCars - requires no arguments , ex: args: [''],
const request = {
   chaincodeId: options.chaincode_id,
   txId: transaction_id,
   fcn: 'queryAllCars',
   args: ['']

我們定義chaincode_idfabcar,然后調(diào)用了queryAllCars方法,這個方法被定義在chaincode中。查看chaincode\fabcar\fabcar.go文件,我們可以看到這里面還定義了一些其他的方法,我們可以找到queryAllCars方法的位置:

func (s *SmartContract) queryAllCars(APIstub shim.ChaincodeStubInterface) sc.Response {

     startKey := "CAR0"
     endKey := "CAR999"

     resultsIterator, err := APIstub.GetStateByRange(startKey, endKey)

方法中使用shim接口的函數(shù)GetStateByRange來獲得賬本中startKeyendKey之間的數(shù)據(jù)。下圖表示了一個app是如何調(diào)用chaincode中的不同方法的:

回到query.js,我們將request調(diào)用的方法修改為queryCar,并在args里面加上參數(shù),來獲取某一輛汽車的數(shù)據(jù):

const request = {
      chaincodeId: options.chaincode_id,
      txId: transaction_id,
      fcn: 'queryCar',
      args: ['CAR4']

運(yùn)行:

node query.js

{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}

現(xiàn)在,你應(yīng)該知道了如何在chaincode中做基本的查詢數(shù)據(jù)的操作,下面讓我們來講如何更新賬本。

更新賬本

賬本更新的第一件事情,是要創(chuàng)建一個交易提議,類似于查詢,我們需要先創(chuàng)建出一個request,然后調(diào)用channel.SendTransactionProposal的API來發(fā)送給peer背書。
然后會從network接收到這個交易提議的回復(fù),應(yīng)用可以將這個回復(fù)信息用于創(chuàng)建和簽名一個交易請求。然后我們調(diào)用channel.sendTransactionAPI來將請求發(fā)送到ordering service,這筆交易將會被打包成一個block,然后投遞到該channel的各個peer節(jié)點(diǎn)來進(jìn)行驗證(這個例子中我們只有一個單獨(dú)的結(jié)點(diǎn))。
最終,應(yīng)用將使用eh.setPeerAddrAPI來連接結(jié)點(diǎn)的監(jiān)聽端口,調(diào)用eh.registerTxEvent來注冊與這個交易ID相關(guān)的事件,我們可以通過這個API來得知這次事件的成功與否。
invode.js腳本中,就有用到上述提到的交易流程:

var request = {
    targets: targets,
    chaincodeId: options.chaincode_id,
    fcn: 'createCar',
    args: ['CAR10', 'Chevy', 'Volt', 'Red', 'Nick'],
    chainId: options.channel_id,
    txId: tx_id

我們創(chuàng)建了一個CAR10的請求,執(zhí)行:

node invoke.js

The transaction has been committed on peer localhost:7053

節(jié)點(diǎn)發(fā)送了這次事件的通知,然后我們的應(yīng)用通過eh.registerTxEventAPI接收到了這個通知,并知道了事件的成功。我們可以再調(diào)用查詢接口驗證一下:

Response is  {"colour":"Red","make":"Chevy","model":"Volt","owner":"Nick"}

最后,讓我們來看看修改數(shù)據(jù)。將request中的方法改為changeCarOwner,修改對應(yīng)參數(shù)如下:

var request = {
   targets: targets,
   chaincodeId: options.chaincode_id,
   fcn: 'changeCarOwner',
   args: ['CAR10', 'Barry'],
   chainId: options.channel_id,
   txId: tx_id

執(zhí)行:

node invoke.js

查詢驗證:

Response is  {"colour":"Red","make":"Chevy","model":"Volt","owner":"Barry"}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,484評論 2 379

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