fabric編譯安裝1.0.0(工具)


㈠安裝docker

https://www.cnblogs.com/ycx95/p/9177209.html

㈡安裝其他必須的組件

centos 下需要安裝

yum install -y gcc libtool libltdl-dev libtool-ltdl-devel openssl 

比如安裝:yum install libtool-ltdl-devel

Libtool
Libtool

如果少安裝 libtool-ltdl-devel這個依賴包會獲取代碼以及編譯的時候會報以下錯誤
錯誤1 原因是未安裝libtool-ltdl-devel
錯誤1 原因是未安裝libtool-ltdl-devel

 

㈢查看go env

這里的需要注意:出現的GOPATH路徑是什么
我操作時候發現似乎root下面查看該命令和普通用戶不一樣,因此要特別注意一下。

以下都是我基於root賬戶操作的。


go env
go env

㈣源碼准備

參考博客是honganboy
1、在$GOPATH下建立目錄結構src/github.com/hyperledger,切換到此目錄后下載fabric 1.1.0-preview版源碼

mkdir -p $GOPATH/src/github.com/hyperledger cd $GOPATH/src/github.com/hyperledger 

下載:我是直接在真機下載拖到虛擬機的
下載完成就拷貝到$GOPATH/src/github.com/hyperledger

cp /home/admin/桌面/fabric-1.1.0-preview.tar.gz  $GOPATH/src/github.com/hyperledger 
下載完成拷貝
下載完成拷貝

解壓文件tar -zxvf並將解壓后得到的目錄重命名為fabric


解壓后
解壓后

mv重命名
mv重命名

2、開始編譯之前,到fabric源碼目錄下執行make test-cmd命令獲取-ldflags選項的取值

cd $GOPATH/src/github.com/hyperledger/fabric make test-cmd 
make test-cmd
make test-cmd
接下來,編譯每個可執行程序時都要帶上-ldflags選項。為了方便可執行程序的管理及后續編寫相關shell腳本,先在當前用戶的home目錄下建立如下目錄結構
fabric-1.1.0-preview-demo(后續所有的例子都放在此目錄下) ----bin(編譯的可執行程序放在此目錄下) ----networks(fabric網絡相關配置在此目錄下) ----chaincodes(鏈碼相關源碼放在此目錄下) mkdir -p ~/fabric-1.1.0-preview-demo/bin mkdir -p ~/fabric-1.1.0-preview-demo/networks mkdir -p ~/fabric-1.1.0-preview-demo/chaincodes 

 

創建好相應的文件
創建好相應的文件

cd ~/fabric-1.1.0-preview-demo/bin切換到剛建立的bin目錄下,就可以開始編譯了

 

㈤編譯

⑴編譯orderer

Orderer用於處理交易的排隊及共識。編譯命令如下

 

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.0-preview -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.Experimental=false" github.com/hyperledger/fabric/orderer 

 

  • 編譯時加入-gcflags可以讓編譯器忽略一些優化,方便后面在調試可執行程序時觀察變量及對應代碼行號。
    出現以下原因是因為缺少Libtool


    錯誤1:缺少Libtool
    錯誤1:缺少Libtool

    正確顯示
    正確顯示

⑵編譯peer

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.0-preview -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.Experimental=false" github.com/hyperledger/fabric/peer 

⑶編譯cryptogen

cryptogen用於生成交易簽名及SSL通信用到證書及私鑰對,可以使用fabric-ca或者其他ca頒發的證書,但測試環境使用crytogen更簡單。編譯命令如下:

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.0-preview -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.Experimental=false" github.com/hyperledger/fabric/common/tools/cryptogen 

⑷編譯configtxgen

configtxgen用於生成Orderer的創世紀塊及通道配置交易等內容。編譯命令如下

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.0-preview -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.Experimental=false" github.com/hyperledger/fabric/common/tools/configtxgen 

上述編譯都結束后,bin目錄下就有了四個可執行程序

bin目錄下
bin目錄下

可以使用chmod命令給這些程序加上可執行權限,然后可以使用version子命令查看相應程序的版本
[root@localhost bin]# chmod +x *
[root@localhost bin]# ./peer version
peer:
 Version: 1.1.0-preview
 Go version: go1.10.3
 OS/Arch: linux/amd64
 Experimental features: false
 Chaincode:
  Base Image Version: 0.4.2
  Base Docker Namespace: hyperledger
  Base Docker Label: org.hyperledger.fabric
  Docker Namespace: hyperledger
