refactor tx.

This commit is contained in:
Christopher Jeffrey 2016-05-19 00:09:06 -07:00
parent f714bbf2c0
commit ae230cf294
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
5 changed files with 64 additions and 38 deletions

View File

@ -63,6 +63,7 @@ function MTX(options) {
options = {};
this.version = options.version || 1;
this.flag = options.flag || 1;
this.inputs = [];
this.outputs = [];
this.locktime = 0;

View File

@ -56,6 +56,7 @@ function TX(data) {
assert(data, 'TX data is required.');
assert(typeof data.version === 'number');
assert(typeof data.flag === 'number');
assert(Array.isArray(data.inputs));
assert(Array.isArray(data.outputs));
assert(typeof data.locktime === 'number');
@ -1429,7 +1430,8 @@ TX.prototype.getModifiedSize = function getModifiedSize(size) {
* @param {Number?} size - Size to calculate priority
* based on. If not present, modified size will be
* calculated and used.
* @returns {Number} priority
* @returns {Object} data - Object containing
* `priority` and `value`.
*/
TX.prototype.getPriority = function getPriority(height, size) {
@ -1485,7 +1487,7 @@ TX.prototype.getPriority = function getPriority(height, size) {
*/
TX.prototype.isFree = function isFree(height, size) {
var priority;
var data;
if (height == null) {
height = this.height;
@ -1493,9 +1495,9 @@ TX.prototype.isFree = function isFree(height, size) {
height = bcoin.network.get().height + 1;
}
priority = this.getPriority(height, size).priority;
data = this.getPriority(height, size);
return priority > constants.tx.FREE_THRESHOLD;
return data.priority > constants.tx.FREE_THRESHOLD;
};
/**
@ -1528,38 +1530,6 @@ TX.prototype.getRate = function getRate(size) {
return TX.getRate(size, this.getFee());
};
/**
* Calculate minimum fee based on rate and size.
* @param {Number?} size
* @param {Rate?} rate - Rate of satoshi per kB.
* @returns {Amount} fee
*/
TX.getMinFee = function getMinFee(size, rate) {
var fee;
if (rate == null)
rate = constants.tx.MIN_RELAY;
fee = Math.floor(rate * size / 1000);
if (fee === 0 && rate > 0)
fee = rate;
return fee;
};
/**
* Calculate a fee rate based on size and fees.
* @param {Number} size
* @param {Amount} fee
* @returns {Rate}
*/
TX.getRate = function(size, fee) {
return Math.floor(fee * 1000 / size);
};
/**
* Calculate the minimum fee in order for the transaction
* to be relayable, but _round to the nearest kilobyte
@ -1730,6 +1700,38 @@ TX.prototype.__defineGetter__('wtxid', function() {
return this.rwhash;
});
/**
* Calculate minimum fee based on rate and size.
* @param {Number?} size
* @param {Rate?} rate - Rate of satoshi per kB.
* @returns {Amount} fee
*/
TX.getMinFee = function getMinFee(size, rate) {
var fee;
if (rate == null)
rate = constants.tx.MIN_RELAY;
fee = Math.floor(rate * size / 1000);
if (fee === 0 && rate > 0)
fee = rate;
return fee;
};
/**
* Calculate a fee rate based on size and fees.
* @param {Number} size
* @param {Amount} fee
* @returns {Rate}
*/
TX.getRate = function(size, fee) {
return Math.floor(fee * 1000 / size);
};
/**
* Inspect the transaction and return a more
* user-friendly representation of the data.
@ -1739,8 +1741,8 @@ TX.prototype.__defineGetter__('wtxid', function() {
TX.prototype.inspect = function inspect() {
return {
type: 'tx',
hash: utils.revHex(this.hash('hex')),
witnessHash: utils.revHex(this.witnessHash('hex')),
hash: this.rhash,
witnessHash: this.rwhash,
size: this.getSize(),
virtualSize: this.maxSize(),
height: this.height,
@ -1757,6 +1759,7 @@ TX.prototype.inspect = function inspect() {
index: this.index,
changeIndex: this.changeIndex || -1,
version: this.version,
flag: this.flag,
inputs: this.inputs,
outputs: this.outputs,
locktime: this.locktime
@ -1783,6 +1786,7 @@ TX.prototype.toJSON = function toJSON() {
index: this.index,
changeIndex: this.changeIndex || -1,
version: this.version,
flag: this.flag,
inputs: this.inputs.map(function(input) {
return input.toJSON();
}),
@ -1811,6 +1815,7 @@ TX.parseJSON = function fromJSON(json) {
index: json.index,
changeIndex: json.changeIndex || -1,
version: json.version,
flag: json.flag,
inputs: json.inputs.map(function(input) {
return bcoin.input.parseJSON(input);
}),

View File

@ -30,6 +30,7 @@ function createGenesisBlock(options) {
tx = {
version: 1,
flag: 1,
inputs: [{
prevout: {
hash: constants.NULL_HASH,

View File

@ -297,6 +297,7 @@ describe('Script', function() {
it('should handle script test' + suffix + ': ' + comments, function() {
var coin = bcoin.tx({
version: 1,
flag: 1,
inputs: [{
prevout: {
hash: constants.NULL_HASH,
@ -315,6 +316,7 @@ describe('Script', function() {
});
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [{
prevout: {
hash: coin.hash('hex'),

View File

@ -306,6 +306,7 @@ describe('TX', function() {
it('should fail on >51 bit coin values', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [createInput(constants.MAX_MONEY + 1)],
outputs: [{
script: [],
@ -320,6 +321,7 @@ describe('TX', function() {
it('should handle 51 bit coin values', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [createInput(constants.MAX_MONEY)],
outputs: [{
script: [],
@ -334,6 +336,7 @@ describe('TX', function() {
it('should fail on >51 bit output values', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [createInput(constants.MAX_MONEY)],
outputs: [{
script: [],
@ -348,6 +351,7 @@ describe('TX', function() {
it('should handle 51 bit output values', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [createInput(constants.MAX_MONEY)],
outputs: [{
script: [],
@ -362,6 +366,7 @@ describe('TX', function() {
it('should fail on >51 bit fees', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [createInput(constants.MAX_MONEY + 1)],
outputs: [{
script: [],
@ -376,6 +381,7 @@ describe('TX', function() {
it('should fail on >51 bit values from multiple', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [
createInput(Math.floor(constants.MAX_MONEY / 2)),
createInput(Math.floor(constants.MAX_MONEY / 2)),
@ -394,6 +400,7 @@ describe('TX', function() {
it('should fail on >51 bit output values from multiple', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [createInput(constants.MAX_MONEY)],
outputs: [
{
@ -418,6 +425,7 @@ describe('TX', function() {
it('should fail on >51 bit fees from multiple', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [
createInput(Math.floor(constants.MAX_MONEY / 2)),
createInput(Math.floor(constants.MAX_MONEY / 2)),
@ -439,6 +447,7 @@ describe('TX', function() {
for (var i = 0; i < 3; i++) {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [
createInput(Math.floor(constants.MAX_MONEY / 2))
],
@ -456,6 +465,7 @@ describe('TX', function() {
it('should fail to parse >53 bit values', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [
createInput(Math.floor(constants.MAX_MONEY / 2))
],
@ -483,6 +493,7 @@ describe('TX', function() {
it('should fail on 53 bit coin values', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [createInput(utils.MAX_SAFE_INTEGER)],
outputs: [{
script: [],
@ -497,6 +508,7 @@ describe('TX', function() {
it('should fail on 53 bit output values', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [createInput(constants.MAX_MONEY)],
outputs: [{
script: [],
@ -511,6 +523,7 @@ describe('TX', function() {
it('should fail on 53 bit fees', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [createInput(utils.MAX_SAFE_INTEGER)],
outputs: [{
script: [],
@ -526,6 +539,7 @@ describe('TX', function() {
it('should fail on >53 bit values from multiple', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [
createInput(MAX),
createInput(MAX),
@ -544,6 +558,7 @@ describe('TX', function() {
it('should fail on >53 bit output values from multiple', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [createInput(constants.MAX_MONEY)],
outputs: [
{
@ -568,6 +583,7 @@ describe('TX', function() {
it('should fail on >53 bit fees from multiple', function() {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [
createInput(MAX),
createInput(MAX),
@ -589,6 +605,7 @@ describe('TX', function() {
for (var i = 0; i < 3; i++) {
var tx = bcoin.tx({
version: 1,
flag: 1,
inputs: [
createInput(MAX)
],