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

时间:2017-08-14 11:55:57

标签: docker-compose hyperledger hyperledger-fabric

我正在尝试改变织物样品中的fabcar示例,以便能够快速迭代链码开发。默认情况下,我总是需要删除图像并重新运行设置脚本,如this question elaborated on。这需要大约30秒。

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

我跟着Tutorial "Chaincode for Developers"并将其与基本网络的docker-compose进行了比较。我注意到有一个名为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

2 个答案:

答案 0 :(得分:3)

引入--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中运行chaincode。

注意:在实例化链码时,您需要使用在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

答案 1 :(得分:0)

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

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

我将install脚本中的instantiateinvokestartFabric.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')"