2018-06-13 12:37:05.203 CST [main] main -> INFO 001 Exiting.....

㈥搭建單個Peer節點網絡

搭建一個Peer節點和一個Orderer節點的網絡
開始之前,先在~/fabric-1.1.0-preview-demo/networks下建立如下結構的目錄:

single-dev-env
--config(存放配置文件)
----channel-artifacts(存放后面要生成的通道配置交易等文件)
shell命令:
mkdir -p ~/fabric-1.1.0-preview-demo/networks/single-dev-env/config/channel-artifacts Fabric中搭建一個網絡需要如下步驟: 1. 使用cryptogen生成網絡需要的證書。 2. 使用configtxgen生成Orderer的創世紀塊 3. 使用configtxgen創建通道配置交易 4. 使用peer cli創建及加入通道 

注意:如果沒有特殊說明,接下來的命令均是在~/fabric-1.1.0-preview-demo目錄下執行的

6.1 生成證書

使用cryptogen生成網絡需要的證書,需指定配置文件,參考官方fabric-samples的first-network的crypto-config.yaml文件,編寫只有一個orderer和一個peer的配置文件crypto-config.yaml(放在single-dev-env/config目錄下):

cd ~/fabric-1.1.0-preview-demo/networks/single-dev-env/config touch crypto-config.yaml gedit crypto-config.yaml 寫入如下內容: OrdererOrgs: - Name: Orderer Domain: example.com Specs: - Hostname: orderer PeerOrgs: - Name: Org Domain: example.com Template: Count: 1 Hostname: peer Users: Count: 1

執行命令

cd ~/fabric-1.1.0-preview-demo export PATH=$(pwd)/bin:$PATH cryptogen generate --config=networks/single-dev-env/config/crypto-config.yaml --output=networks/single-dev-env/config/crypto-config
執行命令
命令執行成功后, cd networks/single-dev-env/config/crypto-config目錄下生成了如下結構的證書目錄(工具是winscp)
命令執行成功概覽
命令執行成功概覽
tree -L 4 crypto-config 

若提示找不到:tree命令
解決tree命令找不到問題

安裝tree
安裝tree
顯示如下:
[root@localhost config]# tree -L 4 crypto-config crypto-config ├── ordererOrganizations │ └── example.com │ ├── ca │ │ ├── 2206fc45088a6525f1771cc474004cf5ba9f0cbeade431355c3d368d18799c09_sk │ │ └── ca.example.com-cert.pem │ ├── msp │ │ ├── admincerts │ │ ├── cacerts │ │ └── tlscacerts │ ├── orderers │ │ └── orderer.example.com │ ├── tlsca │ │ ├── e16c21cf086c59fe0be99a49eb55353a70bd2eec8461476efa7fb6e54a92f3f0_sk │ │ └── tlsca.example.com-cert.pem │ └── users │ └── Admin@example.com └── peerOrganizations └── example.com ├── ca │ ├── 175a0fcbc0fd09c7113d1a402922f5ffc3668cc83c9256f0983db6bfeb717c6e_sk │ └── ca.example.com-cert.pem ├── msp │ ├── admincerts │ ├── cacerts │ └── tlscacerts ├── peers │ └── peer.example.com ├── tlsca │ ├── 1a39b9e18a5ef76090b9200ff1cbe452129cf9ef41c7f42c543532dab45ff2ab_sk │ └── tlsca.example.com-cert.pem └── users ├── Admin@example.com └── User1@example.com 25 directories, 8 files [root@localhost config]# 

orderer.example.com目錄存放的是Orderer節點需要的證書,等會啟動Orderer節點時需要指定msp目錄:(但tree -L 4顯示msp是3個,但tree -C顯示是5個,也可winscp查看的時候是msp下面有5個)

peer.example.com目錄存放的是Peer節點需要的證書,等會啟動Peer節點時需要指定msp目錄(與order類似就是缺少了兩個東西,但我運行結果與書上一致)
Admin@example.com目錄下的證書是Peer節點管理員證書,創建、加入通道、發送交易等操作都是用此目錄下的證書進行簽名,因此,我們使用peer cli時需要指定msp目錄(與order類似就是缺少了兩個東西)

 

6.2使用configtxgen生成Orderer的創世紀塊

參考官方fabric-samples的first-network的configtx.yaml文件編寫一個configtx.yaml文件(放在single-dev-env/config目錄下)

