Fabric已經發(fā)布到1.4LTS版本,各個版本對比如下:
來自:超級賬本解讀?https://hyperledger.mochain.info/
Fabric v1.1版本主要的新特性包括:?
Fabric CA的CRL?
區(qū)塊以及交易的事件推送?
增加了所有組建間的雙向TLS通信?
Node.js Chaincode鏈碼的支持?
Chaincode API新增了creator identity?
性能相對v1.0有了明顯的提升
Fabric v1.2開始有了比較大的feature開始出現:?
Private Data Collections:這個特性不得不說在隱私保護上解決了不少項目的痛點,也減少了許多項目為了隱私保護在業(yè)務層做的復雜設計。?
Service Discovery:服務發(fā)現這個特性,使得客戶端擁有了更多的靈活性和可操作性,可以動態(tài)感知整個Fabric網絡的變化。?
Pluggable endorsement and validation:可插拔的背書及校驗機制,采用了Go Plugin機制來實現,避免了之前需要重新編譯源代碼的操作,提升了靈活性。
Fabric v1.3中,同樣增加了十分有用的feature:
基于Identity Mixer的MSP Implementation:基于零知識證明實現的身份的匿名和不可鏈接,這個feature替代了v0.6版本中的T-cert。?
key-level endorsement policies:更細粒度的背書策略,細化到具體的key-value,更加靈活,不僅限于一個鏈碼程序作背書。?
新增Java Chaincode:至此,v1.3之后支持了Go、Node.js、Java 三種Chaincode,為開發(fā)者提供了更多的選擇。?
Peer channel-based event services:Channel級別的事件訂閱機制,早在v1.1版本中已經亮相了,在v1.3版本中正式發(fā)布,至此,舊的Event Hub正式宣告棄用。
Fabric v1.4是一個里程碑式的版本,是首個LTS的版本(Long Term Support的版本):
可操作性和可維護性的提升:?
開放日志級別設置的接口?
開放節(jié)點健康狀態(tài)的檢查接口?
開放節(jié)點數據指標的收集接口?
改進了Node SDK的編程模型,簡化開發(fā)者的代碼復雜度,使得SDK更加易用?
Private Data的增強:?
對于后續(xù)添加的允許訪問節(jié)點能夠獲取之前的隱私數據?
添加客戶端層面的隱私數據的權限控制,不需要添加鏈碼邏輯。
這里作一個更新,新建Centos7.4的虛擬機環(huán)境。大致搭建過程如下。
實驗環(huán)境
云主機:Centos 7.4 、CPU:4C、內存:16G,硬盤:200G。
相關前置軟件安裝
關閉Selinux,關閉防火墻等相關操作,相關操作網絡上隨處可查。
建議更新后再進行下列操作:
yum update
安裝git、curl、pip
yum install git
yum install curl
yum -y install epel-release
yum install python-pip
pip install --upgrade pip
安裝docker相關
yum install docker-ce
或者:yum install docker-ce.18.06.3.ce-3.el7? 指定具體版本,可以先設置好yum 源(yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo)
pip install docker-compose(可能會失敗,那就用以下的命令)
pip install docker-compose --ignore-installed requests
相關軟件環(huán)境:?
安裝完成后查看各個軟件版本,如下圖:?

注:?可能會碰到docker-compose報錯:
File "/usr/lib/python2.7/site-packages/paramiko/ssh_gss.py", line 55, in <module>
GSS_EXCEPTIONS = (gssapi.GSSException,)
AttributeError: 'module' object has no attribute 'GSSException'
那么通過修改配置文件:/usr/lib/python2.7/site-packages/paramiko/ssh_gss.py來解決:
vi /usr/lib/python2.7/site-packages/paramiko/ssh_gss.py
53.55行修改如下解決:
53:import gssapi.error
55:GSS_EXCEPTIONS = (gssapi.error.GSSException,)

