diff --git a/app/lib/computation/blockchainContext.js b/app/lib/computation/blockchainContext.js index e223450250b46af23e26ed0f45c8d9b87e76a7bd..7fca13077d1d6b307ed5aa80dde7c728a7a3065d 100644 --- a/app/lib/computation/blockchainContext.js +++ b/app/lib/computation/blockchainContext.js @@ -3,9 +3,9 @@ const _ = require('underscore'); const co = require('co'); const Q = require('q'); const common = require('duniter-common'); -const indexer = require('duniter-common').indexer; +const indexer = require('../indexer'); const constants = require('../constants'); -const rules = require('duniter-common').rules; +const rules = require('../rules') const Identity = require('../entity/identity'); const Certification = require('../entity/certification'); const Membership = require('../entity/membership'); diff --git a/app/lib/dal/fileDAL.js b/app/lib/dal/fileDAL.js index a7f449aa9e2f5fd83f7790bf242b54f0fcb4cba4..b27722853151c93e98faca3359f6d4837a8ac133 100644 --- a/app/lib/dal/fileDAL.js +++ b/app/lib/dal/fileDAL.js @@ -3,7 +3,7 @@ const Q = require('q'); const co = require('co'); const _ = require('underscore'); const common = require('duniter-common'); -const indexer = require('duniter-common').indexer; +const indexer = require('../indexer'); const logger = require('../logger')('filedal'); const Configuration = require('../entity/configuration'); const Merkle = require('../entity/merkle'); diff --git a/app/lib/dal/sqliteDAL/AbstractIndex.js b/app/lib/dal/sqliteDAL/AbstractIndex.js index 3ffc5a0450e01901bc29a36b8fc8a95867007ad0..0187fc266b22c0e250b4bb9bb6b055559c2a4083 100644 --- a/app/lib/dal/sqliteDAL/AbstractIndex.js +++ b/app/lib/dal/sqliteDAL/AbstractIndex.js @@ -4,7 +4,7 @@ const _ = require('underscore'); const co = require('co'); -const indexer = require('duniter-common').indexer; +const indexer = require('../../indexer'); module.exports = AbstractIndex; diff --git a/app/lib/dal/sqliteDAL/index/CIndexDAL.js b/app/lib/dal/sqliteDAL/index/CIndexDAL.js index e3f2c76e00516aad814235d782885a21b86e676d..416a64a0796974ab7bc6683f1dbf0081096dc361 100644 --- a/app/lib/dal/sqliteDAL/index/CIndexDAL.js +++ b/app/lib/dal/sqliteDAL/index/CIndexDAL.js @@ -5,7 +5,7 @@ const co = require('co'); const constants = require('./../../../constants'); const common = require('duniter-common'); -const indexer = require('duniter-common').indexer; +const indexer = require('../../../indexer'); const AbstractSQLite = require('./../AbstractSQLite'); const AbstractIndex = require('./../AbstractIndex'); diff --git a/app/lib/dal/sqliteDAL/index/IIndexDAL.js b/app/lib/dal/sqliteDAL/index/IIndexDAL.js index 23157689870103645978e3dbd80d604c803dd164..d2eb3be71bbb19f8468cc43c4abc699143775bd6 100644 --- a/app/lib/dal/sqliteDAL/index/IIndexDAL.js +++ b/app/lib/dal/sqliteDAL/index/IIndexDAL.js @@ -4,7 +4,7 @@ const co = require('co'); const _ = require('underscore'); -const indexer = require('duniter-common').indexer; +const indexer = require('../../../indexer'); const AbstractSQLite = require('./../AbstractSQLite'); const AbstractIndex = require('./../AbstractIndex'); diff --git a/app/lib/dal/sqliteDAL/index/MIndexDAL.js b/app/lib/dal/sqliteDAL/index/MIndexDAL.js index ab8ae38760ac5421bd7ced5310439470712b9d7c..0c5c670927ade50abd8440b85457bfc0b3c03d37 100644 --- a/app/lib/dal/sqliteDAL/index/MIndexDAL.js +++ b/app/lib/dal/sqliteDAL/index/MIndexDAL.js @@ -3,7 +3,7 @@ */ const co = require('co'); -const indexer = require('duniter-common').indexer; +const indexer = require('../../../indexer'); const AbstractSQLite = require('./../AbstractSQLite'); const AbstractIndex = require('./../AbstractIndex'); diff --git a/app/lib/dal/sqliteDAL/index/SIndexDAL.js b/app/lib/dal/sqliteDAL/index/SIndexDAL.js index 27afb9900b574d17446ffacf7ba2ecc29fae6cf5..59e1f1a7a9431bb0e26c3f07ac2beac037572c2d 100644 --- a/app/lib/dal/sqliteDAL/index/SIndexDAL.js +++ b/app/lib/dal/sqliteDAL/index/SIndexDAL.js @@ -5,7 +5,7 @@ const _ = require('underscore'); const co = require('co'); const common = require('duniter-common'); -const indexer = require('duniter-common').indexer; +const indexer = require('../../../indexer'); const constants = require('../../../constants'); const AbstractSQLite = require('./../AbstractSQLite'); const AbstractIndex = require('./../AbstractIndex'); diff --git a/app/lib/indexer.js b/app/lib/indexer.js new file mode 100644 index 0000000000000000000000000000000000000000..0c078402420c6a73289eddb3d4791e6e171fab0e --- /dev/null +++ b/app/lib/indexer.js @@ -0,0 +1,1804 @@ +"use strict"; + +const co = require('co'); +const _ = require('underscore'); +const common = require('duniter-common'); + +const constants = common.constants +const rawer = common.rawer +const unlock = common.txunlock +const keyring = common.keyring +const Block = common.document.Block +const Identity = common.document.Identity +const Certification = common.document.Certification +const Membership = common.document.Membership +const Transaction = common.document.Transaction + +const indexer = module.exports = { + + localIndex: (block, conf) => { + + /******************** + * GENERAL BEHAVIOR + * + * * for each newcomer: 2 indexes (1 iindex CREATE, 1 mindex CREATE) + * * for each comeback: 2 indexes (1 iindex UPDATE, 1 mindex UPDATE) + * * for each renewer: 1 index ( 1 mindex UPDATE) + * * for each leaver: 1 index ( 1 mindex UPDATE) + * * for each revoked: 1 index ( 1 mindex UPDATE) + * * for each excluded: 1 indexes (1 iindex UPDATE) + * + * * for each certification: 1 index (1 cindex CREATE) + * + * * for each tx output: 1 index (1 sindex CREATE) + * * for each tx input: 1 index (1 sindex UPDATE) + */ + + const index = []; + + /*************************** + * IDENTITIES INDEX (IINDEX) + **************************/ + for (const identity of block.identities) { + const idty = Identity.fromInline(identity); + // Computes the hash if not done yet + index.push({ + index: constants.I_INDEX, + op: constants.IDX_CREATE, + uid: idty.uid, + pub: idty.pubkey, + hash: idty.hash, + sig: idty.sig, + created_on: idty.buid, + written_on: [block.number, block.hash].join('-'), + member: true, + wasMember: true, + kick: false, + wid: null // wotb id + }); + } + + /**************************** + * MEMBERSHIPS INDEX (MINDEX) + ***************************/ + // Joiners (newcomer or join back) + for (const inlineMS of block.joiners) { + const ms = Membership.fromInline(inlineMS); + const matchesANewcomer = _.filter(index, (row) => row.index == constants.I_INDEX && row.pub == ms.issuer).length > 0; + if (matchesANewcomer) { + // Newcomer + index.push({ + index: constants.M_INDEX, + op: constants.IDX_CREATE, + pub: ms.issuer, + created_on: [ms.number, ms.fpr].join('-'), + written_on: [block.number, block.hash].join('-'), + type: 'JOIN', + expires_on: conf.msValidity, + revokes_on: conf.msValidity * constants.REVOCATION_FACTOR, + chainable_on: parseInt(block.medianTime) + conf.msPeriod, + revoked_on: null, + leaving: false + }); + } else { + // Join back + index.push({ + index: constants.M_INDEX, + op: constants.IDX_UPDATE, + pub: ms.issuer, + created_on: [ms.number, ms.fpr].join('-'), + written_on: [block.number, block.hash].join('-'), + type: 'JOIN', + expires_on: conf.msValidity, + revokes_on: conf.msValidity * constants.REVOCATION_FACTOR, + chainable_on: parseInt(block.medianTime) + conf.msPeriod, + revoked_on: null, + leaving: null + }); + index.push({ + index: constants.I_INDEX, + op: constants.IDX_UPDATE, + uid: null, + pub: ms.issuer, + created_on: null, + written_on: [block.number, block.hash].join('-'), + member: true, + wasMember: null, + kick: null, + wid: null + }); + } + } + // Actives + for (const inlineMS of block.actives) { + const ms = Membership.fromInline(inlineMS); + // Renew + index.push({ + index: constants.M_INDEX, + op: constants.IDX_UPDATE, + pub: ms.issuer, + created_on: [ms.number, ms.fpr].join('-'), + written_on: [block.number, block.hash].join('-'), + type: 'ACTIVE', + expires_on: conf.msValidity, + revokes_on: conf.msValidity * constants.REVOCATION_FACTOR, + chainable_on: parseInt(block.medianTime) + conf.msPeriod, + revoked_on: null, + leaving: null + }); + } + // Leavers + for (const inlineMS of block.leavers) { + const ms = Membership.fromInline(inlineMS); + index.push({ + index: constants.M_INDEX, + op: constants.IDX_UPDATE, + pub: ms.issuer, + created_on: [ms.number, ms.fpr].join('-'), + written_on: [block.number, block.hash].join('-'), + type: 'LEAVE', + expires_on: null, + revokes_on: null, + chainable_on: parseInt(block.medianTime) + conf.msPeriod, + revoked_on: null, + leaving: true + }); + } + // Revoked + for (const inlineRevocation of block.revoked) { + const revocation = Identity.revocationFromInline(inlineRevocation); + index.push({ + index: constants.M_INDEX, + op: constants.IDX_UPDATE, + pub: revocation.pubkey, + created_on: [block.number, block.hash].join('-'), + written_on: [block.number, block.hash].join('-'), + expires_on: null, + revokes_on: null, + revoked_on: [block.number, block.hash].join('-'), + revocation: revocation.sig, + leaving: false + }); + } + // Excluded + for (const excluded of block.excluded) { + index.push({ + index: constants.I_INDEX, + op: constants.IDX_UPDATE, + uid: null, + pub: excluded, + created_on: null, + written_on: [block.number, block.hash].join('-'), + member: false, + wasMember: null, + kick: false, + wid: null + }); + } + + /******************************* + * CERTIFICATIONS INDEX (CINDEX) + ******************************/ + for (const inlineCert of block.certifications) { + const cert = Certification.fromInline(inlineCert); + index.push({ + index: constants.C_INDEX, + op: constants.IDX_CREATE, + issuer: cert.pubkey, + receiver: cert.to, + created_on: cert.block_number, + written_on: [block.number, block.hash].join('-'), + sig: cert.sig, + chainable_on: parseInt(block.medianTime) + conf.sigPeriod, + expires_on: conf.sigValidity, + expired_on: 0, + from_wid: null, + to_wid: null + }); + } + + return index.concat(module.exports.localSIndex(block)); + }, + + localSIndex: (block) => { + /******************************* + * SOURCES INDEX (SINDEX) + ******************************/ + const index = []; + if (!block.transactions && block.getTransactions) { + const txs = block.getTransactions(); + block.transactions = []; + for (const tx of txs) { + block.transactions.push({ + version: tx.version, + comment: tx.comment, + issuers: tx.issuers, + signatures: tx.signatures, + inputs: tx.inputs.map((i) => i.raw), + outputs: tx.outputs.map((o) => o.raw) + }); + } + } + for (const obj of block.transactions) { + obj.currency = block.currency || obj.currency; + const txObj = Transaction.fromJSON(obj); + const txHash = txObj.getHash(true); + let k = 0; + for (const input of txObj.inputs) { + index.push({ + index: constants.S_INDEX, + op: constants.IDX_UPDATE, + tx: txHash, + identifier: input.identifier, + pos: input.pos, + created_on: obj.blockstamp, + written_on: [block.number, block.hash].join('-'), + written_time: block.medianTime, + locktime: obj.locktime, + unlock: txObj.unlocks[k], + amount: input.amount, + base: input.base, + conditions: null, + consumed: true, + txObj: txObj + }); + k++; + } + + let i = 0; + for (const output of txObj.outputs) { + index.push({ + index: constants.S_INDEX, + op: constants.IDX_CREATE, + tx: txHash, + identifier: txHash, + pos: i++, + written_on: [block.number, block.hash].join('-'), + written_time: block.medianTime, + locktime: obj.locktime, + amount: output.amount, + base: output.base, + conditions: output.conditions, + consumed: false, + txObj: obj + }); + } + } + return index; + }, + + quickCompleteGlobalScope: (block, conf, bindex, iindex, mindex, cindex, dal) => co(function*() { + + function range(start, end, property) { + return co(function*() { + let range; + end = Math.min(end, bindex.length); + if (start == 1) { + range = bindex.slice(-end); + } else { + range = bindex.slice(-end, -start + 1); + } + range.reverse(); + if (property) { + // Filter on a particular property + return range.map((b) => b[property]); + } else { + return range; + } + }); + } + + function head(n) { + return co(function*() { + return (yield range(n, n))[0]; + }); + } + + const HEAD = { + version: block.version, + currency: block.currency, + bsize: Block.getLen(block), + hash: Block.getHash(block), + issuer: block.issuer, + time: block.time, + medianTime: block.medianTime, + number: block.number, + powMin: block.powMin, + unitBase: block.unitbase, + membersCount: block.membersCount, + dividend: block.dividend + }; + const HEAD_1 = yield head(1); + + if (HEAD.number == 0) { + HEAD.dividend = conf.ud0; + } + else if (!HEAD.dividend) { + HEAD.dividend = HEAD_1.dividend; + } else { + HEAD.new_dividend = HEAD.dividend; + } + + // BR_G04 + yield indexer.prepareIssuersCount(HEAD, range, HEAD_1); + + // BR_G05 + indexer.prepareIssuersFrame(HEAD, HEAD_1); + + // BR_G06 + indexer.prepareIssuersFrameVar(HEAD, HEAD_1); + + // BR_G07 + yield indexer.prepareAvgBlockSize(HEAD, range); + + // BR_G09 + indexer.prepareDiffNumber(HEAD, HEAD_1, conf); + + // BR_G11 + indexer.prepareUDTime(HEAD, HEAD_1, conf); + + // BR_G15 + indexer.prepareMass(HEAD, HEAD_1); + + // BR_G16 + yield indexer.prepareSpeed(HEAD, head, conf); + + // BR_G19 + yield indexer.prepareIdentitiesAge(iindex, HEAD, HEAD_1, conf, dal); + + // BR_G22 + yield indexer.prepareMembershipsAge(mindex, HEAD, HEAD_1, conf, dal); + + // BR_G37 + yield indexer.prepareCertificationsAge(cindex, HEAD, HEAD_1, conf, dal); + + // BR_G104 + yield indexer.ruleIndexCorrectMembershipExpiryDate(HEAD, mindex, dal); + + // BR_G105 + yield indexer.ruleIndexCorrectCertificationExpiryDate(HEAD, cindex, dal); + + return HEAD; + }), + + completeGlobalScope: (block, conf, index, dal) => co(function*() { + + const iindex = module.exports.iindex(index); + const mindex = module.exports.mindex(index); + const cindex = module.exports.cindex(index); + const sindex = module.exports.sindex(index); + + const range = dal.range; + const head = dal.head; + + const HEAD = { + version: block.version, + bsize: Block.getLen(block), + hash: Block.getHash(block), + issuer: block.issuer, + time: block.time, + powMin: block.powMin + }; + const HEAD_1 = yield head(1); + if (HEAD_1) { + HEAD_1.currency = conf.currency; + } + + // BR_G01 + indexer.prepareNumber(HEAD, HEAD_1); + + // BR_G02 + if (HEAD.number > 0) { + HEAD.previousHash = HEAD_1.hash; + } else { + HEAD.previousHash = null; + } + + // BR_G99 + if (HEAD.number > 0) { + HEAD.currency = HEAD_1.currency; + } else { + HEAD.currency = null; + } + + // BR_G03 + if (HEAD.number > 0) { + HEAD.previousIssuer = HEAD_1.issuer; + } else { + HEAD.previousIssuer = null; + } + + // BR_G03 + if (HEAD.number > 0) { + HEAD.issuerIsMember = reduce(yield dal.iindexDAL.reducable(HEAD.issuer)).member; + } else { + HEAD.issuerIsMember = reduce(_.where(iindex, { pub: HEAD.issuer })).member; + } + + // BR_G04 + yield indexer.prepareIssuersCount(HEAD, range, HEAD_1); + + // BR_G05 + indexer.prepareIssuersFrame(HEAD, HEAD_1); + + // BR_G06 + indexer.prepareIssuersFrameVar(HEAD, HEAD_1); + + // BR_G07 + yield indexer.prepareAvgBlockSize(HEAD, range); + + // BR_G08 + if (HEAD.number > 0) { + HEAD.medianTime = Math.max(HEAD_1.medianTime, average(yield range(1, Math.min(conf.medianTimeBlocks, HEAD.number), 'time'))); + } else { + HEAD.medianTime = HEAD.time; + } + + // BR_G09 + indexer.prepareDiffNumber(HEAD, HEAD_1, conf); + + // BR_G10 + if (HEAD.number == 0) { + HEAD.membersCount = count(_.filter(iindex, (entry) => entry.member === true)); + } else { + HEAD.membersCount = HEAD_1.membersCount + + count(_.filter(iindex, (entry) => entry.member === true)) + - count(_.filter(iindex, (entry) => entry.member === false)); + } + + // BR_G11 + indexer.prepareUDTime(HEAD, HEAD_1, conf); + + // BR_G12 + if (HEAD.number == 0) { + HEAD.unitBase = 0; + } else { + HEAD.unitBase = HEAD_1.unitBase; + } + + // BR_G13 + indexer.prepareDividend(HEAD, HEAD_1, conf); + + // BR_G14 + indexer.prepareUnitBase(HEAD, HEAD_1, conf); + + // BR_G15 + indexer.prepareMass(HEAD, HEAD_1); + + // BR_G16 + yield indexer.prepareSpeed(HEAD, head, conf); + + // BR_G17 + if (HEAD.number > 0) { + + const ratio = constants.POW_DIFFICULTY_RANGE_RATIO; + const maxGenTime = Math.ceil(conf.avgGenTime * ratio); + const minGenTime = Math.floor(conf.avgGenTime / ratio); + const minSpeed = 1 / maxGenTime; + const maxSpeed = 1 / minGenTime; + + if (HEAD.diffNumber != HEAD_1.diffNumber && HEAD.speed >= maxSpeed && (HEAD_1.powMin + 2) % 16 == 0) { + HEAD.powMin = HEAD_1.powMin + 2; + } else if (HEAD.diffNumber != HEAD_1.diffNumber && HEAD.speed >= maxSpeed) { + HEAD.powMin = HEAD_1.powMin + 1; + } else if (HEAD.diffNumber != HEAD_1.diffNumber && HEAD.speed <= minSpeed && HEAD_1.powMin % 16 == 0) { + HEAD.powMin = Math.max(0, HEAD_1.powMin - 2); + } else if (HEAD.diffNumber != HEAD_1.diffNumber && HEAD.speed <= minSpeed) { + HEAD.powMin = Math.max(0, HEAD_1.powMin - 1); + } else { + HEAD.powMin = HEAD_1.powMin; + } + } + + // BR_G18 + yield indexer.preparePersonalizedPoW(HEAD, HEAD_1, range, conf); + + // BR_G19 + yield indexer.prepareIdentitiesAge(iindex, HEAD, HEAD_1, conf, dal); + + // BR_G20 + yield iindex.map((ENTRY) => co(function*() { + if (ENTRY.op == constants.IDX_CREATE) { + ENTRY.uidUnique = count(yield dal.iindexDAL.sqlFind({ uid: ENTRY.uid })) == 0; + } else { + ENTRY.uidUnique = true; + } + })); + + // BR_G21 + yield iindex.map((ENTRY) => co(function*() { + if (ENTRY.op == constants.IDX_CREATE) { + ENTRY.pubUnique = count(yield dal.iindexDAL.sqlFind({pub: ENTRY.pub})) == 0; + } else { + ENTRY.pubUnique = true; + } + })); + + // BR_G33 + yield iindex.map((ENTRY) => co(function*() { + if (ENTRY.member !== false) { + ENTRY.excludedIsMember = true; + } else { + ENTRY.excludedIsMember = reduce(yield dal.iindexDAL.reducable(ENTRY.pub)).member; + } + })); + + // BR_G34 + yield mindex.map((ENTRY) => co(function*() { + ENTRY.isBeingRevoked = !!ENTRY.revoked_on; + })); + + // BR_G107 + if (HEAD.number > 0) { + yield mindex.map((ENTRY) => co(function*() { + const rows = yield dal.mindexDAL.sqlFind({ pub: ENTRY.pub, chainable_on: { $gt: HEAD_1.medianTime }}); + // This rule will be enabled on + if (HEAD.medianTime >= 1498860000) { + ENTRY.unchainables = count(rows); + } else { + ENTRY.unchainables = [] + } + })); + } + + // BR_G35 + yield iindex.map((ENTRY) => co(function*() { + ENTRY.isBeingKicked = ENTRY.member === false; + })); + + // BR_G36 + yield iindex.map((ENTRY) => co(function*() { + const isMarkedAsToKick = reduce(yield dal.iindexDAL.reducable(ENTRY.pub)).kick; + const isBeingRevoked = count(_.filter(mindex, (m) => m.isBeingRevoked && m.pub == ENTRY.pub)) == 1; + ENTRY.hasToBeExcluded = isMarkedAsToKick || isBeingRevoked; + })); + + // BR_G22 + yield indexer.prepareMembershipsAge(mindex, HEAD, HEAD_1, conf, dal); + + // BR_G23 + yield mindex.map((ENTRY) => co(function*() { + if (!ENTRY.revoked_on) { + const created_on = reduce(yield dal.mindexDAL.reducable(ENTRY.pub)).created_on; + if (created_on != null) { + ENTRY.numberFollowing = number(ENTRY.created_on) > number(created_on); + } else { + ENTRY.numberFollowing = true; // Follows nothing + } + } else { + ENTRY.numberFollowing = true; + } + })); + + // BR_G24 + // Global testing, because of wotb + const oneIsOutdistanced = yield checkPeopleAreNotOudistanced( + _.filter(mindex, (entry) => !entry.revoked_on).map((entry) => entry.pub), + cindex.reduce((newLinks, c) => { + newLinks[c.receiver] = newLinks[c.receiver] || []; + newLinks[c.receiver].push(c.issuer); + return newLinks; + }, {}), + // Newcomers + _.where(iindex, { op: constants.IDX_CREATE }).map((entry) => entry.pub), + conf, + dal + ); + mindex.map((ENTRY) => { + if (ENTRY.expires_on) { + ENTRY.distanceOK = !oneIsOutdistanced; + } else { + ENTRY.distanceOK = true; + } + }); + + // BR_G25 + yield mindex.map((ENTRY) => co(function*() { + ENTRY.onRevoked = reduce(yield dal.mindexDAL.reducable(ENTRY.pub)).revoked_on != null; + })); + + // BR_G26 + yield _.filter(mindex, (entry) => entry.op == constants.IDX_UPDATE && entry.expired_on === 0).map((ENTRY) => co(function*() { + ENTRY.joinsTwice = reduce(yield dal.iindexDAL.reducable(ENTRY.pub)).member == true; + })); + + // BR_G27 + yield mindex.map((ENTRY) => co(function*() { + if (ENTRY.type == 'JOIN' || ENTRY.type == 'ACTIVE') { + const existing = count(yield dal.cindexDAL.sqlFind({ receiver: ENTRY.pub, expired_on: 0 })); + const pending = count(_.filter(cindex, (c) => c.receiver == ENTRY.pub && c.expired_on == 0)); + ENTRY.enoughCerts = (existing + pending) >= conf.sigQty; + } else { + ENTRY.enoughCerts = true; + } + })); + + // BR_G28 + yield mindex.map((ENTRY) => co(function*() { + if (ENTRY.type == 'LEAVE') { + ENTRY.leaverIsMember = reduce(yield dal.iindexDAL.reducable(ENTRY.pub)).member; + } else { + ENTRY.leaverIsMember = true; + } + })); + + // BR_G29 + yield mindex.map((ENTRY) => co(function*() { + if (ENTRY.type == 'ACTIVE') { + const reducable = yield dal.iindexDAL.reducable(ENTRY.pub); + ENTRY.activeIsMember = reduce(reducable).member; + } else { + ENTRY.activeIsMember = true; + } + })); + + // BR_G30 + yield mindex.map((ENTRY) => co(function*() { + if (!ENTRY.revoked_on) { + ENTRY.revokedIsMember = true; + } else { + ENTRY.revokedIsMember = reduce(yield dal.iindexDAL.reducable(ENTRY.pub)).member; + } + })); + + // BR_G31 + yield mindex.map((ENTRY) => co(function*() { + if (!ENTRY.revoked_on) { + ENTRY.alreadyRevoked = false; + } else { + ENTRY.alreadyRevoked = reduce(yield dal.mindexDAL.reducable(ENTRY.pub)).revoked_on; + } + })); + + // BR_G32 + yield mindex.map((ENTRY) => co(function*() { + if (!ENTRY.revoked_on) { + ENTRY.revocationSigOK = true; + } else { + ENTRY.revocationSigOK = yield sigCheckRevoke(ENTRY, dal, block.currency); + } + })); + + // BR_G37 + yield indexer.prepareCertificationsAge(cindex, HEAD, HEAD_1, conf, dal); + + // BR_G38 + if (HEAD.number > 0) { + yield cindex.map((ENTRY) => co(function*() { + const rows = yield dal.cindexDAL.sqlFind({ issuer: ENTRY.issuer, chainable_on: { $gt: HEAD_1.medianTime }}); + ENTRY.unchainables = count(rows); + })); + } + + // BR_G39 + yield cindex.map((ENTRY) => co(function*() { + ENTRY.stock = count(yield dal.cindexDAL.getValidLinksFrom(ENTRY.issuer)); + })); + + // BR_G40 + yield cindex.map((ENTRY) => co(function*() { + ENTRY.fromMember = reduce(yield dal.iindexDAL.reducable(ENTRY.issuer)).member; + })); + + // BR_G41 + yield cindex.map((ENTRY) => co(function*() { + ENTRY.toMember = reduce(yield dal.iindexDAL.reducable(ENTRY.receiver)).member; + })); + + // BR_G42 + yield cindex.map((ENTRY) => co(function*() { + ENTRY.toNewcomer = count(_.where(iindex, { member: true, pub: ENTRY.receiver })) > 0; + })); + + // BR_G43 + yield cindex.map((ENTRY) => co(function*() { + ENTRY.toLeaver = reduce(yield dal.mindexDAL.reducable(ENTRY.pub)).leaving; + })); + + // BR_G44 + yield cindex.map((ENTRY) => co(function*() { + const reducable = yield dal.cindexDAL.sqlFind({ issuer: ENTRY.issuer, receiver: ENTRY.receiver }); + ENTRY.isReplay = count(reducable) > 0 && reduce(reducable).expired_on === 0; + })); + + // BR_G45 + yield cindex.map((ENTRY) => co(function*() { + ENTRY.sigOK = checkCertificationIsValid(block, ENTRY, (pub) => { + let localInlineIdty = block.getInlineIdentity(pub); + if (localInlineIdty) { + return Identity.fromInline(localInlineIdty); + } + return dal.getWrittenIdtyByPubkey(pub); + }, conf, dal); + })); + + // BR_G102 + yield _.where(sindex, { op: constants.IDX_UPDATE }).map((ENTRY) => co(function*() { + if (HEAD.number == 0 && ENTRY.created_on == '0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855') { + ENTRY.age = 0; + } else { + let ref = yield dal.getBlockByBlockstamp(ENTRY.created_on); + if (ref && blockstamp(ref.number, ref.hash) == ENTRY.created_on) { + ENTRY.age = HEAD_1.medianTime - ref.medianTime; + } else { + ENTRY.age = constants.TX_WINDOW + 1; + } + } + })); + + // BR_G46 + yield _.where(sindex, { op: constants.IDX_UPDATE }).map((ENTRY) => co(function*() { + const reducable = yield dal.sindexDAL.sqlFind({ + identifier: ENTRY.identifier, + pos: ENTRY.pos, + amount: ENTRY.amount, + base: ENTRY.base + }); + ENTRY.conditions = reduce(reducable).conditions; // We valuate the input conditions, so we can map these records to a same account + ENTRY.available = reduce(reducable).consumed === false; + })); + + // BR_G47 + yield _.where(sindex, { op: constants.IDX_UPDATE }).map((ENTRY) => co(function*() { + let source = _.filter(sindex, (src) => src.identifier == ENTRY.identifier && src.pos == ENTRY.pos && src.conditions && src.op === constants.IDX_CREATE)[0]; + if (!source) { + const reducable = yield dal.sindexDAL.sqlFind({ + identifier: ENTRY.identifier, + pos: ENTRY.pos, + amount: ENTRY.amount, + base: ENTRY.base + }); + source = reduce(reducable); + } + ENTRY.conditions = source.conditions; + ENTRY.isLocked = !txSourceUnlock(ENTRY, source, HEAD); + })); + + // BR_G48 + yield _.where(sindex, { op: constants.IDX_UPDATE }).map((ENTRY) => co(function*() { + ENTRY.isTimeLocked = ENTRY.written_time - reduce(yield dal.sindexDAL.sqlFind({ + identifier: ENTRY.identifier, + pos: ENTRY.pos, + amount: ENTRY.amount, + base: ENTRY.base + })).written_time < ENTRY.locktime; + })); + + return HEAD; + }), + + // BR_G01 + prepareNumber: (HEAD, HEAD_1) => { + if (HEAD_1) { + HEAD.number = HEAD_1.number + 1; + } else { + HEAD.number = 0; + } + }, + + // BR_G04 + prepareIssuersCount: (HEAD, range, HEAD_1) => co(function*() { + if (HEAD.number == 0) { + HEAD.issuersCount = 0; + } else { + HEAD.issuersCount = count(uniq(yield range(1, HEAD_1.issuersFrame, 'issuer'))); + } + }), + + // BR_G05 + prepareIssuersFrame: (HEAD, HEAD_1) => { + if (HEAD.number == 0) { + HEAD.issuersFrame = 1; + } else if (HEAD_1.issuersFrameVar > 0) { + HEAD.issuersFrame = HEAD_1.issuersFrame + 1 + } else if (HEAD_1.issuersFrameVar < 0) { + HEAD.issuersFrame = HEAD_1.issuersFrame - 1 + } else { + HEAD.issuersFrame = HEAD_1.issuersFrame + } + }, + + // BR_G06 + prepareIssuersFrameVar: (HEAD, HEAD_1) => { + if (HEAD.number == 0) { + HEAD.issuersFrameVar = 0; + } else { + const issuersVar = (HEAD.issuersCount - HEAD_1.issuersCount); + if (HEAD_1.issuersFrameVar > 0) { + HEAD.issuersFrameVar = HEAD_1.issuersFrameVar + 5 * issuersVar - 1; + } else if (HEAD_1.issuersFrameVar < 0) { + HEAD.issuersFrameVar = HEAD_1.issuersFrameVar + 5 * issuersVar + 1; + } else { + HEAD.issuersFrameVar = HEAD_1.issuersFrameVar + 5 * issuersVar; + } + } + }, + + // BR_G07 + prepareAvgBlockSize: (HEAD, range) => co(function*() { + HEAD.avgBlockSize = average(yield range(1, HEAD.issuersCount, 'bsize')); + }), + + // BR_G09 + prepareDiffNumber: (HEAD, HEAD_1, conf) => { + if (HEAD.number == 0) { + HEAD.diffNumber = HEAD.number + conf.dtDiffEval; + } else if (HEAD_1.diffNumber <= HEAD.number) { + HEAD.diffNumber = HEAD_1.diffNumber + conf.dtDiffEval; + } else { + HEAD.diffNumber = HEAD_1.diffNumber; + } + }, + + // BR_G11 + prepareUDTime: (HEAD, HEAD_1, conf) => { + // UD Production + if (HEAD.number == 0) { + HEAD.udTime = conf.udTime0; + } else if (HEAD_1.udTime <= HEAD.medianTime) { + HEAD.udTime = HEAD_1.udTime + conf.dt; + } else { + HEAD.udTime = HEAD_1.udTime; + } + // UD Reevaluation + if (HEAD.number == 0) { + HEAD.udReevalTime = conf.udReevalTime0; + } else if (HEAD_1.udReevalTime <= HEAD.medianTime) { + HEAD.udReevalTime = HEAD_1.udReevalTime + conf.dtReeval; + } else { + HEAD.udReevalTime = HEAD_1.udReevalTime; + } + }, + + // BR_G13 + prepareDividend: (HEAD, HEAD_1, conf) => { + // UD re-evaluation + if (HEAD.number == 0) { + HEAD.dividend = conf.ud0; + } else if (HEAD.udReevalTime != HEAD_1.udReevalTime) { + // DUG + const previousUB = HEAD_1.unitBase; + HEAD.dividend = Math.ceil(HEAD_1.dividend + Math.pow(conf.c, 2) * Math.ceil(HEAD_1.massReeval / Math.pow(10, previousUB)) / HEAD.membersCount / (conf.dtReeval / conf.dt)); + } else { + HEAD.dividend = HEAD_1.dividend; + } + // UD creation + if (HEAD.number == 0) { + HEAD.new_dividend = null; + } else if (HEAD.udTime != HEAD_1.udTime) { + HEAD.new_dividend = HEAD.dividend; + } else { + HEAD.new_dividend = null; + } + }, + + // BR_G14 + prepareUnitBase: (HEAD) => { + if (HEAD.dividend >= Math.pow(10, constants.NB_DIGITS_UD)) { + HEAD.dividend = Math.ceil(HEAD.dividend / 10); + HEAD.new_dividend = HEAD.dividend; + HEAD.unitBase = HEAD.unitBase + 1; + } + }, + + // BR_G15 + prepareMass: (HEAD, HEAD_1) => { + // Mass + if (HEAD.number == 0) { + HEAD.mass = 0; + } + else if (HEAD.udTime != HEAD_1.udTime) { + HEAD.mass = HEAD_1.mass + HEAD.dividend * Math.pow(10, HEAD.unitBase) * HEAD.membersCount; + } else { + HEAD.mass = HEAD_1.mass; + } + // Mass on re-evaluation + if (HEAD.number == 0) { + HEAD.massReeval = 0; + } + else if (HEAD.udReevalTime != HEAD_1.udReevalTime) { + HEAD.massReeval = HEAD_1.mass; + } else { + HEAD.massReeval = HEAD_1.massReeval; + } + }, + + // BR_G16 + prepareSpeed: (HEAD, head, conf) => co(function*() { + if (HEAD.number == 0) { + HEAD.speed = 0; + } else { + const quantity = Math.min(conf.dtDiffEval, HEAD.number); + const elapsed = (HEAD.medianTime - (yield head(quantity)).medianTime); + if (!elapsed) { + HEAD.speed = 100; + } else { + HEAD.speed = quantity / elapsed; + } + } + }), + + // BR_G18 + preparePersonalizedPoW: (HEAD, HEAD_1, range, conf) => co(function*() { + let nbPersonalBlocksInFrame, medianOfBlocksInFrame, blocksOfIssuer; + let nbPreviousIssuers = 0, nbBlocksSince = 0; + if (HEAD.number == 0) { + nbPersonalBlocksInFrame = 0; + medianOfBlocksInFrame = 1; + } else { + const blocksInFrame = _.filter(yield range(1, HEAD_1.issuersFrame), (b) => b.number <= HEAD_1.number); + const issuersInFrame = blocksInFrame.map((b) => b.issuer); + blocksOfIssuer = _.filter(blocksInFrame, (entry) => entry.issuer == HEAD.issuer); + nbPersonalBlocksInFrame = count(blocksOfIssuer); + const blocksPerIssuerInFrame = uniq(issuersInFrame).map((issuer) => count(_.where(blocksInFrame, { issuer }))); + medianOfBlocksInFrame = Math.max(1, median(blocksPerIssuerInFrame)); + if (nbPersonalBlocksInFrame == 0) { + nbPreviousIssuers = 0; + nbBlocksSince = 0; + } else { + const last = blocksOfIssuer[0]; + nbPreviousIssuers = last.issuersCount; + nbBlocksSince = HEAD_1.number - last.number; + } + } + + // V0.6 Hardness + const PERSONAL_EXCESS = Math.max(0, ( (nbPersonalBlocksInFrame + 1) / medianOfBlocksInFrame) - 1); + const PERSONAL_HANDICAP = Math.floor(Math.log(1 + PERSONAL_EXCESS) / Math.log(1.189)); + HEAD.issuerDiff = Math.max(HEAD.powMin, HEAD.powMin * Math.floor(conf.percentRot * nbPreviousIssuers / (1 + nbBlocksSince))) + PERSONAL_HANDICAP; + if ((HEAD.issuerDiff + 1) % 16 == 0) { + HEAD.issuerDiff += 1; + } + + HEAD.powRemainder = HEAD.issuerDiff % 16; + HEAD.powZeros = (HEAD.issuerDiff - HEAD.powRemainder) / 16; + }), + + // BR_G19 + prepareIdentitiesAge: (iindex, HEAD, HEAD_1, conf, dal) => co(function*() { + yield _.where(iindex, { op: constants.IDX_CREATE }).map((ENTRY) => co(function*() { + if (HEAD.number == 0 && ENTRY.created_on == '0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855') { + ENTRY.age = 0; + } else { + let ref = yield dal.getBlockByBlockstamp(ENTRY.created_on); + if (ref && blockstamp(ref.number, ref.hash) == ENTRY.created_on) { + ENTRY.age = HEAD_1.medianTime - ref.medianTime; + } else { + ENTRY.age = conf.idtyWindow + 1; + } + } + })); + }), + + // BR_G22 + prepareMembershipsAge: (mindex, HEAD, HEAD_1, conf, dal) => co(function*() { + yield _.filter(mindex, (entry) => !entry.revoked_on).map((ENTRY) => co(function*() { + if (HEAD.number == 0 && ENTRY.created_on == '0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855') { + ENTRY.age = 0; + } else { + let ref = yield dal.getBlockByBlockstamp(ENTRY.created_on); + if (ref && blockstamp(ref.number, ref.hash) == ENTRY.created_on) { + ENTRY.age = HEAD_1.medianTime - ref.medianTime; + } else { + ENTRY.age = conf.msWindow + 1; + } + } + })); + }), + + // BR_G37 + prepareCertificationsAge: (cindex, HEAD, HEAD_1, conf, dal) => co(function*() { + yield cindex.map((ENTRY) => co(function*() { + if (HEAD.number == 0) { + ENTRY.age = 0; + } else { + let ref = yield dal.getBlock(number(ENTRY.created_on)); + if (ref) { + ENTRY.age = HEAD_1.medianTime - ref.medianTime; + } else { + ENTRY.age = conf.sigWindow + 1; + } + } + })); + }), + + // BR_G49 + ruleVersion: (HEAD, HEAD_1) => { + if (HEAD.number > 0) { + return HEAD.version == HEAD_1.version || HEAD.version == HEAD_1.version + 1; + } + return true; + }, + + // BR_G50 + ruleBlockSize: (HEAD) => { + if (HEAD.number > 0) { + return HEAD.bsize < indexer.DUP_HELPERS.getMaxBlockSize(HEAD); + } + return true; + }, + + // BR_G98 + ruleCurrency: (block, HEAD) => { + if (HEAD.number > 0) { + return block.currency === HEAD.currency; + } + return true; + }, + + // BR_G51 + ruleNumber: (block, HEAD) => block.number == HEAD.number, + + // BR_G52 + rulePreviousHash: (block, HEAD) => { + const equal = block.previousHash == HEAD.previousHash || (!block.previousHash && !HEAD.previousHash) + return equal + }, + + // BR_G53 + rulePreviousIssuer: (block, HEAD) => block.previousIssuer == HEAD.previousIssuer || (!block.previousIssuer && !HEAD.previousIssuer), + + // BR_G101 + ruleIssuerIsMember: (HEAD) => HEAD.issuerIsMember == true, + + // BR_G54 + ruleIssuersCount: (block, HEAD) => block.issuersCount == HEAD.issuersCount, + + // BR_G55 + ruleIssuersFrame: (block, HEAD) => block.issuersFrame == HEAD.issuersFrame, + + // BR_G56 + ruleIssuersFrameVar: (block, HEAD) => block.issuersFrameVar == HEAD.issuersFrameVar, + + // BR_G57 + ruleMedianTime: (block, HEAD) => block.medianTime == HEAD.medianTime, + + // BR_G58 + ruleDividend: (block, HEAD) => block.dividend == HEAD.new_dividend, + + // BR_G59 + ruleUnitBase: (block, HEAD) => block.unitbase == HEAD.unitBase, + + // BR_G60 + ruleMembersCount: (block, HEAD) => block.membersCount == HEAD.membersCount, + + // BR_G61 + rulePowMin: (block, HEAD) => { + if (HEAD.number > 0) { + return block.powMin == HEAD.powMin; + } + }, + + // BR_G62 + ruleProofOfWork: (HEAD) => { + // Compute exactly how much zeros are required for this block's issuer + const remainder = HEAD.powRemainder; + const nbZerosReq = HEAD.powZeros; + const highMark = constants.PROOF_OF_WORK.UPPER_BOUND[remainder]; + const powRegexp = new RegExp('^0{' + nbZerosReq + '}' + '[0-' + highMark + ']'); + try { + if (!HEAD.hash.match(powRegexp)) { + const givenZeros = Math.max(0, Math.min(nbZerosReq, HEAD.hash.match(/^0*/)[0].length)); + const c = HEAD.hash.substr(givenZeros, 1); + throw Error('Wrong proof-of-work level: given ' + givenZeros + ' zeros and \'' + c + '\', required was ' + nbZerosReq + ' zeros and an hexa char between [0-' + highMark + ']'); + } + return true; + } catch (e) { + console.error(e) + return false; + } + }, + + // BR_G63 + ruleIdentityWritability: (iindex, conf) => { + for (const ENTRY of iindex) { + if (ENTRY.age > conf.idtyWindow) return false; + } + }, + + // BR_G64 + ruleMembershipWritability: (mindex, conf) => { + for (const ENTRY of mindex) { + if (ENTRY.age > conf.msWindow) return false; + } + }, + + // BR_G108 + ruleMembershipPeriod: (mindex) => { + for (const ENTRY of mindex) { + if (ENTRY.unchainables > 0) return false; + } + }, + + // BR_G65 + ruleCertificationWritability: (cindex, conf) => { + for (const ENTRY of cindex) { + if (ENTRY.age > conf.sigWindow) return false; + } + }, + + // BR_G66 + ruleCertificationStock: (cindex, conf) => { + for (const ENTRY of cindex) { + if (ENTRY.stock > conf.sigStock) return false; + } + }, + + // BR_G67 + ruleCertificationPeriod: (cindex) => { + for (const ENTRY of cindex) { + if (ENTRY.unchainables > 0) return false; + } + }, + + // BR_G68 + ruleCertificationFromMember: (HEAD, cindex) => { + if (HEAD.number > 0) { + for (const ENTRY of cindex) { + if (!ENTRY.fromMember) return false; + } + } + }, + + // BR_G69 + ruleCertificationToMemberOrNewcomer: (cindex) => { + for (const ENTRY of cindex) { + if (!ENTRY.toMember && !ENTRY.toNewcomer) return false; + } + }, + + // BR_G70 + ruleCertificationToLeaver: (cindex) => { + for (const ENTRY of cindex) { + if (ENTRY.toLeaver) return false; + } + }, + + // BR_G71 + ruleCertificationReplay: (cindex) => { + for (const ENTRY of cindex) { + if (ENTRY.isReplay) return false; + } + }, + + // BR_G72 + ruleCertificationSignature: (cindex) => { + for (const ENTRY of cindex) { + if (!ENTRY.sigOK) return false; + } + }, + + // BR_G73 + ruleIdentityUIDUnicity: (iindex) => { + for (const ENTRY of iindex) { + if (!ENTRY.uidUnique) return false; + } + }, + + // BR_G74 + ruleIdentityPubkeyUnicity: (iindex) => { + for (const ENTRY of iindex) { + if (!ENTRY.pubUnique) return false; + } + }, + + // BR_G75 + ruleMembershipSuccession: (mindex) => { + for (const ENTRY of mindex) { + if (!ENTRY.numberFollowing) return false; + } + }, + + // BR_G76 + ruleMembershipDistance: (HEAD, mindex) => { + for (const ENTRY of mindex) { + if (HEAD.currency == 'gtest' + && !ENTRY.distanceOK + // && HEAD.number != 8450 + // && HEAD.number != 9775 + // && HEAD.number != 10893 + // && HEAD.number != 11090 + // && HEAD.number != 11263 + // && HEAD.number != 11392 + && HEAD.number < 11512) { + return false; + } + else if (HEAD.currency != 'gtest' && !ENTRY.distanceOK) { + return false; + } + } + }, + + // BR_G77 + ruleMembershipOnRevoked: (mindex) => { + for (const ENTRY of mindex) { + if (ENTRY.onRevoked) return false; + } + }, + + // BR_G78 + ruleMembershipJoinsTwice: (mindex) => { + for (const ENTRY of mindex) { + if (ENTRY.joinsTwice) return false; + } + }, + + // BR_G79 + ruleMembershipEnoughCerts: (mindex) => { + for (const ENTRY of mindex) { + if (!ENTRY.enoughCerts) return false; + } + }, + + // BR_G80 + ruleMembershipLeaverIsMember: (mindex) => { + for (const ENTRY of mindex) { + if (!ENTRY.leaverIsMember) return false; + } + }, + + // BR_G81 + ruleMembershipActiveIsMember: (mindex) => { + for (const ENTRY of mindex) { + if (!ENTRY.activeIsMember) return false; + } + }, + + // BR_G82 + ruleMembershipRevokedIsMember: (mindex) => { + for (const ENTRY of mindex) { + if (!ENTRY.revokedIsMember) return false; + } + }, + + // BR_G83 + ruleMembershipRevokedSingleton: (mindex) => { + for (const ENTRY of mindex) { + if (ENTRY.alreadyRevoked) return false; + } + }, + + // BR_G84 + ruleMembershipRevocationSignature: (mindex) => { + for (const ENTRY of mindex) { + if (!ENTRY.revocationSigOK) return false; + } + }, + + // BR_G85 + ruleMembershipExcludedIsMember: (iindex) => { + for (const ENTRY of iindex) { + if (!ENTRY.excludedIsMember) return false; + } + }, + + // BR_G86 + ruleToBeKickedArePresent: (iindex, dal) => co(function*() { + const toBeKicked = yield dal.iindexDAL.getToBeKickedPubkeys(); + for (const toKick of toBeKicked) { + if (count(_.where(iindex, { pub: toKick, isBeingKicked: true })) !== 1) { + return false; + } + } + const beingKicked = _.filter(iindex, (i) => i.member === false); + for (const entry of beingKicked) { + if (!entry.hasToBeExcluded) { + return false; + } + } + }), + + // BR_G103 + ruleTxWritability: (sindex) => { + for (const ENTRY of sindex) { + if (ENTRY.age > constants.TX_WINDOW) return false; + } + }, + + // BR_G87 + ruleInputIsAvailable: (sindex) => { + const inputs = _.where(sindex, { op: constants.IDX_UPDATE }); + for (const ENTRY of inputs) { + if (!ENTRY.available) { + return false; + } + } + }, + + // BR_G88 + ruleInputIsUnlocked: (sindex) => { + const inputs = _.where(sindex, { op: constants.IDX_UPDATE }); + for (const ENTRY of inputs) { + if (ENTRY.isLocked) { + return false; + } + } + }, + + // BR_G89 + ruleInputIsTimeUnlocked: (sindex) => { + const inputs = _.where(sindex, { op: constants.IDX_UPDATE }); + for (const ENTRY of inputs) { + if (ENTRY.isTimeLocked) { + return false; + } + } + }, + + // BR_G90 + ruleOutputBase: (sindex, HEAD_1) => { + const inputs = _.where(sindex, { op: constants.IDX_CREATE }); + for (const ENTRY of inputs) { + if (ENTRY.unitBase > HEAD_1.unitBase) { + return false; + } + } + }, + + // BR_G91 + ruleIndexGenDividend: (HEAD, dal) => co(function*() { + const dividends = []; + if (HEAD.new_dividend) { + const members = yield dal.iindexDAL.getMembersPubkeys() + for (const MEMBER of members) { + dividends.push({ + op: 'CREATE', + identifier: MEMBER.pub, + pos: HEAD.number, + written_on: [HEAD.number, HEAD.hash].join('-'), + written_time: HEAD.medianTime, + amount: HEAD.dividend, + base: HEAD.unitBase, + locktime: null, + conditions: 'SIG(' + MEMBER.pub + ')', + consumed: false + }); + } + } + return dividends; + }), + + // BR_G106 + ruleIndexGarbageSmallAccounts: (HEAD, sindex, dal) => co(function*() { + const garbages = []; + const accounts = Object.keys(sindex.reduce((acc, src) => { + acc[src.conditions] = true; + return acc; + }, {})); + const wallets = accounts.reduce((map, acc) => { + map[acc] = dal.getWallet(acc); + return map; + }, {}); + for (const account of accounts) { + const localAccountEntries = _.filter(sindex, (src) => src.conditions == account); + const wallet = yield wallets[account]; + const balance = wallet.balance + const variations = localAccountEntries.reduce((sum, src) => { + if (src.op === 'CREATE') { + return sum + src.amount * Math.pow(10, src.base); + } else { + return sum - src.amount * Math.pow(10, src.base); + } + }, 0) + // console.log('Balance of %s = %s (%s)', account, balance, variations > 0 ? '+' + variations : variations) + if (balance + variations < constants.ACCOUNT_MINIMUM_CURRENT_BASED_AMOUNT * Math.pow(10, HEAD.unitBase)) { + const globalAccountEntries = yield dal.sindexDAL.getAvailableForConditions(account) + for (const src of localAccountEntries.concat(globalAccountEntries)) { + const sourceBeingConsumed = _.filter(sindex, (entry) => entry.op === 'UPDATE' && entry.identifier == src.identifier && entry.pos == src.pos).length > 0; + if (!sourceBeingConsumed) { + garbages.push({ + op: 'UPDATE', + tx: src.tx, + identifier: src.identifier, + pos: src.pos, + amount: src.amount, + base: src.base, + written_on: [HEAD.number, HEAD.hash].join('-'), + written_time: HEAD.medianTime, + conditions: src.conditions, + consumed: true // It is now consumed + }); + } + } + } + } + return garbages; + }), + + // BR_G92 + ruleIndexGenCertificationExpiry: (HEAD, dal) => co(function*() { + const expiries = []; + const certs = yield dal.cindexDAL.findExpired(HEAD.medianTime); + for (const CERT of certs) { + expiries.push({ + op: 'UPDATE', + issuer: CERT.issuer, + receiver: CERT.receiver, + created_on: CERT.created_on, + written_on: [HEAD.number, HEAD.hash].join('-'), + expired_on: HEAD.medianTime + }); + } + return expiries; + }), + + // BR_G93 + ruleIndexGenMembershipExpiry: (HEAD, dal) => co(function*() { + const expiries = []; + const memberships = reduceBy(yield dal.mindexDAL.sqlFind({ expires_on: { $lte: HEAD.medianTime } }), ['pub']); + for (const POTENTIAL of memberships) { + const MS = yield dal.mindexDAL.getReducedMS(POTENTIAL.pub); + const hasRenewedSince = MS.expires_on > HEAD.medianTime; + if (!MS.expired_on && !hasRenewedSince) { + expiries.push({ + op: 'UPDATE', + pub: MS.pub, + created_on: MS.created_on, + written_on: [HEAD.number, HEAD.hash].join('-'), + expired_on: HEAD.medianTime + }); + } + } + return expiries; + }), + + // BR_G94 + ruleIndexGenExclusionByMembership: (HEAD, mindex, dal) => co(function*() { + const exclusions = []; + const memberships = _.filter(mindex, (entry) => entry.expired_on); + for (const MS of memberships) { + const idty = yield dal.iindexDAL.getFromPubkey(MS.pub); + if (idty.member) { + exclusions.push({ + op: 'UPDATE', + pub: MS.pub, + written_on: [HEAD.number, HEAD.hash].join('-'), + kick: true + }); + } + } + return exclusions; + }), + + // BR_G95 + ruleIndexGenExclusionByCertificatons: (HEAD, cindex, iindex, conf, dal) => co(function*() { + const exclusions = []; + const expiredCerts = _.filter(cindex, (c) => c.expired_on > 0); + for (const CERT of expiredCerts) { + const just_expired = _.filter(cindex, (c) => c.receiver == CERT.receiver && c.expired_on > 0); + const just_received = _.filter(cindex, (c) => c.receiver == CERT.receiver && c.expired_on == 0); + const non_expired_global = yield dal.cindexDAL.getValidLinksTo(CERT.receiver); + if ((count(non_expired_global) - count(just_expired) + count(just_received)) < conf.sigQty) { + const isInExcluded = _.filter(iindex, (i) => i.member === false && i.pub === CERT.receiver)[0]; + const idty = yield dal.iindexDAL.getFromPubkey(CERT.receiver); + if (!isInExcluded && idty.member) { + exclusions.push({ + op: 'UPDATE', + pub: CERT.receiver, + written_on: [HEAD.number, HEAD.hash].join('-'), + kick: true + }); + } + } + } + return exclusions; + }), + + // BR_G96 + ruleIndexGenImplicitRevocation: (HEAD, dal) => co(function*() { + const revocations = []; + const pending = yield dal.mindexDAL.sqlFind({ revokes_on: { $lte: HEAD.medianTime}, revoked_on: { $null: true } }); + for (const MS of pending) { + const REDUCED = reduce(yield dal.mindexDAL.sqlFind({ pub: MS.pub })); + if (REDUCED.revokes_on <= HEAD.medianTime && !REDUCED.revoked_on) { + revocations.push({ + op: 'UPDATE', + pub: MS.pub, + created_on: REDUCED.created_on, + written_on: [HEAD.number, HEAD.hash].join('-'), + revoked_on: HEAD.medianTime + }); + } + } + return revocations; + }), + + // BR_G104 + ruleIndexCorrectMembershipExpiryDate: (HEAD, mindex, dal) => co(function*() { + for (const MS of mindex) { + if (MS.type == 'JOIN' || MS.type == 'ACTIVE') { + let basedBlock = { medianTime: 0 }; + if (HEAD.number == 0) { + basedBlock = HEAD; + } else { + if (HEAD.currency === 'gtest') { + basedBlock = yield dal.getBlockByBlockstamp(MS.created_on); + } else { + basedBlock = yield dal.getBlockByBlockstamp(MS.created_on); + } + } + MS.expires_on += basedBlock.medianTime; + MS.revokes_on += basedBlock.medianTime; + } + } + }), + + // BR_G105 + ruleIndexCorrectCertificationExpiryDate: (HEAD, cindex, dal) => co(function*() { + for (const CERT of cindex) { + let basedBlock = { medianTime: 0 }; + if (HEAD.number == 0) { + basedBlock = HEAD; + } else { + if (HEAD.currency === 'gtest') { + basedBlock = yield dal.getBlock(CERT.created_on); + } else { + basedBlock = yield dal.getBlock(CERT.created_on); + } + } + CERT.expires_on += basedBlock.medianTime; + } + }), + + iindexCreate: (index) => _(index).filter({ index: constants.I_INDEX, op: constants.IDX_CREATE }), + mindexCreate: (index) => _(index).filter({ index: constants.M_INDEX, op: constants.IDX_CREATE }), + iindex: (index) => _(index).filter({ index: constants.I_INDEX }), + mindex: (index) => _(index).filter({ index: constants.M_INDEX }), + cindex: (index) => _(index).filter({ index: constants.C_INDEX }), + sindex: (index) => _(index).filter({ index: constants.S_INDEX }), + + DUP_HELPERS: { + + reduce: reduce, + reduceBy: reduceBy, + getMaxBlockSize: (HEAD) => Math.max(500, Math.ceil(1.1 * HEAD.avgBlockSize)), + checkPeopleAreNotOudistanced: checkPeopleAreNotOudistanced + } +}; + +function count(range) { + return range.length; +} + +function uniq(range) { + return _.uniq(range); +} + +function average(values) { + // No values => 0 average + if (!values.length) return 0; + // Otherwise, real average + const avg = values.reduce((sum, val) => sum + val, 0) / values.length; + return Math.floor(avg); +} + +function median(values) { + let med = 0; + values.sort((a, b) => a < b ? -1 : (a > b ? 1 : 0)); + const nbValues = values.length; + if (nbValues > 0) { + if (nbValues % 2 === 0) { + // Even number: the median is the average between the 2 central values, ceil rounded. + const firstValue = values[nbValues / 2]; + const secondValue = values[nbValues / 2 - 1]; + med = ((firstValue + secondValue) / 2); + } else { + med = values[(nbValues + 1) / 2 - 1]; + } + } + return med; +} + +function number(blockstamp) { + return parseInt(blockstamp); +} + +function blockstamp(number, hash) { + return [number, hash].join('-'); +} + +function reduce(records) { + return records.reduce((obj, record) => { + const keys = Object.keys(record); + for (const k of keys) { + if (record[k] !== undefined && record[k] !== null) { + obj[k] = record[k]; + } + } + return obj; + }, {}); +} + +function reduceBy(reducables, properties) { + const reduced = reducables.reduce((map, entry) => { + const id = properties.map((prop) => entry[prop]).join('-'); + map[id] = map[id] || []; + map[id].push(entry); + return map; + }, {}); + return Object.values(reduced).map((value) => indexer.DUP_HELPERS.reduce(value)); +} + +function checkPeopleAreNotOudistanced (pubkeys, newLinks, newcomers, conf, dal) { + return co(function *() { + // let wotb = dal.wotb; + let wotb = dal.wotb.memCopy(); + let current = yield dal.getCurrentBlockOrNull(); + let membersCount = current ? current.membersCount : 0; + // TODO: make a temporary copy of the WoT in RAM + // We add temporarily the newcomers to the WoT, to integrate their new links + let nodesCache = newcomers.reduce((map, pubkey) => { + let nodeID = wotb.addNode(); + map[pubkey] = nodeID; + wotb.setEnabled(false, nodeID); // These are not members yet + return map; + }, {}); + // Add temporarily the links to the WoT + let tempLinks = []; + let toKeys = _.keys(newLinks); + for (const toKey of toKeys) { + let toNode = yield getNodeIDfromPubkey(nodesCache, toKey, dal); + for (const fromKey of newLinks[toKey]) { + let fromNode = yield getNodeIDfromPubkey(nodesCache, fromKey, dal); + tempLinks.push({ from: fromNode, to: toNode }); + } + } + wotb.setMaxCert(conf.sigStock + tempLinks.length); + tempLinks.forEach((link) => wotb.addLink(link.from, link.to)); + // Checking distance of each member against them + let error; + for (const pubkey of pubkeys) { + let nodeID = yield getNodeIDfromPubkey(nodesCache, pubkey, dal); + const dSen = Math.ceil(Math.pow(membersCount, 1 / conf.stepMax)); + let isOutdistanced = wotb.isOutdistanced(nodeID, dSen, conf.stepMax, conf.xpercent); + if (isOutdistanced) { + error = Error('Joiner/Active is outdistanced from WoT'); + break; + } + } + // Undo temp links/nodes + tempLinks.forEach((link) => wotb.removeLink(link.from, link.to)); + newcomers.forEach(() => wotb.removeNode()); + wotb.clear(); + return error ? true : false; + }); +} + +function getNodeIDfromPubkey(nodesCache, pubkey, dal) { + return co(function *() { + let toNode = nodesCache[pubkey]; + // Eventually cache the target nodeID + if (toNode === null || toNode === undefined) { + let idty = yield dal.getWrittenIdtyByPubkey(pubkey); + toNode = idty.wotb_id; + nodesCache[pubkey] = toNode; + } + return toNode; + }); +} + +function sigCheckRevoke(entry, dal, currency) { + return co(function*() { + try { + let pubkey = entry.pub, sig = entry.revocation; + let idty = yield dal.getWrittenIdtyByPubkey(pubkey); + if (!idty) { + throw Error("A pubkey who was never a member cannot be revoked"); + } + if (idty.revoked) { + throw Error("A revoked identity cannot be revoked again"); + } + let rawRevocation = rawer.getOfficialRevocation({ + currency: currency, + issuer: idty.pubkey, + uid: idty.uid, + buid: idty.buid, + sig: idty.sig, + revocation: '' + }); + let sigOK = keyring.verify(rawRevocation, sig, pubkey); + if (!sigOK) { + throw Error("Revocation signature must match"); + } + return true; + } catch (e) { + return false; + } + }); +} + + + +function checkCertificationIsValid (block, cert, findIdtyFunc, conf, dal) { + return co(function *() { + if (block.number == 0 && cert.created_on != 0) { + throw Error('Number must be 0 for root block\'s certifications'); + } else { + try { + let basedBlock = { + hash: constants.SPECIAL_HASH + }; + if (block.number != 0) { + try { + basedBlock = yield dal.getBlock(cert.created_on); + } catch (e) { + throw Error('Certification based on an unexisting block'); + } + } + let idty = yield findIdtyFunc(block, cert.to, dal); + let current = block.number == 0 ? null : yield dal.getCurrentBlockOrNull(); + if (!idty) { + throw Error('Identity does not exist for certified'); + } + else if (current && current.medianTime > basedBlock.medianTime + conf.sigValidity) { + throw Error('Certification has expired'); + } + else if (cert.from == idty.pubkey) + throw Error('Rejected certification: certifying its own self-certification has no meaning'); + else { + const buid = [cert.created_on, basedBlock.hash].join('-'); + idty.currency = conf.currency; + const raw = rawer.getOfficialCertification(_.extend(idty, { + idty_issuer: idty.pubkey, + idty_uid: idty.uid, + idty_buid: idty.buid, + idty_sig: idty.sig, + issuer: cert.from, + buid: buid, + sig: '' + })); + const verified = keyring.verify(raw, cert.sig, cert.from); + if (!verified) { + throw constants.ERRORS.WRONG_SIGNATURE_FOR_CERT + } + return true; + } + } catch (e) { + return false; + } + } + }); +} + +function txSourceUnlock(ENTRY, source, HEAD) { + const tx = ENTRY.txObj; + let sigResults = require('./rules').HELPERS.getSigResult(tx, 'a'); + let unlocksForCondition = []; + let unlocksMetadata = {}; + let unlockValues = ENTRY.unlock; + if (source.conditions) { + if (unlockValues) { + // Evaluate unlock values + let sp = unlockValues.split(' '); + for (const func of sp) { + let param = func.match(/\((.+)\)/)[1]; + if (func.match(/SIG/)) { + let pubkey = tx.issuers[parseInt(param)]; + if (!pubkey) { + return false; + } + unlocksForCondition.push({ + pubkey: pubkey, + sigOK: sigResults.sigs[pubkey] && sigResults.sigs[pubkey].matching || false + }); + } else { + // XHX + unlocksForCondition.push(param); + } + } + } + + if (source.conditions.match(/CLTV/)) { + unlocksMetadata.currentTime = HEAD.medianTime; + } + + if (source.conditions.match(/CSV/)) { + unlocksMetadata.elapsedTime = HEAD.medianTime - parseInt(source.written_time); + } + + if (unlock(source.conditions, unlocksForCondition, unlocksMetadata)) { + return true; + } + } + return false; +} diff --git a/app/lib/rules/global_rules.js b/app/lib/rules/global_rules.js new file mode 100644 index 0000000000000000000000000000000000000000..d27cf232a66f11d9725fbf2ffce407822d381268 --- /dev/null +++ b/app/lib/rules/global_rules.js @@ -0,0 +1,287 @@ +"use strict"; + +const co = require('co'); +const _ = require('underscore'); +const common = require('duniter-common'); +const indexer = require('../indexer'); +const local_rules = require('../rules/local_rules'); + +const constants = common.constants +const keyring = common.keyring +const rawer = common.rawer +const Identity = common.document.Identity +const Transaction = common.document.Transaction +const unlock = common.txunlock + +let rules = {}; + +// Empty logger by default +let logger = { + debug: () => {}, + warn: () => {} +} + +// TODO: all the global rules should be replaced by index rule someday + +rules.FUNCTIONS = { + + checkIdentitiesAreWritable: (block, conf, dal) => co(function *() { + let current = yield dal.getCurrentBlockOrNull(); + for (const obj of block.identities) { + let idty = Identity.fromInline(obj); + let found = yield dal.getWrittenIdtyByUID(idty.uid); + if (found) { + throw Error('Identity already used'); + } + // Because the window rule does not apply on initial certifications + if (current && idty.buid != constants.SPECIAL_BLOCK) { + // From DUP 0.5: we fully check the blockstamp + const basedBlock = yield dal.getBlockByBlockstamp(idty.buid); + // Check if writable + let duration = current.medianTime - parseInt(basedBlock.medianTime); + if (duration > conf.idtyWindow) { + throw Error('Identity is too old and cannot be written'); + } + } + } + return true; + }), + + checkSourcesAvailability: (block, conf, dal, alsoCheckPendingTransactions) => co(function *() { + let txs = block.getTransactions(); + const current = yield dal.getCurrentBlockOrNull(); + for (const tx of txs) { + let unlocks = {}; + let sumOfInputs = 0; + let maxOutputBase = current.unitbase; + for (const unlock of tx.unlocks) { + let sp = unlock.split(':'); + let index = parseInt(sp[0]); + unlocks[index] = sp[1]; + } + for (let k = 0, len2 = tx.inputs.length; k < len2; k++) { + let src = tx.inputs[k]; + let dbSrc = yield dal.getSource(src.identifier, src.pos); + logger.debug('Source %s:%s:%s:%s = %s', src.amount, src.base, src.identifier, src.pos, dbSrc && dbSrc.consumed); + if (!dbSrc && alsoCheckPendingTransactions) { + // For chained transactions which are checked on sandbox submission, we accept them if there is already + // a previous transaction of the chain already recorded in the pool + dbSrc = yield co(function*() { + let hypotheticSrc = null; + let targetTX = yield dal.getTxByHash(src.identifier); + if (targetTX) { + let outputStr = targetTX.outputs[src.pos]; + if (outputStr) { + hypotheticSrc = Transaction.outputStr2Obj(outputStr); + hypotheticSrc.consumed = false; + hypotheticSrc.time = 0; + } + } + return hypotheticSrc; + }); + } + if (!dbSrc || dbSrc.consumed) { + logger.warn('Source ' + [src.type, src.identifier, src.pos].join(':') + ' is not available'); + throw constants.ERRORS.SOURCE_ALREADY_CONSUMED; + } + sumOfInputs += dbSrc.amount * Math.pow(10, dbSrc.base); + if (block.medianTime - dbSrc.written_time < tx.locktime) { + throw constants.ERRORS.LOCKTIME_PREVENT; + } + let sigResults = local_rules.HELPERS.getSigResult(tx); + let unlocksForCondition = []; + let unlocksMetadata = {}; + let unlockValues = unlocks[k]; + if (dbSrc.conditions) { + if (unlockValues) { + // Evaluate unlock values + let sp = unlockValues.split(' '); + for (const func of sp) { + let param = func.match(/\((.+)\)/)[1]; + if (func.match(/^SIG/)) { + let pubkey = tx.issuers[parseInt(param)]; + if (!pubkey) { + logger.warn('Source ' + [src.amount, src.base, src.type, src.identifier, src.pos].join(':') + ' unlock fail (unreferenced signatory)'); + throw constants.ERRORS.WRONG_UNLOCKER; + } + unlocksForCondition.push({ + pubkey: pubkey, + sigOK: sigResults.sigs[pubkey] && sigResults.sigs[pubkey].matching || false + }); + } else if (func.match(/^XHX/)) { + unlocksForCondition.push(param); + } + } + } + + if (dbSrc.conditions.match(/CLTV/)) { + unlocksMetadata.currentTime = block.medianTime; + } + + if (dbSrc.conditions.match(/CSV/)) { + unlocksMetadata.elapsedTime = block.medianTime - dbSrc.written_time; + } + + try { + if (!unlock(dbSrc.conditions, unlocksForCondition, unlocksMetadata)) { + throw Error('Locked'); + } + } catch (e) { + logger.warn('Source ' + [src.amount, src.base, src.type, src.identifier, src.pos].join(':') + ' unlock fail'); + throw constants.ERRORS.WRONG_UNLOCKER; + } + } + } + let sumOfOutputs = tx.outputs.reduce(function(p, output) { + if (output.base > maxOutputBase) { + throw constants.ERRORS.WRONG_OUTPUT_BASE; + } + return p + output.amount * Math.pow(10, output.base); + }, 0); + if (sumOfInputs !== sumOfOutputs) { + logger.warn('Inputs/Outputs != 1 (%s/%s)', sumOfInputs, sumOfOutputs); + throw constants.ERRORS.WRONG_AMOUNTS; + } + } + return true; + }) +}; + +rules.HELPERS = { + + // Functions used in an external context too + checkMembershipBlock: (ms, current, conf, dal) => checkMSTarget(ms, current ? { number: current.number + 1} : { number: 0 }, conf, dal), + + checkCertificationIsValid: (cert, current, findIdtyFunc, conf, dal) => checkCertificationIsValid(current ? current : { number: 0 }, cert, findIdtyFunc, conf, dal), + + checkCertificationIsValidForBlock: (cert, block, idty, conf, dal) => checkCertificationIsValid(block, cert, () => idty, conf, dal), + + isOver3Hops: (member, newLinks, newcomers, current, conf, dal) => co(function *() { + if (!current) { + return Promise.resolve(false); + } + try { + return indexer.DUP_HELPERS.checkPeopleAreNotOudistanced([member], newLinks, newcomers, conf, dal); + } catch (e) { + return true; + } + }), + + checkExistsUserID: (uid, dal) => dal.getWrittenIdtyByUID(uid), + + checkExistsPubkey: (pub, dal) => dal.getWrittenIdtyByPubkey(pub), + + checkSingleTransaction: (tx, block, conf, dal, alsoCheckPendingTransactions) => rules.FUNCTIONS.checkSourcesAvailability({ + getTransactions: () => [tx], + medianTime: block.medianTime + }, conf, dal, alsoCheckPendingTransactions), + + checkTxBlockStamp: (tx, dal) => co(function *() { + const number = tx.blockstamp.split('-')[0]; + const hash = tx.blockstamp.split('-')[1]; + const basedBlock = yield dal.getBlockByNumberAndHashOrNull(number, hash); + if (!basedBlock) { + throw "Wrong blockstamp for transaction"; + } + // Valuates the blockstampTime field + tx.blockstampTime = basedBlock.medianTime; + const current = yield dal.getCurrentBlockOrNull(); + if (current && current.medianTime > basedBlock.medianTime + constants.TX_WINDOW) { + throw "Transaction has expired"; + } + }) +}; + +/***************************** + * + * UTILITY FUNCTIONS + * + *****************************/ + +function checkMSTarget (ms, block, conf, dal) { + return co(function *() { + if (block.number == 0 && ms.number != 0) { + throw Error('Number must be 0 for root block\'s memberships'); + } + else if (block.number == 0 && ms.fpr != 'E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855') { + throw Error('Hash must be E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 for root block\'s memberships'); + } + else if (block.number == 0) { + return null; // Valid for root block + } else { + let basedBlock; + try { + basedBlock = yield dal.getBlockByNumberAndHash(ms.number, ms.fpr); + } catch (e) { + throw Error('Membership based on an unexisting block'); + } + let current = yield dal.getCurrentBlockOrNull(); + if (current && current.medianTime > basedBlock.medianTime + conf.msValidity) { + throw Error('Membership has expired'); + } + return basedBlock; + } + }); +} + +function checkCertificationIsValid (block, cert, findIdtyFunc, conf, dal) { + return co(function *() { + if (block.number == 0 && cert.block_number != 0) { + throw Error('Number must be 0 for root block\'s certifications'); + } else { + let basedBlock = { + hash: constants.SPECIAL_HASH + }; + if (block.number != 0) { + try { + basedBlock = yield dal.getBlock(cert.block_number); + } catch (e) { + throw Error('Certification based on an unexisting block'); + } + try { + const issuer = yield dal.getWrittenIdtyByPubkey(cert.from) + if (!issuer || !issuer.member) { + throw Error('Issuer is not a member') + } + } catch (e) { + throw Error('Certifier must be a member') + } + } + let idty = yield findIdtyFunc(block, cert.to, dal); + let current = block.number == 0 ? null : yield dal.getCurrentBlockOrNull(); + if (!idty) { + throw Error('Identity does not exist for certified'); + } + else if (current && current.medianTime > basedBlock.medianTime + conf.sigValidity) { + throw Error('Certification has expired'); + } + else if (cert.from == idty.pubkey) + throw Error('Rejected certification: certifying its own self-certification has no meaning'); + else { + const buid = [cert.block_number, basedBlock.hash].join('-'); + if (cert.block_hash && buid != [cert.block_number, cert.block_hash].join('-')) + throw Error('Certification based on an unexisting block buid. from ' + cert.from.substring(0,8) + ' to ' + idty.pubkey.substring(0,8)); + idty.currency = conf.currency; + const raw = rawer.getOfficialCertification(_.extend(idty, { + idty_issuer: idty.pubkey, + idty_uid: idty.uid, + idty_buid: idty.buid, + idty_sig: idty.sig, + issuer: cert.from, + buid: buid, + sig: '' + })); + const verified = keyring.verify(raw, cert.sig, cert.from); + if (!verified) { + throw constants.ERRORS.WRONG_SIGNATURE_FOR_CERT + } + return true; + } + } + }); +} + +module.exports = { + setLogger: (newLogger) => logger = newLogger, + rules +}; diff --git a/app/lib/rules/helpers.js b/app/lib/rules/helpers.js new file mode 100644 index 0000000000000000000000000000000000000000..7b61c2aabb2e2f1e2bec954a69bc82e94eb68f83 --- /dev/null +++ b/app/lib/rules/helpers.js @@ -0,0 +1,13 @@ +"use strict"; + +const common = require('duniter-common'); +const constants = common.constants + +module.exports = { + maxAcceleration +} + +function maxAcceleration (conf) { + let maxGenTime = Math.ceil(conf.avgGenTime * constants.POW_DIFFICULTY_RANGE_RATIO); + return Math.ceil(maxGenTime * conf.medianTimeBlocks); +} \ No newline at end of file diff --git a/app/lib/rules/index.js b/app/lib/rules/index.js new file mode 100644 index 0000000000000000000000000000000000000000..9e1c0333a73bf8852747e44fb208e6aa26ee6ab5 --- /dev/null +++ b/app/lib/rules/index.js @@ -0,0 +1,102 @@ +"use strict"; + +const _ = require('underscore'); +const co = require('co'); +const common = require('duniter-common'); + +const local_rules = require('../rules/local_rules') +const global_rules = require('../rules/global_rules').rules +const Block = common.document.Block + +let rules = {}; + +rules.LOCAL = local_rules.FUNCTIONS; +rules.GLOBAL = global_rules.FUNCTIONS; + +rules.HELPERS = {}; + +_.extend(rules.HELPERS, local_rules.HELPERS); +_.extend(rules.HELPERS, global_rules.HELPERS); + +rules.ALIAS = { + + ALL_LOCAL: (block, conf) => co(function *() { + yield rules.LOCAL.checkParameters(block); + yield rules.LOCAL.checkProofOfWork(block); + yield rules.LOCAL.checkInnerHash(block); + yield rules.LOCAL.checkPreviousHash(block); + yield rules.LOCAL.checkPreviousIssuer(block); + yield rules.LOCAL.checkUnitBase(block); + yield rules.LOCAL.checkBlockSignature(block); + yield rules.LOCAL.checkBlockTimes(block, conf); + yield rules.LOCAL.checkIdentitiesSignature(block); + yield rules.LOCAL.checkIdentitiesUserIDConflict(block, conf); + yield rules.LOCAL.checkIdentitiesPubkeyConflict(block, conf); + yield rules.LOCAL.checkIdentitiesMatchJoin(block, conf); + yield rules.LOCAL.checkMembershipUnicity(block, conf); + yield rules.LOCAL.checkRevokedUnicity(block, conf); + yield rules.LOCAL.checkRevokedAreExcluded(block, conf); + yield rules.LOCAL.checkMembershipsSignature(block); + yield rules.LOCAL.checkPubkeyUnicity(block); + yield rules.LOCAL.checkCertificationOneByIssuer(block, conf); + yield rules.LOCAL.checkCertificationUnicity(block, conf); + yield rules.LOCAL.checkCertificationIsntForLeaverOrExcluded(block, conf); + yield rules.LOCAL.checkTxVersion(block); + yield rules.LOCAL.checkTxIssuers(block); + yield rules.LOCAL.checkTxSources(block); + yield rules.LOCAL.checkTxRecipients(block); + yield rules.LOCAL.checkTxAmounts(block); + yield rules.LOCAL.checkTxSignature(block); + }), + + ALL_LOCAL_BUT_POW_AND_SIGNATURE: (block, conf) => co(function *() { + yield rules.LOCAL.checkParameters(block); + yield rules.LOCAL.checkInnerHash(block); + yield rules.LOCAL.checkPreviousHash(block); + yield rules.LOCAL.checkPreviousIssuer(block); + yield rules.LOCAL.checkUnitBase(block); + yield rules.LOCAL.checkBlockTimes(block, conf); + yield rules.LOCAL.checkIdentitiesSignature(block); + yield rules.LOCAL.checkIdentitiesUserIDConflict(block, conf); + yield rules.LOCAL.checkIdentitiesPubkeyConflict(block, conf); + yield rules.LOCAL.checkIdentitiesMatchJoin(block, conf); + yield rules.LOCAL.checkMembershipUnicity(block, conf); + yield rules.LOCAL.checkRevokedUnicity(block, conf); + yield rules.LOCAL.checkRevokedAreExcluded(block, conf); + yield rules.LOCAL.checkMembershipsSignature(block); + yield rules.LOCAL.checkPubkeyUnicity(block); + yield rules.LOCAL.checkCertificationOneByIssuer(block, conf); + yield rules.LOCAL.checkCertificationUnicity(block, conf); + yield rules.LOCAL.checkCertificationIsntForLeaverOrExcluded(block, conf); + yield rules.LOCAL.checkTxVersion(block); + yield rules.LOCAL.checkTxIssuers(block); + yield rules.LOCAL.checkTxSources(block); + yield rules.LOCAL.checkTxRecipients(block); + yield rules.LOCAL.checkTxAmounts(block); + yield rules.LOCAL.checkTxSignature(block); + }) +}; + +rules.CHECK = { + ASYNC: { + ALL_LOCAL: checkLocal(rules.ALIAS.ALL_LOCAL), + ALL_LOCAL_BUT_POW: checkLocal(rules.ALIAS.ALL_LOCAL_BUT_POW_AND_SIGNATURE) + } +}; + +function checkLocal(contract) { + return (b, conf, done) => { + return co(function *() { + try { + const block = Block.fromJSON(b); + yield contract(block, conf); + done && done(); + } catch (err) { + if (done) return done(err); + throw err; + } + }); + }; +} + +module.exports = rules; diff --git a/app/lib/rules/local_rules.js b/app/lib/rules/local_rules.js new file mode 100644 index 0000000000000000000000000000000000000000..f4a8f16a5d489aacb6ce3def8fb484027489f2d8 --- /dev/null +++ b/app/lib/rules/local_rules.js @@ -0,0 +1,515 @@ +"use strict"; + +const co = require('co'); +const _ = require('underscore'); +const common = require('duniter-common'); +const indexer = require('../indexer'); + +const constants = common.constants +const hashf = common.hashf +const keyring = common.keyring +const rawer = common.rawer +const Block = common.document.Block +const Identity = common.document.Identity +const Membership = common.document.Membership +const Transaction = common.document.Transaction +const maxAcceleration = require('./helpers').maxAcceleration + +let rules = {}; + +// TODO: make a global variable 'index' instead of recomputing the index each time + +rules.FUNCTIONS = { + + checkParameters: (block) => co(function *() { + if (block.number == 0 && !block.parameters) { + throw Error('Parameters must be provided for root block'); + } + else if (block.number > 0 && block.parameters) { + throw Error('Parameters must not be provided for non-root block'); + } + return true; + }), + + checkProofOfWork: (block) => co(function *() { + let remainder = block.powMin % 16; + let nb_zeros = (block.powMin - remainder) / 16; + const powRegexp = new RegExp('^0{' + nb_zeros + '}'); + if (!block.hash.match(powRegexp)) { + throw Error('Not a proof-of-work'); + } + return true; + }), + + checkInnerHash: (block) => co(function *() { + let inner_hash = hashf(block.getRawInnerPart()).toUpperCase(); + if (block.inner_hash != inner_hash) { + throw Error('Wrong inner hash'); + } + return true; + }), + + checkPreviousHash: (block) => co(function *() { + if (block.number == 0 && block.previousHash) { + throw Error('PreviousHash must not be provided for root block'); + } + else if (block.number > 0 && !block.previousHash) { + throw Error('PreviousHash must be provided for non-root block'); + } + return true; + }), + + checkPreviousIssuer: (block) => co(function *() { + if (block.number == 0 && block.previousIssuer) + throw Error('PreviousIssuer must not be provided for root block'); + else if (block.number > 0 && !block.previousIssuer) + throw Error('PreviousIssuer must be provided for non-root block'); + return true; + }), + + checkUnitBase: (block) => co(function *() { + if (block.number == 0 && block.unitbase != 0) { + throw Error('UnitBase must equal 0 for root block'); + } + return true; + }), + + checkBlockSignature: (block) => co(function *() { + if (!keyring.verify(block.getSignedPart(), block.signature, block.issuer)) + throw Error('Block\'s signature must match'); + return true; + }), + + checkBlockTimes: (block, conf) => co(function *() { + const time = parseInt(block.time); + const medianTime = parseInt(block.medianTime); + if (block.number > 0 && (time < medianTime || time > medianTime + maxAcceleration(conf))) + throw Error('A block must have its Time between MedianTime and MedianTime + ' + maxAcceleration(conf)); + else if (block.number == 0 && time != medianTime) + throw Error('Root block must have Time equal MedianTime'); + return true; + }), + + checkIdentitiesSignature: (block) => co(function *() { + let i = 0; + let wrongSig = false; + while (!wrongSig && i < block.identities.length) { + const idty = Identity.fromInline(block.identities[i]); + idty.currency = block.currency; + wrongSig = !keyring.verify(idty.rawWithoutSig(), idty.sig, idty.pubkey); + if (wrongSig) { + throw Error('Identity\'s signature must match'); + } + i++; + } + return true; + }), + + checkIdentitiesUserIDConflict: (block, conf) => co(function *() { + const index = indexer.localIndex(block, conf); + const creates = indexer.iindexCreate(index); + const uids = _.chain(creates).pluck('uid').uniq().value(); + if (creates.length !== uids.length) { + throw Error('Block must not contain twice same identity uid'); + } + return true; + }), + + checkIdentitiesPubkeyConflict: (block, conf) => co(function *() { + const index = indexer.localIndex(block, conf); + const creates = indexer.iindexCreate(index); + const pubkeys = _.chain(creates).pluck('pub').uniq().value(); + if (creates.length !== pubkeys.length) { + throw Error('Block must not contain twice same identity pubkey'); + } + return true; + }), + + checkIdentitiesMatchJoin: (block, conf) => co(function *() { + const index = indexer.localIndex(block, conf); + const icreates = indexer.iindexCreate(index); + const mcreates = indexer.mindexCreate(index); + for (const icreate of icreates) { + const matching = _(mcreates).filter({ pub: icreate.pub }); + if (matching.length == 0) { + throw Error('Each identity must match a newcomer line with same userid and certts'); + } + } + return true; + }), + + checkRevokedAreExcluded: (block, conf) => co(function *() { + const index = indexer.localIndex(block, conf); + const iindex = indexer.iindex(index); + const mindex = indexer.mindex(index); + const revocations = _.chain(mindex) + .filter((row) => row.op == constants.IDX_UPDATE && row.revoked_on !== null) + .pluck('pub') + .value(); + for (const pub of revocations) { + const exclusions = _(iindex).where({ op: constants.IDX_UPDATE, member: false, pub }); + if (exclusions.length == 0) { + throw Error('A revoked member must be excluded'); + } + } + return true; + }), + + checkRevokedUnicity: (block, conf) => co(function *() { + try { + yield rules.FUNCTIONS.checkMembershipUnicity(block, conf); + } catch (e) { + throw Error('A single revocation per member is allowed'); + } + return true; + }), + + checkMembershipUnicity: (block, conf) => co(function *() { + const index = indexer.localIndex(block, conf); + const mindex = indexer.mindex(index); + const pubkeys = _.chain(mindex).pluck('pub').uniq().value(); + if (pubkeys.length !== mindex.length) { + throw Error('Unicity constraint PUBLIC_KEY on MINDEX is not respected'); + } + return true; + }), + + checkMembershipsSignature: (block) => co(function *() { + let i = 0; + let wrongSig = false, ms; + // Joiners + while (!wrongSig && i < block.joiners.length) { + ms = Membership.fromInline(block.joiners[i], 'IN', block.currency); + wrongSig = !checkSingleMembershipSignature(ms); + i++; + } + // Actives + i = 0; + while (!wrongSig && i < block.actives.length) { + ms = Membership.fromInline(block.actives[i], 'IN', block.currency); + wrongSig = !checkSingleMembershipSignature(ms); + i++; + } + // Leavers + i = 0; + while (!wrongSig && i < block.leavers.length) { + ms = Membership.fromInline(block.leavers[i], 'OUT', block.currency); + wrongSig = !checkSingleMembershipSignature(ms); + i++; + } + if (wrongSig) { + throw Error('Membership\'s signature must match'); + } + return true; + }), + + checkPubkeyUnicity: (block) => co(function *() { + const pubkeys = []; + let conflict = false; + let pubk; + // Joiners + let i = 0; + while (!conflict && i < block.joiners.length) { + pubk = block.joiners[i].split(':')[0]; + conflict = ~pubkeys.indexOf(pubk); + pubkeys.push(pubk); + i++; + } + // Actives + i = 0; + while (!conflict && i < block.actives.length) { + pubk = block.actives[i].split(':')[0]; + conflict = ~pubkeys.indexOf(pubk); + pubkeys.push(pubk); + i++; + } + // Leavers + i = 0; + while (!conflict && i < block.leavers.length) { + pubk = block.leavers[i].split(':')[0]; + conflict = ~pubkeys.indexOf(pubk); + pubkeys.push(pubk); + i++; + } + // Excluded + i = 0; + while (!conflict && i < block.excluded.length) { + pubk = block.excluded[i].split(':')[0]; + conflict = ~pubkeys.indexOf(pubk); + pubkeys.push(pubk); + i++; + } + if (conflict) { + throw Error('Block cannot contain a same pubkey more than once in joiners, actives, leavers and excluded'); + } + return true; + }), + + checkCertificationOneByIssuer: (block, conf) => co(function *() { + if (block.number > 0) { + const index = indexer.localIndex(block, conf); + const cindex = indexer.cindex(index); + const certFromA = _.uniq(cindex.map((row) => row.issuer)); + if (certFromA.length !== cindex.length) { + throw Error('Block cannot contain two certifications from same issuer'); + } + } + return true; + }), + + checkCertificationUnicity: (block, conf) => co(function *() { + const index = indexer.localIndex(block, conf); + const cindex = indexer.cindex(index); + const certAtoB = _.uniq(cindex.map((row) => row.issuer + row.receiver)); + if (certAtoB.length !== cindex.length) { + throw Error('Block cannot contain identical certifications (A -> B)'); + } + return true; + }), + + checkCertificationIsntForLeaverOrExcluded: (block, conf) => co(function *() { + const index = indexer.localIndex(block, conf); + const cindex = indexer.cindex(index); + const iindex = indexer.iindex(index); + const mindex = indexer.mindex(index); + const certified = cindex.map((row) => row.receiver); + for (const pub of certified) { + const exclusions = _(iindex).where({ op: constants.IDX_UPDATE, member: false, pub: pub }); + const leavers = _(mindex).where({ op: constants.IDX_UPDATE, leaving: true, pub: pub }); + if (exclusions.length > 0 || leavers.length > 0) { + throw Error('Block cannot contain certifications concerning leavers or excluded members'); + } + } + return true; + }), + + checkTxVersion: (block) => co(function *() { + const txs = Block.getTransactions(block); + // Check rule against each transaction + for (const tx of txs) { + if (tx.version != 10) { + throw Error('A transaction must have the version 10'); + } + } + return true; + }), + + checkTxLen: (block) => co(function *() { + const txs = Block.getTransactions(block); + // Check rule against each transaction + for (const tx of txs) { + const txLen = Transaction.getLen(tx); + if (txLen > constants.MAXIMUM_LEN_OF_COMPACT_TX) { + throw constants.ERRORS.A_TRANSACTION_HAS_A_MAX_SIZE; + } + } + // Check rule against each output of each transaction + for (const tx of txs) { + for (const output of tx.outputs) { + const out = typeof output === 'string' ? output : Transaction.outputObj2Str(output) + if (out.length > constants.MAXIMUM_LEN_OF_OUTPUT) { + throw constants.ERRORS.MAXIMUM_LEN_OF_OUTPUT + } + } + } + // Check rule against each unlock of each transaction + for (const tx of txs) { + for (const unlock of tx.unlocks) { + if (unlock.length > constants.MAXIMUM_LEN_OF_UNLOCK) { + throw constants.ERRORS.MAXIMUM_LEN_OF_UNLOCK + } + } + } + return true; + }), + + checkTxIssuers: (block) => co(function *() { + const txs = Block.getTransactions(block); + // Check rule against each transaction + for (const tx of txs) { + if (tx.issuers.length == 0) { + throw Error('A transaction must have at least 1 issuer'); + } + } + return true; + }), + + checkTxSources: (block) => co(function *() { + const txs = Block.getTransactions(block); + for (const tx of txs) { + if (!tx.inputs || tx.inputs.length == 0) { + throw Error('A transaction must have at least 1 source'); + } + } + const sindex = indexer.localSIndex(block); + const inputs = _.filter(sindex, (row) => row.op == constants.IDX_UPDATE).map((row) => [row.op, row.identifier, row.pos].join('-')); + if (inputs.length !== _.uniq(inputs).length) { + throw Error('It cannot exist 2 identical sources for transactions inside a given block'); + } + const outputs = _.filter(sindex, (row) => row.op == constants.IDX_CREATE).map((row) => [row.op, row.identifier, row.pos].join('-')); + if (outputs.length !== _.uniq(outputs).length) { + throw Error('It cannot exist 2 identical sources for transactions inside a given block'); + } + return true; + }), + + checkTxAmounts: (block) => co(function *() { + for (const tx of Block.getTransactions(block)) { + rules.HELPERS.checkTxAmountsValidity(tx); + } + }), + + checkTxRecipients: (block) => co(function *() { + const txs = Block.getTransactions(block); + // Check rule against each transaction + for (const tx of txs) { + if (!tx.outputs || tx.outputs.length == 0) { + throw Error('A transaction must have at least 1 recipient'); + } + else { + // Cannot have empty output condition + for (const output of tx.outputs) { + if (!output.conditions.match(/(SIG|XHX)/)) { + throw Error('Empty conditions are forbidden'); + } + } + } + } + return true; + }), + + checkTxSignature: (block) => co(function *() { + const txs = Block.getTransactions(block); + // Check rule against each transaction + for (const tx of txs) { + let sigResult = getSigResult(tx); + if (!sigResult.matching) { + throw Error('Signature from a transaction must match'); + } + } + return true; + }) +}; + +function checkSingleMembershipSignature(ms) { + return keyring.verify(ms.getRaw(), ms.signature, ms.issuer); +} + +function getSigResult(tx) { + let sigResult = { sigs: {}, matching: true }; + let json = { "version": tx.version, "currency": tx.currency, "blockstamp": tx.blockstamp, "locktime": tx.locktime, "inputs": [], "outputs": [], "issuers": tx.issuers, "signatures": [], "comment": tx.comment }; + tx.inputs.forEach(function (input) { + json.inputs.push(input.raw); + }); + tx.outputs.forEach(function (output) { + json.outputs.push(output.raw); + }); + json.unlocks = tx.unlocks; + let i = 0; + let signaturesMatching = true; + const raw = rawer.getTransaction(json); + while (signaturesMatching && i < tx.signatures.length) { + const sig = tx.signatures[i]; + const pub = tx.issuers[i]; + signaturesMatching = keyring.verify(raw, sig, pub); + sigResult.sigs[pub] = { + matching: signaturesMatching, + index: i + }; + i++; + } + sigResult.matching = signaturesMatching; + return sigResult; +} + +function checkBunchOfTransactions(transactions, done){ + const block = { transactions }; + return co(function *() { + try { + let local_rule = rules.FUNCTIONS; + yield local_rule.checkTxLen(block); + yield local_rule.checkTxIssuers(block); + yield local_rule.checkTxSources(block); + yield local_rule.checkTxRecipients(block); + yield local_rule.checkTxAmounts(block); + yield local_rule.checkTxSignature(block); + done && done(); + } catch (err) { + if (done) return done(err); + throw err; + } + }); +} + +rules.HELPERS = { + + maxAcceleration: (conf) => maxAcceleration(conf), + + checkSingleMembershipSignature: checkSingleMembershipSignature, + + getSigResult: getSigResult, + + checkBunchOfTransactions: checkBunchOfTransactions, + + checkSingleTransactionLocally: (tx, done) => checkBunchOfTransactions([tx], done), + + checkTxAmountsValidity: (tx) => { + // Rule of money conservation + const commonBase = tx.inputs.concat(tx.outputs).reduce((min, input) => { + if (min === null) return input.base; + return Math.min(min, parseInt(input.base)); + }, null); + const inputSumCommonBase = tx.inputs.reduce((sum, input) => { + return sum + input.amount * Math.pow(10, input.base - commonBase); + }, 0); + const outputSumCommonBase = tx.outputs.reduce((sum, output) => { + return sum + output.amount * Math.pow(10, output.base - commonBase); + }, 0); + if (inputSumCommonBase !== outputSumCommonBase) { + throw constants.ERRORS.TX_INPUTS_OUTPUTS_NOT_EQUAL; + } + // Rule of unit base transformation + const maxOutputBase = tx.outputs.reduce((max, output) => { + return Math.max(max, parseInt(output.base)); + }, 0); + // Compute deltas + const deltas = {}; + for (let i = commonBase; i <= maxOutputBase; i++) { + const inputBaseSum = tx.inputs.reduce((sum, input) => { + if (input.base == i) { + return sum + input.amount * Math.pow(10, input.base - commonBase); + } else { + return sum; + } + }, 0); + const outputBaseSum = tx.outputs.reduce((sum, output) => { + if (output.base == i) { + return sum + output.amount * Math.pow(10, output.base - commonBase); + } else { + return sum; + } + }, 0); + const delta = outputBaseSum - inputBaseSum; + let sumUpToBase = 0; + for (let j = commonBase; j < i; j++) { + sumUpToBase -= deltas[j]; + } + if (delta > 0 && delta > sumUpToBase) { + throw constants.ERRORS.TX_OUTPUT_SUM_NOT_EQUALS_PREV_DELTAS; + } + deltas[i] = delta; + } + }, + + getMaxPossibleVersionNumber: (current) => co(function*() { + // Looking at current blockchain, find what is the next maximum version we can produce + + // 1. We follow previous block's version + let version = current ? current.version : constants.BLOCK_GENERATED_VERSION; + + // 2. If we can, we go to the next version + return version; + }) +}; + +module.exports = rules; diff --git a/app/modules/prover/lib/blockGenerator.js b/app/modules/prover/lib/blockGenerator.js index 4549c2249115379acc54238904a43586c3a80979..e0bf142f96f01f3574bbbd1016144594fe679b7c 100644 --- a/app/modules/prover/lib/blockGenerator.js +++ b/app/modules/prover/lib/blockGenerator.js @@ -4,6 +4,8 @@ const co = require('co'); const moment = require('moment'); const inquirer = require('inquirer'); const common = require('duniter-common'); +const indexer = require('../../../lib/indexer') +const rules = require('../../../lib/rules') const keyring = common.keyring; const hashf = common.hashf; @@ -14,8 +16,6 @@ const Transaction = common.document.Transaction; const Identity = common.document.Identity; const Certification = common.document.Certification; const constants = common.constants -const indexer = common.indexer -const rules = common.rules module.exports = (server, prover) => { return new BlockGenerator(server, prover); diff --git a/app/modules/prover/lib/proof.js b/app/modules/prover/lib/proof.js index 64d68645dcb8eac0518566f33c63c683e4c3e33c..146d3177e9a85fd04828f25ba45daa4c10579157 100644 --- a/app/modules/prover/lib/proof.js +++ b/app/modules/prover/lib/proof.js @@ -268,7 +268,7 @@ function getBlockTime (block, conf, forcedTime) { return forcedTime; } const now = moment.utc().unix(); - const maxAcceleration = require('duniter-common').rules.HELPERS.maxAcceleration(conf); + const maxAcceleration = require('../../../lib/rules').HELPERS.maxAcceleration(conf); const timeoffset = block.number >= conf.medianTimeBlocks ? 0 : conf.rootoffset || 0; const medianTime = block.medianTime; const upperBound = block.number === 0 ? medianTime : Math.min(medianTime + maxAcceleration, now - timeoffset); diff --git a/app/service/BlockchainService.js b/app/service/BlockchainService.js index d91a84b430eda5c6735e5f5733ca8f05c1238e2e..6e418b5bf380d85cc682e39e58b2474c8abec693 100644 --- a/app/service/BlockchainService.js +++ b/app/service/BlockchainService.js @@ -4,7 +4,7 @@ const _ = require('underscore'); const co = require('co'); const Q = require('q'); const parsers = require('duniter-common').parsers; -const rules = require('duniter-common').rules +const rules = require('../lib/rules') const constants = require('../lib/constants'); const blockchainCtx = require('../lib/computation/blockchainContext'); const Block = require('../lib/entity/block'); diff --git a/app/service/IdentityService.js b/app/service/IdentityService.js index d5e0aa6fb970c17fc41dc95a298c40e2b755ccf8..dcb7ffe08857e86ac63698f8216ac6bb30298452 100644 --- a/app/service/IdentityService.js +++ b/app/service/IdentityService.js @@ -1,6 +1,6 @@ "use strict"; const Q = require('q'); -const rules = require('duniter-common').rules +const rules = require('../lib/rules') const keyring = require('duniter-common').keyring; const constants = require('../lib/constants'); const Block = require('../../app/lib/entity/block'); diff --git a/app/service/MembershipService.js b/app/service/MembershipService.js index ec115bf1affcd4f62adada0c37d937c9a8ccc7dd..ffce63db7f12737741372bd7176612483f76871f 100644 --- a/app/service/MembershipService.js +++ b/app/service/MembershipService.js @@ -1,7 +1,7 @@ "use strict"; const co = require('co'); -const rules = require('duniter-common').rules +const rules = require('../lib/rules') const hashf = require('duniter-common').hashf; const constants = require('../lib/constants'); const Membership = require('../lib/entity/membership'); diff --git a/app/service/TransactionsService.js b/app/service/TransactionsService.js index d362c003f7284a1e90aa87ffbb8cf40297a90b9f..cd8db28f1a1616d865580d562ff67008d4772de3 100644 --- a/app/service/TransactionsService.js +++ b/app/service/TransactionsService.js @@ -3,7 +3,7 @@ const co = require('co'); const Q = require('q'); const constants = require('../lib/constants'); -const rules = require('duniter-common').rules +const rules = require('../lib/rules') const Transaction = require('../lib/entity/transaction'); const AbstractService = require('./AbstractService'); diff --git a/package.json b/package.json index 63387d7bb5026c81e8a91578e2fe3e3c1dd53434..afe21705c3284093e47cc00dfe9ba13ae4182310 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "colors": "1.1.2", "commander": "2.9.0", "daemonize2": "0.4.2", - "duniter-common": "^1.3.5", + "duniter-common": "1.4.x", "event-stream": "3.3.4", "heapdump": "^0.3.9", "inquirer": "3.0.6", diff --git a/test/dal/source_dal.js b/test/dal/source_dal.js index 7458cbfc0a4142aeff095311dadf9aeab2251778..f924031c101285444343054ce476af777c8d8e51 100644 --- a/test/dal/source_dal.js +++ b/test/dal/source_dal.js @@ -3,7 +3,7 @@ const co = require('co'); const should = require('should'); const FileDAL = require('../../app/lib/dal/fileDAL'); const dir = require('../../app/lib/system/directory'); -const indexer = require('duniter-common').indexer; +const indexer = require('../../app/lib/indexer'); const toolbox = require('../integration/tools/toolbox'); let dal; diff --git a/test/dal/triming.js b/test/dal/triming.js index f6091a019fca1c31c9950cc61f73e2248b97b437..92a7f2ed7af841cd14a4e849a4c3e15759e00343 100644 --- a/test/dal/triming.js +++ b/test/dal/triming.js @@ -3,7 +3,7 @@ const co = require('co'); const should = require('should'); const FileDAL = require('../../app/lib/dal/fileDAL'); const dir = require('../../app/lib/system/directory'); -const indexer = require('duniter-common').indexer; +const indexer = require('../../app/lib/indexer'); const toolbox = require('../integration/tools/toolbox'); let dal; diff --git a/test/data/blocks.js b/test/data/blocks.js new file mode 100644 index 0000000000000000000000000000000000000000..9500a38f7f5a1590a00cde7a914e941313ea54fc --- /dev/null +++ b/test/data/blocks.js @@ -0,0 +1,4100 @@ + +module.exports = { + WRONG_SIGNATURE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 50\n" + + "PoWMin: 1\n" + + "Time: 1411775999\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 2\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + VALID_ROOT: + "Version: 10\n" + + "Type: Block\n" + + "Currency: duniter_unit_test_currency\n" + + "Number: 0\n" + + "PoWMin: 0\n" + + "Time: 1483614905\n" + + "MedianTime: 1483614905\n" + + "UnitBase: 0\n" + + "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV\n" + + "IssuersFrame: 1\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 0\n" + + "Parameters: 0.007376575:3600:120:0:40:604800:31536000:1:604800:604800:0.9:31536000:3:20:960:10:0.6666666666666666:1483614905:1483614905:100\n" + + "MembersCount: 2\n" + + "Identities:\n" + + "DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV:1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tic\n" + + "DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo:lcekuS0eP2dpFL99imJcwvDAwx49diiDMkG8Lj7FLkC/6IJ0tgNjUzCIZgMGi7bL5tODRiWi9B49UMXb8b3MAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV:s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tic\n" + + "DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo:80pUx9YBk0RwqrVrQQA+PuxoNn21A8NwQ3824CQPU1ad9R1oDXc/pU6NVpQv92LM8gaWs/Pm1mLXNNVnr+m6BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo:DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV:0:vMaYgBSnU+83AYOVQCZAx1XLpg/F1MmMztDfCnZvl8hPs4LE9tcDvCrrFogAwMEW2N7Y0gCH62/fBMgw4KrGCA==\n" + + "DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV:DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo:0:RKIGMgYIhB9FmjPbmyo4egPufg/iTpBznYGZp5hjK1WZ1a9imQldLNUMe0eiPlSKJTK/JD3gOlCiynOEY2csBA==\n" + + "Transactions:\n" + + "InnerHash: 7A4E76A9A3410594AC9AED94B14AD9892426D76EDAF735CFE6C66432E422A63F\n" + + "Nonce: 300000000001\n" + + "WJourHkd6NnMxKDSEfrsiB7qE0mGbiFHSwy0cE8/q/is6hTd0mzlMNBPxDhoPkAiocfXJrQuIVeG0/ygxQrTBw==\n", + + WRONG_PROOF_OF_WORK: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 1\n" + + "PoWMin: 17\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 97E7DBF5D3AC27A4AFB797365304B7922917B6ADCDEFD736F20E38ADE982A47D\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + ROOT_WITHOUT_PARAMETERS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 0\n" + + "Time: 1411775999\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 1\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + NON_ROOT_WITH_PARAMETERS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 5\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "Parameters: 0.7376575:100:157680000:0:40:7200:31536000:1:1000:1000:0.9:31536000:3:1:60:10:0.67:1511776000:1511776000:1511776000\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + ROOT_WITH_PREVIOUS_HASH: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\n" + + "MembersCount: 0\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + ROOT_WITH_PREVIOUS_ISSUER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + NON_ROOT_WITHOUT_PREVIOUS_HASH: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 1\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + NON_ROOT_WITHOUT_PREVIOUS_ISSUER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 1\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 97E7DBF5D3AC27A4AFB797365304B7922917B6ADCDEFD736F20E38ADE982A47D\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + COLLIDING_UIDS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:NJE8nYU4Im+KQDRdoAn5gcfic+Gjjzp0Pp0iji/Fzh9JIThoQeUDDew4Q5vJBEg/Aw7gPnIg+11TbLkIGa/ODQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + COLLIDING_PUBKEYS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:NJE8nYU4Im+KQDRdoAn5gcfic+Gjjzp0Pp0iji/Fzh9JIThoQeUDDew4Q5vJBEg/Aw7gPnIg+11TbLkIGa/ODQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_DATE_LOWER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 50\n" + + "PoWMin: 1\n" + + "Time: 1411775999\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 2\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_DATE_HIGHER_BUT_TOO_FEW: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 10\n" + + "PoWMin: 1\n" + + "Time: 1411776059\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_DATE_HIGHER_BUT_TOO_HIGH: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 10\n" + + "PoWMin: 1\n" + + "Time: 1411785481\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 2\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_ROOT_TIMES: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776001\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + GOOD_DATE_HIGHER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 20\n" + + "PoWMin: 1\n" + + "Time: 1411776060\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_IDTY_MATCH_JOINS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + MULTIPLE_JOINERS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 1\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + MULTIPLE_ACTIVES: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 1\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + MULTIPLE_LEAVES: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + MULTIPLE_EXCLUDED: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "Certifications:\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + MULTIPLE_OVER_ALL: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "Certifications:\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + MULTIPLE_CERTIFICATIONS_FROM_SAME_ISSUER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 2\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + IDENTICAL_CERTIFICATIONS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + LEAVER_WITH_CERTIFICATIONS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:I9kYCknNTp9zYS4CflAMk4Xh1yQIaP1H3PgPHJeQZQNkBavyqddXsq5DUzscsi2kRttJw6C/MATSD8KyZYPNAg==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + EXCLUDED_WITH_CERTIFICATIONS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONGLY_SIGNED_IDENTITIES: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:Die9lYNW1u/w50AfuaXwb4MJc3aKA3WfJwiy531TqHIGC+VNnRKjMmrwMptN+a+dL6INjLrhMrPqoK60IkTlDQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONGLY_SIGNED_JOIN: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV3Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONGLY_SIGNED_ACTIVE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV3Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONGLY_SIGNED_LEAVE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:I9kYCknNTp9zYS4CflAMk4Xh1yQIaP1H3PgPHJeQZQNkBavyqddXsq5DUzscsi2kRttJw6C/MATSD8KyZYPNAg==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + CORRECTLY_SIGNED_LEAVE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:I9kYCknNTp9zYS4CflAMk4Xh1yQIaP1H3PgPHJeQZQNkBavyqddXsq5DUzscsi2kRttJw6C/MATSD8KyZYPNAg==:1411850496\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONGLY_SIGNED_CERTIFICATION: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 29890\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:vTvKYvjTYUT30t/9h7uNE/2LFJiYuA4YleIetFkb62XxDoxGizKC9VvVs7WRNArcfHvJ+RLyOoawQzpmw2DyCw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + UNKNOWN_CERTIFIER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:vTvKYvjTYUT30t/9h7uNE/2LFJiYuA4YleIetFkb62XxDoxGizKC9VvVs7WRNArcfHvJ+RLyOoawQzpmw2DyCw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + UNKNOWN_CERTIFIED: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:1411844654:vTvKYvjTYUT30t/9h7uNE/2LFJiYuA4YleIetFkb62XxDoxGizKC9VvVs7WRNArcfHvJ+RLyOoawQzpmw2DyCw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + EXISTING_UID: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:Die9lYNW1u/w50AfuaXwb4MJc3aKA3WfJwiy+31TqHIGC+VNnRKjMmrwMptN+a+dL6INjLrhMrPqoK60IkTlDQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:EXISTING\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + EXISTING_PUBKEY: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH:Die9lYNW1u/w50AfuaXwb4MJc3aKA3WfJwiy+31TqHIGC+VNnRKjMmrwMptN+a+dL6INjLrhMrPqoK60IkTlDQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TOO_EARLY_CERTIFICATION_REPLAY: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:Die9lYNW1u/w50AfuaXwb4MJc3aKA3WfJwiy+31TqHIGC+VNnRKjMmrwMptN+a+dL6INjLrhMrPqoK60IkTlDQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:1411844654:vTvKYvjTYUT30t/9h7uNE/2LFJiYuA4YleIetFkb62XxDoxGizKC9VvVs7WRNArcfHvJ+RLyOoawQzpmw2DyCw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:1411844658:2KmmmIL8eK/TACjOqTqO5ZG/tgMYWWV8zRICWFQJuqWyYVg/y5wzXyHrgfpdMYhwYMRBhwbMk1sPNLo/kzp0AA==\n" + + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:DU4JlHxJtIb2Z7Ag4Jy+z0qjNNo5jzN5EvTUWOTRRzeb6LbOClw2X+pmb0mV/wpVKd/lJrUHAWeKMDHG4MukCA==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:kr2JA6wCGfbNKGpyM86BscsFk22aA9oiAon8mWRPl4G8UpJKZs3tjuPRAw5+04KLCRWl/TT1TumDCkeEjev7DA==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + EXPIRED_CERTIFICATIONS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 90\n" + + "PoWMin: 1\n" + + "Time: 1443333600\n" + + "MedianTime: 1443333600\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "Joiners:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:70:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + EXPIRED_MEMBERSHIP: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 90\n" + + "PoWMin: 1\n" + + "Time: 1443333600\n" + + "MedianTime: 1443333600\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "Joiners:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:70-5918CE7F40186F8E0BD8F239986A723FCC329927B999885B32DAAE40EA8BEDB6:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + REVOKED_JOINER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 113\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 52DC8A585C5D89571C511BB83F7E7D3382F0041452064B1272E65F0B42B82D57\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + NOT_ENOUGH_CERTIFICATIONS_JOINER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 3\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 52DC8A585C5D89571C511BB83F7E7D3382F0041452064B1272E65F0B42B82D57\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + NOT_ENOUGH_CERTIFICATIONS_JOINER_BLOCK_0: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + OUTDISTANCED_JOINER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 3\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 52DC8A585C5D89571C511BB83F7E7D3382F0041452064B1272E65F0B42B82D57\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-0C1C080CA81F6D763C6C42B7D043DF40DDABC2E27D47E0FE27DEF0E65D795280:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + VALID_NEXT: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 3\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 52DC8A585C5D89571C511BB83F7E7D3382F0041452064B1272E65F0B42B82D57\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 5\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_PREVIOUS_HASH: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 97E7DBF5D3AC27A4AFB797365304B7922917B6ADCDEFD736F20E38ADE982A47D\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_PREVIOUS_ISSUER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_DIFFERENT_ISSUERS_COUNT_FOLLOWING_V2: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 2\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_DIFFERENT_ISSUERS_COUNT_FOLLOWING_V3: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 2\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_ISSUERS_FRAME_FOLLOWING_V2: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 2\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 101\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_ISSUERS_FRAME_FOLLOWING_V3: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 2\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 101\n" + + "IssuersFrameVar: 11\n" + + "DifferentIssuersCount: 4\n" + + "PreviousHash: 4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_ISSUER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_JOIN_BLOCK_TARGET_ROOT: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:44-9F118AC87B062F23F193761E081082BB661547CF9A0C243CD3994E99C78A74C3:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_JOIN_ROOT_NUMBER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:44-9F118AC87B062F23F193761E081082BB661547CF9A0C243CD3994E99C78A74C3:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_JOIN_ROOT_HASH: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-9F118AC87B062F23F193761E081082BB661547CF9A0C243CD3994E99C78A74C3:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_JOIN_NUMBER_TOO_LOW: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 12\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:2-65DDE908DC06D42EC8AAAE4AB716C299ECD4891740349BCF50EF3D70C947CBE0:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_JOIN_BLOCK_TARGET: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:44-9F118AC87B062F23F193761E081082BB661547CF9A0C243CD3994E99C78A74C3:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_JOIN_ALREADY_MEMBER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:3-65DDE908DC06D42EC8AAAE4AB716C299ECD4891740349BCF50EF3D70C947CBE0:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_ACTIVE_BLOCK_TARGET: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 51\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8\n" + + "PreviousIssuer: G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:44-9F118AC87B062F23F193761E081082BB661547CF9A0C243CD3994E99C78A74C3:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + KICKED_NOT_EXCLUDED: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 4\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 1\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + KICKED_EXCLUDED: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 4\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 1\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_MEMBERS_COUNT: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 4\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + NO_LEADING_ZERO: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 3\n" + + "PoWMin: 8\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 52DC8A585C5D89571C511BB83F7E7D3382F0041452064B1272E65F0B42B82D57\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 10\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + REQUIRES_4_LEADING_ZEROS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 60\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + REQUIRES_7_LEADING_ZEROS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 61\n" + + "PoWMin: 6\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 11\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + REQUIRES_6_LEADING_ZEROS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 67\n" + + "PoWMin: 8\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 4\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + REQUIRES_5_LEADING_ZEROS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 63\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + REQUIRES_7_LEADING_ZEROS_AGAIN: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 64\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + FIRST_BLOCK_OF_NEWCOMER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 65\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 2\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + SECOND_BLOCK_OF_NEWCOMER: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 66\n" + + "PoWMin: 160\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: AbCCJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 10\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_ROOT_DATES: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776002\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_MEDIAN_TIME_ODD: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 101\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_MEDIAN_TIME_EVEN: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 102\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + GOOD_MEDIAN_TIME_ODD: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 103\n" + + "PoWMin: 1\n" + + "Time: 161\n" + + "MedianTime: 161\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + GOOD_MEDIAN_TIME_EVEN: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 104\n" + + "PoWMin: 1\n" + + "Time: 162\n" + + "MedianTime: 162\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + WRONG_CONFIRMED_DATE_MUST_CONFIRM: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 72\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + ROOT_BLOCK_WITH_UD: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:s9DSBEAIbLi1HjBvXaHySApHo0HBkE9Ibxm10k/zUvmP49+FLg1IbXGj0JK6Y5SsywTcPWyQXseqXGSeGiIjAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:Te6R+OlWveuHKkegVDpg2hyse2ojBRfCAdCjMwtqMZx662qdgbMD9+xdZTXIjLRMtdsQ973EEZtwMc3hJkcdBw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + UD_BLOCK_WIHTOUT_UD: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 80\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + UD_BLOCK_WIHTOUT_BASE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 80\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + V3_ROOT_BLOCK_NOBASE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + V3_ROOT_BLOCK_POSITIVE_BASE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 1\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 101\n" + + "IssuersFrameVar: 11\n" + + "DifferentIssuersCount: 4\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_WRONG_UD: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 81\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_WRONG_UD_V3: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 81\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UniversalDividend: 100\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 101\n" + + "IssuersFrameVar: 11\n" + + "DifferentIssuersCount: 4\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_WRONG_UNIT_BASE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 160\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411778000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 1\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_WRONG_UNIT_BASE_NO_UD: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 160\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 8\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 101\n" + + "IssuersFrameVar: 11\n" + + "DifferentIssuersCount: 4\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_UNLEGITIMATE_UD: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 82\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_UNLEGITIMATE_UD_2: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + FIRST_UD_BLOCK_WITH_UD_THAT_SHOULDNT: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 20\n" + + "PoWMin: 1\n" + + "Time: 1411773099\n" + + "MedianTime: 1411773099\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + FIRST_UD_BLOCK_WITH_UD_THAT_SHOULD: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 20\n" + + "PoWMin: 1\n" + + "Time: 1411773100\n" + + "MedianTime: 1411773100\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITHOUT_TRANSACTIONS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_GOOD_TRANSACTIONS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:1:3:6:6:3:0:0\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "CYYjHsNyg3HMRMpTHqCJAN9McjH5BwFLmDKGV3PmCuKp\n" + + "9WYHTavL1pmhunFCzUwiiq4pXwvgGG5ysjZnjz9H8yB\n" + + "T:6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3:4\n" + + "T:3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435:10\n" + + "D:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:46\n" + + "T:A0D9B4CDC113ECE1145C5525873821398890AE842F4B318BD076095A23E70956:66\n" + + "T:67F2045B5318777CC52CD38B424F3E40DDA823FA0364625F124BABE0030E7B5B:176\n" + + "D:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:46\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "2:SIG(0)\n" + + "3:SIG(0)\n" + + "4:SIG(0)\n" + + "5:SIG(0)\n" + + "30:4:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "156:4:SIG(DSz4rgncXCytsUMW2JU2yhLquZECD2XpEkpP9gG5HyAx)\n" + + "49:4:SIG(6DyGr5LFtFmbaJYRvcs9WmBsr4cbJbJ1EV9zBbqG7A6i)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX\n" + + "2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_WRONG_TRANSACTION_SUMS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:1:3:6:6:3:0:0\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "CYYjHsNyg3HMRMpTHqCJAN9McjH5BwFLmDKGV3PmCuKp\n" + + "9WYHTavL1pmhunFCzUwiiq4pXwvgGG5ysjZnjz9H8yB\n" + + "T:6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3:4\n" + + "T:3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435:10\n" + + "D:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:46\n" + + "T:A0D9B4CDC113ECE1145C5525873821398890AE842F4B318BD076095A23E70956:66\n" + + "T:67F2045B5318777CC52CD38B424F3E40DDA823FA0364625F124BABE0030E7B5B:176\n" + + "D:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:46\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "2:SIG(0)\n" + + "3:SIG(0)\n" + + "4:SIG(0)\n" + + "5:SIG(0)\n" + + "30:4:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "156:4:SIG(DSz4rgncXCytsUMW2JU2yhLquZECD2XpEkpP9gG5HyAx)\n" + + "50:4:SIG(6DyGr5LFtFmbaJYRvcs9WmBsr4cbJbJ1EV9zBbqG7A6i)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX\n" + + "2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_WRONG_TRANSACTION_UNIT_BASES: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:1:3:6:6:3:0:0\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "CYYjHsNyg3HMRMpTHqCJAN9McjH5BwFLmDKGV3PmCuKp\n" + + "9WYHTavL1pmhunFCzUwiiq4pXwvgGG5ysjZnjz9H8yB\n" + + "T:6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3:4\n" + + "T:3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435:10\n" + + "D:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:46\n" + + "T:A0D9B4CDC113ECE1145C5525873821398890AE842F4B318BD076095A23E70956:66\n" + + "T:67F2045B5318777CC52CD38B424F3E40DDA823FA0364625F124BABE0030E7B5B:176\n" + + "D:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:46\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "2:SIG(0)\n" + + "3:SIG(0)\n" + + "4:SIG(0)\n" + + "5:SIG(0)\n" + + "30:4:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "156:3:SIG(DSz4rgncXCytsUMW2JU2yhLquZECD2XpEkpP9gG5HyAx)\n" + + "49:4:SIG(6DyGr5LFtFmbaJYRvcs9WmBsr4cbJbJ1EV9zBbqG7A6i)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX\n" + + "2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_WRONG_UD_SOURCE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:1:1:1:1:0\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "D:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:33\n" + + "40:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_WRONG_TX_SOURCE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:1:1:1:1:0\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "T:A0D9B4CDC113ECE1145C5525873821398890AE842F4B318BD076095A23E70956:44\n" + + "40:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_UNAVAILABLE_UD_SOURCE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:1:1:1:1:1:0:0\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "D:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:55\n" + + "0:SIG(0)\n" + + "40:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_UNAVAILABLE_TX_SOURCE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:1:1:1:1:1:0:0\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "40:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_WITHOUT_ISSUERS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:0:2:2:1:0:0\n" + + "3-2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "4500:3:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "4500:3:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "40:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_WITHOUT_SOURCES: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:2:0:0:1:0:0\n" + + "3-2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "40:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "I6gJkJIQJ9vwDRXZ6kdBsOArQ3zzMYPmFxDbJqseBVq5NWlmJ7l7oY9iWtqhPF38rp7/iitbgyftsRR8djOGDg==\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_WITHOUT_RECIPIENT: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:2:2:2:0:0:0\n" + + "3-2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "300:3:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "300:3:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "I6gJkJIQJ9vwDRXZ6kdBsOArQ3zzMYPmFxDbJqseBVq5NWlmJ7l7oY9iWtqhPF38rp7/iitbgyftsRR8djOGDg==\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_WITH_DUPLICATED_SOURCE_SINGLE_TX: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:2:3:3:1:0:0\n" + + "3-2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "400:5:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "200:4:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "200:4:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "2:SIG(0)\n" + + "120:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "I6gJkJIQJ9vwDRXZ6kdBsOArQ3zzMYPmFxDbJqseBVq5NWlmJ7l7oY9iWtqhPF38rp7/iitbgyftsRR8djOGDg==\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_WITH_EMPTY_TX_CONDITIONS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:2:2:2:2:0:0\n" + + "3-2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "200:1:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "200:1:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "40:0:()\n" + + "40:0: \n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "I6gJkJIQJ9vwDRXZ6kdBsOArQ3zzMYPmFxDbJqseBVq5NWlmJ7l7oY9iWtqhPF38rp7/iitbgyftsRR8djOGDg==\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_WRONG_TOTAL: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 101\n" + + "IssuersFrameVar: 11\n" + + "DifferentIssuersCount: 4\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:2:2:2:2:0:0\n" + + "5-2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "2:2:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "1:2:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "40:2:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "70:2:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "I6gJkJIQJ9vwDRXZ6kdBsOArQ3zzMYPmFxDbJqseBVq5NWlmJ7l7oY9iWtqhPF38rp7/iitbgyftsRR8djOGDg==\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_V3_GOOD_AMOUNTS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 101\n" + + "IssuersFrameVar: 11\n" + + "DifferentIssuersCount: 4\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:1:3:3:17:1:0\n" + + "33089-00004C8D3A7EAA34ADD20E36268F7A141A45B8D47C0872EFDB00187810E0BBFD\n" + + "TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS\n" + + "17602605:0:T:E4E8486E20D521AAB329376431BD633A59FE847EF533C38CDD2C9F6E820FF786:14\n" + + "800:1:T:E9BDCC49762D17757B1AA8C52744CD182DF3FFC8EA9B237267A1B3B33ABE089B:0\n" + + "1897916:1:T:04A9E034116E436E581C01B9B58150A38615C06D12AE434614D5A08F6B409B1C:0\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "2:SIG(0)\n" + + "5:0:SIG(TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS)\n" + + "6:1:SIG(TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS)\n" + + "7:2:SIG(TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS)\n" + + "60:3:SIG(DesHja7gonANRJB7YUkfCgQpnDjgGeDXAeArdhcbXPmJ)\n" + + "170:3:SIG(HGYV5C16mrdvE9vpb1S9nMDHkVPsubBgANs9pSb6HWCV)\n" + + "210:3:SIG(HxWwfnVXpfec957STN97q6cMSzefkbXdApRTwVuUFUyc)\n" + + "110:3:SIG(9bZEATXBGPUSsk8oAYi4KAChg3rHKwNt67hVdErbNGCW)\n" + + "200:3:SIG(8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU)\n" + + "100:3:SIG(2eijdARyo6FuTVX6kZPbVziRB8wq87sGXpCth9eaUNX4)\n" + + "160:3:SIG(HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk)\n" + + "90:3:SIG(8KTEFQS78HwEz1NK627rNsYwENxNXJyvtyMAyfKPXZRB)\n" + + "180:3:SIG(XeBpJwRLkF5J4mnwyEDriEcNB13iFpe1MAKR4mH3fzN)\n" + + "130:3:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of)\n" + + "130:3:SIG(4eDissnRvTq7JSgbmnL62ogQcrCLzw2zdrxA4q1yuczs)\n" + + "100:3:SIG(2pyPsXM8UCB88jP2NRM4rUHxb63qm89JMEWbpoRrhyDK)\n" + + "40:3:SIG(6KXBjAFceD1gp8RBVZfy5YQyKFXG8GaX8tKaLAyPWHrj)\n" + + "34909:3:SIG(TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS)\n" + + "REMU:22684:22851\n" + + "Iu9NripkuUAeYhhUyeiW9PSTkYFu4kM8ZEtFUgfh44qsuF5PaM38zy3/IszWtJ1i6HGQsbrxDiOVem6Gu+tyDA==\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_TOO_LONG: + "Version: 10\n" + + "Type: Block\n" + + "Currency: test_net\n" + + "Number: 33520\n" + + "PoWMin: 77\n" + + "Time: 1472124036\n" + + "MedianTime: 1472124036\n" + + "UnitBase: 3\n" + + "Issuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n" + + "IssuersFrame: 52\n" + + "IssuersFrameVar: -2\n" + + "DifferentIssuersCount: 9\n" + + "PreviousHash: 00001E78E26DD813024EEFBC8F5C50BBA8B30DD1DB5C4F492D9606EE12C06BB4\n" + + "PreviousIssuer: 5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of\n" + + "MembersCount: 128\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:1:48:48:2:0:0\n" + + "33518-00001D9E2EA1F967667528817FAF17ECBACE6150EBB875A2196B4457C0366D2A\n" + + "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n" + + "60:3:T:2A74F44780925586EA4C01BEE9DA5042FE8BDB0FB0506B9D69990750B555AC91:15\n" + + "1829442:3:T:FAC74B122B951F99C28B75587CFE002DC8340B053281050747D480E1F9E9193D:1\n" + + "1000:3:T:0C4C6D1321698DA41084A84C1DCD34769EB1C744933885CA3BF4A73BACB5C348:7\n" + + "1500:3:T:060BDC4B0E1D9BB01BF91F5082700C51BBDB9BDA1051BD13F6DCF1F6C5064664:8\n" + + "6000:3:T:B514D9CAF277F4DBE98B8ECC61014DB1609BA924903A884ABF969FFBB1E1C3F6:8\n" + + "4500:3:T:B4A735DE1C5860C3B02AD68420BC5949B26B905F83C2E6E1F88D7D4490350C6F:8\n" + + "4500:3:T:A2407DBDA4F687DB4B6CE5020EB64DD8F6CA71D761FB80F0D379B9E574CF134E:5\n" + + "5750:3:T:120AA878EEB49D33C64C87661BADBE154B5ECAAC05502C478AC79F4E465E4EBC:3\n" + + "16805:3:T:0562B378C254D538E4B73B928AD25CD3EACE2C2C8D662D1D48AF4B7860620B4D:0\n" + + "7250:3:T:C0D99A2E3271606CB99384DD881CF2DE5F36180728464A4B88B33A0AFDDCA587:9\n" + + "9750:3:T:180E64F8C76416455B4B34029F05E3C87D1F0E65AF7128358F7A6D874AFAA492:6\n" + + "14000:3:T:CFBA4FB960BBDB9DD56BEE0ABCF68C04F71A51910F148FC219A72D2DD5F24F58:3\n" + + "6750:3:T:570BD788DE59A5A99564026FAAEF7F2F1A398E858FE745D3A0ABE7C71040A6A3:4\n" + + "6250:3:T:6ABBA329813201CBA66D0A8A682BE7986F1F80918FF2A5809B864EA0E134ABA4:3\n" + + "7500:3:T:3B34FC6AD7543CE3671E6E302576A92A6B97BE1C15DEA1DBAB2D327A2911306B:3\n" + + "5000:3:T:443B53D39DC3551CB3E49A1AE856E115F0571C154C432094D472D1C70BA368A8:8\n" + + "6750:3:T:BDA9E8104D8458C65628A647086A3331C724E895E0EF24B9BB3B6144B27AC554:5\n" + + "8250:3:T:A67E6D09AD60339255297A05ECA04E3E20AB290AB9CA1A5DE787BD67FE64F544:4\n" + + "7250:3:T:DD2C145C4F2940EC1FAF1CAC830A52F01F0AA0A3AB9D88DD075BFEAEEBDAC27A:3\n" + + "6000:3:T:2B1B033D6E56C67C251C24F11941BAE1D3CBE7B71FB9E910018461CD9E4C6C65:6\n" + + "5500:3:T:75B5FC3419CEC4553FEBED80437CC8816041757932DC9803FF061E77B77A86F6:8\n" + + "8000:3:T:1DBC2228962C9154AD37993F67F497FC51B38768A4DCCD8872B8DF9B8AB7A5D8:7\n" + + "5750:3:T:D3E329ED2003A86876EBAC64F8727459D9F9478A5E4D614BA439786D49CFE51E:5\n" + + "7250:3:T:956457195A5C5700CF8F7A89597F90A5A60F3124E3F4ED9D6D4D58DB1B7E8C3B:6\n" + + "6000:3:T:EA45AFC115379BF663DA6BB517409ACC3D45E66291FF7D1767CA1030334A124B:5\n" + + "4750:3:T:A7664F399173A3EC98519DC5F1428416ED962FFEF7AA44075F0AAAA64A6E5880:5\n" + + "5750:3:T:D25272F1D778B52798B7A51CF0CE21F7C5812F841374508F4367872D4A47F0F7:3\n" + + "4750:3:T:1556A77A6A1019484770F5AE2905EA58A7D9B434552B85772AE6EF1C96C138C6:7\n" + + "4000:3:T:C9E4360176A5908DFB1F550D8295FC74DA062851ED087FE3F24275BC9E7D1E82:8\n" + + "4000:3:T:C519A4D03F4725EF97B2D9EB88D13C3AAB4F1F0F30B84D6D8B4E8849506BAF4D:8\n" + + "4500:3:T:D4B87D5FF3A517C622C75662F0D2746CD94AAC6365FAA3D41670B0320FA7F89E:5\n" + + "5500:3:T:5918DE9FB72A329F20684F12E69BC3FE01CEE638A9FA7E3080F5FA025FA8F480:4\n" + + "5250:3:T:DC32942E881ED8221CAD5A4DD55C2CB672F827407773064B4E8D8E8327CBC578:3\n" + + "6250:3:T:9E01B679E2B9BD4E06FA8787EDBEEB77EA99E73CD90CCD5011D24DE68BFFBD08:3\n" + + "5250:3:T:FDF089AA99BA44E0A2C66F6389DD4BBDB2200DF07C993146305353A9BD290ADC:4\n" + + "6250:3:T:392409C3FBC2F72C23841089A7A4258F2915D4B09C963EC309F49072DD686E89:4\n" + + "6000:3:T:F3DC72E0BC3FE36F0C4055831D66ED13FA90875335D12648B8ABA777B0966EB1:4\n" + + "5250:3:T:ADB9EC0BE8B20D33DAC2EADDE29C67F3931F23A3856855F42704C72360619027:6\n" + + "5000:3:T:6D7C4808CD9D8158DBDD69FEED6C29E6743E8ED075FD1C8D1BDEC2456C63A910:9\n" + + "6000:3:T:49500A1D9CAB37244C33F8EACFF449907790BC32D7323D748373B1D8F02C2FBC:3\n" + + "10500:3:T:F4651339A9C1D29A78F06F30FD05819F4F9DF5C599867D4278170DDB9A22AA4E:6\n" + + "8000:3:T:999C1E9631F1F5DB1EF5DBB7933C97A3D215FC7D12538C353D9740DF2A49D61E:4\n" + + "6500:3:T:B7B629039D1B87D478C3008AB743F71FE69F40E373A8279A6BDD06460BC88803:6\n" + + "5500:3:T:F51FC58E86630A00C8CE9E6EE633B6DAB2AB824C818F6A89DE2ABDFE82B2B07F:6\n" + + "6500:3:T:0C8A317ED208529660DDA43B1688489C7EE6EE5470BC6EA24C683180D55B9B64:6\n" + + "7500:3:T:DA6F7ABDE903366FD1BB92A025459F0D3A1C39D40D9AAF9DEA1015AAEBB112D3:5\n" + + "5250:3:T:7197A1785D81F4AA3C179E86E2D4DA32D36999B49E8BCDAACE38B5B100AECAB8:6\n" + + "2305438:3:T:0FC57133A2CA3A1413E2FC2606F5004A9A6F107DC6E72A3348B5C7A8039ED852:1\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "2:SIG(0)\n" + + "3:SIG(0)\n" + + "4:SIG(0)\n" + + "5:SIG(0)\n" + + "6:SIG(0)\n" + + "7:SIG(0)\n" + + "8:SIG(0)\n" + + "9:SIG(0)\n" + + "10:SIG(0)\n" + + "11:SIG(0)\n" + + "12:SIG(0)\n" + + "13:SIG(0)\n" + + "14:SIG(0)\n" + + "15:SIG(0)\n" + + "16:SIG(0)\n" + + "17:SIG(0)\n" + + "18:SIG(0)\n" + + "19:SIG(0)\n" + + "20:SIG(0)\n" + + "21:SIG(0)\n" + + "22:SIG(0)\n" + + "23:SIG(0)\n" + + "24:SIG(0)\n" + + "25:SIG(0)\n" + + "26:SIG(0)\n" + + "27:SIG(0)\n" + + "28:SIG(0)\n" + + "29:SIG(0)\n" + + "30:SIG(0)\n" + + "31:SIG(0)\n" + + "32:SIG(0)\n" + + "33:SIG(0)\n" + + "34:SIG(0)\n" + + "35:SIG(0)\n" + + "36:SIG(0)\n" + + "37:SIG(0)\n" + + "38:SIG(0)\n" + + "39:SIG(0)\n" + + "40:SIG(0)\n" + + "41:SIG(0)\n" + + "42:SIG(0)\n" + + "43:SIG(0)\n" + + "44:SIG(0)\n" + + "45:SIG(0)\n" + + "46:SIG(0)\n" + + "47:SIG(0)\n" + + "2706:3:SIG(TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS)\n" + + "4417789:3:SIG(HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk)\n" + + "ue7NjWPfPXxPNqvlGgr/K4jZjyHlUdYVl6dq+RXJ5RMuu8xBoo6bKhTKOyz/vXZz2clnwV/FqPDdDsWImxCmAg==\n" + + "InnerHash: 1C9EF3BCCBB14DA060F172855D18F7D979FBA752E55BB288E253806E4980E5AC\n" + + "Nonce: 0\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + OUTPUT_TOO_LONG: + "Version: 10\n" + + "Type: Block\n" + + "Currency: test_net\n" + + "Number: 33520\n" + + "PoWMin: 77\n" + + "Time: 1472124036\n" + + "MedianTime: 1472124036\n" + + "UnitBase: 3\n" + + "Issuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n" + + "IssuersFrame: 52\n" + + "IssuersFrameVar: -2\n" + + "DifferentIssuersCount: 9\n" + + "PreviousHash: 00001E78E26DD813024EEFBC8F5C50BBA8B30DD1DB5C4F492D9606EE12C06BB4\n" + + "PreviousIssuer: 5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of\n" + + "MembersCount: 128\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:1:1:1:1:0:0\n" + + "33518-00001D9E2EA1F967667528817FAF17ECBACE6150EBB875A2196B4457C0366D2A\n" + + "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n" + + "60:3:T:2A74F44780925586EA4C01BEE9DA5042FE8BDB0FB0506B9D69990750B555AC91:15\n" + + "0:SIG(0)\n" + + "60:3:(SIG(EA7Dsw39ShZg4SpURsrgMaMqrweJPUFPYHwZA8e92e3D) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4)|| XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4) || XHX(03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4))\n" + + "ue7NjWPfPXxPNqvlGgr/K4jZjyHlUdYVl6dq+RXJ5RMuu8xBoo6bKhTKOyz/vXZz2clnwV/FqPDdDsWImxCmAg==\n" + + "InnerHash: 1C9EF3BCCBB14DA060F172855D18F7D979FBA752E55BB288E253806E4980E5AC\n" + + "Nonce: 0\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + UNLOCK_TOO_LONG: + "Version: 10\n" + + "Type: Block\n" + + "Currency: test_net\n" + + "Number: 33520\n" + + "PoWMin: 77\n" + + "Time: 1472124036\n" + + "MedianTime: 1472124036\n" + + "UnitBase: 3\n" + + "Issuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n" + + "IssuersFrame: 52\n" + + "IssuersFrameVar: -2\n" + + "DifferentIssuersCount: 9\n" + + "PreviousHash: 00001E78E26DD813024EEFBC8F5C50BBA8B30DD1DB5C4F492D9606EE12C06BB4\n" + + "PreviousIssuer: 5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of\n" + + "MembersCount: 128\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:1:1:1:1:0:0\n" + + "33518-00001D9E2EA1F967667528817FAF17ECBACE6150EBB875A2196B4457C0366D2A\n" + + "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n" + + "60:3:T:2A74F44780925586EA4C01BEE9DA5042FE8BDB0FB0506B9D69990750B555AC91:15\n" + + "0:SIG(0) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789) XHX(123456789)\n" + + "60:3:SIG(EA7Dsw39ShZg4SpURsrgMaMqrweJPUFPYHwZA8e92e3D)\n" + + "ue7NjWPfPXxPNqvlGgr/K4jZjyHlUdYVl6dq+RXJ5RMuu8xBoo6bKhTKOyz/vXZz2clnwV/FqPDdDsWImxCmAg==\n" + + "InnerHash: 1C9EF3BCCBB14DA060F172855D18F7D979FBA752E55BB288E253806E4980E5AC\n" + + "Nonce: 0\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_WRONG_TRANSFORM: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 101\n" + + "IssuersFrameVar: 11\n" + + "DifferentIssuersCount: 4\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:2:3:3:3:0:0\n" + + "5-2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "1000:1:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "200:2:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "30:3:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "2:SIG(0)\n" + + "900:1:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "220:2:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "29:3:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "I6gJkJIQJ9vwDRXZ6kdBsOArQ3zzMYPmFxDbJqseBVq5NWlmJ7l7oY9iWtqhPF38rp7/iitbgyftsRR8djOGDg==\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_WRONG_TRANSFORM_LOW_BASE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 101\n" + + "IssuersFrameVar: 11\n" + + "DifferentIssuersCount: 4\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:1:6:6:8:1:0\n" + + "33753-0000054FC8AC7B450BA7D8BA7ED873FEDD5BF1E98D5D3B0DEE38DED55CB80CB3\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "150605:3:T:01B1AB40E7C1021712FF40D5605037C0ACEECA547BF519ABDCB6473A9F6BDF45:1\n" + + "297705:3:D:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:33530\n" + + "2244725:3:T:507CBE120DB654645B55431A9967789ACB7CD260EA962B839F1708834D1E5491:0\n" + + "972091:2:D:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:30324\n" + + "3808457:2:T:657229C5433FB9FFE64BF2E795E79DA796E0B1AF536DC740ECC26CCBBE104C33:1\n" + + "4:2:T:507CBE120DB654645B55431A9967789ACB7CD260EA962B839F1708834D1E5491:1\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "2:SIG(0)\n" + + "3:SIG(0)\n" + + "4:SIG(0)\n" + + "5:SIG(0)\n" + + "3171064:3:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of)\n" + + "3:2:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of)\n" + + "4:1:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of)\n" + + "8:0:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of)\n" + + "25:3:SIG(G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU)\n" + + "8:2:SIG(G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU)\n" + + "5:1:SIG(G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU)\n" + + "2:0:SIG(G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU)\n" + + "all 10.6517\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_TX_V3_TOO_HIGH_OUTPUT_BASE: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 101\n" + + "IssuersFrameVar: 11\n" + + "DifferentIssuersCount: 4\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:1:1:1:1:0:0\n" + + "5-2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "10:3:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "1:4:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "I6gJkJIQJ9vwDRXZ6kdBsOArQ3zzMYPmFxDbJqseBVq5NWlmJ7l7oY9iWtqhPF38rp7/iitbgyftsRR8djOGDg==\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_WITH_DUPLICATED_SOURCE_MULTIPLE_TX: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:2:2:2:1:0:0\n" + + "3-2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "200:1:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "100:1:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "80:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "I6gJkJIQJ9vwDRXZ6kdBsOArQ3zzMYPmFxDbJqseBVq5NWlmJ7l7oY9iWtqhPF38rp7/iitbgyftsRR8djOGDg==\n" + + "TX:10:1:1:1:1:0:0\n" + + "3-2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "200:1:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "40:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + TRANSACTION_WITH_WRONG_SIGNATURES: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 83\n" + + "PoWMin: 1\n" + + "Time: 1411777000\n" + + "MedianTime: 1411777000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:2:2:2:1:0:0\n" + + "3-2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "600:5:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "600:5:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "80:0:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "I6gJkJIQJ9vwDRXZ6kdBsOArQ3zzMYPmFxDbJqseBVq5NWlmJ7l7oY9iWtqhPF38rp7/iitbgyftsRR8djOGDg==\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + CERT_BASED_ON_NON_ZERO_FOR_ROOT: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:1:vTvKYvjTYUT30t/9h7uNE/2LFJiYuA4YleIetFkb62XxDoxGizKC9VvVs7WRNArcfHvJ+RLyOoawQzpmw2DyCw==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + CERT_BASED_ON_NON_EXISTING_BLOCK: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 1\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:CCCCJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:111:vTvKYvjTYUT30t/9h7uNE/2LFJiYuA4YleIetFkb62XxDoxGizKC9VvVs7WRNArcfHvJ+RLyOoawQzpmw2DyCw==\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + REVOKED_WITH_MEMBERSHIPS: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + REVOKED_WITH_DUPLICATES: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==\n" + + "Excluded:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + REVOKED_NOT_IN_EXCLUDED: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_UNKNOWN_REVOKED: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "HATTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==\n" + + "Excluded:\n" + + "HATTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_YET_REVOKED: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "BBTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==\n" + + "Excluded:\n" + + "BBTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n", + + BLOCK_WITH_WRONG_REVOCATION_SIG: + "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 0\n" + + "PoWMin: 1\n" + + "Time: 1411776000\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 0\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "CCTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==\n" + + "Excluded:\n" + + "CCTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "Certifications:\n" + + "Transactions:\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n" +}; diff --git a/test/fast/block_format.js b/test/fast/block_format.js new file mode 100644 index 0000000000000000000000000000000000000000..9f57aa5058cc10abf5ecd011a70de703230b815f --- /dev/null +++ b/test/fast/block_format.js @@ -0,0 +1,86 @@ +"use strict"; +const should = require('should'); +const parsers = require('duniter-common').parsers; + +const raw = "Version: 10\n" + + "Type: Block\n" + + "Currency: test_net\n" + + "Number: 32029\n" + + "PoWMin: 72\n" + + "Time: 1471640455\n" + + "MedianTime: 1471640455\n" + + "UnitBase: 3\n" + + "Issuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n" + + "IssuersFrame: 50\n" + + "IssuersFrameVar: -5\n" + + "DifferentIssuersCount: 8\n" + + "PreviousHash: 00001A8B07B4F5BD5473B83ECC02217E0DDE64A31D695B734C5D88F470B45606\n" + + "PreviousIssuer: E2uioubZeK5SDMoxkTkizRnhE8qDL24v5oUNNa1sQKMH\n" + + "MembersCount: 124\n" + + "Identities:\n" + + "Joiners:\n" + + "Actives:\n" + + "Leavers:\n" + + "Revoked:\n" + + "Excluded:\n" + + "Certifications:\n" + + "Transactions:\n" + + "TX:10:1:6:6:2:1:0\n" + + "32028-00001A8B07B4F5BD5473B83ECC02217E0DDE64A31D695B734C5D88F470B45606\n" + + "F1pirjHYJYimekfvjVp2SGrVQSsJXb4H8JYKJddLzwVL\n" + + "106930:3:D:F1pirjHYJYimekfvjVp2SGrVQSsJXb4H8JYKJddLzwVL:30580\n" + + "117623:3:D:F1pirjHYJYimekfvjVp2SGrVQSsJXb4H8JYKJddLzwVL:30882\n" + + "129386:3:D:F1pirjHYJYimekfvjVp2SGrVQSsJXb4H8JYKJddLzwVL:31142\n" + + "140010:3:D:F1pirjHYJYimekfvjVp2SGrVQSsJXb4H8JYKJddLzwVL:31404\n" + + "152769:3:D:F1pirjHYJYimekfvjVp2SGrVQSsJXb4H8JYKJddLzwVL:31684\n" + + "168046:3:D:F1pirjHYJYimekfvjVp2SGrVQSsJXb4H8JYKJddLzwVL:31966\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "2:SIG(0)\n" + + "3:SIG(0)\n" + + "4:SIG(0)\n" + + "5:SIG(0)\n" + + "168046:3:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of)\n" + + "646718:3:SIG(F1pirjHYJYimekfvjVp2SGrVQSsJXb4H8JYKJddLzwVL)\n" + + "developpement JavaScript explorateur\n" + + "9WR/NRQaIbEuNmatwRytS6QdFjUYME2/ghH/N0KrRF0a6WqG4RvlUEnbzSFpQT4wJ9tTb4cvf0MOW9ZmLli8Cg==\n" + + "InnerHash: 6AEFB6C53390077861F834E5EE7B6222CC6A474040DF22E4FA669B66D5FA13AA\n" + + "Nonce: 0\n" + + "mqzcL5FW0ZMz7/aPpV8vLb6KzMYXl3WYI4bdm6Usq34tSgvROoAOp1uSuyqFBHNd7hggfR/8tACCPhkJMVNLCw==\n"; + +describe("Block format", function(){ + + var parser = parsers.parseBlock; + + it('a valid block should be well formatted', () => parser.syncWrite(raw, { + trace: (msg, p1) => { + if (p1) { + console.log(msg, p1) + } else { + console.log(msg) + } + } + })); + + describe("should be rejected", function(){ + + it('a block without signature', () => { + try { + parser.syncWrite(raw.replace("mqzcL5FW0ZMz7/aPpV8vLb6KzMYXl3WYI4bdm6Usq34tSgvROoAOp1uSuyqFBHNd7hggfR/8tACCPhkJMVNLCw==\n", "")); + should.not.exist('Should have thrown a format error.'); + } catch (err) { + should.exist(err); + } + }); + + it('a block with wrong pubkey format', () => { + try { + parser.syncWrite(raw.replace("HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:", "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvY:")); + should.not.exist('Should have thrown a format error.'); + } catch (err) { + should.exist(err); + } + }); + }); + +}); diff --git a/test/fast/block_global.disabled b/test/fast/block_global.disabled new file mode 100644 index 0000000000000000000000000000000000000000..7611166fd585ea3d7d3ea15ffea5d38b2937f23d --- /dev/null +++ b/test/fast/block_global.disabled @@ -0,0 +1,678 @@ +"use strict"; +const co = require('co'); +const Q = require('q'); +const _ = require('underscore'); +const async = require('async'); +const should = require('should'); +const rules = require('../../app/lib/rules'); +const wotb = require('../../app/lib/wot'); +const parsers = require('duniter-common').parsers; +const blocks = require('../data/blocks'); +const parser = parsers.parseBlock; +const Block = require('../../app/lib/entity/block'); +const Identity = require('../../app/lib/entity/identity'); + +const conf = { + currency: 'bb', + msValidity: 365.25 * 24 * 3600, // 1 year + sigValidity: 365.25 * 24 * 3600, // 1 year + sigQty: 1, + xpercent: 0.9, + powZeroMin: 1, + powPeriod: 18, + incDateMin: 10, + dt: 100, + ud0: 100, + c: 0.1, + medianTimeBlocks: 200, + percentRot: 2 / 3, + blockRot: 300, + dtDiffEval: 500, + stepMax: 1 +}; + +function getDAL(overrides) { + return _.extend({ + wotb: wotb.memoryInstance(), + getCurrentBlockOrNull: () => Q(null), + getWrittenIdtyByUID: () => Q(null), + getWrittenIdtyByPubkey: () => Q(null), + getToBeKicked: () => Q([]), + isLeaving: () => Q(false), + getPreviousLinks: () => Q(null), + getLastValidFrom: () => Q(null), + lastUDBlock: () => Q(null), + getBlock: () => Q(null), + isMember: () => Q(false), + getBlocksBetween: () => Q([]), + lastBlockOfIssuer: () => Q(null) + }, overrides); +} + +/** + * TODO: reimplement tests according to new convention: + * + * - Name: protocol-brg<number>-<title>.js + * - Content: see existing tests + */ + +describe("Block global coherence:", function(){ + + it('a valid block should not have any error', validate(blocks.VALID_ROOT, getDAL(), { + getIssuerPersonalizedDifficulty: () => Q(1), + getvHEAD_1: () => Q({ version : 2 }) + }, function (err) { + should.not.exist(err); + })); + + it('a valid (next) block should not have any error', validate(blocks.VALID_NEXT, getDAL({ + getCurrentBlockOrNull: () => Q({ number: 2, hash: '52DC8A585C5D89571C511BB83F7E7D3382F0041452064B1272E65F0B42B82D57', issuer: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', membersCount: 3, time: 1411776000, medianTime: 1411776000 }), + getBlock: (number) => { + if (number == 1) { + return Q({ time: 1411776000, powMin: 1 }); + } + if (number == 2) { + return Q({ number: 3, powMin: 1 }); + } + return Q(null); + }, + isMember: () => Q(true), + getBlocksBetween: () => Q([{time:1411776000},{time:1411776000},{time:1411776000}]) + }), { + getIssuerPersonalizedDifficulty: () => Q(2), + getvHEAD_1: () => Q({ version : 2 }) + }, function (err) { + should.not.exist(err); + })); + + it('a block with wrong PreviousHash should fail', test(rules.GLOBAL.checkPreviousHash, blocks.WRONG_PREVIOUS_HASH, { + getCurrentBlockOrNull: () => Q({ number: 50, hash: '4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8', issuer: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', membersCount: 3 }) + }, function (err) { + should.exist(err); + err.message.should.equal('PreviousHash not matching hash of current block'); + })); + + it('a block with wrong PreviousIssuer should fail', test(rules.GLOBAL.checkPreviousIssuer, blocks.WRONG_PREVIOUS_ISSUER, { + getCurrentBlockOrNull: () => Q({ number: 50, hash: '4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8', issuer: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', membersCount: 3 }) + }, function (err) { + should.exist(err); + err.message.should.equal('PreviousIssuer not matching issuer of current block'); + })); + + it('a block with wrong DifferentIssuersCount following V2 should fail', test(rules.GLOBAL.checkDifferentIssuersCount, blocks.WRONG_DIFFERENT_ISSUERS_COUNT_FOLLOWING_V2, { + getCurrentBlockOrNull: () => Q({ version: 2 }), + getBlocksBetween: () => Q([]) + }, function (err) { + should.exist(err); + err.message.should.equal('DifferentIssuersCount is not correct'); + })); + + it('a block with wrong DifferentIssuersCount following V3 should fail', test(rules.GLOBAL.checkDifferentIssuersCount, blocks.WRONG_DIFFERENT_ISSUERS_COUNT_FOLLOWING_V3, { + getCurrentBlockOrNull: () => Q({ version: 3, issuersCount: 4 }), + getBlocksBetween: () => Q([ + // 5 blocks, 4 different issuers + { issuer: 'A' }, + { issuer: 'B' }, + { issuer: 'A' }, + { issuer: 'C' }, + { issuer: 'D' } + ]) + }, function (err) { + should.exist(err); + err.message.should.equal('DifferentIssuersCount is not correct'); + })); + + it('a block with wrong IssuersFrame following V2 should fail', test(rules.GLOBAL.checkIssuersFrame, blocks.WRONG_ISSUERS_FRAME_FOLLOWING_V2, { + getCurrentBlockOrNull: () => Q({ version: 2 }) + }, function (err) { + should.exist(err); + err.message.should.equal('IssuersFrame is not correct'); + })); + + it('a block with wrong IssuersFrame following V3 should fail', test(rules.GLOBAL.checkIssuersFrameVar, blocks.WRONG_ISSUERS_FRAME_FOLLOWING_V3, { + getCurrentBlockOrNull: () => Q({ version: 3, issuersCount: 3, issuersFrame: 56, issuersFrameVar: 6 }) + }, function (err) { + should.exist(err); + err.message.should.equal('IssuersFrameVar is not correct'); + })); + + it('a block with wrong Issuer should fail', test(rules.GLOBAL.checkIssuerIsMember, blocks.WRONG_ISSUER, { + isMember: () => Q(false) + }, function (err) { + should.exist(err); + err.message.should.equal('Issuer is not a member'); + })); + + it('a block with joiner for root block without root number shoud fail', test(rules.GLOBAL.checkJoiners, blocks.WRONG_JOIN_ROOT_NUMBER, { + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.exist(err); + err.message.should.equal('Number must be 0 for root block\'s memberships'); + })); + + it('a block with joiner for root block without root hash shoud fail', test(rules.GLOBAL.checkJoiners, blocks.WRONG_JOIN_ROOT_HASH, { + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.exist(err); + err.message.should.equal('Hash must be E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 for root block\'s memberships'); + })); + + it('a block with joiner targeting unexisting block fail', test(rules.GLOBAL.checkJoiners, blocks.WRONG_JOIN_BLOCK_TARGET, { + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.exist(err); + err.message.should.equal('Membership based on an unexisting block'); + })); + + it('a block with joiner membership number lower or equal than previous should fail', test(rules.GLOBAL.checkJoiners, blocks.WRONG_JOIN_NUMBER_TOO_LOW, { + getCurrentBlockOrNull: () => Q(null), + getWrittenIdtyByPubkey: () => Q({ currentMSN: 2 }), + getBlockByNumberAndHash: () => Q({ number: 3, powMin: 1 }) + }, function (err) { + should.exist(err); + err.message.should.equal('Membership\'s number must be greater than last membership of the pubkey'); + })); + + it('a block with joiner membership of a yet member should fail', test(rules.GLOBAL.checkJoiners, blocks.WRONG_JOIN_ALREADY_MEMBER, { + isMember: () => Q(true), + getWrittenIdtyByPubkey: () => Q({ currentMSN: 2, member: true }), + getBlockByNumberAndHash: () => Q({ number: 3, powMin: 1 }), + getCurrentBlockOrNull: () => Q({ number: 50, hash: '4C8800825C44A22F230AFC0D140BF1930331A686899D16EBE4C58C9F34C609E8', issuer: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', membersCount: 3 }) + }, function (err) { + should.exist(err); + err.message.should.equal('Cannot be in joiners if already a member'); + })); + + it('a block with at least one revoked joiner should fail', test(rules.GLOBAL.checkJoinersAreNotRevoked, blocks.REVOKED_JOINER, { + getWrittenIdtyByPubkey: () => Q({ currentMSN: 2, revoked: true }) + }, function (err) { + should.exist(err); + err.message.should.equal('Revoked pubkeys cannot join'); + })); + + it('a block with at least one joiner without enough certifications should fail', test(rules.GLOBAL.checkJoinersHaveEnoughCertifications, blocks.NOT_ENOUGH_CERTIFICATIONS_JOINER, { + getValidLinksTo: () => Q([]) + }, function (err) { + should.exist(err); + err.message.should.equal('Joiner/Active does not gathers enough certifications'); + })); + + it('a block with at least one joiner without enough certifications should succeed', test(rules.GLOBAL.checkJoinersHaveEnoughCertifications, blocks.NOT_ENOUGH_CERTIFICATIONS_JOINER_BLOCK_0, { + }, function (err) { + should.not.exist(err); + })); + + it('a block with expired membership should fail', test(rules.GLOBAL.checkJoiners, blocks.EXPIRED_MEMBERSHIP, { + getWrittenIdtyByPubkey: () => Q({ currentMSN: 2 }), + getBlockByNumberAndHash: () => Q({ medianTime: 1411775000, powMin: 1 }), + getCurrentBlockOrNull: () => Q({ time: 1443333600, medianTime: 1443333600 }) + }, function (err) { + should.exist(err); + err.message.should.equal('Membership has expired'); + })); + + it('a block with at least one joiner outdistanced from WoT should fail', test(rules.GLOBAL.checkJoinersAreNotOudistanced, blocks.OUTDISTANCED_JOINER, { + wotb: { + addNode: () => 1, + setEnabled: () => 1, + addLink: () => 1, + removeLink: () => 1, + removeNode: () => 1, + isOutdistanced: () => true + }, + getCurrentBlockOrNull: () => Q({ number: 2, hash: '52DC8A585C5D89571C511BB83F7E7D3382F0041452064B1272E65F0B42B82D57', issuer: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', membersCount: 3, time: 1411776000, medianTime: 1411776000 }), + getWrittenIdtyByPubkey: () => Q({ wotb_id: 0 }) + }, function (err) { + should.exist(err); + err.message.should.equal('Joiner/Active is outdistanced from WoT'); + })); + + it('a block with active targeting unexisting block fail', test(rules.GLOBAL.checkActives, blocks.WRONG_ACTIVE_BLOCK_TARGET, { + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.exist(err); + err.message.should.equal('Membership based on an unexisting block'); + })); + + it('a block with certification of unknown pubkey should fail', test(rules.GLOBAL.checkCertificationsAreValid, blocks.WRONGLY_SIGNED_CERTIFICATION, { + getCurrentBlockOrNull: () => Q(null), + getBlock: () => Q({}), + getBlockByNumberAndHash: () => Q({}) + }, function (err) { + should.exist(err); + err.message.should.equal('Wrong signature for certification'); + })); + + it('a block with certification to non-zero block for root block should fail', test(rules.GLOBAL.checkCertificationsAreValid, blocks.CERT_BASED_ON_NON_ZERO_FOR_ROOT, { + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.exist(err); + err.message.should.equal('Number must be 0 for root block\'s certifications'); + })); + + it('a block with certification to unknown block should fail', test(rules.GLOBAL.checkCertificationsAreValid, blocks.CERT_BASED_ON_NON_EXISTING_BLOCK, { + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.exist(err); + err.message.should.equal('Certification based on an unexisting block'); + })); + + it('a block with expired certifications should fail', test(rules.GLOBAL.checkCertificationsAreValid, blocks.EXPIRED_CERTIFICATIONS, { + getCurrentBlockOrNull: () => Q({ time: 1443333600, medianTime: 1443333600 }), + getBlock: () => Q({ medianTime: 1411775000, powMin: 1 }) + }, function (err) { + should.exist(err); + err.message.should.equal('Certification has expired'); + })); + + it('a block with certification from non-member pubkey should fail', test(rules.GLOBAL.checkCertificationsAreMadeByMembers, blocks.UNKNOWN_CERTIFIER, { + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.exist(err); + err.message.should.equal('Certification from non-member'); + })); + + it('a block with certification to non-member pubkey should fail', test(rules.GLOBAL.checkCertificationsAreMadeToMembers, blocks.UNKNOWN_CERTIFIED, { + isMember: () => Q(false) + }, function (err) { + should.exist(err); + err.message.should.equal('Certification to non-member'); + })); + + it('a block with already used UserID should fail', test(rules.GLOBAL.checkIdentityUnicity, blocks.EXISTING_UID, { + getWrittenIdtyByUID: () => Q({}) + }, function (err) { + should.exist(err); + err.message.should.equal('Identity already used'); + })); + + it('a block with already used pubkey should fail', test(rules.GLOBAL.checkPubkeyUnicity, blocks.EXISTING_PUBKEY, { + getWrittenIdtyByPubkey: () => Q({}) + }, function (err) { + should.exist(err); + err.message.should.equal('Pubkey already used'); + })); + + it('a block with too early certification replay should fail', test(rules.GLOBAL.checkCertificationsDelayIsRespected, blocks.TOO_EARLY_CERTIFICATION_REPLAY, { + getPreviousLinks: (from, to) => { + if (from == 'G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU' + && to == 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC') { + // Exactly 1 second remaining + return Q({ timestamp: '1380218401' }); + } + return Q(null); + } + }, function (err) { + should.exist(err); + err.message.should.equal('A similar certification is already active'); + })); + + it('a block with kicked members not written under Excluded field should fail', test(rules.GLOBAL.checkKickedMembersAreExcluded, blocks.KICKED_NOT_EXCLUDED, { + getToBeKicked: () => Q([{}]) + }, function (err) { + should.exist(err); + err.message.should.equal('All kicked members must be present under Excluded members'); + })); + + it('a block with kicked members well written under Excluded field should succeed', test(rules.GLOBAL.checkKickedMembersAreExcluded, blocks.KICKED_EXCLUDED, { + getToBeKicked: () => Q([ + { pubkey: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd' }, + { pubkey: 'G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU' } + ]) + }, function (err) { + should.not.exist(err); + })); + it('a block with kicked members not well written under Excluded field should fail', test(rules.GLOBAL.checkKickedMembersAreExcluded, blocks.KICKED_EXCLUDED, { + getToBeKicked: () => Q([ + { pubkey: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd' }, + { pubkey: 'G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU' }, + { pubkey: 'D2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU' } + ]) + }, function (err) { + should.exist(err); + err.message.should.equal('All kicked members must be present under Excluded members'); + })); + + it('a block with wrong members count should fail', test(rules.GLOBAL.checkMembersCountIsGood, blocks.WRONG_MEMBERS_COUNT, { + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.exist(err); + err.message.should.equal('Wrong members count'); + })); + + it('a block not starting with a leading zero should fail', test(rules.GLOBAL.checkProofOfWork, blocks.NO_LEADING_ZERO, { + bcContext: { + getIssuerPersonalizedDifficulty: () => Q(8) + } + }, function (err) { + should.exist(err); + err.message.should.equal('Wrong proof-of-work level: given 0 zeros and \'F\', required was 0 zeros and an hexa char between [0-7]'); + })); + + it('a block requiring 2 leading zeros but providing less should fail', test(rules.GLOBAL.checkProofOfWork, blocks.REQUIRES_7_LEADING_ZEROS, { + bcContext: { + getIssuerPersonalizedDifficulty: () => Q(12) + } + }, function (err) { + should.exist(err); + err.message.should.equal('Wrong proof-of-work level: given 0 zeros and \'B\', required was 0 zeros and an hexa char between [0-3]'); + })); + + it('a block requiring 1 leading zeros but providing less should fail', test(rules.GLOBAL.checkProofOfWork, blocks.REQUIRES_6_LEADING_ZEROS, { + bcContext: { + getIssuerPersonalizedDifficulty: () => Q(8) + } + }, function (err) { + should.exist(err); + err.message.should.equal('Wrong proof-of-work level: given 0 zeros and \'8\', required was 0 zeros and an hexa char between [0-7]'); + })); + + it('a block requiring 1 leading zeros as first block of newcomer should succeed', test(rules.GLOBAL.checkProofOfWork, blocks.FIRST_BLOCK_OF_NEWCOMER, { + bcContext: { + getIssuerPersonalizedDifficulty: () => Q(1) + } + }, function (err) { + should.not.exist(err); + })); + + it('a block requiring 40 leading zeros as second block of newcomer should fail', test(rules.GLOBAL.checkProofOfWork, blocks.SECOND_BLOCK_OF_NEWCOMER, { + bcContext: { + getIssuerPersonalizedDifficulty: () => Q(160) + } + }, function (err) { + should.exist(err); + err.message.should.equal('Wrong proof-of-work level: given 0 zeros and \'F\', required was 10 zeros and an hexa char between [0-9A-F]'); + })); + + it('a root block should not fail for time reason', test(rules.GLOBAL.checkTimes, blocks.WRONG_ROOT_DATES, { + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.not.exist(err); + })); + + it('a block with wrong median for an odd number of blocks should fail', test(rules.GLOBAL.checkTimes, blocks.WRONG_MEDIAN_TIME_ODD, { + getBlocksBetween: () => Q([{time: 1},{time: 12}]) + }, function (err) { + should.exist(err); + err.message.should.equal('Wrong MedianTime'); + })); + + it('a block with wrong median for an even number of blocks should fail', test(rules.GLOBAL.checkTimes, blocks.WRONG_MEDIAN_TIME_EVEN, { + getBlocksBetween: () => Q([{time: 1},{time: 12}]) + }, function (err) { + should.exist(err); + err.message.should.equal('Wrong MedianTime'); + })); + + it('a block whose median time is correct (odd) should pass', test(rules.GLOBAL.checkTimes, blocks.GOOD_MEDIAN_TIME_ODD, { + getBlocksBetween: () => { + let times = []; + for (let i = 0; i < 103; i++) + times.push({ time: 161 }); + return Q(times); + } + }, function (err) { + should.not.exist(err); + })); + + it('a block whose median time is correct (even) should pass', test(rules.GLOBAL.checkTimes, blocks.GOOD_MEDIAN_TIME_EVEN, { + getBlocksBetween: () => { + let times = []; + for (let i = 0; i < 104; i++) + times.push({ time: 162 }); + return Q(times); + } + }, function (err) { + should.not.exist(err); + })); + + it('a root block with Universal Dividend should fail', test(rules.GLOBAL.checkUD, blocks.ROOT_BLOCK_WITH_UD, { + lastUDBlock: () => Q(null), + getBlock: () => Q(null), + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.exist(err); + err.message.should.equal('Root block cannot have UniversalDividend field'); + })); + + it('first block with Universal Dividend should not happen before root time + dt', test(rules.GLOBAL.checkUD, blocks.FIRST_UD_BLOCK_WITH_UD_THAT_SHOULDNT, { + lastUDBlock: () => Q(null), + getBlock: () => Q({ hash: 'E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855', medianTime: 1411773000, powMin: 1 }), + getCurrentBlockOrNull: () => Q({ number: 19, time: 1411773000, medianTime: 1411773000 }) + }, function (err) { + should.exist(err); + err.message.should.equal('This block cannot have UniversalDividend'); + })); + + it('first block with Universal Dividend should happen on root time + dt', test(rules.GLOBAL.checkUD, blocks.FIRST_UD_BLOCK_WITH_UD_THAT_SHOULD, { + lastUDBlock: () => Q(null), + getBlock: () => Q({ hash: 'E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855', medianTime: 1411773000, powMin: 1 }), + getCurrentBlockOrNull: () => Q({ number: 19, time: 1411773000, medianTime: 1411773000 }) + }, function (err) { + should.exist(err); + err.message.should.equal('Block must have a UniversalDividend field'); + })); + + it('a block without Universal Dividend whereas it have to have one should fail', test(rules.GLOBAL.checkUD, blocks.UD_BLOCK_WIHTOUT_UD, { + lastUDBlock: () => Q(null), + getBlock: () => Q({ hash: 'E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855', medianTime: 1411773000, powMin: 1 }), + getCurrentBlockOrNull: () => Q({ number: 19, time: 1411773000, medianTime: 1411773000 }) + }, function (err) { + should.exist(err); + err.message.should.equal('Block must have a UniversalDividend field'); + })); + + it('a block with wrong (version 2) Universal Dividend value should fail', test(rules.GLOBAL.checkUD, blocks.BLOCK_WITH_WRONG_UD, { + lastUDBlock: () => Q({ UDTime: 1411776900, medianTime: 1411776900, monetaryMass: 3620 * 10000, dividend: 110, unitbase: 4 }), + getBlock: () => Q(), + getCurrentBlockOrNull: () => Q({ time: 1411777000, medianTime: 1411777000 }) + }, function (err) { + should.exist(err); + err.message.should.equal('UniversalDividend must be equal to 121'); + })); + + it('a block with wrong (version 3) Universal Dividend value should fail', test(rules.GLOBAL.checkUD, blocks.BLOCK_WITH_WRONG_UD_V3, { + lastUDBlock: () => Q({ UDTime: 1411776900, medianTime: 1411776900, dividend: 110, unitbase: 4 }), + getBlock: () => Q(), + getCurrentBlockOrNull: () => Q({ time: 1411777000, medianTime: 1411777000 }) + }, function (err) { + should.exist(err); + err.message.should.equal('UniversalDividend must be equal to 121'); + })); + + it('a block with wrong UnitBase value should fail', test(rules.GLOBAL.checkUD, blocks.BLOCK_WITH_WRONG_UNIT_BASE, { + lastUDBlock: () => Q({ UDTime: 1411777000, medianTime: 1411777000, monetaryMass: 12345678900, dividend: 100, unitbase: 2 }), + getBlock: () => Q(), + getCurrentBlockOrNull: () => Q({ time: 1411777000, medianTime: 1411777000 }) + }, function (err) { + should.exist(err); + err.message.should.equal('UnitBase must be equal to 3'); + })); + + it('a block without UD with wrong UnitBase value should fail', test(rules.GLOBAL.checkUD, blocks.BLOCK_WITH_WRONG_UNIT_BASE_NO_UD, { + lastUDBlock: () => Q({ UDTime: 1411777000, medianTime: 1411777000, monetaryMass: 12345678900, dividend: 100, unitbase: 8 }), + getBlock: () => Q(), + getCurrentBlockOrNull: () => Q({ time: 1411777000, medianTime: 1411777000, unitbase: 5 }) + }, function (err) { + should.exist(err); + err.message.should.equal('UnitBase must be equal to previous unit base = 5'); + })); + + it('a root block with unlegitimated Universal Dividend presence should fail', test(rules.GLOBAL.checkUD, blocks.BLOCK_UNLEGITIMATE_UD, { + lastUDBlock: () => Q({ UDTime: 1411777000, medianTime: 1411777000, monetaryMass: 3620 * 10000, dividend: 110, unitbase: 4 }), + getBlock: () => Q(), + getCurrentBlockOrNull: () => Q({ time: 1411777000, medianTime: 1411777000 }) + }, function (err) { + should.exist(err); + err.message.should.equal('This block cannot have UniversalDividend'); + })); + + it('a root block with unlegitimated Universal Dividend presence should fail', test(rules.GLOBAL.checkUD, blocks.BLOCK_UNLEGITIMATE_UD_2, { + lastUDBlock: () => Q({ UDTime: 1411777000, medianTime: 1411777000, monetaryMass: 3620 * 10000, dividend: 110, unitbase: 4 }), + getBlock: () => Q(), + getCurrentBlockOrNull: () => Q({ time: 1411777000, medianTime: 1411777000 }) + }, function (err) { + should.exist(err); + err.message.should.equal('This block cannot have UniversalDividend'); + })); + + + it('a block without transactions should pass', test(rules.GLOBAL.checkSourcesAvailability, blocks.BLOCK_WITHOUT_TRANSACTIONS, { + getCurrentBlockOrNull: () => Q(null) + }, function (err) { + should.not.exist(err); + })); + + it('a block with good transactions should pass', test(rules.GLOBAL.checkSourcesAvailability, blocks.BLOCK_WITH_GOOD_TRANSACTIONS, { + getCurrentBlockOrNull: () => Q({ unitbase: 5 }), + getSource: (id, noffset) => { + if (id == '6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3' && noffset == 4) return Q({ amount: 0, base: 4 }); + if (id == '3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435' && noffset == 10) return Q({ amount: 0, base: 3 }); + if (id == 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd' && noffset == 46) return Q({ amount: 0, base: 4 }); + if (id == 'A0D9B4CDC113ECE1145C5525873821398890AE842F4B318BD076095A23E70956' && noffset == 66) return Q({ amount: 235, base: 4 }); + if (id == '67F2045B5318777CC52CD38B424F3E40DDA823FA0364625F124BABE0030E7B5B' && noffset == 176) return Q({ amount: 0, base: 4 }); + return Q(null); + } + }, function (err) { + should.not.exist(err); + })); + + it('a block with wrong transaction sum should fail', test(rules.GLOBAL.checkSourcesAvailability, blocks.BLOCK_WITH_WRONG_TRANSACTION_SUMS, { + getCurrentBlockOrNull: () => Q({ unitbase: 5 }), + getSource: (id, noffset) => { + if (id == '6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3' && noffset == 4) return Q({ amount: 0, base: 4 }); + if (id == '3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435' && noffset == 10) return Q({ amount: 0, base: 3 }); + if (id == 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd' && noffset == 46) return Q({ amount: 0, base: 4 }); + if (id == 'A0D9B4CDC113ECE1145C5525873821398890AE842F4B318BD076095A23E70956' && noffset == 66) return Q({ amount: 235, base: 4 }); + if (id == '67F2045B5318777CC52CD38B424F3E40DDA823FA0364625F124BABE0030E7B5B' && noffset == 176) return Q({ amount: 0, base: 4 }); + return Q(null); + } + }, function (err) { + should.exist(err); + err.uerr.message.should.equal('Sum of inputs must equal sum of outputs'); + })); + + it('a block with wrong transaction unit bases should fail', test(rules.GLOBAL.checkSourcesAvailability, blocks.BLOCK_WITH_WRONG_TRANSACTION_SUMS, { + getCurrentBlockOrNull: () => Q({ unitbase: 5 }), + getSource: (id, noffset) => { + if (id == '6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3' && noffset == 4) return Q({ amount: 0, base: 4 }); + if (id == '3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435' && noffset == 10) return Q({ amount: 0, base: 3 }); + if (id == 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd' && noffset == 46) return Q({ amount: 0, base: 4 }); + if (id == 'A0D9B4CDC113ECE1145C5525873821398890AE842F4B318BD076095A23E70956' && noffset == 66) return Q({ amount: 235, base: 4 }); + if (id == '67F2045B5318777CC52CD38B424F3E40DDA823FA0364625F124BABE0030E7B5B' && noffset == 176) return Q({ amount: 0, base: 4 }); + return Q(null); + } + }, function (err) { + should.exist(err); + err.uerr.message.should.equal('Sum of inputs must equal sum of outputs'); + })); + + it('a block with whose transaction has too high unit bases should fail', test(rules.GLOBAL.checkSourcesAvailability, blocks.BLOCK_WITH_WRONG_TRANSACTION_UNIT_BASES, { + getCurrentBlockOrNull: () => Q({ unitbase: 2 }), + getSource: (id, noffset) => { + if (id == '6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3' && noffset == 4) return Q({ amount: 0, base: 4 }); + if (id == '3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435' && noffset == 10) return Q({ amount: 0, base: 3 }); + if (id == 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd' && noffset == 46) return Q({ amount: 0, base: 4 }); + if (id == 'A0D9B4CDC113ECE1145C5525873821398890AE842F4B318BD076095A23E70956' && noffset == 66) return Q({ amount: 235, base: 4 }); + if (id == '67F2045B5318777CC52CD38B424F3E40DDA823FA0364625F124BABE0030E7B5B' && noffset == 176) return Q({ amount: 0, base: 4 }); + return Q(null); + } + }, function (err) { + should.exist(err); + err.uerr.message.should.equal('Wrong unit base for outputs'); + })); + + it('a block with unavailable UD source should fail', test(rules.GLOBAL.checkSourcesAvailability, blocks.BLOCK_WITH_UNAVAILABLE_UD_SOURCE, { + getCurrentBlockOrNull: () => Q({ unitbase: 5 }), + getSource: (id, noffset) => { + if (id == '6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3' && noffset == 4) return Q({ amount: 0, base: 4 }); + if (id == '3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435' && noffset == 10) return Q({ amount: 0, base: 3 }); + if (id == 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd' && noffset == 46) return Q({ amount: 0, base: 4 }); + if (id == 'A0D9B4CDC113ECE1145C5525873821398890AE842F4B318BD076095A23E70956' && noffset == 66) return Q({ amount: 235, base: 4 }); + if (id == '67F2045B5318777CC52CD38B424F3E40DDA823FA0364625F124BABE0030E7B5B' && noffset == 176) return Q({ amount: 0, base: 4 }); + return Q(null); + } + }, function (err) { + should.exist(err); + err.should.have.property('uerr').property('message').equal('Source already consumed'); + })); + + it('a block with unavailable TX source should fail', test(rules.GLOBAL.checkSourcesAvailability, blocks.BLOCK_WITH_UNAVAILABLE_TX_SOURCE, { + getCurrentBlockOrNull: () => Q({ unitbase: 5 }), + getSource: (id, noffset) => { + if (id == '6991C993631BED4733972ED7538E41CCC33660F554E3C51963E2A0AC4D6453D3' && noffset == 4) return Q({ amount: 0, base: 4 }); + if (id == '3A09A20E9014110FD224889F13357BAB4EC78A72F95CA03394D8CCA2936A7435' && noffset == 10) return Q({ amount: 0, base: 3 }); + if (id == 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd' && noffset == 46) return Q({ amount: 0, base: 4 }); + if (id == 'A0D9B4CDC113ECE1145C5525873821398890AE842F4B318BD076095A23E70956' && noffset == 66) return Q({ amount: 235, base: 4 }); + if (id == '67F2045B5318777CC52CD38B424F3E40DDA823FA0364625F124BABE0030E7B5B' && noffset == 176) return Q({ amount: 0, base: 4 }); + return Q(null); + } + }, function (err) { + should.exist(err); + err.should.have.property('uerr').property('message').equal('Source already consumed'); + })); + + it('a block with a too high unit base should fail', test(rules.GLOBAL.checkSourcesAvailability, blocks.BLOCK_TX_V3_TOO_HIGH_OUTPUT_BASE, { + getCurrentBlockOrNull: () => Q({ unitbase: 3 }), + getSource: () => Q({ base: 1, amount: 10 }) + }, function (err) { + should.exist(err); + err.should.have.property('uerr').property('message').equal('Wrong unit base for outputs'); + })); + + it('a block with an unknown member revoked should fail', test(rules.GLOBAL.checkRevoked, blocks.BLOCK_UNKNOWN_REVOKED, { + getWrittenIdtyByPubkey: () => Q(null) + }, function (err) { + should.exist(err); + err.message.should.equal('A pubkey who was never a member cannot be revoked'); + })); + + it('a block with a yet revoked identity should fail', test(rules.GLOBAL.checkRevoked, blocks.BLOCK_WITH_YET_REVOKED, { + getWrittenIdtyByPubkey: () => Q({ revoked: true }) + }, function (err) { + should.exist(err); + err.message.should.equal('A revoked identity cannot be revoked again'); + })); + + it('a block with a wrong revocation signature should fail', test(rules.GLOBAL.checkRevoked, blocks.BLOCK_WITH_WRONG_REVOCATION_SIG, { + getWrittenIdtyByPubkey: () => Q({}) + }, function (err) { + should.exist(err); + err.message.should.equal('Revocation signature must match'); + })); +}); + +function test (rule, raw, dal, callback) { + return function() { + return co(function *() { + let obj = parser.syncWrite(raw); + let block = new Block(obj); + if (rule == rules.GLOBAL.checkProofOfWork || rule == rules.GLOBAL.checkVersion) { + yield rule(block, dal.bcContext); + } else if (rule.length == 2) { + yield rule(block, dal); + } else { + yield rule(block, conf, dal); + } + }) + .then(callback).catch(callback); + }; +} + +function validate (raw, dal, bcContext, callback) { + var block; + return function() { + return Q.Promise(function(resolve, reject){ + async.waterfall([ + function (next){ + block = new Block(parser.syncWrite(raw)); + rules.CHECK.ASYNC.ALL_GLOBAL(block, conf, dal, bcContext, next); + } + ], function (err) { + err && console.error(err.stack); + err ? reject(err) : resolve(); + }); + }) + .then(callback).catch(callback); + }; +} diff --git a/test/fast/block_local.js b/test/fast/block_local.js new file mode 100644 index 0000000000000000000000000000000000000000..c3a796da1544fb1a9f7c2bc2f5fd40348f3c89a0 --- /dev/null +++ b/test/fast/block_local.js @@ -0,0 +1,105 @@ +"use strict"; +const co = require('co'); +const should = require('should'); +const parsers = require('duniter-common').parsers; +const rules = require('../../app/lib/rules') +const blocks = require('../data/blocks.js'); +const parser = parsers.parseBlock; +const Block = require('duniter-common').document.Block + +const conf = { + + sigQty: 1, + powZeroMin: 1, + powPeriod: 18, + incDateMin: 10, + avgGenTime: 60, + medianTimeBlocks: 20, + dt: 100, + ud0: 100, + c: 0.1 +} + +describe("Block local coherence", function(){ + + it('a valid block should be well formatted', test(rules.ALIAS.ALL_LOCAL_BUT_POW_AND_SIGNATURE, blocks.VALID_ROOT)); + + describe("should be rejected", function(){ + + it('if wrong signature block', test(rules.LOCAL.checkBlockSignature, blocks.WRONG_SIGNATURE, 'Block\'s signature must match')); + it('if root block does not have Parameters', test(rules.LOCAL.checkParameters, blocks.ROOT_WITHOUT_PARAMETERS, 'Parameters must be provided for root block')); + it('if proof-of-work does not match PoWMin field', test(rules.LOCAL.checkProofOfWork, blocks.WRONG_PROOF_OF_WORK, 'Not a proof-of-work')); + it('if non-root has Parameters', test(rules.LOCAL.checkParameters, blocks.NON_ROOT_WITH_PARAMETERS, 'Parameters must not be provided for non-root block')); + it('if root block has PreviousHash', test(rules.LOCAL.checkPreviousHash, blocks.ROOT_WITH_PREVIOUS_HASH, 'PreviousHash must not be provided for root block')); + it('if root block has PreviousIssuer', test(rules.LOCAL.checkPreviousIssuer, blocks.ROOT_WITH_PREVIOUS_ISSUER, 'PreviousIssuer must not be provided for root block')); + it('if non-root block does not have PreviousHash', test(rules.LOCAL.checkPreviousHash, blocks.NON_ROOT_WITHOUT_PREVIOUS_HASH, 'PreviousHash must be provided for non-root block')); + it('if non-root block does not have PreviousIssuer', test(rules.LOCAL.checkPreviousIssuer, blocks.NON_ROOT_WITHOUT_PREVIOUS_ISSUER, 'PreviousIssuer must be provided for non-root block')); + it('a V2 block with Dividend must have UnitBase field', test(rules.LOCAL.checkUnitBase, blocks.UD_BLOCK_WIHTOUT_BASE, 'Document has unkown fields or wrong line ending format')); + it('a V3 root block must have UnitBase field', test(rules.LOCAL.checkUnitBase, blocks.V3_ROOT_BLOCK_NOBASE, 'Document has unkown fields or wrong line ending format')); + it('a V3 root block must have UnitBase field equal 0', test(rules.LOCAL.checkUnitBase, blocks.V3_ROOT_BLOCK_POSITIVE_BASE, 'UnitBase must equal 0 for root block')); + it('a block with wrong date (in past)', test(rules.LOCAL.checkBlockTimes, blocks.WRONG_DATE_LOWER, 'A block must have its Time between MedianTime and MedianTime + 1440')); + it('a block with wrong date (in future, but too far)', test(rules.LOCAL.checkBlockTimes, blocks.WRONG_DATE_HIGHER_BUT_TOO_HIGH, 'A block must have its Time between MedianTime and MedianTime + 1440')); + it('a root block with different time & medianTime should fail', test(rules.LOCAL.checkBlockTimes, blocks.WRONG_ROOT_TIMES, 'Root block must have Time equal MedianTime')); + it('a block with good date', test(rules.LOCAL.checkBlockTimes, blocks.GOOD_DATE_HIGHER)); + it('Block cannot contain wrongly signed identities', test(rules.LOCAL.checkIdentitiesSignature, blocks.WRONGLY_SIGNED_IDENTITIES, 'Identity\'s signature must match')); + it('block with colliding uids in identities', test(rules.LOCAL.checkIdentitiesUserIDConflict, blocks.COLLIDING_UIDS, 'Block must not contain twice same identity uid')); + it('a block with colliding pubkeys in identities', test(rules.LOCAL.checkIdentitiesPubkeyConflict, blocks.COLLIDING_PUBKEYS, 'Block must not contain twice same identity pubkey')); + it('a block with identities not matchin joins', test(rules.LOCAL.checkIdentitiesMatchJoin, blocks.WRONG_IDTY_MATCH_JOINS, 'Each identity must match a newcomer line with same userid and certts')); + it('Block cannot contain wrongly signed join', test(rules.LOCAL.checkMembershipsSignature, blocks.WRONGLY_SIGNED_JOIN, 'Membership\'s signature must match')); + it('Block cannot contain wrongly signed active', test(rules.LOCAL.checkMembershipsSignature, blocks.WRONGLY_SIGNED_ACTIVE, 'Membership\'s signature must match')); + it('Block cannot contain wrongly signed leave', test(rules.LOCAL.checkMembershipsSignature, blocks.WRONGLY_SIGNED_LEAVE, 'Membership\'s signature must match')); + it('Block cannot contain a same pubkey more than once in joiners', test(rules.LOCAL.checkPubkeyUnicity, blocks.MULTIPLE_JOINERS, 'Block cannot contain a same pubkey more than once in joiners, actives, leavers and excluded')); + it('Block cannot contain a same pubkey more than once in actives', test(rules.LOCAL.checkPubkeyUnicity, blocks.MULTIPLE_ACTIVES, 'Block cannot contain a same pubkey more than once in joiners, actives, leavers and excluded')); + it('Block cannot contain a same pubkey more than once in leavers', test(rules.LOCAL.checkPubkeyUnicity, blocks.MULTIPLE_LEAVES, 'Block cannot contain a same pubkey more than once in joiners, actives, leavers and excluded')); + it('Block cannot contain a same pubkey more than once in excluded', test(rules.LOCAL.checkPubkeyUnicity, blocks.MULTIPLE_EXCLUDED, 'Block cannot contain a same pubkey more than once in joiners, actives, leavers and excluded')); + it('Block cannot contain a same pubkey more than once in joiners, actives, leavers and excluded', test(rules.LOCAL.checkPubkeyUnicity, blocks.MULTIPLE_OVER_ALL, 'Block cannot contain a same pubkey more than once in joiners, actives, leavers and excluded')); + it('Block cannot have revoked key in joiners,actives,leavers', test(rules.LOCAL.checkMembershipUnicity, blocks.REVOKED_WITH_MEMBERSHIPS, 'Unicity constraint PUBLIC_KEY on MINDEX is not respected')); + it('Block cannot have revoked key duplicates', test(rules.LOCAL.checkRevokedUnicity, blocks.REVOKED_WITH_DUPLICATES, 'A single revocation per member is allowed')); + it('Block revoked keys must be in excluded', test(rules.LOCAL.checkRevokedAreExcluded, blocks.REVOKED_NOT_IN_EXCLUDED, 'A revoked member must be excluded')); + it('Block cannot contain 2 certifications from same issuer', test(rules.LOCAL.checkCertificationOneByIssuer, blocks.MULTIPLE_CERTIFICATIONS_FROM_SAME_ISSUER, 'Block cannot contain two certifications from same issuer')); + it('Block cannot contain identical certifications', test(rules.LOCAL.checkCertificationUnicity, blocks.IDENTICAL_CERTIFICATIONS, 'Block cannot contain identical certifications (A -> B)')); + it('Block cannot contain certifications concerning a leaver', test(rules.LOCAL.checkCertificationIsntForLeaverOrExcluded, blocks.LEAVER_WITH_CERTIFICATIONS, 'Block cannot contain certifications concerning leavers or excluded members')); + it('Block cannot contain certifications concerning an excluded member', test(rules.LOCAL.checkCertificationIsntForLeaverOrExcluded, blocks.EXCLUDED_WITH_CERTIFICATIONS, 'Block cannot contain certifications concerning leavers or excluded members')); + it('Block cannot contain transactions without issuers (1)', test(rules.LOCAL.checkTxIssuers, blocks.TRANSACTION_WITHOUT_ISSUERS, 'A transaction must have at least 1 issuer')); + it('Block cannot contain transactions without issuers (2)', test(rules.LOCAL.checkTxSources, blocks.TRANSACTION_WITHOUT_SOURCES, 'A transaction must have at least 1 source')); + it('Block cannot contain transactions without issuers (3)', test(rules.LOCAL.checkTxRecipients, blocks.TRANSACTION_WITHOUT_RECIPIENT, 'A transaction must have at least 1 recipient')); + it('Block cannot contain transactions with identical sources in one transaction', test(rules.LOCAL.checkTxSources, blocks.TRANSACTION_WITH_DUPLICATED_SOURCE_SINGLE_TX, 'It cannot exist 2 identical sources for transactions inside a given block')); + it('Block cannot contain transactions with identical sources in a pack of transactions', test(rules.LOCAL.checkTxSources, blocks.TRANSACTION_WITH_DUPLICATED_SOURCE_MULTIPLE_TX, 'It cannot exist 2 identical sources for transactions inside a given block')); + it('Block cannot contain transactions with empty output conditions', test(rules.LOCAL.checkTxRecipients, blocks.TRANSACTION_WITH_EMPTY_TX_CONDITIONS, 'Empty conditions are forbidden')); + it('Block cannot contain transactions with wrong total', test(rules.LOCAL.checkTxAmounts, blocks.TRANSACTION_WRONG_TOTAL, 'Transaction inputs sum must equal outputs sum')); + it('Block cannot contain transactions with wrong base transformation', test(rules.LOCAL.checkTxAmounts, blocks.TRANSACTION_WRONG_TRANSFORM, 'Transaction output base amount does not equal previous base deltas')); + it('Block cannot contain transactions with unexisting lower base in sources', test(rules.LOCAL.checkTxAmounts, blocks.TRANSACTION_WRONG_TRANSFORM_LOW_BASE, 'Transaction output base amount does not equal previous base deltas')); + it('Block cannot contain transactions with more than 100 lines', test(rules.LOCAL.checkTxLen, blocks.TRANSACTION_TOO_LONG, 'A transaction has a maximum size of 100 lines')); + it('Block cannot contain transactions with a too large output', test(rules.LOCAL.checkTxLen, blocks.OUTPUT_TOO_LONG, 'A transaction output has a maximum size of 2000 characters')); + it('Block cannot contain transactions with a too large unlock', test(rules.LOCAL.checkTxLen, blocks.UNLOCK_TOO_LONG, 'A transaction unlock has a maximum size of 2000 characters')); + it('Block cannot be refused with a good V3 transaction', test(rules.LOCAL.checkTxAmounts, blocks.TRANSACTION_V3_GOOD_AMOUNTS)); + it('Block cannot contain transactions with wrong signatures', test(rules.LOCAL.checkTxSignature, blocks.TRANSACTION_WITH_WRONG_SIGNATURES, 'Signature from a transaction must match')); + }); + +}); + + +function test (rule, raw, expectedMessage) { + return () => co(function *() { + try { + let obj = parser.syncWrite(raw); + let block = Block.fromJSON(obj); + yield rule(block, conf); // conf parameter is not always used + if (expectedMessage) { + throw 'Test should have thrown an error'; + } + } catch (e) { + if (!expectedMessage) { + console.error(e.stack || e); + } + if (e.uerr) { + // This is a controlled error + e.uerr.message.should.equal(expectedMessage); + } else { + e.message.should.equal(expectedMessage); + // Display non wrapped errors (wrapped error is an error in constants.js) + // console.error(e.stack || e); + } + } + }); +} diff --git a/test/fast/protocol-brg106-number.js b/test/fast/protocol-brg106-number.js new file mode 100644 index 0000000000000000000000000000000000000000..803df1873abe2ee773f1be140586dee0a9577d08 --- /dev/null +++ b/test/fast/protocol-brg106-number.js @@ -0,0 +1,89 @@ +"use strict"; +const co = require('co'); +const should = require('should'); +const indexer = require('../../app/lib/indexer'); + +describe("Protocol BR_G106 - Garbaging", function(){ + + it('An account with balance < 1,00 should be cleaned up', () => co(function*(){ + const balances = { + pubkeyA: { balance: 103 }, + pubkeyB: { balance: 11 + 22 + 68 }, // 101 + pubkeyC: { balance: 100 }, + pubkeyD: { balance: 0 }, + pubkeyE: { balance: 0 } + } + const sources = { + pubkeyA: [ // 103 + { amount: 103, base: 0, tx: 'A1', identifier: 'I1', pos: 0 } + ], + pubkeyB: [ // 104 + { amount: 14, base: 0, tx: 'B1', identifier: 'I4', pos: 0 }, + { amount: 22, base: 0, tx: 'B2', identifier: 'I10', pos: 0 }, + { amount: 68, base: 0, tx: null, identifier: 'I11', pos: 0 } // UD + ], + pubkeyC: [ // 100 + { amount: 100, base: 0, tx: 'C1', identifier: 'I8', pos: 0 } + ], + pubkeyD: [], + pubkeyE: [] + } + const dal = { + getWallet: (conditions) => Promise.resolve(balances[conditions]), + sindexDAL: { + getAvailableForConditions: (conditions) => Promise.resolve(sources[conditions]), + } + }; + const HEAD = { unitBase: 0 }; + const cleaning = yield indexer.ruleIndexGarbageSmallAccounts(HEAD, [ + // A sends 3 to D --> A keeps 100 + { op: 'UPDATE', conditions: 'pubkeyA', amount: 103, base: 0, identifier: 'I1', pos: 0 }, + { op: 'CREATE', conditions: 'pubkeyA', amount: 100, base: 0, identifier: 'I2', pos: 0 }, + { op: 'CREATE', conditions: 'pubkeyD', amount: 3, base: 0, identifier: 'I3', pos: 0 }, + // B sends 5 to D --> B keeps 99 + { op: 'UPDATE', conditions: 'pubkeyB', amount: 14, base: 0, identifier: 'I4', pos: 0 }, + { op: 'CREATE', conditions: 'pubkeyB', amount: 9, base: 0, identifier: 'I5', pos: 0 }, + { op: 'CREATE', conditions: 'pubkeyD', amount: 5, base: 0, identifier: 'I6', pos: 0 }, + { op: 'UPDATE', conditions: 'pubkeyD', amount: 5, base: 0, identifier: 'I6', pos: 0 }, // |-- Chaining transaction + { op: 'CREATE', conditions: 'pubkeyD', amount: 5, base: 0, identifier: 'I7', pos: 0 }, // |-- Chaining transaction + // C sends 100 to E --> C keeps 0 + { op: 'UPDATE', conditions: 'pubkeyC', amount: 100, base: 0, identifier: 'I8', pos: 0 }, + { op: 'CREATE', conditions: 'pubkeyE', amount: 100, base: 0, identifier: 'I9', pos: 0 }, + ], dal); + cleaning.should.have.length(5); + cleaning[0].should.have.property('identifier').equal('I3'); + cleaning[0].should.have.property('amount').equal(3); + cleaning[0].should.have.property('base').equal(0); + cleaning[0].should.have.property('tx').equal(undefined); + cleaning[0].should.have.property('consumed').equal(true); + cleaning[0].should.have.property('op').equal('UPDATE'); + + cleaning[1].should.have.property('identifier').equal('I7'); + cleaning[1].should.have.property('amount').equal(5); + cleaning[1].should.have.property('base').equal(0); + cleaning[1].should.have.property('tx').equal(undefined); + cleaning[1].should.have.property('consumed').equal(true); + cleaning[1].should.have.property('op').equal('UPDATE'); + + cleaning[2].should.have.property('identifier').equal('I5'); + cleaning[2].should.have.property('amount').equal(9); + cleaning[2].should.have.property('base').equal(0); + cleaning[2].should.have.property('tx').equal(undefined); + cleaning[2].should.have.property('consumed').equal(true); + cleaning[2].should.have.property('op').equal('UPDATE'); + + cleaning[3].should.have.property('identifier').equal('I10'); + cleaning[3].should.have.property('amount').equal(22); + cleaning[3].should.have.property('base').equal(0); + cleaning[3].should.have.property('tx').equal('B2'); + cleaning[3].should.have.property('consumed').equal(true); + cleaning[3].should.have.property('op').equal('UPDATE'); + + cleaning[4].should.have.property('identifier').equal('I11'); + cleaning[4].should.have.property('amount').equal(68); + cleaning[4].should.have.property('base').equal(0); + cleaning[4].should.have.property('tx').equal(null); + cleaning[4].should.have.property('consumed').equal(true); + cleaning[4].should.have.property('op').equal('UPDATE'); + })); +}); diff --git a/test/fast/protocol-brg107-udEffectiveTime.js b/test/fast/protocol-brg107-udEffectiveTime.js new file mode 100644 index 0000000000000000000000000000000000000000..b4487b70d0a28981ab8c6420b4f94beea448fecb --- /dev/null +++ b/test/fast/protocol-brg107-udEffectiveTime.js @@ -0,0 +1,40 @@ +"use strict"; +const co = require('co'); +const should = require('should'); +const indexer = require('../../app/lib/indexer'); + +describe("Protocol BR_G107 - udReevalTime", function(){ + + it('root block good udReevalTime', () => co(function*(){ + const conf = { udReevalTime0: 1500000000 }; + const HEAD_1 = null; + const HEAD = { number: 0 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + HEAD.udReevalTime.should.equal(conf.udReevalTime0); + })); + + it('block with medianTime < udReevalTime', () => co(function*(){ + const conf = { dt: 100, dtReeval: 20 }; + const HEAD_1 = { number: 59, udReevalTime: 1500000900 }; + const HEAD = { number: 60, medianTime: 1500000899 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + HEAD.udReevalTime.should.equal(HEAD_1.udReevalTime); + })); + + it('block with medianTime == udReevalTime', () => co(function*(){ + const conf = { dt: 100, dtReeval: 20 }; + const HEAD_1 = { number: 59, udReevalTime: 1500000900 }; + const HEAD = { number: 60, medianTime: 1500000900 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + HEAD.udReevalTime.should.equal(HEAD_1.udReevalTime + conf.dtReeval); + })); + + it('block with medianTime > udReevalTime', () => co(function*(){ + const conf = { dt: 100, dtReeval: 20 }; + const HEAD_1 = { number: 59, udReevalTime: 1500000900 }; + const HEAD = { number: 60, medianTime: 1500000901 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + HEAD.udReevalTime.should.equal(HEAD_1.udReevalTime + conf.dtReeval); + })); + +}); diff --git a/test/fast/protocol-brg11-udTime.js b/test/fast/protocol-brg11-udTime.js new file mode 100644 index 0000000000000000000000000000000000000000..c6745aeec2204cc5ed5540f49f7abd0d18d6a85c --- /dev/null +++ b/test/fast/protocol-brg11-udTime.js @@ -0,0 +1,40 @@ +"use strict"; +const co = require('co'); +const should = require('should'); +const indexer = require('../../app/lib/indexer'); + +describe("Protocol BR_G11 - udTime", function(){ + + it('root block good udTime', () => co(function*(){ + const conf = { udTime0: 1500000000 }; + const HEAD_1 = null; + const HEAD = { number: 0 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + HEAD.udTime.should.equal(conf.udTime0); + })); + + it('block with medianTime < udTime', () => co(function*(){ + const conf = { dt: 100 }; + const HEAD_1 = { number: 59, udTime: 1500000900 }; + const HEAD = { number: 60, medianTime: 1500000899 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + HEAD.udTime.should.equal(HEAD_1.udTime); + })); + + it('block with medianTime == udTime', () => co(function*(){ + const conf = { dt: 100 }; + const HEAD_1 = { number: 59, udTime: 1500000900 }; + const HEAD = { number: 60, medianTime: 1500000900 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + HEAD.udTime.should.equal(HEAD_1.udTime + conf.dt); + })); + + it('block with medianTime > udTime', () => co(function*(){ + const conf = { dt: 100 }; + const HEAD_1 = { number: 59, udTime: 1500000900 }; + const HEAD = { number: 60, medianTime: 1500000901 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + HEAD.udTime.should.equal(HEAD_1.udTime + conf.dt); + })); + +}); diff --git a/test/fast/protocol-brg13-dividend.js b/test/fast/protocol-brg13-dividend.js new file mode 100644 index 0000000000000000000000000000000000000000..cd05682445fd7077f02b596a1fc87c1dfea7e896 --- /dev/null +++ b/test/fast/protocol-brg13-dividend.js @@ -0,0 +1,47 @@ +"use strict"; +const co = require('co'); +const should = require('should'); +const indexer = require('../../app/lib/indexer'); + +describe("Protocol BR_G13 - dividend", function(){ + + it('root block has no dividend', () => co(function*(){ + const conf = { udTime0: 1500000000, dt: 100 }; + const HEAD_1 = null; + const HEAD = { number: 0 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + indexer.prepareDividend(HEAD, HEAD_1, conf); + should.equal(HEAD.dividend, null); + })); + + it('block with medianTime < udTime has no dividend', () => co(function*(){ + const conf = { dt: 100 }; + const HEAD_1 = { number: 59, udTime: 1500000900 }; + const HEAD = { number: 60, medianTime: 1500000899 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + indexer.prepareDividend(HEAD, HEAD_1, conf); + HEAD.udTime.should.equal(HEAD_1.udTime); + should.equal(HEAD.dividend, null); + })); + + it('block with medianTime == udTime', () => co(function*(){ + const conf = { dt: 100, dtReeval: 100, c: 0.0488 }; + const HEAD_1 = { number: 59, udTime: 1500000900, udReevalTime: 1500000900, dividend: 100, mass: 18000, massReeval: 18000, unitBase: 1 }; + const HEAD = { number: 60, medianTime: 1500000900, membersCount: 3 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + indexer.prepareDividend(HEAD, HEAD_1, conf); + HEAD.udTime.should.equal(HEAD_1.udTime + conf.dt); + should.equal(HEAD.dividend, 102); + })); + + it('block with medianTime > udTime', () => co(function*(){ + const conf = { dt: 100, dtReeval: 100, c: 0.0488 }; + const HEAD_1 = { number: 59, udTime: 1500000900, udReevalTime: 1500000900, dividend: 100, mass: 18000, massReeval: 18000, unitBase: 1 }; + const HEAD = { number: 60, medianTime: 1500000901, membersCount: 3 }; + indexer.prepareUDTime(HEAD, HEAD_1, conf); + indexer.prepareDividend(HEAD, HEAD_1, conf); + HEAD.udTime.should.equal(HEAD_1.udTime + conf.dt); + should.equal(HEAD.dividend, 102); + })); + +}); diff --git a/test/fast/protocol-brg49-version.js b/test/fast/protocol-brg49-version.js new file mode 100644 index 0000000000000000000000000000000000000000..1121aedbc9a242606d7f8f00031bcbc5fc188c72 --- /dev/null +++ b/test/fast/protocol-brg49-version.js @@ -0,0 +1,34 @@ +"use strict"; +const co = require('co'); +const should = require('should'); +const indexer = require('../../app/lib/indexer'); + +const FAIL = false; +const SUCCESS = true; + +describe("Protocol BR_G49 - Version", function(){ + + it('V13 following V12 should fail', () => co(function*(){ + const HEAD_1 = { number: 17, version: 13 }; + const HEAD = { number: 18, version: 12 }; + indexer.ruleVersion(HEAD, HEAD_1).should.equal(FAIL); + })); + + it('V14 following V12 should fail', () => co(function*(){ + const HEAD_1 = { number: 17, version: 14 }; + const HEAD = { number: 18, version: 12 }; + indexer.ruleVersion(HEAD, HEAD_1).should.equal(FAIL); + })); + + it('V13 following V14 should succeed', () => co(function*(){ + const HEAD_1 = { number: 17, version: 13 }; + const HEAD = { number: 18, version: 14 }; + indexer.ruleVersion(HEAD, HEAD_1).should.equal(SUCCESS); + })); + + it('V13 following V15 should fail', () => co(function*(){ + const HEAD_1 = { number: 17, version: 13 }; + const HEAD = { number: 18, version: 15 }; + indexer.ruleVersion(HEAD, HEAD_1).should.equal(FAIL); + })); +}); diff --git a/test/fast/protocol-brg50-blocksize.js b/test/fast/protocol-brg50-blocksize.js new file mode 100644 index 0000000000000000000000000000000000000000..8f4951e88a2d401802512dec4a8951c6a0ddc3cf --- /dev/null +++ b/test/fast/protocol-brg50-blocksize.js @@ -0,0 +1,55 @@ +"use strict"; +const co = require('co'); +const should = require('should'); +const indexer = require('../../app/lib/indexer'); + +const FAIL = false; +const SUCCESS = true; + +describe("Protocol BR_G50 - Block size", function(){ + + it('2 for an AVG(10) should succeed', () => co(function*(){ + const HEAD = { number: 24, bsize: 2, avgBlockSize: 10 }; + indexer.ruleBlockSize(HEAD).should.equal(SUCCESS); + })); + + it('400 for an AVG(10) should succeed', () => co(function*(){ + const HEAD = { number: 24, bsize: 400, avgBlockSize: 10 }; + indexer.ruleBlockSize(HEAD).should.equal(SUCCESS); + })); + + it('499 for an AVG(10) should succeed', () => co(function*(){ + const HEAD = { number: 24, bsize: 499, avgBlockSize: 10 }; + indexer.ruleBlockSize(HEAD).should.equal(SUCCESS); + })); + + it('500 for an AVG(10) should fail', () => co(function*(){ + const HEAD = { number: 24, bsize: 500, avgBlockSize: 10 }; + indexer.ruleBlockSize(HEAD).should.equal(FAIL); + })); + + it('500 for an AVG(454) should fail', () => co(function*(){ + const HEAD = { number: 24, bsize: 500, avgBlockSize: 454 }; + indexer.ruleBlockSize(HEAD).should.equal(FAIL); + })); + + it('500 for an AVG(455) should succeed', () => co(function*(){ + const HEAD = { number: 24, bsize: 500, avgBlockSize: 455 }; + indexer.ruleBlockSize(HEAD).should.equal(SUCCESS); + })); + + it('1100 for an AVG(1000) should fail', () => co(function*(){ + const HEAD = { number: 24, bsize: 1100, avgBlockSize: 1000 }; + indexer.ruleBlockSize(HEAD).should.equal(FAIL); + })); + + it('1100 for an AVG(1001) should succeed', () => co(function*(){ + const HEAD = { number: 24, bsize: 1100, avgBlockSize: 1001 }; + indexer.ruleBlockSize(HEAD).should.equal(SUCCESS); + })); + + it('1100 for block#0 should succeed', () => co(function*(){ + const HEAD = { number: 0, bsize: 1100, avgBlockSize: 0 }; + indexer.ruleBlockSize(HEAD).should.equal(SUCCESS); + })); +}); diff --git a/test/fast/protocol-brg51-number.js b/test/fast/protocol-brg51-number.js new file mode 100644 index 0000000000000000000000000000000000000000..27e76e5aa3d7452c57e927bce7d1fece6217ef91 --- /dev/null +++ b/test/fast/protocol-brg51-number.js @@ -0,0 +1,67 @@ +"use strict"; +const co = require('co'); +const should = require('should'); +const indexer = require('../../app/lib/indexer'); + +const FAIL = false; +const SUCCESS = true; + +describe("Protocol BR_G51 - Number", function(){ + + it('1 following 1 should fail', () => co(function*(){ + const block = { number: 1 }; + const HEAD_1 = { number: 1 }; + const HEAD = {}; + indexer.prepareNumber(HEAD, HEAD_1); + indexer.ruleNumber(block, HEAD).should.equal(FAIL); + })); + + it('1 following 0 should succeed', () => co(function*(){ + const block = { number: 1 }; + const HEAD_1 = { number: 0 }; + const HEAD = {}; + indexer.prepareNumber(HEAD, HEAD_1); + indexer.ruleNumber(block, HEAD).should.equal(SUCCESS); + })); + + it('0 following 0 should fail', () => co(function*(){ + const block = { number: 0 }; + const HEAD_1 = { number: 0 }; + const HEAD = {}; + indexer.prepareNumber(HEAD, HEAD_1); + indexer.ruleNumber(block, HEAD).should.equal(FAIL); + })); + + it('0 following nothing should succeed', () => co(function*(){ + const block = { number: 0 }; + const HEAD_1 = null; + const HEAD = {}; + indexer.prepareNumber(HEAD, HEAD_1); + indexer.ruleNumber(block, HEAD).should.equal(SUCCESS); + })); + + it('4 following nothing should fail', () => co(function*(){ + const block = { number: 4 }; + const HEAD_1 = null; + const HEAD = {}; + indexer.prepareNumber(HEAD, HEAD_1); + indexer.ruleNumber(block, HEAD).should.equal(FAIL); + })); + + it('4 following 2 should fail', () => co(function*(){ + const block = { number: 4 }; + const HEAD_1 = { number: 2 }; + const HEAD = {}; + indexer.prepareNumber(HEAD, HEAD_1); + indexer.ruleNumber(block, HEAD).should.equal(FAIL); + })); + + it('4 following 3 should succeed', () => co(function*(){ + const block = { number: 4 }; + const HEAD_1 = { number: 3 }; + const HEAD = {}; + indexer.prepareNumber(HEAD, HEAD_1); + indexer.ruleNumber(block, HEAD).should.equal(SUCCESS); + })); + +}); diff --git a/test/fast/v1.0-local-index.js b/test/fast/v1.0-local-index.js new file mode 100644 index 0000000000000000000000000000000000000000..2af4f3996904f56426f4ed4a5c9038b3d4468a1c --- /dev/null +++ b/test/fast/v1.0-local-index.js @@ -0,0 +1,158 @@ +"use strict"; + +const _ = require('underscore'); +const should = require('should'); +const parsers = require('duniter-common').parsers; +const indexer = require('../../app/lib/indexer'); +const constants = require('duniter-common').constants; + +const raw = "Version: 10\n" + + "Type: Block\n" + + "Currency: beta_brousouf\n" + + "Number: 10\n" + + "PoWMin: 1\n" + + "Time: 1411785481\n" + + "MedianTime: 1411776000\n" + + "UnitBase: 2\n" + + "Issuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "IssuersFrame: 100\n" + + "IssuersFrameVar: 0\n" + + "DifferentIssuersCount: 3\n" + + "PreviousHash: 2A27BD040B16B7AF59DDD88890E616987F4DD28AA47B9ABDBBEE46257B88E945\n" + + "PreviousIssuer: HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd\n" + + "MembersCount: 3\n" + + "Identities:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:CTmlh3tO4B8f8IbL8iDy5ZEr3jZDcxkPmDmRPQY74C39MRLXi0CKUP+oFzTZPYmyUC7fZrUXrb3LwRKWw1jEBQ==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "Joiners:\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:cat\n" + + "65dKz7JEvZzy6Znr9hATtvm7Kd9fCwxhWKgyrbyL2jhX:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "Actives:\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:ze+ftHWFLYmjfvXyrx4a15N2VQjf6oen8kkMiYNYrVllbpb5IUcb28CenlOQbVd9cZCNGSkTP7xP5bt8KAqUAw==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:toc\n" + + "Leavers:\n" + + "HEgBcwtkrnWBgwDqELYht6aBZrmjm8jQY4DtFRjcB437:25xK7+ph7IYeN9Hu8PvuIBjYdVURYtvKayPHZg7zrrYTs6ii2fMtk5J65a3bT/NKr2Qsd7I5TCL29QyiAXa7BA==:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855:tac\n" + + "Revoked:\n" + + "EKWJvwPaYuLTv1VoCEtZLmtUTxTC5gWVfdWeRgKgZChN:iSQvl1VVc6+b1AUaBJ/VTTurGGHgaIcjASBhIlzI7M/7KVQV2Wi3oGUZUzLWqCAtGUsPcsj1HCV2/sRyxHmqAw==\n" + + "Excluded:\n" + + "EKWJvwPaYuLTv1VoCEtZLmtUTxTC5gWVfdWeRgKgZChN\n" + + "BNmj8fnZuDtpvismiWnFneJkPHpB98bZdc5ozNYzBW78\n" + + "Certifications:\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:CK6UDDJM3d0weE1RVtzFJnw/+J507lPAtspleHc59T4+N1tzQj1RRGWrzPiTknCjnCO6SxBSJX0B+MIUWrpNAw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:0:a7SFapoVaXq27NU+wZj4afmxp0SbwLGqLJih8pfX6TRKPvNp/V93fbKixbqg10cwa1CadNenztxq3ZgOivqADw==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:bJyoM2Tz4hltVXkLvYHOOmLP4qqh2fx7aMLkS5q0cMoEg5AFER3iETj13uoFyhz8yiAKESyAZSDjjQwp8A1QDw==\n" + + "F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:0:h8D/dx/z5K2dx06ktp7fnmLRdxkdV5wRkJgnmEvKy2k55mM2RyREpHfD7t/1CC5Ew+UD0V9N27PfaoLxZc1KCQ==\n" + + "HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd:F5PtTpt8QFYMGtpZaETygB2C2yxCSxH1UW1VopBNZ6qg:0:eefk9Gg0Ijz0GvrNnRc55CCCBd4yk8j0fNzWzVZFKR3kZ7lsKav6dWyAsaVhlNG5S6XwEwvPoMwKJq1Vn7OjBg==\n" + + "Transactions:\n" + + "TX:10:1:6:6:8:1:0\n" + + "33753-0000054FC8AC7B450BA7D8BA7ED873FEDD5BF1E98D5D3B0DEE38DED55CB80CB3\n" + + "G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU\n" + + "150605:3:T:01B1AB40E7C1021712FF40D5605037C0ACEECA547BF519ABDCB6473A9F6BDF45:1\n" + + "297705:3:D:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:33530\n" + + "2244725:3:T:507CBE120DB654645B55431A9967789ACB7CD260EA962B839F1708834D1E5491:0\n" + + "972091:2:D:G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU:30324\n" + + "3808457:2:T:657229C5433FB9FFE64BF2E795E79DA796E0B1AF536DC740ECC26CCBBE104C33:1\n" + + "4:2:T:507CBE120DB654645B55431A9967789ACB7CD260EA962B839F1708834D1E5491:1\n" + + "0:SIG(0)\n" + + "1:SIG(0)\n" + + "2:SIG(0)\n" + + "3:SIG(0)\n" + + "4:SIG(0)\n" + + "5:SIG(0)\n" + + "3171064:3:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of)\n" + + "3:2:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of)\n" + + "4:1:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of)\n" + + "8:0:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of)\n" + + "25:3:SIG(G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU)\n" + + "8:2:SIG(G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU)\n" + + "5:1:SIG(G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU)\n" + + "2:0:SIG(G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU)\n" + + "all 10.6517\n" + + "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r\n" + + "TX:10:1:1:1:1:0:0\n" + + "5-2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326\n" + + "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY\n" + + "10:3:T:2C31D8915801E759F6D4FF3DA8DA983D7D56DCF4F8D94619FCFAD4B128362326:88\n" + + "0:SIG(0)\n" + + "1:4:SIG(BYfWYFrsyjpvpFysgu19rGK3VHBkz4MqmQbNyEuVU64g)\n" + + "I6gJkJIQJ9vwDRXZ6kdBsOArQ3zzMYPmFxDbJqseBVq5NWlmJ7l7oY9iWtqhPF38rp7/iitbgyftsRR8djOGDg==\n" + + "InnerHash: DE837CA3F49C423A6A6C124819ABA31A41C1C4A4E2728B5721DF891B98FA8D0D\n" + + "Nonce: 1\n" + + "kNsKdC8eH0d4zdHh1djyMzRXjFrwk3Bc3M8wo4DV/7clE9J66K/U0FljyS79SI78ZZUPaVmrImKJ9SNiubCiBg==\n"; + +describe("v1.0 Local Index", function(){ + + let block, index; + + before(() => { + block = parsers.parseBlock.syncWrite(raw); + index = indexer.localIndex(block, { sigValidity: 100, msValidity: 40 }); + }); + + it('should have 30 index entries', () => { + index.should.have.length(30); + }); + + /********* + * IINDEX + ********/ + + it('should have 4 iindex entries', () => { + _(index).where({ index: constants.I_INDEX}).should.have.length(4); + }); + + it('should have 1 iindex CREATE entries', () => { + _(index).where({ index: constants.I_INDEX, op: constants.IDX_CREATE }).should.have.length(1); + }); + + it('should have 3 iindex UPDATE entries', () => { + _(index).where({ index: constants.I_INDEX, op: constants.IDX_UPDATE }).should.have.length(3); + }); + + /********* + * MINDEX + ********/ + + it('should have 5 mindex entries', () => { + _(index).where({ index: constants.M_INDEX}).should.have.length(5); + }); + + it('should have 1 mindex CREATE entries', () => { + _(index).where({ index: constants.M_INDEX, op: constants.IDX_CREATE }).should.have.length(1); + }); + + it('should have 4 mindex UPDATE entries', () => { + _(index).where({ index: constants.M_INDEX, op: constants.IDX_UPDATE }).should.have.length(4); + }); + + /********* + * CINDEX + ********/ + + it('should have 5 cindex entries', () => { + _(index).where({ index: constants.C_INDEX}).should.have.length(5); + }); + + it('should have 5 cindex CREATE entries', () => { + _(index).where({ index: constants.C_INDEX, op: constants.IDX_CREATE }).should.have.length(5); + }); + + it('should have 0 cindex UPDATE entries', () => { + _(index).where({ index: constants.C_INDEX, op: constants.IDX_UPDATE }).should.have.length(0); + }); + + /********* + * SINDEX + ********/ + + it('should have 16 cindex entries', () => { + _(index).where({ index: constants.S_INDEX}).should.have.length(16); + }); + + it('should have 9 cindex CREATE entries', () => { + _(index).where({ index: constants.S_INDEX, op: constants.IDX_CREATE }).should.have.length(9); + }); + + it('should have 7 cindex UPDATE entries', () => { + _(index).where({ index: constants.S_INDEX, op: constants.IDX_UPDATE }).should.have.length(7); + }); + +}); diff --git a/yarn.lock b/yarn.lock index d3c1fba6d29693793fed936ef98a20b169279cbe..a140cfcecbf063aa195e735fce989e81a43615ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -233,12 +233,6 @@ base-x@^2.0.1: dependencies: safe-buffer "^5.0.1" -base-x@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.2.tgz#bf873861b7514279b7969f340929eab87c11d130" - dependencies: - safe-buffer "^5.0.1" - basic-auth@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" @@ -322,18 +316,12 @@ brace-expansion@^1.0.0, brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -bs58@4.0.0: +bs58@4.0.0, bs58@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.0.tgz#65f5deaf6d74e6135a99f763ca6209ab424b9172" dependencies: base-x "^2.0.1" -bs58@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - dependencies: - base-x "^3.0.2" - buffer-crc32@^0.2.1: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -755,7 +743,7 @@ duniter-bma@1.3.x: underscore "1.8.3" ws "1.1.1" -duniter-common@1.3.x, duniter-common@^1.3.0, duniter-common@^1.3.5: +duniter-common@1.3.x, duniter-common@^1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/duniter-common/-/duniter-common-1.3.5.tgz#b727117a2c9463d0486b7c0feb845df60b65e247" dependencies: @@ -767,6 +755,18 @@ duniter-common@1.3.x, duniter-common@^1.3.0, duniter-common@^1.3.5: tweetnacl "0.14.3" underscore "1.8.3" +duniter-common@1.4.x: + version "1.4.1" + resolved "https://registry.yarnpkg.com/duniter-common/-/duniter-common-1.4.1.tgz#e2093478ca3367d3ecb9b3b6891122c1054e95c4" + dependencies: + bs58 "^4.0.0" + co "4.6.0" + jison "0.4.17" + naclb "1.3.9" + seedrandom "^2.4.3" + tweetnacl "0.14.3" + underscore "1.8.3" + duniter-crawler@1.3.x: version "1.3.7" resolved "https://registry.yarnpkg.com/duniter-crawler/-/duniter-crawler-1.3.7.tgz#1f3226566e8ab1557cbe15f08fed22bef3ea5f3d" @@ -1761,20 +1761,13 @@ js-yaml@3.0.1: argparse "~ 0.1.11" esprima "~ 1.0.2" -js-yaml@3.8.2: +js-yaml@3.8.2, js-yaml@3.x, js-yaml@^3.2.5, js-yaml@^3.5.1: version "3.8.2" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.2.tgz#02d3e2c0f6beab20248d412c352203827d786721" dependencies: argparse "^1.0.7" esprima "^3.1.1" -js-yaml@3.x, js-yaml@^3.2.5, js-yaml@^3.5.1: - version "3.8.4" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" - dependencies: - argparse "^1.0.7" - esprima "^3.1.1" - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"