touch configtx.yaml gedit configtx.yaml 

文件內容如下:

Profiles:
    SingleSoloOrdererGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org
    SingleSoloChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org

Organizations:
    - &OrdererOrg
        Name: OrdererOrg
        ID: OrdererMSP
        MSPDir: crypto-config/ordererOrganizations/example.com/msp

    - &Org
        Name: OrgMSP
        ID: OrgMSP
        MSPDir: crypto-config/peerOrganizations/example.com/msp
        AnchorPeers:
            - Host: peer.example.com
              Port: 7051

Orderer: &OrdererDefaults
    OrdererType: solo
    Addresses:
        - orderer.example.com:7050
    BatchTimeout: 2s
    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB
    Organizations:

Application: &ApplicationDefaults
    Organizations:

sudo gedit /etc/hosts修改/etc/hosts,追加上如下內容並保存

127.0.0.1 example.com 127.0.0.1 orderer.example.com 127.0.0.1 peer.example.com 

Fabric使用X.509證書作為節點及用戶的身份,而證書一般優於域名管理,因此,這里做了域名映射。
設置FABRIC_CFG_PATH環境變量告訴configtxgen去哪個目錄尋找configtx.yaml文件,使用“生成證書”一節用到終端執行如下命令:

cd ~/fabric-1.1.0-preview-demo/ export FABRIC_CFG_PATH=$(pwd)/networks/single-dev-env/config/ 

使用上一小節用到終端執行如下命令
注:一定是要在demo下目錄哦

configtxgen -outputBlock networks/single-dev-env/config/genesis.block -profile SingleSoloOrdererGenesis
執行結果:
[root@localhost config]# cd ~/fabric-1.1.0-preview-demo/ [root@localhost fabric-1.1.0-preview-demo]# export FABRIC_CFG_PATH=$(pwd)/networks/single-dev-env/config/ [root@localhost fabric-1.1.0-preview-demo]# configtxgen -outputBlock networks/single-dev-env/config/genesis.block -profile SingleSoloOrdererGenesis 2018-06-13 12:01:35.374 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration 2018-06-13 12:01:35.381 CST [common/tools/configtxgen] doOutputBlock -> INFO 002 Generating genesis block 2018-06-13 12:01:35.381 CST [common/tools/configtxgen] doOutputBlock -> INFO 003 Writing genesis block 

本步驟及下一步中的-profile選項的取值均是與configtx.yaml文件內容對應。
命令執行成功后,cd networks/single-dev-env/config目錄下就多了一個genesis.block文件

ls networks/single-dev-env/config/
結果是:
[root@localhost fabric-1.1.0-preview-demo]# ls networks/single-dev-env/config/ channel-artifacts configtx.yaml crypto-config crypto-config.yaml genesis.block 

6.3使用configtxgen創建通道配置交易

使用上一小節用到終端執行如下命令

export CHANNEL_NAME=mychannel
configtxgen -outputCreateChannelTx  networks/single-dev-env/config/channel-artifacts/channel.tx -profile SingleSoloChannel -channelID $CHANNEL_NAME

結果:
[root@localhost fabric-1.1.0-preview-demo]# export CHANNEL_NAME=mychannel [root@localhost fabric-1.1.0-preview-demo]# configtxgen -outputCreateChannelTx networks/single-dev-env/config/channel-artifacts/channel.tx -profile SingleSoloChannel -channelID $CHANNEL_NAME 2018-06-13 12:05:35.451 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration 2018-06-13 12:05:35.456 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx 2018-06-13 12:05:35.456 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 003 Writing new channel tx [root@localhost fabric-1.1.0-preview-demo]# 

 

命令執行成功后,networks/single-dev-env/config/channel-artifacts目錄下多了一個channel.tx文件

結果:
[root@localhost fabric-1.1.0-preview-demo]# ls networks/single-dev-env/config/channel-artifacts channel.tx 

6.4啟動Orderer和Peer節點

本小節是使用環境變量配置Orderer和Peer節點,其實也可以使用yaml文件配置,后面再介紹
新打開一個終端,切換到cd ~/fabric-1.1.0-preview-demo目錄並設環境變量配置Orderer節點:(root身份登錄)

