Transaction Models and updated config requires
This commit is contained in:
parent
5d7957c5fb
commit
3bf0fe7328
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,6 +1,3 @@
|
|||||||
# Config
|
|
||||||
config/config.js
|
|
||||||
|
|
||||||
## Default gitignore below this line
|
## Default gitignore below this line
|
||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
|
|||||||
20
config/config.js
Normal file
20
config/config.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
const config = {
|
||||||
|
bcoin: {
|
||||||
|
network: 'main',
|
||||||
|
db: 'leveldb',
|
||||||
|
checkpoints: true,
|
||||||
|
workers: true,
|
||||||
|
logLevel: 'info',
|
||||||
|
},
|
||||||
|
mongodb: {
|
||||||
|
uri: 'mongodb://localhost/bitcore',
|
||||||
|
options: {
|
||||||
|
useMongoClient: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
api: {
|
||||||
|
port: 3000,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
2
index.js
2
index.js
@ -1,5 +1,5 @@
|
|||||||
const node = require('./lib/node');
|
const node = require('./lib/node');
|
||||||
const config = require('./config/config.js');
|
const config = require('./config/config');
|
||||||
const logger = require('./lib/logger');
|
const logger = require('./lib/logger');
|
||||||
const Api = require('./lib/api');
|
const Api = require('./lib/api');
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
const express = require('express');
|
const express = require('express');
|
||||||
const app = express();
|
const app = express();
|
||||||
const mongoose = require('mongoose');
|
const mongoose = require('mongoose');
|
||||||
const config = require('../../config/config.js');
|
const config = require('../../config/config');
|
||||||
const Block = require('../../models/block.js');
|
const Block = require('../../models/block.js');
|
||||||
const BLOCK_LIMIT = 200;
|
const BLOCK_LIMIT = 200;
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
const mongoose = require('mongoose');
|
const mongoose = require('mongoose');
|
||||||
const config = require('../../config/config.js');
|
const config = require('../../config/config');
|
||||||
|
|
||||||
mongoose.connect(config.mongodb.uri, config.mongodb.options);
|
mongoose.connect(config.mongodb.uri, config.mongodb.options);
|
||||||
|
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
const FullNode = require('bcoin/lib/node/fullnode');
|
const FullNode = require('bcoin/lib/node/fullnode');
|
||||||
const config = require('../../config/config.js');
|
const config = require('../../config/config');
|
||||||
const node = new FullNode(config.bcoin);
|
const node = new FullNode(config.bcoin);
|
||||||
const BlockSchema = require('../../models/block');
|
|
||||||
const logger = require('../../lib/logger');
|
const logger = require('../../lib/logger');
|
||||||
const db = require('../../lib/db');
|
const db = require('../../lib/db');
|
||||||
const util = require('../../lib/util');
|
const util = require('../../lib/util');
|
||||||
|
const BlockModel = require('../../models/block');
|
||||||
|
const TxModel = require('../../models/transaction');
|
||||||
|
|
||||||
function start() {
|
function start() {
|
||||||
node.open()
|
node.open()
|
||||||
@ -18,39 +18,47 @@ function start() {
|
|||||||
node.chain.on('connect', (entry, block) => {
|
node.chain.on('connect', (entry, block) => {
|
||||||
processBlock(entry, block);
|
processBlock(entry, block);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function processBlock(entry, block, cb) {
|
function processBlock(entry, block, cb) {
|
||||||
block.hash = util.revHex(block.hash().toString('hex'))
|
block.hash = util.revHex(block.hash().toString('hex'));
|
||||||
const b = new BlockSchema({
|
const b = new BlockModel({
|
||||||
hash: block.hash,
|
hash: block.hash,
|
||||||
size: block.size,
|
size: block.size,
|
||||||
height: block.height,
|
height: block.height,
|
||||||
version: block.version,
|
version: block.version,
|
||||||
merkleRoot: block.merkleRoot,
|
merkleRoot: block.merkleRoot,
|
||||||
tx: block.txs.map(tx => util.revHex(tx.hash().toString('hex'))),
|
tx: block.txs.map((tx) => {
|
||||||
time: block.ts,
|
processTx(tx);
|
||||||
nonce: block.nonce,
|
return util.revHex(tx.hash().toString('hex'));
|
||||||
bits: block.bits,
|
}),
|
||||||
difficulty: block.bits,
|
time: block.ts,
|
||||||
chainwork: entry.chainwork,
|
nonce: block.nonce,
|
||||||
confirmations: 0,
|
bits: block.bits,
|
||||||
previousBlockHash: block.previousBlockHash,
|
difficulty: block.bits,
|
||||||
nextBlockHash: 0,
|
chainwork: entry.chainwork,
|
||||||
reward: 0,
|
confirmations: 0,
|
||||||
timeNormalized: block.ts,
|
previousBlockHash: block.previousBlockHash,
|
||||||
isMainChain: true,
|
nextBlockHash: 0,
|
||||||
poolInfo: Object,
|
reward: 0,
|
||||||
transactionCount: block.txs.length,
|
timeNormalized: block.ts,
|
||||||
});
|
isMainChain: true,
|
||||||
|
poolInfo: Object,
|
||||||
|
transactionCount: block.txs.length,
|
||||||
|
});
|
||||||
|
|
||||||
|
b.save((err) => {
|
||||||
|
if (err) {
|
||||||
|
console.log(err.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function processTx(tx) {
|
||||||
|
console.log(util.revHex(tx.hash().toString('hex')));
|
||||||
|
|
||||||
b.save((err) => {
|
|
||||||
if (err) {
|
|
||||||
console.log(err.message);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
start,
|
start,
|
||||||
}
|
};
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
function revHex(hex) {
|
function revHex(hex) {
|
||||||
let rev = '';
|
let rev = '';
|
||||||
|
for (let i = 0; i < hex.length; i += 2) {
|
||||||
|
rev = hex.slice(i, i + 2) + rev;
|
||||||
|
}
|
||||||
|
|
||||||
return rev;
|
return rev;
|
||||||
}
|
}
|
||||||
|
|||||||
14
models/input.js
Normal file
14
models/input.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
const mongoose = require('mongoose');
|
||||||
|
const Schema = mongoose.Schema;
|
||||||
|
|
||||||
|
const Input = new Schema({
|
||||||
|
utxo: String,
|
||||||
|
vout: Number,
|
||||||
|
address: String,
|
||||||
|
amount: Number,
|
||||||
|
wallets: { type: [Schema.Types.ObjectId] },
|
||||||
|
});
|
||||||
|
|
||||||
|
const Input = mongoose.model('Input', Input);
|
||||||
|
|
||||||
|
module.exports = Input;
|
||||||
13
models/output.js
Normal file
13
models/output.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
const mongoose = require('mongoose');
|
||||||
|
const Schema = mongoose.Schema;
|
||||||
|
|
||||||
|
const Output = new Schema({
|
||||||
|
address: String,
|
||||||
|
amount: Number,
|
||||||
|
vout: Number,
|
||||||
|
wallets: { type: [Schema.Types.ObjectId] },
|
||||||
|
});
|
||||||
|
|
||||||
|
const Output = mongoose.model('Output', Output);
|
||||||
|
|
||||||
|
module.exports = Output;
|
||||||
33
models/transaction.js
Normal file
33
models/transaction.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
const Schema = mongoose.Schema;
|
||||||
|
|
||||||
|
const TransactionSchema = new Schema({
|
||||||
|
txid: String,
|
||||||
|
chain: String,
|
||||||
|
blockHeight: Number,
|
||||||
|
blockHash: String,
|
||||||
|
blockTime: Date,
|
||||||
|
blockTimeNormalized: Date,
|
||||||
|
inputs: [Input],
|
||||||
|
outputs: [Output],
|
||||||
|
coinbase: Boolean,
|
||||||
|
fee: Number,
|
||||||
|
inputsProcessed: Boolean,
|
||||||
|
wallets: { type: [Schema.Types.ObjectId] },
|
||||||
|
});
|
||||||
|
|
||||||
|
TransactionSchema.index({ txid: 1 }, { unique: true });
|
||||||
|
TransactionSchema.index({ blockHeight: 1, wallets: 1 });
|
||||||
|
TransactionSchema.index({ blockHash: 1 });
|
||||||
|
TransactionSchema.index({ blockTime: 1 });
|
||||||
|
TransactionSchema.index({ blockTimeNormalized: 1, wallets: 1 });
|
||||||
|
|
||||||
|
TransactionSchema.index({ 'outputs.address': 1 });
|
||||||
|
TransactionSchema.index({ 'inputs.address': 1 });
|
||||||
|
TransactionSchema.index({ wallets: 1 }, { sparse: true });
|
||||||
|
TransactionSchema.index({ 'inputs.wallets': 1 }, { sparse: true });
|
||||||
|
TransactionSchema.index({ 'outputs.wallets': 1 }, { sparse: true });
|
||||||
|
|
||||||
|
const Block = mongoose.model('Transaction', TransactionSchema);
|
||||||
|
|
||||||
|
module.exports = Block;
|
||||||
|
|
||||||
40
test/data/bcoin-tx.json
Normal file
40
test/data/bcoin-tx.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{ hash: 'ed1be20876b90b857a4ddb32e72f334df997cf45f5a33b3578f0dda65abacd57',
|
||||||
|
witnessHash: 'ed1be20876b90b857a4ddb32e72f334df997cf45f5a33b3578f0dda65abacd57',
|
||||||
|
size: 404,
|
||||||
|
virtualSize: 404,
|
||||||
|
value: '7.49',
|
||||||
|
fee: '0.0',
|
||||||
|
rate: '0.0',
|
||||||
|
minFee: '0.00000404',
|
||||||
|
height: -1,
|
||||||
|
block: null,
|
||||||
|
ts: 0,
|
||||||
|
date: null,
|
||||||
|
index: -1,
|
||||||
|
version: 1,
|
||||||
|
flag: 1,
|
||||||
|
inputs:
|
||||||
|
[ { type: 'pubkeyhash',
|
||||||
|
subtype: undefined,
|
||||||
|
address: <Address: type=pubkeyhash version=-1 str=1C8gfoC9B77sea4buoYNwCBwFxpdCp9TCp>,
|
||||||
|
script: <Script: 0x49 0x3046022100d850be1963dc544faf861827179572cc8989188d9a1e94b68a3ab5453c295432022100da2e198ebc13cee9b706b879e0fc57ebba3b69aba96ab4b5dec0db480c55a11401 0x41 0x046b49c0b7124c4a31dc2f497f9240a04d3898cbeabdc99afafbc9fded9426ce73c23e6a8b9b0a72351c16f86ef1a5750cc5ebddc1ec96e9a10ad9fbf5c46c0e00>,
|
||||||
|
witness: <Witness: >,
|
||||||
|
redeem: undefined,
|
||||||
|
sequence: 4294967295,
|
||||||
|
prevout: <Outpoint: 18b6eb72c8f7df40904b1d8a01f5dd0a1fb2dad7df67a2a7fa18c0a831f001e3/1>,
|
||||||
|
coin: null },
|
||||||
|
{ type: 'pubkeyhash',
|
||||||
|
subtype: undefined,
|
||||||
|
address: <Address: type=pubkeyhash version=-1 str=1C8gfoC9B77sea4buoYNwCBwFxpdCp9TCp>,
|
||||||
|
script: <Script: 0x47 0x304402201b07884070a5af58dbb2239d68c15da533cb44f86691c117f32567c02caa94680220247bce95ecea9ba6a95d72a677fef3f06960a091dd0c52cb084df7adda5adb1a01 0x41 0x046b49c0b7124c4a31dc2f497f9240a04d3898cbeabdc99afafbc9fded9426ce73c23e6a8b9b0a72351c16f86ef1a5750cc5ebddc1ec96e9a10ad9fbf5c46c0e00>,
|
||||||
|
witness: <Witness: >,
|
||||||
|
redeem: undefined,
|
||||||
|
sequence: 4294967295,
|
||||||
|
prevout: <Outpoint: c1b63ca51404d07d2b850c333a20b78a5a25c9eb027c20e72eed6557a4ea367f/1>,
|
||||||
|
coin: null } ],
|
||||||
|
outputs:
|
||||||
|
[ { type: 'pubkeyhash',
|
||||||
|
value: '7.49',
|
||||||
|
script: <Script: OP_DUP OP_HASH160 0x14 0x711df121c2d1132e99df2986fc9086a79d928576 OP_EQUALVERIFY OP_CHECKSIG>,
|
||||||
|
address: <Address: type=pubkeyhash version=-1 str=1BK7E5XRMmboPYnLGSbEUgAJFSGBaebLkN> } ],
|
||||||
|
locktime: 0 }
|
||||||
Loading…
Reference in New Issue
Block a user