美文网首页
fabric_v2.2.0 向通道中部署CC

fabric_v2.2.0 向通道中部署CC

作者: ag4kd | 来源:发表于2021-11-03 15:33 被阅读0次

    打包智能合同

    我们需要打包链码,然后才能安装到我们的同行上。如果您想安装用GoJavaJavaScript编写的智能合同,步骤会有所不同。

    去在我们打包链码之前,我们需要安装链码依赖项。导航到包含Fabcar链码Go版本的文件夹。cd fabric-samples/chaincode/fabcar/go示例使用Go模块安装链码依赖项。依赖项列在fabcar/go目录的go.mod文件中。你应该花点时间检查一下这个文件。

    $ cat go.mod 
    module github.com/hyperledger/fabric-samples/chaincode/fabcar/go 
    go 1.13 
    require github.com/hyperledger/fabric-contract-api-go v1.1.0
    

    要安装智能合同依赖项,请从fabcar/go目录运行以下命令。

    GO111MODULE=on 
    go mod vendor
    

    如果命令成功,go软件包将安装在vendor文件夹中。

    还需要将FABRIC_CFG_PATH设置为指向fabric-samples存储库中的core.yaml文件:

    export FABRIC_CFG_PATH=$PWD/../config/
    

    要确认您能够使用对等CLI,请检查二进制文件的版本。二进制文件需要2.0.0或更高版本才能运行本教程。

    peer version
    

    您现在可以使用对等生命周期链码命令创建链码包

    peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go/ --lang golang --label fabcar_1
    

    此命令将在当前目录中创建一个名为fabcar.tar.gz的软件包。

    • --lang标志用于指定链码语言
    • --path标志提供智能合同代码的位置。路径必须是完全限定的路径或相对于您当前工作目录的路径。
    • --label标志用于指定一个链码标签,该标签将在安装后标识您的链码。建议您的标签包含链码名称版本

    安装链码包

    在我们打包Fabcar智能合同后,我们可以在同行上安装链码。链码需要安装在每个将认可事务的对等机上。由于我们将设置背书政策,要求Org1和Org2背书,因此我们需要在两个组织运营的对等机上安装链码:

    • peer0.org1.example.com
    • peer0.org2.example.com

    让我们先在Org1对等机上安装链码。设置以下环境变量,作为Org1管理员用户操作对peerCLI。CORE_PEER_ADDRESS将设置为指向Org1对等机peer0.org1.example.com

    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
    

    发布对等生命周期链码安装命令,以便在对等机上安装链码:

    peer lifecycle chaincode install fabcar.tar.gz
    

    如果命令成功,对等方将生成并返回软件包标识符。此软件包ID将用于在下一步批准链码。您应该会看到类似于以下内容的输出:

    2020-02-12 11:40:02.923 EST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nIfabcar_1:69de748301770f6ef64b42aa6bb6cb291df20aa39542c3ef94008615704007f3\022\010fabcar_1" >
    2020-02-12 11:40:02.925 EST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: fabcar_1:69de748301770f6ef64b42aa6bb6cb291df20aa39542c3ef94008615704007f3
    

    我们现在可以在Org2对等机上安装链码。设置以下环境变量作为Org2管理员操作,并瞄准Org2对等机peer0.org2.example.com

    export CORE_PEER_TLS_ENABLED=true
    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
    

    发出以下命令来安装链码:

    peer lifecycle chaincode install fabcar.tar.gz
    

    链码由对等方在安装链码时构建。如果智能合同代码有问题,安装命令将返回链码中的任何构建错误。

    批准链码定义

    安装链码包后,您需要批准组织的链码定义。该定义包括链码治理的重要参数,如名称、版本和链码背书策略。

    在部署链码之前需要批准链码的通道成员集受Application/Channel/lifeycleEndorsement策略的约束。默认情况下,此策略要求大多数通道成员需要批准链码才能在通道上使用。由于我们在频道上只有两个组织,而2个组织中的大多数是2个,我们需要批准Fabcar的链码定义为Org1和Org2。

    如果一个组织在其对等机上安装了链码,他们需要将软件包ID包含在组织批准的链码定义中。软件包ID用于将安装在对等机上的链码与批准的链码定义相关联,并允许组织使用链码来背书交易。您可以使用对等生命周期链码查询安装命令查询对等方,以找到链码包ID。

    $ peer lifecycle chaincode queryinstalled
    

    软件包ID是链码标签和链码二进制文件散列的组合。每个对等方将生成相同的软件包ID。您应该会看到类似于以下内容的输出:

    $ peer lifecycle chaincode queryinstalled
    Installed chaincodes on peer:
    Package ID: fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506, Label: fabcar_1
    

    We are going to use the package ID when we approve the chaincode, so let’s go ahead and save it as an environment variable. Paste the package ID returned by peer lifecycle chaincode queryinstalled into the command below. Note: The package ID will not be the same for all users, so you need to complete this step using the package ID returned from your command window in the previous step.

    export CC_PACKAGE_ID=fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506
    

    由于环境变量已设置为将对等CLI作为Org2管理员操作,我们可以批准Fabcar的链码定义为Org2。Chaincode在组织级别获得批准,因此命令只需要针对一个对等方。批准使用流言蜚语分发给组织内的其他同行。使用对等生命周期链批准formyorg命令批准链码定义:

    peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --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。当Fabcar链码升级时,序列号将增加到2。如果您使用的是Fabric Chaincode Shim API提供的低级API,您可以将--init-required标志传递给上述命令,以请求执行Init函数来初始化chaincode。链码的第一次调用需要针对Init函数并包含--isInit标志,然后才能使用链码中的其他函数与分类账交互。

    我们本可以向theapproveformyorg命令提供--signature-policy--channel-config-policy参数,以指定链码背书策略。背书策略指定了属于不同通道成员的对等方需要有多少对等机才能根据给定的链码验证事务。由于我们没有设置策略,Fabcar的定义将使用默认背书策略,该政策要求交易在提交交易时得到在场的大多数渠道成员的认可。这意味着,如果从渠道中添加或删除新组织,背书政策会自动更新,以要求或多或少地背书。在本教程中,默认策略将要求2/2中的大多数,事务需要由Org1和Org2的同行认可。如果您想指定自定义背书策略,可以使用背书策略操作指南来了解策略语法。

    您需要批准具有管理员角色的身份的链码定义。因此,CORE_PEER_MSPCONFIGPATH变量需要指向包含管理员身份的MSP文件夹。您无法与客户端用户批准链码定义。批准需要提交给订购服务,订购服务将验证管理员签名,然后将批准分发给您的同行。

    我们仍然需要批准链码定义为Org1。设置以下环境变量作为Org1管理员运行:

    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
    

    您现在可以批准链码定义为Org1。

    peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --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
    

    我们现在拥有将链码Fabcar部署到通道所需的大多数。虽然只有大多数组织需要批准链码定义(带有默认策略),但所有组织都需要批准链码定义才能在其同行上启动链码。如果您在渠道成员批准链码之前提交定义,组织将无法认可交易。因此,建议所有通道成员在提交链码定义之前批准链码。

    将链码定义提交到通道

    在足够数量的组织批准链码定义后,一个组织可以将链码定义提交到通道。如果大多数通道成员批准了该定义,提交事务将成功,链码定义中商定的参数将在通道上实现。您可以使用对等生命周期链码checkcommitreadiness命令来检查通道成员是否批准了相同的链码定义。用于checkcommitreadiness命令的标志与用于批准组织链码的标志相同。但是,您不需要包含--package-id标志。

    peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
    

    该命令将生成一个JSON映射,该映射显示通道成员是否已批准checkcommitreadiness命令中指定的参数:

    {
        "approvals": {
            "Org1MSP": true,
            "Org2MSP": true
        }
    }
    

    由于作为通道成员的两个组织都批准了相同的参数,链码定义已准备好提交到通道中。您可以使用对等生命周期链码提交命令将链码定义提交到通道。提交命令也需要由组织管理员提交。

    peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --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
    

    上述交易使用--peerAddresses标志从Org1瞄准peer0.org1.example.com,从Org2瞄准peer0.org2.example.comcommit事务提交给加入通道的对等机,以查询操作对等机的组织批准的链码定义。该命令需要针对来自足够数量组织的对等机,以满足部署链码的策略。由于批准在每个组织内分发,您可以针对属于频道成员的任何对等方。

    通道成员的链码定义背书提交给要添加到块并分发到通道的订购服务。然后,通道上的对等方验证是否有足够的组织批准了链码定义。对等lifecyclechaincodecommit命令将等待对等方的验证,然后再返回响应。

    2021-11-03 14:37:34.459 CST [chaincodeCmd] ClientWait -> INFO 001 txid [6cb15386ca95b0a4b5f8b4506bfbcb43b114c82e5bc358be0e5870df767b056c] committed with status (VALID) at localhost:9051
    2021-11-03 14:37:34.494 CST [chaincodeCmd] ClientWait -> INFO 002 txid [6cb15386ca95b0a4b5f8b4506bfbcb43b114c82e5bc358be0e5870df767b056c] committed with status (VALID) at localhost:7051
    

    您可以使用对等生命周期链码查询提交命令来确认链码定义已提交到通道。

    peer lifecycle chaincode querycommitted --channelID mychannel --name fabcar --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem 
    

    如果链码成功提交到通道,querycommitted命令将返回链码定义的顺序和版本:

    Committed chaincode definition for chaincode 'fabcar' on channel 'mychannel':
    Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]
    

    调用链码

    将链码定义提交到通道后,链码将从加入安装链码的通道的对等机开始。Fabcar链码现在可以被客户端应用程序调用了。使用以下命令在分类账上创建初始一组汽车。请注意,调用命令需要针对足够数量的对等机,以满足链码背书策略。

    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 fabcar \
    --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":[]}' 
    

    如果命令成功,您应该能够做出类似于以下内容的响应:

    2021-11-03 14:41:58.575 CST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200
    

    我们可以使用查询功能读取链码创建的一组汽车:

    peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
    

    对查询的回答应该是以下汽车列表:

    [{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}}, {"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}}, {"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}}, {"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}}, {"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}}, {"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}}, {"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}}, {"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}}, {"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}}, {"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]
    

    升级智能合同

    您可以使用相同的结构链码生命周期流程来升级已经部署到通道的链码。

    通道成员可以通过安装新的链码包来升级链码,然后使用新包ID新的链码版本序列号递增来批准链码定义。在将链码定义提交到通道后,可以使用新的链码。此过程允许通道成员在链码升级时进行协调,并确保有足够的通道成员在将新链码部署到通道之前准备好使用它。

    渠道成员还可以使用升级过程更改链码背书策略。

    通过使用新的背书策略批准链码定义并将链码定义提交到通道,通道成员可以在不安装新链码包的情况下更改管理链码的背书策略。

    为了提供一个升级我们刚刚部署的Fabcar链码的场景,让我们假设Org1和Org2希望安装用另一种语言编写的链码版本。他们将使用Fabric链码生命周期来更新链码版本,并确保两个组织在新链码在通道上激活之前都安装了它。

    我们将假设Org1和Org2最初安装了Fabcar链码的GO版本,但使用用JavaScript编写的链码会更自在。

    第一步是打包Fabcar链码的JavaScript版本。如果您在完成教程时使用JavaScript指令打包链码,您可以按照打包用GoJava编写的链码的步骤安装新的链码二进制文件。

    test-network目录发出以下命令来安装链码依赖项。

    cd ../chaincode/fabcar/javascript 
    npm install 
    cd ../../../test-network 
    

    然后,您可以发出以下命令,从test-network目录打包JavaScript链码。如果您关闭终端,我们将设置再次使用对等CLI所需的环境变量。

    export PATH=${PWD}/../bin:$PATH 
    export FABRIC_CFG_PATH=$PWD/../config/ 
    export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp 
    peer lifecycle chaincode package fabcar_2.tar.gz --path ../chaincode/fabcar/javascript/ --lang node --label fabcar_2 
    

    运行以下命令,将对等CLI作为Org1管理员操作:

    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 
    

    我们现在可以使用以下命令在Org1对等机上安装新的链码包。

    $ peer lifecycle chaincode install fabcar_2.tar.gz
    

    新的链码软件包将创建一个新的软件包ID。我们可以通过查询同行来找到新的软件包ID。

    $ peer lifecycle chaincode queryinstalled 
    

    queryinstalled命令将返回已安装在对等机上的链码列表。

    Installed chaincodes on peer:
    Package ID: fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506, Label: fabcar_1
    Package ID: fabcar_2:7ae23286f357ae7bad076547a8170af1a21e2bd1a766fcc747fe95b19eaf6d0f, Label: fabcar_2
    

    您可以使用软件包标签查找新链码的软件包ID,并将其保存为新环境变量。

    export NEW_CC_PACKAGE_ID=fabcar_2:7ae23286f357ae7bad076547a8170af1a21e2bd1a766fcc747fe95b19eaf6d0f
    

    Org1现在可以批准新的链码定义:

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

    新的链码定义使用JavaScript链码包的包ID并更新链码版本。由于结构链码生命周期使用序列参数来跟踪链码升级,Org1还需要将序列号从1增加到2。您可以使用对等生命周期链码查询提交命令来查找上次提交到通道的链码序列。

    我们现在需要安装链码包,并批准链码定义为Org2,才能升级链码。运行以下命令作为Org2管理员操作对peerCLI:

    export CORE_PEER_TLS_ENABLED=true
    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
    

    我们现在可以使用以下命令在Org2对等机上安装新的链码包。

    peer lifecycle chaincode install fabcar_2.tar.gz
    

    您现在可以批准Org2的新链码定义。

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

    使用对等生命周期链码 checkcommitreadiness命令检查序列2的链码定义是否准备提交到通道:

    peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 2.0 --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json 
    

    如果命令返回以下JSON,则可以升级链码:

    {
        "approvals": {
            "Org1MSP": true,
            "Org2MSP": true
        }
    }
    

    提交新的链码定义后,链码将在通道上升级。

    在此之前,之前的链码将继续在两个组织的同行上运行。

    Org2可以使用以下命令升级链码:

    peer lifecycle chaincode commit \
    -o localhost:7050 \
    --ordererTLSHostnameOverride orderer.example.com \
    --channelID mychannel \
    --name fabcar \
    --version 2.0 \
    --sequence 2 \
    --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 
    
    2021-11-03 15:26:45.687 CST [chaincodeCmd] ClientWait -> INFO 001 txid [6f7ebdfeeadc9e650692cbc8032444c30179d96af556dc847d13709578663a06] committed with status (VALID) at localhost:9051
    2021-11-03 15:26:45.687 CST [chaincodeCmd] ClientWait -> INFO 002 txid [6f7ebdfeeadc9e650692cbc8032444c30179d96af556dc847d13709578663a06] committed with status (VALID) at localhost:7051
    

    成功的提交事务将立即启动新的链码。如果链码定义更改了背书政策,新政策将生效。

    You can use the docker ps command to verify that the new chaincode has started on your peers:

    $docker ps 
    CONTAINER ID   IMAGE                                                                                                                                                                   COMMAND                  CREATED             STATUS             PORTS                              NAMES
    a475f1cc6e39   dev-peer0.org2.example.com-fabcar_2-7ae23286f357ae7bad076547a8170af1a21e2bd1a766fcc747fe95b19eaf6d0f-5b228d6d8190135ae2f9fe52c357d75cc1f3eb2c53fdb5edbf8e05213c5db4d0   "docker-entrypoint.s…"   56 seconds ago      Up 55 seconds                                         dev-peer0.org2.example.com-fabcar_2-7ae23286f357ae7bad076547a8170af1a21e2bd1a766fcc747fe95b19eaf6d0f
    ea5cdd28cdba   dev-peer0.org1.example.com-fabcar_2-7ae23286f357ae7bad076547a8170af1a21e2bd1a766fcc747fe95b19eaf6d0f-05b0199ad20ba84f8ac2deb2e572f4e6fb3c5b126e74c037de446a1d5f978560   "docker-entrypoint.s…"   56 seconds ago      Up 55 seconds                                         dev-peer0.org1.example.com-fabcar_2-7ae23286f357ae7bad076547a8170af1a21e2bd1a766fcc747fe95b19eaf6d0f
    2ca503def3b9   gliderlabs/logspout                                                                                                                                                     "/bin/logspout"          About an hour ago   Up About an hour   127.0.0.1:8000->80/tcp             logspout
    16255e95c16a   hyperledger/fabric-tools:latest                                                                                                                                         "/bin/bash"              About an hour ago   Up About an hour                                      cli
    705a69cbf90b   hyperledger/fabric-peer:latest                                                                                                                                          "peer node start"        About an hour ago   Up About an hour   0.0.0.0:7051->7051/tcp             peer0.org1.example.com
    78d7c8eea7c9   hyperledger/fabric-orderer:latest                                                                                                                                       "orderer"                About an hour ago   Up About an hour   0.0.0.0:7050->7050/tcp             orderer.example.com
    942b5994f471   hyperledger/fabric-peer:latest                                                                                                                                          "peer node start"        About an hour ago   Up About an hour   7051/tcp, 0.0.0.0:9051->9051/tcp   peer0.org2.example.com
    

    如果您使用--init-required标志,则需要调用Init函数,然后才能使用升级的链码。由于我们没有请求执行Init,我们可以通过创建新车来测试我们新的JavaScript链码:

    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 fabcar \
    --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":"createCar","Args":["CAR11","Honda","Accord","Black","Tom"]}' 
    

    您可以再次查询分类账上的所有汽车以查看新车:

    peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}' 
    

    您应该会看到JavaScript链码的以下结果:

    [{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}}, {"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}}, {"Key":"CAR11","Record":{"color":"Black","docType":"car","make":"Honda","model":"Accord","owner":"Tom"}}, {"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}}, {"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}}, {"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}}, {"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}}, {"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}}, {"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}}, {"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}}, {"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}] 
    

    清理

    使用完链码后,您也可以使用以下命令删除Logspout工具。

    $ docker stop logspout && docker rm logspout
    

    然后,您可以通过从测试网络目录发出以下命令来关闭test-network

    $./network.sh down
    

    后续步骤

    编写智能合同并将其部署到通道后,您可以使用Fabric SDK提供的API从客户端应用程序调用智能合同。这允许最终用户与区块链分类账上的资产进行交互。要开始使用Fabric SDK,请参阅编写您的第一个应用程序教程

    故障排除

    链码未经本组织同意问题:当我尝试向通道提交新的链码定义时,对等lifecyclechaincodecommit命令失败,并出现以下错误:

    Error: failed to create signed transaction: proposal response was not successful, error code 500, msg failed to invoke backing implementation of 'CommitChaincodeDefinition': chaincode definition not agreed to by this org (Org1MSP)
    

    解决方案:您可以尝试使用对peerlifecyclechaincodecheckcommitreadiness命令来尝试解决此错误,以检查哪些通道成员已批准您试图提交的链码定义。如果任何组织对链码定义的任何参数使用不同的值,则提交事务将失败。对等lifecyclechaincodecheckcommitreadiness将显示哪些组织没有批准您试图提交的链码定义:

    {    "approvals": {        "Org1MSP": false,        "Org2MSP": true    } } 
    

    调用失败问题:对等lifecyclechaincodecommit事务成功,但当我第一次尝试调用链码时,它失败了,并出现以下错误:

    Error: endorsement failure during invoke. response: status:500 message:"make sure the chaincode fabcar has been successfully defined on channel mychannel and try again: chaincode definition for 'fabcar' exists, but chaincode is not installed" 
    
    `**Solution:** You may not have set the correct `--package-id` when you approved your chaincode definition. As a result, the chaincode definition that was committed to the channel was not associated with the chaincode package you installed and the chaincode was not started on your peers. If you are running a docker based network, you can use the `docker ps` command to check if your chaincode is running:
    
    ```shell
    docker ps 
    

    如果您没有看到列出任何链码容器,请使用对等lifecyclechaincodeapproveformyorg命令,使用正确的软件包ID批准链码定义。

    背书政策失败

    问题:当我尝试将链码定义提交到通道时,事务失败,并出现以下错误:

    2020-04-07 20:08:23.306 EDT [chaincodeCmd] ClientWait -> INFO 001 txid [5f569e50ae58efa6261c4ad93180d49ac85ec29a07b58f576405b826a8213aeb] committed with status (ENDORSEMENT_POLICY_FAILURE) at localhost:7051 Error: transaction invalidated with status (ENDORSEMENT_POLICY_FAILURE)

    解决方案:此错误是由于提交事务没有收集足够的背书来满足生命周期背书政策。这个问题可能是由于您的交易没有针对足够数量的对等机来满足该政策。这也是一些对等组织在其configtx.yaml文件中不包含默认/Channel/Application/Endorsement策略引用的Endorsement:签名策略的结果:

    Readers: Type: Signature Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')" Writers: Type: Signature Rule: "OR('Org2MSP.admin', 'Org2MSP.client')" Admins: Type: Signature Rule: "OR('Org2MSP.admin')" Endorsement: Type: Signature Rule: "OR('Org2MSP.peer')"

    当您启用Fabric链码生命周期时,除了将通道升级到V2_0功能外,您还需要使用新的Fabric 2.0通道策略。您的渠道需要包含新的/Channel/Application/LifecycleEndorsement/Channel/Application/Endorsement政策:

    Policies:
            Readers:
                    Type: ImplicitMeta
                    Rule: "ANY Readers"
            Writers:
                    Type: ImplicitMeta
                    Rule: "ANY Writers"
            Admins:
                    Type: ImplicitMeta
                    Rule: "MAJORITY Admins"
            LifecycleEndorsement:
                    Type: ImplicitMeta
                    Rule: "MAJORITY Endorsement"
            Endorsement:
                    Type: ImplicitMeta
                    Rule: "MAJORITY Endorsement"
    
    

    如果您在通道配置中不包含新的通道策略,则在批准组织的链码定义时,您将收到以下错误:

    Error: proposal failed with status: 500 - failed to invoke backing implementation of 'ApproveChaincodeDefinitionForMyOrg': could not set defaults for chaincode definition in channel mychannel: policy '/Channel/Application/Endorsement' must be defined for channel 'mychannel' before chaincode operations can be attempted

    相关文章

      网友评论

          本文标题:fabric_v2.2.0 向通道中部署CC

          本文链接:https://www.haomeiwen.com/subject/ulqpihtx.html