安裝Golang、Node.js、npm
安裝Golang?
如果單獨去下載安裝包麻煩的話,那么直接通過wget來下載解壓,配置環(huán)境變量。
wget https://studygolang.com/dl/golang/go1.10.8.linux-amd64.tar.gz
tar -xvf go1.10.8.linux-amd64.tar.gz
配置環(huán)境變量。修改/etc/profile文件,路徑根據下載安裝路徑來。
vim /etc/profile
添加
export GOROOT=/usr/go
export GOPATH=/usr/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
安裝Node.js
wget https://npm.taobao.org/mirrors/node/v11.0.0/node-v11.0.0.tar.gz
tar -xvf node-v11.0.0.tar.gz
解壓后進入Node文件夾:
yum install gcc gcc-c++
完成后gcc -v,這時候會發(fā)現gcc為4.8.5 建議更新:
wget http://ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz
更新完成后,解壓gcc,并安裝:
tar -xvf gcc-7.3.0.tar.gz
進入gcc-7.3.0目錄執(zhí)行:
./contrib/download_prerequisites
mkdir 一個新的目錄
進入該目錄 cd 目錄
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make (請耐心等待,我這里大概等待了2個多小時。。。)
make install
建議重啟后再進行之后的操作
重啟后看到gcc版本為7.3.0?

安裝Node.js
進入Node.js文件夾(這里可能有一個文件夾名的問題,建議修改node7.3.0文件夾名直接為node)
./configure
make (耐心等待)
make install
建議重啟后再進行之后的操作
安裝npm
npm install npm -g
完成上述操作后,查看各軟件版本:

安裝Fabric
首先下載Fabric源碼,我們在go/src目錄下新建文件夾。
mkdir -p github.com/hyperledger
進入該文件夾執(zhí)行:
git clone https://github.com/hyperledger/fabric.git (耐心等待)
完成后進入 fabric/scripts文件夾,可以看到bootstrap.sh腳本,cat該腳本可以看到fabric版本為1.4.0:

執(zhí)行bootstrap.sh腳本,自動進行fabric相關鏡像的下載,耐心等待
./bootstrap.sh

鏡像下載完成后如圖:?

通過Fabric-samples提供的BYFN(build your first network)構建網絡。
./byfn.sh -m generate -c jackychannel(自定義名字)
過程很快,完成后如圖:?

啟動網絡:
./byfn.sh -m up -c jackychannel
啟動后如圖:?

完成后如圖:?

這個時候出現4個peer節(jié)點,通過top命令可以清楚看到:?

注:?關閉命令:./byfn.sh -m down
啟動網絡服務后會啟動排序服務節(jié)點、4個Peer節(jié)點,以及1個命令行容器cli。
搭建完成后功能測試
上述步驟完成后,可是去看下一些基本的操作和命令。
/usr/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/channel-artifacts目錄中,可稱為創(chuàng)世區(qū)塊目錄(目錄根據每個人的配置)
可以看到下列文件:

Org1MSPanchors.tx、Org2MSPanchors.tx,兩個錨節(jié)點配置。?
channel.tx,生成通道配置文件。?
genesis.block,創(chuàng)世區(qū)塊文件。
/usr/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/crypto-config目錄中,可稱為證書目錄(目錄根據每個人的配置)
該目錄存放生成排序服務節(jié)點和Peer節(jié)點的MSP證書文件,如圖:?

使用docker命令查看運行中的鏡像:
docker ps
結果如圖:?

進入cli來進行一些簡單的操作:
docker exec -it cli bash
切換到容器內做一個簡單的查詢:
peer chaincode query -C jackychannel(剛設置啟動的名稱) -n mycc -c '{"Args":["query","a"]}'
結果會看到90余額。
票據應用測試
在Fabric官網文檔中有一個商業(yè)票據的例子,這里簡單進行了測試。(停止Fabric網絡服務后再進行以下操作。)
兩個組織:MagnetoCorp、DigiBank,?
票據網絡:PaperNet。
進入該目錄啟動基本網絡:
/usr/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/basic-network
./start.sh
啟動完成后查看:docker ps 會出現4個運行中容器。
使用:docker network inspect net_basic命令查看docker網絡:?

進入以下目錄,啟動:
cd commercial-paper/organization/magnetocorp/configuration/cli/
./monitordocker.sh net_basic
出現下圖:?

另外開一個終端連接到服務器,在之前目錄下,創(chuàng)建MagnetoCorp公司特定的docker容器。
cd commercial-paper/organization/magnetocorp/configuration/cli/
docker-compose -f docker-compose.yml up -d cliMagnetoCorp
再輸入:docker ps 可以看到fabric-tools:3f078207c01a已加入網絡中:?