export rootDir=$(pwd) export PATH=$rootDir/bin:$PATH export ORDERER_GENERAL_LOGLEVEL=DEBUG export ORDERER_GENERAL_TLS_ENABLED=false export ORDERER_GENERAL_PROFILE_ENABLED=false export ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 export ORDERER_GENERAL_LISTENPORT=7050 export ORDERER_GENERAL_GENESISMETHOD=file export ORDERER_GENERAL_GENESISFILE=$rootDir/networks/single-dev-env/config/genesis.block export ORDERER_GENERAL_LOCALMSPDIR=$rootDir/networks/single-dev-env/config/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp export ORDERER_GENERAL_LOCALMSPID=OrdererMSP export ORDERER_FILELEDGER_LOCATION=$rootDir/networks/single-dev-env/data/orderer 

啟動Orderer節點;(為了方便,可以把環境變量的設置及orderer啟動的命令寫在shell腳本中)
orderer

order啟動成功
order啟動成功

 

再打開一個終端,切換到cd ~/fabric-1.1.0-preview-demo目錄並設環境變量配置Peer節點

export rootDir=$(pwd) export PATH=$rootDir/bin:$PATH export CORE_PEER_ID=example_org export CORE_CHAINCODE_MODE=dev export CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 export CORE_PEER_NETWORKID=dev export CORE_LOGGING_LEVEL=INFO export CORE_PEER_TLS_ENABLED=false export CORE_PEER_PROFILE_ENABLED=false export CORE_PEER_ADDRESS=0.0.0.0:7051 export CORE_PEER_LISTENADDRESS=0.0.0.0:7051 export CORE_PEER_GOSSIP_ENDPOINT=0.0.0.0:7051 export CORE_PEER_EVENTS_ADDRESS=0.0.0.0:7053 export CORE_PEER_LOCALMSPID=OrgMSP export CORE_LEDGER_STATE_STATEDATABASE=goleveldb export CORE_PEER_MSPCONFIGPATH=$rootDir/networks/single-dev-env/config/crypto-config/peerOrganizations/example.com/peers/peer.example.com/msp export CORE_PEER_FILESYSTEMPATH=$rootDir/networks/single-dev-env/data/peer 

啟動:

peer node start -o 127.0.0.1:7050 --peer-chaincodedev=true 
peer
peer

6.5創建通道

新打開一個終端,切換到cd ~/fabric-1.1.0-preview-demo目錄並設環境變量

export rootDir=$(pwd) export PATH=$rootDir/bin:$PATH export CHANNEL_NAME=mychannel export CORE_CHAINCODE_MODE=dev export CORE_PEER_ID=peer-cli export CORE_PEER_ADDRESS=peer.example.com:7051 export CORE_PEER_LOCALMSPID=OrgMSP export CORE_PEER_MSPCONFIGPATH=$rootDir/networks/single-dev-env/config/crypto-config/peerOrganizations/example.com/users/Admin@example.com/msp 

這些環境變量以后操作時經常用到,可以保存在一個文本文件中,新開終端就使用source <文件名>使其生效。
執行命令:

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f $rootDir/networks/single-dev-env/config/channel-artifacts/channel.tx 

執行成功后,當前目錄生成了一個mychannel.block文件

執行成功
執行成功

6.6加入通道

在上一小節創建通道使用到終端執行如下命令

peer channel join -b $CHANNEL_NAME.block
啟動Peer節點的終端打印日志: 其實就是在通道部署上一個終端上面

借用的圖
[輸出日志]: https://img-blog.csdn.net/20171204234402557?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9uZ2FuYm95/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
借用的圖我這里不知命令是個啥
 

 

從日志中可以看到,節點加入通道后會創建一個通道對應的賬本並在通道上部署系統鏈碼。

㈦部署及調用官方鏈碼示例

$GOPATH/src/github.com/hyperledger/fabric/examples/chaincode目錄下有官方提供的各種語言的鏈碼示例,本節將演示如何部署及調用一個簡單的go語言示例—abric/examples/chaincode/go/chaincode_example02

鏈碼部署及調用過程如下: 
1. 啟動鏈碼對應的程序; 
2. 部署鏈碼,分install和instantiate兩個階段。其中,
install將鏈碼源碼打包成鏈碼部署文件(CDS)並上傳到Peer節點,
instantiate將根據CDS生成鏈碼對應的Docker容器,啟動容器並執行鏈碼的實例化操作,一般是調用鏈碼的init方法。
這里描述的instantiate是使用“network”模式運行鏈碼,
而我們此次測試使用的是“dev”模式,由啟動Peer節點時設置的CORE_CHAINCODE_MODE環境變量的值決定的。 
3. 調用鏈碼,分invoke和query兩種操作。
invoke是寫操作,可修改賬本,能產生塊,而query是讀操作,不寫賬本,也不生成塊。

