Skip to content

Commit

Permalink
Added Simple MeterPointReading (trust less for IOT Devices)
Browse files Browse the repository at this point in the history
Conceptual Change to include default contracts in RoleLookup
Addpoted Test Cases
  • Loading branch information
zoernert committed May 17, 2017
1 parent 367c2f7 commit 478f025
Show file tree
Hide file tree
Showing 50 changed files with 189 additions and 88 deletions.
74 changes: 55 additions & 19 deletions Defaults.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,58 @@
this.deployment=function(options) {
var contract_type=[];
contract_type["StromDAO-BO.sol_DSO"]="0x3D8bB3f14e332ae56bf97E2BddB24a3E1c87bcfb";
contract_type["StromDAO-BO.sol_MPO"]="0xa037ce97716720C27D67E65Bfcb61b5D315410be";
contract_type["StromDAO-BO.sol_Provider"]="0x23b0209Bc95dc71f8fc29e526C438C8F4332E4e6";

contract_type["StromDAO-BO.sol:DSO"]="0x3D8bB3f14e332ae56bf97E2BddB24a3E1c87bcfb";
contract_type["StromDAO-BO.sol:MPO"]="0xa037ce97716720C27D67E65Bfcb61b5D315410be";
contract_type["StromDAO-BO.sol:Provider"]="0x23b0209Bc95dc71f8fc29e526C438C8F4332E4e6";

var roles=[];
roles[0]=0;
roles[1]=1;
roles[2]=2;
roles[3]=3;
options.contracts=contract_type;

options.rolelookup="0xEC899C1B2CcAEcb3EFA6733CA249aBa58228e883";
options.roles=roles;

if(typeof options.rpc == "undefined") options.rpc='http://app.stromdao.de:8081/rpc';
return options;
};
this.loadDefaults=function(options) {
if(typeof parent.waitForDefaults == "undefined") {
parent.waitForDefaults = true;
options.rolelookup="0x7B4B8A73f08cc85De6e183deC814077347e26dAF";
var contract_type=[];

if(typeof parent.storage.getItemSync(options.rolelookup+"_1") == "undefined") {
/*
parent.roleLookup(options.rolelookup).then( function(roles) {
roles.defaults(1).then(
function (r1) {
parent.storage.setItemSync(options.rolelookup+"_1",r1);
contract_type["StromDAO-BO.sol_MPO"] = r1;
return roles.defaults(2);
}
).then(
function (r2) {
parent.storage.setItemSync(options.rolelookup+"_2",r2);
contract_type["StromDAO-BO.sol_DSO"] = r2;
return roles.defaults(3);
}
).then(
function (r3) {
parent.storage.setItemSync(options.rolelookup+"_3",r3);
contract_type["StromDAO-BO.sol_Provider"] = r3;
parent.storage.setItemSync(options.rolelookup,contract_type);
}
)
});
*/
parent.storage.setItemSync(options.rolelookup+"_1","0x04f6d471bF3b17A4fCC896406A40FFC89A096474");
parent.storage.setItemSync(options.rolelookup+"_2","0xa7a1828060f6A83FE30b6717A877FacD049f7aDe");
parent.storage.setItemSync(options.rolelookup+"_3","0x99efcdFDC28DE946EbA951432ABd31aD42d21feb");
} else {
contract_type["StromDAO-BO.sol_MPO"]=parent.storage.getItemSync(options.rolelookup+"_1");
contract_type["StromDAO-BO.sol_DSO"]=parent.storage.getItemSync(options.rolelookup+"_2");
contract_type["StromDAO-BO.sol_Provider"]=parent.storage.getItemSync(options.rolelookup+"_3");

}
contract_type["StromDAO-BO.sol_MPR"]="0x6177CeFF392b920881BE7e4789c4B7C075B7Eb64";
var roles=[];
roles[0]=0;
roles[1]=1;
roles[2]=2;
roles[3]=3;
options.contracts=contract_type;
options.roles=roles;
parent.waitForDefaults=false;

return options;
} else {
return options;
}
}
62 changes: 62 additions & 0 deletions MPR.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/**
* StromDAO Business Object: MPR
* =========================================
* Meter Point Operator handling for StromDAO Energy Blockchain.
*
* In general a Meter Point Operating (Contract) handles meter readings and issues Deliverables as soon as a new reading is received.
*
* @author Thorsten Zoerner thorsten.zoerner@stromdao.de
* */


