热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【区块链】fabric编译安装1.0.0(工具)

https:www.cnblogs.comycx95p9177209.html㈡安装其他必须的组件centos下需要安装yuminstall-ygcclibtoollibltdl-

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

【区块链】fabric编译安装1.0.0(工具)
Libtool

如果少安装 libtool-ltdl-devel这个依赖包会获取代码以及编译的时候会报以下错误
【区块链】fabric编译安装1.0.0(工具)
错误1 原因是未安装libtool-ltdl-devel

 

㈢查看go env

这里的需要注意:出现的GOPATH路径是什么
我操作时候发现似乎root下面查看该命令和普通用户不一样,因此要特别注意一下。

以下都是我基于root账户操作的。


【区块链】fabric编译安装1.0.0(工具)
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
【区块链】fabric编译安装1.0.0(工具)
下载完成拷贝

解压文件tar -zxvf并将解压后得到的目录重命名为fabric


【区块链】fabric编译安装1.0.0(工具)
解压后

【区块链】fabric编译安装1.0.0(工具)
mv重命名

2、开始编译之前,到fabric源码目录下执行make test-cmd命令获取-ldflags选项的取值

cd $GOPATH/src/github.com/hyperledger/fabric
make test-cmd
【区块链】fabric编译安装1.0.0(工具)
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

 

【区块链】fabric编译安装1.0.0(工具)
创建好相应的文件

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


    【区块链】fabric编译安装1.0.0(工具)
    错误1:缺少Libtool

    【区块链】fabric编译安装1.0.0(工具)
    正确显示

⑵编译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目录下就有了四个可执行程序

【区块链】fabric编译安装1.0.0(工具)
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
【区块链】fabric编译安装1.0.0(工具)
命令执行成功后,cd networks/single-dev-env/config/crypto-config目录下生成了如下结构的证书目录(工具是winscp)
【区块链】fabric编译安装1.0.0(工具)
命令执行成功概览
tree -L 4 crypto-config

若提示找不到:tree命令
解决tree命令找不到问题

【区块链】fabric编译安装1.0.0(工具)
安装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个)

【区块链】fabric编译安装1.0.0(工具)
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]# 
【区块链】fabric编译安装1.0.0(工具)

 

命令执行成功后,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

【区块链】fabric编译安装1.0.0(工具)
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
【区块链】fabric编译安装1.0.0(工具)
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
【区块链】fabric编译安装1.0.0(工具)

执行成功后,当前目录生成了一个mychannel.block文件

【区块链】fabric编译安装1.0.0(工具)
执行成功

6.6加入通道

在上一小节创建通道使用到终端执行如下命令

peer channel join -b $CHANNEL_NAME.block
【区块链】fabric编译安装1.0.0(工具)
启动Peer节点的终端打印日志: 其实就是在通道部署上一个终端上面
【区块链】fabric编译安装1.0.0(工具)
!借用的图
[输出日志]:https://img-blog.csdn.net/20171204234402557?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9uZ2FuYm95/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
【区块链】fabric编译安装1.0.0(工具)
 

 

从日志中可以看到,节点加入通道后会创建一个通道对应的账本并在通道上部署系统链码。

㈦部署及调用官方链码示例

$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
【区块链】fabric编译安装1.0.0(工具)
启动链码
这里使用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:链码源码所在目录
【区块链】fabric编译安装1.0.0(工具)

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节点签名后才是合法的。以后再详细说明。
当前部署链码终端输出为:
【区块链】fabric编译安装1.0.0(工具)
instantiate
  • 初始化了两个状态A和B,其初始值分别为100和200(启动链码的终端输出的内容):
  • 【区块链】fabric编译安装1.0.0(工具)
  • 此外,peer和orderer的终端也有相应的日志输出

【区块链】fabric编译安装1.0.0(工具)

【区块链】fabric编译安装1.0.0(工具)

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\"]}"

当前终端(部署链码终端)输出内容如下

【区块链】fabric编译安装1.0.0(工具)

查看链码的终端(启动链码的终端)输出:
【区块链】fabric编译安装1.0.0(工具)
  • 接下来,再使用query操作查询A的余额,发现确实少了10
peer chaincode query -C $CHANNEL_NAME -n mycc -c "{\"Args\":[\"query\",\"a\"]}"

当前部署链码终端输出为:
【区块链】fabric编译安装1.0.0(工具)
启动链码终端输出为:
【区块链】fabric编译安装1.0.0(工具)

 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

  结果如下:

【区块链】fabric编译安装1.0.0(工具)

 
 
 
 
 

推荐阅读
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文详细介绍了如何创建和使用VUE uni-app开发环境,包括通过HBuilderX可视化界面和通过vue-cli命令执行的方法。文章内容简单清晰,易于学习与理解。通过学习本文,读者可以深入了解VUE uni-app开发环境,并通过实践验证掌握具体的使用情况。编程笔记将为读者推送更多相关知识点的文章,欢迎关注! ... [详细]
  • VSCode快速查看函数定义和代码追踪方法详解
    本文详细介绍了在VSCode中快速查看函数定义和代码追踪的方法,包括跳转到定义位置的三种方式和返回跳转前的位置的快捷键。同时,还介绍了代码追踪插件的使用以及对符号跳转的不足之处。文章指出,直接跳转到定义和实现的位置对于程序员来说非常重要,但需要语言本身的支持。以TypeScript为例,按下F12即可跳转到函数的定义处。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • 1.直接在cmd窗口运行pipinstalljieba2.使用conda自带的安装工具condainstalljieba3.有一些模块是无法使用以上两种方式安装上ÿ ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 本文介绍了在Windows系统下安装Python、setuptools、pip和virtualenv的步骤,以及安装过程中需要注意的事项。详细介绍了Python2.7.4和Python3.3.2的安装路径,以及如何使用easy_install安装setuptools。同时提醒用户在安装完setuptools后,需要继续安装pip,并注意不要将Python的目录添加到系统的环境变量中。最后,还介绍了通过下载ez_setup.py来安装setuptools的方法。 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
author-avatar
手机用户随便转转
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有