'use strict'; require('classtool'); function spec(b) { // blockHash -> txid mapping (to reorgs) var ROOT = 'tx-b-'; //tx-b-- => 1/0 (connected or not) // to show tx outs var OUTS_ROOT = 'txouts-'; //txouts-- => [addr, btc_sat] // to sum up addr balance var ADDR_ROOT = 'txouts-addr-'; //txouts-addr---- => + btc_sat var SPEND_ROOT = 'txouts-spend-';//txouts-spend-- => [txid(in),n(in),ts] // TODO: use bitcore networks module var genesisTXID = '4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b'; var CONCURRENCY = 100; /** * Module dependencies. */ var TransactionRpc = require('./TransactionRpc').class(), util = require('bitcore/util/util'), levelup = require('levelup'), async = require('async'), config = require('../config/config'), assert = require('assert'); var db = b.db || levelup(config.leveldb + '/txs'); var TransactionDb = function() { }; TransactionDb.prototype.close = function(cb) { db.close(cb); }; TransactionDb.prototype.drop = function(cb) { var path = config.leveldb + '/txs'; db.close(function() { require('leveldown').destroy(path, function () { db = levelup(path); return cb(); }); }); }; // TransactionDb.prototype.fromTxIdOne = function(txid, cb) { TODO TransactionDb.prototype.has = function(txid, cb) { var k = OUTS_ROOT + txid; db.get(k, function (err,val) { var ret; if (err && err.notFound) { err = null; ret = false; } if (typeof val !== undefined) { ret = true; } return cb(err, ret); }); }; TransactionDb.prototype.fromTxId = function(txid, cb) { var k = OUTS_ROOT + txid; var ret=[]; // outs. db.createReadStream({start: k, end: k + '~'}) .on('data', function (data) { var k = data.key.split('-'); var v = data.value.split(':'); ret.push({ addr: v[0], value_sat: parseInt(v[1]), index: parseInt(k[2]), }); }) .on('error', function (err) { return cb(err); }) .on('end', function () { var k = SPEND_ROOT + txid; var l = ret.length; db.createReadStream({start: k, end: k + '~'}) .on('data', function (data) { var k = data.key.split('-'); var v = data.value.split(':'); var set=0; for(var i=0; i