block txs partially wired up

This commit is contained in:
tenthirtyone 2017-08-08 00:58:09 -04:00
parent 8d676886de
commit 1ad21a667c
9 changed files with 208 additions and 74 deletions

View File

@ -52,6 +52,7 @@ https://docs.google.com/a/bit-pay.com/spreadsheets/d/1hDlf16F6zAxBrOC3ZdnvfRrSB9
* Mongo Models : Bcoin primitives. A Bcoin block primitive does not represent all of bitcore's data. * Mongo Models : Bcoin primitives. A Bcoin block primitive does not represent all of bitcore's data.
1. scriptpubkey asm 1. scriptpubkey asm
2. peer's best block height is learned on peer connect but not retained by the app. Block height is the current sync height 2. peer's best block height is learned on peer connect but not retained by the app. Block height is the current sync height
3. Multiple Outputs were overlooked in the mongo model
# ToDo but not Required for a release # ToDo but not Required for a release
* Reorg testing - Bcoin will handle this but we need to account for this in our mongo indexes. * Reorg testing - Bcoin will handle this but we need to account for this in our mongo indexes.

View File

@ -1,5 +1,5 @@
const config = { const config = {
start_node: false, start_node: true,
logging: 'debug', logging: 'debug',
bcoin: { bcoin: {
network: 'main', network: 'main',

View File

@ -1,5 +1,6 @@
const express = require('express'); const express = require('express');
const config = require('../../config'); const config = require('../../config');
const app = express(); const app = express();
const api = express.Router(); const api = express.Router();
@ -28,4 +29,7 @@ app.use((req, res) => {
}); });
}); });
module.exports = app; const server = require('http').Server(app);
module.exports = server;

View File

