繁体   English   中英

无法实例化此Java Chaincode

[英]Cannot instantiate this java chaincode

我正在尝试在“第一网络”示例中部署基于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
  • beddb1
  • beddb3
  • beddb0
  • 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 = "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,但有计划进一步发布)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM