Hyperledger Fabric 链代码无法 运行 并且没有说明原因

Hyperledger Fabric chaincode fails to run and doesn't say why

在编写一些链代码时,我突然开始收到此错误:

2021-06-05T20:45:34.045Z - error: [Transaction]: Error: No valid responses from any peers. Errors: peer=peer1.local:7051, status=500, message=error in simulation: failed to execute transaction c33493ce22005d9e73b02e2b99d1d19daceb04f0ee9fb8fede0a3e1081ca9943: could not launch chaincode basic_1.0:32ca3f181f42e66b77c1026c31c92049336315143142535955a3f256d0249c18: chaincode registration failed: container exited with 1

我的代码之前运行良好,TypeScript 仍然可以正常编译。

使用 docker logs ... 检查状态时,我看到了这个:

2021-06-05 19:33:09.259 UTC [lifecycle] Work -> WARN 073 could not launch chaincode 'basic_1.0:5a649b5a8d084d83c86b02231ffa1b8e3e32e95f99de46e52588244fb9c99c59': chaincode registration failed: container exited with 1

如何找出代码错误是什么?

此外,即使它无法启动容器,也会调用检查链代码是否已成功安装 returns true。

在四处挖掘时,我注意到链代码容器在加载失败后自动停止。为了找到崩溃的容器,我使用了 docker ps -a。当 运行 docker logs ... 在那一个上,或者用 docker run -it ... /bin/sh 跳进容器时,我能够获得更多信息:

******** FAILED to run the application: Error: error in simulation: failed to execute transaction 6caf98016e71974a987a7f3a5295b518026c1f25ac117646db3dfcad89d179f7: could not launch chaincode basic_1.0:5a649b5a8d084d83c86b02231ffa1b8e3e32e95f99de46e52588244fb9c99c59: chaincode registration failed: container exited with 1

fabric-chaincode-node start --peer.address localhost:7051 --chaincode-id-name mycc

Options: --help Show help [boolean] -v, --version Show version number [boolean] --peer.address [string] [required]
--grpc.max_send_message_length [number] [default: -1] --grpc.max_receive_message_length [number] [default: -1] --grpc.keepalive_time_ms [number] [default: 110000] --grpc.http2.min_time_between_pings_ms [number] [default: 110000] --grpc.keepalive_timeout_ms [number] [default: 20000] --grpc.http2.max_pings_without_data [number] [default: 0] --grpc.keepalive_permit_without_calls [number] [default: 1] --ssl-target-name-override [string] --chaincode-id-name [string] [required] --module-path [string] [default: "/usr/local/src"]

[MissingRefError: can't resolve reference Array from id SomeClass#] { message: "can't resolve reference Array from id SomeClass#", missingRef: 'Array', missingSchema: 'Array' } npm ERR! code ELIFECYCLE npm ERR! errno 1

不幸的是,这仍然不是很有用,因为我的代码中没有缺少对 Array 的引用,而且从我在网上看到的情况来看,这个错误是由 JSON 验证库抛出的.似乎 Hyperledger Fabric 在内部做了一些导致一些冲突的事情。

我将其缩小为:如果您尝试从 class 中用 @Object 装饰的 class 引用静态函数或静态变量,Hyperledger Fabric TypeScript SDK 将崩溃继承自 Contract.

例如,不要这样做:

@Object()
export class SomeClass {
    public static PREFIX: string = "TEST";
    ...
}

然后在合同中class:

export class SomeContract extends Contract {
    @Transaction()
    public async SomeFunction(ctx: Context): Promise<string> {
        return SomeClass.PREFIX;
}

相反,将静态变量和函数从 SomeClass 重构为 SomeClassHelper 或其他文件。当以这种方式重构时,完全相同的代码可以正常工作。