无法实例化此 java 链代码

Cannot instantiate this java chaincode

我正在尝试在 "first-network" 示例中部署基于 Java 的链码。 该代码是使用 VSCode 的 IBM Blockchain Platform 插件生成的。 它在本地环境中工作(使用 VSCode 插件安装、调用...),但是当我尝试在 "first-network" 示例中测试链代码时,它崩溃了。

本地环境:

第一个网络环境:

我有两个类:

SimpleAsset.java

/*
 * SPDX-License-Identifier: Apache-2.0
 */

package org.example;

import org.hyperledger.fabric.contract.annotation.DataType;
import org.hyperledger.fabric.contract.annotation.Property;
import org.json.JSONObject;

@DataType()
public class SimpleAsset {

    @Property()
    private String value;

    public SimpleAsset(){
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String toJSONString() {
        return new JSONObject(this).toString();
    }

    public static SimpleAsset fromJSONString(String json) {
        String value = new JSONObject(json).getString("value");
        SimpleAsset asset = new SimpleAsset();
        asset.setValue(value);
        return asset;
    }
}

SimpleAssetContract.java

/*
 * SPDX-License-Identifier: Apache-2.0
 */
package org.example;

import org.hyperledger.fabric.contract.Context;
import org.hyperledger.fabric.contract.ContractInterface;
import org.hyperledger.fabric.contract.annotation.Contract;
import org.hyperledger.fabric.contract.annotation.Default;
import org.hyperledger.fabric.contract.annotation.Transaction;
import org.hyperledger.fabric.contract.annotation.Contact;
import org.hyperledger.fabric.contract.annotation.Info;
import org.hyperledger.fabric.contract.annotation.License;
import static java.nio.charset.StandardCharsets.UTF_8;

@Contract(name = "SimpleAssetContract",
    info = @Info(title = "SimpleAsset contract",
                description = "My Smart Contract",
                version = "0.0.1",
                license =
                        @License(name = "Apache-2.0",
                                url = ""),
                                contact =  @Contact(email = "SimpleAsset@example.com",
                                                name = "SimpleAsset",
                                                url = "http://SimpleAsset.me")))
@Default
public class SimpleAssetContract implements ContractInterface {
    public  SimpleAssetContract() {

    }
    @Transaction()
    public boolean simpleAssetExists(Context ctx, String simpleAssetId) {
        byte[] buffer = ctx.getStub().getState(simpleAssetId);
        return (buffer != null && buffer.length > 0);
    }

    @Transaction()
    public void createSimpleAsset(Context ctx, String simpleAssetId, String value) {
        boolean exists = simpleAssetExists(ctx,simpleAssetId);
        if (exists) {
            throw new RuntimeException("The asset "+simpleAssetId+" already exists");
        }
        SimpleAsset asset = new SimpleAsset();
        asset.setValue(value);
        ctx.getStub().putState(simpleAssetId, asset.toJSONString().getBytes(UTF_8));
    }

    @Transaction()
    public SimpleAsset readSimpleAsset(Context ctx, String simpleAssetId) {
        boolean exists = simpleAssetExists(ctx,simpleAssetId);
        if (!exists) {
            throw new RuntimeException("The asset "+simpleAssetId+" does not exist");
        }

        SimpleAsset newAsset = SimpleAsset.fromJSONString(new String(ctx.getStub().getState(simpleAssetId),UTF_8));
        return newAsset;
    }

    @Transaction()
    public void updateSimpleAsset(Context ctx, String simpleAssetId, String newValue) {
        boolean exists = simpleAssetExists(ctx,simpleAssetId);
        if (!exists) {
            throw new RuntimeException("The asset "+simpleAssetId+" does not exist");
        }
        SimpleAsset asset = new SimpleAsset();
        asset.setValue(newValue);

        ctx.getStub().putState(simpleAssetId, asset.toJSONString().getBytes(UTF_8));
    }

    @Transaction()
    public void deleteSimpleAsset(Context ctx, String simpleAssetId) {
        boolean exists = simpleAssetExists(ctx,simpleAssetId);
        if (!exists) {
            throw new RuntimeException("The asset "+simpleAssetId+" does not exist");
        }
        ctx.getStub().delState(simpleAssetId);
    }

}

我不知道我做的对不对。我要执行的步骤是:

$ ./byfn.sh up -s couchdb -l java                # Deploy the network with Couchdb and Java
$ cp -r SimpleAsset fabric-samples/chaincode/    # This is the chaincodes path in the docker

$ docker exec -it cli bash # Go to the Cli       # We go inside the docker

$ /opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode install -n sa01 -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/SimpleAsset/ # Install the SimpleAsset chaincode -> OK!

$ /opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n sa01 -l java -v 1.0 -c '{"Args":[]}' -P 'AND ('\''Org1MSP.peer'\'','\''Org2MSP.peer'\'')'

Error: could not assemble transaction, err proposal response was not successful, error code 500, msg chaincode registration failed: container exited with 1

我做错了什么?我该如何解决这个问题?

java fabric-shim 版本 1.4.2 存在问题,这意味着如果您声明对该版本的依赖,它将无法实例化。检查您的 pom.xml 或 build.gradle 文件以查看正在使用哪个版本并使用 1.4.4 或更高版本(目前只有 1.4.4 可用,但有进一步发布的计划)