【问题标题】:Can't invoke nodejs chaincode on Hyperledger Fabric - Amazon Managed Blockchain无法在 Hyperledger Fabric 上调用 nodejs 链代码 - Amazon Managed Blockchain
【发布时间】:2022-08-04 00:57:01
【问题描述】:

在 AWS 关于如何设置区块链网络的第一步之后,我陷入了第 7 步 [1] 打包/安装/批准/提交链码的位置。作为个人挑战,我尝试使用asset-transfer-basic/chaincode-typescript 项目[2]。

这是项目文件夹结构(其中是个节点模块文件夹,但已重命名,因此它包含在最终包中):

chaincode-typescript/  
  ├─ dist/  
  ├─ lib/  
  ├─ src/  
  ├─ tslint.json  
  ├─ tsconfig.json  
  ├─ package.json  
  ├─ package-lock.json

这是项目package.json(注意start 脚本):

{
    \"name\": \"asset-transfer-basic\",
    \"version\": \"1.0.0\",
    \"description\": \"Asset Transfer Basic contract implemented in TypeScript\",
    \"main\": \"dist/index.js\",
    \"typings\": \"dist/index.d.ts\",
    \"engines\": {
        \"node\": \">=12\",
        \"npm\": \">=5\"
    },
    \"scripts\": {
        \"lint\": \"tslint -c tslint.json \'src/**/*.ts\'\",
        \"pretest\": \"npm run lint\",
        \"test\": \"nyc mocha -r ts-node/register src/**/*.spec.ts\",
        \"start\": \"NODE_PATH=lib node dist/index.js\",
        \"build\": \"tsc\",
        \"build:watch\": \"tsc -w\",
        \"prepublishOnly\": \"npm run build\"
    },
    \"engineStrict\": true,
    \"author\": \"Hyperledger\",
    \"license\": \"Apache-2.0\",
    \"dependencies\": {
        \"fabric-contract-api\": \"^2.0.0\",
        \"fabric-shim\": \"^2.0.0\"
    },
    \"devDependencies\": {
        \"@types/chai\": \"^4.1.7\",
        \"@types/mocha\": \"^5.2.5\",
        \"@types/node\": \"^10.12.10\",
        \"@types/sinon\": \"^5.0.7\",
        \"@types/sinon-chai\": \"^3.2.1\",
        \"chai\": \"^4.2.0\",
        \"mocha\": \"^5.2.0\",
        \"nyc\": \"^14.1.1\",
        \"sinon\": \"^7.1.1\",
        \"sinon-chai\": \"^3.3.0\",
        \"ts-node\": \"^7.0.1\",
        \"tslint\": \"^5.11.0\",
        \"typescript\": \"^3.1.6\"
    }
}

这些是我运行的命令及其输出:

docker exec cli peer lifecycle chaincode package package.tar.gz --lang node --label package_3 --path ./fabric-samples/asset-transfer-basic/chaincode-typescript/
docker exec cli peer lifecycle chaincode install package.tar.gz

