Docker compose Hyperledger fabcar示例链码处于开发模式(对等链码开发)

Docker compose Hyperledger fabcar示例链码处于开发模式(对等链码开发),docker-compose,hyperledger,hyperledger-fabric,Docker Compose,Hyperledger,Hyperledger Fabric,我试图从结构示例中修改fabcar示例,以便能够快速迭代链代码开发。默认情况下,我总是需要删除映像并重新运行安装脚本,如下所示。这需要大约30秒 我在docker compose中看到了标志--peer chaincodedev=true,我想知道如何才能让它工作 我遵循并将其与基本网络的docker组合进行了比较。我注意到有一个名为chaincode的容器,它运行一个名为fabric ccenv的图像。我将此定义添加到docker compose中,但无法在对等机上实例化链码。这应该怎么做 我

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

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

我遵循并将其与基本网络的docker组合进行了比较。我注意到有一个名为
chaincode
的容器,它运行一个名为
fabric ccenv
的图像。我将此定义添加到docker compose中,但无法在对等机上实例化链码。这应该怎么做

我想跑

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
下一步运行时,需要像往常一样在通道中安装并实例化链码。当然,您可以从自己选择的IDE运行链码

注意:实例化链码时,需要使用在
CORE\u chaincode\u ID\u 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\u PEER\u 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
引入了
--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
下一步运行时,需要像往常一样在通道中安装并实例化链码。当然,您可以从自己选择的IDE运行链码

注意:实例化链码时,需要使用在
CORE\u chaincode\u ID\u 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\u PEER\u 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

谢谢阿泰姆,我现在找到了解决问题的办法

我复制了
chaincode
容器的docker compose定义,这反过来又重写了装载的卷。因此,无论何时安装,都无法找到MSP。因此,我再次删除了
chaincode
容器

我将
安装
实例化
调用
命令从
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 "$1" ]; then echo "Error: Needs chaincode version"; exit; fi
CHAINCODE_VERSION=$1

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')"

谢谢阿泰姆,我现在找到了解决问题的办法

我复制了
chaincode
容器的docker compose定义,这反过来又重写了装载的卷。因此,无论何时安装,都无法找到MSP。因此,我再次删除了
chaincode
容器

我将
安装
实例化
调用
命令从
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 "$1" ]; then echo "Error: Needs chaincode version"; exit; fi
CHAINCODE_VERSION=$1

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')"