more refactoring.

This commit is contained in:
Christopher Jeffrey 2016-04-04 16:39:02 -07:00
parent a8a506aae0
commit 6062f1ce94
4 changed files with 64 additions and 53 deletions

View File

@ -416,7 +416,7 @@ HDPrivateKey.prototype.derivePath = function derivePath(path) {
var indexes;
if (!HDPrivateKey.isValidPath(path))
throw new Error('invalid path');
throw new Error('Invalid path.');
indexes = HDPrivateKey._getIndexes(path);

View File

@ -20,14 +20,14 @@ var opcodes = constants.opcodes;
*/
function MTX(options) {
var i;
if (!(this instanceof MTX))
return new MTX(options);
if (!options)
options = {};
this.options = options;
this.type = 'tx';
this.version = options.version || 1;
this.inputs = [];
@ -38,6 +38,7 @@ function MTX(options) {
this.index = -1;
this.ps = this.ts === 0 ? utils.now() : 0;
this.changeIndex = options.changeIndex != null ? options.changeIndex : -1;
this.height = -1;
this._hash = null;
this._whash = null;
@ -45,18 +46,14 @@ function MTX(options) {
this._size = 0;
this._witnessSize = 0;
this.height = -1;
if (options.inputs) {
options.inputs.forEach(function(input) {
this.addInput(input);
}, this);
for (i = 0; i < options.inputs.length; i++)
this.addInput(options.inputs[i]);
}
if (options.outputs) {
options.outputs.forEach(function(output) {
this.addOutput(output);
}, this);
for (i = 0; i < options.outputs.length; i++)
this.addOutput(options.outputs[i]);
}
}

View File

@ -32,7 +32,7 @@ function Witness(items) {
if (items.items)
items = items.items;
this.items = items || [];
this.items = items;
this.redeem = null;
}

View File

@ -21,6 +21,8 @@ var BufferWriter = require('./writer');
*/
function TX(data, block, index) {
var i;
if (!(this instanceof TX))
return new TX(data, block, index);
@ -37,6 +39,7 @@ function TX(data, block, index) {
this.block = data.block || null;
this.index = data.index != null ? data.index : -1;
this.ps = this.ts === 0 ? utils.now() : 0;
this.height = data.height != null ? data.height : -1;
this._hash = null;
this._whash = null;
@ -44,18 +47,15 @@ function TX(data, block, index) {
this._size = data._size || 0;
this._witnessSize = data._witnessSize || 0;
this.height = data.height != null ? data.height : -1;
if (data.inputs) {
for (i = 0; i < data.inputs.length; i++)
this.inputs.push(new bcoin.input(data.inputs[i], this));
}
// assert(data.inputs.length !== 0);
// assert(data.outputs.length !== 0);
data.inputs.forEach(function(input) {
this.inputs.push(new bcoin.input(input, this));
}, this);
data.outputs.forEach(function(output) {
this.outputs.push(new bcoin.output(output, this));
}, this);
if (data.outputs) {
for (i = 0; i < data.outputs.length; i++)
this.outputs.push(new bcoin.output(data.outputs[i], this));
}
if (block && this.ts === 0) {
if (block.type === 'merkleblock') {
@ -385,6 +385,8 @@ TX.prototype.signatureHashV1 = function signatureHashV1(index, prev, type) {
};
TX.prototype.verify = function verify(index, force, flags) {
var i, input, res;
// Valid if included in block
if (!force && this.ts !== 0)
return true;
@ -401,16 +403,18 @@ TX.prototype.verify = function verify(index, force, flags) {
if (this.isCoinbase())
return true;
return this.inputs.every(function(input, i) {
for (i = 0; i < this.inputs.length; i++) {
input = this.inputs[i];
if (index != null && i !== index)
return true;
continue;
if (!input.coin) {
utils.debug('Warning: Not all outputs available for tx.verify().');
utils.debug('Warning: Not all coins are available for tx.verify().');
return false;
}
return Script.verify(
res = Script.verify(
input.script,
input.witness,
input.coin.script,
@ -418,13 +422,19 @@ TX.prototype.verify = function verify(index, force, flags) {
i,
flags
);
}, this);
if (!res)
return false;
}
return true;
};
TX.prototype.verifyAsync = function verifyAsync(index, force, flags, callback) {
var self = this;
var res;
utils.nextTick(function() {
var res;
try {
res = self.verify(index, force, flags);
} catch (e) {
@ -642,12 +652,13 @@ TX.prototype.isFinal = function isFinal(height, ts) {
TX.prototype._getSigops = function _getSigops(scriptHash, accurate) {
var total = 0;
var i, input, output, prev;
this.inputs.forEach(function(input) {
var prev;
for (i = 0; i < this.inputs.length; i++) {
input = this.inputs[i];
if (!input.coin)
return;
continue;
prev = input.coin.script;
@ -655,35 +666,37 @@ TX.prototype._getSigops = function _getSigops(scriptHash, accurate) {
if (scriptHash && !this.isCoinbase()) {
if (!prev.isScripthash())
return;
continue;
if (!input.script.isPushOnly())
return;
continue;
prev = input.script.getRedeem();
if (!prev)
return;
continue;
total += prev.getSigops(true);
}
}, this);
}
this.outputs.forEach(function(output) {
for (i = 0; i < this.outputs.length; i++) {
output = this.outputs[i];
total += output.script.getSigops(accurate);
}, this);
}
return total;
};
TX.prototype.getSigops = function getSigops(scriptHash, accurate) {
var cost = this._getSigops(scriptHash, accurate) * 4;
var i, input, output, prev;
this.inputs.forEach(function(input) {
var prev;
for (i = 0; i < this.inputs.length; i++) {
input = this.inputs[i];
if (!input.coin)
return;
continue;
prev = input.coin.script;
@ -694,17 +707,14 @@ TX.prototype.getSigops = function getSigops(scriptHash, accurate) {
prev = input.witness.getRedeem();
if (prev)
cost += prev.getSigops(true);
} else {
cost += 0;
}
}, this);
}
this.outputs.forEach(function(output) {
for (i = 0; i < this.outputs.length; i++) {
output = this.outputs[i];
if (output.script.isWitnessPubkeyhash())
cost += 1;
else
cost += 0;
}, this);
}
return (cost + 3) / 4 | 0;
};
@ -871,6 +881,7 @@ TX.prototype.isStandard = function isStandard(flags, ret) {
// AreInputsStandard
TX.prototype.hasStandardInputs = function hasStandardInputs(flags) {
var maxSigops = constants.script.maxScripthashSigops;
var VERIFY_NONE = constants.flags.VERIFY_NONE;
var i, input, stack, res, redeem;
if (flags == null)
@ -896,9 +907,9 @@ TX.prototype.hasStandardInputs = function hasStandardInputs(flags) {
if (!input.script.isPushOnly())
return false;
stack = new Stack([]);
stack = new Stack();
res = input.script.execute(stack, constants.flags.VERIFY_NONE, this, i, 0);
res = input.script.execute(stack, VERIFY_NONE, this, i, 0);
if (!res)
return false;
@ -1291,6 +1302,7 @@ TX.prototype.toExtended = function toExtended(saveCoins) {
var index = this.index;
var changeIndex = this.changeIndex != null ? this.changeIndex : -1;
var p = new BufferWriter();
var i, input;
if (height === -1)
height = 0x7fffffff;
@ -1311,14 +1323,16 @@ TX.prototype.toExtended = function toExtended(saveCoins) {
if (saveCoins) {
p.writeVarint(this.inputs.length);
this.inputs.forEach(function(input) {
for (i = 0; i < this.inputs.length; i++) {
input = this.inputs[i];
if (!input.coin) {
p.writeVarint(0);
return;
continue;
}
p.writeVarBytes(bcoin.protocol.framer.coin(input.coin, false));
});
}
}
return p.render();