Loading app/lib/rules/global_rules.ts +11 −5 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ import {CommonConstants} from "../common-libs/constants" import {IdentityDTO} from "../dto/IdentityDTO" import {hashf} from "../common" import {Indexer} from "../indexer" import {DBTx} from "../dal/sqliteDAL/TxsDAL" const _ = require('underscore') Loading Loading @@ -80,7 +81,7 @@ export const GLOBAL_RULES_FUNCTIONS = { return true; }, checkSourcesAvailability: async (block:{ transactions:TransactionDTO[], medianTime: number }, conf:ConfDTO, dal:FileDAL, alsoCheckPendingTransactions:boolean) => { checkSourcesAvailability: async (block:{ transactions:TransactionDTO[], medianTime: number }, conf:ConfDTO, dal:FileDAL, findSourceTx:(txHash:string) => Promise<DBTx|null>) => { const txs = block.transactions const current = await dal.getCurrentBlockOrNull(); for (const tx of txs) { Loading @@ -98,12 +99,12 @@ export const GLOBAL_RULES_FUNCTIONS = { let src = inputs[k]; let dbSrc = await 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) { if (!dbSrc) { // 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 = await (async () => { let hypotheticSrc:any = null; let targetTX = await dal.getTxByHash(src.identifier); let targetTX = await findSourceTx(src.identifier); if (targetTX) { let outputStr = targetTX.outputs[src.pos]; if (outputStr) { Loading Loading @@ -193,10 +194,15 @@ export const GLOBAL_RULES_HELPERS = { checkExistsPubkey: (pub:string, dal:FileDAL) => dal.getWrittenIdtyByPubkey(pub), checkSingleTransaction: (tx:TransactionDTO, block:{ medianTime: number }, conf:ConfDTO, dal:FileDAL, alsoCheckPendingTransactions:boolean = false) => GLOBAL_RULES_FUNCTIONS.checkSourcesAvailability({ checkSingleTransaction: ( tx:TransactionDTO, block:{ medianTime: number }, conf:ConfDTO, dal:FileDAL, findSourceTx:(txHash:string) => Promise<DBTx|null>) => GLOBAL_RULES_FUNCTIONS.checkSourcesAvailability({ transactions: [tx], medianTime: block.medianTime }, conf, dal, alsoCheckPendingTransactions), }, conf, dal, findSourceTx), checkTxBlockStamp: async (tx:TransactionDTO, dal:FileDAL) => { const number = parseInt(tx.blockstamp.split('-')[0]) Loading app/modules/prover/lib/blockGenerator.ts +9 −8 Original line number Diff line number Diff line Loading @@ -105,7 +105,6 @@ export class BlockGenerator { } private async findTransactions(current:DBBlock, options:{ dontCareAboutChaining?:boolean }) { const ALSO_CHECK_PENDING_TXS = true const versionMin = current ? Math.min(CommonConstants.LAST_VERSION_FOR_TX, current.version) : CommonConstants.DOCUMENTS_VERSION; const txs = await this.dal.getTransactionsPending(versionMin); const transactions = []; Loading @@ -116,7 +115,9 @@ export class BlockGenerator { try { await LOCAL_RULES_HELPERS.checkBunchOfTransactions(passingTxs.concat(tx), this.conf, options) const nextBlockWithFakeTimeVariation = { medianTime: current.medianTime + 1 }; await GLOBAL_RULES_HELPERS.checkSingleTransaction(tx, nextBlockWithFakeTimeVariation, this.conf, this.dal, ALSO_CHECK_PENDING_TXS); await GLOBAL_RULES_HELPERS.checkSingleTransaction(tx, nextBlockWithFakeTimeVariation, this.conf, this.dal, async (txHash:string) => { return _.findWhere(passingTxs, { hash: txHash }) || null }); await GLOBAL_RULES_HELPERS.checkTxBlockStamp(tx, this.dal); transactions.push(tx); passingTxs.push(tx); Loading app/service/TransactionsService.ts +1 −2 Original line number Diff line number Diff line Loading @@ -9,7 +9,6 @@ import {FIFOService} from "./FIFOService"; import {GlobalFifoPromise} from "./GlobalFifoPromise"; const constants = require('../lib/constants'); const CHECK_PENDING_TRANSACTIONS = true export class TransactionService extends FIFOService { Loading Loading @@ -43,7 +42,7 @@ export class TransactionService extends FIFOService { const dto = TransactionDTO.fromJSONObject(tx) await LOCAL_RULES_HELPERS.checkSingleTransactionLocally(dto, this.conf) await GLOBAL_RULES_HELPERS.checkTxBlockStamp(tx, this.dal); await GLOBAL_RULES_HELPERS.checkSingleTransaction(dto, nextBlockWithFakeTimeVariation, this.conf, this.dal, CHECK_PENDING_TRANSACTIONS); await GLOBAL_RULES_HELPERS.checkSingleTransaction(dto, nextBlockWithFakeTimeVariation, this.conf, this.dal, this.dal.getTxByHash.bind(this.dal)); const server_pubkey = this.conf.pair && this.conf.pair.pub; if (!(await this.dal.txsDAL.sandbox.acceptNewSandBoxEntry({ issuers: tx.issuers, Loading Loading
app/lib/rules/global_rules.ts +11 −5 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ import {CommonConstants} from "../common-libs/constants" import {IdentityDTO} from "../dto/IdentityDTO" import {hashf} from "../common" import {Indexer} from "../indexer" import {DBTx} from "../dal/sqliteDAL/TxsDAL" const _ = require('underscore') Loading Loading @@ -80,7 +81,7 @@ export const GLOBAL_RULES_FUNCTIONS = { return true; }, checkSourcesAvailability: async (block:{ transactions:TransactionDTO[], medianTime: number }, conf:ConfDTO, dal:FileDAL, alsoCheckPendingTransactions:boolean) => { checkSourcesAvailability: async (block:{ transactions:TransactionDTO[], medianTime: number }, conf:ConfDTO, dal:FileDAL, findSourceTx:(txHash:string) => Promise<DBTx|null>) => { const txs = block.transactions const current = await dal.getCurrentBlockOrNull(); for (const tx of txs) { Loading @@ -98,12 +99,12 @@ export const GLOBAL_RULES_FUNCTIONS = { let src = inputs[k]; let dbSrc = await 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) { if (!dbSrc) { // 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 = await (async () => { let hypotheticSrc:any = null; let targetTX = await dal.getTxByHash(src.identifier); let targetTX = await findSourceTx(src.identifier); if (targetTX) { let outputStr = targetTX.outputs[src.pos]; if (outputStr) { Loading Loading @@ -193,10 +194,15 @@ export const GLOBAL_RULES_HELPERS = { checkExistsPubkey: (pub:string, dal:FileDAL) => dal.getWrittenIdtyByPubkey(pub), checkSingleTransaction: (tx:TransactionDTO, block:{ medianTime: number }, conf:ConfDTO, dal:FileDAL, alsoCheckPendingTransactions:boolean = false) => GLOBAL_RULES_FUNCTIONS.checkSourcesAvailability({ checkSingleTransaction: ( tx:TransactionDTO, block:{ medianTime: number }, conf:ConfDTO, dal:FileDAL, findSourceTx:(txHash:string) => Promise<DBTx|null>) => GLOBAL_RULES_FUNCTIONS.checkSourcesAvailability({ transactions: [tx], medianTime: block.medianTime }, conf, dal, alsoCheckPendingTransactions), }, conf, dal, findSourceTx), checkTxBlockStamp: async (tx:TransactionDTO, dal:FileDAL) => { const number = parseInt(tx.blockstamp.split('-')[0]) Loading
app/modules/prover/lib/blockGenerator.ts +9 −8 Original line number Diff line number Diff line Loading @@ -105,7 +105,6 @@ export class BlockGenerator { } private async findTransactions(current:DBBlock, options:{ dontCareAboutChaining?:boolean }) { const ALSO_CHECK_PENDING_TXS = true const versionMin = current ? Math.min(CommonConstants.LAST_VERSION_FOR_TX, current.version) : CommonConstants.DOCUMENTS_VERSION; const txs = await this.dal.getTransactionsPending(versionMin); const transactions = []; Loading @@ -116,7 +115,9 @@ export class BlockGenerator { try { await LOCAL_RULES_HELPERS.checkBunchOfTransactions(passingTxs.concat(tx), this.conf, options) const nextBlockWithFakeTimeVariation = { medianTime: current.medianTime + 1 }; await GLOBAL_RULES_HELPERS.checkSingleTransaction(tx, nextBlockWithFakeTimeVariation, this.conf, this.dal, ALSO_CHECK_PENDING_TXS); await GLOBAL_RULES_HELPERS.checkSingleTransaction(tx, nextBlockWithFakeTimeVariation, this.conf, this.dal, async (txHash:string) => { return _.findWhere(passingTxs, { hash: txHash }) || null }); await GLOBAL_RULES_HELPERS.checkTxBlockStamp(tx, this.dal); transactions.push(tx); passingTxs.push(tx); Loading
app/service/TransactionsService.ts +1 −2 Original line number Diff line number Diff line Loading @@ -9,7 +9,6 @@ import {FIFOService} from "./FIFOService"; import {GlobalFifoPromise} from "./GlobalFifoPromise"; const constants = require('../lib/constants'); const CHECK_PENDING_TRANSACTIONS = true export class TransactionService extends FIFOService { Loading Loading @@ -43,7 +42,7 @@ export class TransactionService extends FIFOService { const dto = TransactionDTO.fromJSONObject(tx) await LOCAL_RULES_HELPERS.checkSingleTransactionLocally(dto, this.conf) await GLOBAL_RULES_HELPERS.checkTxBlockStamp(tx, this.dal); await GLOBAL_RULES_HELPERS.checkSingleTransaction(dto, nextBlockWithFakeTimeVariation, this.conf, this.dal, CHECK_PENDING_TRANSACTIONS); await GLOBAL_RULES_HELPERS.checkSingleTransaction(dto, nextBlockWithFakeTimeVariation, this.conf, this.dal, this.dal.getTxByHash.bind(this.dal)); const server_pubkey = this.conf.pair && this.conf.pair.pub; if (!(await this.dal.txsDAL.sandbox.acceptNewSandBoxEntry({ issuers: tx.issuers, Loading