Hyperledger fabric 为什么对等链码实例化多次成功执行

Hyperledger fabric 为什么对等链码实例化多次成功执行,hyperledger-fabric,Hyperledger Fabric,我可以多次成功地执行对等链码实例化,它应该返回它存在,但是没有。为什么 步骤: 从中,我从其他地方复制msp(对等方和订购方一起使用)、genesis.block、helloch.tx、docker-compose-with-coach.yaml等,应该可以。当我执行: docker-compose -f docker-compose-with-couch.yaml up peer chaincode install -n hello -v 1.0 -l java -p chaincode

我可以多次成功地执行
对等链码实例化
,它应该返回它存在,但是没有。为什么

步骤

从中,我从其他地方复制msp(对等方和订购方一起使用)、genesis.block、helloch.tx、docker-compose-with-coach.yaml等,应该可以。当我执行:

docker-compose -f docker-compose-with-couch.yaml up
peer chaincode install -n hello -v 1.0 -l java -p chaincode/hsl-hsl-user-guide-examples-v14/mytest
peer chaincode instantiate -o 127.0.0.1:7050 -C helloch  -n hello -v 1.0 -l java -c "{\"Args\":[\"init\",\"a\", \"100\", \"b\",\"100\"]}"
peer、order、couchdb0、cli启动,然后cli执行script.sh

#script.sh content
peer channel create -c helloch -f helloch.tx -o orderer:7050
peer channel join -b helloch.block
然后,我使用chaincode docker devmode当前路径上的终端模拟cli环境,如下所示:

#cli simulation, $pwd  is the chaincode-docker-devmode path
export CORE_VM_ENDPOINT=unix:///var/run/run/docker.sock
export CORE_LOGGING_LEVEL=DEBUG
export CORE_PEER_ID=cli
export CORE_PEER_ADDRESS=127.0.0.1:7051
export CORE_PEER_LOCALMSPID=DEFAULT
export CORE_PEER_MSPCONFIGPATH=$pwd/msp
bash
当我执行
对等频道列表时,它可能会显示我已加入helloch

频道。然后我执行:

docker-compose -f docker-compose-with-couch.yaml up
peer chaincode install -n hello -v 1.0 -l java -p chaincode/hsl-hsl-user-guide-examples-v14/mytest
peer chaincode instantiate -o 127.0.0.1:7050 -C helloch  -n hello -v 1.0 -l java -c "{\"Args\":[\"init\",\"a\", \"100\", \"b\",\"100\"]}"

但是我可以实例化很多次,并且日志不会返回错误,实际上它没有成功实例化,为什么?

您只能实例化一次同名的链码。

您只能实例化一次同名的链码。

链码的实例化本质上是一个事务,因此必须进行背书,命令并承诺生效。现在,在您的情况下,peer cli instantiate命令成功执行,因为事务建议已成功背书并签署提交给订购服务的建议。而基于以下日志输出:

peer        | 2017-09-05 01:09:23.650 UTC [ConnProducer] NewConnection -> ERRO 6da Failed connecting to 127.0.0.1:7050 , error: context deadline exceeded
peer        | 2017-09-05 01:09:23.650 UTC [deliveryClient] connect -> ERRO 6db Failed obtaining connection: Could not connect to any of the endpoints: [127.0.0.1:7050]
对等方无法连接到订购服务端点,在您的情况下,订购服务端点配置为
127.0.0.1:7050
,因此最终不会提交实例化事务。因此,您确实能够再次执行实例化命令,因为您上次尝试的对等分类账上不存在实例化交易记录

您需要将ordering服务端点从
127.0.0.1:7050
更改为
orderer:7050
,然后重试您的实验。此值在
configtx.yaml
文件中配置,例如:

Orderer: &OrdererDefaults

    # Orderer Type: The orderer implementation to start
    # Available types are "solo" and "kafka"
    OrdererType: solo

    Addresses:
        - orderer:7050

链码的实例化本质上是一个事务,因此必须对其进行背书、排序和提交才能生效。现在,在您的情况下,peer cli instantiate命令成功执行,因为事务建议已成功背书并签署提交给订购服务的建议。而基于以下日志输出:

peer        | 2017-09-05 01:09:23.650 UTC [ConnProducer] NewConnection -> ERRO 6da Failed connecting to 127.0.0.1:7050 , error: context deadline exceeded
peer        | 2017-09-05 01:09:23.650 UTC [deliveryClient] connect -> ERRO 6db Failed obtaining connection: Could not connect to any of the endpoints: [127.0.0.1:7050]
对等方无法连接到订购服务端点,在您的情况下,订购服务端点配置为
127.0.0.1:7050
,因此最终不会提交实例化事务。因此,您确实能够再次执行实例化命令,因为您上次尝试的对等分类账上不存在实例化交易记录

