This repository was archived by the owner on Nov 25, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 28
Weave Design document
Jonas Snellinckx edited this page Jun 12, 2018
·
5 revisions
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;
}
}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()
}// 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;
}
}
}