7.1 啟動鏈碼

打開一個終端,執行如下命令

export CORE_CHAINCODE_ID_NAME=mycc:1.0 export CORE_PEER_ADDRESS=peer.example.com:7052 go run $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02.go
啟動鏈碼
啟動鏈碼
這里使用 go run命令直接運行的,當然,也可以先使用
go build -gcflags "-N -l" github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 

將鏈碼編譯成可執行程序再運行。

7.2部署鏈碼

新打開一個終端,切換到~/fabric-1.1.0-preview-demo目錄,首先參照“創建通道”一節設置環境變量

新打開一個終端,切換到cd ~/fabric-1.1.0-preview-demo目錄並設環境變量

export rootDir=$(pwd) export PATH=$rootDir/bin:$PATH export CHANNEL_NAME=mychannel export CORE_CHAINCODE_MODE=dev export CORE_PEER_ID=peer-cli export CORE_PEER_ADDRESS=peer.example.com:7051 export CORE_PEER_LOCALMSPID=OrgMSP export CORE_PEER_MSPCONFIGPATH=$rootDir/networks/single-dev-env/config/crypto-config/peerOrganizations/example.com/users/Admin@example.com/msp

第1步:install鏈碼

peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
選項說明:
-n:指定鏈碼名稱
-v:鏈碼版本
-p:鏈碼源碼所在目錄

peer節點賬本目錄的chaincodes目錄下生成了一個文件,其名稱是由鏈碼名稱和版本號組成的。

[root@localhost fabric-1.1.0-preview-demo]# ls /root/fabric-1.1.0-preview-demo/networks/single-dev-env/data/peer/chaincodes
mycc.1.0
[root@localhost fabric-1.1.0-preview-demo]# 

到這里可以查看

[root@localhost fabric-1.1.0-preview-demo]# tree -C /root/fabric-1.1.0-preview-demo/networks/single-dev-env/config/crypto-config
/root/fabric-1.1.0-preview-demo/networks/single-dev-env/config/crypto-config
├── ordererOrganizations
│   └── example.com
│   ├── ca
│   │   ├── 0cf2743f2725b5967530e0ea4d403afc3af2cf85388205cad4246a792da2072e_sk
│   │   └── ca.example.com-cert.pem
│   ├── msp
│   │   ├── admincerts
│   │   │   └── Admin@example.com-cert.pem
│   │   ├── cacerts
│   │   │   └── ca.example.com-cert.pem
│   │   └── tlscacerts
│   │   └── tlsca.example.com-cert.pem
│   ├── orderers
│   │   └── orderer.example.com
│   │   ├── msp
│   │   │   ├── admincerts
│   │   │   │   └── Admin@example.com-cert.pem
│   │   │   ├── cacerts
│   │   │   │   └── ca.example.com-cert.pem
│   │   │   ├── keystore
│   │   │   │   └── 4f6489f73e8453adc129e870b801c9d75473747bba277c6e98e1c4c3df6c6b31_sk
│   │   │   ├── signcerts
│   │   │   │   └── orderer.example.com-cert.pem
│   │   │   └── tlscacerts
│   │   │   └── tlsca.example.com-cert.pem
│   │   └── tls
│   │   ├── ca.crt
│   │   ├── server.crt
│   │   └── server.key
│   ├── tlsca
│   │   ├── 2225a2651d29122f791f93c6804c59ba453864891eff4a87a5b1f8257c58d6fc_sk
│   │   └── tlsca.example.com-cert.pem
│   └── users
│   └── Admin@example.com
│   ├── msp
│   │   ├── admincerts
│   │   │   └── Admin@example.com-cert.pem
│   │   ├── cacerts
│   │   │   └── ca.example.com-cert.pem
│   │   ├── keystore
│   │   │   └── 7f7a218c0d5f2eeb61c7fbb2d49fb006ab63f852fc55654c1b5457882bf506a6_sk
│   │   ├── signcerts
│   │   │   └── Admin@example.com-cert.pem
│   │   └── tlscacerts
│   │   └── tlsca.example.com-cert.pem
│   └── tls
│   ├── ca.crt
│   ├── server.crt
│   └── server.key
└── peerOrganizations
└── example.com
├── ca
│   ├── ca.example.com-cert.pem
│   └── f91432016431a48f3639aef4da98783415788c90403e7299990168b9f62b0f77_sk
├── msp
│   ├── admincerts
│   │   └── Admin@example.com-cert.pem
│   ├── cacerts
│   │   └── ca.example.com-cert.pem
│   └── tlscacerts
│   └── tlsca.example.com-cert.pem
├── peers
│   └── peer.example.com
│   ├── msp
│   │   ├── admincerts
│   │   │   └── Admin@example.com-cert.pem
│   │   ├── cacerts
│   │   │   └── ca.example.com-cert.pem
│   │   ├── keystore
│   │   │   └── 291610dd2e6ed0b804e5304a7fadb73f70b8c56975d6b8bd41d2ab3696012f2c_sk
│   │   ├── signcerts
│   │   │   └── peer.example.com-cert.pem
│   │   └── tlscacerts
│   │   └── tlsca.example.com-cert.pem
│   └── tls
│   ├── ca.crt
│   ├── server.crt
│   └── server.key
├── tlsca
│   ├── 4c426e6ba6c5b8cdfec51e5d568ff1b7f8a203c6b0c23bd662125fa43c0d4d7d_sk
│   └── tlsca.example.com-cert.pem
└── users
├── Admin@example.com
│   ├── msp
│   │   ├── admincerts
│   │   │   └── Admin@example.com-cert.pem
│   │   ├── cacerts
│   │   │   └── ca.example.com-cert.pem
│   │   ├── keystore
│   │   │   └── 706bf29d3724873604fd900131ab183048f216422b4484188d85b801731e9b14_sk
│   │   ├── signcerts
│   │   │   └── Admin@example.com-cert.pem
│   │   └── tlscacerts
│   │   └── tlsca.example.com-cert.pem
│   └── tls
│   ├── ca.crt
│   ├── server.crt
│   └── server.key
└── User1@example.com
├── msp
│   ├── admincerts
│   │   └── User1@example.com-cert.pem
│   ├── cacerts
│   │   └── ca.example.com-cert.pem
│   ├── keystore
│   │   └── 76ebfaec39a144935a0fcd4c1f3235bbc830bd489fcd973b894bc2265c31a699_sk
│   ├── signcerts
│   │   └── User1@example.com-cert.pem
│   └── tlscacerts
│   └── tlsca.example.com-cert.pem
└── tls
├── ca.crt
├── server.crt
└── server.key