this.mpr = function(obj_or_address) {
if(typeof obj_or_address == "undefined") obj_or_address=parent.options.contracts["StromDAO-BO.sol:MPR"];

var p1 = new Promise(function(resolve, reject) {
var instance=parent._objInstance(obj_or_address,'StromDAO-BO.sol:MPR');
instance.test = {};

/**
* Stores a reading to this contract instance. Requires sender to be approved Meter-Point
* @see approveMP()
*/
instance.storeReading=function(_reading) {
_reading=Math.round(_reading);
var p2 = new Promise(function(resolve2, reject2) {
instance.obj.storeReading(_reading).then(function(o) {
parent._waitForTransactionKeepRef(o,resolve2);
});
});
return p2;
};

/**
* Allows a test commit to check if it fails. Promise that might be used to validate a Meter-Point is fully connected.
*/
instance.test.storeReading=function(_reading) {
_reading=Math.round(_reading);
var p2 = new Promise(function(resolve2, reject2) {
instance.obj.estimate.storeReading(_reading).then(function(cost) {
resolve2(cost.toString());
}).catch(function() { reject2(-1); });
});
return p2;
};


/**
* Returns last reading for a Meter-Point
*/
instance.readings=function(_meterpoint) {
var p2 = new Promise(function(resolve2, reject2) {
instance.obj.readings(_meterpoint).then(function(o) {
resolve2(o);
});
});
return p2;
};

resolve(instance);
});
return p1;
};
2 changes: 1 addition & 1 deletion Provider.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ this.provider = function(obj_or_address) {
return p2;
};
instance.approveSender=function(_sender,_approve,_cost_per_day,_cost_per_energy) {
var p2 = new Promise(function(resolve2, reject2) {
var p2 = new Promise(function(resolve2, reject2) {
instance.obj.approveSender(_sender,_approve,_cost_per_day,_cost_per_energy).then(function(o) {
parent._waitForTransactionKeepRef(o,resolve2);
});
Expand Down
8 changes: 8 additions & 0 deletions RoleLookup.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ this.rolelookup=function(obj_or_address) {
});
return p2;
};
instance.defaults=function(_role) {
var p2 = new Promise(function(resolve2, reject2) {
instance.obj.defaults(_role).then(function(o) {
resolve2(o[0]);
});
});
return p2;
}
resolve(instance);
});
return p1;
Expand Down
9 changes: 6 additions & 3 deletions StromDAONode.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ module.exports = {
parent = this;

this._defaults = require("./Defaults.js").deployment;

this._deployment = require("./Defaults.js").loadDefaults;
/**
* Core Function to create a new key-pair.
*/
Expand Down Expand Up @@ -208,11 +208,13 @@ module.exports = {
*/
this.roleLookup = require("./RoleLookup").rolelookup;

var options=this._defaults(user_options);


storage.initSync();
this.storage=storage;

if(typeof options.rpc == "undefined") options.rpc='http://app.stromdao.de:8081/rpc';
var options=this._defaults(user_options);


var rpcprovider = new ethers.providers.JsonRpcProvider(options.rpc, 42);

Expand All @@ -236,5 +238,6 @@ module.exports = {
this.objRef=storage.getItemSync("objRef");
}
this.rpcprovider=rpcprovider;
this.options=this._deployment(this.options);
}
};
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "stromdao-businessobject",
"version": "0.2.2",
"version": "0.2.3",
"description": "Abstract BusinessObject for StromDAO Energy Blockchain. Abstraction layer between blockchain technology and business logic providing energy market related entities and use cases.",
"main": "StromDAONode.js",
"engines": {
Expand All @@ -9,7 +9,7 @@
},
"scripts": {
"lint": "standard --verbose | snazzy",
"test": "mocha --harmony test/rolelookup.js"
"test": "mocha --harmony test/consensus.js"
},
"repository": {
"type": "git",
Expand Down
63 changes: 41 additions & 22 deletions smart_contracts/StromDAO-BO.sol
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ contract DeliveryReceiver is owned {
contract RoleLookup {
mapping(uint256 => uint8) public roles;
mapping(address=>mapping(address=>address)) public relations;

mapping(uint8=>address) public defaults;
event Relation(address _from,uint8 _for, address _to);

function RoleLookup() {
Expand All @@ -82,22 +82,39 @@ contract RoleLookup {
roles[4]= 4;
roles[5]= 5;
}
function setDefault(uint8 _role,address _from) {
if(msg.sender!=address(0xD87064f2CA9bb2eC333D4A0B02011Afdf39C4fB0)) throw;
defaults[_role]=_from;
}
function setRelation(uint8 _for,address _from) {
relations[msg.sender][_for]=_from;
Relation(_from,_for,msg.sender);
}
/*
function setRelationOnBehalf(uint8 _for,address _from,address _to) onlyOwnerAsOriginator {
relations[_to][_for]=_from;
Relation(_from,_for,msg.sender);
}

contract MPReading is owned {
MPO public mpo;
mapping(address=>reading) public readings;
event Reading(address _meter_point,uint256 _power);

struct reading {
uint256 time;
uint256 power;

}

function setMPO(MPO _mpo) onlyOwner {
mpo=_mpo;
}
*/
/*
function deleteRelation(uint8 _for, address _to) onlyOwner {
relations[_to][_for]=address(0);
Relation(_to,_for,address(0));

function storeReading(uint256 _reading) {
if(address(mpo)!=address(0x0)) {
mpo.storeReading(_reading);
} else {
readings[tx.origin]=reading(now,_reading);
}
Reading(tx.origin,_reading);
}
*/

}

Expand All @@ -117,6 +134,7 @@ contract MPO is owned {
mapping(address=>reading) public processed;
mapping(address=>Delivery) public lastDelivery;
mapping(address=>mapping(address=>address)) public issuedDeliverables;
event Reading(address _meter_point,uint256 _power);
struct reading {
uint256 time;
uint256 power;
Expand All @@ -137,15 +155,15 @@ contract MPO is owned {
}

function storeReading(uint256 _reading) {
if((approvedMeterPoints[msg.sender]!=4)&&(approvedMeterPoints[msg.sender]!=5)) throw;
if(readings[msg.sender].power>_reading) throw;
if(readings[msg.sender].power<_reading) {
Delivery delivery = new Delivery(roles,msg.sender,approvedMeterPoints[msg.sender],readings[msg.sender].time,now,_reading-readings[msg.sender].power);
IssuedDelivery(address(delivery),msg.sender,approvedMeterPoints[msg.sender],readings[msg.sender].time,now,_reading-readings[msg.sender].power);
issuedDeliverables[msg.sender][address(lastDelivery[msg.sender])]=address(delivery);
lastDelivery[msg.sender]=delivery;
address nextOwner = msg.sender;
address provider = roles.relations(msg.sender,roles.roles(3));
if((approvedMeterPoints[tx.origin]!=4)&&(approvedMeterPoints[tx.origin]!=5)) throw;
if(readings[tx.origin].power>_reading) throw;
if(readings[tx.origin].power<_reading) {
Delivery delivery = new Delivery(roles,tx.origin,approvedMeterPoints[tx.origin],readings[tx.origin].time,now,_reading-readings[tx.origin].power);
IssuedDelivery(address(delivery),tx.origin,approvedMeterPoints[tx.origin],readings[tx.origin].time,now,_reading-readings[tx.origin].power);
issuedDeliverables[tx.origin][address(lastDelivery[tx.origin])]=address(delivery);
lastDelivery[tx.origin]=delivery;
address nextOwner = tx.origin;
address provider = roles.relations(tx.origin,roles.roles(3));
if(address(0)!=provider) {
nextOwner=provider;
// DeliveryReceiver provider_receiver = DeliveryReceiver(provider);
Expand All @@ -155,14 +173,15 @@ contract MPO is owned {



address dso = roles.relations(msg.sender,roles.roles(2));
address dso = roles.relations(tx.origin,roles.roles(2));
if(dso!=address(0)) {
DeliveryReceiver provider_dso = DeliveryReceiver(dso);
provider_dso.process(delivery);
}

}
readings[msg.sender]=reading(now,_reading);
readings[tx.origin]=reading(now,_reading);
Reading(tx.origin,_reading);
}

}
Expand Down
1 change: 0 additions & 1 deletion smart_contracts/StromDAO-BO.sol:Billing.bin

This file was deleted.

1 change: 0 additions & 1 deletion smart_contracts/StromDAO-BO.sol:Clearable.bin

This file was deleted.

Loading

0 comments on commit 478f025

Please sign in to comment.