将智能合约部署到通道
启动测试网络
1 | cd fabric-samples/test-network |
1 | ./network.sh down |
1 | 创建一个默认通道mychannel、两个通道成员Org1 和 Org2,将属于每个组织的peer加入通道 |
第一步:打包链码(以go语言编写的智能合约为例)
1 | cd fabric-samples/asset-transfer-basic/chaincode-java-user |
打包java链码-安装依赖
1 |
安装链码包
链代码需要安装在每个将认可交易的节点上,因为我们要将背书策略设置为需要来自 Org1 和 Org2 的背书,所以我们需要在两个组织运营的对等节点上安装链代码:
先在 Org1 节点上安装链码
设置org1环境变量
以
peer
作为 Org1 管理员用户操作 CLI。将CORE_PEER_ADDRESS
被设置为指向 Org1 对等体,peer0.org1.example.com
1
2
3
4
5export 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在org1对等节点上安装链代码
1
2
3
4
5peer 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设置org2环境变量
设置以下环境变量以作为 Org2 管理员运行并以 Org2 对等体为目标,
peer0.org2.example.com
.1
2
3
4export 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在org2对等节点上安装链代码
1
peer lifecycle chaincode install user.tar.gz
批准链码定义
安装链代码包后,需要为您的组织批准链代码定义,该定义包括链代码治理的重要参数,例如名称、版本和链代码背书策略。部署之前需要批准链代码的一组通道成员由该/Channel/Application/LifecycleEndorsement
策略管理,默认情况下,此策略要求大多数通道成员需要批准链代码才能在通道上使用它,
因为我们在通道上只有两个组织,并且 2 的多数是 2,所以我们需要 Org1 和 Org2,批准资产转移(基本)的链代码定义
如果一个组织已经在他们的peer上安装了链代码,需要在他们的组织批准的链代码定义中包含 packageID
查询链代码id
1
2
3
4peer lifecycle chaincode queryinstalled
包 ID 是链代码标签和链代码二进制文件的哈希值的组合。每个对等点都将生成相同的包 ID。您应该看到类似于以下内容的输出:
Installed chaincodes on peer:
Package ID: basic_1.0:69de748301770f6ef64b42aa6bb6cb291df20aa39542c3ef94008615704007f3, Label: basic_1.0将包id保存为环境变量
1
export CC_PACKAGE_ID= user_1.0:4a68ea4328545789c8da1c16ddda59f8485057609de457526dff74e4199faa3c
org2批准链代码
由于环境变量已设置为
peer
以 Org2 管理员身份运行 CLI1
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
标志,然后您才能使用链码中的其他函数与账本进行交互。org1批准链代码
设置环境变量作为org1运行
1
2
3
4export 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:70511
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
2
3
4
5
6
7
8
9peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name user --version 1.0 --sequence 1 --tls --cafile
{
"approvals": {
"Org1MSP": true,
"Org2MSP": true
}
}组织管理员提交链码
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"
使用对等生命周期 chaincode querycomfilled命令来确认链码定义已提交到通道
1
2peer 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"]}' |