超级账本结构。无法使用 Fabric Node SDK 调用事务

Hyperledger Fabric. Unable to invoke transactions using Fabric Node SDK

我尝试了两个不同的教程:

  1. 这个要在本地部署 docker 图像: https://github.com/hyperledger/fabric-samples 我尝试了 fabcar 样本。一切正常。我能够注册管理员、注册用户并使用此用户身份调用交易。不错

  2. 第二个在bluemix上部署fabric composer playground: https://ibm-blockchain.github.io/setup/ 我能够进入 composer playground 并部署业务网络示例。我还能够上传和部署我在本地使用 composer-cli 设计的自己的业务网络。为了测试交易,我通过具有管理员权限的 Rest 服务器公开了网络。一切正常。

现在轮到我的问题了。我想结合这两个例子(只是为了好玩,边做边学:))。我想将 fabcar 示例网络部署到 bluemix 上的 kubernetes 环境,并使用 fabric 节点 sdk 与网络交互,如示例 1 所示。因此,我在示例 2 的 scripts/yaml 文件中进行了以下更改:

在create_all.sh。第 41 行(对等点 1)和第 45 行(对等点 2)。我更改了环境变量 CHAINCODE_NAME 和 CHAINCODE_VERSION

的值
echo "=> CREATE_ALL: Running Install Chaincode on Org1 Peer1" CHAINCODE_NAME="fabcar" CHAINCODE_VERSION="1.0" MSP_CONFIGPATH="/shared/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp"  PEER_MSPID="Org1MSP" PEER_ADDRESS="blockchain-org1peer1:30110" create/chaincode_install.sh

在第 16 行 chaincode_install.yaml.base 中,我更改了链代码的路径。我分叉了 https://github.com/hyperledger/fabric and added the fabcar.go chaincode from example 1 to the new repository https://github.com/bigbelette/fabric

command: ["sh", "-c", "git clone https://github.com/bigbelette/fabric $GOPATH/src/github.com/bigbelette/fabric/ && peer chaincode install -n ${CHAINCODE_NAME} -v ${CHAINCODE_VERSION} -p github.com/bigbelette/fabric/examples/chaincode/go/fabcar/"]

在create_all.sh。第 49 行。我更改了环境变量 CHAINCODE_NAME 和 CHAINCODE_VERSION:

的值
CHANNEL_NAME="channel1" CHAINCODE_NAME="fabcar" CHAINCODE_VERSION="1.0" MSP_CONFIGPATH="/shared/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp"  PEER_MSPID="Org1MSP" PEER_ADDRESS="blockchain-org1peer1:30110" create/chaincode_instantiate.sh

在chaincode_instantiate.yaml.base中,我将参数列表设为空:

command: ["sh", "-c", "peer chaincode instantiate -o blockchain-orderer:31010 -C ${CHANNEL_NAME} -n ${CHAINCODE_NAME} -v ${CHAINCODE_VERSION} -c '{\"Args\":[\"\"]}'"]

集群上的部署没有错误。在 fabcar 示例节点 js 文件 enrollAdmin、regiserUser、query 和 invoke 中,我更改了通道名称(从 mychannel 到 channel1)以及 IP 和端口以匹配在线 kubernetes 服务:

enrollAdmin.js 和 registerUser.js 工作正常,所以我可以获得证书并将其存储在密钥库中。但是当我尝试调用事务时,出现以下错误:

看来给我发证书的CA不被同行认可。但是我的网络中只有一个 CA!?还是MSP定义有问题(我还是不太明白)

感谢您的帮助。

终于找到错误了

我的网络有 1 个 CA(根 CA,名为 ca)和 2 个 "sub" 个 CA(ca1 和 ca2)。我直接由根 CA 注册管理员和用户,因为我没有在 Fabric_CA_Client class:

的参数中提及 ca 的名称
fabric_ca_client = new Fabric_CA_Client('http://184.173.5.108:30054', tlsOption, crypto_suite)

没有名称,使用的 CA 将是默认 CA(在我的例子中是根 CA)。但是根 CA 对用户证书的签名不会被对等方认可。仅接受来自最后分层 CA 级别的签名。所以解决方案是引用 CA 的名称:

fabric_ca_client = new Fabric_CA_Client('http://184.173.5.108:30054', tlsOptions , 'CA1', crypto_suite)

有效。现在用户可以调用交易了。