Java chaincode

Note: This guide generally assumes you have followed the Chaincode development environment setup tutorial here.

To get started developing Java chaincode

  1. Ensure you have gradle
  • Download the binary distribution from http://gradle.org/gradle-download/
  • Unpack, move to the desired location, and add gradle’s bin directory to your system path
  • Ensure gradle -v works from the command-line, and shows version 2.12 or greater
  • Optionally, enable the gradle daemon for faster builds
  1. Ensure you have the Java 1.8 JDK installed. Also ensure Java’s directory is on your path with java -version
  1. From your command line terminal, move to the devenv subdirectory of your workspace environment. Log into a Vagrant terminal by executing the following command:

    vagrant ssh
    
  2. Build and run the peer process.

    cd $GOPATH/src/github.com/hyperledger/fabric
    make peer
    peer node start
    
  3. The following steps is for deploying chaincode in non-dev mode.

    • Deploy the chaincode,
peer chaincode deploy -l java -p /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/java/SimpleSample -c '{"Args": ["init", "a","100", "b", "200"]}'

6d9a704d95284593fe802a5de89f84e86fb975f00830bc6488713f9441b835cf32d9cd07b087b90e5cb57a88360f90a4de39521a5595545ad689cd64791679e9

* This command will give the 'name' for this chaincode, and use this value in all the further commands with the -n (name) parameter


* PS. This may take a few minutes depending on the environment as it deploys the chaincode in the container,
  • Invoke a transfer transaction,
peer chaincode invoke -l java \
-n 6d9a704d95284593fe802a5de89f84e86fb975f00830bc6488713f9441b835cf32d9cd07b087b90e5cb57a88360f90a4de39521a5595545ad689cd64791679e9 \
-c '{"Args": ["transfer", "a", "b", "10"]}'

c7dde1d7-fae5-4b68-9ab1-928d61d1e346

  • Query the values of a and b after the transfer
peer chaincode query -l java \
-n 6d9a704d95284593fe802a5de89f84e86fb975f00830bc6488713f9441b835cf32d9cd07b087b90e5cb57a88360f90a4de39521a5595545ad689cd64791679e9 \
-c '{ "Args": ["query", "a"]}'
{"Name":"a","Amount":"80"}


peer chaincode query -l java \
-n 6d9a704d95284593fe802a5de89f84e86fb975f00830bc6488713f9441b835cf32d9cd07b087b90e5cb57a88360f90a4de39521a5595545ad689cd64791679e9 \
-c '{ "Args": ["query", "b"]}'
{"Name":"b","Amount":"220"}

Java chaincode deployment in DEV Mode

  1. Follow the step 1 to 3 as above,

  2. Build and run the peer process

    cd $GOPATH/src/github.com/hyperledger/fabric
    make peer
    peer node start --peer-chaincodedev
    
  3. Open the second Vagrant terminal and build the Java shim layer and publish it to Local Maven Repo

    cd $GOPATH/src/github.com/hyperledger/fabric/core/chaincode/shim/java
    gradle -b build.gradle clean
    gradle -b build.gradle build
    
  4. Change to examples folder to build and run,

    cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/java/SimpleSample
    gradle -b build.gradle build
    
  5. Run the SimpleSample chaincode using the gradle -b build.gradle run

  6. Open the third Vagrant terminal to run init and invoke on the chaincode

    peer chaincode deploy -l java -n SimpleSample -c ‘{“Args”: [“init”, “a”,”100”, “b”, “200”]}’

    2016/06/28 19:10:15 Load docker HostConfig: %+v &{[] [] []  [] false map[] [] false [] [] [] [] host    { 0} [] { map[]} false []  0 0 0 false 0    0 0 0 []}
    19:10:15.461 [crypto] main -> INFO 002 Log level recognized 'info', set to INFO
    SimpleSample
    

    peer chaincode invoke -l java -n SimpleSample -c ‘{“Args”: [“transfer”, “a”, “b”, “10”]}’

2016/06/28 19:11:13 Load docker HostConfig: %+v &{[] [] []  [] false map[] [] false [] [] [] [] host    { 0} [] { map[]} false []  0 0 0 false 0    0 0 0 []}
19:11:13.553 [crypto] main -> INFO 002 Log level recognized 'info', set to INFO
978ff89e-e4ef-43da-a9f8-625f2f6f04e5
peer chaincode query -l java -n SimpleSample -c '{ "Args": ["query", "a"]}'
2016/06/28 19:12:19 Load docker HostConfig: %+v &{[] [] []  [] false map[] [] false [] [] [] [] host    { 0} [] { map[]} false []  0 0 0 false 0    0 0 0 []}
19:12:19.289 [crypto] main -> INFO 002 Log level recognized 'info', set to INFO
{"Name":"a","Amount":"90"}
peer chaincode query -l java -n SimpleSample -c '{"Args": ["query", "b"]}'
2016/06/28 19:12:25 Load docker HostConfig: %+v &{[] [] []  [] false map[] [] false [] [] [] [] host    { 0} [] { map[]} false []  0 0 0 false 0    0 0 0 []}
19:12:25.667 [crypto] main -> INFO 002 Log level recognized 'info', set to INFO
{"Name":"b","Amount":"210"}

Developing new JAVA chaincode

  1. Create a new Java project structure.
  2. Use existing build.grade from any example JAVA Chaincode project like examples/chaincode/java/SimpleSample.
  3. Make your main class extend ChaincodeBase class and implement the following methods from base class.
  4. public String run(ChaincodeStub stub, String function, String[] args)
  5. public String query(ChaincodeStub stub, String function, String[] args)
  6. public String getChaincodeID()
  7. Modify the mainClassName in build.gradle to point to your new class.
  8. Build this project using gradle -b build.gradle build
  9. Run this chaincode after starting a peer in dev-mode as above using gradle -b build.gradle run