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:
First Network Environment:
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?
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)