无法实例化此Java链码

问题描述 投票:-2回答:1

我正在尝试在“第一网络”示例中部署基于Java的链码。该代码是使用IBM Blockchain Platform VSCode插件生成的。它可以在本地环境中工作(使用VSCode插件进行安装,调用等),但是当我尝试在“第一网络”示例中测试链码时,它会崩溃。

本地环境:

  • peer0.org1.example.com
  • ca.org1.example.com
  • orderer.example.com

第一个网络环境:

  • cli
  • peer0.org2.example.com
  • peer1.org2.example.com
  • peer0.org1.example.com
  • peer1.org1.example.com
  • orderer.example.com
  • couchdb2
  • couchdb1
  • couchdb3
  • couchdb0
  • ca.example.com

我有两堂课:

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 = "[email protected]",
                                                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 hyperledger-fabric hyperledger hyperledger-chaincode chaincode
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.