Commit 443cd527 authored by Eriksson Monteiro's avatar Eriksson Monteiro

update millix node

parent e2d9fc68
import database from '../../database/database';
import Endpoint from '../endpoint';
import genesisConfig from '../../core/genesis/genesis-config';
import _ from 'lodash';
/**
* api get_known_wallet_balance
*/
class _NPCpnfUyPHRH4j29 extends Endpoint {
constructor() {
super('NPCpnfUyPHRH4j29');
}
/**
* returns the available (stable) balance and pending (unstable) balance of
* all known wallet
* @param app
* @param req
* @param res
* @returns {*}
*/
handler(app, req, res) {
const transactionRepository = database.getRepository('transaction', genesisConfig.genesis_shard_id);
transactionRepository.getAllWalletBalance(true)
.then(stableBalance => {
const balance = {};
return transactionRepository.getAllWalletBalance(false)
.then(pendingBalance => {
_.each(stableBalance, item => balance[item.address_key_identifier] = {
...item,
balance_pending: _.find(pendingBalance, {address_key_identifier: item.address_key_identifier})?.balance_pending || 0
});
_.each(pendingBalance, item => {
if (!balance[item.address_key_identifier]) {
balance[item.address_key_identifier] = {
address_key_identifier: item.address_key_identifier,
balance_stable : 0,
balance_pending : item.balance_pending
};
}
});
res.send(_.values(balance));
});
})
.catch(e => res.send({
api_status : 'fail',
api_message: `unexpected generic api error: (${e})`
}));
}
}
export default new _NPCpnfUyPHRH4j29();
...@@ -4,6 +4,7 @@ import database from '../../database/database'; ...@@ -4,6 +4,7 @@ import database from '../../database/database';
import _ from 'lodash'; import _ from 'lodash';
import network from '../../net/network'; import network from '../../net/network';
import logManager from '../../core/log-manager'; import logManager from '../../core/log-manager';
import genesisConfig from '../../core/genesis/genesis-config';
/** /**
...@@ -31,7 +32,12 @@ class _rKclyiLtHx0dx55M extends Endpoint { ...@@ -31,7 +32,12 @@ class _rKclyiLtHx0dx55M extends Endpoint {
return transactionRepository.getWalletBalance(wallet.defaultKeyIdentifier, false); return transactionRepository.getWalletBalance(wallet.defaultKeyIdentifier, false);
}).then(balances => _.sum(balances)).then(unstable => { }).then(balances => _.sum(balances)).then(unstable => {
return wallet.getTransactionCount().then(transactionCount => { return wallet.getTransactionCount().then(transactionCount => {
return database.getRepository('transaction').countWalletUnstableTransactions(wallet.defaultKeyIdentifier).then(pendingTransactionCount => { const transactionRepository = database.getRepository('transaction', genesisConfig.genesis_shard_id);
return transactionRepository.countWalletUnstableTransactions(wallet.defaultKeyIdentifier).then(pendingTransactionCount => {
return transactionRepository.countAllUnstableTransactions()
.then(countAllUnstableTransactions => {
return transactionRepository.countAllTransactions()
.then(countAllTransactions => {
res.send({ res.send({
balance : { balance : {
stable, stable,
...@@ -46,13 +52,17 @@ class _rKclyiLtHx0dx55M extends Endpoint { ...@@ -46,13 +52,17 @@ class _rKclyiLtHx0dx55M extends Endpoint {
backlog_count: logManager.backLogSize backlog_count: logManager.backLogSize
}, },
transaction: { transaction: {
transaction_count : transactionCount, transaction_count : countAllTransactions,
transaction_pending_validation: pendingTransactionCount transaction_unstable_count : countAllUnstableTransactions,
transaction_wallet_count : transactionCount,
transaction_wallet_unstable_count: pendingTransactionCount
} }
}); });
}); });
}); });
}); });
});
});
}).catch(e => res.send({ }).catch(e => res.send({
api_status : 'fail', api_status : 'fail',
api_message: `unexpected generic api error: (${e})` api_message: `unexpected generic api error: (${e})`
......
import database from '../../database/database';
import Endpoint from '../endpoint';
import genesisConfig from '../../core/genesis/genesis-config';
import _ from 'lodash';
/**
* api get_known_address_balance
*/
class _xGaf7vbfY15TGsSd extends Endpoint {
constructor() {
super('xGaf7vbfY15TGsSd');
}
/**
* returns the available (stable) balance and pending (unstable) balance of
* all known addresses
* @param app
* @param req
* @param res
* @returns {*}
*/
handler(app, req, res) {
const transactionRepository = database.getRepository('transaction', genesisConfig.genesis_shard_id);
transactionRepository.getAllAddressBalance(true)
.then(stableBalance => {
const balance = {};
return transactionRepository.getAllAddressBalance(false)
.then(pendingBalance => {
_.each(stableBalance, item => balance[item.address] = {
...item,
balance_pending: _.find(pendingBalance, {address: item.address})?.balance_pending || 0
});
_.each(pendingBalance, item => {
if (!balance[item.address]) {
balance[item.address] = {
address : item.address,
balance_stable : 0,
balance_pending: item.balance_pending
};
}
else {
balance[item.address]['balance_pending'] = item.balance_pending;
}
});
res.send(_.values(balance));
});
})
.catch(e => res.send({
api_status : 'fail',
api_message: `unexpected generic api error: (${e})`
}));
}
}
export default new _xGaf7vbfY15TGsSd();
...@@ -440,6 +440,24 @@ ...@@ -440,6 +440,24 @@
"version_released": "1.11.5", "version_released": "1.11.5",
"permission": "{\"require_identity\": true, \"private\": true}", "permission": "{\"require_identity\": true, \"private\": true}",
"enable": true "enable": true
},
{
"id": "NPCpnfUyPHRH4j29",
"name": "get_known_wallet_balance",
"description": "returns the available (stable) balance and pending (unstable) balance of all known wallet",
"method": "GET",
"version_released": "1.11.5",
"permission": "{\"require_identity\": true, \"private\": true}",
"enable": true
},
{
"id": "xGaf7vbfY15TGsSd",
"name": "get_known_address_balance",
"description": "returns the available (stable) balance and pending (unstable) balance of all known addresses",
"method": "GET",
"version_released": "1.11.5",
"permission": "{\"require_identity\": true, \"private\": true}",
"enable": true
} }
] ]
} }
...@@ -709,14 +709,14 @@ export const NODE_CONNECTION_INBOUND_WHITELIST = []; ...@@ -709,14 +709,14 @@ export const NODE_CONNECTION_INBOUND_WHITELIST = [];
export const NODE_CONNECTION_OUTBOUND_WHITELIST = []; export const NODE_CONNECTION_OUTBOUND_WHITELIST = [];
export const NODE_CONNECTION_STATIC = []; export const NODE_CONNECTION_STATIC = [];
export const NODE_INITIAL_LIST = MODE_TEST_NETWORK ? NODE_INITIAL_LIST_TEST_NETWORK : NODE_INITIAL_LIST_MAIN_NETWORK; export const NODE_INITIAL_LIST = MODE_TEST_NETWORK ? NODE_INITIAL_LIST_TEST_NETWORK : NODE_INITIAL_LIST_MAIN_NETWORK;
export const CONSENSUS_ROUND_NODE_COUNT = 3; export const CONSENSUS_ROUND_NODE_COUNT = 12;
export const CONSENSUS_ROUND_VALIDATION_REQUIRED = 2; export const CONSENSUS_ROUND_VALIDATION_REQUIRED = 3;
export const CONSENSUS_ROUND_VALIDATION_MAX = 5; export const CONSENSUS_ROUND_VALIDATION_MAX = 3;
export const CONSENSUS_ROUND_NOT_FOUND_MAX = 5; export const CONSENSUS_ROUND_NOT_FOUND_MAX = 3;
export const CONSENSUS_ROUND_DOUBLE_SPEND_MAX = 5; export const CONSENSUS_ROUND_DOUBLE_SPEND_MAX = 3;
export const CONSENSUS_VALIDATION_DEPTH_MAX = 50; export const CONSENSUS_VALIDATION_DEPTH_MAX = 50;
export const CONSENSUS_VALIDATION_REQUEST_DEPTH_MAX = 10000; export const CONSENSUS_VALIDATION_REQUEST_DEPTH_MAX = 10000;
export const CONSENSUS_VALIDATION_WAIT_TIME_MAX = 30 * 1000; export const CONSENSUS_VALIDATION_WAIT_TIME_MAX = 15 * 1000;
export const CONSENSUS_VALIDATION_RETRY_WAIT_TIME = 10 * 1000; export const CONSENSUS_VALIDATION_RETRY_WAIT_TIME = 10 * 1000;
export const CONSENSUS_VALIDATION_PARALLEL_PROCESS_MAX = 2; export const CONSENSUS_VALIDATION_PARALLEL_PROCESS_MAX = 2;
export const CONSENSUS_VALIDATION_PARALLEL_REQUEST_MAX = 2; export const CONSENSUS_VALIDATION_PARALLEL_REQUEST_MAX = 2;
...@@ -734,8 +734,8 @@ export const TRANSACTION_SIGNATURE_MAX = 128; ...@@ -734,8 +734,8 @@ export const TRANSACTION_SIGNATURE_MAX = 128;
export const TRANSACTION_PROGRESSIVE_SYNC_TIMESPAN = 60; export const TRANSACTION_PROGRESSIVE_SYNC_TIMESPAN = 60;
export const TRANSACTION_OUTPUT_REFRESH_OLDER_THAN = 10; export const TRANSACTION_OUTPUT_REFRESH_OLDER_THAN = 10;
export const TRANSACTION_OUTPUT_EXPIRE_OLDER_THAN = 10; export const TRANSACTION_OUTPUT_EXPIRE_OLDER_THAN = 10;
export const NODE_CONNECTION_INBOUND_MAX = 30; export const NODE_CONNECTION_INBOUND_MAX = 60;
export const NODE_CONNECTION_OUTBOUND_MAX = 30; export const NODE_CONNECTION_OUTBOUND_MAX = 60;
export const NODE_CONNECTION_PUBLIC_PERCENT = 0.2; export const NODE_CONNECTION_PUBLIC_PERCENT = 0.2;
export const HEARTBEAT_TIMEOUT = 10 * 1000; export const HEARTBEAT_TIMEOUT = 10 * 1000;
export const HEARTBEAT_RESPONSE_TIMEOUT = 60 * 1000; export const HEARTBEAT_RESPONSE_TIMEOUT = 60 * 1000;
...@@ -772,7 +772,7 @@ export const DATABASE_ENGINE = 'sqlite'; ...@@ -772,7 +772,7 @@ export const DATABASE_ENGINE = 'sqlite';
export const DATABASE_CONNECTION = {}; export const DATABASE_CONNECTION = {};
export const MILLIX_CIRCULATION = 9e15; export const MILLIX_CIRCULATION = 9e15;
export const NODE_MILLIX_BUILD_DATE = 1631097631; export const NODE_MILLIX_BUILD_DATE = 1631097631;
export const NODE_MILLIX_VERSION = '1.11.8-tangled'; export const NODE_MILLIX_VERSION = '1.11.10-tangled';
export const DATA_BASE_DIR_MAIN_NETWORK = './millix-tangled'; export const DATA_BASE_DIR_MAIN_NETWORK = './millix-tangled';
export const DATA_BASE_DIR_TEST_NETWORK = './millix-tangled'; export const DATA_BASE_DIR_TEST_NETWORK = './millix-tangled';
let DATA_BASE_DIR = MODE_TEST_NETWORK ? DATA_BASE_DIR_TEST_NETWORK : DATA_BASE_DIR_MAIN_NETWORK; let DATA_BASE_DIR = MODE_TEST_NETWORK ? DATA_BASE_DIR_TEST_NETWORK : DATA_BASE_DIR_MAIN_NETWORK;
...@@ -809,6 +809,7 @@ if (DATABASE_ENGINE === 'sqlite') { ...@@ -809,6 +809,7 @@ if (DATABASE_ENGINE === 'sqlite') {
DATABASE_CONNECTION.FILENAME_MILLIX = 'millix.sqlite'; DATABASE_CONNECTION.FILENAME_MILLIX = 'millix.sqlite';
DATABASE_CONNECTION.FILENAME_TRANSACTION_QUEUE = 'millix_transaction_queue.sqlite'; DATABASE_CONNECTION.FILENAME_TRANSACTION_QUEUE = 'millix_transaction_queue.sqlite';
DATABASE_CONNECTION.FILENAME_TRANSACTION_SPEND_QUEUE = 'millix_transaction_spend_queue.sqlite'; DATABASE_CONNECTION.FILENAME_TRANSACTION_SPEND_QUEUE = 'millix_transaction_spend_queue.sqlite';
DATABASE_CONNECTION.FILENAME_TRANSACTION_SPEND_WALLET_QUEUE = 'millix_transaction_spend_wallet_queue.sqlite';
DATABASE_CONNECTION.FILENAME_TRANSACTION_UNRESOLVED_QUEUE = 'millix_transaction_unresolved_queue.sqlite'; DATABASE_CONNECTION.FILENAME_TRANSACTION_UNRESOLVED_QUEUE = 'millix_transaction_unresolved_queue.sqlite';
DATABASE_CONNECTION.FILENAME_JOB_ENGINE = 'millix_job_engine.sqlite'; DATABASE_CONNECTION.FILENAME_JOB_ENGINE = 'millix_job_engine.sqlite';
DATABASE_CONNECTION.SCRIPT_INIT_MILLIX = './scripts/initialize-millix-sqlite3.sql'; DATABASE_CONNECTION.SCRIPT_INIT_MILLIX = './scripts/initialize-millix-sqlite3.sql';
......
This diff is collapsed.
...@@ -380,13 +380,8 @@ class Wallet { ...@@ -380,13 +380,8 @@ class Wallet {
.catch((e) => { .catch((e) => {
this._transactionSendInterrupt = false; this._transactionSendInterrupt = false;
if (e === 'proxy_not_found') { if (e === 'transaction_proxy_rejected') {
async.eachSeries(transactionOutputIDSpent, (transactionID, callback) => { this.resetTransactionValidationRejected();
database.applyShards((shardID) => {
const transactionRepository = database.getRepository('transaction', shardID);
return transactionRepository.resetTransaction(transactionID);
}).then(_ => callback());
});
} }
reject(e); reject(e);
...@@ -569,13 +564,44 @@ class Wallet { ...@@ -569,13 +564,44 @@ class Wallet {
walletTransactionConsensus.resetTransactionValidationRejected(); walletTransactionConsensus.resetTransactionValidationRejected();
database.applyShards(shardID => { database.applyShards(shardID => {
const transactionRepository = database.getRepository('transaction', shardID); const transactionRepository = database.getRepository('transaction', shardID);
return transactionRepository.listTransactionWithFreeOutput(this.defaultKeyIdentifier) return transactionRepository.listTransactionWithFreeOutput(this.defaultKeyIdentifier, true)
.then(transactions => new Promise(resolve => { .then(transactions => new Promise(resolve => {
async.eachSeries(transactions, (transaction, callback) => { async.eachSeries(transactions, (transaction, callback) => {
transactionRepository.resetTransaction(transaction.transaction_id) transactionRepository.resetTransaction(transaction.transaction_id)
.then(() => callback()) .then(() => callback())
.catch(() => callback()); .catch(() => callback());
}, () => resolve()); }, () => resolve(new Set(_.map(transactions, t => t.transaction_id))));
}))
.then(rootTransactions => new Promise(resolve => {
const dfs = (transactions, visited = new Set()) => {
const listInputTransactionIdSpendingTransaction = new Set();
async.eachSeries(transactions, (transactionID, callback) => {
transactionRepository.listTransactionInput({'output_transaction_id': transactionID})
.then(inputs => {
inputs.forEach(input => {
if (!visited.has(input.transaction_id)) {
listInputTransactionIdSpendingTransaction.add(input.transaction_id);
visited.add(input.transaction_id);
}
});
callback();
}).catch(() => callback());
}, () => {
async.eachSeries(listInputTransactionIdSpendingTransaction, (transactionID, callback) => {
transactionRepository.resetTransaction(transactionID)
.then(() => callback())
.catch(() => callback());
}, () => {
if (listInputTransactionIdSpendingTransaction.size > 0) {
dfs(listInputTransactionIdSpendingTransaction, visited);
}
else {
resolve();
}
});
});
};
dfs(rootTransactions);
})); }));
}).then(_ => _); }).then(_ => _);
} }
...@@ -783,9 +809,7 @@ class Wallet { ...@@ -783,9 +809,7 @@ class Wallet {
this.transactionSpendRequest(transaction.transaction_id, syncPriority).then(_ => _).catch(_ => _); this.transactionSpendRequest(transaction.transaction_id, syncPriority).then(_ => _).catch(_ => _);
if (isFundingWallet || hasKeyIdentifier) {
walletSync.syncTransactionSpendingOutputs(transaction); walletSync.syncTransactionSpendingOutputs(transaction);
}
if (transaction.transaction_id !== genesisConfig.genesis_transaction) { if (transaction.transaction_id !== genesisConfig.genesis_transaction) {
_.each(transaction.transaction_input_list, inputTransaction => { _.each(transaction.transaction_input_list, inputTransaction => {
...@@ -1563,8 +1587,22 @@ class Wallet { ...@@ -1563,8 +1587,22 @@ class Wallet {
error : true, error : true,
message: e message: e
}) : callback()); }) : callback());
}, data => data && data.error && typeof data.message === 'string' && !proxyErrorList.includes(data.message) ? reject(data.message) : }, data => {
data && data.transaction ? resolve(data.transaction) : reject('proxy_not_found')); if (data && data.error && typeof data.message === 'string' && !proxyErrorList.includes(data.message)) {
reject(data.message);
}
else if (data && data.transaction) {
resolve(data.transaction);
}
else {
if (data && data.error && typeof data.message === 'string' && data.message === 'transaction_proxy_rejected') {
reject('transaction_proxy_rejected');
}
else {
reject('proxy_not_found');
}
}
});
}); });
}); });
} }
......
...@@ -472,6 +472,9 @@ export class Database { ...@@ -472,6 +472,9 @@ export class Database {
} }
if (orderBy) { if (orderBy) {
if(orderBy.trim().split(" ").length === 1) {
orderBy += ' asc';
}
const regExp = /^(?<column>\w+) (?<order>asc|desc)$/.exec(orderBy); const regExp = /^(?<column>\w+) (?<order>asc|desc)$/.exec(orderBy);
if (regExp && regExp.groups && regExp.groups.column && regExp.groups.order) { if (regExp && regExp.groups && regExp.groups.column && regExp.groups.order) {
data = _.orderBy(data, regExp.groups.column, regExp.groups.order); data = _.orderBy(data, regExp.groups.column, regExp.groups.order);
......
...@@ -5,6 +5,7 @@ import {Schema, Transaction} from './repositories/repositories'; ...@@ -5,6 +5,7 @@ import {Schema, Transaction} from './repositories/repositories';
import path from 'path'; import path from 'path';
import {Database} from './database'; import {Database} from './database';
import eventBus from '../core/event-bus'; import eventBus from '../core/event-bus';
import os from 'os';
export default class Shard { export default class Shard {
constructor(databaseFile, shardID) { constructor(databaseFile, shardID) {
...@@ -16,6 +17,7 @@ export default class Shard { ...@@ -16,6 +17,7 @@ export default class Shard {
initialize() { initialize() {
if (config.DATABASE_ENGINE === 'sqlite') { if (config.DATABASE_ENGINE === 'sqlite') {
return this._initializeMillixShardSqlite3() return this._initializeMillixShardSqlite3()
.then(() => this._attachShardZero())
.then(() => this._migrateTables()) .then(() => this._migrateTables())
.then(() => this._initializeTables()); .then(() => this._initializeTables());
} }
...@@ -74,6 +76,19 @@ export default class Shard { ...@@ -74,6 +76,19 @@ export default class Shard {
}); });
} }
_attachShardZero() {
return new Promise((resolve, reject) => {
const databaseRootFolder = path.join(os.homedir(), config.DATABASE_CONNECTION.FOLDER);
const shardZeroDBPath = path.join(databaseRootFolder, config.DATABASE_CONNECTION.FILENAME_MILLIX);
this.database.exec(`ATTACH DATABASE '${shardZeroDBPath}' AS shard_zero`, (err) => {
if (err) {
return reject(err);
}
return resolve();
});
});
}
_initializeMillixShardSqlite3() { _initializeMillixShardSqlite3() {
return new Promise(resolve => { return new Promise(resolve => {
const sqlite3 = require('sqlite3'); const sqlite3 = require('sqlite3');
......
...@@ -126,6 +126,6 @@ db.initialize() ...@@ -126,6 +126,6 @@ db.initialize()
}); });
} }
}); });
//millix v1.11.8-tangled //millix v1.11.10-tangled
\ No newline at end of file
...@@ -677,7 +677,7 @@ class Peer { ...@@ -677,7 +677,7 @@ class Peer {
callbackCalled = true; callbackCalled = true;
reject(); reject();
} }
}, config.NETWORK_LONG_TIME_WAIT_MAX); }, config.NETWORK_LONG_TIME_WAIT_MAX * 3);
} }
else { else {
reject(); reject();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment