Chaincode as external service

Spydra runs chaincode as an external service to be able to gain more control over and to manage chaincode runtime more effectively.

Steps to write a chaincode compatible for running as an external service

Golang:

  • Import the shim package and create the ChaincodeServer struct from the shim package.

  • The ChaincodeServer struct takes the following values:

    • CC: It takes contractapi.ContractInterface which was created using contractapi.NewChaincode() function.

    • CCID: It takes the chaincode package id. This can be accessed from the CORE_CHAINCODE_ID environment variable.

    • Address: Chaincode server address to expose the chaincode. This can be accessed from the CORE_CHAINCODE_ADDRESS environment variable.

    • TLSProps: It accepts the struct value of shim.TLSProperties

  • Then call the start function from the created ChaincodeServer struct value (server.Start())

Eg: https://github.com/spydra-tech/external-chaincode-reference/blob/main/go/main.go


Javascript:

  1. If chaincode is written using contract api:

In package.json, modify the value of scripts.start section to ”fabric-chaincode-node server”

Eg: https://github.com/spydra-tech/external-chaincode-reference/blob/main/javascript/using-contract-api/package.json

  1. If chaincode is written using fabric-shim:

  • In the file where the chaincode is initialised / started, create the shim.server by passing ccid and address which are taken from the runtime environment variables CORE_CHAINCODE_ID and CHAINCODE_SERVER_ADDRESS

  • Then call the start function from the created shim.server object (server.start())

Eg: https://github.com/spydra-tech/external-chaincode-reference/blob/main/javascript/using-shim-api/cc.js


Java:

  • Create a new java file (ContractBootstrap.java) that will import NettyChaincodeServer and will have a ContractBootstrap class. This will be the main class.

  • The main function in ContractBootstrap class will take chaincode metadata from the environment variables such as:

    • CHAINCODE_SERVER_ADDRESS

    • CORE_CHAINCODE_ID

    • CHAINCODE_TLS_DISABLED

    • CHAINCODE_TLS_KEY

    • CHAINCODE_TLS_CERT

  • These env variables will be created inside the chaincode container when the chaincode is deployed.

  • Using fabric’s NettyChaincodeServer and ContractRouter, the chaincode server will be started. Eg: https://github.com/spydra-tech/fabric-java-externalcc-sample/blob/main/src/main/java/org/hyperledger/fabric/samples/ContractBootstrap.java

  • Modify the build.gradle file to include the plugin com.github.johnrengelman.shadow and add shadowJar section with basename parameter as chaincode. Create manifest section inside shadowJar with attribute: Main-Class with the ContractBootstrap class’s path. Eg: https://github.com/spydra-tech/fabric-java-externalcc-sample/blob/main/build.gradle

  • If remote git is used, make sure the gradle/wrapper directory contains the gradle-wrapper.jar file after publishing as .jar is normally added in the . gitignore file.

  • Make sure the gradlew file is present at the root directory of your repository.

Last updated