MagnetoCorp 管理員通過fabric-tools:3f078207c01a來進行操作。
接下來看下智能合約:?
進入以下目錄:
cd /usr/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/commercial-paper/organization/magnetocorp/contract/lib
該目錄下三個文件,其中papercontract.js為商業(yè)票據的智能合約??梢詂at看下具體內容,這里暫不展開。
執(zhí)行如下部署合約代碼:
docker exec cliMagnetoCorp peer chaincode install -n papercontract -v 0 -p /opt/gopath/src/github.com/contract -l node

實例化智能合約:
docker exec cliMagnetoCorp peer chaincode instantiate -n papercontract -v 0 -l node -c '{"Args":["org.papernet.commercialpaper:instantiate"]}' -C mychannel -P "AND ('Org1MSP.member')"
輸入如下:?

之前打開的終端中會有輸出,也就是logsout容器的中的日志輸出內容,具體如下:?

再次docker ps就可以看到:dev-peer0.org1.example.com-papercontract-0,說明此容器是peer0.org1.example.com節(jié)點啟動的,且正在運行的papercontract鏈碼版本為0。?

MagnetoCorp Application進行票據發(fā)行:
過程圖:?

MagnetoCorp的Isabella發(fā)起整個交易過程。
進入以下目錄:
cd /usr/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/commercial-paper/organization/magnetocorp/application
可以看到下列文件:?
eslintrc.js、issue.js、package.json、addToWallet.js、node_modules
node addToWallet.js
在執(zhí)行上述命令的時候,強烈建議先進行如下操作:這幾個坑一般都存在~~
修改package.json文件
vi package.json
把里面1.0.0版本改成1.4.0
npm install(如報錯執(zhí)行下列命令)
npm install --unsafe-perm fabric-network
如有:Error: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found 報錯那么執(zhí)行下列命令:
find / -name "libstdc++.so.6*
找到文件的指定目錄,筆者這里是6.0.24,復制到/lib64目錄、刪除之前的libstdc++.so.6文件,執(zhí)行如下命令鏈接:
ln -s libstdc++.so.6.0.24 libstdc++.so.6
再刪除之前的node_modules文件夾,再次執(zhí)行:
npm install(如報錯執(zhí)行下列命令)
npm install --unsafe-perm fabric-network
node addToWallet.js
這個時候正常的話會出現done,如圖:?

查看錢包的結構:
ll ../identity/user/isabella/wallet/
ll ../identity/user/isabella/wallet/User1\@org1.example.com
結果如下圖:?

Isabella錢包信息:?
用戶私鑰:c75bd6911aca808941c3557ee7c97e90f3952e379497dc55eb903f31b50abc83-priv?
用戶公鑰:c75bd6911aca808941c3557ee7c97e90f3952e379497dc55eb903f31b50abc83-pub?
用戶證書文件:User1@org1.example.com
發(fā)起交易:?
Isabella現在可以使用issue.js來提交一個交易(發(fā)行MagnetoCorp 公司的商業(yè)票據00001)
node issue.js
結果如圖:?

以上操作都是在MagnetoCorp的Isabella,接下來是,DigiBank-Balaji ,他將購買剛剛發(fā)行的商業(yè)票據。
購買流程圖:?

進入下列目錄:
/usr/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/commercial-paper/organization/digibank/configuration/cli
執(zhí)行:docker-compose -f docker-compose.yml up -d cliDigiBank
結果如圖:?

cd /usr/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/commercial-paper/organization/digibank/application
vi buy.js
buy.js文件可查看合約內容.
和之前npm的操作一樣、修改相關文件內容:
修改package.json文件
vi package.json
把里面1.0.0版本改成1.4.0
npm install(如報錯執(zhí)行下列命令)
npm install --unsafe-perm fabric-network
創(chuàng)建賬戶及購買,商業(yè)票據00001生命周期的最后一個交易是redeem交易,Balaji 通過運行redeem.js程序來實現這一過程。
node addToWallet.js
node buy.js
node redeem.js
在執(zhí)行過程中可能會出現:?

那么執(zhí)行:
npm install -g js-yaml
結果如圖:?


整個實驗大致完成。(未完待續(xù))
參考文章:?
1.http://m.itdecent.cn/p/cb032c42c909?
2.https://blog.csdn.net/ASN_forever/article/details/87859346?