摘要:協(xié)議的細(xì)節(jié)由一個(gè)名為的處理。運(yùn)行下面的腳本來讓所有的事情都發(fā)生一兩分鐘后,命令提示符將返回運(yùn)行結(jié)果如下圖所示現(xiàn)在運(yùn)行該命令查看當(dāng)前正在運(yùn)行的容器。
前言
本教程基本上是對(duì)Marbles項(xiàng)目的翻譯過程. 如果英文比較好的話,建議根據(jù)官方操作說明,一步步進(jìn)行環(huán)境部署。當(dāng)然你也可以參考本教程在自己的主機(jī)上部署該項(xiàng)目。
Marbles 介紹 關(guān)于 Marbles這個(gè)應(yīng)用程序的基礎(chǔ)網(wǎng)絡(luò)是 Hyperledger Fabric,后者是一個(gè) Linux Foundation 項(xiàng)目。 您可能想查閱以下操作說明來稍微了解一下 Hyperledger Fabric
本演示旨在幫助開發(fā)人員了解鏈代碼的基礎(chǔ)知識(shí)以及如何使用 Fabric 網(wǎng)絡(luò)開發(fā)應(yīng)用程序
這是一個(gè)非常簡單的資產(chǎn)轉(zhuǎn)移演示。多個(gè)用戶可以創(chuàng)建并相互轉(zhuǎn)移彈珠。
版本各種版本的 marbles 同時(shí)存在。 本版本兼容 Hyperledger Fabric v1.1x。 你可以通過檢出別的分支來獲取別的版本的 marble,這里演示使用的是ae4e37d分支
應(yīng)用程序背景請(qǐng)大家集中注意力,這個(gè)應(yīng)用程序?qū)⒀菔救绾卫? Hyperledger Fabric 在許多彈珠所有者之間轉(zhuǎn)移彈珠。 我們將在 Node.js 中使用一些 GoLang 代碼完成此任務(wù)。 該應(yīng)用程序的后端將是在我們的區(qū)塊鏈網(wǎng)絡(luò)中運(yùn)行的 GoLang 代碼。 從現(xiàn)在開始,這些 GoLang 代碼將稱為“鏈代碼”或“cc”。 該鏈代碼本身會(huì)創(chuàng)建一顆彈珠,將它存儲(chǔ)到鏈代碼狀態(tài)中。 該鏈代碼本身可以將數(shù)據(jù)作為字符串存儲(chǔ)在鍵/值對(duì)設(shè)置中。 因此,我們將字符串化 JSON對(duì)象,以便存儲(chǔ)更復(fù)雜的結(jié)構(gòu).
彈珠的屬性包括:
ID(唯一字符串,將用作鍵)
顏色(字符串,CSS 顏色名稱)
尺寸(int,以毫米為單位)
所有者(字符串)
我們將創(chuàng)建一個(gè)用戶界面,它可以設(shè)置這些值并將它們存儲(chǔ)在區(qū)塊鏈的賬本中。 彈珠實(shí)際上是一個(gè)鍵值對(duì)。 鍵為彈珠 ID,值為一個(gè)包含(上面列出的)彈珠屬性的 JSON 字符串。 與 cc 的交互是通過對(duì)網(wǎng)絡(luò)上的一個(gè)對(duì)等節(jié)點(diǎn)使用 gRPC 協(xié)議來完成的。 gRPC 協(xié)議的細(xì)節(jié)由一個(gè)名為 Hyperledger Fabric Client SDK 的 SDK 處理。 請(qǐng)查看下圖了解拓?fù)浣Y(jié)構(gòu)細(xì)節(jié)。
1.管理員將在他們的瀏覽器中與我們的 Node.js 應(yīng)用程序 Marbles 進(jìn)行交互
2.此客戶端 JS 代碼將打開一個(gè)與后端 Node.js 應(yīng)用程序的 Websocket 連接,管理員與該站點(diǎn)交互時(shí),客戶端 JS 將消息發(fā)送到后端
3.讀取或?qū)懭胭~本稱為提案,這個(gè)提案由 Marbles (通過SDK)構(gòu)建,然后發(fā)送到一個(gè)區(qū)塊鏈對(duì)等節(jié)點(diǎn).
4.該對(duì)等節(jié)點(diǎn)將與它的 Marbles 鏈代碼容器進(jìn)行通信. 鏈代碼容器將運(yùn)行/模擬該交易. 如果沒有問題, 它會(huì)對(duì)該交易進(jìn)行背書,并將其發(fā)回我們的Marbles程序.
5.然后, Marbles (通過SDK)將背書后的提案發(fā)送到訂購服務(wù).訂購方將來自整個(gè)網(wǎng)絡(luò)的許多提案打包到一個(gè)區(qū)塊中. 然后它將新的區(qū)塊廣播到網(wǎng)絡(luò)中的對(duì)等節(jié)點(diǎn)
6.最后,對(duì)等節(jié)點(diǎn)會(huì)驗(yàn)證該區(qū)塊并將它寫入到自己的賬本中,該交易現(xiàn)在已經(jīng)生效,所有后續(xù)讀取都會(huì)反映此更改.
Marbles 項(xiàng)目環(huán)境配置這里使用的是本地的 Hyperledger Fabric 網(wǎng)絡(luò)來部署項(xiàng)目,如果想使用 IBM Cloud IBM Blockchain 服務(wù)來部署該項(xiàng)目,請(qǐng)參考前言中給的官方文檔.
注意:本教程使用的系統(tǒng)環(huán)境是: ubuntu16.04
設(shè)置 Chaincode(鏈碼) 開發(fā)環(huán)境如果您通過本人的上一篇博客基于ubuntu16.04快速構(gòu)建Hyperledger Fabric網(wǎng)絡(luò)已經(jīng)搭建好了一個(gè) Hyperledger Fabric 網(wǎng)絡(luò),那么這里只需要安裝 Node.js 的環(huán)境并驗(yàn)證環(huán)境是否正確即可,如果您沒有在本地搭建 Hyperledger Fabric 網(wǎng)絡(luò),建議您通過上述博客先在本地構(gòu)建好網(wǎng)絡(luò)環(huán)境.
驗(yàn)證 Git 環(huán)境一般來說 linux 系統(tǒng)都是自帶 Git ,如果系統(tǒng)里沒有裝,可以使用如下命令來進(jìn)行安裝
$ sudo apt-get install git
安裝完成后驗(yàn)證一下
$ git --version git version 2.7.4驗(yàn)證 GO 環(huán)境
Go安裝安裝了一組Go CLI工具,這些工具在編寫鏈接代碼時(shí)非常有用。例如,該 go build 命令允許您在嘗試將其部署到網(wǎng)絡(luò)之前檢查鏈代碼是否實(shí)際編譯.
驗(yàn)證安裝環(huán)境
$ go version go version go1.10 linux/amd64 $ echo $GOPATH /home/ubuntu/go
這里的 ubuntu是我的用戶名,表示我的 GOPATH 目錄是我的主目錄下的 go 文件夾,當(dāng)然你的 GOPATH 不需要匹配上面的那個(gè)。它只是很重要的,但你必須把這個(gè)變量設(shè)置為文件系統(tǒng)上的有效目錄.
安裝 Node.js 環(huán)境首先可以先使用 node -v 和 npm -v 命令來驗(yàn)證系統(tǒng)中是否有 Node.js 環(huán)境,如果沒有安裝則需要使用如下命令進(jìn)行安裝:
$ sudo apt-get install nodejs $ sudo apt install nodejs-legacy $ sudo apt install npm
安裝完成之后使用 node -v 和 npm -v 命令來查看版本信息:
$ node -v v4.2.6 $ npm -v 3.5.2
遺憾的是通過這種方式安裝的 Node.js 版本都比較低,而且并不符合我們項(xiàng)目的環(huán)境要求(官網(wǎng)文檔中出現(xiàn)的版本為:node:v6.10.1;npm:3.10.10),為了避免因軟件版本不同而引起的問題,我們還需要對(duì) Node 以及 npm 的版本進(jìn)行升級(jí)操作
先配置 npm 倉庫,因?yàn)閲鴥?nèi)的網(wǎng)絡(luò)環(huán)境,直接從 npm 官方源安裝軟件包速度會(huì)特別慢
$ npm install -g nrm
安裝完成之后,列出可用的軟件源
$ nrm ls * npm ---- https://registry.npmjs.org/ cnpm --- http://r.cnpmjs.org/ taobao - https://registry.npm.taobao.org/ nj ----- https://registry.nodejitsu.com/ rednpm - http://registry.mirror.cqupt.edu.cn/ npmMirror https://skimdb.npmjs.com/registry/ edunpm - http://registry.enpmjs.org/
可以切換到淘寶的源,這個(gè)速度在國內(nèi)還是很快的
$ nrm use taobao Registry has been set to: https://registry.npm.taobao.org/
安裝 node 版本管理工具 n
$ npm install -g n
通過 n 安裝指定版本
$ n 6.10.1
再次使用 node -v 命令,查看當(dāng)前版本
$ node -v v6.10.1
升級(jí) npm 的版本號(hào)
$ npm install -g [email protected]
再次使用 npm -v 命令,查看當(dāng)前版本
$ npm -v 3.10.10
至此,Node.js的環(huán)境就算是搭建完成了
Hyperledger Fabric 版本切換官方文檔中提供了三種選擇,一種是不想對(duì)鏈碼進(jìn)行修改的,下面操作可以不必執(zhí)行.而想要自己修改鏈碼的而且想使用最新版本 Fabric 的可以切換到最新的分支,雖然說該項(xiàng)目兼容 Hyperledger Fabric v1.1x,但是出于避免出現(xiàn)未知的錯(cuò)誤,建議將分支切換到文檔中使用的版本 ae4e37d.切換步驟命令如下
將此版本與網(wǎng)絡(luò)/ Fabric 的提交哈希匹配(前7個(gè)字符將起作用)
$ cd $GOPATH/src/github.com/hyperledger/fabric $ git checkout ae4e37d
如果按照我的上篇博客配置的,這里的 $GOPATH 既用戶主目錄下的 go 文件夾,
使用git分支確認(rèn)級(jí)別。它應(yīng)該顯示與您提供的相符的提交級(jí)別
$ git branch * (HEAD detached at ae4e37d) release-1.1
顯示已經(jīng)切換到 ae4e37d分支,當(dāng)前最新發(fā)布版本為1.1. 當(dāng)然,你如果想知道 ae4e37d分支的具體信息,可以通過如下命令查看:
$ git log -p commit ae4e37dbafe74997534ab317dec5c3f4f53b6a84 Author: Gari SinghDate: Mon Aug 7 17:50:39 2017 -0400 FAB-5652 Prepare fabric for 1.0.2 release - base version = 1.0.2 - prev version = 1.0.1 - is_release = false Change-Id: Ibce2a81193b09015eef896391b0e8166d40e7102 Signed-off-by: Gari Singh diff --git a/Makefile b/Makefile index d1febaa..ffe51f3 100755 --- a/Makefile +++ b/Makefile @@ -36,9 +36,9 @@ # - unit-test-clean - cleans unit test state (particularly from docker) PROJECT_NAME = hyperledger/fabric
通過上面的命令輸出結(jié)果可以看到,該分支是基于1.0.2版本的.切換到該分支后,還需要驗(yàn)證結(jié)構(gòu)安裝
打開命令提示符/終端輸入一下命令
$ cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 $ go build --tags nopkcs11 ./
它應(yīng)該返回沒有錯(cuò)誤/警告。您還應(yīng)該看到在該目錄中創(chuàng)建了可執(zhí)行文件。
請(qǐng)注意,nopkcs11標(biāo)簽很重要。PKCS 11是您不太可能在您的系統(tǒng)上使用的公鑰加密標(biāo)準(zhǔn)。 請(qǐng)記住在開發(fā)/構(gòu)建鏈碼時(shí)使用此標(biāo)志。
對(duì)編寫鏈碼 IDE 的選擇官方文檔推薦了兩個(gè) Visual Studio Code 和 Atom,具體的 IDE 開發(fā)環(huán)境配置可以在網(wǎng)上搜索.
這里是構(gòu)建一個(gè)本地的Hyperledger網(wǎng)絡(luò),然后測(cè)試該網(wǎng)絡(luò)步驟過程.
先下載 Marbles 項(xiàng)目我們需要將 Marbles 下載到本地系統(tǒng)。 讓我們使用 Git 通過克隆此存儲(chǔ)庫來完成該任務(wù)。 即使您計(jì)劃將 Marbles 托管在 IBM Cloud 中,也需要執(zhí)行這一步,運(yùn)行以下命令即可
$ cd ~ $ git clone https://github.com/IBM-Blockchain/marbles.git --depth 1 $ cd marbles
注意:我這里將 Marbles 克隆到了用戶主目錄下,你可以選擇任意合適的目錄
下載 Hyperledger Fabric 官方例子我們將使用 Hyperledger Fabric 例子運(yùn)行本地網(wǎng)絡(luò)。他們的代碼具有 Fabric 網(wǎng)絡(luò)的設(shè)置以及鏈接代碼示例。我們只會(huì)使用網(wǎng)絡(luò)設(shè)置部分。
使用以下命令下載它們的節(jié)點(diǎn)示例:
$ git clone https://github.com/hyperledger/fabric-samples.git $ cd fabric-samples
如果之前沒有下載各種結(jié)構(gòu)組織的 Docker 鏡像,那么可以使用下面的命令進(jìn)行下載
$ curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/release-1.1/scripts/bootstrap-1.1.0-preview.sh -o setup_script.sh $ sudo bash setup_script.sh
請(qǐng)務(wù)必通過運(yùn)行以下命令或?qū)⑵湔迟N到您的.profile文件中,將這些二進(jìn)制文件添加到PATH變量中
運(yùn)行命令
$ export PATH=$PWD/bin:$PATH
若想永久將這些二進(jìn)制文件添加到PATH變量中,可以加入到系統(tǒng)環(huán)境變量中
$ vim ~/.profile
打開后在最后一行插入插入 export PATH=/home/ubuntu/fabric-samples/bin:$PATH,這里可以先使用pwd命令來獲取您本地fabric-samples的目錄,然后將上面命令中的$PWD換成該目錄即可,最后使用:wq保存退出,執(zhí)行下面命令刷新一下
$ source ~/.profile啟動(dòng)網(wǎng)絡(luò)
接下來,我們需要啟動(dòng)Fabric。運(yùn)行下面的腳本來讓所有的事情都發(fā)生
$ cd ./fabcar $ sudo ./startFabric.sh
一兩分鐘后,命令提示符將返回,運(yùn)行結(jié)果如下圖所示
現(xiàn)在運(yùn)行該命令 docker ps 查看當(dāng)前正在運(yùn)行的Docker容器。您應(yīng)該看到類似于以下內(nèi)容的內(nèi)容:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 01cdf948b39c dev-peer0.org1.example.com-fabcar-1.0 "chaincode -peer.add…" 2 minutes ago Up 2 minutes dev-peer0.org1.example.com-fabcar-1.0 2f79bac1371e hyperledger/fabric-tools "/bin/bash" 3 minutes ago Up 3 minutes cli 648da0074a8d hyperledger/fabric-peer "peer node start" 3 minutes ago Up 3 minutes 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com 868e0f78f80e hyperledger/fabric-ca "sh -c "fabric-ca-se…" 3 minutes ago Up 3 minutes 0.0.0.0:7054->7054/tcp ca.example.com 4c385bb6aa9d hyperledger/fabric-couchdb "tini -- /docker-ent…" 3 minutes ago Up 3 minutes 4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp couchdb 4b9a2b2b0718 hyperledger/fabric-orderer "orderer" 3 minutes ago Up 3 minutes 0.0.0.0:7050->7050/tcp orderer.example.com
如果你沒有看到全部6個(gè)容器在運(yùn)行,那么有些問題是錯(cuò)誤的。在繼續(xù)之前,您需要排除故障。我建議進(jìn)入一個(gè)已停止的容器的日志sudo docker logs peer0(替換名稱為w / e的peer0已停止)。
如果您看到containerID already exists正在運(yùn)行的碼頭工具 - 組成,那么您需要?jiǎng)h除現(xiàn)有的容器。該命令將刪除所有容器docker rm -f $(docker ps -aq)
安裝并實(shí)例化鏈代碼很好,就快要完成了!現(xiàn)在,我們需要運(yùn)行我們的 Marbles 鏈代碼。 請(qǐng)記住,鏈代碼是一個(gè)關(guān)鍵組件,它最終會(huì)在賬本上創(chuàng)建我們的 Marbles 事務(wù)。 該鏈代碼是需要安裝在對(duì)等節(jié)點(diǎn)上,然后在一個(gè)通道上實(shí)例化的 GoLang 代碼。 已為您編寫好該代碼! 我們只需要運(yùn)行它
準(zhǔn)備我們需要一些彈珠依賴來運(yùn)行安裝/實(shí)例化腳本。通過返回 Marbles 目錄的根目錄并輸入這些命令來安裝彈珠 npm 依賴關(guān)系:
$ cd ~/marbles $ npm install
重要的是安裝沒有錯(cuò)誤返回(警告是好??的)。如果你有 npm 安裝錯(cuò)誤,在繼續(xù)之前你必須解決并修復(fù)這些錯(cuò)誤
生成證書與密鑰文件這是一個(gè)非常重要步驟!安裝和實(shí)例化操作需要管理員證書和私鑰。如果找不到這些文件,您將無法運(yùn)行任何操作。
第1步:在終端/命令提示符中更改路徑到fabric-samples/fabcar目錄:
$ cd ../fabric-samples/fabcar
第2步:運(yùn)行命令:
$ node enrollAdmin.js Store path:/home/ubuntu/fabric-samples/fabcar/hfc-key-store Successfully enrolled admin user "admin" Assigned the admin user to the fabric client ::{"name":"admin","mspid":"Org1MSP","roles":null,"affiliation":"","enrollmentSecret":"","enrollment":{"signingIdentity":"9b6f84a7672908c0629d9b3ad0bf23437d624089061e937af0b0476ec6dec81d","identity":{"certificate":"-----BEGIN CERTIFICATE----- MIIB8DCCAZegAwIBAgIUeQVhK98LQFSz5Dz0bt3bB9Baom8wCgYIKoZIzj0EAwIw czELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh biBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT E2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTgwNTE1MTA1ODAwWhcNMTkwNTE1MTA1 ODAwWjAQMQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA BPlS00VDvBQpsmMFUGnNzEAQd7lgpTNgEDpzJGk4/xfBuechE8cfNH6WuibJtXxh sEQ4uLAlDcOAP1nfXq9oEtWjbDBqMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E AjAAMB0GA1UdDgQWBBShJWerMoKEE2u+dn08UBkGs4tWzjArBgNVHSMEJDAigCBC OaoNzXba7ri6DNpwGFHRRQTTGq0bLd3brGpXNl5JfDAKBggqhkjOPQQDAgNHADBE AiAmqy0J0M1aZlvuv6cDK8GjeMTMjN0V5dZIW/uBv+whtAIgCMbyQRtE+PDwsoSS G40hZ4UOoNS2tvIXHRglMMHvKjs= -----END CERTIFICATE----- "}}}
第3步:運(yùn)行命令:
$ node registerUser.js Store path:/home/ubuntu/fabric-samples/fabcar/hfc-key-store Successfully loaded admin from persistence Successfully registered user1 - secret:PfPGkGQmNgfw Successfully enrolled member user "user1" User1 was successfully registered and enrolled and is ready to intreact with the fabric network
第4步:仔細(xì)檢查文件夾中是否創(chuàng)建了一些密鑰和證書文件 fabric-samples/fabcar/hfc-key-store
第5步:接下來,我們需要驗(yàn)證連接配置文件中的文件路徑是否與您的安裝相匹配。
打開你的連接配置文件
在這個(gè)JSON里找到這三個(gè)字段:
organizations -> x-adminCert -> path
organizations -> x-adminKeyStore -> path
client -> credentialStore -> path
每個(gè)字段中 path 的值需要反映您的環(huán)境(您的目錄結(jié)構(gòu))。你可以瀏覽這些文件夾和文件以驗(yàn)證它們是否存在。
您可能需要根據(jù)您放置fabric-samples目錄的位置以及密鑰存儲(chǔ)數(shù)據(jù)所在的位置來更改這些值。一旦路徑有效,您可以繼續(xù)。
第6步:你完成了!將路徑更改回彈珠根目錄:cd ~/marbles 并繼續(xù)執(zhí)行下面的安裝鏈接代碼說明。
安裝鏈碼完成之后,我們需要將鏈代碼放到 peer 節(jié)點(diǎn)的文件系統(tǒng)中。記住 chaincode 定義了什么彈珠(資產(chǎn))是我們系統(tǒng)交易的業(yè)務(wù)邏輯。你可以在這個(gè)目錄中找到彈珠鏈碼
我們將使用位于scripts文件夾中的腳本install_chaincode.js。它會(huì)讀取我們的彈珠配置文件和連接配置文件數(shù)據(jù)。您可以通過編輯install_chaincode.js文件來更改本項(xiàng)目鏈代碼ID或版本。如果您想編輯這些文件并想要更多關(guān)于其內(nèi)容的信息,請(qǐng)打開下面的配置和連接配置文件自述文件。如果您對(duì)默認(rèn)設(shè)置沒有問題,那么只需將這些文件多帶帶保存并運(yùn)行下面的命令即可。
配置和連接配置文件格式幫助
使用下面的命令安裝彈珠鏈代碼文件:
$ cd ./scripts $ node install_chaincode.js ...... .......... #這里省略了許多輸出信息 .......... ...... --------------------------------------- info: Now we install --------------------------------------- debug: [fcw] Installing Chaincode debug: [fcw] Sending install req targets=[grpc.http2.keepalive_time=300, grpc.keepalive_time_ms=300000, grpc.http2.keepalive_timeout=35, grpc.keepalive_timeout_ms=3500, grpc.max_receive_message_length=-1, grpc.max_send_message_length=-1, grpc.primary_user_agent=grpc-node/1.10.1, _url=grpc://localhost:7051, addr=localhost:7051, , _request_timeout=90000, , _name=null], chaincodePath=marbles, chaincodeId=marbles, chaincodeVersion=v4 info: [packager/Golang.js]: packaging GOLANG from marbles debug: [fcw] Successfully obtained transaction endorsement --------------------------------------- info: Install done. Errors: nope ---------------------------------------
出現(xiàn)上述輸出結(jié)果,說明鏈碼安裝成功
實(shí)例化鏈碼接下來我們需要實(shí)例化鏈碼。這會(huì)讓您的 channel(通道) 啟動(dòng)彈珠鏈碼mychannel。一旦完成,我們準(zhǔn)備使用區(qū)塊鏈網(wǎng)絡(luò)來記錄我們的系統(tǒng)(Marbels)活動(dòng)。使用下面的命令完成實(shí)例化:
$ node instantiate_chaincode.js ...... .......... #這里省略了許多輸出信息 .......... ...... --------------------------------------- info: Now we instantiate --------------------------------------- debug: [fcw] Instantiating Chaincode peer_urls=[grpc://localhost:7051], channel_id=mychannel, chaincode_id=marbles, chaincode_version=v4, cc_args=[12345], ssl-target-name-override=null, pem=null, grpc.http2.keepalive_time=300, grpc.keepalive_time_ms=300000, grpc.http2.keepalive_timeout=35, grpc.keepalive_timeout_ms=3500 debug: [fcw] Sending instantiate req targets=[grpc.http2.keepalive_time=300, grpc.keepalive_time_ms=300000, grpc.http2.keepalive_timeout=35, grpc.keepalive_timeout_ms=3500, grpc.max_receive_message_length=-1, grpc.max_send_message_length=-1, grpc.primary_user_agent=grpc-node/1.10.1, _url=grpc://localhost:7051, addr=localhost:7051, , _request_timeout=90000, , _name=null], chaincodeId=marbles, chaincodeVersion=v4, fcn=init, args=[12345], 0=214, 1=155, 2=127, 3=34, 4=197, 5=82, 6=208, 7=191, 8=141, 9=140, 10=57, 11=113, 12=46, 13=90, 14=76, 15=231, 16=170, 17=118, 18=197, 19=137, 20=186, 21=212, 22=64, 23=33, _transaction_id=d550ed194a2d798f2a6c2924c0302fdc6323fba2835e128f3dc541f1b6754525 debug: [fcw] Successfully obtained transaction endorsement debug: [fcw] Successfully ordered instantiate endorsement. --------------------------------------- info: Instantiate done. Errors: nope ---------------------------------------
出現(xiàn)上述輸出結(jié)果,說明實(shí)例化鏈碼成功
運(yùn)行 Marble 項(xiàng)目通過上述操作,我們所有的環(huán)境都已經(jīng)配置完成了,接下來就是運(yùn)行本項(xiàng)目
安裝依賴打開命令提示符/終端并導(dǎo)航到 Marbles 目錄,并執(zhí)行下面的幾個(gè)命令:
$ cd ~/marbles $ sudo npm install gulp -g $ sudo npm install
安裝依賴成功后,并且沒有錯(cuò)誤返回(警告是好??的).如果你有 npm 安裝錯(cuò)誤,在繼續(xù)之前你必須解決并修復(fù)這些錯(cuò)誤
運(yùn)行項(xiàng)目使用如下命令運(yùn)行項(xiàng)目:
$ gulp marbles_local ...... .......... #這里省略了許多輸出信息 .......... ...... ----------------------------------- Server Up - localhost:3001 ----------------------------------- Welcome aboard: United Marbles Channel: mychannel Org: Org1MSP CA: fabric-ca Orderer: fabric-orderer Peer: fabric-peer-org1 Chaincode ID: marbles Chaincode Version: v4 ------------------------------------------ Websocket Up ------------------------------------------ info: [fcw] Going to enroll peer_urls=[grpc://localhost:7051], channel_id=mychannel, uuid=marblesDockerComposeNetworkmychannelOrg1MSPfabricpeerorg1, ca_url=http://localhost:7054, orderer_url=grpc://localhost:7050, enroll_id=admin, enroll_secret=adminpw, msp_id=Org1MSP, kvs_path=/home/ubuntu/.hfc-key-store info: [fcw] Successfully loaded enrollment from persistence debug: added peer grpc://localhost:7051 debug: [fcw] Successfully got enrollment marblesDockerComposeNetworkmychannelOrg1MSPfabricpeerorg1 info: Success enrolling admin debug: Checking if chaincode is already instantiated or not 1 info: Checking for chaincode... debug: [fcw] Querying Chaincode: read() debug: [fcw] Sending query req: chaincodeId=marbles, fcn=read, args=[selftest], txId=null debug: [fcw] Peer Query Response - len: 5 type: number debug: [fcw] Successful query transaction. ----------------------------- Chaincode found on channel "mychannel" ----------------------------- info: Checking chaincode and ui compatibility... debug: [fcw] Querying Chaincode: read() debug: [fcw] Sending query req: chaincodeId=marbles, fcn=read, args=[marbles_ui], txId=null warn: [fcw] warning - query resp is not json, might be okay: string 4.0.1 debug: [fcw] Successful query transaction. info: Chaincode version is good info: Checking ledger for marble owners listed in the config file info: Fetching EVERYTHING... debug: [fcw] Querying Chaincode: read_everything() debug: [fcw] Sending query req: chaincodeId=marbles, fcn=read_everything, args=[], txId=null debug: [fcw] Peer Query Response - len: 30 type: object debug: [fcw] Successful query transaction. debug: This company has not registered marble owners info: We need to make marble owners - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - info: Detected that we have NOT launched successfully yet debug: Open your browser to http://localhost:3001 and login as "admin" to initiate startup - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
出現(xiàn)上述輸出信息,則表示項(xiàng)目啟動(dòng)成功,現(xiàn)在你可以在瀏覽器中輸入 http://localhost:3001來訪問本項(xiàng)目,并且您不需要輸入密碼或更改預(yù)先填寫的用戶名admin.
注意: 本人在使用gulp marbles_local命令啟動(dòng)項(xiàng)目的過程中出現(xiàn)了如下圖的錯(cuò)誤,有可能你在運(yùn)行時(shí)也會(huì)出現(xiàn)這個(gè)錯(cuò)誤:
查看 Issues:208可以發(fā)現(xiàn)有人已經(jīng)遇到過這種問題, 閱讀后發(fā)現(xiàn)這個(gè)bug是由fabric-sdk-node https://jira.hyperledger.org/... 引起的, 需要將hfc-key-store目錄復(fù)制到您的主目錄$HOME / .hfc-key-store,然后重新配置connection_profile_local.json的client.credentialStore.path. 如果你也遇到了這個(gè)問題,可以參考如下步驟.
先將hfc-key-store目錄復(fù)制到您的主目錄$HOME / .hfc-key-store:
$ cd ~/fabric-samples/fabcar $ cp -r hfc-key-store ~/.hfc-key-store
重新配置connection_profile_local.json的client.credentialStore.path:
$ cd ~/marbles/config $ vim connection_profile_local.json
在文件中定位到下面的片段:
"client": { "organization": "Org1MSP", "credentialStore": { "path": "/$HOME/.hfc-key-store" } },
將path改為上面的路徑(/$HOME/.hfc-key-store)即可.
返回 Marbles 主目錄,重新運(yùn)行本項(xiàng)目
$ cd ~/marbles $ gulp marbles_local
如果這樣,還不能運(yùn)行,你可以在 issues 里找找看有沒有相同的錯(cuò)誤, 如果有解答過程,可以按照解答的過程,自己試著解決這些問題.
運(yùn)行配置截圖開始
點(diǎn)擊選擇右邊的按鈕Guided, 通過這種方式即可以了解 Fabric 又能自定義一些設(shè)置
第一步:檢查連接配置數(shù)據(jù)
第一步是檢查你的連接配置JSON文件。 檢查的文件是:marbles/config/marbles_local.json和`marbles/config/connection_profile_local.json
第二步:注冊(cè)管理員
接下來,我們嘗試將您注冊(cè)為貴公司的管理員。此步驟與您的證書頒發(fā)機(jī)構(gòu)(CA)聯(lián)系并從您的連接配置文件中提供了enrollID和enrollSecret
第三步:查找 Chaincode
現(xiàn)在我們需要在您的channel(通道)上找到鏈碼。檢查或修改您的連接配置文件里配置的鏈碼名為彈珠的通道mychannel。
第四步:創(chuàng)建資產(chǎn)
作為一個(gè)彈珠貿(mào)易公司,您可以攜帶新的彈珠業(yè)主。這些彈珠業(yè)主代表您的用戶群。
這一步將創(chuàng)建彈珠用戶并且每個(gè)用戶擁有3個(gè)彈珠。
進(jìn)行下一步前,請(qǐng)點(diǎn)擊Create進(jìn)行創(chuàng)建
第五步:配置完成,點(diǎn)擊Enter進(jìn)入系統(tǒng)
進(jìn)入系統(tǒng)后,你可以按照本教程開頭,或者下面的Gif動(dòng)畫演示的那樣為一個(gè)用戶創(chuàng)建彈珠資產(chǎn),或者將一個(gè)彈珠資產(chǎn)轉(zhuǎn)移給另一個(gè)用戶;也可以刪除這個(gè)彈珠資產(chǎn).
在每次點(diǎn)擊創(chuàng)建,刪除,交易資產(chǎn)時(shí)其實(shí)都是在進(jìn)行調(diào)用鏈碼操作,而且本項(xiàng)目還有動(dòng)畫進(jìn)行調(diào)用鏈碼的演示:
當(dāng)然,還有更多的功能, 你可以在部署后盡情體驗(yàn)!
IBM-Blockchain/marbles(官方項(xiàng)目地址)
node 版本管理工具 n 無效的原理及解決方案
Ubuntu環(huán)境下安裝nodejs和npm
npm版本怎么降級(jí)
issues:208
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24099.html
摘要:任何彈珠字符串的首字符永遠(yuǎn)都表示零幀?;镜膹椫檎Z法時(shí)間幀的時(shí)間段。完成表示成功完成。錯(cuò)誤終止的錯(cuò)誤。它是此的零幀,在前的所有幀都將是無效的。 羅里吧嗦的一些解釋 RxJS使用的越來越多,但發(fā)現(xiàn)很多開發(fā)者都是使用最基礎(chǔ)的部分用來處理http請(qǐng)求,其實(shí)RxJS可以做的事情不僅僅是在對(duì)網(wǎng)絡(luò)資源處理過程中替代Promise,但如果按照一些已有的網(wǎng)絡(luò)博客和分享來看,對(duì)二者在實(shí)踐上的差異確實(shí)體現(xiàn)...
摘要:和比特幣協(xié)議有所不同的是,以太坊的設(shè)計(jì)十分靈活,極具適應(yīng)性。超級(jí)賬本區(qū)塊鏈的商業(yè)應(yīng)用超級(jí)賬本超級(jí)賬本是基金會(huì)下的眾多項(xiàng)目中的一個(gè)。證書頒發(fā)機(jī)構(gòu)負(fù)責(zé)簽發(fā)撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 從比特幣開始 一個(gè)故事告訴你比特幣的原理及運(yùn)作機(jī)制 這篇文章的定位會(huì)比較科普,盡量用類比的方法將比特幣的基本原理講出來...
摘要:如果你的環(huán)境搭建再云服務(wù)器上,例如阿里云或者騰訊云,可以不用更新源,直接在自己的主機(jī)上使用遠(yuǎn)程連接工具連接上云主機(jī),環(huán)境就算完成了若在本地不能連接上云主機(jī),或者虛擬機(jī),檢查一下是否已經(jīng)安裝并啟動(dòng)若沒有,可以參加網(wǎng)上的教程,配置遠(yuǎn)程連接。 showImg(https://segmentfault.com/img/bVbavlU?w=978&h=273); 前言 最近在參加一個(gè)比賽,使用到...
摘要:可以說,云大數(shù)據(jù)分析和人工智能正在成為的新靈魂。而在年創(chuàng)紀(jì)錄產(chǎn)生的多項(xiàng)專利中,的專利是云大數(shù)據(jù)分析及認(rèn)知計(jì)算相關(guān)。 IBM董事長及CEO Ginni Rometty現(xiàn)在,一個(gè)新IBM正在浮出水面。在IBM的2015年財(cái)報(bào)上寫道:今天的IBM已經(jīng)不僅是一家‘硬件、軟件與服務(wù)’公司,而轉(zhuǎn)型成為一家認(rèn)知解決方案與云平臺(tái)公司。在公司100多年的歷史上,IBM第一次稱自己是一家平臺(tái)公司。IBM首席財(cái)務(wù)...
摘要:我們目前正處于一個(gè)新興的區(qū)塊鏈開發(fā)行業(yè)中。,一種在以太坊開發(fā)人員中流行的新的簡單編程語言,因?yàn)樗怯糜陂_發(fā)以太坊智能合約的語言。它是全球至少萬開發(fā)人員使用的世界上最流行的編程語言之一。以太坊,主要是針對(duì)工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。 我們目前正處于一個(gè)新興的區(qū)塊鏈開發(fā)行業(yè)中。區(qū)塊鏈技術(shù)處于初期階段,然而這種顛覆性技術(shù)已經(jīng)成功地風(fēng)靡全球,并且最近經(jīng)歷了一場與眾不同的繁榮。由于許多...
閱讀 1061·2021-09-22 15:26
閱讀 2637·2021-09-09 11:52
閱讀 1923·2021-09-02 09:52
閱讀 2258·2021-08-12 13:28
閱讀 1197·2019-08-30 15:53
閱讀 524·2019-08-29 13:47
閱讀 3399·2019-08-29 11:00
閱讀 3108·2019-08-29 10:58