diff --git a/app/controllers/amendments.js b/app/controllers/amendments.js index 18ef5cac3cddd48da4d0c70625654d39b246b4b2..da8fb40c1b60b7e08f3c8c8c8b037fc649e4f1fe 100644 --- a/app/controllers/amendments.js +++ b/app/controllers/amendments.js @@ -23,21 +23,11 @@ function AmendmentBinding (hdcServer) { // Services var ParametersService = hdcServer.ParametersService; - var MerkleService = hdcServer.MerkleService; - var VoteService = hdcServer.VoteService; - var StrategyService = hdcServer.StrategyService; - var PeeringService = hdcServer.PeeringService; - var SyncService = hdcServer.SyncService; - var ContractService = hdcServer.ContractService; // Models var Amendment = hdcServer.conn.model('Amendment'); var Merkle = hdcServer.conn.model('Merkle'); - this.promoted = function (req, res) { - showAmendment(res, ContractService.current()); - }; - this.promotedNumber = function (req, res) { async.waterfall([ function (next){ @@ -57,125 +47,6 @@ function AmendmentBinding (hdcServer) { }); }); }; - - this.viewAM = { - - signatures: function (req, res) { - amendmentMerkle(req, res, Merkle.signaturesOfAmendment.bind(Merkle), Merkle.mapForSignatures.bind(Merkle)); - }, - - self: function (req, res) { - ParametersService.getAmendmentID(req, function (err, number, hash) { - if(err){ - res.send(400, err); - return; - } - async.waterfall([ - function (next){ - ParametersService.getAmendmentID(req, next); - }, - function (number, hash, next){ - Amendment.findByNumberAndHash(number, hash, next); - }, - ], function (err, found) { - if(err){ - res.send(404, err); - return; - } - res.setHeader("Content-Type", "text/plain"); - res.send(JSON.stringify(found.json(), null, " ")); - }); - }); - } - }; - - this.votes = { - - sigs: function (req, res) { - async.waterfall([ - function (next){ - ParametersService.getAmendmentID(req, next); - }, - function (number, hash, next){ - Merkle.signaturesOfAmendment(number, hash, function (err, merkle) { - next(err, merkle, number); - }); - }, - function (merkle, number, next){ - MerkleService.processForURL(req, merkle, async.apply(Merkle.mapForSignatures.bind(Merkle), number), next); - } - ], function (err, json) { - if(err){ - res.send(400, err); - return; - } - MerkleService.merkleDone(req, res, json); - }); - }, - - get: function (req, res) { - VoteService.votesIndex(function (err, json) { - if(err){ - res.send(500, err); - return; - } - if(req.query.nice){ - res.setHeader("Content-Type", "text/plain"); - res.end(JSON.stringify(json, null, " ")); - } - else res.end(JSON.stringify(json)); - }); - }, - - post: function (req, res) { - var onError = http400(res); - http2raw.vote(req, onError) - .pipe(unix2dos()) - .pipe(parsers.parseVote(onError)) - .pipe(versionFilter(onError)) - .pipe(currencyFilter(conf.currency, onError)) - .pipe(extractSignature(onError)) - .pipe(link2pubkey(hdcServer.PublicKeyService, onError)) - .pipe(verifySignature(onError)) - .pipe(hdcServer.singleWriteStream(onError)) - .pipe(jsoner()) - .pipe(es.stringify()) - .pipe(res); - } - } -} - -function amendmentMerkle (req, res, merkleSource, merkleMap) { - ParametersService.getAmendmentID(req, function (err, number, hash) { - if(err){ - res.send(400, err); - return; - } - async.waterfall([ - function (next){ - Amendment.findByNumberAndHash(number, hash, next); - }, - ], function (err, am) { - if(err){ - res.send(404, err); - return; - } - async.waterfall([ - function (next){ - merkleSource.call(merkleSource, am.number, am.hash, next); - }, - function (merkle, next){ - MerkleService.processForURL(req, merkle, merkleMap, next); - } - ], function (err, json) { - if(err){ - res.send(400, err); - return; - } - MerkleService.merkleDone(req, res, json); - }); - }); - }); } function showAmendment (res, current) { diff --git a/app/controllers/keychain.js b/app/controllers/keychain.js new file mode 100644 index 0000000000000000000000000000000000000000..a41c5f4457d38e451ba620382fe7d95eebb247ff --- /dev/null +++ b/app/controllers/keychain.js @@ -0,0 +1,66 @@ +var jpgp = require('../lib/jpgp'); +var async = require('async'); +var vucoin = require('vucoin'); +var _ = require('underscore'); +var es = require('event-stream'); +var unix2dos = require('../lib/unix2dos'); +var versionFilter = require('../lib/streams/versionFilter'); +var currencyFilter = require('../lib/streams/currencyFilter'); +var http2raw = require('../lib/streams/parsers/http2raw'); +var jsoner = require('../lib/streams/jsoner'); +var http400 = require('../lib/http/http400'); +var parsers = require('../lib/streams/parsers/doc'); +var link2pubkey = require('../lib/streams/link2pubkey'); +var extractSignature = require('../lib/streams/extractSignature'); +var verifySignature = require('../lib/streams/verifySignature'); +var logger = require('../lib/logger')(); +var mlogger = require('../lib/logger')('membership'); + +module.exports = function (wotServer) { + return new KeychainBinding(wotServer); +} + +function KeychainBinding (wotServer) { + + var that = this; + + // Services + var http = wotServer.HTTPService; + var MerkleService = wotServer.MerkleService; + var ParametersService = wotServer.ParametersService; + var PeeringService = wotServer.PeeringService; + var SyncService = wotServer.SyncService; + var ContractService = wotServer.ContractService; + + // Models + var Peer = wotServer.conn.model('Peer'); + var Forward = wotServer.conn.model('Forward'); + var Membership = wotServer.conn.model('Membership'); + var PublicKey = wotServer.conn.model('PublicKey'); + var Merkle = wotServer.conn.model('Merkle'); + var Key = wotServer.conn.model('Key'); + + this.parseMembership = function (req, res) { + var onError = http400(res); + http2raw.membership(req, onError) + .pipe(unix2dos()) + .pipe(parsers.parseMembership(onError)) + .pipe(versionFilter(onError)) + .pipe(currencyFilter(conf.currency, onError)) + .pipe(extractSignature(onError)) + .pipe(link2pubkey(wotServer.PublicKeyService, onError)) + .pipe(verifySignature(onError)) + .pipe(wotServer.singleWriteStream(onError)) + .pipe(jsoner()) + .pipe(es.stringify()) + .pipe(res); + }; + + this.parseKeyblock = function (req, res) { + res.end(503); + } + + this.current = function (req, res) { + res.end(503); + } +} diff --git a/app/controllers/registry.js b/app/controllers/registry.js deleted file mode 100644 index 4377df71c53efe68476dab0e9f4effdcda2178e5..0000000000000000000000000000000000000000 --- a/app/controllers/registry.js +++ /dev/null @@ -1,310 +0,0 @@ -var jpgp = require('../lib/jpgp'); -var async = require('async'); -var vucoin = require('vucoin'); -var _ = require('underscore'); -var es = require('event-stream'); -var unix2dos = require('../lib/unix2dos'); -var versionFilter = require('../lib/streams/versionFilter'); -var currencyFilter = require('../lib/streams/currencyFilter'); -var http2raw = require('../lib/streams/parsers/http2raw'); -var jsoner = require('../lib/streams/jsoner'); -var http400 = require('../lib/http/http400'); -var parsers = require('../lib/streams/parsers/doc'); -var link2pubkey = require('../lib/streams/link2pubkey'); -var extractSignature = require('../lib/streams/extractSignature'); -var verifySignature = require('../lib/streams/verifySignature'); -var logger = require('../lib/logger')(); -var mlogger = require('../lib/logger')('membership'); -var vlogger = require('../lib/logger')('voting'); - -module.exports = function (registryServer, conf) { - return new RegistryBinding(registryServer, conf); -}; - -function RegistryBinding (registryServer, conf) { - - var that = this; - - // Services - var http = registryServer.HTTPService; - var MerkleService = registryServer.MerkleService; - var ParametersService = registryServer.ParametersService; - var PeeringService = registryServer.PeeringService; - var SyncService = registryServer.SyncService; - var ContractService = registryServer.ContractService; - - // Models - var Peer = registryServer.conn.model('Peer'); - var Forward = registryServer.conn.model('Forward'); - var Amendment = registryServer.conn.model('Amendment'); - var Membership = registryServer.conn.model('Membership'); - var Voting = registryServer.conn.model('Voting'); - var PublicKey = registryServer.conn.model('PublicKey'); - var Merkle = registryServer.conn.model('Merkle'); - var Key = registryServer.conn.model('Key'); - - this.parameters = function (req, res) { - res.end(JSON.stringify({ - AMStart: conf.sync.AMStart, - AMFrequency: conf.sync.AMFreq, - UDFrequency: conf.sync.UDFreq, - UD0: conf.sync.UD0, - UDPercent: conf.sync.UDPercent, - UDMinCoin: conf.sync.UDMinCoin, - Consensus: conf.sync.Consensus - }, null, " ")); - }; - - this.membershipPost = function (req, res) { - var onError = http400(res); - http2raw.membership(req, onError) - .pipe(unix2dos()) - .pipe(parsers.parseMembership(onError)) - .pipe(versionFilter(onError)) - .pipe(currencyFilter(conf.currency, onError)) - .pipe(extractSignature(onError)) - .pipe(link2pubkey(registryServer.PublicKeyService, onError)) - .pipe(verifySignature(onError)) - .pipe(registryServer.singleWriteStream(onError)) - .pipe(jsoner()) - .pipe(es.stringify()) - .pipe(res); - }; - - this.membershipCurrent = function (req, res) { - var that = this; - async.waterfall([ - - // Parameters - function(next){ - ParametersService.getFingerprint(req, next); - }, - - function (fingerprint, next) { - Membership.getCurrent(fingerprint, next); - } - - ], function (err, ms) { - if (!ms) { - res.send(404, "Not found"); - return; - } - http.answer(res, 400, err, function () { - res.end(JSON.stringify(ms.json(), null, " ")); - }); - }); - }; - - this.membershipHistory = function (req, res) { - var that = this; - async.waterfall([ - - // Parameters - function(next){ - ParametersService.getFingerprint(req, next); - }, - - function (fingerprint, next) { - Membership.getHistory(fingerprint, next); - } - - ], function (err, history) { - var list = []; - history.forEach(function(ms){ - list.push(ms.json()); - }); - http.answer(res, 400, err, function () { - res.end(JSON.stringify(list, null, " ")); - }); - }); - }; - - this.votingPost = function (req, res) { - var onError = http400(res); - http2raw.voting(req, onError) - .pipe(unix2dos()) - .pipe(parsers.parseVoting(onError)) - .pipe(versionFilter(onError)) - .pipe(currencyFilter(conf.currency, onError)) - .pipe(extractSignature(onError)) - .pipe(link2pubkey(registryServer.PublicKeyService, onError)) - .pipe(verifySignature(onError)) - .pipe(registryServer.singleWriteStream(onError)) - .pipe(jsoner()) - .pipe(es.stringify()) - .pipe(res); - }; - - this.votingCurrent = function (req, res) { - var that = this; - async.waterfall([ - - // Parameters - function(next){ - ParametersService.getFingerprint(req, next); - }, - - function (fingerprint, next) { - Voting.getCurrent(fingerprint, next); - } - - ], function (err, voting) { - if (!voting) { - res.send(404, "Not found"); - return; - } - http.answer(res, 400, err, function () { - res.end(JSON.stringify(voting.json(), null, " ")); - }); - }); - }; - - this.votingHistory = function (req, res) { - var that = this; - async.waterfall([ - - // Parameters - function(next){ - ParametersService.getFingerprint(req, next); - }, - - function (fingerprint, next) { - Voting.getHistory(fingerprint, next); - } - - ], function (err, history) { - var list = []; - history.forEach(function(voting){ - list.push(voting.json()); - }); - http.answer(res, 400, err, function () { - res.end(JSON.stringify(list, null, " ")); - }); - }); - }; - - this.membersIn = function (req, res) { - processMerkle(Merkle.membersIn.bind(Merkle), Merkle.mapForMemberships.bind(Merkle), req, res); - }; - - this.membersOut = function (req, res) { - processMerkle(Merkle.membersOut.bind(Merkle), Merkle.mapForMemberships.bind(Merkle), req, res); - }; - - this.votersIn = function (req, res) { - processMerkle(Merkle.votersIn.bind(Merkle), Merkle.mapForVotings.bind(Merkle), req, res); - }; - - this.votersOut = function (req, res) { - processMerkle(Merkle.votersOut.bind(Merkle), Merkle.mapForVotings.bind(Merkle), req, res); - }; - - this.statementPost = function (req, res) { - var onError = http400(res); - http2raw.communityFlow(req, onError) - .pipe(unix2dos()) - .pipe(parsers.parseStatement(onError)) - .pipe(versionFilter(onError)) - .pipe(currencyFilter(conf.currency, onError)) - .pipe(extractSignature(onError)) - .pipe(link2pubkey(registryServer.PublicKeyService, onError)) - .pipe(verifySignature(onError)) - .pipe(registryServer.singleWriteStream(onError)) - .pipe(jsoner()) - .pipe(es.stringify()) - .pipe(res); - }; - - function processMerkle (getMerkle, mapMerkle, req, res) { - var that = this; - async.waterfall([ - function (next) { - ParametersService.getAmendmentNumberAndAlgo(req, next); - }, - function (number, algo, next){ - getMerkle(number, algo, next); - }, - function (merkle, next){ - MerkleService.processForURL(req, merkle, mapMerkle, next); - } - ], function (err, json) { - if(err){ - res.send(400, err); - return; - } - MerkleService.merkleDone(req, res, json); - }); - } - - this.askSelf = function (req, res) { - async.waterfall([ - - function (next){ - ParametersService.getAmendmentNumberAndAlgo(req, next); - }, - function (amNumber, algo, next){ - Amendment.getTheOneToBeVoted(amNumber, algo, next); - }, - - ], function (err, am) { - http.answer(res, 404, err, function () { - // Render the amendment - res.end(JSON.stringify(am.json(), null, " ")); - }); - }); - }; - - this.askStatement = function (req, res) { - var that = this; - async.waterfall([ - - // Parameters - function(next){ - ParametersService.getAmendmentNumberAndAlgo(req, next); - }, - - function (amNumber, algo, next) { - SyncService.getStatement(parseInt(amNumber), algo, next) - }, - - ], function (err, cf, am) { - - http.answer(res, 404, err, function () { - res.end(JSON.stringify({ - "statement": cf.json() - }, null, " ")); - }); - }); - }; - - this.askVote = function (req, res) { - var that = this; - async.waterfall([ - - // Parameters - function(next){ - ParametersService.getAmendmentNumberAndAlgo(req, next); - }, - - function (amNumber, algo, next) { - SyncService.getVote(amNumber, algo, next); - }, - - function (vote, next){ - vote.getAmendment(function (err, am) { - next(err, vote, am); - }); - }, - - ], function (err, vote, am) { - - http.answer(res, 404, err, function () { - res.end(JSON.stringify({ - "issuer": vote.issuer, - "amendment": am.json(), - "signature": vote.signature - }, null, " ")); - }); - }); - }; -} diff --git a/app/lib/algos/community/1Sig.js b/app/lib/algos/community/1Sig.js deleted file mode 100644 index 8ff0c2dffa27d45c42fb7866ab447d4d91dd8497..0000000000000000000000000000000000000000 --- a/app/lib/algos/community/1Sig.js +++ /dev/null @@ -1,97 +0,0 @@ -var async = require('async'); -var common = require('./common'); -var hexstrdump = require('../../hexstrdump'); -var jpgp = require('../../jpgp'); -var parsers = require('../../streams/parsers/doc'); - -module.exports = function (isMemberFunc, getPubkeyFunc) { - return function (pkey, ctx, amNext, done) { - async.waterfall([ - function (next){ - parsers.parsePubkey(next).asyncWrite(pkey.raw, next); - }, - function (betterPubkey, next) { - async.detect(betterPubkey.udid2s, function (udid2, cb) { - var nbMatching = 0; - async.forEach(udid2.signatures || [], function (certification, cb2) { - var issuer = hexstrdump(certification.issuerKeyId.bytes).toUpperCase(); - async.waterfall([ - function (next){ - getPubkeyFunc(issuer, next); - }, - function (issuerPubkey, next){ - isMemberFunc(issuerPubkey.fingerprint, function (err, isOK) { - next(err || (!isOK && "Signatory is not a member"), issuerPubkey); - }); - }, - function (issuerPubkey, next) { - var certSignatory = jpgp().certificate(issuerPubkey.raw); - var certOwner = jpgp().certificate(pkey.raw); - var verified = certification.verify(certSignatory.key.primaryKey, { userid: udid2.user.userId, key: certOwner.key.primaryKey }); - next((!verified && "Certification verification gives FALSE") || null, verified); - } - ], function (err, verified) { - if (verified) nbMatching++; - cb2(err); - }); - }, function (err) { - cb(nbMatching >= 1); - }); - }, function (detected) { - if (detected != undefined) - next(null, { nbVerifiedSigs: 1 }); - else - next(null, { nbVerifiedSigs: 0 }); - }); - }, - function (virtualPubkey, next){ - common.computeIndicators(virtualPubkey, ctx, amNext, context2AnalyticalMembership, context2AnalyticalVoting, next); - }, - ], done); - }; -} - -var VTExpires = 3600*24*14; // Every 14 days - - -/** -* Converts member context vars to analytical expression parameters (for computing functions' namespace) -*/ -function context2AnalyticalMembership (pubkey, context, done) { - var ctx = context || { currentMembership: null, nextMembership: null }; - var isMember = ctx.currentMembership && ctx.currentMembership.membership == 'IN'; - var ms = [ - isMember ? 1 : 0, - !isMember ? 1 : 0, - ]; - var hasInvalidKey = (pubkey.nbVerifiedSigs || 0) < 1; - var hasNextIn = ctx.nextMembership && ctx.nextMembership.membership == 'IN'; - var hasNextOut = ctx.nextMembership && ctx.nextMembership.membership == 'OUT'; - var p = [ - hasInvalidKey ? 1 : 0, - hasNextIn ? 1 : 0, - hasNextOut ? 1 : 0, - ]; - done(null, ms, p); -} - -/** -* Converts voter context vars to analytical expression parameters (for computing functions' namespace) -*/ -function context2AnalyticalVoting (context, amNext, memberLeaving, done) { - var ctx = context || { voterOn: null, nextVoting: null }; - var isVoter = ctx.voterOn > 0; - var isTooOldVT = isVoter && ctx.voterOn + VTExpires < amNext.generated; - var vt = [ - !isTooOldVT && !isVoter ? 1 : 0, - !isTooOldVT && isVoter ? 1 : 0, - isTooOldVT ? 1 : 0 - ]; - var hasNextVoting = ctx.nextVoting; - var p = [ - 1, - hasNextVoting ? 1 : 0, - memberLeaving == 1 ? 1 : 0 - ]; - done(null, vt, p); -} diff --git a/app/lib/algos/community/AnyKey.js b/app/lib/algos/community/AnyKey.js deleted file mode 100644 index 7a73dc736124bfe354b2dc98c3364ab53228cb51..0000000000000000000000000000000000000000 --- a/app/lib/algos/community/AnyKey.js +++ /dev/null @@ -1,50 +0,0 @@ -var common = require('./common'); - -module.exports = function (pubkey, ctx, amNext, done) { - common.computeIndicators(pubkey, ctx, amNext, context2AnalyticalMembership, context2AnalyticalVoting, done); -} - -var VTExpires = 3600*24*14; // Every 14 days - - -/** -* Converts member context vars to analytical expression parameters (for computing functions' namespace) -*/ -function context2AnalyticalMembership (pubkey, context, done) { - var ctx = context || { currentMembership: null, nextMembership: null }; - var isMember = ctx.currentMembership && ctx.currentMembership.membership == 'IN'; - var ms = [ - isMember ? 1 : 0, - !isMember ? 1 : 0, - ]; - var hasInvalidKey = false; // Key never expires in such algorithm - var hasNextIn = ctx.nextMembership && ctx.nextMembership.membership == 'IN'; - var hasNextOut = ctx.nextMembership && ctx.nextMembership.membership == 'OUT'; - var p = [ - hasInvalidKey ? 1 : 0, - hasNextIn ? 1 : 0, - hasNextOut ? 1 : 0, - ]; - done(null, ms, p); -} - -/** -* Converts voter context vars to analytical expression parameters (for computing functions' namespace) -*/ -function context2AnalyticalVoting (context, amNext, memberLeaving, done) { - var ctx = context || { voterOn: null, nextVoting: null }; - var isVoter = ctx.voterOn > 0; - var isTooOldVT = isVoter && ctx.voterOn + VTExpires < amNext.generated; - var vt = [ - !isTooOldVT && !isVoter ? 1 : 0, - !isTooOldVT && isVoter ? 1 : 0, - isTooOldVT ? 1 : 0 - ]; - var hasNextVoting = ctx.nextVoting; - var p = [ - 1, - hasNextVoting ? 1 : 0, - memberLeaving == 1 ? 1 : 0 - ]; - done(null, vt, p); -} diff --git a/app/lib/algos/community/common.js b/app/lib/algos/community/common.js deleted file mode 100644 index b67f9b3df314f8bc2727648177c8dc6713a4223c..0000000000000000000000000000000000000000 --- a/app/lib/algos/community/common.js +++ /dev/null @@ -1,28 +0,0 @@ -var async = require('async'); -var computing = require('./computing'); - -module.exports = { computeIndicators: computeIndicators }; - -/** -* Compute member's indicators according to a given context. -*/ -function computeIndicators (pubkey, ctx, amNext, context2AnalyticalMembership, context2AnalyticalVoting, done) { - var res = {}; - async.waterfall([ - async.apply(context2AnalyticalMembership, pubkey, ctx), - async.apply(computing.Membership.Delta), - function (msIndicator, next){ - res.membership = Math.max(-1, Math.min(1, msIndicator)); - context2AnalyticalVoting(ctx, amNext, res.membership == -1, next); - }, - async.apply(computing.Voting), - function (vtIndicator, next) { - res.key = vtIndicator; - next(); - } - ], function (err) { - // Mark out indicators to -1 and 1 - res.key = Math.max(-1, Math.min(1, res.key)); - done(err, res); - }); -} diff --git a/app/lib/algos/community/computing.js b/app/lib/algos/community/computing.js deleted file mode 100644 index 0eb4e1dd553a004c984a077fec572b28875f6055..0000000000000000000000000000000000000000 --- a/app/lib/algos/community/computing.js +++ /dev/null @@ -1,80 +0,0 @@ -var Computing = { Membership: {}, Voting: {} }; - -/** -* Computes changes for a key, given its current state + changes. -* @parameter ms Array of 4 Integers: [currentNone, currentIn, currentOut, currentInTooOld]. -* Each integer is either 1 or 0: -* * currentNone: 1 if current membership of a key doesn't exist, 0 otherwise -* * currentIn: 1 if current membership of a key is a valid IN, 0 otherwise -* * currentOut: 1 if current membership of a key is OUT, 0 otherwise -* * currentInTooOld: 1 if current membership of a key is a too old IN, 0 otherwise -* __Sum of those 4 integers MUST always be 1.__ -* -* @parameter p Array of 4 Integers: [newNone, newIn, newOut, newInCancelled, newOutCancelled]. -* Each integer is either 1 or 0: -* * newNone: 1 if new membership of a key doesn't exist, 0 otherwise -* * newIn: 1 if new membership of a key is IN, 0 otherwise -* * newOut: 1 if new membership of a key is OUT, 0 otherwise -* * newInCancelled: 1 if new membership of a key is IN, which has been cancelled, 0 otherwise -* * newOutCancelled: 1 if new membership of a key is OUT, which has been cancelled, 0 otherwise -*/ -Computing.Membership.Delta = function (ms, p, done) { - - if (ms.reduce(function(a,b){ return a + b; }) !== 1) { - done('Wrong membership state array: should be either in, out, in too old or no membership at all.'); - } - - /** - * Computes changes for a key given changes with and initial state - * @param m 1 if initial state is no membership, 0 otherwise - * @param p array of changes - */ - function IsMember (p) { - return - p[0] - p[2]; - } - - /** - * Computes changes for a key given changes with and initial state - * @param m 1 if initial state is no membership, 0 otherwise - * @param p array of changes - */ - function IsNotMember (p) { - return - p[0] + p[1]; - } - - done(null, ms[0]*IsMember(p) + ms[1]*IsNotMember(p)); -} - -/** -* Computes changes for a voter, using given voting & membership events. -* @parameter vt Array of 2 Integers: [wasNotVoter, wasVoter]. -* Each integer is either 1 or 0: -* * wasNotVoter: 1 if key was not voter, 0 otherwise -* * wasVoter: 1 if key was voter, 0 otherwise -* __Sum of those 2 integers MUST always be 1.__ - -* @parameter p Array of 4 Integers: [hasNotVoted, hasVoted, hasNewVoting, isLeavingMember]. -* Each integer is either 1 or 0: -* * hasNotVoted: 1 if voter has voted current amendment, 0 otherwise -* * hasVoted: 1 if voter has voted current amendment, 0 otherwise -* * hasNewVoting: 1 if member submitted new voting key, 0 otherwise -* * isLeavingMember: 1 if member is leaving, 0 otherwise -*/ -Computing.Voting = function (vt, p, done) { - - done(null, vt[0]*IsNotVoter(p) + vt[1]*IsVoter(p) + vt[2]*IsVoterTooOld(p)); -} - -function IsNotVoter (p) { - return 2*p[1] - 3*p[2]; -} - -function IsVoter (p) { - return 2*p[1] - 3*p[2]; -} - -function IsVoterTooOld (p) { - return - p[0] + 2*p[1] - 3*p[2]; -} - -module.exports = Computing; diff --git a/app/lib/daemon.js b/app/lib/daemon.js deleted file mode 100644 index 8ac0571a307dde6849eaf6a7fccf2487771e273e..0000000000000000000000000000000000000000 --- a/app/lib/daemon.js +++ /dev/null @@ -1,162 +0,0 @@ -var express = require('express'); -var request = require('request'); -var http = require('http'); -var fs = require('fs'); -var async = require('async'); -var path = require('path'); -var connectPgp = require('connect-pgp'); -var _ = require('underscore'); -var jpgp = require('./jpgp'); -var sha1 = require('sha1'); -var vucoin = require('vucoin'); -var logger = require('./logger')('daemon'); - -module.exports = function (regServer) { - return new Daemon(regServer); -}; - -function Daemon (regServer) { - - var conn = regServer.conn; - var PeeringService = regServer.PeeringService; - var ContractService = regServer.ContractService; - var SyncService = regServer.SyncService; - var Amendment = conn.model('Amendment'); - var Key = conn.model('Key'); - - // self reference, private scope - var daemon = this; - - var AMStart, AMFreq, Algorithm, enabled; - var timeoutID, frequency; - var asked = -1; - var processing = false; - var defaultTimeout = 10*60*1000; - var selfFingerprint = ""; - - // 20 seconds minimal waiting before asking for vote - var voteMargin = 1*1000; - - this.init = function (conf, fingerprint) { - AMStart = conf.sync.AMStart; - AMFreq = conf.sync.AMFreq; - Algorithm = conf.sync.Algorithm; - enabled = conf.sync.AMDaemon == "ON"; - selfFingerprint = fingerprint; - }; - - this.nextIn = function (timeout) { - if (enabled) { - timeout = Math.max(0, timeout); - logger.debug("Daemon is asked to process in %ss", timeout/1000); - if (!processing) { - process(timeout, process); - } else { - asked = timeout; - } - } - }; - - this.start = function () { - if (enabled) { - if (!AMStart || !AMFreq) { - throw new Error("Daemon not initialized."); - } - logger.debug("Daemon started."); - daemon.nextIn(0); - } - }; - - function process (timeout, done) { - logger.debug("Daemon will process in %ss", timeout/1000); - clearTimeout(timeoutID); - processing = false; - timeoutID = setTimeout(function () { - processing = true; - doStuff(function (err, wouldWait) { - if (err) - logger.error(err); - var delay = wouldWait; - if (asked >= 0) { - delay = Math.min(delay, asked); - asked = -1; - } - done(delay, process); - }); - }, timeout); - } - - var lastTried = 0; - - function doStuff (done) { - var now = new Date().timestamp(); - var current = ContractService.current(); - async.waterfall([ - function (next){ - // Asking votes for next - if (current && now > current.generated + AMFreq) { - var amNext = new Amendment({ generated: current.generated + AMFreq }); - async.auto({ - triggerSelfCFlow: function(callback){ - // Case 1: just triggers self-vote - if (daemon.judges.timeForVote(amNext) && lastTried != amNext.generated) { - lastTried = amNext.generated; - // Must be a voter to vote! - Key.wasVoter(selfFingerprint, current.number, function (err, wasVoter) { - if (!err && wasVoter) { - logger.debug("Asking Statement for SELF peer"); - async.forEach(Algorithm, function(algo, callback){ - async.waterfall([ - function (next){ - SyncService.getStatement(current.number + 1, algo, next); - }, - function (statement, next){ - regServer.submit(statement, false, next); - }, - ], callback); - }, function(err){ - next(err); - }); - return; - } - callback(err); - }); - return; - } - callback(); - }, - }, function (err) { - next(err); - }); - } - else { - if (current) { - var nextTime = new Date(); - nextTime.setTime((current.generated + AMFreq)*1000); - logger.debug("Next amendment on " + nextTime.toLocaleString()); - next(null, (nextTime.timestamp() + voteMargin/1000 - now)*1000); - return; - } - next(); - } - }, - ], function (err, waiting) { - done(err, waiting || defaultTimeout); - }); - } - - this.stop = function () { - clearTimeout(timeoutID); - }; - - this.judges = { - - timeForVote: function (amNext) { - return new Date().utc().timestamp() >= amNext.generated; - }, - - timeForAskingVotes: function (amNext) { - return new Date().utc().timestamp() >= amNext.generated + 60; // 1min later - } - }; -} \ No newline at end of file diff --git a/app/lib/rawer.js b/app/lib/rawer.js index 36e183037ceec46466c66cdb915c8ff056221a52..6f268ef0d9ec9e22445bde215a0e0d03622b96a4 100644 --- a/app/lib/rawer.js +++ b/app/lib/rawer.js @@ -16,7 +16,6 @@ module.exports = new function() { raw += "CoinBase: " + json.coinBase + "\n"; raw += "CoinList: " + json.coinList.join(' ') + "\n"; } - raw += "NextRequiredVotes: " + json.nextVotes + "\n"; if(json.previousHash){ raw += "PreviousHash: " + json.previousHash + "\n"; } @@ -28,19 +27,9 @@ module.exports = new function() { raw += json.membersChanges[i] + "\n"; } } - raw += "VotersRoot: " + json.votersRoot + "\n"; - raw += "VotersCount: " + json.votersCount + "\n"; - raw += "VotersChanges:\n"; - for(var j = 0; j < json.votersChanges.length; j++){ - raw += json.votersChanges[j] + "\n"; - } return unix2dos(raw); }; - this.getVote = function (json) { - return unix2dos(signed(that.getAmendment(json.amendment), json)); - }; - this.getPubkey = function (json) { return unix2dos(json.raw); }; @@ -170,33 +159,6 @@ module.exports = new function() { return unix2dos(raw); }; - this.getVoting = function (json) { - return unix2dos(signed(that.getVotingWithoutSignature(json), json)); - }; - - this.getStatementWithoutSignature = function (json) { - var raw = ""; - raw += "Version: " + json.version + "\n"; - raw += "Currency: " + json.currency + "\n"; - raw += "Amendment: " + [json.amendmentNumber, json.amendmentHash].join('-') + "\n"; - raw += "Issuer: " + json.issuer + "\n"; - raw += "Date: " + json.date.timestamp() + "\n"; - raw += "Algorithm: " + json.algorithm + "\n"; - if (json.membersJoiningRoot) - raw += "MembersJoining: " + [json.membersJoiningCount, json.membersJoiningRoot].join('-') + "\n"; - if (json.membersLeavingRoot) - raw += "MembersLeaving: " + [json.membersLeavingCount, json.membersLeavingRoot].join('-') + "\n"; - if (json.votersJoiningRoot) - raw += "VotersJoining: " + [json.votersJoiningCount, json.votersJoiningRoot].join('-') + "\n"; - if (json.votersLeavingRoot) - raw += "VotersLeaving: " + [json.votersLeavingCount, json.votersLeavingRoot].join('-') + "\n"; - return unix2dos(raw); - }; - - this.getStatement = function (json) { - return unix2dos(signed(that.getStatementWithoutSignature(json), json)); - }; - function signed (raw, json) { if (json.signature) raw += json.signature; diff --git a/app/lib/streams/multicaster.js b/app/lib/streams/multicaster.js index 66be1f18b5c134a1b16e86319eeaf826f40dea7b..37110b609c00c7d8b81d3c9b312ad475beeb77d9 100644 --- a/app/lib/streams/multicaster.js +++ b/app/lib/streams/multicaster.js @@ -34,17 +34,6 @@ function Multicaster () { }); }); - that.on('vote', function(vote, peers) { - logger.debug('--> new Vote to be sent to %s peer(s)', peers.length); - peers.forEach(function(peer){ - fifo.push(function (sent) { - sendVote(peer, vote, success(function (err) { - sent(); - })); - }); - }); - }); - that.on('transaction', function(transaction, peers) { logger.debug('--> new Transaction to be sent to %s peer(s)', peers.length); peers.forEach(function(peer){ @@ -115,30 +104,6 @@ function Multicaster () { }); }); - that.on('voting', function(voting, peers) { - logger.debug('--> new Voting to be sent to %s peer(s)', peers.length); - peers.forEach(function(peer){ - fifo.push(function (sent) { - sendVoting(peer, voting, success(function (err) { - sent(); - })); - }); - }); - }); - - that.on('statement', function(statement, peers) { - logger.debug('--> new Statement to be sent to %s peer(s)', peers.length); - peers.forEach(function(peer){ - fifo.push(function (sent) { - // Do propagating - logger.debug('sending %s\'s statement to peer %s', statement.keyID(), peer.keyID()); - sendStatement(peer, statement, success(function (err) { - sent(); - })); - }); - }); - }); - that.on('forward', function(forward, peers, done) { logger.debug('--> new Forward to be sent to %s peer(s)', peers.length); fifo.push(function (sent) { @@ -178,14 +143,6 @@ function sendPubkey(peer, pubkey, done) { }, done); } -function sendVote(peer, vote, done) { - logger.info('POST vote to %s', peer.keyID()); - post(peer, '/hdc/amendments/votes', { - "amendment": vote.getRaw(), - "signature": vote.signature - }, done); -} - function sendTransaction(peer, transaction, done) { logger.info('POST transaction to %s', peer.keyID()); post(peer, '/hdc/transactions/process', { @@ -226,22 +183,6 @@ function sendMembership(peer, membership, done) { }, done); } -function sendVoting(peer, voting, done) { - logger.info('POST voting to %s', peer.keyID()); - post(peer, '/registry/community/voters', { - "voting": voting.getRaw(), - "signature": voting.signature - }, done); -} - -function sendStatement(peer, statement, done) { - logger.info('POST statement to %s', peer.keyID()); - post(peer, '/registry/amendment/statement', { - "statement": statement.getRaw(), - "signature": statement.signature - }, done); -} - function success (done) { return function (err, res, body) { if (err) { diff --git a/app/lib/streams/parsers/doc/amendment.js b/app/lib/streams/parsers/doc/amendment.js deleted file mode 100644 index d7b0681a72e6d2bc23fb82654544722ae5b1e342..0000000000000000000000000000000000000000 --- a/app/lib/streams/parsers/doc/amendment.js +++ /dev/null @@ -1,26 +0,0 @@ -var VoteParser = require('./vote'); -var util = require('util'); -var split = require('../../../split'); -var rawer = require('../../../rawer'); -var _ = require('underscore'); - -module.exports = AmendmentParser; - -function AmendmentParser (onError) { - - VoteParser.call(this, onError); - - this.rawerFunc = rawer.getAmendment; - - var parentVerify = this._verify; - - this._clean = function (obj) { - this.cleanAmendment(obj); - } - - this._verify = function (obj) { - parentVerify({ amendment: obj }); - } -} - -util.inherits(AmendmentParser, VoteParser); diff --git a/app/lib/streams/parsers/doc/index.js b/app/lib/streams/parsers/doc/index.js index ac3bf252f2b9490be8df19453b11b625092fdf56..4d7b173d9b134544510dbcf127ab9288cb5c1d28 100644 --- a/app/lib/streams/parsers/doc/index.js +++ b/app/lib/streams/parsers/doc/index.js @@ -1,6 +1,4 @@ module.exports = { - parseAmendment: instanciate.bind(instanciate, require('./amendment')), - parseVote: instanciate.bind(instanciate, require('./vote')), parsePubkey: instanciate.bind(instanciate, require('./pubkey')), parseTransaction: instanciate.bind(instanciate, require('./transaction')), parsePeer: instanciate.bind(instanciate, require('./peer')), @@ -8,8 +6,6 @@ module.exports = { parseStatus: instanciate.bind(instanciate, require('./status')), parseWallet: instanciate.bind(instanciate, require('./wallet')), parseMembership: instanciate.bind(instanciate, require('./membership')), - parseVoting: instanciate.bind(instanciate, require('./voting')), - parseStatement: instanciate.bind(instanciate, require('./statement')), }; function instanciate (constructorFunc, onError) { diff --git a/app/lib/streams/parsers/doc/statement.js b/app/lib/streams/parsers/doc/statement.js deleted file mode 100644 index 6929c16984e0ac29cda9712a5eaf576a21bdb0e0..0000000000000000000000000000000000000000 --- a/app/lib/streams/parsers/doc/statement.js +++ /dev/null @@ -1,102 +0,0 @@ -var GenericParser = require('./GenericParser'); -var rawer = require('../../../rawer'); -var util = require('util'); -var sha1 = require('sha1'); -var split = require('../../../split'); -var unix2dos = require('../../../unix2dos'); -var _ = require('underscore'); - -module.exports = StatementParser; - -function StatementParser (onError) { - - var captures = [ - {prop: "version", regexp: /Version: (.*)/}, - {prop: "currency", regexp: /Currency: (.*)/}, - {prop: "amendmentNumber", regexp: /Amendment: (.*)/, parser: parseAmendmentNumber}, - {prop: "amendmentHash", regexp: /Amendment: (.*)/, parser: parseAmendmentHash}, - {prop: "algorithm", regexp: /Algorithm: (.*)/}, - {prop: "membersJoiningCount", regexp: /MembersJoining: (.*)/, parser: parseMerkleNumber}, - {prop: "membersJoiningRoot", regexp: /MembersJoining: (.*)/, parser: parseMerkleRoot}, - {prop: "membersLeavingCount", regexp: /MembersLeaving: (.*)/, parser: parseMerkleNumber}, - {prop: "membersLeavingRoot", regexp: /MembersLeaving: (.*)/, parser: parseMerkleRoot}, - {prop: "votersJoiningCount", regexp: /VotersJoining: (.*)/, parser: parseMerkleNumber}, - {prop: "votersJoiningRoot", regexp: /VotersJoining: (.*)/, parser: parseMerkleRoot}, - {prop: "votersLeavingCount", regexp: /VotersLeaving: (.*)/, parser: parseMerkleNumber}, - {prop: "votersLeavingRoot", regexp: /VotersLeaving: (.*)/, parser: parseMerkleRoot}, - {prop: "issuer", regexp: /Issuer: (.*)/}, - {prop: "date", regexp: /Date: (.*)/, parser: parseDateFromTimestamp} - ]; - var multilineFields = []; - GenericParser.call(this, captures, multilineFields, rawer.getStatement, onError); - - this._clean = function (obj) { - }; - - this._verify = function(obj){ - var err = null; - var code = 150; - var codes = { - 'BAD_VERSION': 150, - 'BAD_CURRENCY': 151, - 'BAD_FINGERPRINT': 152, - 'BAD_THRESHOLD': 153, - 'BAD_AM_NUMBER': 154, - 'BAD_AM_HASH': 155, - 'BAD_MERKLE_SUMMARY': 156, - } - if(!err){ - // Version - if(!obj.version || !obj.version.match(/^1$/)) - err = {code: codes['BAD_VERSION'], message: "Version unknown"}; - } - if(!err){ - // Fingerprint - if(obj.issuer && !obj.issuer.match(/^[A-Z\d]+$/)) - err = {code: codes['BAD_FINGERPRINT'], message: "Incorrect issuer field"}; - } - if(!err){ - // Date - if(obj.date && (typeof obj == 'string' ? !obj.date.match(/^\d+$/) : obj.date.timestamp() <= 0)) - err = {code: codes['BAD_DATE'], message: "Incorrect Date field: must be a positive or zero integer"}; - } - if(!err){ - // Amendment - if(!err && !obj.amendmentHash.match(/^[A-Z\d]+$/)) - err = {code: codes['BAD_FIELD'], message: "Incorrect amendment field: must be contain an amendment"}; - } - ['membersJoiningRoot', 'membersLeavingRoot', 'votersJoiningRoot', 'votersLeavingRoot'].forEach(function(field){ - if(!err && obj[field] && !obj[field].match(/^[A-Z\d]+$/)) - err = {code: codes['BAD_MERKLE_SUMMARY'], message: "Incorrect " + field + " field: must be a SHA-1 uppercased hash"}; - }); - return err && err.message; - }; -} - -function parseDateFromTimestamp (value) { - if (value && value.match(/^\d+$/)) - return new Date(parseInt(value)*1000); - else - return new Date(); -} - -function parseAmendmentNumber (value) { - var m = value.match(/^(\d+)-([A-Z\d]+)$/); - if (m) - return m[1]; - else - return 0; -} - -function parseAmendmentHash (value) { - var m = value.match(/^(\d+)-([A-Z\d]+)$/); - if (m) - return m[2]; - else - return ""; -} - -var parseMerkleNumber = parseAmendmentNumber; -var parseMerkleRoot = parseAmendmentHash; - -util.inherits(StatementParser, GenericParser); diff --git a/app/lib/streams/parsers/doc/vote.js b/app/lib/streams/parsers/doc/vote.js deleted file mode 100644 index 43d61cc7bdd6e0e8c64d82b1fc8aed2e108f94b8..0000000000000000000000000000000000000000 --- a/app/lib/streams/parsers/doc/vote.js +++ /dev/null @@ -1,163 +0,0 @@ -var GenericParser = require('./GenericParser'); -var rawer = require('../../../rawer'); -var util = require('util'); -var sha1 = require('sha1'); -var split = require('../../../split'); -var unix2dos = require('../../../unix2dos'); -var _ = require('underscore'); - -module.exports = VoteParser; - -function VoteParser (onError) { - - var captures = [ - {prop: "version", regexp: /Version: (.*)/}, - {prop: "currency", regexp: /Currency: (.*)/}, - {prop: "number", regexp: /Number: (.*)/}, - {prop: "generated", regexp: /GeneratedOn: (.*)/}, - {prop: "dividend", regexp: /UniversalDividend: (.*)/}, - {prop: "coinBase", regexp: /CoinBase: (.*)/}, - {prop: "coinList", regexp: /CoinList: (.*)/}, - {prop: "coinAlgo", regexp: /CoinAlgo: (.*)/}, - {prop: "nextVotes", regexp: /NextRequiredVotes: (.*)/}, - {prop: "previousHash", regexp: /PreviousHash: (.*)/}, - {prop: "membersRoot", regexp: /MembersRoot: (.*)/}, - {prop: "membersCount", regexp: /MembersCount: (.*)/}, - {prop: "membersChanges", regexp: /MembersChanges:\n([\s\S]*)VotersRoot/, parser: split("\n")}, - {prop: "votersRoot", regexp: /VotersRoot: (.*)/}, - {prop: "votersCount", regexp: /VotersCount: (.*)/}, - {prop: "votersChanges", regexp: /VotersChanges:\n([\s\S]*)/, parser: split("\n")}, - ]; - var multilineFields = ["membersChanges", "votersChanges"]; - GenericParser.call(this, captures, multilineFields, rawer.getVote, onError); - - this._clean = function (obj) { - this.cleanAmendment(obj); - restructurate(obj); - }; - - this.cleanAmendment = function (am) { - am.membersChanges = am.membersChanges || []; - if (am.membersChanges.length > 0) - am.membersChanges.splice(am.membersChanges.length - 1, 1); - am.votersChanges = am.votersChanges || []; - if (am.votersChanges.length > 0) - am.votersChanges.splice(am.votersChanges.length - 1, 1); - if (am.coinList) { - am.coinList = am.coinList.split(' '); - am.coinList.forEach(function(cs, index){ - am.coinList[index] = parseInt(cs); - }); - } - } - - function restructurate (obj) { - // Move structure into obj.amendment, BUT the signature & hash - obj.amendment = {}; - _(_(obj).keys()).without('amendment', 'signature', 'hash', 'raw', 'version', 'currency').forEach(function(k){ - obj.amendment[k] = obj[k]; - delete obj[k]; - }); - obj.amendment.version = obj.version; - obj.amendment.currency = obj.currency; - obj.amendment.raw = obj.raw; - obj.amendment.hash = sha1(rawer.getAmendment(obj.amendment)).toUpperCase(); - obj.amendmentHash = obj.amendment.hash; - obj.basis = obj.amendment.number; - } - - this._verify = function(obj){ - var am = obj.amendment; - var err = null; - var codes = { - 'VERSION': 150, - 'CURRENCY': 151, - 'NUMBER': 152, - 'GENERATEDON': 153, - 'UD': 154, - 'NEXT_VOTES': 156, - 'PREV_HASH': 157, - 'MEMBERS_ROOT': 160, - 'MEMBERS_COUNT': 161, - 'MEMBERS_CHANGES': 162, - 'VOTERS_ROOT': 160, - 'VOTERS_COUNT': 161, - 'VOTERS_CHANGES': 162, - 'COIN_BASE': 173, - 'COIN_LIST': 174, - 'COIN_SUM': 175 - }; - if(!err){ - // Version - if(!am.version || !am.version.match(/^1$/)) - err = {code: codes['VERSION'], message: "Version unknown"}; - } - if(!err){ - // Number - if(!am.number || !am.number.match(/^\d+$/)) - err = {code: codes['NUMBER'], message: "Incorrect Number field"}; - } - if(!err){ - // GeneratedOn - if(!am.generated || !am.generated.match(/^\d+$/)) - err = {code: codes['GENERATEDON'], message: "GeneratedOn field must be a positive or zero integer"}; - } - if(!err){ - // Universal Dividend - if(am.dividend && !am.dividend.match(/^\d+$/)) - err = {code: codes['UD'], message: "UniversalDividend must be a positive or zero integer"}; - // Coin Base - if(am.dividend && (!am.coinBase || !am.coinBase.match(/^\d+$/))) - err = {code: codes['COIN_BASE'], message: "CoinBase must be a positive or zero integer"}; - // Coin List - if(am.dividend && (!am.coinList || !am.coinList.join(' ').match(/^(\d+ )*\d+$/))) - err = {code: codes['COIN_LIST'], message: "CoinList must be a space separated list of positive or zero integers"}; - else if(am.dividend) { - var dividendSum = 0; - var power = parseInt(am.coinBase); - am.coinList.forEach(function(c){ - dividendSum += parseInt(c) * Math.pow(2, power++); - }); - if (parseInt(am.dividend) != dividendSum) { - err = {code: codes['COIN_SUM'], message: "CoinList sum '" + dividendSum + "' does not match UniversalDividend '" + am.dividend + "'"}; - } - } - } - if(!err){ - // NextRequiredVotes - if(am.nextVotes && !am.nextVotes.match(/^\d+$/)) - err = {code: codes['NEXT_VOTES'], message: "NextRequiredVotes must be a positive or zero integer"}; - } - if(!err){ - // Previous hash - var isRoot = parseInt(am.number, 10) === 0; - if(!isRoot && (!am.previousHash || !am.previousHash.match(/^[A-Z\d]{40}$/))) - err = {code: codes['PREV_HASH'], message: "PreviousHash must be provided for non-root amendment and match an uppercase SHA1 hash"}; - else if(isRoot && am.previousHash) - err = {code: codes['PREV_HASH'], message: "PreviousHash must not be provided for root amendment"}; - } - if(!err){ - // VotersRoot - if(am.previousHash && (!am.votersRoot || !am.votersRoot.match(/^[A-Z\d]{40}$/))) - err = {code: codes['VOTERS_ROOT'], message: "VotersRoot must be provided and match an uppercase SHA1 hash"}; - } - if(!err){ - // VotersCount - if(am.previousHash && (!am.votersCount || !am.votersCount.match(/^\d+$/))) - err = {code: codes['VOTERS_COUNT'], message: "VotersCount must be a positive or zero integer"}; - } - if(!err){ - // MembersRoot - if(!am.membersRoot || !am.membersRoot.match(/^[A-Z\d]{40}$/)) - err = {code: codes['MEMBERS_ROOT'], message: "MembersRoot must be provided and match an uppercase SHA1 hash"}; - } - if(!err){ - // MembersCount - if(!am.membersCount || !am.membersCount.match(/^\d+$/)) - err = {code: codes['MEMBERS_COUNT'], message: "MembersCount must be a positive or zero integer"}; - } - return err && err.message; - }; -} - -util.inherits(VoteParser, GenericParser); diff --git a/app/lib/streams/parsers/doc/voting.js b/app/lib/streams/parsers/doc/voting.js deleted file mode 100644 index 7f6829c1e87ac79580df625572184bcc6eadd2b5..0000000000000000000000000000000000000000 --- a/app/lib/streams/parsers/doc/voting.js +++ /dev/null @@ -1,79 +0,0 @@ -var GenericParser = require('./GenericParser'); -var rawer = require('../../../rawer'); -var util = require('util'); -var sha1 = require('sha1'); -var split = require('../../../split'); -var unix2dos = require('../../../unix2dos'); -var _ = require('underscore'); - -module.exports = VotingParser; - -function VotingParser (onError) { - - var captures = [ - {prop: "version", regexp: /Version: (.*)/}, - {prop: "currency", regexp: /Currency: (.*)/}, - {prop: "type", regexp: /Registry: (.*)/}, - {prop: "issuer", regexp: /Issuer: (.*)/}, - {prop: "amNumber", regexp: /AmendmentNumber: (.*)/}, - {prop: "amHash", regexp: /AmendmentHash: (.*)/}, - {prop: "date", regexp: /Date: (.*)/, parser: parseDateFromTimestamp} - ]; - var multilineFields = []; - GenericParser.call(this, captures, multilineFields, rawer.getVoting, onError); - - this._clean = function (obj) { - }; - - this._verify = function(obj){ - var err = null; - var code = 150; - var codes = { - 'BAD_VERSION': 150, - 'BAD_CURRENCY': 151, - 'BAD_ISSUER': 152, - 'BAD_KEY': 153, - 'BAD_REGISTRY_TYPE': 154, - 'BAD_DATE': 155, - 'BAD_AM_NUMBER': 156, - 'BAD_AM_HASH': 157, - } - if(!err){ - // Version - if(!obj.version || !obj.version.match(/^1$/)) - err = {code: codes['BAD_VERSION'], message: "Version unknown"}; - } - if(!err){ - // Registry document type - if(!obj.type || !obj.type.match("^VOTING$")) - err = {code: codes['BAD_REGISTRY_TYPE'], message: "Incorrect Registry field: must be VOTING"}; - } - if(!err){ - // Issuer - if(obj.issuer && !obj.issuer.isSha1()) - err = {code: codes['BAD_ISSUER'], message: "Incorrect issuer field"}; - } - if(!err){ - // AmendmentNumber - if(!obj.amNumber || !obj.amNumber.match(/^\d+$/)) - err = {code: codes['BAD_AM_NUMBER'], message: "Incorrect AmendmentNumber field"}; - } - if(!err){ - // AmendmentHash - if(obj.amHash && !obj.amHash.match(/^[A-Z\d]+$/)) - err = {code: codes['BAD_AM_HASH'], message: "Incorrect AmendmentHash field"}; - } - if(!err){ - // Date - if(obj.date && (typeof obj == 'string' ? !obj.date.match(/^\d+$/) : obj.date.timestamp() <= 0)) - err = {code: codes['BAD_DATE'], message: "Incorrect Date field: must be a positive or zero integer"}; - } - return err && err.message; - }; -} - -function parseDateFromTimestamp (value) { - return new Date(parseInt(value)*1000); -} - -util.inherits(VotingParser, GenericParser); diff --git a/app/lib/streams/parsers/http2raw.js b/app/lib/streams/parsers/http2raw.js index e5bc32cf33c41b8f898e7ad94e8928adf84138b1..78bd6e754aab6eadad5ffed9ba54b1583b59733b 100644 --- a/app/lib/streams/parsers/http2raw.js +++ b/app/lib/streams/parsers/http2raw.js @@ -2,7 +2,6 @@ var stream = require('stream'); var util = require('util'); module.exports = { - vote: instanciate.bind(null, Http2RawVote), pubkey: instanciate.bind(null, Http2RawPubkey), transaction: instanciate.bind(null, Http2RawTransaction), peer: instanciate.bind(null, Http2RawPeer), @@ -10,8 +9,6 @@ module.exports = { status: instanciate.bind(null, Http2RawStatus), wallet: instanciate.bind(null, Http2RawWallet), membership: instanciate.bind(null, Http2RawMembership), - voting: instanciate.bind(null, Http2RawVoting), - communityFlow: instanciate.bind(null, Http2RawStatement), }; function instanciate (constructorFunc, req, onError) { @@ -36,21 +33,6 @@ function Http2RawPubkey (req, onError) { } } -function Http2RawVote (req, onError) { - - stream.Readable.call(this); - - this._read = function () { - if(!(req.body && req.body.amendment && req.body.signature)){ - onError('Requires an amendment + signature'); - } - else { - this.push(req.body.amendment + req.body.signature); - } - this.push(null); - } -} - function Http2RawTransaction (req, onError) { stream.Readable.call(this); @@ -141,43 +123,10 @@ function Http2RawMembership (req, onError) { } } -function Http2RawVoting (req, onError) { - - stream.Readable.call(this); - - this._read = function () { - if(!(req.body && req.body.voting && req.body.signature)){ - onError('Requires a voting + signature'); - } - else { - this.push(req.body.voting + req.body.signature); - } - this.push(null); - } -} - -function Http2RawStatement (req, onError) { - - stream.Readable.call(this); - - this._read = function () { - if(!(req.body && req.body.statement && req.body.signature)){ - onError('Requires a statement + signature'); - } - else { - this.push(req.body.statement + req.body.signature); - } - this.push(null); - } -} - util.inherits(Http2RawPubkey, stream.Readable); -util.inherits(Http2RawVote, stream.Readable); util.inherits(Http2RawTransaction, stream.Readable); util.inherits(Http2RawPeer, stream.Readable); util.inherits(Http2RawForward, stream.Readable); util.inherits(Http2RawStatus, stream.Readable); util.inherits(Http2RawWallet, stream.Readable); util.inherits(Http2RawMembership, stream.Readable); -util.inherits(Http2RawVoting, stream.Readable); -util.inherits(Http2RawStatement, stream.Readable); diff --git a/app/lib/streams/router.js b/app/lib/streams/router.js index 56bfeb1baf3a85ed194b9c821416d8d843582a3c..e77d47ee9b8c82b4e28a1892fd06b2633d55f8b9 100644 --- a/app/lib/streams/router.js +++ b/app/lib/streams/router.js @@ -13,7 +13,6 @@ function Router (serverFPR, conn) { var Key = conn.model('Key'); var PublicKey = conn.model('PublicKey'); var Amendment = conn.model('Amendment'); - var Vote = conn.model('Vote'); var Transaction = conn.model('Transaction'); var Peer = conn.model('Peer'); var Forward = conn.model('Forward'); @@ -25,15 +24,12 @@ function Router (serverFPR, conn) { this._write = function (obj, enc, done) { if (typeof obj.email != 'undefined') { route('pubkey', obj, getRandomInUPPeers, done); } - else if (obj.amendment ? true : false) { route('vote', obj, getRandomInUPPeers, done); } else if (obj.recipient ? true : false) { route('transaction', obj, getTargetedButSelf(obj.recipient), done); } else if (obj.endpoints ? true : false) { route('peer', obj, getRandomInAllPeersButPeer(obj.fingerprint), done); } else if (obj.forward ? true : false) { route('forward', obj, getTargetedButSelf(obj.to), done); } else if (obj.status ? true : false) { route('status', obj, getTargetedButSelf(obj.to), done); } else if (obj.requiredTrusts ? true : false) { route('wallet', obj, getRandomInUPPeers, done); } else if (obj.type && obj.type == "MEMBERSHIP" ? true : false) { route('membership', obj, getRandomInUPPeers, done); } - else if (obj.type && obj.type == "VOTING" ? true : false) { route('voting', obj, getRandomInUPPeers, done); } - else if (obj.algorithm ? true : false) { route('statement', obj, getRandomInUPPeers, done); } else { done(); } diff --git a/app/lib/sync.js b/app/lib/sync.js index dca02e84e5ff970884f05e2904110b4eed3d95b5..5c9c8d754f1a5d4dd9540702eefe2ed3b38e4d92 100644 --- a/app/lib/sync.js +++ b/app/lib/sync.js @@ -18,13 +18,10 @@ module.exports = function Synchroniser (server, host, port, authenticated, conf) // Services var PublicKeyService = server.PublicKeyService; var KeyService = server.KeyService; - var VoteService = server.VoteService; var TransactionService = server.TransactionsService; var WalletService = server.WalletService; var PeeringService = server.PeeringService; - var StrategyService = server.StrategyService; var ParametersService = server.ParametersService; - var SyncService = server.SyncService; // Models var Amendment = server.conn.model('Amendment'); @@ -351,93 +348,6 @@ module.exports = function Synchroniser (server, host, port, authenticated, conf) else next(); }); }, - - //=========== - // Registry - //=========== - function (next){ - Amendment.current(function (err, am) { - if (!am) { - next(); - return; - } - async.waterfall([ - function (next){ - Key.getMembers(next); - }, - function (keys, next) { - async.forEach(keys, function(member, callback){ - async.waterfall([ - function (next){ - node.registry.community.members.current(member.fingerprint, next); - }, - function (jsonMS, next){ - logger.info('Membership of %s', member.fingerprint); - var ms = new Membership({ - "version": jsonMS.membership.version, - "currency": jsonMS.membership.currency, - "issuer": jsonMS.membership.issuer, - "membership": jsonMS.membership.membership, - "date": new Date(jsonMS.membership.date*1000), - "type": "MEMBERSHIP" - }); - ms.signature = jsonMS.signature; - ParametersService.getMembership({ - body: { - membership: ms.getRaw(), - signature: jsonMS.signature - } - }, next); - }, - function (ms, next){ - ms.amNumber = am.number - 1; - ms.current = true; - ms.save(function (err) { - next(err); - }); - }, - ], callback); - }, next); - }, - function (next){ - Key.getVoters(next); - }, - function (keys, next) { - async.forEach(keys, function(member, callback){ - async.waterfall([ - function (next){ - node.registry.community.voters.current(member.fingerprint, next); - }, - function (jsonVT, next){ - logger.info('Voting of %s', member.fingerprint); - var vt = new Voting({ - "version": jsonVT.voting.version, - "currency": jsonVT.voting.currency, - "issuer": jsonVT.voting.issuer, - "date": new Date(jsonVT.voting.date*1000), - "type": "VOTING" - }); - vt.signature = jsonVT.signature; - ParametersService.getVoting({ - body: { - voting: vt.getRaw(), - signature: jsonVT.signature - } - }, next); - }, - function (voting, next){ - voting.amNumber = am.number - 1; - voting.current = true; - voting.save(function (err) { - next(err); - }); - }, - ], callback); - }, next); - }, - ], next); - }) - }, ], function (err, result) { logger.info('Sync finished.'); done(err); @@ -579,37 +489,6 @@ module.exports = function Synchroniser (server, host, port, authenticated, conf) } ], onceSyncFinished); } - - function applyVotes(amendments, amNumber, number, json, node, cb) { - logger.info('Applying votes for amendment #%s', amNumber); - logger.info("Signatures: %s", _(json.leaves).size()); - async.forEachSeries(json.leaves, function(leaf, callback){ - async.waterfall([ - function (next){ - var hash = sha1(amendments[amNumber]).toUpperCase(); - node.hdc.amendments.view.signatures(amNumber, hash, { "leaf": leaf }, next); - }, - function (json, next){ - var parser = parsers.parseVote(next); - parser.pipe(extractSignature(next)).pipe(eventStream.map(function (obj, callback) { - next(null, obj); - callback(); - })); - parser.end(amendments[amNumber] + json.leaf.value.signature); - }, - function (vote, next){ - vote.pubkey = { fingerprint: leaf }; - VoteService.submit(vote, function (err, am) { - if(!err) - number++; - next(err); - }); - } - ], callback); - }, function(err, result){ - cb(err, number); - }); - } } function NodesMerkle (json) { diff --git a/app/lib/wizard.js b/app/lib/wizard.js index a46d6abba87897528eaf257558505872eeb8963c..7d84a3dab31193abe6524f83c8bc836d3e454eba 100644 --- a/app/lib/wizard.js +++ b/app/lib/wizard.js @@ -16,7 +16,7 @@ var IPV6_REGEXP = /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4} function Wizard () { this.configAll = function (conf, done) { - doTasks(['currency', 'openpgp', 'network', 'key', 'autovote'], conf, done); + doTasks(['currency', 'openpgp', 'network', 'key'], conf, done); }; this.configCurrency = function (conf, done) { @@ -34,10 +34,6 @@ function Wizard () { this.configKey = function (conf, done) { doTasks(['key'], conf, done); }; - - this.configAutovote = function (conf, done) { - doTasks(['autovote'], conf, done); - }; } function doTasks (todos, conf, done) { @@ -283,37 +279,6 @@ var tasks = { } } ], done); - }, - - autovote: function (conf, done) { - choose("Autovoting", conf.sync.AMDaemon ? conf.sync.AMDaemon == "ON" : false, - function enabled () { - conf.sync.AMDaemon = "ON"; - async.waterfall([ - async.apply(simpleInteger, "Amendment start", "AMStart", conf.sync), - async.apply(simpleInteger, "Amendment frequency", "AMFreq", conf.sync), - async.apply(simpleInteger, "Dividend frequency", "UDFreq", conf.sync), - async.apply(simpleFloat, "Consensus %required", "Consensus", conf.sync), - async.apply(simpleInteger, "Initial dividend", "UD0", conf.sync), - async.apply(simpleFloat, "Universal Dividend %growth", "UDPercent", conf.sync), - function (next) { - inquirer.prompt([{ - type: "checkbox", - name: "Algorithm", - message: "Community you want to vote for", - choices: ["AnyKey", "1Sig"], - default: conf.sync.Algorithm, - }], function (answers) { - conf.sync.Algorithm = answers.Algorithm; - done(); - }); - } - ], done); - }, - function disabled () { - conf.sync.AMDaemon = "OFF"; - done(); - }); } }; diff --git a/app/models/amendment.js b/app/models/amendment.js index 236df9ae6d6849cb8f704b3426c36789b408d53d..2e76d287d2e3aa8f0001003b5ed0a059effeeafb 100644 --- a/app/models/amendment.js +++ b/app/models/amendment.js @@ -16,11 +16,7 @@ var AmendmentSchema = new Schema({ coinAlgo: String, coinBase: Number, coinList: [Number], - nextVotes: {"type": Number, "default": 0}, previousHash: String, - votersRoot: String, - votersCount: {"type": Number, "default": 0}, - votersChanges: Array, membersRoot: String, membersCount: {"type": Number, "default": 0}, membersChanges: Array, @@ -51,11 +47,7 @@ AmendmentSchema.methods = { "coinAlgo", "coinBase", "coinList", - "nextVotes", "previousHash", - "votersRoot", - "votersCount", - "votersChanges", "membersRoot", "membersCount", "membersChanges", @@ -78,17 +70,14 @@ AmendmentSchema.methods = { "version", "number", "generated", - "nextVotes", "dividend", "coinBase", - "votersCount", "membersCount", ].forEach(function(field){ json[field] = parseInt(that[field], 10); }); [ "currency", - "votersRoot", "membersRoot", "coinAlgo", ].forEach(function(field){ @@ -101,7 +90,6 @@ AmendmentSchema.methods = { }); [ "coinList", - "votersChanges", "membersChanges" ].forEach(function(field){ json[field] = that[field] || []; @@ -131,28 +119,6 @@ AmendmentSchema.methods = { return members; }, - getNewVoters: function() { - var voters = []; - for (var i = 0; i < this.votersChanges.length; i++) { - var matches = this.votersChanges[i].match(/^\+([\w\d]{40})$/); - if(matches){ - voters.push(matches[1]); - } - } - return voters; - }, - - getLeavingVoters: function() { - var voters = []; - for (var i = 0; i < this.votersChanges.length; i++) { - var matches = this.votersChanges[i].match(/^\-([\w\d]{40})$/); - if(matches){ - voters.push(matches[1]); - } - } - return voters; - }, - getHash: function() { if (!this.hash) { this.hash = sha1(this.getRaw()).toUpperCase(); @@ -319,46 +285,6 @@ AmendmentSchema.statics.getLastStatusOfMember = function (member, amNumberLimit, ], done); }; -AmendmentSchema.statics.getLastStatusOfVoter = function (voter, amNumberLimit, proposedToo, done) { - - if (arguments.length == 3) { - done = proposedToo; - proposedToo = undefined; - } - - var criterias = { number: { $lte: amNumberLimit }, votersChanges: new RegExp("^(\\+|-)" + voter + "$")}; - if (proposedToo) { - criterias.$or = [{ promoted: true }, { selfGenerated: true }]; - } else { - criterias.promoted = true; - } - - var that = this; - async.waterfall([ - function (next){ - that - .find(criterias) - .sort({ 'number': -1 }) - .limit(1) - .exec(next); - }, - function (ams, next){ - if (ams.length == 1) { - if (~ams[0].votersChanges.indexOf("+" + voter)) { - // Last time, voter was joining - next(null, 1); - } else { - // Last time, voter was leaving - next(null, -1); - } - } else { - // Voter has never been seen - next(null, 0); - } - }, - ], done); -}; - AmendmentSchema.statics.isMember = function (member, amNumber, done) { var that = this; @@ -372,29 +298,11 @@ AmendmentSchema.statics.isMember = function (member, amNumber, done) { ], done); }; -AmendmentSchema.statics.isVoter = function (voter, amNumber, done) { - var that = this; - async.waterfall([ - function (next){ - that.getLastStatusOfVoter(voter, amNumber, next); - }, - function (status, next){ - logger.debug('isVoter ? %s for AM#%s = %s', voter, amNumber, status); - next(null, status > 0); - }, - ], done); -}; - AmendmentSchema.statics.isMemberForAM = function (member, amNumber, amHash, done) { this.searchPresence(member, amNumber, amHash, checkIsJoiningMember, checkIsLeavingMember, this.searchPresence.bind(this), done); }; -AmendmentSchema.statics.isVoterForAM = function (voter, amNumber, amHash, done) { - - this.searchPresence(voter, amNumber, amHash, checkIsJoiningVoter, checkIsLeavingVoter, this.searchPresence.bind(this), done); -}; - AmendmentSchema.statics.searchPresence = function (member, amNumber, amHash, isJoining, isLeaving, searchCallBack, done) { var that = this; async.waterfall([ @@ -422,21 +330,6 @@ AmendmentSchema.statics.searchPresence = function (member, amNumber, amHash, isJ function checkIsJoiningMember (am, key) { return ~am.membersChanges.indexOf('+' + key); } function checkIsLeavingMember (am, key) { return ~am.membersChanges.indexOf('-' + key); } -function checkIsJoiningVoter (am, key) { return ~am.votersChanges.indexOf('+' + key); } -function checkIsLeavingVoter (am, key) { return ~am.votersChanges.indexOf('-' + key); } - -AmendmentSchema.statics.isVoter = function (voter, amNumber, done) { - var that = this; - async.waterfall([ - function (next){ - that.getLastStatusOfVoter(voter, amNumber, next); - }, - function (status, next){ - logger.debug('isVoter ? %s for AM#%s = %s', voter, amNumber, status); - next(null, status > 0); - }, - ], done); -}; AmendmentSchema.statics.isProposedMember = function (member, amNumber, done) { @@ -451,19 +344,6 @@ AmendmentSchema.statics.isProposedMember = function (member, amNumber, done) { ], done); }; -AmendmentSchema.statics.isProposedVoter = function (voter, amNumber, done) { - - var that = this; - async.waterfall([ - function (next){ - that.getLastStatusOfVoter(voter, amNumber, true, next); - }, - function (status, next){ - next(null, status > 0); - }, - ], done); -}; - module.exports = AmendmentSchema; function fill (am1, am2) { @@ -472,15 +352,11 @@ function fill (am1, am2) { "currency", "number", "generated", - "nextVotes", "dividend", "coinAlgo", "coinBase", "coinList", "previousHash", - "votersRoot", - "votersCount", - "votersChanges", "membersRoot", "membersCount", "membersChanges", diff --git a/app/models/configuration.js b/app/models/configuration.js index 5bda0bce1022846b2e1a3d77f5dbc394b79211d1..1d92b3ca3a751ba9c5db1880c1955a181e8b3609 100644 --- a/app/models/configuration.js +++ b/app/models/configuration.js @@ -18,15 +18,6 @@ var ConfigurationSchema = new Schema({ kmanagement: {"type": String, "default": "ALL"}, kaccept: {"type": String, "default": "ALL"}, upInterval: {"type": Number, "default": 3600*1000}, - sync: {"type": Object, "default": { - AMDaemon: "OFF", // No deamon by default - AMFreq: 3600*24, // every day - UDFreq: 3600*24*30.4375, // every month - UD0: 100, - UDPercent: 0.007376575, // 0.73% - Consensus: 2/3, - Algorithm: ['AnyKey', '1Sig'], - }} }); ConfigurationSchema.virtual('createNext').get(function () { diff --git a/app/models/key.js b/app/models/key.js index 3eafd4ecebd8eb638020f5bf2fceaa89a9b33a7b..d3a33d56c8bf3d44e8ad0e828256a48844674553 100644 --- a/app/models/key.js +++ b/app/models/key.js @@ -7,135 +7,16 @@ var logger = require('../../app/lib/logger')('key model'); var KeySchema = new Schema({ fingerprint: { type: String, unique: true }, managed: { type: Boolean, default: false }, - asMember: Schema.Types.Mixed, - asVoter: Schema.Types.Mixed, member: { type: Boolean, default: false }, - voter: { type: Boolean, default: false }, - proposedMember: { type: Boolean, default: false }, - proposedVoter: { type: Boolean, default: false }, - lastMemberState: { type: Number, default: 0 }, - lastVotingState: { type: Number, default: 0 }, created: { type: Date, default: Date.now }, updated: { type: Date, default: Date.now } }); KeySchema.pre('save', function (next) { this.updated = Date.now(); - this.asMember = this.asMember || {}; - this.asMember.joins = this.asMember.joins || []; - this.asMember.leaves = this.asMember.leaves || []; - this.asVoter = this.asVoter || {}; - this.asVoter.joins = this.asVoter.joins || []; - this.asVoter.leaves = this.asVoter.leaves || []; next(); }); -KeySchema.statics.memberJoin = function(amNumber, fingerprint, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: fingerprint }, { $push: { "asMember.joins": amNumber }}, done); -} - -KeySchema.statics.memberLeave = function(amNumber, fingerprint, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: fingerprint }, { $push: { "asMember.leaves": amNumber }}, done); -} - -KeySchema.statics.wasMember = function(fingerprint, amNumber, done){ - var Key = this.model('Key'); - Key.find({ fingerprint: fingerprint }, function (err, keys) { - if (err || !keys || keys.length == 0) { - done("Unknown key!"); - } else { - var k = keys[0]; - var previousJoins = _(k.asMember.joins).filter(function(n) { return n <= amNumber; }); - if (previousJoins.length > 0) { - var max = _(previousJoins).max(); - var previousLeaves = _(k.asMember.leaves).filter(function(n) { return n <= amNumber; }); - if (previousLeaves.length == 0 || _(previousLeaves).max() < max) { - // Last operation at amNumber was joining - done(null, true); - } else { - // Last operation at amNumber was leaving - done(null, false); - } - } else { - // Has not joined yet - done(null, false); - } - } - }); -} - -KeySchema.statics.getMembersOn = function(amNumber, done){ - var Key = this.model('Key'); - Key.find({ "asMember.joins": { $lte: amNumber }, $where: memberHasNotLeftSince }, done); -} - -KeySchema.statics.getVotersOn = function(amNumber, done){ - var Key = this.model('Key'); - Key.find({ "asVoter.joins": { $lte: amNumber }, $where: voterHasNotLeftSince }, done); -} - -KeySchema.statics.getLastVotingAmNumber = function(fpr, done){ - var Key = this.model('Key'); - async.waterfall([ - function (next){ - Key.find({ fingerprint: fpr }, next); - }, - function (keys, next){ - if (keys.length == 0) { - next('Key not found'); - return; - } - next(null, keys[0].asVoter.joins.length == 0 ? null : _(keys[0].asVoter.joins).max()); - }, - ], done); -} - -function memberHasNotLeftSince() { - return this.asMember.leaves.length == 0 || _(this.asMember.leaves).max() < _(this.asMember.joins).max(); -} - -function voterHasNotLeftSince() { - return this.asVoter.leaves.length == 0 || _(this.asVoter.leaves).max() < _(this.asVoter.joins).max(); -} - -KeySchema.statics.voterJoin = function(amNumber, fingerprint, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: fingerprint }, { $push: { "asVoter.joins": amNumber }}, done); -} - -KeySchema.statics.voterLeave = function(amNumber, fingerprint, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: fingerprint }, { $push: { "asVoter.leaves": amNumber }}, done); -} - -KeySchema.statics.wasVoter = function(fingerprint, amNumber, done){ - var Key = this.model('Key'); - Key.find({ fingerprint: fingerprint }, function (err, keys) { - if (err || !keys || keys.length == 0) { - done("Unknown key!"); - } else { - var k = keys[0]; - var previousJoins = _(k.asVoter.joins).filter(function(n) { return n <= amNumber; }); - if (previousJoins.length > 0) { - var max = _(previousJoins).max(); - var previousLeaves = _(k.asVoter.leaves).filter(function(n) { return n <= amNumber; }); - if (previousLeaves.length == 0 || _(previousLeaves).max() < max) { - // Last operation at amNumber was joining - done(null, true); - } else { - // Last operation at amNumber was leaving - done(null, false); - } - } else { - // Has not joined yet - done(null, false); - } - } - }); -} - KeySchema.statics.setKnown = function(fingerprint, done){ var Key = this.model('Key'); Key.findOne({ fingerprint: fingerprint }, function (err, key) { @@ -194,21 +75,6 @@ KeySchema.statics.getMembers = function(done){ Key.find({ member: true }, done); }; -KeySchema.statics.getVoters = function(done){ - var Key = this.model('Key'); - Key.find({ voter: true }, done); -}; - -KeySchema.statics.getProposedMembers = function(done){ - var Key = this.model('Key'); - Key.find({ proposedMember: true }, done); -}; - -KeySchema.statics.getProposedVoters = function(done){ - var Key = this.model('Key'); - Key.find({ proposedVoter: true }, done); -}; - KeySchema.statics.addMember = function(fingerprint, done){ var Key = this.model('Key'); Key.update({ fingerprint: fingerprint }, { member: true }, function (err) { @@ -216,27 +82,6 @@ KeySchema.statics.addMember = function(fingerprint, done){ }); }; -KeySchema.statics.addVoter = function(fingerprint, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: fingerprint }, { voter: true }, function (err) { - done(err); - }); -}; - -KeySchema.statics.addProposedMember = function(fingerprint, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: fingerprint }, { proposedMember: true }, function (err) { - done(err); - }); -}; - -KeySchema.statics.addProposedVoter = function(fingerprint, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: fingerprint }, { proposedVoter: true }, function (err) { - done(err); - }); -}; - KeySchema.statics.removeMember = function(fingerprint, done){ var Key = this.model('Key'); Key.update({ fingerprint: fingerprint }, { member: false }, function (err) { @@ -244,53 +89,4 @@ KeySchema.statics.removeMember = function(fingerprint, done){ }); }; -KeySchema.statics.removeVoter = function(fingerprint, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: fingerprint }, { voter: false }, function (err) { - done(err); - }); -}; - -KeySchema.statics.removeProposedMember = function(fingerprint, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: fingerprint }, { proposedMember: false }, function (err) { - done(err); - }); -}; - -KeySchema.statics.removeProposedVoter = function(fingerprint, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: fingerprint }, { proposedVoter: false }, function (err) { - done(err); - }); -}; - -KeySchema.statics.getLastState = function(key, done){ - var Key = this.model('Key'); - Key.find({ fingerprint: key }, function (err, keys) { - done(err, (err || keys.length == 0) ? 0 : keys[0].lastVotingState); - }); -}; - -KeySchema.statics.getLastMSState = function(key, done){ - var Key = this.model('Key'); - Key.find({ fingerprint: key }, function (err, keys) { - done(err, (err || keys.length == 0) ? 0 : keys[0].lastMemberState); - }); -}; - -KeySchema.statics.setLastState = function(key, state, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: key }, { $set: { lastVotingState: state }}, function (err) { - done(err); - }); -}; - -KeySchema.statics.setLastMSState = function(key, state, done){ - var Key = this.model('Key'); - Key.update({ fingerprint: key }, { $set: { lastMemberState: state }}, function (err) { - done(err); - }); -}; - module.exports = KeySchema; diff --git a/app/models/merkle.js b/app/models/merkle.js index 1de1561960c9dff3a09145a86396a3c9d4610b77..1ee867f25c159221eb36d60036328d1e1b46c573 100644 --- a/app/models/merkle.js +++ b/app/models/merkle.js @@ -127,10 +127,6 @@ MerkleSchema.statics.forPublicKeys = function (done) { this.retrieve({ type: 'pubkeys' }, done); }; -MerkleSchema.statics.signaturesOfAmendment = function (number, hash, done) { - this.retrieve({ type: 'amendment', criteria: '{"number":'+number+',"hash": "'+hash+'"}' }, done); -}; - MerkleSchema.statics.txOfSender = function (fingerprint, done) { this.retrieve({ type: 'txOfSender', criteria: '{"fpr":'+fingerprint+'"}' }, done); }; @@ -147,14 +143,6 @@ MerkleSchema.statics.WalletEntries = function (done) { this.retrieve({ type: 'thtentries', criteria: '{}' }, done); }; -MerkleSchema.statics.proposedMembers = function (done) { - this.retrieve({ type: 'proposedMembers', criteria: '{}' }, done); -}; - -MerkleSchema.statics.proposedVoters = function (done) { - this.retrieve({ type: 'proposedVoters', criteria: '{}' }, done); -}; - MerkleSchema.statics.membersIn = function (number, algo, done) { this.retrieve({ type: 'membersIn', criteria: '{"number":'+number+',algo:'+algo+'}' }, done); }; @@ -163,14 +151,6 @@ MerkleSchema.statics.membersOut = function (number, algo, done) { this.retrieve({ type: 'membersOut', criteria: '{"number":'+number+',algo:'+algo+'}' }, done); }; -MerkleSchema.statics.votersIn = function (number, algo, done) { - this.retrieve({ type: 'votersIn', criteria: '{"number":'+number+',algo:'+algo+'}' }, done); -}; - -MerkleSchema.statics.votersOut = function (number, algo, done) { - this.retrieve({ type: 'votersOut', criteria: '{"number":'+number+',algo:'+algo+'}' }, done); -}; - MerkleSchema.statics.updatePeers = function (peer, previousHash, done) { var Merkle = this.model('Merkle'); async.waterfall([ @@ -299,21 +279,6 @@ MerkleSchema.statics.mapForPublicKeys = function (hashes, done) { }); } -MerkleSchema.statics.mapForSignatures = function (amNumber, hashes, done) { - this.model('Vote') - .find({ basis: amNumber, issuer: { $in: hashes } }) - .exec(function (err, votes) { - var map = {}; - votes.forEach(function (vote){ - map[vote.issuer] = { - issuer: vote.issuer, - signature: vote.signature - }; - }); - done(null, map); - }); -}; - MerkleSchema.statics.mapForWalletEntries = function (hashes, done) { this.model('Wallet') .find({ fingerprint: { $in: hashes } }) @@ -340,17 +305,4 @@ MerkleSchema.statics.mapForMemberships = function (hashes, done) { }); }; -MerkleSchema.statics.mapForVotings = function (hashes, done) { - this.model('Voting') - .find({ issuer: { $in: hashes } }) - .sort('issuer') - .exec(function (err, entries) { - var map = {}; - entries.forEach(function (entry){ - map[entry.issuer] = entry.json(); - }); - done(null, map); - }); -}; - module.exports = MerkleSchema; diff --git a/app/models/statement.js b/app/models/statement.js deleted file mode 100644 index 0a11c414048a5f4a95124cd05f6812de16cec5fa..0000000000000000000000000000000000000000 --- a/app/models/statement.js +++ /dev/null @@ -1,139 +0,0 @@ -var mongoose = require('mongoose'); -var async = require('async'); -var sha1 = require('sha1'); -var jpgp = require('../lib/jpgp'); -var _ = require('underscore'); -var rawer = require('../lib/rawer'); -var Schema = mongoose.Schema; - -var StatementSchema = new Schema({ - version: String, - currency: String, - issuer: { type: String }, - date: { type: Date }, - amendmentNumber: Number, - amendmentHash: String, - algorithm: String, - membersJoiningCount: Number, - membersJoiningRoot: String, - membersLeavingCount: Number, - membersLeavingRoot: String, - votersJoiningCount: Number, - votersJoiningRoot: String, - votersLeavingCount: Number, - votersLeavingRoot: String, - signature: String, - propagated: { type: Boolean, default: false }, - selfGenerated: { type: Boolean, default: false }, - hash: String, - sigDate: { type: Date, default: function(){ return new Date(0); } }, - created: { type: Date, default: Date.now }, - updated: { type: Date, default: Date.now } -}); - -StatementSchema.pre('save', function (next) { - this.updated = Date.now(); - next(); -}); - -StatementSchema.virtual('pubkey').get(function () { - return this._pubkey; -}); - -StatementSchema.virtual('pubkey').set(function (am) { - this._pubkey = am; -}); - -StatementSchema.methods = { - - keyID: function () { - return this.issuer && this.issuer.length > 24 ? "0x" + this.issuer.substring(24) : "0x?"; - }, - - json: function() { - var that = this; - var json = { raw: this.getRaw() }; - [ - "version", - "amendmentNumber", - "membersJoiningCount", - "membersLeavingCount", - "votersJoiningCount", - "votersLeavingCount", - ].forEach(function(field){ - json[field] = parseInt(that[field], 10); - }); - [ - "currency", - "amendmentHash", - "algorithm", - "membersJoiningRoot", - "membersLeavingRoot", - "votersJoiningRoot", - "votersLeavingRoot", - "issuer", - ].forEach(function(field){ - json[field] = that[field] || ""; - }); - json.date = this.date && this.date.timestamp(); - return json; - }, - - verifySignature: function (publicKey, done) { - jpgp() - .publicKey(publicKey) - .data(this.getRaw()) - .signature(this.signature) - .verify(publicKey, done); - }, - - getRaw: function() { - return rawer.getStatementWithoutSignature(this); - }, - - getRawSigned: function() { - return rawer.getStatement(this); - } -} - -StatementSchema.statics.getTheOne = function (amNumber, issuer, algo, done) { - this.find({ amendmentNumber: amNumber, issuer: issuer, algorithm: algo }, function (err, entries) { - if(entries && entries.length == 1){ - done(err, entries[0]); - return; - } - if(!entries || entries.length == 0){ - done('No Statement entry found'); - return; - } - if(entries || entries.length > 1){ - done('More than one Statement entry found'); - } - }); -} - -StatementSchema.statics.getSelf = function (amNumber, algo, done) { - this.find({ amendmentNumber: amNumber, algorithm: algo, selfGenerated: true }, function (err, entries) { - if(entries && entries.length == 1){ - done(err, entries[0]); - return; - } - if(!entries || entries.length == 0){ - done('No Statement entry found'); - return; - } - if(entries || entries.length > 1){ - done('More than one Statement entry found'); - } - }); -} - -StatementSchema.statics.getForAmendmentAndAlgo = function (amNumber, algo, done) { - this.find({ amendmentNumber: amNumber, algorithm: algo }, done); -} - -StatementSchema.statics.getByIssuerAlgoAmendmentHashAndNumber = function (issuer, algo, amHash, amNumber, done) { - this.find({ amendmentNumber: amNumber, amendmentHash: amHash, issuer: issuer, algorithm: algo }, done); -} - -module.exports = StatementSchema; diff --git a/app/models/vote.js b/app/models/vote.js deleted file mode 100644 index d17703ded135edc5d8838e762af55bf16ad5f932..0000000000000000000000000000000000000000 --- a/app/models/vote.js +++ /dev/null @@ -1,219 +0,0 @@ -var sha1 = require('sha1'); -var async = require('async'); -var jpgp = require('../lib/jpgp'); -var fs = require('fs'); -var mongoose = require('mongoose'); -var Schema = mongoose.Schema; -var parsers = require('../lib/streams/parsers/doc'); - -var VoteSchema = new Schema({ - issuer: String, - basis: {"type": Number, "default": 0}, - signature: String, - hash: String, - amendmentHash: String, - propagated: { type: Boolean, default: false }, - selfGenerated: { type: Boolean, default: false }, - sigDate: { type: Date, default: function(){ return new Date(0); } }, - created: { type: Date, default: Date.now }, - updated: { type: Date, default: Date.now } -}); - -VoteSchema.pre('save', function (next) { - this.updated = Date.now(); - next(); -}); - -VoteSchema.virtual('amendment').get(function () { - return this._amendment; -}); - -VoteSchema.virtual('amendment').set(function (am) { - this._amendment = am; -}); - -VoteSchema.virtual('pubkey').get(function () { - return this._pubkey; -}); - -VoteSchema.virtual('pubkey').set(function (am) { - this._pubkey = am; -}); - -VoteSchema.methods = { - - verify: function (currency, done) { - var that = this; - async.waterfall([ - function (next){ - jpgp() - .publicKey(that.pubkey.raw) - .data(that.amendment.getRaw()) - .signature(that.signature) - .verify(next); - }, - function (verified, next) { - if(!verified){ - next('Bad signature for amendment'); - return; - } - next(null, true); - } - ], done); - return this; - }, - - json: function () { - var that = this; - return { - signature: that.signature, - amendment: that.amendment.json() - }; - }, - - issuerIsVoter: function(done) { - var Key = this.model('Key'); - Key.wasVoter(this.issuer, this.amendment.number - 1, done); - }, - - getAmendment: function (done) { - var Amendment = this.model('Amendment'); - var that = this; - if(!this.amendment){ - Amendment.findByNumberAndHash(this.basis, this.amendmentHash, function (err, am) { - that.amendment = am; - done(err, that.amendment); - }); - } - else done(null, this.amendment); - }, - - saveAmendment: function (signaturesLeaves, done) { - var Merkle = this.model('Merkle'); - var that = this; - var am; - async.waterfall([ - function (next){ - that.getAmendment(next); - }, - function (amendment, next){ - am = amendment; - next(); - }, - function (next){ - // Donne le Merkle des signatures (hdc/amendments/[AMENDMENT_ID]/signatures) - Merkle.signaturesOfAmendment(am.number, am.hash, next); - }, - function (merkle, next){ - // Met à jour le Merkle - merkle.initialize(signaturesLeaves); - merkle.save(function (err){ - next(err); - }); - }, - function (next){ - // Met à jour la Masse Monétaire - am.getPrevious(function (err, previous) { - next(null, previous); - }); - }, - function (previous, next){ - var prevM = (previous && previous.monetaryMass) || 0; - var prevUD = (previous && previous.dividend) || 0; - var prevN = (previous && previous.membersCount) || 0; - am.monetaryMass = prevM + prevUD*prevN; - next(); - }, - function (next){ - // Termine la sauvegarde - am.save(function (err) { - that.amendmentHash = am.hash; - that.basis = am.number; - next(err); - }); - }, - ], done); - }, - - copyValues: function (to) { - to.issuer = this.issuer; - to.hash = this.hash; - to.signature = this.signature; - to.amendmentHash = this.amendmentHash; - to.basis = this.basis; - }, - - getRaw: function() { - return this.amendment.getRaw(); - }, - - getRawSigned: function() { - return (this.amendment.getRaw() + this.signature).unix2dos(); - } -}; - -VoteSchema.statics.getForAmendment = function (number, hash, maxDate, done) { - - this.find({ amendmentHash: hash, basis: number, sigDate: { $lte: maxDate } }, done); -}; - -VoteSchema.statics.findByHashAndBasis = function (hash, basis, done) { - - this.find({ hash: hash, basis: basis }, function (err, votes) { - if(votes && votes.length == 1){ - done(err, votes[0]); - return; - } - if(!votes || votes.length == 0){ - done('No amendment found'); - return; - } - if(votes || votes.length > 1){ - done('More than one amendment found'); - } - }); -}; - -VoteSchema.statics.getSelf = function (amNumber, done) { - - this - .find({ selfGenerated: true, basis: amNumber }) - .sort({ 'sigDate': -1 }) - .limit(1) - .exec(function (err, votes) { - done(null, votes.length == 1 ? votes[0] : null); - }); -}; - -VoteSchema.statics.getSelfForAlgo = function (amNumber, algo, done) { - - this - .find({ selfGenerated: true, algo: algo, basis: amNumber }) - .sort({ 'sigDate': -1 }) - .limit(1) - .exec(function (err, votes) { - done(null, votes.length == 1 ? votes[0] : null); - }); -}; - -VoteSchema.statics.getByIssuerHashAndBasis = function (issuer, hash, amNumber, done) { - - this - .find({ issuer: issuer, hash: hash, basis: amNumber }) - .limit(1) - .exec(function (err, votes) { - done(null, votes.length == 1 ? votes[0] : null); - }); -}; - -VoteSchema.statics.getByIssuerAmendmentHashAndBasis = function (issuer, hash, amNumber, done) { - - this - .find({ issuer: issuer, amendmentHash: hash, basis: amNumber }) - .limit(1) - .exec(function (err, votes) { - done(null, votes.length == 1 ? votes[0] : null); - }); -}; - -module.exports = VoteSchema; diff --git a/app/models/voting.js b/app/models/voting.js deleted file mode 100644 index 07a848094b2d1ed83eea3f7c49087c1b5bbe98fd..0000000000000000000000000000000000000000 --- a/app/models/voting.js +++ /dev/null @@ -1,138 +0,0 @@ -var mongoose = require('mongoose'); -var async = require('async'); -var sha1 = require('sha1'); -var jpgp = require('../lib/jpgp'); -var _ = require('underscore'); -var rawer = require('../lib/rawer'); -var Schema = mongoose.Schema; - -var VotingSchema = new Schema({ - version: String, - currency: String, - issuer: { type: String }, - amNumber: Number, - eligible: { type: Boolean, default: true }, - current: { type: Boolean, default: false }, - signature: String, - type: String, - date: { type: Date }, - propagated: { type: Boolean, default: false }, - hash: String, - sigDate: { type: Date, default: function(){ return new Date(0); } }, - created: { type: Date, default: Date.now }, - updated: { type: Date, default: Date.now } -}); - -VotingSchema.pre('save', function (next) { - this.updated = Date.now(); - next(); -}); - -VotingSchema.virtual('pubkey').get(function () { - return this._pubkey; -}); - -VotingSchema.virtual('pubkey').set(function (am) { - this._pubkey = am; -}); - -VotingSchema.virtual('amHash').get(function () { - return this._amHash; -}); - -VotingSchema.virtual('amHash').set(function (am) { - this._amHash = am; -}); - -VotingSchema.methods = { - - keyID: function () { - return this.issuer && this.issuer.length > 24 ? "0x" + this.issuer.substring(24) : "0x?"; - }, - - copyValues: function(to) { - var obj = this; - ["version", "currency", "issuer", "hash", "signature", "sigDate"].forEach(function (key) { - to[key] = obj[key]; - }); - }, - - json: function() { - var obj = this; - var json = {}; - ["version", "currency", "issuer", "amNumber", "amHash"].forEach(function (key) { - json[key] = obj[key]; - }); - json.date = this.date.timestamp(); - json.sigDate = this.sigDate.timestamp(); - json.registry = obj.type; - json.raw = this.getRaw(); - return { signature: this.signature, voting: json }; - }, - - verifySignature: function (publicKey, done) { - jpgp() - .publicKey(publicKey) - .data(this.getRaw()) - .signature(this.signature) - .verify(publicKey, done); - }, - - getRaw: function() { - return rawer.getVotingWithoutSignature(this); - }, - - getRawSigned: function() { - return rawer.getVoting(this); - } -} - -VotingSchema.statics.getForAmendmentAndIssuer = function (amNumber, issuer, done) { - - this.find({ issuer: issuer, amNumber: amNumber }, done); -} - -VotingSchema.statics.getEligibleForAmendment = function (amNumber, done) { - - this.find({ eligible: true, amNumber: amNumber }, done); -} - -VotingSchema.statics.getCurrent = function (issuer, done) { - - this - .find({ current: true, issuer: issuer }) - .sort({ 'sigDate': -1 }) - .limit(1) - .exec(function (err, votings) { - done(null, votings.length == 1 ? votings[0] : null); - }); -} - -VotingSchema.statics.getCurrentForIssuerAndAmendment = function (issuer, amendmentNumber, done) { - - this - .find({ current: true, issuer: issuer, amNumber: { $lt: amendmentNumber } }) - .sort({ 'sigDate': -1 }) - .limit(1) - .exec(function (err, votings) { - done(null, votings.length == 1 ? votings[0] : null); - }); -} - -VotingSchema.statics.getHistory = function (issuer, done) { - - this - .find({ issuer: issuer }) - .sort({ 'sigDate': -1 }) - .exec(done); -} - -VotingSchema.statics.removeCurrents = function (issuer, done) { - - this - .update({ issuer: issuer }, { $set: { current: false }}, { multi: true }, function (err) { - done(err); - }); -} - -module.exports = VotingSchema; diff --git a/app/service/ContractService.js b/app/service/ContractService.js index 4f9937f762b8df288fefc2fc9c17c41c13818a51..f1191c904403413e656fda849152fb9d85842133 100644 --- a/app/service/ContractService.js +++ b/app/service/ContractService.js @@ -37,12 +37,6 @@ function ContractService (conn, conf) { next(); }); }, - function (next){ - Amendment.getTheOneToBeVoted(current ? current.number + 1 : 0, conf.sync.Algorithm, function (err, am) { - proposed = am; - next(); - }); - }, ], done); }; } diff --git a/app/service/KeychainService.js b/app/service/KeychainService.js new file mode 100644 index 0000000000000000000000000000000000000000..e22e0d7ce966b634ee128b4b309a5f5f4a410656 --- /dev/null +++ b/app/service/KeychainService.js @@ -0,0 +1,14 @@ +var jpgp = require('../lib/jpgp'); +var async = require('async'); +var _ = require('underscore'); + +module.exports.get = function (conn, conf) { + return new KeyService(conn, conf); +}; + +function KeyService (conn, conf) { + + this.load = function (done) { + done(); + }; +} diff --git a/app/service/ParametersService.js b/app/service/ParametersService.js index 747e33ded42f9a64a94c2273cc8ca0ac7893b74d..93487e5400acc687350b141c6590e3a7cb6f4c33 100644 --- a/app/service/ParametersService.js +++ b/app/service/ParametersService.js @@ -12,8 +12,6 @@ function ParameterNamespace (conn, currency) { var that = this; var PublicKey = conn.model('PublicKey'); var Membership = conn.model('Membership'); - var Voting = conn.model('Voting'); - var Vote = conn.model('Vote'); var Peer = conn.model('Peer'); var Transaction = conn.model('Transaction'); var Forward = conn.model('Forward'); @@ -227,65 +225,6 @@ function ParameterNamespace (conn, currency) { ], callback); }; - this.getVoting = function (req, callback) { - if(!(req.body && req.body.voting && req.body.signature)){ - callback('Requires a voting + signature'); - return; - } - async.waterfall([ - - function (callback) { - if(req.body.signature.indexOf('-----BEGIN') == -1){ - callback('Signature does not seem to be valid'); - return; - } - callback(); - }, - - // Check signature's key ID - function(callback){ - var sig = req.body.signature; - var keyID = jpgp().signature(sig).issuer(); - if(!(keyID && keyID.length == 16)){ - callback('Cannot identify signature issuer`s keyID'); - return; - } - callback(null, keyID); - }, - - // Looking for corresponding public key - function(keyID, callback){ - PublicKey.getTheOne(keyID, function (err, pubkey) { - callback(err, pubkey); - }); - }, - - function (pubkey, next){ - var entry = new Voting(); - async.waterfall([ - function (next){ - parsers.parseVoting(next).asyncWrite(req.body.voting + req.body.signature, next); - }, - function (obj, next){ - entry = new Voting(obj); - entry.verifySignature(pubkey.raw, next); - }, - function (verified, next){ - if(!verified){ - next('Bad signature'); - return; - } - if(pubkey.fingerprint != entry.issuer){ - next('Fingerprint in Voting (' + entry.issuer + ') does not match signatory (' + pubkey.fingerprint + ')'); - return; - } - next(null, entry); - }, - ], next); - }, - ], callback); - }; - this.getWallet = function (req, callback) { if(!(req.body && req.body.entry && req.body.signature)){ callback('Requires a Wallet entry + signature'); diff --git a/app/service/PeeringService.js b/app/service/PeeringService.js index 82fd731c3c2c9708d9381b85af56a2f2f986aa8f..3903b1906d10929b16c27db5961a96a53df0926b 100644 --- a/app/service/PeeringService.js +++ b/app/service/PeeringService.js @@ -17,7 +17,6 @@ function PeeringService(conn, conf, PublicKeyService, ParametersService) { var PublicKey = conn.model('PublicKey'); var Transaction = conn.model('Transaction'); var Merkle = conn.model('Merkle'); - var Vote = conn.model('Vote'); var Peer = conn.model('Peer'); var Key = conn.model('Key'); var Forward = conn.model('Forward'); @@ -526,24 +525,12 @@ function PeeringService(conn, conf, PublicKeyService, ParametersService) { that.emit('forward', forward, [peer], done); }; - this.propagateVote = function (amendment, vote) { - getVotingPeers(function (err, peers) { - that.emit('vote', vote, peers || []); - }); - }; - this.propagateMembership = function (membership, done) { getRandomInAllPeers(function (err, peers) { that.emit('membership', membership, peers || []); }); }; - this.propagateVoting = function (voting, done) { - getRandomInAllPeers(function (err, peers) { - that.emit('voting', voting, peers || []); - }); - }; - this.coinIsOwned = function (owner, coin, tx, wallet, done) { var nbConfirmations = 0; async.forEach(wallet.trusts, function(trust, callback){ diff --git a/app/service/StrategyService.js b/app/service/StrategyService.js deleted file mode 100644 index c7c6c57fd7e5c0a6b8ee0fee6d9b1304910e6835..0000000000000000000000000000000000000000 --- a/app/service/StrategyService.js +++ /dev/null @@ -1,260 +0,0 @@ -var jpgp = require('../lib/jpgp'); -var async = require('async'); -var _ = require('underscore'); -var logger = require('../lib/logger')('amendment'); - -module.exports.get = function (conn, conf, ContractService, SyncService) { - return new StrategyService(conn, conf, ContractService, SyncService); -}; - -function StrategyService (conn, conf, ContractService, SyncService) { - - var Amendment = conn.model('Amendment'); - var Membership = conn.model('Membership'); - var Voting = conn.model('Voting'); - var PublicKey = conn.model('PublicKey'); - var Merkle = conn.model('Merkle'); - var Vote = conn.model('Vote'); - var CKey = conn.model('CKey'); - var Coin = conn.model('Coin'); - var Key = conn.model('Key'); - - var fifo = async.queue(function (task, callback) { - task(callback); - }, 1); - - this.tryToPromote = function (am, done) { - fifo.push(function (cb) { - async.waterfall([ - function (next){ - defaultPromotion(am, next); - }, - function (decision, next){ - if(decision){ - am.promoted = true; - am.save(function (err) { - if(!err){ - // Sets the promoted am as current in memory - ContractService.current(am); - logger.info("Promoted Amendment #" + am.number + " with hash " + am.hash); - next(null); - } - else next(err); - }) - } - else next(null) - }, - function (next){ - async.parallel({ - memberJoins: async.apply(async.forEach, am.getNewMembers(), async.apply(Key.memberJoin.bind(Key), am.number)), - memberLeaves: async.apply(async.forEach, am.getLeavingMembers(), async.apply(Key.memberLeave.bind(Key), am.number)), - voterJoins: async.apply(async.forEach, am.getNewVoters(), async.apply(Key.voterJoin.bind(Key), am.number)), - voterLeaves: async.apply(async.forEach, am.getLeavingVoters(), async.apply(Key.voterLeave.bind(Key), am.number)), - knownMembers: async.apply(async.forEach, am.getNewMembers(), Key.setKnown.bind(Key)), - knownVoters: async.apply(async.forEach, am.getNewVoters(), Key.setKnown.bind(Key)), - addMembers: async.apply(async.forEach, am.getNewMembers(), Key.addMember.bind(Key)), - addVoters: async.apply(async.forEach, am.getNewVoters(), Key.addVoter.bind(Key)), - removeMembers: async.apply(async.forEach, am.getLeavingMembers(), Key.removeMember.bind(Key)), - removeVoters: async.apply(async.forEach, am.getLeavingVoters(), Key.removeVoter.bind(Key)), - removeCKeys: async.apply(CKey.remove.bind(CKey), {}), - - // Leaving voters have no more current voting document - currentVoting: async.apply(async.forEach, am.getLeavingVoters(), async.apply(Voting.removeCurrents.bind(Voting))), - }, function (err) { - next(err); - }); - }, - function (next){ - // Proposed member/voter => Actual member/voter - async.parallel([ - async.apply(Key.update.bind(Key), { member: true }, { $set: { proposedMember: true }}, { multi: true }), - async.apply(Key.update.bind(Key), { member: false }, { $set: { proposedMember: false }}, { multi: true }), - async.apply(Key.update.bind(Key), { voter: true }, { $set: { proposedVoter: true }}, { multi: true }), - async.apply(Key.update.bind(Key), { voter: false }, { $set: { proposedVoter: false }}, { multi: true }), - async.apply(Key.update.bind(Key), {}, { $set: { lastVotingState: 0 }}, { multi: true }), - async.apply(Key.update.bind(Key), {}, { $set: { lastMemberState: 0 }}, { multi: true }), - ], function(err, results) { - next(err); - }); - }, - function (next){ - // Set eligible memberships as current - Membership.getEligibleForAmendment(am.number - 1, next); - }, - function (memberships, next) { - async.forEach(memberships, function(ms, callback){ - ms.current = true; - ms.save(function (err) { - callback(err); - }); - }, next); - }, - function (next){ - // Set eligible memberships as current - Voting.getEligibleForAmendment(am.number - 1, next); - }, - function (votings, next) { - async.forEach(votings, function(voting, callback){ - voting.current = true; - voting.save(function (err) { - callback(err); - }); - }, next); - }, - function (next){ - Key.getMembers(next); - }, - function (members, next){ - // Update Merkle of proposed members - async.waterfall([ - function (next){ - Merkle.proposedMembers(next); - }, - function (merkle, next){ - var fingerprints = []; - members.forEach(function(m){ - fingerprints.push(m.fingerprint); - }); - fingerprints.sort(); - merkle.initialize(fingerprints); - merkle.save(function (err) { - next(err); - }); - }, - ], next); - }, - function (next){ - Key.getVoters(next); - }, - function (voters, next){ - // Update Merkle of proposed voters - async.waterfall([ - function (next){ - Merkle.proposedVoters(next); - }, - function (merkle, next){ - var fingerprints = []; - voters.forEach(function(v){ - fingerprints.push(v.fingerprint); - }); - fingerprints.sort(); - merkle.initialize(fingerprints); - merkle.save(function (err) { - next(err); - }); - }, - ], next); - }, - // Create coins - function (next){ - Key.getManaged(next); - }, - function (keys, next){ - if (!am.dividend) { - next(); - return; - } - async.forEachSeries(keys, function(key, callback){ - var coins = []; - var power = am.coinBase; - var cNumber = 0; - am.coinList.forEach(function(quantity){ - for (var i = cNumber; i < cNumber + quantity; i++) { - var c = new Coin(); - c.owner = key.fingerprint; - c.issuer = key.fingerprint; - c.amNumber = am.number; - c.coinNumber = i; - c.power = power; - coins.push(c); - } - cNumber += quantity; - power++; - }); - async.forEach(coins, function(c, saved){ - c.save(function (err) { - saved(err); - }); - }, function (err) { - if (err) - logger.error(err); - callback(err); - }); - }, next); - }, - function (next){ - // Say amendment was promoted - next(null, true); - }, - ], cb); - }, done); - } - - function defaultPromotion (followingAm, decision) { - async.waterfall([ - function (next) { - if(!followingAm){ - next('No new amendment for promotion'); - return; - } - next(); - }, - function (next){ - Amendment.current(function (err, am) { - next(null, am); - }); - }, - function (currentAm, next){ - if(!next){ - next = currentAm; - currentAm = null; - } - // Root amendment does not require votes - if(!currentAm && followingAm.number == 0){ - next(null, true); - return; - } - if(!currentAm && followingAm.number != 0){ - next('Not promoted: need root amendment first'); - return; - } - // Vote for currently promoted: does not require promotion anymore - if(currentAm && currentAm.number == followingAm.number && currentAm.hash == followingAm.hash){ - next('Stacked vote of currently promoted'); - return; - } - // The amendment may be promoted - async.waterfall([ - function (pass){ - if(followingAm.number != currentAm.number + 1){ - pass('Not promoted: bad number: not a follower of current amendment (#' + followingAm.number + ' does not follow #' + currentAm.number + ')'); - return; - } - pass(); - }, - function (pass){ - if(currentAm.hash != followingAm.previousHash){ - pass('Not promoted: bad previous hash: this amendment does not have current amendment as previous'); - return; - } - pass(); - }, - function (pass){ - Merkle.signaturesOfAmendment(followingAm.number, followingAm.hash, function (err, merkle) { - pass(err, merkle); - }); - }, - function (votesMerkle, pass) { - if(votesMerkle.leaves().length < currentAm.nextVotes){ - pass('Not promoted: not enough votes (requires at least ' + currentAm.nextVotes + ', currently have '+votesMerkle.leaves().length+')'); - return; - } - pass(); - } - ], next); - } - ], function (err) { - decision(err, err ? false : true); - }); - } -} diff --git a/app/service/SyncService.js b/app/service/SyncService.js deleted file mode 100644 index ca4ac76c19a933b9504225173c82c8edbd9f0b43..0000000000000000000000000000000000000000 --- a/app/service/SyncService.js +++ /dev/null @@ -1,875 +0,0 @@ -var jpgp = require('../lib/jpgp'); -var async = require('async'); -var moment = require('moment'); -var request = require('request'); -var vucoin = require('vucoin'); -var merkle = require('merkle'); -var _ = require('underscore'); -var openpgp = require('openpgp'); -var Status = require('../models/statusMessage'); -var coiner = require('../lib/algos/coins/coiner'); -var log4js = require('log4js'); -var logger = require('../lib/logger')('sync'); -var mlogger = require('../lib/logger')('membership'); -var vlogger = require('../lib/logger')('voting'); -var mathlog = require('../lib/logger')('registryp'); - -mathlog.setLevel('INFO'); - -// Constants -var NO_CHANGES = "NO_CHANGES"; - -module.exports.get = function (conn, conf, signsDetached, ContractService, PeeringService, daemonJudgesTimeForVote) { - return new SyncService(conn, conf, signsDetached, ContractService, PeeringService, daemonJudgesTimeForVote); -}; - -function SyncService (conn, conf, signsDetached, ContractService, PeeringService, daemonJudgesTimeForVote) { - - var that = this; - var currency = conf.currency; - - var Amendment = conn.model('Amendment'); - var PublicKey = conn.model('PublicKey'); - var Membership = conn.model('Membership'); - var Voting = conn.model('Voting'); - var Merkle = conn.model('Merkle'); - var Vote = conn.model('Vote'); - var CKey = conn.model('CKey'); - var Statement = conn.model('Statement'); - var Peer = conn.model('Peer'); - var Key = conn.model('Key'); - var Forward = conn.model('Forward'); - - var fifoMembershipOrVoting = async.queue(function (task, callback) { - task(callback); - }, 1); - - var fifoStatement = async.queue(function (task, callback) { - task(callback); - }, 1); - - var fifoSelfVote = async.queue(function (task, callback) { - task(callback); - }, 1); - - var fifoSelfStatement = async.queue(function (task, callback) { - task(callback); - }, 1); - - this.submit = function (obj, done) { - var entry = new Membership(obj); - fifoMembershipOrVoting.push(function (cb) { - async.waterfall([ - - function (next){ - PublicKey.getTheOne(entry.issuer, next); - }, - - // Verify signature - function(pubkey, callback){ - var previous; - var current = null; - var nowIsIgnored = false; - var merkleOfNextMembers; - var amNext; - var currentContext, newContext; - async.waterfall([ - function (next){ - mlogger.debug('⬇ %s %s', entry.issuer, entry.membership); - if (ContractService.current().number != entry.amNumber) { - next('Wrong amendment number: should be \'' + ContractService.current().number + '\' but was \'' + entry.amNumber + '\''); - return; - } - if (ContractService.current().hash != entry.amHash) { - next('Wrong amendment hash: should be \'' + ContractService.current().hash + '\' but was \'' + entry.amHash + '\''); - return; - } - dependingInterval(entry, - function isTooLate (entryTS, minimalTS) { - next('Too late for this membership (' + toDateString(entryTS) + '): your membership must be at least ' + toDateString(minimalTS) + ', time of current amendment. Retry.'); - }, - function isTooEarly (entryTS, nextTS) { - next('Too early for this membership (' + toDateString(entryTS) + '): your membership must be max ' + toDateString(nextTS - 1) + ' (next AM date)'); - }, - function isGood () { - Key.wasMember(entry.issuer, entry.amNumber, next); - } - ); - }, - function (isMember, next){ - if (!isMember && entry.membership == 'OUT') { - next('You can only opt-in right now'); - } else if (isMember && entry.membership == 'IN') { - next('You can only opt-out right now'); - } else { - next(); - } - }, - function (next){ - // Get already existing Membership for same amendment - Membership.getForAmendmentAndIssuer(entry.amNumber, entry.issuer, next); - }, - function (entries, next){ - if (entries.length > 0) { - next('Already received membership'); - } - else next(); - }, - function (next){ - // Saves entry - entry.propagated = false; - entry.save(function (err) { - next(err); - }); - }, - function (next){ - mlogger.debug('✔ %s %s', entry.issuer, entry.membership); - next(null, entry); - } - ], callback); - } - ], cb); - }, done); - }; - - this.submitVoting = function (obj, done) { - var entry = new Voting(obj); - fifoMembershipOrVoting.push(function (cb) { - async.waterfall([ - - function (next){ - PublicKey.getTheOne(entry.issuer, next); - }, - - function(pubkey, callback){ - var current = null; - async.waterfall([ - function (next){ - if (ContractService.current().number != entry.amNumber) { - next('Wrong amendment number: should be \'' + ContractService.current().number + '\' but was \'' + entry.amNumber + '\''); - return; - } - if (ContractService.current().hash != entry.amHash) { - next('Wrong amendment hash: should be \'' + ContractService.current().hash + '\' but was \'' + entry.amHash + '\''); - return; - } - dependingInterval(entry, - function isTooLate (entryTS, minimalTS) { - next('Too late for this voting(' + toDateString(entryTS) + '): amendment already voted. Retry.'); - }, - function isTooEarly () { - next('Too early for this voting: retry when next amendment is voted.'); - }, - function isGood () { - async.waterfall([ - function (next) { - // Get already existing Membership for same amendment - Voting.getForAmendmentAndIssuer(entry.amNumber, entry.issuer, next); - }, - function (entries, next){ - if (entries.length > 0) { - next('Refused: already received.'); - return; - } else next(); - }, - function (next){ - // Saves entry - entry.propagated = false; - entry.save(function (err) { - next(err); - }); - }, - function (next) { - // Returns the entry - next(null, entry); - }, - ], next); - } - ); - }, - ], callback); - } - ], cb); - }, done); - }; - - this.submitStatement = function (obj, done) { - var entry = new Statement(obj); - fifoStatement.push(function (cb) { - async.waterfall([ - function (next) { - if (conf.sync.Algorithm.indexOf(entry.algorithm) == -1) { - next('Algorithm not managed by this node'); - return; - } - Statement.getByIssuerAlgoAmendmentHashAndNumber(entry.issuer, entry.algorithm, entry.amendmentHash, entry.amendmentNumber, next); - }, - function (cf, next) { - if (cf && cf.length > 0) { - next('Already received'); - return; - } - Amendment.findPromotedByNumber(entry.amendmentNumber, next); - }, - function (promoted, next) { - if (promoted.hash != entry.amendmentHash) { - next('Statement rejected: based on a non-promoted amendment'); - return; - } - entry.save(function (err) { - next(err); - }); - }, - function (next) { - // OK - if (false && entry.selfGenerated) { - // Check Merkles & create ckeys - async.parallel({ - membersJoining: async.apply(updateCKeysFromLocalMerkle, async.apply(Merkle.membersIn.bind(Merkle), entry.amendmentNumber, entry.algorithm), '+', entry.algorithm, true), - membersLeaving: async.apply(updateCKeysFromLocalMerkle, async.apply(Merkle.membersOut.bind(Merkle), entry.amendmentNumber, entry.algorithm), '-', entry.algorithm, true), - votersJoining: async.apply(updateCKeysFromLocalMerkle, async.apply(Merkle.votersIn.bind(Merkle), entry.amendmentNumber, entry.algorithm), '+', entry.algorithm, false), - votersLeaving: async.apply(updateCKeysFromLocalMerkle, async.apply(Merkle.votersOut.bind(Merkle), entry.amendmentNumber, entry.algorithm), '-', entry.algorithm, false), - }, next); - } else { - // Increment count of witnesses - async.parallel({ - membersJoining: async.apply(updateCKeysFromRemoteMerkle, entry.issuer, entry.amendmentNumber, 'node.registry.amendment.membersIn', '+', entry.algorithm, true), - membersLeaving: async.apply(updateCKeysFromRemoteMerkle, entry.issuer, entry.amendmentNumber, 'node.registry.amendment.membersOut', '-', entry.algorithm, true), - votersJoining: async.apply(updateCKeysFromRemoteMerkle, entry.issuer, entry.amendmentNumber, 'node.registry.amendment.votersIn', '+', entry.algorithm, false), - votersLeaving: async.apply(updateCKeysFromRemoteMerkle, entry.issuer, entry.amendmentNumber, 'node.registry.amendment.votersOut', '-', entry.algorithm, false), - }, next); - } - }, - function (res, next){ - that.tryToVote(entry.amendmentNumber + 1, entry.algorithm, function (err) { - if (err) logger.warn(err); - next(null, entry); - }); - }, - ], cb); - }, done); - }; - - that.tryToVote = function (amNumber, algo, done) { - // Tries to vote - var now = new Date(); - var amCurrent = null; - async.waterfall([ - function (next){ - Amendment.current(next); - }, - function (current, next) { - amCurrent = current; - Statement.getForAmendmentAndAlgo(amNumber -1, algo, next); - }, - function (cfs, next){ - logger.debug("%s statements / %s voters = %s%", cfs.length, amCurrent.votersCount, cfs.length/amCurrent.votersCount*100) - if (cfs.length/amCurrent.votersCount < 0.6) { - next('Not voting yet, waiting for >= 60% voters'); - return; - } else { - next(); - } - }, - function (next){ - getOrCreateAmendment(amNumber, algo, next); - }, - function (amNext, next){ - if (daemonJudgesTimeForVote(amNext)) { - - var raw = ""; - async.waterfall([ - function (next){ - // Prepare AM - async.waterfall([ - function (next){ - async.parallel({ - membersJoining: async.apply(lookForCKeys, '+', algo, true), - membersLeaving: async.apply(lookForCKeys, '-', algo, true), - votersJoining: async.apply(lookForCKeys, '+', algo, false), - votersLeaving: async.apply(lookForCKeys, '-', algo, false), - members: async.apply(Key.getMembers.bind(Key)), - voters: async.apply(Key.getVoters.bind(Key)) - }, next); - }, - function (res, next){ - // Update Merkle of proposed members - var members = []; - var voters = []; - if (~res.membersJoining.indexOf(NO_CHANGES)) res.membersJoining = []; - if (~res.membersLeaving.indexOf(NO_CHANGES)) res.membersLeaving = []; - if (~res.votersJoining.indexOf(NO_CHANGES)) res.votersJoining = []; - if (~res.votersLeaving.indexOf(NO_CHANGES)) res.votersLeaving = []; - res.members.forEach(function(m){ - members.push(m.fingerprint); - }); - res.voters.forEach(function(m){ - voters.push(m.fingerprint); - }); - amNext.membersChanges = []; - amNext.votersChanges = []; - res.membersJoining.forEach(function(fpr){ - amNext.membersChanges.push('+' + fpr); - if (members.indexOf(fpr) == -1) - members.push(fpr); - }); - res.membersLeaving.forEach(function(fpr){ - amNext.membersChanges.push('-' + fpr); - var index = members.indexOf(fpr); - if (~index) { - members.splice(index, 1); - } - }); - res.votersJoining.forEach(function(fpr){ - amNext.votersChanges.push('+' + fpr); - if (voters.indexOf(fpr) == -1) - voters.push(fpr); - }); - res.votersLeaving.forEach(function(fpr){ - amNext.votersChanges.push('-' + fpr); - var index = voters.indexOf(fpr); - if (~index) { - voters.splice(index, 1); - } - }); - var merkleMembers = new Merkle(); - var merkleVoters = new Merkle(); - members.sort(); - voters.sort(); - merkleMembers.initialize(members); - merkleVoters.initialize(voters); - amNext.membersChanges.sort(); - amNext.membersCount = members.length; - amNext.membersRoot = merkleMembers.root(); - amNext.votersChanges.sort(); - amNext.votersCount = voters.length; - amNext.votersRoot = merkleVoters.root(); - // Update UniversalDividend - updateUniversalDividend(amNext, next); - }, - function (next) { - amNext.save(function (err) { - raw = amNext.getRaw(); - next(err); - }); - } - ], next); - }, - function (next){ - signsDetached(raw, next); - }, - function (signature, next){ - // TODO: à remplacer par _write - var signedAm = raw + signature; - vucoin(conf.ipv6 || conf.ipv4 || conf.dns, conf.port, false, false, function (err, node) { - next(null, signedAm, node); - }); - }, - function (vote, node, next){ - node.hdc.amendments.votes.post(vote, next); - }, - function (json, next){ - var am = new Amendment(json.amendment); - var issuer = PeeringService.cert.fingerprint; - var hash = (am.getRaw() + json.signature).unix2dos().hash(); - var basis = json.amendment.number; - Vote.getByIssuerHashAndBasis(issuer, hash, basis, function (err, vote) { - next(err, vote, hash, basis); - }); - }, - function (vote, hash, basis, next){ - if (!vote) { - next('Strange! self vote was not found for #' + basis + '-' + hash + '... not recorded?'); - return; - } - vote.selfGenerated = true; - vote.save(function (err) { - next(err, vote); - }); - }, - ], next); - return; - } - next('Not yet'); - }, - ], done); - }; - - function updateCKeysFromRemoteMerkle (peerFPR, amNumber, method, op, algo, isMember, done) { - async.waterfall([ - function (next){ - Peer.getTheOne(peerFPR, next); - }, - function (peer, next){ - peer.connect(next); - }, - function (node, next){ - var f = eval(method); - f(amNumber, algo, { leaves: true }, next); - }, - function (json, next){ - incrementForKeys(json.leaves, op, algo, isMember, done); - }, - ], function (err) { - if (err) logger.warn(err); - done(err); - }); - } - - function updateCKeysFromLocalMerkle (merkleGet, op, algo, isMember, done) { - async.waterfall([ - function (next){ - merkleGet(next); - }, - function (merkle, next){ - incrementForKeys(merkle.leaves(), op, algo, isMember, done); - }, - ], done); - } - - function incrementForKeys (keys, op, algo, isMember, done) { - if (keys.length == 0) { - CKey.increment(NO_CHANGES, op, algo, isMember, function (err) { - done(err); - }); - } - else { - async.forEach(keys, function(leaf, callback){ - CKey.increment(leaf, op, algo, isMember, callback); - }, done); - } - } - - this.getVote = function (amNumber, algo, done) { - fifoSelfVote.push(function (cb) { - async.waterfall([ - function (next){ - Vote.getSelfForAlgo(amNumber, algo, next); - }, - function (vote, next){ - if (vote){ - next(null, vote); - return; - } - next('Vote unavailable for now'); - }, - ], cb); - }, done); - }; - - function lookForCKeys (op, algo, areMembers, done) { - async.waterfall([ - function (next){ - CKey.findThose(op, algo, areMembers, next); - }, - function (ckeys, next){ - // Take all keys between AVG and +/- STDVAR - var total = 0; - ckeys.forEach(function(ck){ - total += ck.count; - }); - if (total > 0) { - var avg = total / ckeys.length; - var variance = 0; - ckeys.forEach(function(ck){ - variance += (ck.count - avg)*(ck.count - avg); - }); - variance /= ckeys.length; - var stdvar = Math.sqrt(variance); - var min = avg - stdvar; - var max = avg + stdvar; - var keys = []; - ckeys.forEach(function(ck){ - if (ck.count >= min || ck.count <= max) - keys.push(ck.fingerprint); - }); - next(null, keys); - } else { - // No keys - next(null, []); - } - }, - ], done); - } - - this.getStatement = function (amNumber, algo, done) { - if (amNumber == 0) { - done('Not available for AM#0'); - return; - } - var basis = amNumber - 1; - fifoSelfStatement.push(function (cb) { - async.waterfall([ - function (next){ - Statement.getSelf(basis, algo, function (err, statement) { - next(null, statement); - }); - }, - function (st, next){ - if (st){ - next(null, st); - return; - } - // Tries to create Statement - var now = new Date(); - async.waterfall([ - function (next){ - Amendment.findPromotedByNumber(basis, next); - }, - function (amPrevious, next){ - if (daemonJudgesTimeForVote({ generated: amPrevious.generated + conf.sync.AMFreq })) { - - var cert = PeeringService.cert; - var st = new Statement(); - st.version = "1"; - st.currency = currency; - st.algorithm = algo; - st.date = new Date().utc(); - st.issuer = cert.fingerprint; - st.amendmentNumber = amPrevious.number; - st.amendmentHash = amPrevious.hash; - async.waterfall([ - function (next) { - computeLocalMSandVTChanges(basis, algo, next); - }, - function (membersJoining, membersLeaving, votersJoining, votersLeaving, members, voters, next){ - async.parallel({ - membersJoining: function(cb) { - async.waterfall([ - async.apply(Merkle.membersIn.bind(Merkle), basis, algo), - function (merkle, next) { - merkle.initialize(membersJoining); - merkle.save(function(err){ - next(err, merkle); - }); - }, - function (merkle, next) { - st.membersJoiningRoot = merkle.root(); - st.membersJoiningCount = membersJoining.length; - next(); - } - ], cb); - }, - membersLeaving: function(cb) { - async.waterfall([ - async.apply(Merkle.membersOut.bind(Merkle), basis, algo), - function (merkle, next) { - merkle.initialize(membersLeaving); - merkle.save(function(err){ - next(err, merkle); - }); - }, - function (merkle, next) { - st.membersLeavingRoot = merkle.root(); - st.membersLeavingCount = membersLeaving.length; - next(); - } - ], cb); - }, - votersJoining: function(cb) { - async.waterfall([ - async.apply(Merkle.votersIn.bind(Merkle), basis, algo), - function (merkle, next) { - merkle.initialize(votersJoining); - merkle.save(function(err){ - next(err, merkle); - }); - }, - function (merkle, next) { - st.votersJoiningRoot = merkle.root(); - st.votersJoiningCount = votersJoining.length; - next(); - } - ], cb); - }, - votersLeaving: function(cb) { - async.waterfall([ - async.apply(Merkle.votersOut.bind(Merkle), basis, algo), - function (merkle, next) { - merkle.initialize(votersLeaving); - merkle.save(function(err){ - next(err, merkle); - }); - }, - function (merkle, next) { - st.votersLeavingRoot = merkle.root(); - st.votersLeavingCount = votersLeaving.length; - next(); - } - ], cb); - }, - }, function (err) { - next(err); - }); - }, - function (next) { - signsDetached(st.getRaw(), next); - }, - function (signature, next){ - st.signature = signature; - st.selfGenerated = true; - next(null, st); - }, - ], next); - return; - } - next('Not yet'); - }, - ], next); - }, - ], cb); - }, done); - }; - - this.createSelfVoting = function (promoted, done) { - var vt = new Voting({ - version: 1, - currency: currency, - type: "VOTING", - issuer: PeeringService.cert.fingerprint, - date: new Date(promoted.generated*1000), - amNumber: promoted.number, - amHash: promoted.hash - }); - async.waterfall([ - function (next){ - signsDetached(vt.getRaw(), next); - }, - function (signature, next){ - vt.signature = signature; - PublicKey.getTheOne(PeeringService.cert.fingerprint, next); - }, - function (pubkey, next) { - next(null, vt, pubkey); - }, - ], done); - } - - this.getLastVoterOn = function (fpr, done) { - // Get last presence timestamp as a voter - async.waterfall([ - function (next){ - Key.getLastVotingAmNumber(fpr, next); - }, - function (amNumber, next){ - if (amNumber == null) { - next('Key has never been a voter', null); - return; - } else { - Amendment.findPromotedByNumber(amNumber, next); - } - }, - function (am, next){ - next(null, am.generated); - }, - ], function (err, voterOn) { - done(null, voterOn); - }); - } - - function dependingInterval (entry, isTooLate, isTooEarly, isGood) { - Amendment.current(function (err, am) { - var currentGenerated = am ? am.generated : conf.sync.AMStart; - var entryTimestamp = parseInt(entry.date.getTime()/1000, 10); - if (currentGenerated > entryTimestamp) { - isTooLate(entryTimestamp, currentGenerated); - } else if(entryTimestamp >= currentGenerated + conf.sync.AMFreq) { - isTooEarly(entryTimestamp, currentGenerated + conf.sync.AMFreq); - } else { - isGood(am); - } - }); - } - - function getOrCreateAmendment (amNumber, algo, done) { - Amendment.getTheOneToBeVoted(amNumber, algo, function (err, am) { - if (am) done(null, am); - else createAmendment(amNumber - 1, algo, function (err, amCreated) { - done(err, amCreated); - }); - }); - } - - /** - * Create next amendment following the one with `basis` amendment number, taking in account memberships, - * votings and pubkeys locally received. - **/ - function createAmendment (basis, algo, done) { - var amNext = new Amendment(); - async.waterfall([ - function (next){ - Amendment.findPromotedByNumber(basis, function (err, am) { - next(null, am); - }); - }, - function (am, next){ - amNext.selfGenerated = true; - amNext.algo = algo; - amNext.version = 1; - amNext.currency = currency; - amNext.coinAlgo = "Base2Draft"; - amNext.membersChanges = []; - amNext.votersChanges = []; - // amNext.nextVotes = Math.ceil(((am && am.votersCount) || 0) * conf.sync.Consensus); - if (am) { - amNext.number = am.number + 1; - amNext.monetaryMass = am.monetaryMass; - amNext.generated = am.generated + conf.sync.AMFreq; - amNext.previousHash = am.hash; - } else { - amNext.number = 0; - amNext.monetaryMass = 0; - amNext.generated = conf.sync.AMStart; - } - amNext.save(function (err) { - next(err); - }); - }, - ], function (err) { - done(err, amNext); - }); - } - - function computeLocalMSandVTChanges (basis, algo, done) { - var isMember = function (fpr, done) { - if (basis == -1) - done(null, true); - else - Key.wasMember(fpr, basis, done); - }; - var getPubkey = PublicKey.getTheOne.bind(PublicKey); - var algos = { - "1Sig": require('../lib/algos/community/1Sig')(isMember, getPubkey), - "AnyKey": require('../lib/algos/community/AnyKey') - }; - var algoFunc = algos[algo]; - if (!algoFunc) { - var err = "Unsupported algo '" + algo + "'"; - done(new Error(err)); - return; - } - var members = []; - var voters = []; - var membersJoining = []; - var membersLeaving = []; - var votersJoining = []; - var votersLeaving = []; - async.waterfall([ - function (next){ - async.parallel({ - members: async.apply(Key.getMembersOn.bind(Key), basis), - voters: async.apply(Key.getVotersOn.bind(Key), basis), - memberships: async.apply(Membership.getEligibleForAmendment.bind(Membership), basis), - votings: async.apply(Voting.getEligibleForAmendment.bind(Voting), basis), - }, next); - }, - function (result, next){ - result.members.forEach(function(k) { members.push(k.fingerprint); }); - result.voters.forEach(function(k) { voters.push(k.fingerprint); }); - var changingKeys = members.slice().concat(voters); - result.memberships.forEach(function(ms){ changingKeys.push(ms.issuer); }); - result.votings.forEach(function(ms){ changingKeys.push(ms.issuer); }); - // Duplicate free array - changingKeys = _(changingKeys).uniq(); - async.forEach(changingKeys, function (fpr, cb) { - async.waterfall([ - function (next){ - memberContext(fpr, basis, next); - }, - function (context, next){ - if (~members.indexOf(fpr)) - context.currentMembership = { membership: 'IN' }; - else - context.currentMembership = null; - algoFunc(context.pubkey, context, { generated: conf.sync.AMStart + basis*conf.sync.AMFreq }, next); - }, - function (indicators, next){ - var isMember = ~members.indexOf(fpr); - if (indicators.membership == 1) membersJoining.push(fpr); - if (indicators.membership == -1) membersLeaving.push(fpr); - if (isMember && indicators.key == 1) votersJoining.push(fpr); - if (isMember && indicators.key == -1) votersLeaving.push(fpr); - next(); - }, - ], cb); - }, next); - }, - function (next){ - members.sort(); - voters.sort(); - membersJoining.sort(); - membersLeaving.sort(); - votersJoining.sort(); - votersLeaving.sort(); - next(null, membersJoining, membersLeaving, votersJoining, votersLeaving, members, voters); - }, - ], done); - } - - /** - * Retrieve member's membership & voting context for next promoted amendment. - */ - function memberContext (member, amNumber, done) { - async.parallel({ - voterOn: function (callback){ - that.getLastVoterOn(member, callback); - }, - nextMembership: function (callback){ - // Get lastly emitted & valid (not confirmed) membership FOR amNumber - Membership.getForAmendmentAndIssuer(amNumber, member, function (err, records) { - var res = (err || !records || records.length == 0) ? null : records[0]; - callback(null, res); - }); - }, - nextVoting: function (callback){ - // Get lastly emitted & valid (not confirmed) votings FOR amNumber - Voting.getForAmendmentAndIssuer(amNumber, member, function (err, votings) { - var res = (err || !votings || votings.length == 0) ? null : votings[0]; - callback(null, res); - }); - }, - pubkey: function (callback){ - // Get lastly emitted & valid (not confirmed) votings FOR amNumber - PublicKey.getTheOne(member, callback); - } - }, function (err, ctx) { - // Add amendment number - ctx.amNumber = amNumber; - done(err, ctx); - }); - } - - function updateUniversalDividend (amNext, done) { - // Time for Universal Dividend (and we have members) - var delayPassedSinceRootAM = (amNext.generated - conf.sync.AMStart); - if (delayPassedSinceRootAM > 0 && delayPassedSinceRootAM % conf.sync.UDFreq == 0 && amNext.membersCount > 0) { - async.waterfall([ - function (next) { - Amendment.getPreviouslyPromotedWithDividend(next); - }, - function (previousWithUD, next){ - var prevM = (previousWithUD && previousWithUD.monetaryMass) || 0; - var prevUD = (previousWithUD && previousWithUD.dividend) || conf.sync.UD0; - var prevN = (previousWithUD && previousWithUD.membersCount) || 0; - amNext.monetaryMass = prevM + prevUD*prevN; - var c = conf.sync.UDPercent; - var UD = Math.ceil(c*amNext.monetaryMass/amNext.membersCount); - amNext.dividend = Math.max(prevUD, UD); // Integer - var coinage = coiner.Base2Draft(amNext.dividend, 0, 0); - amNext.coinBase = coinage.coinBase; - amNext.coinList = coinage.coinList; - next(); - }, - ], done); - } - else done(null); - } -}; -/**************** Utils ***********************/ - -function toDateString (timestamp) { - var intTimpestamp = parseInt(timestamp); - var d = new Date(); - d.setTime(timestamp*1000); - return moment(d).format("GGGG-MM-DD hh:mm:ss"); -} diff --git a/app/service/VoteService.js b/app/service/VoteService.js deleted file mode 100644 index 40336bca8e2a9b266f6e7ff94ad66b177547d3fe..0000000000000000000000000000000000000000 --- a/app/service/VoteService.js +++ /dev/null @@ -1,205 +0,0 @@ -var jpgp = require('../lib/jpgp'); -var async = require('async'); -var _ = require('underscore'); -var merkle = require('merkle'); -var logger = require('../lib/logger')('vote'); -var alogger = require('../lib/logger')('amendment'); - -module.exports.get = function (conn, StrategyService) { - return new VoteService(conn, StrategyService); -}; - -function VoteService (conn, StrategyService) { - - var Amendment = conn.model('Amendment'); - var PublicKey = conn.model('PublicKey'); - var Merkle = conn.model('Merkle'); - var Vote = conn.model('Vote'); - var Key = conn.model('Key'); - - var fifo = async.queue(function (task, callback) { - task(callback); - }, 1); - - this.submit = function(jsonVote, callback) { - var vote = new Vote(jsonVote); - vote.issuer = jsonVote.pubkey.fingerprint; - vote.amendment = new Amendment(jsonVote.amendment); - var hash = vote.amendment.getHash(); - var that = this; - fifo.push(function (cb) { - async.waterfall([ - function (next){ - Amendment.current(function (err, am) { - var currNumber = am ? parseInt(am.number) : -1; - var voteNumber = parseInt(vote.basis) - if(voteNumber > currNumber + 1){ - next('Previous amendment not found, cannot record vote for amendment #' + vote.basis); - return; - } - next(); - }); - }, - function (next){ - if (vote.amendment.generated > vote.sigDate.timestamp()) { - next('Cannot vote for future amendment'); - return; - } - next(); - }, - // Issuer is a voter - function (next){ - Key.wasVoter(vote.pubkey.fingerprint, vote.amendment.number - 1, next); - }, - function (isVoter, next){ - if(!isVoter && vote.amendment.number != 0){ - next('Only voters may vote for amendments'); - return; - } - next(); - }, - function (next){ - if(parseInt(vote.basis) > 0){ - // Check if previous votes tree matches - var pendingAm; - async.waterfall([ - function (next){ - vote.getAmendment(next); - }, - function (am, next){ - pendingAm = am; - Merkle.signaturesOfAmendment(pendingAm.number - 1, pendingAm.previousHash, function (err, merkle) { - next(err, merkle); - }); - }, - function (signaturesMerkle, next){ - next(null, signaturesMerkle.leaves()); - } - ], next); - } else { - // No previous votes exists for AM0, no need to check signatures - next(null, []); - } - }, - function (signaturesMerkle, next) { - /* Update URLs: - - hdc/amendments/[AMENDMENT_ID]/self - - hdc/amendments/[AMENDMENT_ID]/signatures */ - that.saveAmendmentOfVote(vote, vote.amendment, signaturesMerkle, next); - }, - function (am, next){ - vote.amendment = am; - // Find preceding vote of the issuer, for this amendment - Vote.find({ issuer: vote.pubkey.fingerprint, basis: vote.basis, amendmentHash: am.hash }, next); - }, - function (votes, next){ - // Save vote - if(votes.length > 0){ - next('Vote already received'); - return; - } - vote.save(function (err) { - next(err); - }); - }, - function ( next){ - // Update signatures (hdc/amendments/votes/[AMENDMENT_ID]) - Merkle.updateSignaturesOfAmendment(vote.amendment, jsonVote.pubkey.fingerprint, function (err) { - next(err, vote.amendment, vote); - }); - }, - function (am, recordedVote, next) { - // Promotion time - StrategyService.tryToPromote(am, function (err, wasPromoted) { - if (err) logger.warn(err); - next(null, am, recordedVote, wasPromoted ? true : false); - }); - } - ], cb); - }, callback); - }; - - this.saveAmendmentOfVote = function (vote, amendment, signaturesLeaves, done) { - var am; - async.waterfall([ - function (next) { - Amendment.find({ number: amendment.number, hash: amendment.hash }, next); - }, - function (ams, next){ - am = (ams && ams[0]) || amendment; - // Donne le Merkle des signatures (hdc/amendments/[AMENDMENT_ID]/signatures) - Merkle.signaturesOfAmendment(am.number, am.hash, next); - }, - function (merkle, next){ - // Met à jour le Merkle - merkle.initialize(signaturesLeaves); - merkle.save(function (err){ - next(err); - }); - }, - function (next){ - // Met à jour la Masse Monétaire - am.getPrevious(function (err, previous) { - next(null, previous); - }); - }, - function (previous, next){ - var prevM = (previous && previous.monetaryMass) || 0; - var prevUD = (previous && previous.dividend) || 0; - var prevN = (previous && previous.membersCount) || 0; - am.monetaryMass = prevM + prevUD*prevN; - next(); - }, - function (next){ - // Termine la sauvegarde - am.save(function (err) { - next(err, am); - }); - }, - ], done); - }; - - this.votesIndex = function (onceDone) { - async.waterfall([ - function (next){ - Vote.find(next); - }, - function (votes, next){ - var map = {}; - votes.forEach(function (v) { - var id = [v.basis, v.amendmentHash].join('-'); - map[id] = map[id] ? map[id] + 1 : 1; - }); - var tab = []; - for(var id in map){ - var sp = id.split('-'); - tab.push({ number: sp[0], hash: sp[1], count: map[id] }); - } - next(null, tab); - }, - function (stats, next) { - var result = {}; - async.forEach(stats, function(item, callback){ - if(!result[item.number]) result[item.number] = {}; - result[item.number][item.hash] = item.count; - callback(); - }, function(err){ - if(err){ - next(err); - return; - } - var json = { amendments: {} }; - for(var number in result){ - var hashes = {}; - for(var hash in result[number]){ - hashes[hash] = result[number][hash]; - } - json.amendments[number] = hashes; - } - next(null, json); - } - ); - } - ], onceDone); - } -} diff --git a/app/service/WalletService.js b/app/service/WalletService.js index 1f1fc37e00fcc56d3d0791989d60499071815aea..dd2901fb6e0dc60256c95ab31e99efc798720b24 100644 --- a/app/service/WalletService.js +++ b/app/service/WalletService.js @@ -12,7 +12,6 @@ function WalletService (conn) { var Amendment = conn.model('Amendment'); var PublicKey = conn.model('PublicKey'); var Merkle = conn.model('Merkle'); - var Vote = conn.model('Vote'); this.submit = function (obj, done) { diff --git a/bin/ucoind b/bin/ucoind index afdf73e2dc991165702d049fec97b7542b98c80c..8271ee81223ddab6023bd7fc24e5f14364bd423d 100755 --- a/bin/ucoind +++ b/bin/ucoind @@ -41,17 +41,7 @@ program .option('--remotep <port>', 'Remote port others may use to contact this node') .option('--kmanagement <ALL|KEYS>', 'Define key management policy') .option('--kaccept <ALL|KEYS>', 'Define key acceptance policy') - .option('--amdaemon <ON|OFF>', 'ucoin is launched with a specific daemon helping to get other peers\' votes') - .option('--amstart <timestamp>', 'First amendment generated date', parseMoment) - .option('--amfreq <timestamp>', 'Amendments frequency, in seconds', parseInt) - .option('--udfreq <timestamp>', 'Universal Dividend frequency, in seconds', parseInt) - .option('--ud0 <integer>', 'First Universal Dividend value (a.k.a \'UD0\')', parseInt) - .option('--udpercent <float>', 'Percent of monetary mass growth per UD', parseFloat) - .option('--consensus <float>', 'Percent of voters required to accept an amendment', parseFloat) - .option('--msvalidity <timestamp>', 'Duration of a valid membership, in seconds', parseInt) - .option('--vtvalidity <timestamp>', 'Duration of a valid voter, in seconds', parseInt) .option('--openpgpjs', 'Prefer using embedded Openpgpjs implementation for signing requests') - .option('--algorithm <AnyKey:1Sig>', 'Algorithms to use for community changes. Use \':\' to give multiple values', splitColon) ; program @@ -112,8 +102,7 @@ program 'currency': wiz.configCurrency, 'openpgp': wiz.configOpenpgp, 'network': wiz.configNetwork, - 'key': wiz.configKey, - 'autovote': wiz.configAutovote + 'key': wiz.configKey }; var wizDo = task[step] || wiz.configAll; async.waterfall([ @@ -128,7 +117,7 @@ program }, function (next) { // Check config - service(DO_NOT_LISTEN_HTTP, ucoin.createRegistryServer, function (key, server, conf) { + service(DO_NOT_LISTEN_HTTP, ucoin.createPeerServer, function (key, server, conf) { next(); })(null, null); } @@ -297,11 +286,11 @@ program program .command('start') .description('Start uCoin server using given --currency') - .action(service(LISTEN_HTTP, ucoin.createRegistryServer, function (server, conf) { + .action(service(LISTEN_HTTP, ucoin.createPKSServer, function (server, conf) { - server - .pipe(router(server.PeeringService.cert.fingerprint, server.conn)) - .pipe(multicaster()); + // server + // .pipe(router(server.PeeringService.cert.fingerprint, server.conn)) + // .pipe(multicaster()); // Launching server server.on('BMALoaded', function (err, app) { @@ -344,16 +333,6 @@ function overrideConf(conf) { policy: { keys: program.kmanagement, pubkeys: program.kaccept - }, - sync: { - AMDaemon: program.amdaemon, - AMStart: program.amstart, - AMFreq: program.amfreq, - UDFreq: program.udfreq, - UD0: program.ud0, - UDPercent: program.udpercent, - Consensus: program.consensus, - Algorithm: program.algorithm } }; @@ -373,14 +352,6 @@ function overrideConf(conf) { if (cli.server.remote.port != undefined) conf.remoteport = cli.server.remote.port; if (cli.policy.keys) conf.kmanagement = cli.policy.keys; if (cli.policy.pubkeys) conf.kaccept = cli.policy.pubkeys; - if (cli.sync.AMDaemon) conf.sync.AMDaemon = cli.sync.AMDaemon; - if (cli.sync.AMStart) conf.sync.AMStart = cli.sync.AMStart; - if (cli.sync.AMFreq) conf.sync.AMFreq = cli.sync.AMFreq; - if (cli.sync.UDFreq) conf.sync.UDFreq = cli.sync.UDFreq; - if (cli.sync.UD0) conf.sync.UD0 = cli.sync.UD0; - if (cli.sync.UDPercent) conf.sync.UDPercent = cli.sync.UDPercent; - if (cli.sync.Consensus) conf.sync.Consensus = cli.sync.Consensus; - if (cli.sync.Algorithm) conf.sync.Algorithm = cli.sync.Algorithm; // Specific internal settings conf.createNext = true; @@ -416,7 +387,7 @@ function service(listenHTTP, serverFactory, callback) { if (arguments.length == 1) { callback = listenHTTP; listenHTTP = false; - serverFactory = ucoin.createHDCServer; + serverFactory = ucoin.createWOTServer; } else if (arguments.length == 2) { callback = serverFactory; serverFactory = ucoin.createHDCServer; diff --git a/doc/HTTP_API.md b/doc/HTTP_API.md index 718577df4db91205bf56f6d1f0c9af2679b2779d..680d57d9c8290ef3ea1c4362be209acb54322932 100644 --- a/doc/HTTP_API.md +++ b/doc/HTTP_API.md @@ -790,7 +790,7 @@ Consensus | Percent of voters required to valid an Amendment #### `am/[AMENDMENT_NUMBER]` **Goal** -GET the promoted amendment with number `AMENDMENT_NUMBER` (amendment which received enough votes to be accepted). +GET the promoted amendment with number `AMENDMENT_NUMBER`. **Parameters** @@ -809,11 +809,6 @@ The promoted amendment if it exists (otherwise return HTTP 404). "generated": 1400588975, "previousHash": "0F45DFDA214005250D4D2CBE4C7B91E60227B0E5", "dividend": "100", - "votersRoot": "DC7A9229DFDABFB9769789B7BFAE08048BCB856F", - "votersCount": "2", - "votersChanges": [ - "-C73882B64B7E72237A2F460CE9CAB76D19A8651E" - ], "membersRoot": "F92B6F81C85200250EE51783F5F9F6ACA57A9AFF", "membersCount": "4", "membersChanges": [ diff --git a/doc/Protocol.md b/doc/Protocol.md index 25da8712c16679b771f3f771bf988b928fea2585..8b098d0795d900ab67583a96781d1e6867e63daf 100644 --- a/doc/Protocol.md +++ b/doc/Protocol.md @@ -36,7 +36,7 @@ Word | Description ---- | ------------- Universal Dividend | Money issuance **directly** and **exclusively** on community members. Community | A groupment of individuals linked together trought a Monetary Contract. -Monetary Contract | A document gathering the informations defining the community members, voters and monetary mass inside it. +Monetary Contract | A document gathering the informations defining the community members and monetary mass inside it. ## Introduction diff --git a/hdcserver.js b/hdcserver.js deleted file mode 100644 index 86d0b06eb9f1eb6ed7e464b9541930ffb8d9959a..0000000000000000000000000000000000000000 --- a/hdcserver.js +++ /dev/null @@ -1,108 +0,0 @@ -var async = require('async'); -var util = require('util'); -var parsers = require('./app/lib/streams/parsers/doc'); -var PKSServer = require('./pksserver'); - -function HDCServer (dbConf, overrideConf, interceptors, onInit) { - - var logger = require('./app/lib/logger')(dbConf.name); - - var selfInterceptors = [ - { - // Vote - matches: function (obj) { - return obj.amendment ? true : false; - }, - treatment: function (server, obj, next) { - logger.debug('⬇ VOTE of %s for %s-%s', "0x" + obj.keyID, obj.amendment.number, obj.amendment.hash); - async.waterfall([ - function (next){ - server.VoteService.submit(obj, next); - }, - function (am, vote, wasPromoted, next){ - logger.debug('✔ VOTE of %s for %s-%s', "0x" + obj.keyID, obj.amendment.number, obj.amendment.hash); - server.emit('vote', vote); - if (wasPromoted) { - server.emit('promoted', vote.amendment); - } - next(null, vote); - }, - ], next); - } - },{ - // Transaction - matches: function (obj) { - return obj.recipient ? true : false; - }, - treatment: function (server, obj, next) { - async.waterfall([ - function (next){ - server.TransactionsService.processTx(obj, next); - }, - function (tx, next){ - server.emit('transaction', tx); - next(null, tx); - }, - ], next); - } - } - ]; - - PKSServer.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), onInit || []); - - var that = this; - - this._read = function (size) { - }; - - this._initServices = function(conn, done) { - this.KeyService = require('./app/service/KeyService').get(conn); - this.PublicKeyService = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService); - this.ContractService = require('./app/service/ContractService').get(conn, that.conf); - this.StrategyService = require('./app/service/StrategyService').get(conn, that.conf, that.ContractService); - this.VoteService = require('./app/service/VoteService').get(conn, that.StrategyService); - // this.PeeringService = require('./app/service/PeeringService').get(conn, that.conf, that.PublicKeyService, that.ParametersService); - this.TransactionsService = require('./app/service/TransactionsService').get(conn, that.MerkleService); - async.parallel({ - contract: function(callback){ - that.ContractService.load(callback); - }, - peering: function(callback){ - // that.PeeringService.load(callback); - callback(); - }, - }, function (err) { - done(err); - }); - }; - - this._listenBMA = function (app) { - this.listenPKS(app); - this.listenHDC(app); - }; - - this.listenHDC = function (app) { - var hdc = require('./app/controllers/hdc')(that); - app.get( '/hdc/amendments/promoted', hdc.amendments.promoted); - app.get( '/hdc/amendments/promoted/:am_number', hdc.amendments.promotedNumber); - app.get( '/hdc/amendments/view/:amendment_id/self', hdc.amendments.viewAM.self); - app.get( '/hdc/amendments/view/:amendment_id/signatures', hdc.amendments.votes.sigs); - app.get( '/hdc/amendments/votes', hdc.amendments.votes.get); - app.post( '/hdc/amendments/votes', hdc.amendments.votes.post); - app.post( '/hdc/transactions/process', hdc.transactions.processTx); - app.get( '/hdc/transactions/last/:count', hdc.transactions.lastNAll); - app.get( '/hdc/transactions/sender/:fpr', hdc.transactions.sender.get); - app.get( '/hdc/transactions/sender/:fpr/view/:number', hdc.transactions.viewtx); - app.get( '/hdc/transactions/sender/:fpr/last/:count', hdc.transactions.sender.lastNofSender); - app.get( '/hdc/transactions/sender/:fpr/last/:count/:from', hdc.transactions.sender.lastNofSender); - app.get( '/hdc/transactions/recipient/:fpr', hdc.transactions.recipient); - app.get( '/hdc/transactions/refering/:fpr/:number', hdc.transactions.refering); - app.get( '/hdc/coins/list/:fpr', hdc.coins.list); - app.get( '/hdc/coins/view/:coin_id/owner', hdc.coins.view); - app.get( '/hdc/coins/view/:coin_id/history', hdc.coins.history); - }; -} - -util.inherits(HDCServer, PKSServer); - -module.exports = HDCServer; diff --git a/index.js b/index.js index 386cd1d2150e1ef62003b1ade8ac61d9d2fd7f1f..a5fb799541f0470e2b46d590cdbffdf60452e0de 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,9 @@ -var Server = require('./server'); -var PKSServer = require('./pksserver'); -var HDCServer = require('./hdcserver'); -var PeerServer = require('./peerserver'); -var RegistryServer = require('./regserver'); +var Server = require('./server'); +var PKSServer = require('./pksserver'); +var WOTServer = require('./wotserver'); +var PeerServer = require('./peerserver'); +var TxServer = require('./txserver'); module.exports = { connect: function (dbConf, overConf) { @@ -12,13 +12,13 @@ module.exports = { createPKSServer: function (dbConf, overConf) { return new PKSServer(dbConf, overConf); }, - createHDCServer: function (dbConf, overConf) { - return new HDCServer(dbConf, overConf); + createWOTServer: function (dbConf, overConf) { + return new WOTServer(dbConf, overConf); }, createPeerServer: function (dbConf, overConf) { return new PeerServer(dbConf, overConf); }, - createRegistryServer: function (dbConf, overConf) { - return new RegistryServer(dbConf, overConf); + createTxServer: function (dbConf, overConf) { + return new TxServer(dbConf, overConf); } } diff --git a/peerserver.js b/peerserver.js index 250564e0b3b6218e5c119271f56e4fc41f3f7848..0b755b3cb56e9322bd5bc448cf6929c42531f7e5 100644 --- a/peerserver.js +++ b/peerserver.js @@ -8,7 +8,7 @@ var plogger = require('./app/lib/logger')('peer'); var flogger = require('./app/lib/logger')('forward'); var slogger = require('./app/lib/logger')('status'); var wlogger = require('./app/lib/logger')('wallet'); -var HDCServer = require('./hdcserver'); +var WOT = require('./wotserver'); var parsers = require('./app/lib/streams/parsers/doc'); function PeerServer (dbConf, overrideConf, interceptors, onInit) { @@ -99,7 +99,7 @@ function PeerServer (dbConf, overrideConf, interceptors, onInit) { } ].concat(onInit || []); - HDCServer.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), initFunctions); + WOT.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), initFunctions); var that = this; @@ -114,8 +114,6 @@ function PeerServer (dbConf, overrideConf, interceptors, onInit) { that.KeyService = require('./app/service/KeyService').get(conn); that.PublicKeyService = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService); that.ContractService = require('./app/service/ContractService').get(conn, that.conf); - that.StrategyService = require('./app/service/StrategyService').get(conn, that.conf, that.ContractService); - that.VoteService = require('./app/service/VoteService').get(conn, that.StrategyService); that.PeeringService = require('./app/service/PeeringService').get(conn, that.conf, that.PublicKeyService, that.ParametersService); that.TransactionsService = require('./app/service/TransactionsService').get(conn, that.MerkleService, that.PeeringService); that.WalletService = require('./app/service/WalletService').get(conn); @@ -356,6 +354,6 @@ function PeerServer (dbConf, overrideConf, interceptors, onInit) { } } -util.inherits(PeerServer, HDCServer); +util.inherits(PeerServer, WOT); module.exports = PeerServer; diff --git a/pksserver.js b/pksserver.js index 9e141cf693fe4fb90461304da5f0ee21de409389..fa86e930c52e7442e53e8f5b2bb24853460d9b07 100644 --- a/pksserver.js +++ b/pksserver.js @@ -3,7 +3,7 @@ var util = require('util'); var parsers = require('./app/lib/streams/parsers/doc'); var Server = require('./server'); -function HDCServer (dbConf, overrideConf, interceptors, onInit) { +function PKSServer (dbConf, overrideConf, interceptors, onInit) { var logger = require('./app/lib/logger')(dbConf.name); @@ -46,6 +46,7 @@ function HDCServer (dbConf, overrideConf, interceptors, onInit) { this._initServices = function(conn, done) { this.KeyService = require('./app/service/KeyService').get(conn); this.PublicKeyService = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService); + done(); }; this._listenBMA = function (app) { @@ -60,6 +61,6 @@ function HDCServer (dbConf, overrideConf, interceptors, onInit) { }; } -util.inherits(HDCServer, Server); +util.inherits(PKSServer, Server); -module.exports = HDCServer; +module.exports = PKSServer; diff --git a/readme.md b/readme.md index b1ca714044d8759a5511caab14f6ddd37657fd7f..f8bb8ff2778a6737addef4d9ed0e2ed00a2ba36c 100644 --- a/readme.md +++ b/readme.md @@ -131,7 +131,7 @@ $ ucoind wizard ### Target only few wizard's steps -Wizard is composed of 4 steps: `currency`, `openpgp`, `network`, `key`, `autovote`. By adding one of those words to `wizard` command, you will only do the attached steps: +Wizard is composed of 4 steps: `currency`, `openpgp`, `network`, `key`. By adding one of those words to `wizard` command, you will only do the attached steps: ```bash $ ucoind wizard network @@ -245,16 +245,6 @@ Options: --remotep <port> Remote port others may use to contact this node --kmanagement <ALL|KEYS> Define key management policy --kaccept <ALL|KEYS> Define key acceptance policy - --amdaemon <ON|OFF> ucoin is launched with a specific daemon helping to get other peers' votes - --amstart <timestamp> First amendment generated date - --amfreq <timestamp> Amendments frequency, in seconds - --udfreq <timestamp> Universal Dividend frequency, in seconds - --ud0 <integer> First Universal Dividend value (a.k.a 'UD0') - --udpercent <float> Percent of monetary mass growth per UD - --consensus <float> Percent of voters required to accept an amendment - --msvalidity <timestamp> Duration of a valid membership, in seconds - --vtvalidity <timestamp> Duration of a valid voter, in seconds - ``` diff --git a/regserver.js b/regserver.js deleted file mode 100644 index 3fe6d5ac3f6cd78812a73a93d5cdb1507f6722a3..0000000000000000000000000000000000000000 --- a/regserver.js +++ /dev/null @@ -1,236 +0,0 @@ -var async = require('async'); -var util = require('util'); -var logger = require('./app/lib/logger')('regserver'); -var PeerServer = require('./peerserver'); - -function RegistryServer (dbConf, overrideConf, interceptors) { - - var selfInterceptors = [ - { - // Membership - matches: function (obj) { - return obj.type && obj.type == "MEMBERSHIP" ? true : false; - }, - treatment: function (server, obj, next) { - async.waterfall([ - function (next){ - that.SyncService.submit(obj, next); - }, - function (membership, next){ - that.emit('membership', membership); - next(null, membership); - }, - ], next); - } - },{ - // Voting - matches: function (obj) { - return obj.type && obj.type == "VOTING" ? true : false; - }, - treatment: function (server, obj, next) { - async.waterfall([ - function (next){ - logger.debug('⬇ %s\'s voting', "0x" + obj.issuer.substr(32)); - that.SyncService.submitVoting(obj, next); - }, - function (voting, next){ - logger.debug('✔ %s\'s voting', "0x" + obj.issuer.substr(32)); - that.emit('voting', voting); - next(null, voting); - }, - ], next); - } - },{ - // Statement - matches: function (obj) { - return obj.algorithm ? true : false; - }, - treatment: function (server, obj, next) { - async.waterfall([ - function (next){ - logger.debug('⬇ Statement based on AM#%s from %s', obj.amendmentNumber, obj.issuer); - that.SyncService.submitStatement(obj, next); - }, - function (statement, next){ - logger.debug('✔ Statement based on AM#%s from %s', obj.amendmentNumber, obj.issuer); - that.emit('statement', statement); - next(null, statement); - }, - ], next); - } - } - ]; - - var initFunctions = [ - function (done) { - that.initRegistry(that.conn, that.conf, done); - } - ]; - - PeerServer.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), initFunctions); - - var that = this; - - this._read = function (size) { - }; - - this._initServices = function(conn, done) { - async.waterfall([ - function (next){ - that.checkConfig(next); - }, - function (next){ - that.KeyService = require('./app/service/KeyService').get(conn); - that.ContractService = require('./app/service/ContractService').get(conn, that.conf); - that.PublicKeyService = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService); - that.PeeringService = require('./app/service/PeeringService').get(conn, that.conf, that.PublicKeyService, that.ParametersService); - next(); - }, - function (next){ - that.createSignFunction(that.conf, next); - }, - function (next){ - that.SyncService = require('./app/service/SyncService').get(conn, that.conf, that.sign, that.ContractService, that.PeeringService, that.daemonJudgesTimeForVote); - that.StrategyService = require('./app/service/StrategyService').get(conn, that.conf, that.ContractService, that.SyncService); - that.VoteService = require('./app/service/VoteService').get(conn, that.StrategyService); - that.TransactionsService = require('./app/service/TransactionsService').get(conn, that.MerkleService, that.PeeringService); - that.WalletService = require('./app/service/WalletService').get(conn); - async.parallel({ - contract: function(callback){ - that.ContractService.load(callback); - }, - peering: function(callback){ - that.PeeringService.load(callback); - }, - }, function (err) { - next(err); - }); - }, - ], done); - }; - - this.checkConfig = function (done) { - async.waterfall([ - function (next){ - that.checkPeeringConf(that.conf, next); - }, - function (next){ - that.checkDaemonConf(that.conf, next); - } - ], done); - }; - - this.initRegistry = function (conn, conf, done) { - async.waterfall([ - function (next){ - // Init Daemon - that.daemon = require('./app/lib/daemon')(that); - that.daemon.init(conf, that.PeeringService.cert.fingerprint); - // Start autonomous contract daemon - that.daemon.start(); - next(); - }, - ], done); - }; - - this.daemonJudgesTimeForVote = function (amNext) { - return that.daemon.judges.timeForVote(amNext); - }; - - this.checkDaemonConf = function (conf, done) { - var errors = []; - if (conf.sync.AMDaemon == "ON") { - if (!conf.sync.AMStart) { - errors.push('Autovoting enabled but starting date not given'); - } - if (!conf.sync.AMFreq) { - errors.push('Autovoting enabled but amendment frequency not given'); - } - if (!conf.sync.UDFreq) { - errors.push('Autovoting enabled but dividend frequency not given'); - } - if (conf.sync.UDFreq % conf.sync.AMFreq != 0) { - errors.push('UD frequency must be a multiple of Amendment frequency'); - } - if (!conf.sync.UD0) { - errors.push('Autovoting enabled but initial dividend not given'); - } - if (!conf.sync.UDPercent) { - errors.push('Autovoting enabled but %dividend not given'); - } - if (!conf.sync.Consensus) { - errors.push('Autovoting enabled but %required votes not given'); - } - } - done(errors[0]); - }; - - this._listenBMA = function (app) { - this.listenPKS(app); - this.listenHDC(app); - this.listenNET(app); - this.listenREG(app); - }; - - this.listenREG = function (app) { - var reg = require('./app/controllers/registry')(that, that.conf); - app.get( '/registry/parameters', reg.parameters); - app.post( '/registry/community/members', reg.membershipPost); - app.get( '/registry/community/members/:fpr/current', reg.membershipCurrent); - app.get( '/registry/community/members/:fpr/history', reg.membershipHistory); - app.post( '/registry/community/voters', reg.votingPost); - app.get( '/registry/community/voters/:fpr/current', reg.votingCurrent); - app.get( '/registry/community/voters/:fpr/history', reg.votingHistory); - app.post( '/registry/amendment/statement', reg.statementPost); - app.get( '/registry/amendment/:am_number/:algo/members/in', reg.membersIn); - app.get( '/registry/amendment/:am_number/:algo/members/out', reg.membersOut); - app.get( '/registry/amendment/:am_number/:algo/voters/in', reg.votersIn); - app.get( '/registry/amendment/:am_number/:algo/voters/out', reg.votersOut); - app.get( '/registry/amendment/:am_number/:algo/self', reg.askSelf); - app.get( '/registry/amendment/:am_number/:algo/statement', reg.askStatement); - app.get( '/registry/amendment/:am_number/:algo/vote', reg.askVote); - } - - var SELF_ACTUALIZATION_FREQUENCY = 3600*24*10; - - this.on('promoted', function (amendment) { - var nextTimestamp = amendment.generated + that.conf.sync.AMFreq; - async.waterfall([ - function (next){ - that.SyncService.getLastVoterOn(that.PeeringService.cert.fingerprint, next); - }, - function (voterOn, next){ - if (!voterOn || (voterOn + SELF_ACTUALIZATION_FREQUENCY - nextTimestamp <= 0)) { - actualizeVoting(amendment, next); - } - else next(); - }, - ], function (err, vt) { - if (err) logger.error(err); - var now = new Date().timestamp(); - that.daemon.nextIn((nextTimestamp - now)*1000); - }); - }); - - function actualizeVoting (amendmentBasis, done) { - async.waterfall([ - function (next){ - that.SyncService.createSelfVoting(amendmentBasis, next); - }, - function (vt, pubkey, next){ - var json = vt.json(); - var obj = json.voting; - obj.type = obj.registry; - obj.signature = json.signature; - obj.pubkey = pubkey; - obj.date = new Date(obj.date*1000); - obj.sigDate = new Date(); - that.singleWriteStream(next)._write(obj, null, next); - }, - ], done); - } -} - -util.inherits(RegistryServer, PeerServer); - -module.exports = RegistryServer; diff --git a/server.js b/server.js index 602563051b6242b8dbc23849b4a38d5c977f481b..c6bd1bf97f31dc687b3e0accf6cfd65a2c16cb6c 100644 --- a/server.js +++ b/server.js @@ -10,7 +10,7 @@ var http = require('http'); var log4js = require('log4js'); var connectPgp = require('connect-pgp'); -var models = ['Amendment', 'Coin', 'Configuration', 'Forward', 'Key', 'CKey', 'Merkle', 'Peer', 'PublicKey', 'Wallet', 'Transaction', 'Vote', 'TxMemory', 'Membership', 'Voting', 'Statement']; +var models = ['Amendment', 'Coin', 'Configuration', 'Forward', 'Key', 'CKey', 'Merkle', 'Peer', 'PublicKey', 'Wallet', 'Transaction', 'TxMemory', 'Membership']; var INNER_WRITE = true; function Server (dbConf, overrideConf, interceptors, onInit) { @@ -138,14 +138,9 @@ function Server (dbConf, overrideConf, interceptors, onInit) { var Configuration = conn.model('Configuration'); that.conf = foundConf[0] || new Configuration(); if (overrideConf) { - _(_(overrideConf).keys()).without('sync').forEach(function(k){ + _(overrideConf).keys().forEach(function(k){ that.conf[k] = overrideConf[k]; }); - if (overrideConf.sync) { - _(overrideConf.sync).keys().forEach(function(k){ - that.conf.sync[k] = overrideConf.sync[k]; - }); - } } if (reset) { that.reset(next); @@ -177,11 +172,8 @@ function Server (dbConf, overrideConf, interceptors, onInit) { 'publickeys', 'wallets', 'transactions', - 'votes', 'txmemories', - 'memberships', - 'votings', - 'statements']; + 'memberships']; async.forEachSeries(deletableCollections, function(collection, next){ if (that.conn.collections[collection]) { that.conn.collections[collection].drop(function (err) { @@ -235,6 +227,8 @@ function Server (dbConf, overrideConf, interceptors, onInit) { // To override in child classes }; + this._sign = null; + function listenBMA (overConf, onLoaded) { if (arguments.length == 1) { onLoaded = overConf; @@ -253,9 +247,11 @@ function Server (dbConf, overrideConf, interceptors, onInit) { async.waterfall([ function (next){ - // HTTP Signatures - app.use(connectPgp(that.sign)); - logger.debug('Signed requests with PGP: enabled.'); + if (that._sign) { + // HTTP Signatures + app.use(connectPgp(that.sign)); + logger.debug('Signed requests with PGP: enabled.'); + } // Routing app.use(app.router); diff --git a/test/data/statements/cat.flow b/test/data/statements/cat.flow deleted file mode 100644 index f3c18ed9ca73ce3edd515937f6d37045e93c8637..0000000000000000000000000000000000000000 --- a/test/data/statements/cat.flow +++ /dev/null @@ -1,10 +0,0 @@ -Version: 1 -Currency: beta_brousouf -Amendment: 54-7F64036BF4ED24027865F0BC17861E23D9CE4CA8 -Issuer: C73882B64B7E72237A2F460CE9CAB76D19A8651E -Date: 1401798895 -Algorithm: AnyKey -MembersJoining: 90-8518C1F053B6F5BB9D27ED37F4061AE5CC083511 -MembersLeaving: 2-5A0CEE18613AEEBBBE39B1CDBE627D879CD357EB -VotersJoining: 8-B91D119FE7A22013190B89614BC4A409AC51D149 -VotersLeaving: 2-5A0CEE18613AEEBBBE39B1CDBE627D879CD357EB diff --git a/test/data/statements/cat.flow.asc b/test/data/statements/cat.flow.asc deleted file mode 100644 index 11f5fc155e50e3942529ffd745340cb9f6d7d1cc..0000000000000000000000000000000000000000 --- a/test/data/statements/cat.flow.asc +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1 - -iQEcBAABCAAGBQJTjtPgAAoJED0ZtAvOQO31yX4IAIBTOyS26o1IXQ1gT00OSnyC -hvt5m/nDUV+NjhgursQAl9s/WflJ9in/9EEnycvk1GUZYP5SS8UcJM0ucZVRBOou -VzsfAGkFPQnrWrB4d/r/l5zGfh77Ef+NUTG74GYoVxsR20WGBEoXL8J4CURgOnr7 -0Smi68pPWowsT8HCpBkCJBCAVkNuV5bf0egol3jdI7MzmDflgqBO4nSyJIWvSFV4 -5i9ZafZ941MAu8g3WPG5EGjvqdYS8LJZ7VTBRmSUL3YtaeBpmB4P0pQby1oDBTpi -woUR7mW6kanY2i6Ijfa1A92jK1UkFPfzBg3ldJy1e+d5PtnaC206JVGcMtB5sT0= -=2QXu ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM0/BB-AM0-WRONG-LOLCAT.asc b/test/data/votes/BB-AM0/BB-AM0-WRONG-LOLCAT.asc deleted file mode 100644 index 4940aec7bf70ac31c35d158ea4537d45892c462e..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM0/BB-AM0-WRONG-LOLCAT.asc +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN PGP MESSAGE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -owGbwMvMwMH48tT2XMkVqXKMaxkfJnE6Oek6+hro+nsHvv5mHJZaVJyZn2elYMjl -XFpUlJqXXGmlkJRakhifVJRfWpxfmsblV5qblFpkpWDAFZZfAlQelJ9fYqXgZuro -7OZiZu7mbGlg4WJk4WwA5Dq6WFiYGZlYOjobmRmYGpoC5aCanPNL84C6jGHcjMS8 -9NRiKy5tI1czS0NLczdHJwMjSxcLMzNLVzcLU1cLIxNTc0dDUwtzZ0cDVxdLZy5t -Y2MnJzegNWbmBuYWLuZGjm6GRhZOpk6ORpZmzs6mxgaGRmZuxuZGXNrO5sYWFkZO -ZiZO5q7mRkbG5o5GbiZmBs6uls6OTuZmLoaWjhZmpoauXL6pIK+R5iNLmC64l2D8 -weGnTkYZFgZGDgY2ViZQBDNwcQrA4r+jk4PhQqro6wc9XyYaqbnYBIsr/t6/cy+7 -2Psy5t/Pdy/I23r50dKzUpcN1XPDZNl+POlI/+63o/34poVcUnkiHIyxMpzvVgoc -f649Z/7r+5U/I1frKs95tJFN0KWqUXjJ+czHq6xeKMw24yyIFJaT2BI/LS+63X3a -2fvv4tkfKfAsW6Hdtu794tc2J7ffa+u6W7aj7XdLcN/0da99rrWHftp4U+/hA45X -a6+GZp2InbPX+VgFp1Xv8lubgmOVr3W8EdgesPtmdP6ip61xs1NiPs1aU+FzgDVz -2e+oL22Oc9f/Zz7SerKyrHvZ736BljvrtOcwBWq4zWW0fy4QmHk14gPXR845t2xW -vsnd7nKtunbjIgA= -=hiy9 ------END PGP MESSAGE----- diff --git a/test/data/votes/BB-AM0/OK-snow.dissident.vote b/test/data/votes/BB-AM0/OK-snow.dissident.vote deleted file mode 100644 index 41b1efcd4f8179388b03a2b0959fa5a7e412dc07..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM0/OK-snow.dissident.vote +++ /dev/null @@ -1,32 +0,0 @@ -Version: 1 -Currency: beta_brousouf -Number: 0 -GeneratedOn: 1380397288 -UniversalDividend: 100 -NextRequiredVotes: 2 -MembersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90 -MembersCount: 3 -MembersChanges: -+2E69197FAB029D8669EF85E82457A1587CA0ED9C -+33BBFC0C67078D72AF128B5BA296CC530126F372 -+C73882B64B7E72237A2F460CE9CAB76D19A8651E -VotersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90 -VotersCount: 3 -VotersChanges: -+2E69197FAB029D8669EF85E82457A1587CA0ED9C -+33BBFC0C67078D72AF128B5BA296CC530126F372 -+C73882B64B7E72237A2F460CE9CAB76D19A8651E ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQGcBAABCAAGBQJSTUVEAAoJEKKWzFMBJvNyLsQMAKB0LYPDFtUWZc4uqBfWYxZR -OEhjQ9+NUUxosyUKcfOmeWk/A4jV5TeVeie8Wcz0uatpGGbOG2Ol+v0G/etr4wBD -u6BbmzIN1dm999mzx34rUgsZ9xLr+44/YmGlmfXXTmdfj269PLh0+JIo2mxBExQb -4zNjvC29iH8GGgq/HD2EJkA7D0jyVGfIOiig78BOB2qgHa9qAO3LmiL+LYPf46qB -wkzLCd9NNInH8GU34i7VMBxwd5gblys0Tk7fmkhS9hiSOvKxgwLEMXpOdI7G1ULp -4SzV+YRb2lIogZvW+o3rjzJ5VFCS6Y21YbvTtdk9hIvIVJDvPz8Dgv5Q9+JIaAY1 -8t2WCYdU+ipy5gZxw7ppXR2A7bOjixB++7niM4Ldd8G0b1DbCGgX6ukTqncUYIFv -EJWhPVq8hy5TnHKIitWDpjTyOBSeuBpEBpS3gMYg/RPlZPtj8zbG5tX73FRq0j5/ -jKDn3Kib2/7nPgLx8AkAmd9jgZjcfN6i3fLAmVQDCQ== -=ZPyq ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM0/cat.asc b/test/data/votes/BB-AM0/cat.asc deleted file mode 100644 index 0f70492c09a6f162080cec0892faff3e5cf3ac66..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM0/cat.asc +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQEcBAABCAAGBQJSRzV7AAoJEOnKt20ZqGUe+zMIAIyWCvpd1BQ4mnJR/BfgQxLL -2lusxOFViZRo4OcPnXJ67UahGWBeChXswmE8zFNxindlJZqzKbQAHSMcPgDm+4Ls -cYMRtKnxp/SBggNFa90uUIoCW5V5ZxCLiCNUHJC+8VJu8MhEAnp4XhYnDkEjiHXL -xwIQlo1S4GvtBcSeLVzU2Qxad59ukbnWwTvnKdGo/cmQudiD9TXrJtfKIKN6bBD9 -dWL+JjJ9p4/1tNE6egUvDFMeKyUxP6wTHnc/XfpUty4dTAZh4SghY7IYwKftMl9L -kNlP+H1aLntNkCjv6Liy9RDjubxBys6Y0mK6julZqbeN5BtLjXDE6sAPjr1ybfQ= -=C6z8 ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM0/snow.asc b/test/data/votes/BB-AM0/snow.asc deleted file mode 100644 index 72b23fb0202cc4bb9ea2bede88882d756984cbaa..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM0/snow.asc +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQGcBAABCAAGBQJSRzUzAAoJEKKWzFMBJvNyD1YL/05buY6d76J8ca29RCoj0dqN -8L/AuSTZ2OsSJk4JnaYvbsfH5iOhOvNC33yRxRJKl9ZccyE6kJ1ZYnFaUJlw2yn1 -BHoVpwCPClTgrbUNyuCJqTYC7IH0bUxgKHVBO0TPZjtsSztCKIgrrA2dvTGoJvH6 -65bghgvHYnT9mrU5jJGcc2dnSWt7VwuZqvftrxXq+3pIvY51jW/Ub5Qv0W/mZwMu -cQQ6EZCGr2GQ23RrOlztTuVenBhtPvyk+/JCh6N9QpthCEE8wjR5pTojH75tciue -TIvMAxOhO0yUTcrfwQ7pS/EPq9g+xMIWTyYrFFtB6WQn9qoY67EY7icGA+ZimOXn -2fAhtWZIY8wR5ScL7y6WkTTqgX93FnymGvj5f3+z0HkIF7eAjdg2hxqkgZmAa6+i -5NdLxdlCoBSyJ1AT0haYzKueBqbNmVKO0oqhX8w/50wDofgyvyZCuOnALwXDY3QR -/cqJupkVN3j1tMkKwoqFqRh+gAWE+C7ZrIaYhLQv9g== -=0pcd ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM0/tobi.asc b/test/data/votes/BB-AM0/tobi.asc deleted file mode 100644 index 2dc11021e97571adba80866a1c8fb3a678d4f611..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM0/tobi.asc +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQEcBAABCAAGBQJSRzVqAAoJECRXoVh8oO2cBlsH+QHmQX5CyX4E7if8eOTfGaWu -4uibg7pabSdAcwf3GBwvZUwYY9+9T99wQ1/hgYvbk0w+4NuhIwPya5nblhUVoFuQ -pRPKJKYgt+MPYU1Z/BZXMaeEuRyDBXnfPTxVtAE+S5+rM2/8cWHf5mX0pyk8QSWl -qnBzfXQMdGPBwOmIaYxTbG+l+ny3sM8LG3KWuphLG7fnZgToU7Tdkx1KZSzOCgCD -zR3veD4AozGJ26AI8vkyeU9pNddQgrKmOBAS06YA65zvOn0LKPsuaTiH8SobnXLl -r0RL56qFsf5ELiT/rU4MvSEkhuKZYdHr5mZWA3Ra++vd3LWeZcCx/Jy4mxVILrQ= -=PeRy ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM1/cat.asc b/test/data/votes/BB-AM1/cat.asc deleted file mode 100644 index e8ab2ffc3f8f92a3daa4506ecebe0ed96606b569..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM1/cat.asc +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQEcBAABCAAGBQJSRz5vAAoJEOnKt20ZqGUecz4IANHtwoCDn2LVPaGStTHxWN0N -Z2fRm6xehhionVJn5zFaA5qUHeP/us4R90qVuH4gTTUmkzNjBDKz+wszkRnDpMr5 -gzwPV3Uq3eyL/CW/+0bDxg8OHhD7Kd5Xui3t+EKBTn1mmxCpA/rai3y1IqTYLdJ5 -FaubH72Fv+FWGuVy2+NKOAfSd0xvyA0JlEfw2kvyOTW0ZhCiCrhTShFVNSFyXd0b -PmFFG85UAVKK38ZeMP33zKyCjPIqCDrN82SQe3izw1xbSgOdaK4R6KyxA9H7nTcr -sOqyZpwm/hX6rSO3Ep1pWJfdSge6Fa6rCjt1lhLUTz5lfEP4vFkdV/cXnuTAT24= -=1h4A ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM1/snow.asc b/test/data/votes/BB-AM1/snow.asc deleted file mode 100644 index de96162a35a1ea1244bb3b14e8a86e8f5d0efaad..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM1/snow.asc +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQGcBAABCAAGBQJSRz5iAAoJEKKWzFMBJvNygREL/A+quf/xQiDZJ5NbTsbvq/Y0 -QKhBh4iPOGiDaG3n4tDVja7w91hq+C1/9cBV8TAuLjSvnph+ov13WNpjNraVIX8V -MG4j4s22nsRfIZqcfBSdAluCJCLfATPONpurhiD8J7fCHhmRCuzeNNNWkkZJQqnR -fJROWoDZoatHHKQloRt/2oS3P4gebvDBmIXwSWi7kH1Yc0f2AzK2EDJu79A5Sm/b -BABH2KmVBzlNeLVNjb2LDN70tliumSRtr6xoliIK91o8ZzuM3V0Gu4BRhh/SI40b -ZBy/3CJ/bp7CaL8g3vDpbPoiwNyQJqU//HXIvvYfoQ9yqwDeFs4y6AkuN1jp9EiU -Xrnrfu5/O2owenQo+MwVOIa5d7hd1ULY21lDASJuIJU6D5lRw9/Zv7EZhLsoz2q7 -T0b9hDPBjmBkDDORZN0Umk33qB3PzORGc1Hsud99uk7aUG9jcoGOCFfzkjG472m5 -LLCw9x8CuQt5YWxVGsbsHWDnhntPxfECyBCyfs8oxw== -=TE8y ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM1/tobi.asc b/test/data/votes/BB-AM1/tobi.asc deleted file mode 100644 index cf081b2596b037e7ae5fdf4c81508efdb19f4c2a..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM1/tobi.asc +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQEcBAABCAAGBQJSRz6EAAoJECRXoVh8oO2ccgIIAIrr+08NCgpT44tK1H3BKQc+ -8c1JT/yYFGEYIh51ISW4JoecG/JDgsCVWJ7DzqlMRNDUVxz09g2rkuiDdU+2yxaT -MN9zgpHWlu5/Z7P25YMlM3hzrVG8i5X+5psfrCTUleQty8eTK3PsXffYRk7wk1lN -oC3w2ECr8tEzIhJKHOi0JtnC5r9Ck31mi1IvUQtgvcx5q92YSIZ4j/WiXRqW6XDV -Cd1ug5euRQAR+FpMV7dWI8dKxQhX9XOPI2cXNV/EvbqO36OJ/WF0OMG0XQD5fZlZ -UchRdA5ZKQ4B5LvVOYD18qtyMoOG6SCVbDwW2K5Xhm9Metkha35wHQyDqICMw5E= -=iB6l ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM1/white.asc b/test/data/votes/BB-AM1/white.asc deleted file mode 100644 index 24f97579a29287d0fb99efe3d851adc6e571f8ba..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM1/white.asc +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQEcBAABCAAGBQJSTUrZAAoJEHi0lPmQJcd+hgEH+wSoPeUVlFaWQZBxjybL84hY -4orrF9y7l8MEl2XvkOqai0VC9MMJe2UT/nk5OgSpCjy2dOKyuHEHybqRR/RUHxmV -/ammSLYM5LoytaK4wveR77O+uXi6k1lc8s3MMRJnKBHOPdJ74MxYCqo2xR1MMCTO -tGyme92Dl7x7HFnDX6oLW13zvamsyxeKmqgQJFrPjDI8K3ZeKoFPo42Ct6rnN6gG -Caa4TsJKbCrsStzLFOPfIKA7za4/4OM1t1Dae5TPaPDwq5ySiLcnAdPMJllw8hMB -SjzRQ2Sb3ue0kgD6yDqIopILJJ32dkbYsT7Mk+Mr4RxR49yEATDSucqyq+Nek2M= -=ThrK ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM2/cat.asc b/test/data/votes/BB-AM2/cat.asc deleted file mode 100644 index 8ab1a6323adc7bdb043d02889e27fb3b4f290366..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM2/cat.asc +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQEcBAABCAAGBQJSTaS3AAoJEOnKt20ZqGUeCy8IALNR9Cx+gasu80zt2muJNsR+ -7E4+5SxYbsyBcM9/jmxOLf6ajs7qnO6Mi2hC3bd3a+7OhVYnB3jcruTmrL+qpoKZ -Pjn5o2w4xjJtKGJh49CK2ZxcEmLmD59AlEl0lS/TPY+JG4fi4tf1tAXZkhUo5+3b -jKvOVUZfw0uXdBAWGelpXvh4uYi7+X8aR/ANAixAozEc9/ps7R80e9oJapyXmQN1 -GdQZwGExL17uJpS1eIXU7CMPq0139ftdD79BzHqP6Aj5tJYuduOhoNl7lHyHb52/ -UDGSKZUGsb2fn1lw8iEKeELKKsAORiIsG5mjXhSsBqpHt90v62/mnVwMJY1qpcU= -=3F2V ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM2/snow.asc b/test/data/votes/BB-AM2/snow.asc deleted file mode 100644 index 150bde2568eebf7ba112835adb39413e0062e3b7..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM2/snow.asc +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQGcBAABCAAGBQJSTaTBAAoJEKKWzFMBJvNyX0oL/11DiOqBNfx4oexHhACpRY8+ -soMCj4/42WpdgP5jNJLq5FiU2U9dxysg7zo/QNjYeOuTgpQKtsxUwPwfSdl/iBE6 -pkEr0/xNYP3vbwohjzbz5pEYXBN3yS6J6igwk53V+pGaTS4ZkGzfkh9RhVlH5c/5 -8PG/ALoLaSqlQzvX8ZiU/8+djCOw//MnFYn+PgMgZqjV0fsqYDVEDQYMRQgH2hSQ -VCNphCcaPbBU/ltT4sPZidkFJaBgMDkr7jRDckFSYSm0LCN9isLLlnpvwO0JxIMh -wEMpaG6f9DDuMQZAxWpyUnrn6NJ+h7HehJ8bS/+Jp+xKVPr8zj1+/0gBteRatl0k -WgO85KsZ06KmmD7L3K1b9umJyzr9KgPiXCqMqErt3MICsgSC6rwb3AO0NyEnHJd5 -90i4939cwTQeFQ/PSLvJ7bkg7Pu/MWickkwUaE/jurGGZyhulTB/4DWqmknrYF4L -fqMOCGQQmc1TPYq2xnPxBrwnLZe7gSqdvWceqyG59Q== -=yd3U ------END PGP SIGNATURE----- diff --git a/test/data/votes/BB-AM2/tobi.asc b/test/data/votes/BB-AM2/tobi.asc deleted file mode 100644 index 875b121e0b1053e50bad819bc80b0c7e7fbbb756..0000000000000000000000000000000000000000 --- a/test/data/votes/BB-AM2/tobi.asc +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.12 (GNU/Linux) - -iQEcBAABCAAGBQJSTaS8AAoJECRXoVh8oO2c+QQH/0l2yOO4hoS6+YEYt59xpIu6 -KgQhbvTAXcjSCX/1epjvWz/+f7C61dd4zioIYhLcNRpvG0YD46aSAnu3apz2fU16 -Z0YYHKH3T1FAWuy8GFbiibBdm9Bb+yJO/yUuTNqTQRk5QtL3JgLdB/uOlRDaAJxY -FiKvDNCDZSQnxO/sK64/o/s6N29QitBM4B165gOVeUslLsVxkP6jaqASuBGMdxad -qPEM1bo3dkcQrtmVZUa4yUtO2Au6P/rTUdpWzW5Awtihfo3CRKFMTZ/XiqqSexMn -ZNEcMDW2IIJkHAd31+h8ciGx9yVbsyrq+RhQdr2WYmhblOGXGAkBq2PqWNtFDyU= -=LM7G ------END PGP SIGNATURE----- diff --git a/test/exclude/members-voters.js b/test/exclude/members-voters.js deleted file mode 100644 index c5d3c80568b189033c3b2841625f00cf728930cc..0000000000000000000000000000000000000000 --- a/test/exclude/members-voters.js +++ /dev/null @@ -1,639 +0,0 @@ -var should = require('should'); -var assert = require('assert'); -var async = require('async'); -var request = require('supertest'); -var fs = require('fs'); -var sha1 = require('sha1'); -var _ = require('underscore'); -var jpgp = require('../../app/lib/jpgp'); -var server = require('../../app/lib/server'); -var mongoose = require('mongoose'); -var signatory = require('./../tool/signatory'); -var test = require('./../tool/test'); -var ucoin = require('./../..'); -var parsers = require('../../app/lib/streams/parsers/doc'); -var logger = require('../../app/lib/logger')('test'); - -var server; -var currency = "testa"; -var now = new Date().timestamp(); -var conf = { - currency: currency, - pgpkey: fs.readFileSync(__dirname + "/../data/lolcat.priv"), - pgppasswd: 'lolcat', - ipv4: '127.0.0.1', - port: 9107, - remoteipv4: '127.0.0.1', - remoteport: 9107, - kmanagement: 'ALL', - sync: { - AMDaemon: "OFF", - AMStart: now, - AMFreq: 1, // Every second - UDFreq: 2, // Dividend every 2 seconds - UD0: 145, - UDPercent: 0.5, // So it can be tested under 4 UD - this ultra high value of UD growth - Consensus: 2/3 - }, - createNext: true, - isValidPubkey: function (pubkey, am) { - // Here we say that a key is no more valid if it is Tobi's & AM9 - return !(pubkey.fingerprint == '2E69197FAB029D8669EF85E82457A1587CA0ED9C' && am.number == 9); - } -}; -var nb = 100; -var tester = is = on = new test.tester(currency); - -var PublicKey = null; -var Membership = null; -var Voting = null; -var Vote = null; -var Amendment = null; -var Transaction = null; - -var cat = signatory(fs.readFileSync(__dirname + "/../data/lolcat.priv", 'utf8'), "lolcat", "Cat"); -var tobi = signatory(fs.readFileSync(__dirname + "/../data/uchiha.priv", 'utf8'), "tobi", "Tobi"); -var snow = signatory(fs.readFileSync(__dirname + "/../data/snow.priv", 'utf8'), "snow", "Snow"); -// var white = signatory(fs.readFileSync(__dirname + "/../data/white.priv", 'utf8'), "white"); - -var pubkeySnow = fs.readFileSync(__dirname + '/../data/snow.pub', 'utf8'); -var pubkeyCat = fs.readFileSync(__dirname + '/../data/lolcat.pub', 'utf8'); -// var pubkeyCat2 = fs.readFileSync(__dirname + '/../data/lolcat.pub2', 'utf8'); -var pubkeyTobi = fs.readFileSync(__dirname + '/../data/uchiha.pub', 'utf8'); -// var pubkeyWhite = fs.readFileSync(__dirname + '/../data/white.pub', 'utf8'); - -var amendments = { - AM0: { - currency: 'testa', - generated: conf.sync.AMStart, - number: 0, - dividend: null, - nextVotes: 2, - membersCount: 2, - membersRoot: '48578F03A46B358C10468E2312A41C6BCAB19417', - votersCount: 2, - votersRoot: '48578F03A46B358C10468E2312A41C6BCAB19417', - previousHash: null - }, - - AM0_voters_members: { - currency: 'testa', - nextVotes: 2, - membersCount: 2, - membersRoot: '48578F03A46B358C10468E2312A41C6BCAB19417', - votersCount: 2, - votersRoot: '48578F03A46B358C10468E2312A41C6BCAB19417', - }, - - AM2: { - generated: conf.sync.AMStart + 2, - number: 2, - dividend: 145, - nextVotes: 2, - membersCount: 3, - membersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90', - membersChanges: [ - "+33BBFC0C67078D72AF128B5BA296CC530126F372" - ], - votersCount: 3, - votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90', - votersChanges: [ - "+33BBFC0C67078D72AF128B5BA296CC530126F372" - ] - }, - - AM3: { - generated: conf.sync.AMStart + 3, - number: 3, - nextVotes: 2, - membersCount: 3, - membersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90', - membersChanges: [ - ], - votersCount: 3, - votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90', - votersChanges: [ - ] - }, - - AM4: { - generated: conf.sync.AMStart + 4, - number: 4, - dividend: 145, - nextVotes: 2, - membersCount: 3, - membersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90', - membersChanges: [ - ], - votersCount: 2, - votersRoot: '5DB500A285BD380A68890D09232475A8CA003DC8', - votersChanges: [ - "-2E69197FAB029D8669EF85E82457A1587CA0ED9C" - ] - } -}; - -function pksAdd (raw, sig) { - return function (done) { - var PubKeyService = server.PublicKeyService; - async.waterfall([ - async.apply(parsers.parsePubkey().asyncWrite, raw), - async.apply(PubKeyService.submitPubkey) - ], function (err, pubkey) { - done(err, { - statusCode: 200, - text: JSON.stringify(pubkey.json()) - }); - }); - }; -} - -function join (signatory, timestamp) { - return memberDo("IN", signatory, timestamp); -} - -function leave (signatory, timestamp) { - return memberDo("OUT", signatory, timestamp); -} - -function memberDo (action, signatory, timestamp) { - var d = new Date(); - d.setTime((timestamp || now)*1000); - return function (done) { - var SyncService = server.SyncService; - var ms = new Membership({ - version: 1, - currency: currency, - issuer: signatory.fingerprint(), - membership: action, - date: d, - sigDate: d, - signature: d.toLocaleString() - }); - ms.hash = sha1(ms.getRawSigned()).toUpperCase(); - async.series([ - async.apply(SyncService.submit, ms) - ], function (err, res) { - if (!err) { - done(err, { - statusCode: 200, - text: JSON.stringify(res[0].json()) - }); - } else { - logger.warn(err); - done(err, { - statusCode: 400 - }); - } - }); - }; -} - -function voter (signatory, timestamp) { - return voterDo(signatory, timestamp); -} - -function voterDo (signatory, timestamp) { - var d = new Date(); - d.setTime(timestamp*1000); - return function (done) { - var SyncService = server.SyncService; - var voting = new Voting({ - version: 1, - currency: currency, - type: 'VOTING', - issuer: signatory.fingerprint(), - date: d, - sigDate: d, - signature: "" + d.toLocaleString() - }); - voting.hash = sha1(voting.getRawSigned()).toUpperCase(); - async.series([ - async.apply(SyncService.submitVoting, voting) - ], function (err, res) { - if (!err) { - done(err, { - statusCode: 200, - text: JSON.stringify(res[0].json()) - }); - } else { - logger.warn(err); - done(err, { - statusCode: 400 - }); - } - }); - }; -} - -function voteCurrent (signatory) { - return function (done) { - var ContractService = server.ContractService; - var am = ContractService.current(); - voteAm(signatory, am, done); - }; -} - -function voteProposed (signatory, delay) { - return function (done) { - var ContractService = server.ContractService; - var am = ContractService.proposed(); - voteAm(signatory, am, done, delay); - }; -} - -function voteAm (signatory, am, done, delay) { - var generatedPlusOne = am.generated + 1 + (delay || 0); - var sigDate = new Date(); - sigDate.setTime(generatedPlusOne*1000); - var vote = { - basis: am.number, - signature: signatory.fingerprint() + am.number + now, - amendmentHash: sha1(am.getRaw()).toUpperCase(), - propagated: false, - selfGenerated: false, - sigDate: sigDate, - pubkey: { fingerprint: signatory.fingerprint() } - }; - vote.amendment = am; - vote.hash = sha1(new Vote(vote).getRawSigned()).toUpperCase(); - var VoteService = server.VoteService; - VoteService.submit(vote, function (err) { - if (!err) { - done(err, { - statusCode: 200, - text: JSON.stringify(new Vote(vote).json()) - }); - } else { - logger.warn(err); - done(err, { - statusCode: 400 - }); - } - }); -} - -var someTests = { - - voteProposed: function (signatory, expectedAM) { - var expected = expectedAM || {}; - return tester.verify( - signatory.name() + " vote for proposed", - voteProposed(signatory), - is.expectedSignedAmendment(expected) - ); - }, - - voteCurrent: function (signatory, expectedAM) { - var expected = expectedAM || {}; - return tester.verify( - signatory.name() + " vote for current", - voteCurrent(signatory), - is.expectedSignedAmendment(expected) - ); - }, - - sendVoting: function (signatory, time, errCode) { - return tester.verify( - signatory.name() + " voting", - voter(signatory, time), - errCode ? - is.expectedHTTPCode(errCode) : - is.expectedVoting(signatory.fingerprint()) - ); - }, - - sendOptIN: function (signatory, time, errCode) { - var label = signatory.name() + " OPT-IN"; - if (time) { - var delta = (time - now); - label += ' on ' + (delta >= 0 ? '+' + delta : delta); - } - if (errCode) { - label += ' to be HTTP ' + errCode; - } else { - label += ' to be HTTP 200'; - } - return tester.verify( - label, - join(signatory, time), - errCode ? - is.expectedHTTPCode(errCode) : - is.expectedMembership(signatory.fingerprint()) - ); - }, - - sendOptOUT: function (signatory, time, errCode) { - return tester.verify( - signatory.name() + " OPT-OUT", - leave(signatory, time), - errCode ? - is.expectedHTTPCode(errCode) : - is.expectedMembership(signatory.fingerprint()) - ); - } -}; - -var testCases = [ - - /************************** - * Public keys tests - **/ - - tester.verify( - "Tobi's PUBKEY", - pksAdd(pubkeyTobi), - is.expectedPubkey('2E69197FAB029D8669EF85E82457A1587CA0ED9C') - ), - - testMerkle("/pks/all", '48578F03A46B358C10468E2312A41C6BCAB19417'), - - /************************** - * Membership tests - **/ - - testProposedAmendment('First proposed amendment, autogenerated on ucoin start', { - currency: 'testa', - number: 0, - membersCount: 0, - votersCount: 0, - previousHash: null - }), - - someTests.sendOptIN(tobi), - - testProposedAmendment('proposed amendment with tobi joining', { - currency: 'testa', - number: 0, - membersCount: 1, - membersRoot: '2E69197FAB029D8669EF85E82457A1587CA0ED9C', - votersCount: 0, - previousHash: null - }), - - // OPT-IN must be exactly during AM0's interval - someTests.sendOptIN(cat, now - 1, 400), - someTests.sendOptIN(cat, now - 3, 400), - someTests.sendOptIN(cat, now - 184984, 400), - someTests.sendOptIN(cat, now + 1, 400), - someTests.sendOptIN(cat, now + 2, 400), - someTests.sendOptIN(cat, now + 54, 400), - someTests.sendOptIN(cat, now), - - someTests.sendVoting(tobi, now - 1, 400), - someTests.sendVoting(tobi, now - 2, 400), - someTests.sendVoting(tobi, now - 484, 400), - someTests.sendVoting(tobi, now + 1, 400), - someTests.sendVoting(tobi, now + 9, 400), - someTests.sendVoting(tobi, now + 9879, 400), - someTests.sendVoting(cat, now + 1, 400), - - someTests.sendVoting(tobi, now + 0), - someTests.sendVoting(cat, now + 0), - - testProposedAmendment('proposed amendment with tobi+cat as members & voters', amendments.AM0), - - // VOTE AM0 - someTests.voteProposed(cat, amendments.AM0), // Promoted - someTests.voteCurrent(tobi, amendments.AM0), - testPromotedAmendment(amendments.AM0), - testPromotedAmendment(amendments.AM0, 0), - - //-------- VOTING : AM1 ------ - tester.verify( - "Voting AM1 should require 2 votes", - voteProposed(tobi), - is.expectedSignedAmendment(amendments.AM0_voters_members) - ), - - tester.verify( - "Voting AM1 should promote AM1 identical to genesis AM", - voteProposed(cat), - is.expectedSignedAmendment(amendments.AM0_voters_members) - ), - - //---------------------------- - - /****** AM2 - * - * Snow publish its pubkey, ask for joining & voting - */ - - tester.verify( - "Snow's PUBKEY", - pksAdd(pubkeySnow), - is.expectedPubkey('33BBFC0C67078D72AF128B5BA296CC530126F372') - ), - - testMerkle("/pks/all", 'F5ACFD67FC908D28C0CFDAD886249AC260515C90'), - - someTests.sendOptIN(snow, now - 1, 400), - someTests.sendOptIN(snow, now + 0, 400), - someTests.sendOptIN(snow, now + 2, 400), // Indeed, AM2 is not current, but NEXT! - someTests.sendOptIN(snow, now + 1), - someTests.sendVoting(snow, now - 1, 400), - someTests.sendVoting(snow, now + 0, 400), - someTests.sendVoting(snow, now + 2, 400), - someTests.sendVoting(snow, now + 1), - - // 1/2 - someTests.voteProposed(cat, amendments.AM2), - testPromotedAmendment(amendments.AM0_voters_members, 1), - testPromotedAmendment(amendments.AM0_voters_members), - - tester.verify( - "Snow shouldn't be able to vote N-1 (current)", - voteCurrent(snow), - is.expectedHTTPCode(400) - ), - - testPromotedAmendment(amendments.AM0_voters_members, 1), - testPromotedAmendment(amendments.AM0_voters_members), - - // 2/2 - someTests.voteProposed(tobi, amendments.AM2), - - testPromotedAmendment(amendments.AM2, 2), - testPromotedAmendment(amendments.AM2), - - tester.verify( - "Snow shouldn't be able to vote N (new current)", - voteCurrent(snow), - is.expectedHTTPCode(400) - ), - - /******* We have AM2: - - nextVotes: 2, - membersCount: 3, - membersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90', - membersChanges: [ - "+33BBFC0C67078D72AF128B5BA296CC530126F372" - ], - votersCount: 3, - votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90', - votersChanges: [ - "+33BBFC0C67078D72AF128B5BA296CC530126F372" - ] - - Let's not make tobi vote, but snow + cat instead. - */ - - tester.verify( - "Voting AM3 by cat 1v/2v", - voteProposed(cat), - is.expectedSignedAmendment(amendments.AM3) - ), - - testPromotedAmendment(amendments.AM2, 2), - testPromotedAmendment(amendments.AM2), - - tester.verify( - "Voting AM3 by snow 2v/2v", - voteProposed(snow), - is.expectedSignedAmendment(amendments.AM3) - ), - - testPromotedAmendment(amendments.AM3, 3), - testPromotedAmendment(amendments.AM3), - - // So Cat is not kicked from voters! - someTests.sendVoting(cat, now + 3), - - testProposedAmendment('AM4 should see tobi no more voter', amendments.AM4), - - tester.verify( - "Tobi voting while having not voted current should not be accepted: already a voter!", - voter(tobi, now + 4), - is.expectedHTTPCode(400) - ), - - // Voting AM4 (ratify tobi's leaving as a voter) - // Snow wants to stay as voter - someTests.sendVoting(snow, now + 3), - someTests.voteProposed(cat), - someTests.voteProposed(snow), - testPromotedAmendment(amendments.AM4, 4), - testPromotedAmendment(amendments.AM4), - testProposedAmendment('AM5: no changes', { membersChanges: [], votersChanges: [] }), - - // Tobi voting again - someTests.sendVoting(tobi, now + 4), - testProposedAmendment('AM5: tobi\'s coming back', { - membersChanges: [], - votersChanges: ['+2E69197FAB029D8669EF85E82457A1587CA0ED9C'], - votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90' }), - someTests.voteProposed(cat), - someTests.voteProposed(snow), - // Now on AM5 - testProposedAmendment('AM6: no changes, but tobi as voter', { - membersChanges: [], - votersChanges: [], - votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90' }), - - someTests.voteProposed(cat), - someTests.voteProposed(snow), - // Now on AM6 - // Cat & Snow actualized as voter at AM3 (for AM4), so, with VTExpires = 3, they are kicked at AM 7 - // Tobi actualized as voter at AM4 (for AM5), so, with VTExpires = 3, he will be kicked at AM 8 - testProposedAmendment('AM7: Cat & Snow are leaving as voters', { - number: 7, - votersChanges: ['-33BBFC0C67078D72AF128B5BA296CC530126F372', '-C73882B64B7E72237A2F460CE9CAB76D19A8651E'], - votersRoot: '2E69197FAB029D8669EF85E82457A1587CA0ED9C' }), - someTests.sendVoting(cat, now + 5, 400), - someTests.sendVoting(snow, now + 5, 400), - someTests.sendVoting(cat, now + 6), - someTests.sendVoting(snow, now + 6), - someTests.voteCurrent(tobi), - testProposedAmendment('AM7: everyone is still here', { votersChanges: [], votersRoot: 'F5ACFD67FC908D28C0CFDAD886249AC260515C90' }), - - - someTests.voteProposed(cat), - someTests.voteProposed(snow), - someTests.voteCurrent(tobi), - someTests.sendOptOUT(cat, now + 7), - testProposedAmendment('AM8: Cat is leaving?', { membersChanges: ['-C73882B64B7E72237A2F460CE9CAB76D19A8651E'], membersRoot: 'DC7A9229DFDABFB9769789B7BFAE08048BCB856F' }), - someTests.sendOptOUT(cat, now + 7, 400), - someTests.sendOptOUT(cat, now + 7, 400), - someTests.sendVoting(tobi, now + 7), - someTests.sendVoting(tobi, now + 7, 400), - someTests.sendVoting(tobi, now + 7, 400), - - someTests.voteProposed(cat), - someTests.voteProposed(snow), - // We are now at AM9: memberships received during AM0 MUST be thrown out - testProposedAmendment('AM9: Tobi is kicked out as its key is no more valid', { - membersChanges: [ - '-2E69197FAB029D8669EF85E82457A1587CA0ED9C'], - membersRoot: '33BBFC0C67078D72AF128B5BA296CC530126F372', - votersChanges: [ - '-2E69197FAB029D8669EF85E82457A1587CA0ED9C'], - votersRoot: '33BBFC0C67078D72AF128B5BA296CC530126F372'}) -]; - -testCases.splice(nb, testCases.length - nb); - -function testMerkle (url, root) { - return tester.verify( - "merkle " + url, - on.doGet(url), - is.expectedMerkle(root) - ); -} - -function testPromotedAmendment (properties, number) { - return tester.verify( - number >= 0 ? "proposed amendment #" + number : "current amendment", - on.doGet("/hdc/amendments/promoted" + (isNaN(number) ? "" : "/" + number)), - is.expectedAmendment(properties) - ); -} - -function testProposedAmendment (label, properties) { - return tester.verify( - label, - on.doGet("/registry/amendment"), - is.expectedAmendment(properties) - ); -} - -before(function (done) { - logger.debug("Launching server..."); - this.timeout(1000*60); // In seconds - server = ucoin.createRegistryServer({ name: currency, listenBMA: true, resetData: true }, conf); - server.on('BMALoaded', function (err, appReady) { - async.waterfall([ - function (next){ - PublicKey = server.conn.model('PublicKey'); - Membership = server.conn.model('Membership'); - Voting = server.conn.model('Voting'); - Vote = server.conn.model('Vote'); - Amendment = server.conn.model('Amendment'); - Transaction = server.conn.model('Transaction'); - tester.app(appReady); - // Execute all tasks - async.forEachSeries(testCases, function(testCase, callback){ - logger.debug('----------------------------------'); - logger.debug('Test: %s', testCase.label); - logger.debug('----------------------------------'); - testCase.task(callback); - }, next); - }, - function (next){ - server.disconnect(); - next(); - }, - ], function (err) { - logger.debug("API fed."); - done(err); - }); - }); -}); - -describe('Testing: ', function(){ - testCases.forEach(function(testCase){ - it(testCase.label, function () { - testCase.test(); - }); - }); -}); diff --git a/test/fast/amendment-0.js b/test/fast/amendment-0.js deleted file mode 100644 index 4a9482e51e846d861fb247dc66b768cdb61a4dad..0000000000000000000000000000000000000000 --- a/test/fast/amendment-0.js +++ /dev/null @@ -1,108 +0,0 @@ -var should = require('should'); -var assert = require('assert'); -var mongoose = require('mongoose'); -var sha1 = require('sha1'); -var parsers = require('../../app/lib/streams/parsers/doc'); -var fs = require('fs'); - -var AM0 = "" + - "Version: 1\r\n" + - "Currency: beta_brousouf\r\n" + - "Number: 0\r\n" + - "GeneratedOn: 1380397288\r\n" + - "NextRequiredVotes: 2\r\n" + - "MembersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" + - "MembersCount: 3\r\n" + - "MembersChanges:\r\n" + - "+2E69197FAB029D8669EF85E82457A1587CA0ED9C\r\n" + - "+33BBFC0C67078D72AF128B5BA296CC530126F372\r\n" + - "+C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n" + - "VotersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" + - "VotersCount: 3\r\n" + - "VotersChanges:\r\n" + - "+2E69197FAB029D8669EF85E82457A1587CA0ED9C\r\n" + - "+33BBFC0C67078D72AF128B5BA296CC530126F372\r\n" + - "+C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n"; - -var Amendment = mongoose.model('Amendment', require('../../app/models/amendment')); -var amTest; - -describe('Amendment', function(){ - - describe('0 of beta_brousouf currency', function(){ - - // Loads amTest with its data - before(function(done) { - var parser = parsers.parseAmendment(function (err) { - }); - parser.end(AM0); - parser.on('readable', function () { - var parsed = parser.read(); - amTest = new Amendment(parsed); - done(); - }); - }); - - it('should be version 1', function(){ - assert.equal(amTest.version, 1); - }); - - it('should have beta_brousouf currency name', function(){ - assert.equal(amTest.currency, 'beta_brousouf'); - }); - - it('should be number 0', function(){ - assert.equal(amTest.number, 0); - }); - - it('should have no Universal Dividend', function(){ - should.not.exist(amTest.dividend); - }); - - it('should have no Minimal Coin Power', function(){ - should.not.exist(amTest.coinMinPower); - }); - - it('should have no previous hash', function(){ - should.not.exist(amTest.previousHash); - }); - - it('should have no members status root', function(){ - should.not.exist(amTest.membersStatusRoot); - }); - - it('should have F5ACFD67FC908D28C0CFDAD886249AC260515C90 members hash', function(){ - assert.equal('F5ACFD67FC908D28C0CFDAD886249AC260515C90', amTest.membersRoot); - }); - - it('should have the following 3 new members', function(){ - var newMembers = amTest.getNewMembers(); - assert.equal(newMembers.length, 3); - assert.equal(amTest.membersCount, 3); - assert.equal(newMembers[0], "2E69197FAB029D8669EF85E82457A1587CA0ED9C"); // Obito Uchiwa - assert.equal(newMembers[1], "33BBFC0C67078D72AF128B5BA296CC530126F372"); // John Snow - assert.equal(newMembers[2], "C73882B64B7E72237A2F460CE9CAB76D19A8651E"); // LoL Cat - }); - - it('should have the following 3 new voters', function(){ - var newVoters = amTest.getNewVoters(); - assert.equal(newVoters.length, 3); - assert.equal(amTest.votersCount, 3); - assert.equal(newVoters[0], "2E69197FAB029D8669EF85E82457A1587CA0ED9C"); - assert.equal(newVoters[1], "33BBFC0C67078D72AF128B5BA296CC530126F372"); - assert.equal(newVoters[2], "C73882B64B7E72237A2F460CE9CAB76D19A8651E"); - }); - - it('should have no voters signatures root', function(){ - should.not.exist(amTest.votersSigRoot); - }); - - it('its computed hash should be 58A2700B6CE56E112238FDCD81C8DACE2F2D06DC', function(){ - assert.equal(amTest.hash, '58A2700B6CE56E112238FDCD81C8DACE2F2D06DC'); - }); - - it('its manual hash should be 58A2700B6CE56E112238FDCD81C8DACE2F2D06DC', function(){ - assert.equal(sha1(amTest.getRaw()).toUpperCase(), '58A2700B6CE56E112238FDCD81C8DACE2F2D06DC'); - }); - }); -}); \ No newline at end of file diff --git a/test/fast/amendment-1.js b/test/fast/amendment-1.js deleted file mode 100644 index b9e16af62ac95e618532a3ab9d4e7eb122c64cda..0000000000000000000000000000000000000000 --- a/test/fast/amendment-1.js +++ /dev/null @@ -1,95 +0,0 @@ -var should = require('should'); -var assert = require('assert'); -var mongoose = require('mongoose'); -var sha1 = require('sha1'); -var parsers = require('../../app/lib/streams/parsers/doc'); - -var AM1 = "" + - "Version: 1\r\n" + - "Currency: beta_brousouf\r\n" + - "Number: 1\r\n" + - "GeneratedOn: 1380398542\r\n" + - "NextRequiredVotes: 2\r\n" + - "PreviousHash: 58A2700B6CE56E112238FDCD81C8DACE2F2D06DC\r\n" + - "MembersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" + - "MembersCount: 3\r\n" + - "MembersChanges:\r\n" + - "VotersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" + - "VotersCount: 3\r\n" + - "VotersChanges:\r\n"; - -var Amendment = mongoose.model('Amendment', require('../../app/models/amendment')); -var amTest; - -describe('Amendment', function(){ - - describe('1 of beta_brousouf currency', function(){ - - // Loads amTest with its data - before(function(done) { - var parser = parsers.parseAmendment(); - parser.end(AM1); - parser.on('readable', function () { - var parsed = parser.read(); - amTest = new Amendment(parsed); - done(); - }); - }); - - it('should be version 1', function(){ - assert.equal(amTest.version, 1); - }); - - it('should have beta_brousouf currency name', function(){ - assert.equal(amTest.currency, 'beta_brousouf'); - }); - - it('should be number 1', function(){ - assert.equal(amTest.number, 1); - }); - - it('should have no Universal Dividend', function(){ - should.not.exist(amTest.dividend); - }); - - it('should have no Minimal Coin Power', function(){ - should.not.exist(amTest.coinMinPower); - }); - - it('should have 58A2700B6CE56E112238FDCD81C8DACE2F2D06DC previous hash', function(){ - assert.equal(amTest.previousHash, '58A2700B6CE56E112238FDCD81C8DACE2F2D06DC'); - }); - - it('should have 0 new members', function(){ - var newMembers = amTest.getNewMembers(); - assert.equal(newMembers.length, 0); - assert.equal(amTest.membersCount, 3); - }); - - it('should have no members status root', function(){ - should.not.exist(amTest.membersStatusRoot); - }); - - it('should have F5ACFD67FC908D28C0CFDAD886249AC260515C90 voters hash', function(){ - assert.equal('F5ACFD67FC908D28C0CFDAD886249AC260515C90', amTest.votersRoot); - }); - - it('should have the following 0 new voters', function(){ - var newVoters = amTest.getNewVoters(); - assert.equal(newVoters.length, 0); - assert.equal(amTest.votersCount, 3); - }); - - it('should have no voters signatures root', function(){ - should.not.exist(amTest.votersSigRoot); - }); - - it('its computed hash should be F07D0B6DBB7EA99E5208752EABDB8B721C0010E9', function(){ - assert.equal(amTest.hash, 'F07D0B6DBB7EA99E5208752EABDB8B721C0010E9'); - }); - - it('its manual hash should be F07D0B6DBB7EA99E5208752EABDB8B721C0010E9', function(){ - assert.equal(sha1(amTest.getRaw()).toUpperCase(), 'F07D0B6DBB7EA99E5208752EABDB8B721C0010E9'); - }); - }); -}); \ No newline at end of file diff --git a/test/fast/amendment-2.js b/test/fast/amendment-2.js deleted file mode 100644 index c07cdbceb767df3f39e772d6e77b140188ea5cbb..0000000000000000000000000000000000000000 --- a/test/fast/amendment-2.js +++ /dev/null @@ -1,113 +0,0 @@ -var should = require('should'); -var assert = require('assert'); -var mongoose = require('mongoose'); -var sha1 = require('sha1'); -var parsers = require('../../app/lib/streams/parsers/doc'); -var fs = require('fs'); - -var AM2 = "" + - "Version: 1\r\n" + - "Currency: beta_brousouf\r\n" + - "Number: 2\r\n" + - "GeneratedOn: 1380400542\r\n" + - "UniversalDividend: 1184\r\n" + - "CoinAlgo: Base2Draft\r\n" + - "CoinBase: 4\r\n" + - "CoinList: 14 6 2 3 1\r\n" + - "NextRequiredVotes: 2\r\n" + - "PreviousHash: F07D0B6DBB7EA99E5208752EABDB8B721C0010E9\r\n" + - "MembersRoot: 7B66992FD748579B0774EDFAD7AB84143357F7BC\r\n" + - "MembersCount: 4\r\n" + - "MembersChanges:\r\n" + - "+B6AE93DDE390B1E11FA97EEF78B494F99025C77E\r\n" + - "VotersRoot: DC7A9229DFDABFB9769789B7BFAE08048BCB856F\r\n" + - "VotersCount: 2\r\n" + - "VotersChanges:\r\n" + - "-C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n"; - -var Amendment = mongoose.model('Amendment', require('../../app/models/amendment')); -var amTest; - -describe('Amendment', function(){ - - describe('2 of beta_brousouf currency', function(){ - - // Loads amTest with its data - before(function(done) { - var parser = parsers.parseAmendment(); - parser.end(AM2); - parser.on('readable', function () { - var parsed = parser.read(); - amTest = new Amendment(parsed); - done(); - }); - }); - - it('should be version 1', function(){ - assert.equal(amTest.version, 1); - }); - - it('should have beta_brousouf currency name', function(){ - assert.equal(amTest.currency, 'beta_brousouf'); - }); - - it('should be number 2', function(){ - assert.equal(amTest.number, 2); - }); - - it('should have a niversal Dividend of value 1184', function(){ - assert.equal(amTest.dividend, 1184); - }); - - it('should have a Minimal Coin Base of 4', function(){ - assert.equal(amTest.coinBase, 4); - }); - - it('should have F07D0B6DBB7EA99E5208752EABDB8B721C0010E9 previous hash', function(){ - assert.equal(amTest.previousHash, 'F07D0B6DBB7EA99E5208752EABDB8B721C0010E9'); - }); - - it('should have no members status root', function(){ - should.not.exist(amTest.membersStatusRoot); - }); - - it('should have 7B66992FD748579B0774EDFAD7AB84143357F7BC members hash', function(){ - assert.equal(amTest.membersRoot, '7B66992FD748579B0774EDFAD7AB84143357F7BC'); - }); - - it('should have DC7A9229DFDABFB9769789B7BFAE08048BCB856F voters hash', function(){ - assert.equal(amTest.votersRoot, 'DC7A9229DFDABFB9769789B7BFAE08048BCB856F'); - }); - - it('should have no voters signatures root', function(){ - should.not.exist(amTest.votersSigRoot); - }); - - it('should have the following new member', function(){ - var newMembers = amTest.getNewMembers(); - assert.equal(newMembers.length, 1); - assert.equal(amTest.membersCount, 4); - assert.equal(newMembers[0], "B6AE93DDE390B1E11FA97EEF78B494F99025C77E"); // walter white - }); - - it('should have 0 new voters', function(){ - var voters = amTest.getNewVoters(); - assert.equal(voters.length, 0); - assert.equal(amTest.votersCount, 2); - }); - - it('should have one voter leaving', function(){ - var leavingVoters = amTest.getLeavingVoters(); - assert.equal(leavingVoters.length, 1); - assert.equal(amTest.votersCount, 2); - }); - - it('its computed hash should be 5234E02254151A232197BD629FA0A52DE35FE780', function(){ - assert.equal(amTest.hash, '5234E02254151A232197BD629FA0A52DE35FE780'); - }); - - it('its manual hash should be 5234E02254151A232197BD629FA0A52DE35FE780', function(){ - assert.equal(sha1(amTest.getRaw()).toUpperCase(), '5234E02254151A232197BD629FA0A52DE35FE780'); - }); - }); -}); \ No newline at end of file diff --git a/test/fast/community_algos.js b/test/fast/community_algos.js deleted file mode 100644 index 7f1e7107dcb1d60a13612cf97273ba78bec2660c..0000000000000000000000000000000000000000 --- a/test/fast/community_algos.js +++ /dev/null @@ -1,270 +0,0 @@ -var should = require('should'); -var assert = require('assert'); -var async = require('async'); -var fs = require('fs'); -var parsers = require('../../app/lib/streams/parsers/doc'); - -var isMember = function (keyID, done) { - done(null, true); -} - -var getPubkey = function (keyID, done) { - if (keyID == 'E9CAB76D19A8651E') { - done(null, { - "comment" : "udid2;c;CAT;LOL;2000-04-19;e+43.70-079.42;0;", - "name" : "LoL Cat", - "email" : "cem.moreau@gmail.com", - "raw" : "-----BEGIN PGP PUBLIC KEY BLOCK-----\r\nVersion: OpenPGP.js VERSION\r\nComment: http://openpgpjs.org\r\n\r\nxsBNBFHHC/EBCADWTLSN7EGP+n30snndS3ZNcB02foL+0opcS6LK2coPDJLg\n2nookeJRHZxF3THmZQrKwZOjiuDBinOc5DWlzIS/gD/RaXwntgPFlGKBlBU+\ng255fr28ziSb5Y1lW4N//nUFdPZzoMmPgRj0b17T0UPCoMR8ZZ/Smk5LINbQ\nwt+A+LEoxEdEVcq+Tyc0OlEabqO6RFqiKDRiPhGPiCwVQA3yPjb6iCp5gTch\nObCxCnDbxA0Mfj9FmHrGbepNHGXxStO4xT0woCb7y02S1E8K08kOc5Bq9e1Y\nj5I/mdaw4Hn/Wp28lZl1mnO1u1z9ZU/rcglhEyaEOTwasheb44QcdGSfABEB\nAAHNTUxvTCBDYXQgKHVkaWQyO2M7Q0FUO0xPTDsyMDAwLTA0LTE5O2UrNDMu\nNzAtMDc5LjQyOzA7KSA8Y2VtLm1vcmVhdUBnbWFpbC5jb20+wsB9BBMBCAAn\nBQJRxwvxAhsDBQkLR5jvBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEOnK\nt20ZqGUeZYcH/0ItH4b/O0y7V1Jzc1DZAdn4iDiI7/SF3fN4f6cJCu/SOVb+\nERFIb6JK+HNHdVAcMHKaPW625R0FahHUkcXWkkGmQ6+sLIsVZwVN1oeZtlD1\n2cq9A4UJyfJUXkinMKkI8xpdV8J7s5wFRavOS/qaF5beah0Z+IGwQK0nuXxW\npT6UZWbpUfXPQB2Mz2/rpjSWKwO3X4FwwOfDiuZExyH2JPDYshdPcj/x+gnz\nYW9XfWCJw3rOK42vtM+aLtUpJO0Jh6X/sj/iqyS4rPB4DVCmEgSXPx1P+kqn\nsz3aNTOIujXS8Faz+TC+eNhn+z3SoTl5gBlNNM171fWFr0BR3nIfIu7OwE0E\nUccL8QEIAPAQaxK6s4DjDHiOwrMotvb479QD5PsHU6S0VG0+naoPlNJb2d5w\nYhnFAn4aYLiXx4IIl38rHnV+yWATOUe2rdCe4enTXkxyWJVaxIcNJLFpUjHY\nGbrCnNwiXpuQfSDuRN/wcVNSBKXhWNUPY9IsbgERWhS5YTFnuQcBjMqDwF6J\nImQ8O4nZwno811nqK1XaMuLVvXZAsO1Vi1k3NArM5+jdlq9e3BA0NcHJmGEc\nQdTw0Tk5Oq6rmE8ux7pS0bn6OUkkseR5DyRlFtzqi4wp30GeggeFExx7ZCVu\nctpJX9ZoC3cJoZT0s3LuUtV0EW50yCtP+3Vpkek2WtjfVbM6kDkAEQEAAcLA\nZQQYAQgADwUCUccL8QIbDAUJC0eY7wAKCRDpyrdtGahlHg7+B/95xEoSrFQ7\n/mc7g6sbisvx3s547gUXXYSuFHS03IMDWJrfGKqXtBf9ETBx4OLeBXY7z1lL\n4WCN6/xtrL+mSQ9dbDqdXv/1EhkSv0s+IvJ34KYGAkFXSCoTE7rnkPwQjoMY\nVSFkf5e8g9adyKvndq/QSPNuv+FPL6sHm1N9nmus5Ebr0zTVDmmfoqzokuDf\nHm5h6YrkFscMGjrCKWuXSiTaGj9Hm3MqeZ3TKva5isa/h0h7Ai3wJ5XJpMrF\nNN6BU/wIt7fM2hsNAOwaG+WUfgjYEkOua8gPPtpLZJJPb/89yrs9F7JkLi/o\niAl5VpItm+hlFpLe1TE7oa6k53eZ2a+VzsBNBFNjxXoBCADJ9zEi0Mc4tpef\nAaZP2d2fn1shaBKr0T56QDGohxBUcBohu3k0IdJYcR1t8hs70Gn4HTKouCBh\nhdKHgwWjY40LQ2m5wX0TIqLVxaRawOzohBHRaJG2A6DB2HeMwAxW+9/bm4ko\nmHehtk5RTCXo6CdPn+jTBrj9KVLSVX++ErEf9QEnUD1V501fTx6OD/KAGTGK\nE5AuhiFqti9N2DfwkRVoCfM+L0lznSv3DlvZYcuLtJm9u9Dl/B3EGsp8T3Qd\ni8TWOhLyUyDRGEuFJVI5Mm+76Nl7RJ0FqUNSkDTnJA8zY+ySUtHwxCTlDJUE\nVVFn1Tgri8iTQA+iEYM/RLSketC3ABEBAAHCwX4EGAEIAAkFAlNjxXoCGwIB\nKQkQ6cq3bRmoZR7AXSAEGQEIAAYFAlNjxXoACgkQPRm0C85A7fX2iQgAje5O\nmSAaMgIAIF7qAdBeOoBxr9G/nAjSAoRsT9y0OQcr2NG7a4QFTHZC5vXeYiSk\n7kuzuB8SoVmlSEGPf6NDbfDTxi+Z6leljaT473jbBX7HRzisIUhry17GQpM8\nopJBXqujfD/0498qtFd+8kM+PNUVULoBTmnz5hQLLbt4G7yLpSNuqUA2eyPt\nbb6i8kT2mN7U5kTv8bMY8QwiaH+YDCFP/yBQmtKwX2onhgKQha/f8SJ4DGOv\ng+tCPN0COXw6pwgI/RgZOI9oB/vAJTU/DWuEuKDfTC/f/Wa/6dQ/rhd8LZMP\ntP7XbI+Eue9wzTUsl82YJK49t+70qKTnAZhmnrofCACi4cgsPBVrfuIn8ML+\nT9kszOxYwOnzHy0mNenRo2DQnt9z40YuCXcFoMMIpm0o1EKORFieq7m1XkyI\n+8BKb4ad2HTLWopqT/IRJ46atq/goRWzfdEY4/52XNTjyl2jT6Am926g+XvD\n+NdkSzlnJ6JPuj0eZNTxPicqizaGcI40elmk0+uSNEs86SPSkrsZzbPk+RP0\nM+tGdaw7O3CW7sQUAKPGHt5BldFGL6Hw4pMWNg7obvcu5XtsvkVEgms0t5PF\nNAG/2JTG+Pcicsrf/EdO+o9G3M2z0L4FFxIkrmqrpycUsfT/gIMlFo+EygzQ\nSxwkCr+V2HghBDxZqmr0TYy1\r\n=U+Hq\r\n-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n", - "fingerprint" : "C73882B64B7E72237A2F460CE9CAB76D19A8651E", - }) - } else if (keyID == '2457A1587CA0ED9C') { - done(null, { - "comment" : "udid2;c;UCHIWA;OBITO;2000-09-30;e+35.69+139.69;0", - "name" : "Tobi Uchiwa", - "email" : "cem.moreau@gmail.com", - "raw" : "-----BEGIN PGP PUBLIC KEY BLOCK-----\r\nVersion: OpenPGP.js VERSION\r\nComment: http://openpgpjs.org\r\n\r\nxsBNBFHG4x4BCADi8J4sSpIv5q2gREBwMj1TCUFDvQDx8/WivLKJ+LgmC2zw\nuuMDYo9YwZBmMe/orZJRSDwslKUARtFzmSui2CR3b4EEr1Hhz9coyqHsF9lY\ndht2YU7i08FOdppRJdk7XuHCABZ+mXeG8WnNMP+9QjRAh3sFDkWpji9iL5Zm\nzlDx6UMXq3lMSvN3VC32X+K2HoQgesm3fTjCBmQik2Ayvp89Ikc2wAWM5/B7\nRCwdHTTysVOE0KkxIIkeus76p+5pvLzrZOvM18ToLxV7KThxVvHn+dj2iOMu\nteY3BylN+XL1J/nBYkOCfsCigMClbWj7IptqDZWmqRbzYgcrOYa8SezxABEB\nAAHNVVRvYmkgVWNoaXdhICh1ZGlkMjtjO1VDSElXQTtPQklUTzsyMDAwLTA5\nLTMwO2UrMzUuNjkrMTM5LjY5OzApIDxjZW0ubW9yZWF1QGdtYWlsLmNvbT7C\nwH0EEwEIACcFAlHG4x4CGwMFCQs75EIFCwkIBwMFFQoJCAsFFgIDAQACHgEC\nF4AACgkQJFehWHyg7ZxljwgAkkV+cXO8kXXCqXdo9hwSprQwbHHfwsovhIvZ\nI9E4Tpce0TXaebflCecDwsPgGyeP8xPUX8pZAvYYw5klREvKn7Vu6NiGrE07\nk7EUCIs+kkPTXeRAv/NpMfJoUOdh+da0ybs+nTO1lJV+cEGqz0OX8yIwrlwh\nrkvnlFWRE/oe3NoJ9f0N7sMXejhs8aTGClXU87GiUAoQ0XC1U8BPLjprkne5\nRMsSVHj3HbVzVQXmreNVDNsvtJVTskGxUE7IzIK80fBZP7OmC+biZuwTqXek\nF6SCqOJjlIsDY4uIL/cCQRkhM1kmeeHcGOQT+6auPtpHXniRxUNOoi7VCWg/\nHS2r9s7ATQRRxuMeAQgA+jCWHHx/kPQxghMBuio36RoR63qQSFxpp2Lx5HIk\nUYhpHE0oGOEEiBG0HrKIv7Qz+4Cs1VHSDCplD+vtRS9PkjOopSxE+ROHjIfT\n0fcjkYT14m2Ftmcqs5/Vw9qBHLhJQPyqIR4TMVuDP5/1LIfnv/EUoisAFcpT\n86CFK1jOGtdTALxDKIk6mlsiPCXD7jlSWw3btJlwydeudTVYBq5OhC/DLREn\n2vgtvqcWjvi4X/ttEWB35EzP11s6gRTv3ldVlXQ13Db+gHrjExRn848bRu0R\n1RzgcpsXOVeyzlzMKFJDXueyCOdiVAyEVPmLHKojwaP+UHlEnwI/v5OMva1V\nsQARAQABwsBlBBgBCAAPBQJRxuMeAhsMBQkLO+RCAAoJECRXoVh8oO2cgiQI\nAKCqxY4LVbHYDywkwI4dAFp4bFlqKDURKzEq8nfDliBLmFrDAv9lFEBbNii7\nY6b3FxaijUTPlJbU9RX8xtPO6bbAujJPyHsi/hBZjqWCqbajbwoNMYzu9nbt\nB2DfxZKYnVijjmb15WuXVC+GN4M+ZCtw+SNrpFTBPUUl4LjBRvUJ9DhjbD2+\nFlqXfDiRLKma0658s2PQZhqajiEswDyo1fAhOykaWCE5pW0DHl2Fizc77/QD\ne7iQa8ZRWp8Q/w0FJE2bXb3Paxtd40XURVOGRmtNvLPTKXIgxFi2dTCBQz6o\nTeajOjun6x6BUJVUbnJ40YmlqYbXqHyI9AcVMMEsLdw=\r\n=j8Ju\r\n-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n", - "fingerprint" : "2E69197FAB029D8669EF85E82457A1587CA0ED9C", - }); - } else { - done('Key was not found'); - } -} - -var AnyKey = require('../../app/lib/algos/community/AnyKey'); -var OneSig = require('../../app/lib/algos/community/1Sig')(isMember, getPubkey); - -var pubkeyCatRaw = fs.readFileSync(__dirname + '/../data/lolcat.pub', 'utf8'); -var pubkeySnowRaw = fs.readFileSync(__dirname + '/../data/snow.pub', 'utf8'); - -var amGenerated = 1403301600; -var aYear = 24*3600*365.25; -var theDay = new Date(amGenerated * 1000); -var theDayAYearBefore = new Date((amGenerated - aYear) * 1000); -var POSITIVE = 1; -var NEGATIVE = -1; -var NO_CHANGES = 0; - -var doingNothing = { - currentMembership: null, - nextMembership: null, - voterOn: null, - nextVoting: null, -}; - -var justJoining = { - currentMembership: null, - nextMembership: { membership: 'IN', date: theDay }, - voterOn: null, - nextVoting: null, -}; - -var justLeaving = { - currentMembership: { membership: 'IN' }, - nextMembership: { membership: 'OUT', date: theDay }, - voterOn: null, - nextVoting: null, -}; - -var askingToVote = { - currentMembership: { membership: 'IN' }, - nextMembership: null, - voterOn: null, - nextVoting: { date: theDay }, -}; - -var askingToVoteFutureMember = { - currentMembership: null, - nextMembership: { membership: 'IN', date: theDay }, - voterOn: null, - nextVoting: { date: theDay }, -}; - -var askingToLeave = { - currentMembership: { membership: 'IN' }, - nextMembership: { membership: 'OUT', date: theDay }, - voterOn: amGenerated, - nextVoting: null, -}; - -var aStaticOldVoter = { - currentMembership: { membership: 'IN' }, - nextMembership: null, - voterOn: amGenerated - 3600*24*15, - nextVoting: null, -}; - -var aStaticOldMember = { - currentMembership: { membership: 'IN', date: theDayAYearBefore }, - nextMembership: null, - voterOn: null, - nextVoting: null, -}; - -var aVoterActualizing = { - currentMembership: { membership: 'IN' }, - nextMembership: null, - voterOn: amGenerated - 1, - nextVoting: { date: theDay }, -}; - -describe('AnyKey:', function(){ - - var pubkey = { raw: pubkeyCatRaw }; - - it('a non-member doing nothing', function (done) { - AnyKey(pubkey, doingNothing, { generated: amGenerated }, expect(NO_CHANGES, NO_CHANGES, done)); - }); - - it('a non-member wants to join', function (done) { - AnyKey(pubkey, justJoining, { generated: amGenerated }, expect(POSITIVE, NO_CHANGES, done)); - }); - - it('a member wants to leave', function (done) { - AnyKey(pubkey, justLeaving, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, done)); - }); - - it('a member wants to vote', function (done) { - AnyKey(pubkey, askingToVote, { generated: amGenerated }, expect(NO_CHANGES, POSITIVE, done)); - }); - - it('a future member wants to vote', function (done) { - AnyKey(pubkey, askingToVoteFutureMember, { generated: amGenerated }, expect(POSITIVE, POSITIVE, done)); - }); - - it('a voter wants to leave as a member', function (done) { - AnyKey(pubkey, askingToLeave, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, done)); - }); - - it('a too old voter should be kicked from voters', function (done) { - AnyKey(pubkey, aStaticOldVoter, { generated: amGenerated }, expect(NO_CHANGES, NEGATIVE, done)); - }); - - it('a voter actualizing himself should be shown as "+"', function (done) { - AnyKey(pubkey, aVoterActualizing, { generated: amGenerated }, expect(NO_CHANGES, POSITIVE, done)); - }); - - it('no too old member exist in AnyKey algorithm', function (done) { - AnyKey(pubkey, aStaticOldMember, { generated: amGenerated }, expect(NO_CHANGES, NO_CHANGES, done)); - }); -}); - -describe('1Sig:', function(){ - - var pubkey1Sig = { raw: pubkeyCatRaw, nbVerifiedSigs: 1 }; - var pubkeyNSig = { raw: pubkeyCatRaw, nbVerifiedSigs: 23 }; - - it('a non-member doing nothing', function (done) { - async.series([ - function(cb) { OneSig(pubkey1Sig, doingNothing, { generated: amGenerated }, expect(NO_CHANGES, NO_CHANGES, cb)) }, - function(cb) { OneSig(pubkeyNSig, doingNothing, { generated: amGenerated }, expect(NO_CHANGES, NO_CHANGES, cb)) }, - ], done); - }); - - it('a non-member wants to join', function (done) { - async.series([ - function(cb) { OneSig(pubkey1Sig, justJoining, { generated: amGenerated }, expect(POSITIVE, NO_CHANGES, cb)) }, - function(cb) { OneSig(pubkeyNSig, justJoining, { generated: amGenerated }, expect(POSITIVE, NO_CHANGES, cb)) }, - ], done); - }); - - it('a member wants to leave', function (done) { - async.series([ - function(cb) { OneSig(pubkey1Sig, justLeaving, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, cb)) }, - function(cb) { OneSig(pubkeyNSig, justLeaving, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, cb)) }, - ], done); - }); - - it('a member wants to vote', function (done) { - async.series([ - function(cb) { OneSig(pubkey1Sig, askingToVote, { generated: amGenerated }, expect(NO_CHANGES, POSITIVE, cb)) }, - function(cb) { OneSig(pubkeyNSig, askingToVote, { generated: amGenerated }, expect(NO_CHANGES, POSITIVE, cb)) }, - ], done); - }); - - it('a future member wants to vote', function (done) { - async.series([ - function(cb) { OneSig(pubkey1Sig, askingToVoteFutureMember, { generated: amGenerated }, expect(POSITIVE, POSITIVE, cb)) }, - function(cb) { OneSig(pubkeyNSig, askingToVoteFutureMember, { generated: amGenerated }, expect(POSITIVE, POSITIVE, cb)) }, - ], done); - }); - - it('a voter wants to leave as a member', function (done) { - async.series([ - function(cb) { OneSig(pubkey1Sig, askingToLeave, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, cb)) }, - function(cb) { OneSig(pubkeyNSig, askingToLeave, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, cb)) }, - ], done); - }); - - it('a too old voter should be kicked from voters', function (done) { - async.series([ - function(cb) { OneSig(pubkey1Sig, aStaticOldVoter, { generated: amGenerated }, expect(NO_CHANGES, NEGATIVE, cb)) }, - function(cb) { OneSig(pubkeyNSig, aStaticOldVoter, { generated: amGenerated }, expect(NO_CHANGES, NEGATIVE, cb)) }, - ], done); - }); - - it('a voter actualizing himself should be shown as "+"', function (done) { - async.series([ - function(cb) { OneSig(pubkey1Sig, aVoterActualizing, { generated: amGenerated }, expect(NO_CHANGES, POSITIVE, cb)) }, - function(cb) { OneSig(pubkeyNSig, aVoterActualizing, { generated: amGenerated }, expect(NO_CHANGES, POSITIVE, cb)) }, - ], done); - }); - - it('no too old member exist in 1Sig algorithm', function (done) { - async.series([ - function(cb) { OneSig(pubkey1Sig, aStaticOldMember, { generated: amGenerated }, expect(NO_CHANGES, NO_CHANGES, cb)) }, - function(cb) { OneSig(pubkeyNSig, aStaticOldMember, { generated: amGenerated }, expect(NO_CHANGES, NO_CHANGES, cb)) }, - ], done); - }); - -}); - -describe('1Sig (with non-eligible pubkey):', function(){ - - // Testing wrong number of signatures - - var wrongPubkey = { raw: pubkeySnowRaw }; - - it('a non-member doing nothing (should not happen in real)', function (done) { - OneSig(wrongPubkey, doingNothing, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, done)); - }); - - it('a non-member wants to join', function (done) { - OneSig(wrongPubkey, justJoining, { generated: amGenerated }, expect(NO_CHANGES, NO_CHANGES, done)); - }); - - it('a member wants to leave', function (done) { - OneSig(wrongPubkey, justLeaving, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, done)); - }); - - it('a member wants to vote', function (done) { - OneSig(wrongPubkey, askingToVote, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, done)); - }); - - it('a future member wants to vote (should not happen, since he can\'t be a future member', function (done) { - OneSig(wrongPubkey, askingToVoteFutureMember, { generated: amGenerated }, expect(NO_CHANGES, POSITIVE, done)); - }); - - it('a voter wants to leave as a member', function (done) { - OneSig(wrongPubkey, askingToLeave, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, done)); - }); - - it('a too old voter should be kicked from voters', function (done) { - OneSig(wrongPubkey, aStaticOldVoter, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, done)); - }); - - it('no too old member exist in 1Sig algorithm', function (done) { - OneSig(wrongPubkey, aStaticOldMember, { generated: amGenerated }, expect(NEGATIVE, NEGATIVE, done)); - }); -}); - -function expect (membershipIndicator, voterIndicator, done) { - return function (err, indicators) { - should.not.exist(err); - should.exist(indicators); - should.exist(indicators.membership); - should.exist(indicators.key); - indicators.membership.should.equal(membershipIndicator); - indicators.key.should.equal(voterIndicator); - done(); - }; -} \ No newline at end of file diff --git a/test/fast/statement.js b/test/fast/statement.js deleted file mode 100644 index ff3cac76ccdcd57b019f1bf052fb5f818ee9dc56..0000000000000000000000000000000000000000 --- a/test/fast/statement.js +++ /dev/null @@ -1,55 +0,0 @@ -var should = require('should'); -var assert = require('assert'); -var async = require('async'); -var sha1 = require('sha1'); -var fs = require('fs'); -var mongoose = require('mongoose'); -var parsers = require('../../app/lib/streams/parsers/doc'); -var ucoin = require('../..'); - -var Statement = mongoose.model('Statement', require('../../app/models/statement')); -var rawCF = fs.readFileSync(__dirname + "/../data/statements/cat.flow", "utf8") + - fs.readFileSync(__dirname + "/../data/statements/cat.flow.asc", "utf8"); - -describe('Statement', function(){ - - describe('signed by cat', function(){ - - var entry; - - before(function(done) { - var parser = parsers.parseStatement().asyncWrite(rawCF, function (err, obj) { - entry = new Statement(obj); - done(err); - }); - }); - - it('should be version 1', function(){ - assert.equal(entry.version, 1); - }); - - it('should have beta_brousoufs currency name', function(){ - assert.equal(entry.currency, 'beta_brousouf'); - }); - - it('should have key', function(){ - assert.equal(entry.issuer, 'C73882B64B7E72237A2F460CE9CAB76D19A8651E'); - }); - - it('should have date', function(){ - should.exist(entry.date); - }); - - it('its computed hash should be FEDBD536DC987968D36C2C69F7A3CC6698BFBADF', function(){ - assert.equal(entry.hash, 'FEDBD536DC987968D36C2C69F7A3CC6698BFBADF'); - }); - - it('its manual hash should be A3EDCD9434938A0745C08DBD13FE436BE32053FB', function(){ - assert.equal(sha1(entry.getRaw()).toUpperCase(), 'A3EDCD9434938A0745C08DBD13FE436BE32053FB'); - }); - - it('its manual signed hash should be FEDBD536DC987968D36C2C69F7A3CC6698BFBADF', function(){ - assert.equal(sha1(entry.getRawSigned()).toUpperCase(), 'FEDBD536DC987968D36C2C69F7A3CC6698BFBADF'); - }); - }); -}); diff --git a/test/fast/vote.js b/test/fast/vote.js deleted file mode 100644 index 82ab28df98fff9b87118389005000602638509c6..0000000000000000000000000000000000000000 --- a/test/fast/vote.js +++ /dev/null @@ -1,133 +0,0 @@ -var should = require('should'); -var assert = require('assert'); -var mongoose = require('mongoose'); -var sha1 = require('sha1'); -var common = require('../../app/lib/common'); -var parsers = require('../../app/lib/streams/parsers/doc'); -var fs = require('fs'); - -var AM0 = "" + - "Version: 1\r\n" + - "Currency: beta_brousouf\r\n" + - "Number: 0\r\n" + - "GeneratedOn: 1398895200\r\n" + - "NextRequiredVotes: 1\r\n" + - "MembersRoot: 2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE\r\n" + - "MembersCount: 3\r\n" + - "MembersChanges:\r\n" + - "+2E69197FAB029D8669EF85E82457A1587CA0ED9C\r\n" + - "+C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n" + - "+D049002A6724D35F867F64CC087BA351C0AEB6DF\r\n" + - "VotersRoot: D049002A6724D35F867F64CC087BA351C0AEB6DF\r\n" + - "VotersCount: 1\r\n" + - "VotersChanges:\r\n" + - "+D049002A6724D35F867F64CC087BA351C0AEB6DF\r\n" + - "-----BEGIN PGP SIGNATURE-----\r\n" + - "Version: GnuPG v1\r\n" + - "\r\n" + - "iQEcBAABCAAGBQJThMLnAAoJEAh7o1HArrbf/ooH+wYzibvx66254R9FJfNz/miQ\r\n" + - "9GWzSbB5l+3Megxgrg3kl/OrJxcDr+o8/xxdtxROFRkwBfPkg4TNBmcFd6u0aLZp\r\n" + - "WSGBVgBlTaD18QGNVZQnrMsY9E4Ih+v+bg6tMGNnS2evqH2/OVcNO/gq4HfTxje/\r\n" + - "Ce6UdMpvFyZBXJlfclPhZtfB3sxQ8qpd+7X6ih2p2BLLPmmgHbL7995X0kjNZUqN\r\n" + - "UlNKbm0sFeOq3Ta01BIUx/u80oUNXoC/JemlpbiHsMrAtL1ZDT+CM5WrEKVdVidy\r\n" + - "jV6QcnZqUcO7Yfvf8z2yPN92W9OQJrTA8wjIjjJm5Dq5LbTi4C/jlQl4+uKvOg8=\r\n" + - "=GqZy\r\n" + - "-----END PGP SIGNATURE-----\r\n"; - -var Vote = mongoose.model('Vote', require('../../app/models/vote')); -var Amendment = mongoose.model('Amendment', require('../../app/models/amendment')); -var v; - -describe('Vote', function(){ - - describe('0 of beta_brousouf currency', function(){ - - // Loads v with its data - before(function(done) { - // var parser = parsers.parseAmendment(); - var parser = parsers.parseVote(function (err) { - done(err); - }); - - parser.end(AM0); - parser.on('readable', function () { - var parsed = parser.read(); - v = new Vote(parsed); - v.amendment = new Amendment(parsed.amendment); - done(); - }); - }); - - it('should be version 1', function(){ - assert.equal(v.amendment.version, 1); - }); - - it('should have beta_brousouf currency name', function(){ - assert.equal(v.amendment.currency, 'beta_brousouf'); - }); - - it('should be number 0', function(){ - assert.equal(v.amendment.number, 0); - }); - - it('should have no Universal Dividend', function(){ - should.not.exist(v.amendment.dividend); - }); - - it('should have no Minimal Coin Power', function(){ - should.not.exist(v.amendment.coinMinPower); - }); - - it('should have no previous hash', function(){ - should.not.exist(v.amendment.previousHash); - }); - - it('should have no members status root', function(){ - should.not.exist(v.amendment.membersStatusRoot); - }); - - it('should have 2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE members hash', function(){ - assert.equal('2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE', v.amendment.membersRoot); - }); - - it('should have the following 3 new members', function(){ - var newMembers = v.amendment.getNewMembers(); - assert.equal(newMembers.length, 3); - assert.equal(v.amendment.membersCount, 3); - assert.equal(newMembers[0], "2E69197FAB029D8669EF85E82457A1587CA0ED9C"); // Obito Uchiwa - assert.equal(newMembers[1], "C73882B64B7E72237A2F460CE9CAB76D19A8651E"); // John Snow - assert.equal(newMembers[2], "D049002A6724D35F867F64CC087BA351C0AEB6DF"); // LoL Cat - }); - - it('should have D049002A6724D35F867F64CC087BA351C0AEB6DF voters hash', function(){ - assert.equal('D049002A6724D35F867F64CC087BA351C0AEB6DF', v.amendment.votersRoot); - }); - - it('should have the following 1 new voter', function(){ - var newVoters = v.amendment.getNewVoters(); - assert.equal(newVoters.length, 1); - assert.equal(v.amendment.votersCount, 1); - assert.equal(newVoters[0], "D049002A6724D35F867F64CC087BA351C0AEB6DF"); - }); - - it('should have no voters signatures root', function(){ - should.not.exist(v.amendment.votersSigRoot); - }); - - it('its computed hash should be 65A55999086155BF6D3E4EB5D475E46E4E2307D2', function(){ - assert.equal(v.amendment.hash, '65A55999086155BF6D3E4EB5D475E46E4E2307D2'); - }); - - it('its manual hash should be 65A55999086155BF6D3E4EB5D475E46E4E2307D2', function(){ - assert.equal(sha1(v.amendment.getRaw()).toUpperCase(), '65A55999086155BF6D3E4EB5D475E46E4E2307D2'); - }); - - it('its computed SIGNED hash should be 2D5E939799C37BEFAE43629E9962D47B1E6742A8', function(){ - assert.equal(v.hash, '2D5E939799C37BEFAE43629E9962D47B1E6742A8'); - }); - - it('its manual SIGNED hash should be 2D5E939799C37BEFAE43629E9962D47B1E6742A8', function(){ - assert.equal(sha1(v.getRawSigned()).toUpperCase(), '2D5E939799C37BEFAE43629E9962D47B1E6742A8'); - }); - }); -}); \ No newline at end of file diff --git a/test/fast/voting.js b/test/fast/voting.js deleted file mode 100644 index 314ff626335e6a8905b8e21a65225f2389462b7e..0000000000000000000000000000000000000000 --- a/test/fast/voting.js +++ /dev/null @@ -1,58 +0,0 @@ -var should = require('should'); -var mongoose = require('mongoose'); -var assert = require('assert'); -var async = require('async'); -var sha1 = require('sha1'); -var fs = require('fs'); -var parsers = require('../../app/lib/streams/parsers/doc'); -var ucoin = require('../..'); - -var Voting = mongoose.model('Voting', require('../../app/models/voting')); -var rawVoting = "" + - "Version: 1\r\n" + - "Currency: beta_brousouf\r\n" + - "Registry: VOTING\r\n" + - "Issuer: 405715EC64289D1F43808F57EC51F273CBC0FA17\r\n" + - "Date: 1402836803\r\n" + - "AmendmentNumber: 0\r\n" + - "AmendmentHash: 1F747250395C6AE7C3CF4BB094F007151D5AB188\r\n"; - -describe('Voting', function(){ - - var vt; - - before(function(done) { - var parser = parsers.parseVoting().asyncWrite(rawVoting, function (err, obj) { - vt = new Voting(obj); - done(err); - }); - }); - - it('should be version 1', function(){ - assert.equal(vt.version, 1); - }); - - it('should have beta_brousoufs currency name', function(){ - assert.equal(vt.currency, 'beta_brousouf'); - }); - - it('should have registry VOTING', function(){ - assert.equal(vt.type, 'VOTING'); - }); - - it('should have good issuer', function(){ - assert.equal(vt.issuer, '405715EC64289D1F43808F57EC51F273CBC0FA17'); - }); - - it('should have good date', function(){ - assert.equal(vt.date.timestamp(), 1402836803); - }); - - it('its computed hash should be CEA87B744CE437CE2E8FE09AFCA028950C32D15A', function(){ - assert.equal(vt.hash, 'CEA87B744CE437CE2E8FE09AFCA028950C32D15A'); - }); - - it('its manual hash should be CEA87B744CE437CE2E8FE09AFCA028950C32D15A', function(){ - assert.equal(sha1(vt.getRaw()).toUpperCase(), 'CEA87B744CE437CE2E8FE09AFCA028950C32D15A'); - }); -}); diff --git a/test/slow/c-pubkeys.js b/test/medium/c-pubkeys.js similarity index 91% rename from test/slow/c-pubkeys.js rename to test/medium/c-pubkeys.js index bd7572e553a42c9f5b7b3e9e811b0c31e1cfa1b0..fd9373c928be12a6452740ad0bb294e17c088135 100644 --- a/test/slow/c-pubkeys.js +++ b/test/medium/c-pubkeys.js @@ -33,17 +33,17 @@ var testCases = [ **/ // Cat is used by server - testMerkle("/pks/all", 'C73882B64B7E72237A2F460CE9CAB76D19A8651E'), + testMerkle("/pks/all", ''), tester.verify( "Snow giving his key for first time must pass", on.pksAdd(pubkeySnow), is.expectedPubkey('33BBFC0C67078D72AF128B5BA296CC530126F372') ), - testMerkle("/pks/all", '5DB500A285BD380A68890D09232475A8CA003DC8'), + testMerkle("/pks/all", '33BBFC0C67078D72AF128B5BA296CC530126F372'), tester.verify( - "Cat has already given his key, but without the same signatures (this one is laking some signatures)", + "Cat's pubkey'", on.pksAdd(pubkeyCat), is.expectedPubkey('C73882B64B7E72237A2F460CE9CAB76D19A8651E') ), @@ -83,7 +83,7 @@ function testMerkle (url, root) { before(function (done) { logger.debug("Launching server..."); this.timeout(1000*3); // In seconds - var server = ucoin.createRegistryServer({ name: currency, listenBMA: true, resetData: true }, { + var server = ucoin.createPKSServer({ name: currency, listenBMA: true, resetData: true }, { currency: currency, pgpkey: fs.readFileSync(__dirname + "/../data/lolcat.priv"), pgppasswd: 'lolcat', diff --git a/test/medium/hdcserver.js b/test/medium/hdcserver.js deleted file mode 100644 index 14193d876674bb00b0f93b2e9aed993feb46cd88..0000000000000000000000000000000000000000 --- a/test/medium/hdcserver.js +++ /dev/null @@ -1,226 +0,0 @@ -var should = require('should'); -var fs = require('fs'); -var async = require('async'); -var ucoin = require('./../..'); -var unix2dos = require('../../app/lib/unix2dos'); -var parsers = require('../../app/lib/streams/parsers/doc'); -var logger = require('../../app/lib/logger')('[hdcserver]'); - -var pubkeyCatRaw = unix2dos(fs.readFileSync(__dirname + '/../data/lolcat.pub', 'utf8')); -var pubkeySnowRaw = unix2dos(fs.readFileSync(__dirname + '/../data/snow.pub', 'utf8')); -var pubkeyUbot1Raw = unix2dos(fs.readFileSync(__dirname + '/../data/ubot1.pub', 'utf8')); - -var pubkeyCat, pubkeySnow, pubkeyUbot1; - -before(function (done) { - async.parallel({ - cat: function(callback){ - parsers.parsePubkey().asyncWrite(pubkeyCatRaw, function (err, obj) { - pubkeyCat = obj; - callback(err); - }); - }, - snow: function(callback){ - parsers.parsePubkey().asyncWrite(pubkeySnowRaw, function (err, obj) { - pubkeySnow = obj; - callback(err); - }); - }, - ubot1: function(callback){ - parsers.parsePubkey().asyncWrite(pubkeyUbot1Raw, function (err, obj) { - pubkeyUbot1 = obj; - callback(err); - }); - }, - }, done); -}) - -describe('A server', function () { - - this.timeout(1000*5); - - var hdcServer; - beforeEach(function (done) { - hdcServer = ucoin.createHDCServer({ name: 'hdc1', resetData: true }); - hdcServer.on('services', done); - }) - - afterEach(function (done) { - hdcServer.disconnect(done); - }) - - it('HDC should emit error on wrong data type', function (done) { - hdcServer.on('error', function (err) { - should.exist(err); - done(); - }); - hdcServer.write({ some: 'data' }); - }); - - it('HDC should accept pubkeys', function (done) { - hdcServer.on('pubkey', function (pubkey) { - should.exist(pubkey); - done(); - }); - hdcServer.write(pubkeySnow); - }); - - it('HDC should allow both simple & multiple writings', function (done) { - async.parallel([ - until(hdcServer, 'pubkey', 2) - ], done); - hdcServer.singleWriteStream().write(pubkeyUbot1); - hdcServer.singleWriteStream().end(); - hdcServer.write(pubkeySnow); - }); - - it('HDC should accept votes', function (done) { - async.parallel([ - until(hdcServer, 'vote', 1) - ], done); - hdcServer.write(pubkeyUbot1); - hdcServer.write({ - amendment: { - "version": 1, - "number": 0, - "generated": 1398895200, - "nextVotes": 1, - "dividend": null, - "coinBase": null, - "votersCount": 1, - "membersCount": 3, - "currency": "beta_brousouf", - "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE", - "coinAlgo": "Base2Draft", - "previousHash": null, - "coinList": [], - "votersChanges": [ - "+D049002A6724D35F867F64CC087BA351C0AEB6DF" - ], - "membersChanges": [ - "+2E69197FAB029D8669EF85E82457A1587CA0ED9C", - "+C73882B64B7E72237A2F460CE9CAB76D19A8651E", - "+D049002A6724D35F867F64CC087BA351C0AEB6DF" - ] - }, - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "sigDate": new Date() - }); - }); - - it('HDC should accept transactions', function (done) { - async.parallel([ - until(hdcServer, 'transaction', 1) - ], done); - hdcServer.write(pubkeyUbot1); - hdcServer.write({ - amendment: { - "version": 1, - "number": 0, - "generated": 1398895200, - "nextVotes": 1, - "dividend": null, - "coinBase": null, - "votersCount": 1, - "membersCount": 3, - "currency": "beta_brousouf", - "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE", - "coinAlgo": "Base2Draft", - "previousHash": null, - "coinList": [], - "votersChanges": [ - "+D049002A6724D35F867F64CC087BA351C0AEB6DF" - ], - "membersChanges": [ - "+2E69197FAB029D8669EF85E82457A1587CA0ED9C", - "+C73882B64B7E72237A2F460CE9CAB76D19A8651E", - "+D049002A6724D35F867F64CC087BA351C0AEB6DF" - ] - }, - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "sigDate": new Date() - }); - hdcServer.write({ - amendment: { - "version": 1, - "number": 1, - "generated": 1398981600, - "nextVotes": 1, - "dividend": null, - "coinBase": null, - "votersCount": 1, - "membersCount": 3, - "currency": "beta_brousouf", - "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE", - "coinAlgo": "Base2Draft", - "previousHash": "65A55999086155BF6D3E4EB5D475E46E4E2307D2", - "coinList": [], - "votersChanges": [], - "membersChanges": [] - }, - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "sigDate": new Date() - }); - hdcServer.write({ - amendment: { - "version": 1, - "number": 2, - "generated": 1399068000, - "nextVotes": 1, - "dividend": 100, - "coinBase": 0, - "votersCount": 1, - "membersCount": 3, - "currency": "beta_brousouf", - "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE", - "coinAlgo": "Base2Draft", - "previousHash": "8EDE25D246E3402A6D5AF31B1D9AA02239B80452", - "coinList": [ - 26, - 7, - 5, - 3, - 1 - ], - "votersChanges": [], - "membersChanges": [] - }, - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "sigDate": new Date() - }); - hdcServer.write({ - "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: GnuPG v1.4.15 (GNU/Linux)\r\n\r\niQEcBAABAgAGBQJThe/DAAoJEDwCajRJsiQWeaUH/iAtPE1yph+7+1SxmCvJ1NaT\r\ngyyI5t86b72NmgslAoexC5xsPUnwwZPBUjMCR0xLO4x1FOEwYoMYyKCvNRKdKbKe\r\nDQ1z+chCMP+sHMl/4PG7di4PT+OE5Oqgrbi8Gq1HRA4l5iamyxOoInNUoSCjxe2g\r\n4HFLPN40Hv9ovWKDlKx14hTVbN2xlnAwf3LlCOiCQsC+YWCvawAbwWL1PBvNJmF8\r\ntAW3fjFKbMlzkTLMgAWUUviozZUedScgVQ443TMxJdvnh+SCDoLqNI573I7lRy41\r\n3DzGp913OU4iTFcgHCK6XnvNw3ycqYpdIW22rniWJewartHJJQfFWX1VAMSfhIc=\r\n=QxTg\r\n-----END PGP SIGNATURE-----\r\n", - "version": 1, - "currency": "beta_brousouf", - "sender": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "number": 0, - "previousHash": null, - "recipient": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "coins": [ - "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-12", - "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-14" - ], - "sigDate": new Date(), - "comment": "", - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - }); - }); -}) - -function until (server, eventName, count) { - var counted = 0; - var max = count == undefined ? 1 : count; - return function (callback) { - server.on(eventName, function (obj) { - logger.trace('event = %s', eventName); - should.exist(obj); - counted++; - if (counted == max) - callback(); - }); - } -} \ No newline at end of file diff --git a/test/medium/openpgp.js b/test/medium/openpgp.js index 7b9a82c0fca624b6d578494c1a5e24e4ff6e6f7c..90f4b690d220a1eb5f2e7faf8c9e9532992bbde9 100644 --- a/test/medium/openpgp.js +++ b/test/medium/openpgp.js @@ -142,18 +142,11 @@ describe('Multiline message signature:', function(){ "Currency: beta_brousouf\r\n" + "Number: 0\r\n" + "GeneratedOn: 1380397288\r\n" + - "NextRequiredVotes: 2\r\n" + "MembersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" + "MembersCount: 3\r\n" + "MembersChanges:\r\n" + "+2E69197FAB029D8669EF85E82457A1587CA0ED9C\r\n" + "+33BBFC0C67078D72AF128B5BA296CC530126F372\r\n" + - "+C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n" + - "VotersRoot: F5ACFD67FC908D28C0CFDAD886249AC260515C90\r\n" + - "VotersCount: 3\r\n" + - "VotersChanges:\r\n" + - "+2E69197FAB029D8669EF85E82457A1587CA0ED9C\r\n" + - "+33BBFC0C67078D72AF128B5BA296CC530126F372\r\n" + "+C73882B64B7E72237A2F460CE9CAB76D19A8651E\r\n" + "\r\n"; diff --git a/test/medium/peerserver.js b/test/medium/peerserver.js index 9440c53ec60f9562928979f0312cfd8d73e9f7e8..94d2737b930f33d2ba4d1bccf98b1a75d218fa25 100644 --- a/test/medium/peerserver.js +++ b/test/medium/peerserver.js @@ -147,107 +147,6 @@ describe('A server', function () { "pubkey": { fingerprint: "C73882B64B7E72237A2F460CE9CAB76D19A8651E" } }); }); - - it('Peer should accept transactions', function (done) { - async.parallel({ - transaction: until(peerServer, 'transaction'), - }, done); - peerServer.write(pubkeyUbot1); - peerServer.write({ - amendment: { - "version": 1, - "number": 0, - "generated": 1398895200, - "nextVotes": 1, - "dividend": null, - "coinBase": null, - "votersCount": 1, - "membersCount": 3, - "currency": "beta_brousouf", - "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE", - "coinAlgo": "Base2Draft", - "previousHash": null, - "coinList": [], - "votersChanges": [ - "+D049002A6724D35F867F64CC087BA351C0AEB6DF" - ], - "membersChanges": [ - "+2E69197FAB029D8669EF85E82457A1587CA0ED9C", - "+C73882B64B7E72237A2F460CE9CAB76D19A8651E", - "+D049002A6724D35F867F64CC087BA351C0AEB6DF" - ] - }, - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "sigDate": new Date() - }); - peerServer.write({ - amendment: { - "version": 1, - "number": 1, - "generated": 1398981600, - "nextVotes": 1, - "dividend": null, - "coinBase": null, - "votersCount": 1, - "membersCount": 3, - "currency": "beta_brousouf", - "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE", - "coinAlgo": "Base2Draft", - "previousHash": "65A55999086155BF6D3E4EB5D475E46E4E2307D2", - "coinList": [], - "votersChanges": [], - "membersChanges": [] - }, - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "sigDate": new Date() - }); - peerServer.write({ - amendment: { - "version": 1, - "number": 2, - "generated": 1399068000, - "nextVotes": 1, - "dividend": 100, - "coinBase": 0, - "votersCount": 1, - "membersCount": 3, - "currency": "beta_brousouf", - "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE", - "coinAlgo": "Base2Draft", - "previousHash": "8EDE25D246E3402A6D5AF31B1D9AA02239B80452", - "coinList": [ - 26, - 7, - 5, - 3, - 1 - ], - "votersChanges": [], - "membersChanges": [] - }, - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "sigDate": new Date() - }); - peerServer.write({ - "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: GnuPG v1.4.15 (GNU/Linux)\r\n\r\niQEcBAABAgAGBQJThe/DAAoJEDwCajRJsiQWeaUH/iAtPE1yph+7+1SxmCvJ1NaT\r\ngyyI5t86b72NmgslAoexC5xsPUnwwZPBUjMCR0xLO4x1FOEwYoMYyKCvNRKdKbKe\r\nDQ1z+chCMP+sHMl/4PG7di4PT+OE5Oqgrbi8Gq1HRA4l5iamyxOoInNUoSCjxe2g\r\n4HFLPN40Hv9ovWKDlKx14hTVbN2xlnAwf3LlCOiCQsC+YWCvawAbwWL1PBvNJmF8\r\ntAW3fjFKbMlzkTLMgAWUUviozZUedScgVQ443TMxJdvnh+SCDoLqNI573I7lRy41\r\n3DzGp913OU4iTFcgHCK6XnvNw3ycqYpdIW22rniWJewartHJJQfFWX1VAMSfhIc=\r\n=QxTg\r\n-----END PGP SIGNATURE-----\r\n", - "version": 1, - "currency": "beta_brousouf", - "sender": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "number": 0, - "previousHash": null, - "recipient": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "coins": [ - "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-12", - "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-14" - ], - "sigDate": new Date(), - "comment": "", - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - }); - }); }) function until (server, eventName, count) { diff --git a/test/medium/pksserver.js b/test/medium/pksserver.js index 4243527d0e6aba9c552e2177c05a12e0d81a5a46..9f03673fb22fa5594ea63ad0f2fc086984cac8ce 100644 --- a/test/medium/pksserver.js +++ b/test/medium/pksserver.js @@ -41,7 +41,7 @@ describe('A PKS server', function () { var pksServer; beforeEach(function (done) { - pksServer = ucoin.createHDCServer({ name: 'hdc1', resetData: true }); + pksServer = ucoin.createPKSServer({ name: 'hdc1', resetData: true }); pksServer.on('services', done); }) diff --git a/test/medium/regserver.js b/test/medium/regserver.js deleted file mode 100644 index 551eeed70e804ea3caae3f54d2f8572dcad52af5..0000000000000000000000000000000000000000 --- a/test/medium/regserver.js +++ /dev/null @@ -1,289 +0,0 @@ -var ucoin = require('./../..'); -var async = require('async'); -var should = require('should'); -var fs = require('fs'); -var unix2dos = require('../../app/lib/unix2dos'); -var parsers = require('../../app/lib/streams/parsers/doc'); -var logger = require('../../app/lib/logger')('[regserver]'); - -var pubkeyCatRaw = unix2dos(fs.readFileSync(__dirname + '/../data/lolcat.pub', 'utf8')); -var pubkeyUbot1Raw = unix2dos(fs.readFileSync(__dirname + '/../data/ubot1.pub', 'utf8')); -var privkeyUbot1Raw = unix2dos(fs.readFileSync(__dirname + '/../data/ubot1.priv', 'utf8')); - -var pubkeyCat, pubkeyUbot1; - -before(function (done) { - async.parallel({ - cat: function(callback){ - parsers.parsePubkey().asyncWrite(pubkeyCatRaw, function (err, obj) { - pubkeyCat = obj; - callback(err); - }); - }, - ubot1: function(callback){ - parsers.parsePubkey().asyncWrite(pubkeyUbot1Raw, function (err, obj) { - pubkeyUbot1 = obj; - callback(err); - }); - }, - }, done); -}) - -describe('A server', function () { - - this.timeout(1000*5); - - var regServer; - before(function (done) { - regServer = ucoin.createRegistryServer({ name: 'hdc3', listenBMA: true, resetData: true }, { - pgpkey: privkeyUbot1Raw, - pgppasswd: 'ubot1', - currency: 'beta_brousouf', - ipv4: '127.0.0.1', - remoteipv4: '127.0.0.1', - port: 8090, - remoteport: 8090, - kmanagement: 'ALL', - createNext: true, - sync: { - "AMStart": 1398895200, - "AMFreq": 86400, - "UDFreq": 172800, - "UD0": 100, - "UDPercent": 0.1, - "Consensus": 0.33, - "AMDaemon" : "OFF", - "Algorithm" : "AnyKey" - } - }); - regServer.on('BMALoaded', done); - }) - - // it('Registry should emit error on wrong data type', function (done) { - // regServer.on('error', function (err) { - // should.exist(err); - // done(); - // }); - // regServer.write({ some: 'data' }); - // }); - - // it('Registry should accept pubkeys', function (done) { - // regServer.on('pubkey', function (pubkey) { - // should.exist(pubkey); - // done(); - // }); - // regServer.write(pubkeyCat); - // }); - - // it('Registry should accept forwards & status', function (done) { - // async.parallel({ - // forward: until(regServer, 'forward'), - // status: until(regServer, 'status'), - // wallet: until(regServer, 'wallet'), - // }, done); - // regServer.write(pubkeyCat); - // regServer.write({ - // "version": "1", - // "currency": "beta_brousouf", - // "fingerprint": "C73882B64B7E72237A2F460CE9CAB76D19A8651E", - // "endpoints": [ - // "BASIC_MERKLED_API 127.0.0.1 8080" - // ], - // "keyID": "E9CAB76D19A8651E", - // "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js VERSION\r\nComment: http://openpgpjs.org\r\n\r\nwsBcBAEBCAAQBQJTlsmOCRDpyrdtGahlHgAAGPoIANAv8Q6PtaLuCzD9aDH+\nue9G10QNsXBCOIErj7wocmct3Y9yeYBwyAfth+ia0K/YDgygOY+n1yKid6QD\nlEOaDSENcdONZlYO/zAHDu6vQR/zsAPyztRCp0TSOCxQcQV2xSFkSvUSF8g2\noNI8RETgpLIlbKE8sS3F4v5OcxSa6wkhgngqRL6ZmqYqTPzgsAXlguA/Tq48\nNwRUQZBeP/TnMvnhhaZeww5qgxMNKWAMIjv7RUvMoP+YMMwSpgIKD3QYOhFK\nZLfYnxhiS/1jtJ+GTVdPLr5MNjLnNAc195aBT7OGi2frIsr7Qhz6TdMQnh0b\n39ohs+qaacQFbPS8qyVbhsM=\r\n=0nGP\r\n-----END PGP SIGNATURE-----\r\n" - // }); - // regServer.write({ - // "version": "1", - // "currency": "beta_brousouf", - // "from": "C73882B64B7E72237A2F460CE9CAB76D19A8651E", - // "to": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - // "keyID": "E9CAB76D19A8651E", - // "forward": "ALL", - // "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js VERSION\r\nComment: http://openpgpjs.org\r\n\r\nwsBcBAEBCAAQBQJThMLbCRAIe6NRwK623wAA3GMIAIvzPBWfTZfR27vJM0v+\nU5Tv1ro8G2zrBGaTG+qe5ZXNxjgtKjtx6v1XY3zDo8s8IEAoTt09mp5M+Iz9\nPQ1eD3ThPF5Eulc+ZfN8Gqahwqro0gU0YJ6VetXdTsULNm9FJOEy3xToTcvu\nR9bmRNwrIoBRLVECRl5nRcgXCN2ETw7rejVlWSKQbNJKnh13cd65pJIYe4z6\nLDic65WyV5RL12H33F0yoEkL5Srq54iGsqtDjSKH4pCclKOc2tbmqQtS6DDQ\nggPOGrkNAbm3T7fii+UQfmT820gz938iYs/8x3kvQuWOYJgNdbfjbBi+qmg5\nZz3+PPOaiWzLKhdul/rFk5M=\r\n=alII\r\n-----END PGP SIGNATURE-----\r\n" - // }); - // regServer.write({ - // "version": "1", - // "currency": "beta_brousouf", - // "status": "UP", - // "keyID": "E9CAB76D19A8651E" - // }); - // regServer.write({ - // "version": "1", - // "currency": "beta_brousouf", - // "fingerprint": "C73882B64B7E72237A2F460CE9CAB76D19A8651E", - // "requiredTrusts": 1, - // "hosters": [ - // "2E69197FAB029D8669EF85E82457A1587CA0ED9C", - // "C73882B64B7E72237A2F460CE9CAB76D19A8651E" - // ], - // "trusts": [ - // "2E69197FAB029D8669EF85E82457A1587CA0ED9C", - // "C73882B64B7E72237A2F460CE9CAB76D19A8651E" - // ], - // "keyID": "E9CAB76D19A8651E", - // "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQEcBAABCAAGBQJTltBaAAoJED0ZtAvOQO311hYH/RxCRmDbpGZ4OKsJ283MjHI1\nu1Teh/SDWuTjeGld8m76v7Yu61PA4vb4YzTldNvGg1sBoFKy2yH/UXTxTuM2WOJh\nVnzb1BhR4Nbl3+N4E7q/0JndTv+N34c4z3gltOJJQ1VtudYFEnzRxxJPsgc8OTTm\nWmwNUu8lUE3MEI3P10TXfKcU+WmATYj2+VtK6GHjKAqjY5Lnctz94nyHLr2M5+7E\nkJ/9CkXKulTG3qTpwFL3HsILQJO93CGXjDFrdbWcq+RIRbMXWnM4ibQf7lQ1TMKK\n7Z8rKWvyGn6sHkM34OcAPd2dORwtxuCTMLtcHFUp5lxXWkT/CZEGOh9XlcilVXc=\n=ylC/\n-----END PGP SIGNATURE-----\n", - // }); - // }); - - // it('Registry should accept peerings', function (done) { - // regServer.on('peer', function (peer) { - // should.exist(peer); - // done(); - // }); - // regServer.write({ - // "version": "1", - // "currency": "beta_brousouf", - // "fingerprint": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - // "keyID": "087BA351C0AEB6DF", - // "endpoints": [ - // "BASIC_MERKLED_API 88.163.127.43 9101" - // ], - // "status": "UP", - // "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js VERSION\r\nComment: http://openpgpjs.org\r\n\r\nwsBcBAEBCAAQBQJThMLbCRAIe6NRwK623wAA3GMIAIvzPBWfTZfR27vJM0v+\nU5Tv1ro8G2zrBGaTG+qe5ZXNxjgtKjtx6v1XY3zDo8s8IEAoTt09mp5M+Iz9\nPQ1eD3ThPF5Eulc+ZfN8Gqahwqro0gU0YJ6VetXdTsULNm9FJOEy3xToTcvu\nR9bmRNwrIoBRLVECRl5nRcgXCN2ETw7rejVlWSKQbNJKnh13cd65pJIYe4z6\nLDic65WyV5RL12H33F0yoEkL5Srq54iGsqtDjSKH4pCclKOc2tbmqQtS6DDQ\nggPOGrkNAbm3T7fii+UQfmT820gz938iYs/8x3kvQuWOYJgNdbfjbBi+qmg5\nZz3+PPOaiWzLKhdul/rFk5M=\r\n=alII\r\n-----END PGP SIGNATURE-----\r\n" - // }); - // }); - - it('Registry should accept transactions', function (done) { - async.parallel([ - until(regServer, 'pubkey'), - until(regServer, 'vote', 3), - until(regServer, 'transaction'), - until(regServer, 'voting'), - until(regServer, 'statement'), - ], done); - // regServer.write(pubkeyUbot1); - regServer.write(pubkeyCat); - regServer.write({ - amendment: { - "version": 1, - "number": 0, - "generated": 1398895200, - "nextVotes": 1, - "dividend": null, - "coinBase": null, - "votersCount": 1, - "membersCount": 3, - "currency": "beta_brousouf", - "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE", - "coinAlgo": "Base2Draft", - "previousHash": null, - "coinList": [], - "votersChanges": [ - "+D049002A6724D35F867F64CC087BA351C0AEB6DF" - ], - "membersChanges": [ - "+2E69197FAB029D8669EF85E82457A1587CA0ED9C", - "+C73882B64B7E72237A2F460CE9CAB76D19A8651E", - "+D049002A6724D35F867F64CC087BA351C0AEB6DF" - ] - }, - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "sigDate": new Date() - }); - regServer.write({ - "version": "1", - "currency": "beta_brousouf", - "type": "VOTING", - "issuer": "C73882B64B7E72237A2F460CE9CAB76D19A8651E", - "date": new Date(1398895200*1000), - "sigDate": new Date(1401209571*1000), - "amNumber": 0, - "amHash": "65A55999086155BF6D3E4EB5D475E46E4E2307D2", - "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQEcBAABCAAGBQJThMLjAAoJEAh7o1HArrbf3EMH/jB1W0RJahpQzf653zu79GOe\nSuolSa9LNe5dCmoAlQ5ilCcf6amQDrZ5JmY/8DC7q2IkNMaOaUQ/sQbtAbXjzBhI\nM3zDBiUzX6J9IZ+DjuMPR98AoCORG6+1SA/ed6Je6j/hmSVx/F14PD2NjId7My9H\ne5eg74RdziqmerDfA0AENPxRWc418ah+MZi8NdXHl6r/oPuQX2oucFuAawtKFEL5\n53yLcEI3iXRCfnx724O6D5oh2iD/09sfUFv7Mqd3EmUAB0VCDH6VhZ6QSDeDHmu4\nQhPoJVTtb4YzHeAHVQI7bpgboLpwWKEuXAQPvTHRt2LsB5Vmjl5f55WMldwo3BM=\n=qtq7\n-----END PGP SIGNATURE-----\n", - }); - regServer.write({ - amendment: { - "version": 1, - "number": 1, - "generated": 1398981600, - "nextVotes": 1, - "dividend": null, - "coinBase": null, - "votersCount": 1, - "membersCount": 3, - "currency": "beta_brousouf", - "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE", - "coinAlgo": "Base2Draft", - "previousHash": "65A55999086155BF6D3E4EB5D475E46E4E2307D2", - "coinList": [], - "votersChanges": [], - "membersChanges": [] - }, - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "sigDate": new Date() - }); - regServer.write({ - amendment: { - "version": 1, - "number": 2, - "generated": 1399068000, - "nextVotes": 1, - "dividend": 100, - "coinBase": 0, - "votersCount": 1, - "membersCount": 3, - "currency": "beta_brousouf", - "votersRoot": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "membersRoot": "2A22E19061A41EB95F628F7EFB8FB2DAF6BAB4FE", - "coinAlgo": "Base2Draft", - "previousHash": "8EDE25D246E3402A6D5AF31B1D9AA02239B80452", - "coinList": [ - 26, - 7, - 5, - 3, - 1 - ], - "votersChanges": [], - "membersChanges": [] - }, - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "sigDate": new Date() - }); - regServer.write({ - "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: GnuPG v1.4.15 (GNU/Linux)\r\n\r\niQEcBAABAgAGBQJThe/DAAoJEDwCajRJsiQWeaUH/iAtPE1yph+7+1SxmCvJ1NaT\r\ngyyI5t86b72NmgslAoexC5xsPUnwwZPBUjMCR0xLO4x1FOEwYoMYyKCvNRKdKbKe\r\nDQ1z+chCMP+sHMl/4PG7di4PT+OE5Oqgrbi8Gq1HRA4l5iamyxOoInNUoSCjxe2g\r\n4HFLPN40Hv9ovWKDlKx14hTVbN2xlnAwf3LlCOiCQsC+YWCvawAbwWL1PBvNJmF8\r\ntAW3fjFKbMlzkTLMgAWUUviozZUedScgVQ443TMxJdvnh+SCDoLqNI573I7lRy41\r\n3DzGp913OU4iTFcgHCK6XnvNw3ycqYpdIW22rniWJewartHJJQfFWX1VAMSfhIc=\r\n=QxTg\r\n-----END PGP SIGNATURE-----\r\n", - "version": 1, - "currency": "beta_brousouf", - "sender": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "number": 0, - "previousHash": null, - "recipient": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "coins": [ - "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-12", - "D049002A6724D35F867F64CC087BA351C0AEB6DF-2-14" - ], - "sigDate": new Date(), - "comment": "", - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - }); - regServer.write({ - "signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: GnuPG v1.4.15 (GNU/Linux)\r\n\r\niQEcBAABAgAGBQJThe/DAAoJEDwCajRJsiQWeaUH/iAtPE1yph+7+1SxmCvJ1NaT\r\ngyyI5t86b72NmgslAoexC5xsPUnwwZPBUjMCR0xLO4x1FOEwYoMYyKCvNRKdKbKe\r\nDQ1z+chCMP+sHMl/4PG7di4PT+OE5Oqgrbi8Gq1HRA4l5iamyxOoInNUoSCjxe2g\r\n4HFLPN40Hv9ovWKDlKx14hTVbN2xlnAwf3LlCOiCQsC+YWCvawAbwWL1PBvNJmF8\r\ntAW3fjFKbMlzkTLMgAWUUviozZUedScgVQ443TMxJdvnh+SCDoLqNI573I7lRy41\r\n3DzGp913OU4iTFcgHCK6XnvNw3ycqYpdIW22rniWJewartHJJQfFWX1VAMSfhIc=\r\n=QxTg\r\n-----END PGP SIGNATURE-----\r\n", - "version": 1, - "currency": "beta_brousouf", - "amendmentNumber": 2, - "amendmentHash": "2694D9AEA40866A0D6F01C719607007ABC075E84", - "pubkey": { fingerprint: "D049002A6724D35F867F64CC087BA351C0AEB6DF" }, - "date": new Date(), - "algorithm": "AnyKey", - "sigDate": new Date(), - "issuer": "D049002A6724D35F867F64CC087BA351C0AEB6DF", - "selfGenerated": true - }); - }); -}) - -function until (server, eventName, count) { - var counted = 0; - var max = count == undefined ? 1 : count; - return function (callback) { - server.on(eventName, function (obj) { - logger.trace('event = %s', eventName); - should.exist(obj); - counted++; - if (counted == max) - callback(); - }); - } -} diff --git a/test/medium/routing.js b/test/medium/routing.js index f2659f49001b4e119a1fa216d9aaa4d82f359bbf..2dcb1b2d67d5d28474bccb9aaabeb350dd5ab26a 100644 --- a/test/medium/routing.js +++ b/test/medium/routing.js @@ -27,8 +27,8 @@ describe('In a unidirectional 2 servers network,', function () { var serverA, serverB; beforeEach(function (done) { - serverA = ucoin.createHDCServer({ name: 'hdcA', resetData: true }); - serverB = ucoin.createHDCServer({ name: 'hdcB', resetData: true }); + serverA = ucoin.createWOTServer({ name: 'hdcA', resetData: true }); + serverB = ucoin.createWOTServer({ name: 'hdcB', resetData: true }); serverA.pipe(serverB); resetServers(serverA, serverB)(done); }); @@ -60,8 +60,8 @@ describe('In a bidirectionnal 2 servers network,', function () { var serverA, serverB; beforeEach(function (done) { - serverA = ucoin.createHDCServer({ name: 'hdcC', resetData: true }); - serverB = ucoin.createHDCServer({ name: 'hdcD', resetData: true }); + serverA = ucoin.createWOTServer({ name: 'hdcC', resetData: true }); + serverB = ucoin.createWOTServer({ name: 'hdcD', resetData: true }); serverA.pipe(serverB); serverB.pipe(serverA); resetServers(serverA, serverB)(done); @@ -96,11 +96,11 @@ describe('In an oriented 5 servers network,', function () { before(function (done) { - serverA = ucoin.createHDCServer({ name: 'test_A', resetData: true }); - serverB = ucoin.createHDCServer({ name: 'test_B', resetData: true }); - serverC = ucoin.createHDCServer({ name: 'test_C', resetData: true }); - serverD = ucoin.createHDCServer({ name: 'test_D', resetData: true }); - serverE = ucoin.createHDCServer({ name: 'test_E', resetData: true }); + serverA = ucoin.createWOTServer({ name: 'test_A', resetData: true }); + serverB = ucoin.createWOTServer({ name: 'test_B', resetData: true }); + serverC = ucoin.createWOTServer({ name: 'test_C', resetData: true }); + serverD = ucoin.createWOTServer({ name: 'test_D', resetData: true }); + serverE = ucoin.createWOTServer({ name: 'test_E', resetData: true }); serverA.pipe(serverB).pipe(serverA); // A ◀--▶ B serverB.pipe(serverC).pipe(serverB); // B ◀--▶ C diff --git a/test/tool/test.js b/test/tool/test.js index 4e2dc0cc88d8bbe35c76e85efa9e611ed65135dc..2c0369ec68484c34cd2ce2602d86b7f1e5c6e7a1 100644 --- a/test/tool/test.js +++ b/test/tool/test.js @@ -49,7 +49,6 @@ module.exports.tester = function (currency) { }; var queueOfMsVt = ttlQueue(1000); - var queueOfVotes = ttlQueue(1000); this.create = function (params) { return new module.exports.HTTPTestCase(params.label, { @@ -188,22 +187,6 @@ module.exports.tester = function (currency) { }; }; - this.setVoter = function (signatory) { - var Voting = mongoose.model('Voting'); - return function (done) { - queueOfMsVt.push(function (cb) { - var ms = new Voting({ version: 1, currency: currency, issuer: signatory.fingerprint(), type: 'VOTING' }); - var raw = ms.getRaw(); - signatory.sign(raw, function (err, sig) { - post ('/registry/community/voters', { - 'voting': raw, - 'signature': sig - }, cb); - }); - }, done); - }; - }; - this.join = function (signatory) { var Membership = mongoose.model('Membership'); return function (done) { @@ -249,52 +232,6 @@ module.exports.tester = function (currency) { }; }; - this.selfVote = function (number) { - return function (done) { - queueOfVotes.push(function (cb) { - get ('/registry/amendment/'+ number + '/vote', cb); - }, done); - }; - }; - - this.vote = function (signatory) { - return function (done) { - queueOfVotes.push(function (cb) { - async.waterfall([ - function (next){ - get ('/registry/amendment', next); - }, - function (res, next){ - var json = JSON.parse(res.text); - var sig = signatory.sign(json.raw); - post('/hdc/amendments/votes', { - 'amendment': json.raw, - 'signature': sig - }, next); - }, - ], cb); - }, done); - }; - }; - - this.voteCurrent = function (signatory) { - return function (done) { - async.waterfall([ - function (next){ - get ('/hdc/amendments/current', next); - }, - function (res, next){ - var json = JSON.parse(res.text); - var sig = signatory.sign(json.raw); - post('/hdc/amendments/votes', { - 'amendment': json.raw, - 'signature': sig - }, next); - }, - ], done); - }; - }; - this.app = function (appToSet) { app = appToSet; }; @@ -427,9 +364,6 @@ function isAmendment (json) { "currency", "generated", "number", - "votersRoot", - "votersCount", - "votersChanges", "membersRoot", "membersCount", "membersChanges", @@ -461,7 +395,6 @@ function isAmendment (json) { json.coinList.length.should.not.be.below(1); } json.membersCount.should.be.a.Number.and.not.be.below(0); - json.votersCount.should.be.a.Number.and.not.be.below(0); // Strings json.currency.should.be.a.String.and.not.be.empty; if (json.previousHash) { @@ -472,19 +405,10 @@ function isAmendment (json) { } else { json.membersRoot.should.be.a.String.and.be.empty; } - if (json.votersCount > 0) { - json.votersRoot.should.be.a.String.and.match(/^[A-Z0-9]{40}$/); - } else { - json.votersRoot.should.be.a.String.and.be.empty; - } json.membersChanges.should.be.an.Array; json.membersChanges.forEach(function(change){ change.should.match(/^(\+|-)[A-Z0-9]{40}$/); }); - json.votersChanges.should.be.an.Array; - json.votersChanges.forEach(function(change){ - change.should.match(/^(\+|-)[A-Z0-9]{40}$/); - }); } function isTransaction (json) { diff --git a/txserver.js b/txserver.js new file mode 100644 index 0000000000000000000000000000000000000000..492031df37e390b8468b881f49a0795db1e41401 --- /dev/null +++ b/txserver.js @@ -0,0 +1,78 @@ +var async = require('async'); +var util = require('util'); +var parsers = require('./app/lib/streams/parsers/doc'); +var PKSServer = require('./pksserver'); + +function HDCServer (dbConf, overrideConf, interceptors, onInit) { + + var logger = require('./app/lib/logger')(dbConf.name); + + var selfInterceptors = [ + { + // Transaction + matches: function (obj) { + return obj.recipient ? true : false; + }, + treatment: function (server, obj, next) { + async.waterfall([ + function (next){ + server.TransactionsService.processTx(obj, next); + }, + function (tx, next){ + server.emit('transaction', tx); + next(null, tx); + }, + ], next); + } + } + ]; + + PKSServer.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), onInit || []); + + var that = this; + + this._read = function (size) { + }; + + this._initServices = function(conn, done) { + this.KeyService = require('./app/service/KeyService').get(conn); + this.PublicKeyService = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService); + this.ContractService = require('./app/service/ContractService').get(conn, that.conf); + this.TransactionsService = require('./app/service/TransactionsService').get(conn, that.MerkleService); + async.parallel({ + contract: function(callback){ + that.ContractService.load(callback); + }, + peering: function(callback){ + callback(); + }, + }, function (err) { + done(err); + }); + }; + + this._listenBMA = function (app) { + this.listenPKS(app); + this.listenHDC(app); + }; + + this.listenHDC = function (app) { + var hdc = require('./app/controllers/hdc')(that); + app.get( '/contract/amendments/promoted/:am_number', hdc.amendments.promotedNumber); + app.post( '/tx/transactions/process', hdc.transactions.processTx); + app.get( '/tx/transactions/last/:count', hdc.transactions.lastNAll); + app.get( '/tx/transactions/sender/:fpr', hdc.transactions.sender.get); + app.get( '/tx/transactions/sender/:fpr/view/:number', hdc.transactions.viewtx); + app.get( '/tx/transactions/sender/:fpr/last/:count', hdc.transactions.sender.lastNofSender); + app.get( '/tx/transactions/sender/:fpr/last/:count/:from', hdc.transactions.sender.lastNofSender); + app.get( '/tx/transactions/recipient/:fpr', hdc.transactions.recipient); + app.get( '/tx/transactions/refering/:fpr/:number', hdc.transactions.refering); + app.get( '/tx/coins/list/:fpr', hdc.coins.list); + app.get( '/tx/coins/view/:coin_id/owner', hdc.coins.view); + app.get( '/tx/coins/view/:coin_id/history', hdc.coins.history); + }; +} + +util.inherits(HDCServer, PKSServer); + +module.exports = HDCServer; diff --git a/wotserver.js b/wotserver.js new file mode 100644 index 0000000000000000000000000000000000000000..2723f56c969af3c2e746e6aabb49b516b3ffa311 --- /dev/null +++ b/wotserver.js @@ -0,0 +1,84 @@ +var async = require('async'); +var util = require('util'); +var parsers = require('./app/lib/streams/parsers/doc'); +var PKSServer = require('./pksserver'); + +function WOTServer (dbConf, overrideConf, interceptors, onInit) { + + var logger = require('./app/lib/logger')(dbConf.name); + + var selfInterceptors = [ + { + // Membership + matches: function (obj) { + return obj.userid ? true : false; + }, + treatment: function (server, obj, next) { + async.waterfall([ + function (next){ + that.KeychainService.submit(obj, next); + }, + function (membership, next){ + that.emit('membership', membership); + next(null, membership); + }, + ], next); + } + },{ + // Transaction + matches: function (obj) { + return obj.recipient ? true : false; + }, + treatment: function (server, obj, next) { + async.waterfall([ + function (next){ + server.TransactionsService.processTx(obj, next); + }, + function (tx, next){ + server.emit('transaction', tx); + next(null, tx); + }, + ], next); + } + } + ]; + + PKSServer.call(this, dbConf, overrideConf, selfInterceptors.concat(interceptors || []), onInit || []); + + var that = this; + + this._read = function (size) { + }; + + this._initServices = function(conn, done) { + this.KeyService = require('./app/service/KeyService').get(conn); + this.PublicKeyService = require('./app/service/PublicKeyService').get(conn, that.conf, that.KeyService); + this.KeychainService = require('./app/service/KeychainService').get(conn, that.conf); + async.parallel({ + contract: function(callback){ + that.KeychainService.load(callback); + }, + peering: function(callback){ + callback(); + }, + }, function (err) { + done(err); + }); + }; + + this._listenBMA = function (app) { + this.listenPKS(app); + this.listenWOT(app); + }; + + this.listenWOT = function (app) { + var keychain = require('./app/controllers/keychain')(that); + app.post( '/keychain/membership', keychain.parseMembership); + app.post( '/keychain/keyblock', keychain.parseKeyblock); + app.get( '/keychain/current', keychain.current); + }; +} + +util.inherits(WOTServer, PKSServer); + +module.exports = WOTServer;