我正在尝试改变织物样品中的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
答案 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
脚本中的instantiate
,invoke
和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')"