March 22, 2019

OBP - Writing Blockchain chaincode in Node JS


This post is to show how to write a chain code in NodeJS. Since version 1.2, the opensource Hyperledger fabric blockchain framework supports nodeJS to write chain codes. As Oracle Blockchain Platform (OBP) built on Hyperledger fabric and it upgrades to Hyperledger fabric 1.3 (latest version), we can also write chain codes using NodeJS in OBP.

Let's see a sample chain code. Below is the procedure to write and deploy a chain code into OBP written in Node JS.

  • Create a package.json file with the basic details and dependencies of the libraries
  • Create node js file/files (.js) and configure them to the above package.json
  • Zip the folder with both js and package.json files
  • Click on "Deploy chain code" in OBP under "Chaincodes" tab and select the zip file
Note: You just need to create package.json, not required to run npm commands to install the dependent libraries in the folder before packaging(zip) the project as the OBP will run internally once you deploy the code.

Below is the sample package.json file.


"name": "reviews",
"version": "1.0.0",
"description": "Chaincode implemented in node.js",
"engines": {
"node": ">=8.4.0",
"npm": ">=5.3.0"
"scripts": { "start" : "node reviews.js" },
"engine-strict": true,
"license": "Apache-2.0",
"dependencies": {
"fabric-shim": "~1.1.0"

Below is the sample Node js file.

const shim = require('fabric-shim');

const Chaincode = class {

    async Init(stub) {
        return shim.success();

    async Invoke(stub) {
        let ret = stub.getFunctionAndParameters();
        let method = this[ret.fcn];
        console.log("Inside invoke. Calling method: " + ret.fcn);
        if (!method) {
            shim.error(Buffer.from('Received unknown function ' + ret.fcn + ' invocation'));

        try {
            let payload = await method(stub, ret.params);
            return shim.success(payload);
        } catch (err) {
            return shim.error(err);
    //Method to save or update a user review to a product
    async saveReview(stub, args) {
        console.log("inside saveReview: " + JSON.stringify(args));
        if (args.length < 3) {
            throw 'Incorrect number of arguments. Expecting productid,userid and rating.';
        var assetReview = {};
        assetReview.productid = args[0];//String
        assetReview.userid = args[1];//String
        assetReview.rating = args[2];//Number
        assetReview.comment = args[3];//String
        await stub.putState(assetReview.userid, Buffer.from(JSON.stringify(assetReview)));

    }//End of method


shim.start(new Chaincode());

Note: In the above js sample, the first statement requires fabric-shim package which is mandatory to execute the chain code.

March 13, 2019

Configure Rich History in Oracle Blockchain Platform


Connecting Oracle Autonomous Transactional Process (ATP) as a Rich History Database in Oracle Blockchain Platform is very easy. It takes just a few configuration steps. Let's see, how to do the configuration.
  • Get the ATP connection details. For this, log in to ATP service console
  • Download wallet package file and copy the TNS name for the connection string to be used
  • Open blockchain instance console
  • As shown in the below figure, click on "Configure Rich History tab"

  • Below window will be opened. Fill the information like username, password of rich history database, paste the copied TNS name in the "Connection String" field, upload the saved wallet file and then click on save

  • Now the ATP has been configured as rich history database to Oracle blockchain. 
  • Go to channels and click on the channel's settings to which the rich history has to be configured and select "Configure Rich History"
  • Below window will open. Check the box to enable rich history for the channel

  • From now on, all the transactions of the channel will be sync with the ATP database automatically
  • At least one transaction has to be done in blockchain to initiate this sync process
  • You can observe three tables created in ATP as shown below and each table name is prefixed with the blockchain instance name_channel name. For example, if the instance name is "dealer" and the channel name is "dealerchannel" then, the tables created are 
    • dealer_dealerchannel_hist
    • dealer_dealerchannel_last
    • dealer_dealerchannel_state

  •  Below image shows the structure of each table created

#autonomous #blockchain #oracleblockchain