启动测试网络

1
cd fabric-samples/test-network
1
./network.sh down
1
2
3
4
创建一个默认通道mychannel、两个通道成员Org1 和 Org2,将属于每个组织的peer加入通道
./network.sh up createChannel
如果网络和通道创建成功,您可以在日志中看到以下消息
========= Channel successfully joined ===========

第一步:打包链码(以go语言编写的智能合约为例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cd fabric-samples/asset-transfer-basic/chaincode-java-user

java-安装依赖
bash gradlew installDist

使用peerCLI 构建链代码包,以下命令将这些二进制文件添加到您的 CLI 路径
export PATH=${PWD}/../bin:$PATH
设置FABRIC_CFG_PATH指向存储库中的core.yaml文件fabric-samples
export FABRIC_CFG_PATH=$PWD/../config/
检查是否能够使用peer cli
peer version
打包
peer lifecycle chaincode package user.tar.gz --path ../asset-transfer-basic/chaincode-java-user/ --lang java --label user_1.0
# basic.tar.gz :包名称
# --lang : 指定链代码语言;--path : 智能合约代码的位置;
# --label :该标签将在安装后识别您的链代码。建议您的标签包含链码名称和版本。


打包java链码-安装依赖

1

安装链码包

链代码需要安装在每个将认可交易的节点上,因为我们要将背书策略设置为需要来自 Org1 和 Org2 的背书,所以我们需要在两个组织运营的对等节点上安装链代码:

先在 Org1 节点上安装链码
  1. 设置org1环境变量

    peer作为 Org1 管理员用户操作 CLI。将CORE_PEER_ADDRESS被设置为指向 Org1 对等体,peer0.org1.example.com

    1
    2
    3
    4
    5
    export CORE_PEER_TLS_ENABLED=true
    export CORE_PEER_LOCALMSPID="Org1MSP"
    export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
    export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
    export CORE_PEER_ADDRESS=localhost:7051
  2. 在org1对等节点上安装链代码

    1
    2
    3
    4
    5
    peer lifecycle chaincode install user.tar.gz
    如果命令成功,对等方将生成并返回包标识符。此包 ID 将用于在下一步中批准链代码。您应该看到类似于以下内容的输出:

    2020-07-16 10:09:57.534 CDT [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nJbasic_1.0:e2db7f693d4aa6156e652741d5606e9c5f0de9ebb88c5721cb8248c3aead8123\022\tbasic_1.0" >
    2020-07-16 10:09:57.534 CDT [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code pack
  3. 设置org2环境变量

    设置以下环境变量以作为 Org2 管理员运行并以 Org2 对等体为目标,peer0.org2.example.com.

    1
    2
    3
    4
    export CORE_PEER_LOCALMSPID="Org2MSP"
    export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
    export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
    export CORE_PEER_ADDRESS=localhost:9051
  4. 在org2对等节点上安装链代码

    1
    peer lifecycle chaincode install user.tar.gz

批准链码定义

安装链代码包后,需要为您的组织批准链代码定义,该定义包括链代码治理的重要参数,例如名称、版本和链代码背书策略。部署之前需要批准链代码的一组通道成员由该/Channel/Application/LifecycleEndorsement策略管理,默认情况下,此策略要求大多数通道成员需要批准链代码才能在通道上使用它,

因为我们在通道上只有两个组织,并且 2 的多数是 2,所以我们需要 Org1 和 Org2,批准资产转移(基本)的链代码定义

如果一个组织已经在他们的peer上安装了链代码,需要在他们的组织批准的链代码定义中包含 packageID

  1. 查询链代码id

    1
    2
    3
    4
    peer lifecycle chaincode queryinstalled
    包 ID 是链代码标签和链代码二进制文件的哈希值的组合。每个对等点都将生成相同的包 ID。您应该看到类似于以下内容的输出:
    Installed chaincodes on peer:
    Package ID: basic_1.0:69de748301770f6ef64b42aa6bb6cb291df20aa39542c3ef94008615704007f3, Label: basic_1.0
  2. 将包id保存为环境变量

    1
    export CC_PACKAGE_ID= user_1.0:4a68ea4328545789c8da1c16ddda59f8485057609de457526dff74e4199faa3c
  3. org2批准链代码

    由于环境变量已设置为peer以 Org2 管理员身份运行 CLI

    1
    peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name user --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"

    上面的命令使用--package-id标志将包标识符包含在链码定义中。该--sequence参数是一个整数,用于跟踪定义或更新链代码的次数。因为链码是第一次部署到通道,所以序列号是 1。当升级资产转移(基本)链码时,序列号将增加到 2。如果您使用提供的低级 API通过 Fabric Chaincode Shim API,您可以将--init-required标志传递给上面的命令以请求执行 Init 函数来初始化链码。链码的第一次调用需要以 Init 函数为目标并包含--isInit标志,然后您才能使用链码中的其他函数与账本进行交互。

  4. org1批准链代码

    设置环境变量作为org1运行

    1
    2
    3
    4
    export CORE_PEER_LOCALMSPID="Org1MSP"
    export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
    export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
    export CORE_PEER_ADDRESS=localhost:7051
    1
    peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name user --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"

链代码定义提交到通道

足够数量的组织批准链代码定义后,一个组织可以将链代码定义提交到通道。如果大多数通道成员批准了定义,则提交交易将成功,并且链代码定义中约定的参数将在通道上实现

  1. 检查通道组织是否批准链代码定义

    1
    2
    3
    4
    5
    6
    7
    8
    9
     peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name user --version 1.0 --sequence 1 --tls --cafile 


    {
    "approvals": {
    "Org1MSP": true,
    "Org2MSP": true
    }
    }
  2. 组织管理员提交链码

    1
    peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name user --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt"
  3. 使用对等生命周期 chaincode querycomfilled命令来确认链码定义已提交到通道

    1
    2
    peer lifecycle chaincode querycommitted --channelID mychannel --name user --cafile "${PWD}/organizations/order
    erOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"

调用链码

在分类账上创建一组初始资产

1
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'

使用查询函数来读取由链代码创建的汽车集合:

1
peer chaincode query -C mychannel -n user -c '{"Args":["GetAllAssets"]}'