本教程基本上是對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
命令啓動項目的過程當中出現了以下圖的錯誤,有可能你在運行時也會出現這個錯誤:
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
動畫演示的那樣爲一個用戶建立彈珠資產,或者將一個彈珠資產轉移給另外一個用戶;也能夠刪除這個彈珠資產.