本教程基本上是對Marbles
項目的翻譯過程. 若是英文比較好的話,建議根據官方操做說明,一步步進行環境部署。固然你也能夠參考本教程在本身的主機上部署該項目。html
Linux Foundation
項目。 您可能想查閱如下操做說明來稍微瞭解一下 Hyperledger Fabric
各類版本的 marbles
同時存在。 本版本兼容 Hyperledger Fabric v1.1x
。 你能夠經過檢出別的分支來獲取別的版本的 marble
,這裏演示使用的是ae4e37d
分支node
請你們集中注意力,這個應用程序將演示如何利用 Hyperledger Fabric
在許多彈珠全部者之間轉移彈珠。 咱們將在 Node.js
中使用一些 GoLang
代碼完成此任務。 該應用程序的後端將是在咱們的區塊鏈網絡中運行的 GoLang
代碼。 從如今開始,這些 GoLang
代碼將稱爲「鏈代碼」或「cc」。 該鏈代碼自己會建立一顆彈珠,將它存儲到鏈代碼狀態中。 該鏈代碼自己能夠將數據做爲字符串存儲在鍵/值對設置中。 所以,咱們將字符串化 JSON
對象,以便存儲更復雜的結構.react
彈珠的屬性包括:linux
咱們將建立一個用戶界面,它能夠設置這些值並將它們存儲在區塊鏈的帳本中。 彈珠其實是一個鍵值對。 鍵爲彈珠 ID,值爲一個包含(上面列出的)彈珠屬性的 JSON
字符串。 與 cc
的交互是經過對網絡上的一個對等節點使用 gRPC
協議來完成的。 gRPC
協議的細節由一個名爲 Hyperledger Fabric Client SDK 的 SDK 處理。 請查看下圖瞭解拓撲結構細節。
git
這裏使用的是本地的 Hyperledger Fabric 網絡來部署項目,若是想使用 IBM Cloud IBM Blockchain 服務來部署該項目,請參考前言中給的官方文檔.github
ubuntu16.04
若是您經過本人的上一篇博客基於ubuntu16.04快速構建Hyperledger Fabric網絡已經搭建好了一個 Hyperledger Fabric 網絡,那麼這裏只須要安裝 Node.js 的環境並驗證環境是否正確便可,若是您沒有在本地搭建 Hyperledger Fabric 網絡,建議您經過上述博客先在本地構建好網絡環境.docker
通常來講 linux 系統都是自帶 Git ,若是系統裏沒有裝,可使用以下命令來進行安裝npm
$ sudo apt-get install git
安裝完成後驗證一下json
$ git --version git version 2.7.4
Go安裝安裝了一組Go CLI工具,這些工具在編寫連接代碼時很是有用。例如,該 go build 命令容許您在嘗試將其部署到網絡以前檢查鏈代碼是否實際編譯.gulp
$ go version go version go1.10 linux/amd64 $ echo $GOPATH /home/ubuntu/go
這裏的 ubuntu是個人用戶名,表示個人 GOPATH 目錄是個人主目錄下的 go 文件夾,固然你的 GOPATH 不須要匹配上面的那個。它只是很重要的,但你必須把這個變量設置爲文件系統上的有效目錄.
首先能夠先使用 node -v
和 npm -v
命令來驗證系統中是否有 Node.js 環境,若是沒有安裝則須要使用以下命令進行安裝:
$ 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 版本都比較低,並且並不符合咱們項目的環境要求(官網文檔中出現的版本爲:node:v6.10.1;npm:3.10.10)
,爲了不因軟件版本不一樣而引發的問題,咱們還須要對 Node 以及 npm 的版本進行升級操做
$ 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/
$ nrm use taobao Registry has been set to: https://registry.npm.taobao.org/
$ npm install -g n
$ n 6.10.1
$ node -v v6.10.1
$ npm install -g npm@3.10.10
$ npm -v 3.10.10
至此,Node.js的環境就算是搭建完成了
官方文檔中提供了三種選擇,一種是不想對鏈碼進行修改的,下面操做能夠沒必要執行.而想要本身修改鏈碼的並且想使用最新版本 Fabric 的能夠切換到最新的分支,雖說該項目兼容 Hyperledger Fabric v1.1x
,可是出於避免出現未知的錯誤,建議將分支切換到文檔中使用的版本ae4e37d
.切換步驟命令以下
$ cd $GOPATH/src/github.com/hyperledger/fabric $ git checkout ae4e37d
若是按照個人上篇博客配置的,這裏的 $GOPATH
既用戶主目錄下的 go 文件夾,
$ git branch (HEAD detached at ae4e37d) release-1.1
顯示已經切換到ae4e37d
分支,當前最新發布版本爲1.1
. 固然,你若是想知道ae4e37d
分支的具體信息,能夠經過以下命令查看:
$ git log -p commit ae4e37dbafe74997534ab317dec5c3f4f53b6a84 Author: Gari Singh <gari.r.singh@gmail.com> Date: 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 <gari.r.singh@gmail.com> 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
經過上面的命令輸出結果能夠看到,該分支是基於1.0.2
版本的.切換到該分支後,還須要驗證結構安裝
$ cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 $ go build --tags nopkcs11 ./
它應該返回沒有錯誤/警告。您還應該看到在該目錄中建立了可執行文件。
請注意,nopkcs11標籤很重要。PKCS 11是您不太可能在您的系統上使用的公鑰加密標準。 請記住在開發/構建鏈碼時使用此標誌。
對編寫鏈碼 IDE 的選擇官方文檔推薦了兩個 Visual Studio Code 和 Atom,具體的 IDE 開發環境配置能夠在網上搜索.
這裏是構建一個本地的Hyperledger網絡,而後測試該網絡步驟過程.
咱們須要將 Marbles 下載到本地系統。 讓咱們使用 Git 經過克隆此存儲庫來完成該任務。 即便您計劃將 Marbles 託管在 IBM Cloud 中,也須要執行這一步,運行如下命令便可
$ cd ~ $ git clone https://github.com/IBM-Blockchain/marbles.git --depth 1 $ cd marbles
注意:我這裏將 Marbles 克隆到了用戶主目錄下,你能夠選擇任意合適的目錄
咱們將使用 Hyperledger Fabric 例子運行本地網絡。他們的代碼具備 Fabric 網絡的設置以及連接代碼示例。咱們只會使用網絡設置部分。
使用如下命令下載它們的節點示例:
$ git clone https://github.com/hyperledger/fabric-samples.git $ cd fabric-samples
若是以前沒有下載各類結構組織的 Docker 鏡像,那麼可使用下面的命令進行下載
$ 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
請務必經過運行如下命令或將其粘貼到您的.profile文件中,將這些二進制文件添加到PATH變量中
$ export PATH=$PWD/bin:$PATH
$ vim ~/.profile
打開後在最後一行插入插入export PATH=/home/ubuntu/fabric-samples/bin:$PATH
,這裏能夠先使用 pwd
命令來獲取您本地fabric-samples
的目錄,而後將上面命令中的 $PWD
換成該目錄便可,最後使用 :wq
保存退出,執行下面命令刷新一下
$ source ~/.profile
接下來,咱們須要啓動Fabric。運行下面的腳原本讓全部的事情都發生
$ cd ./fabcar $ sudo ./startFabric.sh
一兩分鐘後,命令提示符將返回,運行結果以下圖所示
如今運行該命令 docker ps
查看當前正在運行的Docker
容器。您應該看到相似於如下內容的內容:
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個容器在運行,那麼有些問題是錯誤的。在繼續以前,您須要排除故障。我建議進入一個已中止的容器的日誌sudo docker logs peer0
(替換名稱爲w / e的peer0已中止)。
若是您看到containerID already exists
正在運行的Docker
工具 - 組成,那麼您須要刪除現有的容器。該命令將刪除全部容器docker rm -f $(docker ps -aq)
很好,就快要完成了!如今,咱們須要運行咱們的 Marbles 鏈碼。 請記住,鏈碼是一個關鍵組件,它最終會在帳本上建立咱們的 Marbles 事務。 該鏈碼是須要安裝在對等節點上,而後在一個通道上實例化的 GoLang 代碼。 已爲您編寫好該代碼! 咱們只須要運行它
咱們須要一些彈珠依賴來運行安裝/實例化腳本。經過返回 Marbles 目錄的根目錄並輸入這些命令來安裝彈珠 npm 依賴關係:
$ cd ~/marbles $ npm install
重要的是安裝沒有錯誤返回(警告是好的)。若是你有 npm 安裝錯誤,在繼續以前你必須解決並修復這些錯誤
這是一個很是重要步驟! 安裝和實例化操做須要管理員證書和私鑰。若是找不到這些文件,您將沒法運行任何操做。
$ cd ../fabric-samples/fabcar
$ 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-----\nMIIB8DCCAZegAwIBAgIUeQVhK98LQFSz5Dz0bt3bB9Baom8wCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTgwNTE1MTA1ODAwWhcNMTkwNTE1MTA1\nODAwWjAQMQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBPlS00VDvBQpsmMFUGnNzEAQd7lgpTNgEDpzJGk4/xfBuechE8cfNH6WuibJtXxh\nsEQ4uLAlDcOAP1nfXq9oEtWjbDBqMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E\nAjAAMB0GA1UdDgQWBBShJWerMoKEE2u+dn08UBkGs4tWzjArBgNVHSMEJDAigCBC\nOaoNzXba7ri6DNpwGFHRRQTTGq0bLd3brGpXNl5JfDAKBggqhkjOPQQDAgNHADBE\nAiAmqy0J0M1aZlvuv6cDK8GjeMTMjN0V5dZIW/uBv+whtAIgCMbyQRtE+PDwsoSS\nG40hZ4UOoNS2tvIXHRglMMHvKjs=\n-----END CERTIFICATE-----\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
fabric-samples/fabcar/hfc-key-store
<marbles root>/config/connection_profile_local.json
。fabric-samples
目錄的位置以及密鑰存儲數據所在的位置來更改這些值。一旦路徑有效,您能夠繼續。cd ~/marbles
並繼續執行下面的安裝連接代碼說明。完成以後,咱們須要將鏈代碼放到 peer 節點的文件系統中。記住 chaincode 定義了什麼彈珠(資產)是咱們系統交易的業務邏輯。你能夠在這個目錄中找到彈珠鏈碼<marbles root>/chaincode/src/
。這個目錄下的文件就是鏈碼文件。
咱們將使用位於scripts文件夾中的腳本install_chaincode.js
。它會讀取咱們的彈珠配置文件和鏈接配置文件數據。您能夠經過編輯install_chaincode.js
文件來更改本項目鏈代碼ID或版本。若是您想編輯這些文件並想要更多關於其內容的信息,請打開下面的配置和鏈接配置文件自述文件。若是您對默認設置沒有問題,那麼只需將這些文件單獨保存並運行下面的命令便可。
$ 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 ---------------------------------------
出現上述輸出結果,說明鏈碼安裝成功
接下來咱們須要實例化鏈碼。這會讓您的 channel(通道)
啓動彈珠鏈碼mychannel
。一旦完成,咱們準備使用區塊鏈網絡來記錄咱們的系統(Marbels)活動。使用下面的命令完成實例化:
$ 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 ---------------------------------------
出現上述輸出結果,說明實例化鏈碼成功
經過上述操做,咱們全部的環境都已經配置完成了,接下來就是運行本項目
打開命令提示符/終端並導航到 Marbles 目錄,並執行下面的幾個命令:
$ cd ~/marbles $ sudo npm install gulp -g $ sudo npm install
安裝依賴成功後,而且沒有錯誤返回(警告是好的).若是你有 npm 安裝錯誤,在繼續以前你必須解決並修復這些錯誤
使用以下命令運行項目:
$ 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
出現上述輸出信息,則表示項目啓動成功,如今你能夠在瀏覽器中輸入 http://localhost:3001
來訪問本項目,而且您不須要輸入密碼或更改預先填寫的用戶名admin
.
注意: 本人在使用gulp marbles_local
命令啓動項目的過程當中出現了以下圖的錯誤,有可能你在運行時也會出現這個錯誤:
查看 Issues:208能夠發現有人已經遇到過這種問題, 閱讀後發現這個bug
是由fabric-sdk-node
https://jira.hyperledger.org/browse/FAB-2593 引發的, 須要將hfc-key-store
目錄複製到您的主目錄$HOME / .hfc-key-store
,而後從新配置connection_profile_local.json
的client.credentialStore.path
. 若是你也遇到了這個問題,能夠參考以下步驟.
hfc-key-store
目錄複製到您的主目錄$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
)便可.
$ cd ~/marbles $ gulp marbles_local
若是這樣,還不能運行,你能夠在 issues 裏找找看有沒有相同的錯誤, 若是有解答過程,能夠按照解答的過程,本身試着解決這些問題.
開始
點擊選擇右邊的按鈕Guided
, 經過這種方式便可以瞭解 Fabric 又能自定義一些設置
第一步:檢查鏈接配置數據
第一步是檢查你的鏈接配置JSON文件。 檢查的文件是:marbles/config/marbles_local.json
和`marbles/config/connection_profile_local.json
接下來,咱們嘗試將您註冊爲貴公司的管理員。此步驟與您的證書頒發機構(CA)聯繫並從您的鏈接配置文件中提供了enrollID
和enrollSecret
如今咱們須要在您的channel(通道)
上找到鏈碼。檢查或修改您的鏈接配置文件裏配置的鏈碼名爲彈珠的通道mychannel
。
做爲一個彈珠貿易公司,您能夠攜帶新的彈珠業主。這些彈珠業主表明您的用戶羣。
這一步將建立彈珠用戶而且每一個用戶擁有3個彈珠。
進行下一步前,請點擊Create
進行建立
第五步:配置完成,點擊Enter
進入系統
進入系統後,你能夠按照本教程開頭,或者下面的Gif
動畫演示的那樣爲一個用戶建立彈珠資產,或者將一個彈珠資產轉移給另外一個用戶;也能夠刪除這個彈珠資產.