@ -1,7 +1,24 @@
const Block = require('../../models/block.js');
const Transaction = require('../../models/transaction'); const Transaction = require('../../models/transaction');
const logger = require('../logger'); const logger = require('../logger');
const MAX_TXS = 200; const MAX_TXS = 20;
const MAX_BLOCKS = 1;
// Shoe horned in. Not dry, also in blocks. Make db api later
function getBlock(params, options, cb) {
const defaultOptions = { _id: 0 };
Object.assign(defaultOptions, options);
Block.find(
params,
defaultOptions,
cb)
.sort({ height: -1 })
.limit(MAX_BLOCKS);
}
function getTransactions(params, options, cb) { function getTransactions(params, options, cb) {
const defaultOptions = { _id: 0 }; const defaultOptions = { _id: 0 };
@ -73,17 +90,86 @@ module.exports = function transactionAPI(router) {
req.query.address; req.query.address;
*/ */
if (req.query.block) {
getBlock(
{ hash: req.query.block },
{ rawBlock: 0 },
(err, block) => {
if (err) {
res.status(501).send();
logger.log('err', err);
}
if (block[0]) {
const b = block[0];
res.json({
pagesTotal: 1,
txs: b.txs.map(tx => ({
txid: tx.hash,
version: tx.version,
locktime: tx.locktime,
vin: tx.inputs.map(input => ({
coinbase: input.script,
sequence: input.sequence,
n: 0,
})),
vout: tx.outputs.map(output => ({
value: output.value / 1e8,
n: 0,
scriptPubKey: {
hex: '',
asm: '',
addresses: [output.address],
type: output.type,
},
spentTxid: '',
spentIndex: 0,
spentHeight: 0,
})),
})),
});
} else {
res.send();
}
});
} else if (req.query.address) {
getTransactions( } else {
{}, getTransactions(
{}, {},
(err, txs) => { {},
if (err) { (err, txs) => {
res.status(501).send(); if (err) {
} res.status(501).send();
res.send(txs); }
}, res.json({
); pagesTotal: 1,
txs: txs.map(tx => ({
txid: tx.hash,
version: tx.version,
locktime: tx.locktime,
vin: tx.inputs.map(input => ({
coinbase: input.script,
sequence: input.sequence,
n: 0,
})),
vout: tx.outputs.map(output => ({
value: output.value,
n: 0,
scriptPubKey: {
hex: '',
asm: '',
addresses: [output.address],
type: output.type,
},
spentTxid: '',
spentIndex: 0,
spentHeight: 0,
})),
})),
});
},
);
}
}); });
router.get('/rawtx/:txid', (req, res) => { router.get('/rawtx/:txid', (req, res) => {

View File

@ -11,7 +11,7 @@ function parse(entry, txs) {
tx.outputs.forEach((output) => { tx.outputs.forEach((output) => {
const outputJSON = output.toJSON(); const outputJSON = output.toJSON();
console.log(outputJSON); //console.log(outputJSON);
/* /*
return new OutputModel({ return new OutputModel({
address: outputJSON.address, address: outputJSON.address,
@ -22,7 +22,7 @@ function parse(entry, txs) {
tx.inputs.forEach((input) => { tx.inputs.forEach((input) => {
const inputJSON = input.toJSON(); const inputJSON = input.toJSON();
console.log(inputJSON); //console.log(inputJSON);
/* return new InputModel({ /* return new InputModel({
prevout: inputJSON.prevout, prevout: inputJSON.prevout,
script: inputJSON.script, script: inputJSON.script,

View File

@ -1,4 +1,6 @@
const BlockModel = require('../../models/block'); const BlockModel = require('../../models/block');
const InputModel = require('../../models/input');
const OutputModel = require('../../models/output');
const config = require('../../config'); const config = require('../../config');
const util = require('../../lib/util'); const util = require('../../lib/util');
const logger = require('../logger'); const logger = require('../logger');
@ -19,12 +21,48 @@ function parse(entry, block) {
ts: blockJSON.ts, ts: blockJSON.ts,
bits: blockJSON.bits, bits: blockJSON.bits,
nonce: blockJSON.nonce, nonce: blockJSON.nonce,
txs: block.txs.map(tx => util.revHex(tx.hash().toString('hex'))), txs: block.txs.map((tx) => {
const txJSON = tx.toJSON();
return {
hash: txJSON.hash,
witnessHash: txJSON.witnessHash,
fee: txJSON.fee,
rate: txJSON.rate,
ps: txJSON.ps,
height: entry.height,
block: util.revHex(entry.hash),
ts: entry.ts,
date: txJSON.date,
index: txJSON.index,
version: txJSON.version,
flag: txJSON.flag,
inputs: tx.inputs.map((input) => {
const inputJSON = input.toJSON();
return new InputModel({
prevout: inputJSON.prevout,
script: inputJSON.script,
witness: inputJSON.witness,
sequence: inputJSON.sequence,
address: inputJSON.address,
});
}),
outputs: tx.outputs.map((output) => {
const outputJSON = output.toJSON();
return new OutputModel({
address: outputJSON.address,
script: outputJSON.script,
value: outputJSON.value,
});
}),
lockTime: txJSON.locktime,
chain: config.bcoin.network,
};
}),
chainwork: entry.chainwork, chainwork: entry.chainwork,
reward: reward, reward,
network: config.bcoin.network, network: config.bcoin.network,
poolInfo: {}, poolInfo: {},
rawBlock: rawBlock, rawBlock,
}); });
newBlock.save((err) => { newBlock.save((err) => {

View File

@ -1,4 +1,5 @@
const mongoose = require('mongoose'); const mongoose = require('mongoose');
const Transaction = require('./transaction');
const Schema = mongoose.Schema; const Schema = mongoose.Schema;
@ -12,7 +13,7 @@ const BlockSchema = new Schema({
ts: Number, ts: Number,
bits: Number, bits: Number,
nonce: Number, nonce: Number,
txs: Array, txs: [Transaction.schema],
chainwork: Number, chainwork: Number,
reward: Number, reward: Number,
network: String, network: String,

107
package-lock.json generated
View File

@ -95,8 +95,7 @@
"backo2": { "backo2": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
"integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
"optional": true
}, },
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
@ -112,8 +111,7 @@
"base64id": { "base64id": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
"integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY="
"optional": true
}, },
"bcoin": { "bcoin": {
"version": "1.0.0-beta.14", "version": "1.0.0-beta.14",
@ -128,6 +126,22 @@
"secp256k1": "3.2.5", "secp256k1": "3.2.5",
"socket.io": "2.0.1", "socket.io": "2.0.1",
"socket.io-client": "2.0.1" "socket.io-client": "2.0.1"
},
"dependencies": {
"socket.io": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.1.tgz",
"integrity": "sha1-BkwSUXhGLkd6bfI9L9rRjdHFkU8=",
"optional": true,
"requires": {
"debug": "2.6.8",
"engine.io": "3.1.0",
"object-assign": "4.1.1",
"socket.io-adapter": "1.1.1",
"socket.io-client": "2.0.1",
"socket.io-parser": "3.1.2"
}
}
} }
}, },
"bcoin-native": { "bcoin-native": {
@ -305,8 +319,7 @@
"component-bind": { "component-bind": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
"integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
"optional": true
}, },
"component-emitter": { "component-emitter": {
"version": "1.2.1", "version": "1.2.1",
@ -316,8 +329,7 @@
"component-inherit": { "component-inherit": {
"version": "0.0.3", "version": "0.0.3",
"resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
"integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
"optional": true
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
@ -515,7 +527,6 @@
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.0.tgz", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.0.tgz",
"integrity": "sha1-XKQ4486f28kVxKIcjdnhJmcG5X4=", "integrity": "sha1-XKQ4486f28kVxKIcjdnhJmcG5X4=",
"optional": true,
"requires": { "requires": {
"accepts": "1.3.3", "accepts": "1.3.3",
"base64id": "1.0.0", "base64id": "1.0.0",
@ -530,7 +541,6 @@
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.1.tgz", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.1.tgz",
"integrity": "sha1-QVqYUrrbFPoAj6PvHjFgjbZ2EyU=", "integrity": "sha1-QVqYUrrbFPoAj6PvHjFgjbZ2EyU=",
"optional": true,
"requires": { "requires": {
"component-emitter": "1.2.1", "component-emitter": "1.2.1",
"component-inherit": "0.0.3", "component-inherit": "0.0.3",
@ -1373,14 +1383,12 @@
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
"optional": true
}, },
"object-component": { "object-component": {
"version": "0.0.3", "version": "0.0.3",
"resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
"integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
"optional": true
}, },
"on-finished": { "on-finished": {
"version": "2.3.0", "version": "2.3.0",
@ -1432,7 +1440,6 @@
"version": "0.0.3", "version": "0.0.3",
"resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz",
"integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=",
"optional": true,
"requires": { "requires": {
"better-assert": "1.0.2" "better-assert": "1.0.2"
} }
@ -1441,7 +1448,6 @@
"version": "0.0.5", "version": "0.0.5",
"resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
"integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
"optional": true,
"requires": { "requires": {
"better-assert": "1.0.2" "better-assert": "1.0.2"
} }
@ -1824,44 +1830,44 @@
} }
}, },
"socket.io": { "socket.io": {
"version": "2.0.1", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.1.tgz", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.3.tgz",
"integrity": "sha1-BkwSUXhGLkd6bfI9L9rRjdHFkU8=", "integrity": "sha1-Q1nwaiSTOua9CHeYr3jGgOrjReM=",
"optional": true,
"requires": { "requires": {
"debug": "2.6.8", "debug": "2.6.8",
"engine.io": "3.1.0", "engine.io": "3.1.0",
"object-assign": "4.1.1", "object-assign": "4.1.1",
"socket.io-adapter": "1.1.0", "socket.io-adapter": "1.1.1",
"socket.io-client": "2.0.1", "socket.io-client": "2.0.3",
"socket.io-parser": "3.1.2" "socket.io-parser": "3.1.2"
},
"dependencies": {
"socket.io-client": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.3.tgz",
"integrity": "sha1-bK9K/5+FsZ/ZG2zhPWmttWT4hzs=",
"requires": {
"backo2": "1.0.2",
"base64-arraybuffer": "0.1.5",
"component-bind": "1.0.0",
"component-emitter": "1.2.1",
"debug": "2.6.8",
"engine.io-client": "3.1.1",
"has-cors": "1.1.0",
"indexof": "0.0.1",
"object-component": "0.0.3",
"parseqs": "0.0.5",
"parseuri": "0.0.5",
"socket.io-parser": "3.1.2",
"to-array": "0.1.4"
}
}
} }
}, },
"socket.io-adapter": { "socket.io-adapter": {
"version": "1.1.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.0.tgz", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
"integrity": "sha1-x6pGUB3VVsLLiiivj/lcC14dqkw=", "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs="
"optional": true,
"requires": {
"debug": "2.3.3"
},
"dependencies": {
"debug": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
"integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
"optional": true,
"requires": {
"ms": "0.7.2"
}
},
"ms": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
"integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
"optional": true
}
}
}, },
"socket.io-client": { "socket.io-client": {
"version": "2.0.1", "version": "2.0.1",
@ -2041,8 +2047,7 @@
"to-array": { "to-array": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
"integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
"optional": true
}, },
"tough-cookie": { "tough-cookie": {
"version": "2.3.2", "version": "2.3.2",
@ -2197,8 +2202,7 @@
"xmlhttprequest-ssl": { "xmlhttprequest-ssl": {
"version": "1.5.3", "version": "1.5.3",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz",
"integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0="
"optional": true
}, },
"xtend": { "xtend": {
"version": "4.0.1", "version": "4.0.1",
@ -2208,8 +2212,7 @@
"yeast": { "yeast": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
"optional": true
} }
} }
} }

View File

@ -17,6 +17,7 @@
"express": "^4.15.3", "express": "^4.15.3",
"mongoose": "^4.11.5", "mongoose": "^4.11.5",
"request": "^2.81.0", "request": "^2.81.0",
"socket.io": "^2.0.3",
"winston": "^2.3.1" "winston": "^2.3.1"
}, },
"devDependencies": { "devDependencies": {