# Hyperledger Fabric V1.0– 開發(fā)者快速入門
本文檔演示使用Hyperledger Fabric V1.0來部署一個開發(fā)者環(huán)境并運行一個簡單例子。文檔包括創(chuàng)建和加入通道(賬本)、客戶端認證以及部署和調(diào)用智能合約。CLI將用于創(chuàng)建和加入通道(賬本),NodeJS SDK將用于客戶端身份驗證和使用賬本的智能合約功能。
Docker Compose將用于創(chuàng)建包含三個Peer節(jié)點的聯(lián)盟鏈、一個獨立的Orderer和一個證書頒發(fā)機構(CA)。為了加快部署進度,預先生成了基于標準PKI實現(xiàn)的加密要素并打包進fabpre.tar.gz。證書頒發(fā)機構(CA)負責簽發(fā)、撤銷和維護代表一個企業(yè)的加密要素,這些要素提供給客戶端(Node SDK)用于身份認證。
Fabric網(wǎng)絡將通過執(zhí)行docker-compose自動生成,創(chuàng)建通道和加入通道的API將會自動被調(diào)用;同時,開發(fā)者也可以通過手動步驟生成自己的Fabric網(wǎng)絡和通道(賬本)或直接使用開發(fā)者模式進行應用開發(fā)。
****
### 前提條件和系統(tǒng)配置
-**Docker** - v1.12 及更高版本
-**Docker Compose** - v1.8 及更高版本
-**Node.js** - v2.1.8 及更高版本
nodejs帶有節(jié)點的包管理(NPM)。如果你的機器上已經(jīng)安裝了NPM,可以發(fā)出以下命令來獲取新的軟件包:
```Python
npm install npm@latest
```
查看npm安裝的版本:
```Python
npm -v
```
如圖:
查看docker安裝的版本:
```Python
docker -v
```
如圖:
查看docker-compose安裝的版本:
```Python
docker-compose -v
```
如圖:
查看nodejs安裝的版本:
```Python
node -v
```
如圖:
**安裝docker、docker-compose、python-pip、nodejs、npm都不一一安裝了,如果不會安裝的,可以看下我的前一篇博文。**
****
### 一、下載源代碼和創(chuàng)建網(wǎng)絡
- 如果沒有安裝Curl,請先下載并安裝 Curl 工具
```python
yum install curl
```
- 創(chuàng)建 Fabric 工程和項目目錄
```
mkdir -p ?testone
```
- 進入項目目錄
```
cd testone
```
然后, 執(zhí)行如下代碼:
```
curl -L https://raw.githubusercontent.com/hyperledger/fabric/master/examples/sfhackfest/sfhackfest.tar.gz -o sfhackfest.tar.gz 2> /dev/null; ?tar -xvf sfhackfest.tar.gz
```
執(zhí)行完這條命令,會下載并解壓縮部署Fabric網(wǎng)絡的相關組件 ,包括Docker Compose 腳本, 通道創(chuàng)建/加入腳本, 認證使用的加密要素等,在/ src / github.com/example_cc目錄你可以將鏈碼部署。
這時你的目錄里的內(nèi)容應該是這樣的
```
sfhackfest.tar.gz ? channel_test.sh ? src
ccenv ? ? docker-compose-gettingstarted.yml ?tmp
```
### 二、使用docker
你不需要手工拖取Docker鏡像,通過執(zhí)行docker-compose命令, fabric-peer, fabric-orderer, fabric-ca和 cli 都會自動下載、解壓縮相關的鏡像。
### 三、命令
通道相關的命令:
- **create** ? –在 orderer上創(chuàng)建并命名一個通道,返回一個通道的創(chuàng)世區(qū)塊,生成的創(chuàng)世塊以通道的名字命名;
- **join** ?– 使用 create 命令生成的創(chuàng)世區(qū)塊,向Peer節(jié)點發(fā)出加入通道的請求。
### 四、使用Docker 創(chuàng)建Fabric網(wǎng)絡 & 創(chuàng)建/加入通道
(1)確保 hyperledger/fabric-ccenv 鏡像的標簽是 latest,執(zhí)行以下命令:
```
docker-compose -f docker-compose-gettingstarted.yml build
```
(2)創(chuàng)建Fabric網(wǎng)絡 ,創(chuàng)建通道(賬本), 將Peer節(jié)點加入通道,執(zhí)行命令如下:
```
docker-compose -f docker-compose-gettingstarted.yml up -d
```
(3)查看你的容器,命令如下:
```
docker ps -a
```
終端應該顯示有6個獨立運行的容器(3 個peer節(jié)點, 1個 獨立的 orderer, CLI 和 CA). 嵌入在docker-compose.yml里的channel_test.sh會在CLI容器里執(zhí)行創(chuàng)建通道和加入通道命令。執(zhí)行結束,應該只有一個Fabric網(wǎng)絡和一個通道(賬本),通道包含三個節(jié)點peer0,Peer1,Peer2。
(4)確保已創(chuàng)建通道,并已成功連接節(jié)點:
```
docker exec -it cli bash
```
(5)查看通道創(chuàng)建/節(jié)點加入的結果:
```
more results.txt
```
顯示的結果如下:
```
SUCCESSFUL CHANNEL CREATION
SUCCESSFUL JOIN CHANNEL on PEER0
SUCCESSFUL JOIN CHANNEL on PEER1
SUCCESSFUL JOIN CHANNEL on PEER2
```
(6)驗證成功創(chuàng)建了創(chuàng)世塊,執(zhí)行如下命令:
```
more myc1.block
```
(7)退出容器
```
exit
```
****
### 五、下載應用程序源代碼和SDK模塊
- 在發(fā)出命令之前,確保你在工作的目錄中,已經(jīng)下載好代碼。確保你已經(jīng)退出了CLI的容器。
- 執(zhí)行以下命令:
```
curl -OOOOOO https://raw.githubusercontent.com/hyperledger/fabric-sdk-node/master/examples/balance-transfer/{config.json,deploy.js,helper.js,invoke.js,query.js,package.json}
```
這條命令會下載用于部署、調(diào)用和查詢案例,智能合約的 javascript 代碼 ,同時,它也包含了node SDK 依賴的模塊
- 安裝node模塊
```
npm install
```
現(xiàn)在你已經(jīng)擁有了全部Fabric網(wǎng)絡運行需要的組件.
### 六、使用 node SDK 注冊/登錄一個用戶并執(zhí)行部署/調(diào)用/查詢操作
這個案例程序?qū)⑼ㄟ^Node SDK &APIs以及預先準備的CA認證所需的加密要素來實現(xiàn)客戶端的登記、注冊和登錄。一旦客戶端完成身份驗證,就可以執(zhí)行程序包含的智能合約功能(部署、調(diào)用、查詢)。
在每個節(jié)點程序成功后,你將在終端接收到“200”響應。
(1)注冊/登錄 & 部署智能合約 (Linux or OSX):
```
GOPATH=$PWD node deploy.js
```
(2)執(zhí)行一個調(diào)用操作, 從 “a” 轉(zhuǎn)移一定資產(chǎn)到 “b”:
```
node invoke.js
```
(3)查詢鍵值 “b”:
```
node query.js
```
你可以瀏覽NodeJS SDK 和APIs的文檔來實現(xiàn)更多功能。
****
### 七、手動創(chuàng)建和加入通道
使用CLI容器手動執(zhí)行創(chuàng)建通道和加入通道API。
通道m(xù)yc1已經(jīng)存在,所以,讓我們創(chuàng)建一個新的通道,命名為myc2。
(1)進入cli容器:
```
docker exec -it cli sh
```
(2)如果成功,您應該在您的終端看到以下:
```
/opt/gopath/src/github.com/hyperledger/fabric/peer #
```
(3)發(fā)送createChannel API 給 Orderer:
```
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer channel create -c myc2
```
(4)發(fā)送joinchannel API 給 Peer0:
- CreateChannel執(zhí)行完畢將返回一個創(chuàng)世區(qū)塊(myc2.block),然后你可以執(zhí)行加入通道的指令,把Genesis block作為參數(shù)發(fā)送joinchannel API給 peer0。
通道的定義都保存在創(chuàng)世塊內(nèi):
```
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer0:7051 peer channel join -b myc2.block
```
(5)如果想要加入其它節(jié)點,只需重新發(fā)送上述命令給peer1或Peer2即可
```
CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer1:7051 peer channel join -b myc2.block
```
一旦全部Peer節(jié)點都加入了通道,你可以查詢賬本而無需在每個節(jié)點都部署智能合約。
### 八、使用CLI命令,部署,調(diào)用和查詢智能合約
(1)運行部署命令:這個命令是在通道m(xù)yc2上的Peer節(jié)點0上部署一個名叫MYCC的智能合約。構造函數(shù)把A和B的值分別初始化為100和200
```
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode deploy -C myc2 -n mycc -p github.com/hyperledger/fabric/examples -c '{"Args":["init","a","100","b","200"]}'
```
(2)運行調(diào)用命令:這個命令是從A移動10個單位到B
```
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode invoke -C myc2 -n mycc -c '{"function":"invoke","Args":["move","a","b","10"]}'
```
(3)運行查詢命令:按照預期,查詢a的返回值應該是90
```
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode query -C myc2 -n mycc -c '{"function":"invoke","Args":["query","a"]}'
```
你可以在任何時間發(fā)出exit命令退出CLI容器。
### 九、常用docker命令:
1)刪除一個容器
```
docker rm
```
2)強制刪除一個容器
```
docker rm -f
```
3)強制刪除全部容器
```
docker rm -f $(docker ps -aq)
```
4)刪除一個鏡像:
```
docker rmi
```
5)強制刪除一個鏡像:
```
docker rmi -f
```
6)強制刪除全部鏡像
```
docker rmi -f $(docker images -q)
```