Overview

The fabric-contract-api provides the contract interface. a high level API for application developers to implement Smart Contracts. Within Hyperledger Fabric, Smart Contracts are also known as Chaincode. Working with this API provides a high level entry point to writing business logic.

The fabric-shim provides the chaincode interface, a lower level API for implementing "Smart Contracts". It also provides the implementation to support communication with Hyperledger Fabric peers for Smart Contracts written using the fabric-contract-api together with the fabric-chaincode-node cli to launch Chaincode or Smart Contracts.

To confirm that the fabric-shim maintains API and functional compatibility with previous versions of Hyperledger Fabric.

Detailed explanation on the concept and programming model can be found here: https://hyperledger-fabric.readthedocs.io/en/release-1.4/chaincode.html.

Release Notes

Please read the Release Notes for the 1.4 release.

Contract Interface

Installation

npm install --save fabric-contract-api

Usage

Implement a class that ends the contract class, a constructor is needed. The other functions will be invokable functions of your Smart Contract

// updatevalues.js
'use strict';

// SDK Library to asset with writing the logic
const { Contract } = require('fabric-contract-api');

// Business logic (well just util but still it's general purpose logic)
const util = require('util');

/**
 * Support the Updating of values within the SmartContract
 */
class UpdateValuesContract extends Contract

    constructor(){
		super('UpdateValuesContract');
	}

	async transactionA(ctx, newValue) {
		// retrieve existing chaincode states
		let oldValue = await ctx.stub.getState(key);

		await ctx.stub.putState(key, Buffer.from(newValue));

		return Buffer.from(newValue.toString());
	}

	async transactionB(ctx) {
	  //  .....
	}

};

module.exports = UpdateValuesContract

As with standard node modules make sure that this class is exported as follows.

// index.js
'use strict';

const UpdateValues = require('./updatevalues')
module.exports.contracts = ['UpdateValues'];

Note: In order to make this contract runnable in version 1.4, also install the fabric-shim module as below, and ensure that the 'start' script in package.json refers to fabric-chaincode-node

  "scripts": {
	"start": "fabric-chaincode-node start"
  }

Chaincode Interface

Installation

npm install --save fabric-shim

Usage

The chaincode interface contains two methods to be implemented:

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

const Chaincode = class {
	async Init(stub) {
		// use the instantiate input arguments to decide initial chaincode state values

		// save the initial states
		await stub.putState(key, Buffer.from(aStringValue));

		return shim.success(Buffer.from('Initialized Successfully!'));
	}

	async Invoke(stub) {
		// use the invoke input arguments to decide intended changes

		// retrieve existing chaincode states
		let oldValue = await stub.getState(key);

		// calculate new state values and saves them
		let newValue = oldValue + delta;
		await stub.putState(key, Buffer.from(newValue));

		return shim.success(Buffer.from(newValue.toString()));
	}
};

Start the chaincode process and listen for incoming endorsement requests:

shim.start(new Chaincode());

Support

Tested with node.js 8.9.0 (LTS).

License

This package is distributed under the Apache License, Version 2.0, see LICENSE.txt for more information.