60 directories, 54 files
[root@localhost fabric-1.1.0-preview-demo]#

第2步:instantiate鏈碼

peer chaincode instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -v 1.0 -c "{\"Args\":[\"init\",\"a\", \"100\", \"b\",\"200\"]}" -P "OR('OrgMSP.member')" 選項說明: -o:orderer節點的地址 -C(大寫):通道名稱 -n:鏈碼名稱 -v:鏈碼版本 -c(小寫):鏈碼實例化時調用的方法及參數,JSON字符串,Args數組的第0個元素是調用的方法,實例化時一般都是init方法,其他元素是方法的參數。 -P(大寫):背書策略,即交易由哪些Peer節點簽名后才是合法的。以后再詳細說明。
當前部署鏈碼終端輸出為:
instantiate
  • 初始化了兩個狀態A和B,其初始值分別為100和200(啟動鏈碼的終端輸出的內容):
  • 此外,peer和orderer的終端也有相應的日志輸出

7.2調用鏈碼

本節的操作都是使用上一小節部署鏈碼用的終端
首先,使用invoke操作把A的余額轉10到B

peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -c "{\"Args\":[\"invoke\",\"a\",\"b\",\"10\"]}" 

當前終端(部署鏈碼終端)輸出內容如下

查看鏈碼的終端(啟動鏈碼的終端)輸出:
  • 接下來,再使用query操作查詢A的余額,發現確實少了10
peer chaincode query -C $CHANNEL_NAME -n mycc -c "{\"Args\":[\"query\",\"a\"]}"

當前部署鏈碼終端輸出為:
啟動鏈碼終端輸出為:

 peer chaincode package \ -n test_cc -p github.com/hyperledger/fabric

 打包鏈碼

# 打包鏈碼
peer chaincode package -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -v 0 -s -S -i "AND('OrgA.admin')" ccpack.out

# 對打包文件進行簽名
peer chaincode signpackage ccpack.out signedccpack.out

  結果如下:

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM