-2

I'm trying to deploy a Java based chaincode in "first-network" sample. The code is generated with IBM Blockchain Platform plugin for VSCode. It works in the local environment (Using the VSCode plugin to install, invoke,...), but when I try to test the chaincode in the "first-network" sample, it crashes.

Local Environment:

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

First Network Environment:

  • 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

I have two classes:

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);
    }

}

I don't know if I'm doing it right. The steps I'm following are:

$ ./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

What am I doing wrong? How could I solve this?

remiotore
  • 3
  • 1
  • Install the chaincode on all peers. If not working, inspect your orderer logs and peer logs. Always inspect your logs. StackOverflow users are not clairvoyants, but you also can always inspect your logs. https://stackoverflow.com/questions/59031036/could-not-assemble-transaction-err-proposal-response-was-not-successful-error – kekomal Nov 27 '19 at 16:03

1 Answers1

0

There is a problem with the java fabric-shim version 1.4.2 which means if you declare a dependency on that version it will fail to instantiate. Check your pom.xml or build.gradle file to see which version is being used and use version 1.4.4 or later (currently only 1.4.4 is available now but there are plans for further releases)

david_k
  • 5,843
  • 2
  • 9
  • 16
  • Thanks! It was the problem! I didn't understand why It accepted Go, TypeScript and NodeJS but no Java. The version (1.4.2) in the build.gradle was the problem. Changed line to -> compile group: 'org.hyperledger.fabric-chaincode-java', name: 'fabric-chaincode-shim', version: '1.4.4' – remiotore Nov 28 '19 at 09:11