您需要将ordering服务端点从
127.0.0.1:7050
更改为
orderer:7050
,然后重试您的实验。此值在
configtx.yaml
文件中配置,例如:

Orderer: &OrdererDefaults

    # Orderer Type: The orderer implementation to start
    # Available types are "solo" and "kafka"
    OrdererType: solo

    Addresses:
        - orderer:7050
在上面,您可以通过命令查看helloch.block详细信息

configtxgen --inspectBlock helloch.block
它表明

"OrdererAddresses": {
                "Version": "0",
                "ModPolicy": "/Channel/Orderer/Admins",
                "Value": {
                    "addresses": [
                        "127.0.0.1:7050"
                    ]
                }
            },
在helloch.block(通道配置)中连接的订购方地址似乎来自genesis.block(从configtx.yaml生成)

在上面,您可以通过命令查看helloch.block详细信息

configtxgen --inspectBlock helloch.block
它表明

"OrdererAddresses": {
                "Version": "0",
                "ModPolicy": "/Channel/Orderer/Admins",
                "Value": {
                    "addresses": [
                        "127.0.0.1:7050"
                    ]
                }
            },

在helloch.block(通道配置)中,连接的订购方地址似乎来自genesis.block(从configtx.yaml生成)

在我的例子中,这给我带来了麻烦,因为在调用调用/查询事务之前,我没有给实例化过程足够的时间

尝试在实例化和调用/查询事务之间添加sleep命令:

peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n fabcar -l "$LANGUAGE" -v 1.0 -c '{"Args":[""]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

# Sleeping to allow time for chaincode to instantiate on peers
sleep 30

peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n fabcar -c '{"function":"initLedger","Args":[""]}'

这仅适用于在某种CLI容器中运行“启动”脚本的情况。在我的例子中,我有
script.sh
,它在我第一次启动网络时运行。

在我的例子中,这给我带来了麻烦,因为在调用调用/查询事务之前,我没有给实例化过程足够的时间

尝试在实例化和调用/查询事务之间添加sleep命令:

peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n fabcar -l "$LANGUAGE" -v 1.0 -c '{"Args":[""]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

# Sleeping to allow time for chaincode to instantiate on peers
sleep 30

peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n fabcar -c '{"function":"initLedger","Args":[""]}'

这仅适用于在某种CLI容器中运行“启动”脚本的情况。在我的例子中,我有
script.sh
,它在我第一次启动网络时运行。

我只知道一个,但从我的示例中,我实例化了很多次,docker日志不会返回错误消息。我支持实例化不成功。但我找不到原因?你能看一下我上面添加的日志并帮我解决它吗?我只知道一个,但从我的示例中,我实例化了很多次,docker日志没有返回错误消息。我支持实例化不成功。但我找不到原因?你能看一下我上面添加的日志并帮我解决吗?非常感谢,你说得对!我非常激动。欢迎:)我相信这也解决了你的另一个问题:是的,他们是同样的问题。谢谢,我们可以交流,可以给我你的电子邮件吗?在Rocket上找到我。Chat,Chat.hyperledger.org,@C0rWin.error安装链码:-对等日志:-[endorser]SimulateProposal->ERRO 095[mychannel][0e6974c0]调用链码名称失败:“lscc”,错误:容器已退出0 github.com/hyperledger/fabric/core/chaincode(*RuntimeLauncher).Launch.func1/opt/gopath/src/github.com/hyperledger/fabric/core/chaincode/runtime\u launcher.go:63 runtime.goexit/opt/go/src/runtime/asm\u amd64.s:1333在CLI上链码注册失败:-错误:无法组装事务,错误建议响应不成功,错误代码500,消息链码注册失败:容器以0T退出非常感谢你,你是对的!我非常激动。欢迎:)我相信这也解决了你的另一个问题:是的,他们是同样的问题。谢谢,我们可以交流,可以给我你的电子邮件吗?在Rocket上找到我。聊天,Chat.hyperledger.org,@C0rWin.error安装链码:-对等日志:-[endorser]SimulateProposal->ERRO 095[mychannel][0e6974c0]调用链码名称失败:“lscc”,错误:容器已退出,0 github.com/hyperledger/