日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

区块链开源实现fabric快速部署及CLI体验

發布時間:2025/3/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 区块链开源实现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 -y

    4、用pip安裝docker-compose。

    pip install docker-compose

    5、新建存放測試、部署代碼的目錄。

    mkdir -p /opt/gopath/src/github.com/hyperledger

    6、安裝git。

    yum install git -y

    7、拉取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.sh

    9、安裝go語言。

    yum install golang -y

    并通過在/etc/profile最后追加兩行設置好工作目錄:

  • export PATH=$PATH:/usr/local/go/bin

  • export GOPATH=/opt/gopath

  • 最后執行下:

    source /etc/profile

    10、修改一個阻塞執行的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体验的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产chinese中国hdxxxx | 欧美videossex另类 | 亚洲AV成人精品 | 国产精品免费一区二区三区在线观看 | 亚洲熟妇无码av | 久久6视频| 岛国a视频| av老司机在线观看 | 操操操操操操操操操 | 欧美性一级 | 爱爱视频一区二区 | 久久精品一区二区三区黑人印度 | 欧洲精品一区二区三区 | 少妇激情偷人三级 | www.好了av.com| 看一级片| 日韩中文字幕第一页 | 偷拍视频一区二区 | 精品处破女学生 | 高清乱码免费网 | 日本视频免费在线播放 | 人人看超碰 | 国精产品一区一区三区有限公司杨 | 国产女合集 | 欧美性生交片4 | 夜色成人网 | 免费一级特黄毛大片 | 亚洲xxxx视频 | 欧美交| 亚洲影院在线播放 | 亚洲女同一区二区 | 中日韩在线播放 | 国产第三页 | 在线观看毛片av | 亚洲欧美第一页 | 日韩精品一区二区三区 | 女人又爽又黄免费女仆 | 国产日韩欧美综合 | 天天综合网在线观看 | 久久影视 | 97色在线视频 | 日本欧美在线播放 | 国产情侣酒店自拍 | 日韩影院一区 | 2019国产精品视频 | 少妇av一区二区三区 | 日韩国产在线播放 | 欧美鲁 | 亚洲天堂影院在线观看 | а中文在线天堂 | 日韩欧美精品在线播放 | 亚洲国产成人精品视频 | 国产一区二区三区四区五区美女 | 男女啪啪免费网站 | 17c国产精品一区二区 | 调教一区 | 日本美女一区二区 | 夜夜草天天干 | 波多野结衣中文字幕一区二区 | 久久高清无码电影 | 男女啪啪免费网站 | 在线中文字幕一区二区 | 中国女人内谢69xxxx | 污漫网站| 求一个黄色网址 | 婷婷玖玖| www国产在线 | 国产日本在线 | 欧美性生活网站 | 欧美黄片一区二区三区 | 雨宫琴音一区二区三区 | 中文字幕婷婷 | 日韩无码电影 | 日本美女性爱视频 | 欧日韩一区二区三区 | 久久99精品久久久水蜜桃 | 131美女爱做视频 | 欧美成人一二三 | 久色亚洲| 免费一级片网站 | 日本一区二区三区在线看 | 国产v亚洲v天堂无码 | 午夜剧场免费观看 | 欧美激情在线狂野欧美精品 | 亚洲免费小视频 | 朝桐光一区二区三区 | 精品一区二区三区四区 | 欧美日韩1 | 欧美人伦 | 国产精品zjzjzj在线观看 | 一区二区三区日本视频 | 中文字幕免费在线观看 | 最新黄网 | 福利在线看 | 婷婷毛片| 91成年人网站 | 午夜免费看片 | 日本欧美色 | 亚洲精品国产成人久久av盗摄 |