开发模式下的 Hyperledger Fabric fabcar 示例链代码 (peer-chaincodedev)

Hyperledger Fabric fabcar example chaincode in dev mode (peer-chaincodedev)

我正在尝试从结构样本中更改 fabcar 示例,以便能够快速迭代链代码开发。默认情况下,我总是需要删除图像并重新 运行 安装脚本,如 。这需要大约 30 秒。

我在 docker-compose 中看到了标志 --peer-chaincodedev=true,想知道如何让它工作。

我遵循了 Tutorial "Chaincode for Developers" 并将其与基本网络的 docker-compose 进行了比较。我注意到有一个名为 chaincode 的容器,其中 运行 是一个名为 fabric-ccenv 的图像。我将此定义添加到 docker 组合中,但无法在对等点上实例化链代码。这应该如何完成?

我正在尝试 运行

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

在 cli 中,但我得到

2017-08-14 11:54:13.404 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2017-08-14 11:54:13.404 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2017-08-14 11:54:13.406 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc
2017-08-14 11:54:13.406 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc
2017-08-14 11:54:13.407 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A95070A6708031A0C08E59EC6CC0510...324D53500A04657363630A0476736363
2017-08-14 11:54:13.407 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: 61C75870AB68C1E7D6921DB4CA6029A0093A3D57DB421BC697864555BFC81167
Error: Error endorsing chaincode: rpc error: code = Unknown desc = Failed to deserialize creator identity, err MSP Org1MSP is unknown

引入--peer-chaincodedev=true或所谓的开发模式,允许在开发链代码时进行短路,即允许您跳过使用链代码打包、编译和部署docker图像的正式过程.相反,您可以从您的 IDE 执行您的链码并调试并与之交互工作。例如,您可能有一些非常简单的链代码:

type smartContract struct {
}

func (p *smartContract) Init(stub shim.ChaincodeStubInterface) peer.Response {
    return shim.Success(nil)
}

func (p *smartContract) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
    actionName, params := stub.GetFunctionAndParameters()

    if actionName == "hello" {
         shim.putState("Greeting", "Hello World")
         return shim.Success(nil)
    }
return shim.Error(errors.New("Undefined function"))
}

func main() {
    err := shim.Start(new(smartContract))
    if err != nil {
        fmt.Printf("Error starting chaincode: %s", err)
    }
}

现在,如果您 运行 使用 --peer-chaincodedev=true 标记连接您的对等节点,您可以从其文件夹中执行您的链代码,例如:

CORE_PEER_ADDRESS=localhost:7051 CORE_CHAINCODE_ID_NAME=chaincodeName:v1.0 go run smartContract.go

下一个 运行ning,您需要像往常一样在频道中安装和实例化链代码。当然,您可以从 IDE 中选择 运行 链码。

注意:在实例化链代码时,您需要使用您在 CORE_CHAINCODE_ID_NAME=chaincodeName:v1.0 变量中定义的名称和版本。当然,您需要创建一个频道。

# Creating and joining the channel
peer channel create -o localhost:7050 -c mychannel -f mychannel.tx
peer channel join -o localhost:7050 --blockpath mychannel.block

# Once chaincode is running we can install and instantiate it
peer chaincode install -o localhost:7050 -n chaincodeName -v 1.0 -p github.com/somepackage/chaincode
peer chaincode instantiate -o localhost:7050 -n chaincodeName -v 1.0 -C mychannel -c '{"Args": ["init"]}'

回到你的问题,我认为你看到的错误可能是因为你的 MSP 配置错误或者你没有创建频道。如果配置错误,您需要确保 CORE_PEER_MSPCONFIGPATH 环境变量指向有效位置,例如在 cli 容器上下文中的许多示例中使用的:

export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

还要指定 MSP ID:

CORE_PEER_LOCALMSPID=Org1MSP

背书节点地址:

CORE_PEER_ADDRESS=peer0.org1.example.com:7051

感谢 Artem,我现在找到了解决问题的方法。

我为 chaincode 容器复制了 docker-compose 定义,这又覆盖了已安装的卷。因此,无论何时安装它,都找不到 MSP。所以我再次删除了 chaincode 容器。

我将 installinstantiateinvoke 命令从 startFabric.sh 脚本移到了 install.sh 脚本中。我通过执行 ./startFabric.sh 来启动 docker 容器。然后我编译 运行 主机上的链代码

CORE_PEER_ADDRESS=localhost:7051 CORE_CHAINCODE_ID_NAME=fabcar:${VERSION} go run fabcar.go

现在我需要使用上一步中使用的版本执行 install.sh

更改链码后,我将在主机上重新编译链码,增加版本。然后我执行 upgrade.sh,它看起来像这样:

#!/bin/bash
#
# Exit on first error
set -e

if [ -z "" ]; then echo "Error: Needs chaincode version"; exit; fi
CHAINCODE_VERSION=

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode install -n fabcar -v ${CHAINCODE_VERSION} -p github.com/fabcar
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode upgrade -o orderer.example.com:7050 -C mychannel -n fabcar -v ${CHAINCODE_VERSION} -c '{"Args":[""]}' -P "OR ('Org1MSP.member','Org2MSP.member')"