区块链开源实现fabric快速部署及CLI体验
區塊鏈開源實現fabric快速部署及CLI體驗
2018年05月22日 09:53:41?閱讀數:1359?標簽:?hyperledgerfabric區塊鏈聯盟鏈PBFT?更多
個人分類:?區塊鏈技術分享linux算法
本文描述fabric快速部署的步驟,及演示基于官方example02的智能合約進行CLI命令行體驗。區塊鏈涉及服務很多,且大量使用docker容器技術,所以請嚴格遵守以下步驟去部署,以減少各種問題的出現,方便我們先對聯盟鏈有個大概的感覺。本文描述環境是centos7操作系統,請其他版本更正相關的安裝工具(如ubuntu操作系統請把yum命令換成apt-get)。
1、搭建e2e_cli環境快速部署fabric的11個步驟:
1、安裝docker_ce版。
如果已經安裝了老版docker,請先卸載。
yum remove docker docker-common docker-selinux docker-engine再來安裝docker:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager --enable docker-ce-edge
sudo yum-config-manager --enable docker-ce-test
sudo yum-config-manager --disable docker-ce-edge
sudo yum makecache fast
sudo yum install docker-ce
最后啟動docker服務:
service docker start
chkconfig docker on
2、配置好docker加速器。
官方docker非常慢,請一定在阿里云等提供docker倉庫加速器的網站注冊好帳戶(比如https://cr.console.aliyun.com/#/accelerator),配置好加速器。
3、安裝好pip。
yum install python-pip -y4、用pip安裝docker-compose。
pip install docker-compose5、新建存放測試、部署代碼的目錄。
mkdir -p /opt/gopath/src/github.com/hyperledger6、安裝git。
yum install git -y7、拉取fabric代碼。
cd /opt/gopath/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
請切換到最新的1.1分支上。
8、拉取docker鏡像(時間較長)及一些可執行文件。
./opt/gopath/src/github.com/hyperledger/fabric/scripts/bootstrap.sh9、安裝go語言。
yum install golang -y并通過在/etc/profile最后追加兩行設置好工作目錄:
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/opt/gopath
最后執行下:
source /etc/profile10、修改一個阻塞執行的bug。
修改/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/base/peer-base.yaml文件:
將:
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2ecli_default
修改為:
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2e_cli_default
11、啟動服務。
進入/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli目錄,執行:
bash network_setup.sh up如果最后出現下圖則部署成功:
2、體驗fabric系統功能
當服務在一臺server上啟動后,可以看到以下docker實例:
可以看到,默認安裝了:4個peer(2個是org1的,2個是org2的)節點、4節點構成的kafka集群、3節點構成的zookeeper集群、1個orderer節點。這是因為:fabric提供的共識機制,PBFT目前還未達到生產級別的應用,只能靠kafka+zookeeper實現PAXOS算法下的共識機制(不能有作惡結點)。一般zookeeper是3或者5個結點,
fabric提供了SDK和CLI兩種交互方式,本文不討論SDK。
可以進入cli里執行peer命令。如果cli長時間未用退出后,可先啟動cli:
docker start cli再進入cli實例里:
docker exec -it cli bash接著可執行peer命令,體驗區塊鏈的命令行使用方式。
2.1、 peer命令
peer命令含有五個子命令,如下:
peer chaincode [option] [flags]
peer channel [option] [flags]
peer logging [option] [flags]
peer node [option] [flags]
peer version [option] [flags]
每個子命令可使用--help查看詳細幫助。
在fabric里,所有的交易必須通過智能合約才能操作,而chaincode鏈碼就是智能合約。chaincode支持以下option操作:
- package 智能合約需要打包后才能使用
- install??? 智能合約必須安裝后才能使用
- instantiate?? 置初始狀態。比如設系統一開始用戶a有100元,用戶b有200元
- invoke? 調用智能合約
- query??? 查詢狀態
- signpackage? 包簽名
- upgrade??? 智能合約升級
- list??????? 顯示智能合約
智能合約需要先install才能使用。
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02其中-n表示合約名字,-p指向合約文件目錄路徑,-v是版本號。
2.2 example02智能合約
每個智能合約實現Init和Invoke兩個方法,其中前者用于初始化,后者是日常調用。
2.2.1 初始化
example02的Init方法接收4個參數(包括帳戶A,余額pA,帳戶B,余額pB),比如:
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"其中,-C指向channel名字,-c則是初始構造json格式的消息,-P是背書策略,-o指定共識節點。這里置帳戶a初始余額為100,帳戶b初始余額為200。其代碼實現如下:
func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
fmt.Println("ex02 Init")
//用args取得命令行的參數
_, args := stub.GetFunctionAndParameters()
var A, B string // Entities
var Aval, Bval int // Asset holdings
var err error
//簡單的例子么,只接收4個參數,包括帳戶A,余額pA,帳戶B,余額pB
if len(args) != 4 {
return shim.Error("Incorrect number of arguments. Expecting 4")
}
// Initialize the chaincode
A = args[0]
Aval, err = strconv.Atoi(args[1])
if err != nil {
return shim.Error("Expecting integer value for asset holding")
}
B = args[2]
Bval, err = strconv.Atoi(args[3])
if err != nil {
return shim.Error("Expecting integer value for asset holding")
}
fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)
//將A及其余額寫入狀態數據庫
err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
if err != nil {
return shim.Error(err.Error())
}
//將B及其余額寫入狀態數據庫
err = stub.PutState(B, []byte(strconv.Itoa(Bval)))
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(nil)
}
2.2.2 查詢余額
接著查詢余額,例如查詢a帳戶的余額:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'這里需要說明,example02的Invoke共支持3種指令:
func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
fmt.Println("ex02 Invoke")
function, args := stub.GetFunctionAndParameters()
if function == "invoke" {
// 從A向B帳戶轉賬
return t.invoke(stub, args)
} else if function == "delete" {
// 從狀態數據庫中刪除帳戶
return t.delete(stub, args)
} else if function == "query" {
// 查詢狀態數據庫中某帳戶的余額
return t.query(stub, args)
}
return shim.Error("Invalid invoke function name. Expecting \"invoke\" \"delete\" \"query\"")
}
因此,上述查詢我們會得出類似結果:
為何結果格式是這樣的呢?看下t.query的實現:
func (t *SimpleChaincode) query(stub shim.ChaincodeStubInterface, args []string) pb.Response {
var A string // Entities
var err error
if len(args) != 1 {
return shim.Error("Incorrect number of arguments. Expecting name of the person to query")
}
A = args[0] //獲取帳戶的名字
// 從狀態數據庫中獲取帳戶的值
Avalbytes, err := stub.GetState(A)
if err != nil {
jsonResp := "{\"Error\":\"Failed to get state for " + A + "\"}"
return shim.Error(jsonResp)
}
if Avalbytes == nil {
jsonResp := "{\"Error\":\"Nil amount for " + A + "\"}"
return shim.Error(jsonResp)
}
jsonResp := "{\"Name\":\"" + A + "\",\"Amount\":\"" + string(Avalbytes) + "\"}"
//這里是顯示在命令行的格式:Query Response:90
fmt.Printf("Query Response:%s\n", jsonResp)
return shim.Success(Avalbytes)
}
2.2.3 轉帳
比如由B向A轉帳50:
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c '{"Args":["invoke","b","a","50"]}'成功后我們會在輸屏結果中找到這一行:ESCC invoke result: version:1 response:<status:200 message:"OK" >
其實現為從A和B帳戶下用GetStat方法從狀態數據庫取出余額,與query類似,接著加減相應的值50后,再調用PutStat方法寫入狀態數據庫。
此時我們可以再次查詢,可以獲得正確結果。
?
小結:以上只適用于簡單體驗fabric的功能,對于智能合約、共識算法、世界狀態等在接下來的文章中我們再分析。
總結
以上是生活随笔為你收集整理的区块链开源实现fabric快速部署及CLI体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TAJ齐发力 互联网巨头抢滩“区块链+票
- 下一篇: 5G已来,你来不来