【发布时间】:2020-09-08 12:26:29
【问题描述】:
我正在尝试在通道上实例化已安装的节点链码,但失败并出现错误:failed to invoke chaincode name:"lscc" , error: container exited with 0
到目前为止我做了什么:
- 使用构建您的第一个网络 (v1.4) 教程中的
./byfn up -c some-channel -s couchdb -o etcdraft -l node脚本成功地启动了一个包含 2 个组织的网络,每个组织有 2 个对等点并达成共识。网络已经有一个名为mycc的实例化链代码。 - 使用 Node.js SDK 从我的脚本连接到网络。我能够从我的脚本中成功调用
mycc链码的读写链码方法。 - 使用每个组织的管理员身份在所有 4 个对等点上安装了新的链代码。我可以通过查询对等点上已安装的链码来确认链码确实已安装。对等容器日志也确认链码安装成功。
- 尝试实例化已安装的链码,遇到了上述错误。
这是我尝试实例化我的链码的方式:
// Load the network configuration
const ccpPath = path.resolve(__dirname, ccpName);
let ccp = JSON.parse(fs.readFileSync(ccpPath, 'utf8'));
// Create a new file system based wallet for managing identities.
const walletPath = path.join(process.cwd(), walletName);
const wallet = new FileSystemWallet(walletPath);
console.log(`Wallet path: ${walletPath}`);
// Check to see if we've already enrolled the user.
const identity = await wallet.exists(identityName);
if (!identity) {
console.log(`An identity for the user ${identityName} does not exist in the wallet`);
console.log('Run the registerUser.js application before retrying');
return;
}
// Create a new gateway for connecting to our peer node.
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity: identityName, discovery: { enabled: true, asLocalhost: true } });
// Get the network (channel) our contract is deployed to.
const network = await gateway.getNetwork(channelName);
const client = gateway.getClient();
const channel = network.getChannel(channelName);
let channelPeers = channel.getPeers().map(peer => peer._peer);
// console.log(channelPeers);
const endorsementPolicy = {
identities: [
{ role: { name: 'member', mspId: 'Org1MSP' }},
{ role: { name: 'member', mspId: 'Org2MSP' }}
],
policy: {
'1-of': [{ 'signed-by': 0 }, { 'signed-by': 1 }]
}
};
console.log(channelPeers[0]._name);
const instantiateChaincodeRequest = {
targets: channelPeers,
chaincodeType: 'node',
chaincodeId: 'deal',
chaincodeVersion: '1.0.0',
txId: client.newTransactionID(true),
'endorsement-policy': endorsementPolicy
};
const instantiateResponse = await channel.sendInstantiateProposal(instantiateChaincodeRequest, 300000);
console.log(instantiateResponse[0]);
此脚本可解决此错误:
{ Error: chaincode registration failed: container exited with 0
at self._endorserClient.processProposal (/home/projects/testing/vs-code-hlf-sc/node_modules/fabric-client/lib/Peer.js:144:36)
at Object.onReceiveStatus (/home/projects/testing/vs-code-hlf-sc/node_modules/grpc/src/client_interceptors.js:1212:9)
at InterceptingListener._callNext (/home/projects/testing/vs-code-hlf-sc/node_modules/grpc/src/client_interceptors.js:568:42)
at InterceptingListener.onReceiveStatus (/home/projects/testing/vs-code-hlf-sc/node_modules/grpc/src/client_interceptors.js:618:8)
at callback (/home/projects/testing/vs-code-hlf-sc/node_modules/grpc/src/client_interceptors.js:847:24)
status: 500,
payload: <Buffer >,
peer:
{ url: 'grpcs://localhost:9051',
name: 'peer0.org2.example.com:9051',
options: [Object] },
isProposalResponse: true }
以下是相关的对等容器日志:
2020-09-08 08:27:09.274 UTC [endorser] callChaincode -> INFO 0c7 [][7fdf845f] Entry chaincode: name:"lscc"
2020-09-08 08:27:09.277 UTC [lscc] executeInstall -> INFO 0c8 Installed Chaincode [deal] Version [1.0.0] to peer
2020-09-08 08:27:09.277 UTC [endorser] callChaincode -> INFO 0c9 [][7fdf845f] Exit chaincode: name:"lscc" (3ms)
2020-09-08 08:27:09.277 UTC [comm.grpc.server] 1 -> INFO 0ca unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.peer_address=192.168.48.1:59702 grpc.code=OK grpc.call_duration=3.376691ms
2020-09-08 08:45:34.201 UTC [endorser] callChaincode -> INFO 0dd [some-channel][d3a00bc9] Entry chaincode: name:"lscc"
2020-09-08 08:46:16.593 UTC [peer.chaincode.dev-peer0.org2.example.com-deal-1.0.0] func2 -> INFO 0de
2020-09-08 08:46:16.593 UTC [peer.chaincode.dev-peer0.org2.example.com-deal-1.0.0] func2 -> INFO 0df > deal@1.0.0 start /usr/local/src
2020-09-08 08:46:16.593 UTC [peer.chaincode.dev-peer0.org2.example.com-deal-1.0.0] func2 -> INFO 0e0 > node deal-contract.js "--peer.address" "peer0.org2.example.com:9052"
2020-09-08 08:46:16.593 UTC [peer.chaincode.dev-peer0.org2.example.com-deal-1.0.0] func2 -> INFO 0e1
2020-09-08 08:46:17.141 UTC [dockercontroller] func2 -> INFO 0e2 Container dev-peer0.org2.example.com-deal-1.0.0 has closed its IO channel
2020-09-08 08:46:17.314 UTC [endorser] callChaincode -> INFO 0e3 [some-channel][d3a00bc9] Exit chaincode: name:"lscc" (43113ms)
2020-09-08 08:46:17.314 UTC [endorser] SimulateProposal -> ERRO 0e4 [some-channel][d3a00bc9] failed to invoke chaincode name:"lscc" , error: container exited with 0
github.com/hyperledger/fabric/core/chaincode.(*RuntimeLauncher).Launch.func1
/opt/gopath/src/github.com/hyperledger/fabric/core/chaincode/runtime_launcher.go:63
runtime.goexit
/opt/go/src/runtime/asm_amd64.s:1357
chaincode registration failed
日志显示链码已成功安装,然后日志显示lscc 链码错误。所以我认为这个错误与链码的构建阶段有关。但是,当我使用 VS Code IBM Blockchain Extension 部署相同的链代码时,它可以完美运行。
到目前为止我所做的尝试:
- 提供/不提供背书策略并以多种方式调整实例化请求对象
- 使用不同的身份
- 检查
ccenv容器的日志,该容器在收到实例化请求时生成约 30 秒。没有错误 - 从头开始重新启动网络,删除所有 Fabric Docker 映像并重新开始。
所以基本上问题是: 如何使用 Node.js SDK 在通道上正确实例化已安装的链码?
我的环境:
-
Ubuntu 18.04
-
Hyperledger Fabric v1.4
-
fabric-network1.4.8 -
fabric-client1.4.10 -
节点 10.22.0
-
npm 6.14.6
-
docker 19.03.12,构建 48a66213fe
-
docker-compose 1.26.2,构建 eefe0d31
-
链码是使用
fabric-contract-api开发的
【问题讨论】:
标签: node.js docker hyperledger-fabric hyperledger hyperledger-chaincode