2022-07-30 23:09:05.476 UTC [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:\"\\nJpackage_3:5a51d2bc0ef40de3c4ad1f2080456004c39e26670f2a9048796496eaef7b88b4\\022\\tpackage_3\" > 
2022-07-30 23:09:05.488 UTC [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: package_3:5a51d2bc0ef40de3c4ad1f2080456004c39e26670f2a9048796496eaef7b88b4
export CC_PACKAGE_ID=package_3:5a51d2bc0ef40de3c4ad1f2080456004c39e26670f2a9048796496eaef7b88b4
docker exec cli peer lifecycle chaincode queryinstalled

Installed chaincodes on peer:
Package ID: package_2:1fbb720f16271e9ae647736e012ca6ff8d5f6c6bf80ca7696668bd1c6a89b8e2, Label: package_2
Package ID: package_3:5a51d2bc0ef40de3c4ad1f2080456004c39e26670f2a9048796496eaef7b88b4, Label: package_3
Package ID: package_1:e73c64b62ebe74c1997117b037df2dd51d7aaacb26c877f726f03f7c568c4af9, Label: package_1
docker exec cli peer lifecycle chaincode approveformyorg --orderer $ORDERER --tls --cafile /opt/home/managedblockchain-tls-chain.pem --channelID supply-chain --name package3 --version v0 --sequence 1 --package-id $CC_PACKAGE_ID

2022-07-30 23:10:36.764 UTC [chaincodeCmd] ClientWait -> INFO 001 txid [a2634acda7acbc220ca0b78b6f46a5c7f202ac498541139f2209d412c49ed20b] committed with status (VALID) at nd-<node_id>.m-<member_id>.n-<network_id>.managedblockchain.us-east-1.amazonaws.com:30003
docker exec cli peer lifecycle chaincode checkcommitreadiness --orderer $ORDERER --tls --cafile /opt/home/managedblockchain-tls-chain.pem --channelID supply-chain --name package3 --version v0 --sequence 1

Chaincode definition for chaincode \'package3\', version \'v0\', sequence \'1\' on channel \'supply-chain\' approval status by org:
m-<member_id>: true
docker exec cli peer lifecycle chaincode commit --orderer $ORDERER --tls --cafile /opt/home/managedblockchain-tls-chain.pem --channelID supply-chain --name package3 --version v0 --sequence 1

2022-07-30 23:12:17.742 UTC [chaincodeCmd] ClientWait -> INFO 001 txid [e8745d021b24567caeebac0fbbf0a969b66e77f817e78ebba735af6b7c32b43f] committed with status (VALID) at nd-<node_id>.m-<member_id>.n-<network_id>.managedblockchain.us-east-1.amazonaws.com:30003
docker exec cli peer lifecycle chaincode querycommitted -C supply-chain

Committed chaincode definitions on channel \'supply-chain\':
Name: package2, Version: v0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc
Name: package3, Version: v0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc
Name: package, Version: v0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc
docker exec cli peer chaincode invoke --tls --cafile /opt/home/managedblockchain-tls-chain.pem --channelID supply-chain --name package3 -c \'{\"function\":\"InitLedger\",\"Args\":[]}\'

2022-07-30 23:13:30.906 UTC [chaincodeCmd] InitCmdFactory -> INFO 001 Retrieved channel (supply-chain) orderer endpoint: nd-<node_id>.m-<member_id>.n-<network_id>.managedblockchain.us-east-1.amazonaws.com:30001
Error: endorsement failure during invoke. response: status:500 message:\"error in simulation: failed to execute transaction 2034113c1b27abebdee846465ba3609f2dd8d2a58984eb6684c2895989ea4443: could not launch chaincode package_3:5a51d2bc0ef40de3c4ad1f2080456004c39e26670f2a9048796496eaef7b88b4: chaincode registration failed: container exited with 0\"

最后一条日志说链码包没有注册。但是,当我查看 CloudWatch 中的日志以查看调用 InitLedger 函数时出了什么问题时,我得到了以下信息:

  • 您的日志似乎不包含任何表明代码无法运行的错误?您是否使用 Fabric Samples 中定义的本地 BYFN(构建您的第一个网络)方法测试了此链码,以消除链码本身的问题?
  • 我相信所有使用高级 fabric-contract-api 库的链代码都需要以“fabric-chaincode-node start”脚本开头,而不是从 index.js 调用函数。这可能会导致问题。 Amazon Managed Blockchain 上的 Node.js 链代码存在一个已知问题,此启动脚本可能无法正常工作。如果您遇到这个问题,请告诉我。
  • @Forrest 是的,我在本地测试了这个链代码,它似乎正在工作。在 AMB 上下文中,我打包并提交了相同的链代码。这一次,在start 脚本中,我按照您的建议使用了fabric-chaincode-node start,如下所示:NODE_PATH=lib fabric-chaincode-node start。但是当我调用 InitLedger 方法时,我在 CloudWatch 上收到了这个 NPM 错误:sh: fabric-chaincode-node: not found。我还尝试在命令前加上npx,如下所示:NODE_PATH=lib npx fabric-chaincode-node start,但也没有运气;它会触发超时错误。

标签: node.js hyperledger-fabric amazon-managed-blockchain


【解决方案1】:

我得出的结论是,AMB 服务不支持fabric-contract-apifabric-chaincode-node,但支持fabric-shim

我试图让它发挥作用的尝试:
1 - 安装最新版本的fabric-contract-apifabric-shim(此时为v2.2.3);调用函数时,我没有注意到任何不同的错误消息或成功。

2 - 由于node_modules 文件夹没有打包并安装到对等体中,我已将其名称更改为lib;然后,在package.json 中,我将start 脚本更改为:NODE_PATH=lib node contract.js;这样项目依赖项就包含在了最终的包中;它不起作用,因为fabric-contract-api 需要start 脚本中的fabric-chaincode-node start,并且由于我重命名了node_modules 文件夹,因此Node.js 运行时在任何地方都找不到该脚本。

3 - 按照与上述相同的策略(更改node_modules 文件夹名称),我尝试将lib/.bin 文件夹包含在$PATH 中,如下所示:export PATH=$PATH:./lib/.bin/ fabric-chaincode-node start;尝试调用函数时出现sh: fabric-chaincode-node: Permission denied 错误。

另一方面,fabric-shim 似乎工作得很好(v2.2.3)。

【讨论】: