Skip to content
This repository was archived by the owner on Nov 25, 2020. It is now read-only.

Weave Design document

Jonas Snellinckx edited this page Jun 12, 2018 · 5 revisions

Example

Args: {"function":"Car::createCar","Args":["CAR0"]}

// index.js

import shim = require('fabric-shim');
import { CarService } from './carservice';

const chaincode = new Weave()
   .use('Car', new CarService())

shim.start(chaincode);

// carservice.js
export class CarService {

  async createCar(stubHelper: StubHelper, args: string[]) {

    const verifiedArgs = await Helpers.checkArgs<{ key: string }>(args[0], Yup.object()
            .shape({
                key: Yup.string().required(),
            }));

        const car = await stubHelper.getStateAsObject(verifiedArgs.key); //get the car from chaincode state
        if (!car) {
            throw new ChaincodeError('Car does not exist');
        }

        return car;
  }

}

Features

Middleware

https://gist.github.com/sylvainleris/6a051f2a9e7420b32b6db7d8d47b968b

// index.js

import shim = require('fabric-shim');
import { logger } from './logger';
import { authorize } from './authorize';

const chaincode = new Weave()
   .use('Car', authorize({ role: "admin" }), new CarService())
   .use(logger)


// logger.js

export const logger = (stubHelper: StubHelper, args: string[], fcn: string, next: any) => {
   console.log("Executing function", fcn, "with args", args)
   next()
}


// authorize.js

export const authorize = (params: Object) => (stubHelper: StubHelper, args: string[], fcn: string, next: any) => {
   const clientIdentity = stubHelper.getClientIdentity();
   
   Object.keys(params).each(key => {
      if(!clientIdentity.assertAttributeValue(key, params[key])){
         return next(new ChaincodeError('Unauthorized', 403))
      }
   })

   return next()
}

Modules

// index.js

import shim = require('fabric-shim');
import { logger } from './logger';
import { authorize } from './authorize';
import { BasicGetSet } from './basicgetsetModule';

const chaincode = new Weave()
   .use('Car', authorize({ role: "admin" }), new CarService())
   .addModule(new basicGetSet())
   .use(logger)


// basicgetsetModule.js

import { Helpers, StubHelper } from '@theledger/fabric-chaincode-utils';

export class BasicGetSet extends Module {

   async get(stubHelper: StubHelper, args: string[]) {
        await Helpers.checkArgs(args[0],  Yup.string().required());
        
        return stubHelper.getStateAsObject(args[0]);
    }

    async set(stubHelper: StubHelper, args: string[]) {
        await Helpers.checkArgs(args[0],  Yup.string().required());
        await Helpers.checkArgs(args[1],  Yup.string().required());

        return stubHelper.putState(args[0], args[1]);
    }

}

class Module {
    private chaincode: Chaincode;

    constructor(chaincode: Chaincode) {
        this.chaincode = chaincode;

        for (let name of Object.getOwnPropertyNames(Object.getPrototypeOf(this))) {
            let method = this[name];
            // Supposedly you'd like to skip constructor
            if (!(method instanceof Function) || name.startsWith('__') || name === 'constructor') {
                continue;
            }

            chaincode[name] = method;
        }
    }
}

Clone this wiki locally