block and tx getters. coinbase height. multisig input test.

This commit is contained in:
Christopher Jeffrey 2015-12-24 13:15:53 -08:00
parent 1f8bf8c377
commit afcb89f76f
5 changed files with 51 additions and 37 deletions

View File

@ -61,7 +61,7 @@ function Block(data, subtype) {
return tx; return tx;
}); });
if (this.version >= 2) { if (this.version >= 2 && this._height === -1) {
tx = this.txs[0]; tx = this.txs[0];
if (tx && tx.inputs[0] && +tx.inputs[0].out.hash === 0) { if (tx && tx.inputs[0] && +tx.inputs[0].out.hash === 0) {
height = bcoin.script.coinbaseHeight(tx.inputs[0].script, this); height = bcoin.script.coinbaseHeight(tx.inputs[0].script, this);
@ -337,6 +337,10 @@ Block.prototype.getReward = function getReward() {
}; };
}; };
Block.prototype.__defineGetter__('rhash', function() {
return utils.revHex(this.hash('hex'));
});
Block.prototype.__defineSetter__('height', function(height) { Block.prototype.__defineSetter__('height', function(height) {
return this._height = height; return this._height = height;
}); });
@ -349,10 +353,6 @@ Block.prototype.__defineGetter__('nextBlock', function() {
return this.getNextBlock(bcoin.chain.global); return this.getNextBlock(bcoin.chain.global);
}); });
Block.prototype.__defineGetter__('rhash', function() {
return utils.revHex(this.hash('hex'));
});
Block.prototype.__defineGetter__('reward', function() { Block.prototype.__defineGetter__('reward', function() {
return this.getReward().reward; return this.getReward().reward;
}); });

View File

@ -213,6 +213,8 @@ Input.getData = function getData(input) {
} else if (data.type === 'pubkeyhash') { } else if (data.type === 'pubkeyhash') {
data.sigs = [sub[0]]; data.sigs = [sub[0]];
data.pubs = [sub[1]]; data.pubs = [sub[1]];
} else if (data.type === 'multisig') {
data.sigs = sub.slice(1);
} else if (data.type === 'scripthash') { } else if (data.type === 'scripthash') {
// We work backwards here: scripthash is one of the few cases // We work backwards here: scripthash is one of the few cases
// where we get more data from the input than the output. // where we get more data from the input than the output.
@ -225,8 +227,6 @@ Input.getData = function getData(input) {
val.value = data.value; val.value = data.value;
val.script = data.script; val.script = data.script;
data = val; data = val;
} else if (data.type === 'multisig') {
data.sigs = sub.slice(1);
} }
return utils.merge(data, { return utils.merge(data, {
seq: def.seq, seq: def.seq,
@ -257,6 +257,16 @@ Input.getData = function getData(input) {
}); });
} }
if (bcoin.script.isMultisigInput(s)) {
sig = sub.slice(1);
return utils.merge(def, {
type: 'multisig',
sigs: sig,
m: sig.length,
none: true
});
}
if (bcoin.script.isScripthashInput(s)) { if (bcoin.script.isScripthashInput(s)) {
sig = sub.slice(1, -1); sig = sub.slice(1, -1);
redeem = sub[sub.length - 1]; redeem = sub[sub.length - 1];
@ -279,16 +289,6 @@ Input.getData = function getData(input) {
}); });
} }
if (bcoin.script.isMultisigInput(s)) {
sig = sub.slice(1);
return utils.merge(def, {
type: 'multisig',
sigs: sig,
m: sig.length,
none: true
});
}
return utils.merge(def, { return utils.merge(def, {
type: 'unknown', type: 'unknown',
none: true none: true

View File

@ -900,7 +900,7 @@ script.lockTime = function lockTime(s) {
// Number can only store 6 & 5/8 bytes // Number can only store 6 & 5/8 bytes
if (lock.length > 6) if (lock.length > 6)
lock = [0x1f].concat(lock.slice(0, 6)); lock = lock.slice(0, 6);
return new bn(lock); return new bn(lock);
}; };
@ -1066,8 +1066,8 @@ script.colored = function colored(s) {
script.standardInput = function standardInput(s) { script.standardInput = function standardInput(s) {
return (script.isPubkeyInput(s) && 'pubkey') return (script.isPubkeyInput(s) && 'pubkey')
|| (script.isPubkeyhashInput(s) && 'pubkeyhash') || (script.isPubkeyhashInput(s) && 'pubkeyhash')
|| (script.isScripthashInput(s) && 'scripthash')
|| (script.isMultisigInput(s) && 'multisig') || (script.isMultisigInput(s) && 'multisig')
|| (script.isScripthashInput(s) && 'scripthash')
|| null; || null;
}; };
@ -1116,6 +1116,10 @@ script.isPubkeyhashInput = function isPubkeyhashInput(s, key) {
script.isMultisigInput = function isMultisigInput(s, pubs, tx, i) { script.isMultisigInput = function isMultisigInput(s, pubs, tx, i) {
var i, res, o; var i, res, o;
// We need to rule out scripthash because it may look like multisig
if (script.isScripthashInput(s))
return false;
s = script.subscript(s); s = script.subscript(s);
if (s.length < 3) if (s.length < 3)

View File

@ -60,11 +60,11 @@ function TX(data, block) {
} }
} }
// ps = Pending Since
this.ps = this.ts === 0 ? +new Date() / 1000 : 0;
this.changeAddress = data.changeAddress || null; this.changeAddress = data.changeAddress || null;
this.changeOutput = data.changeOutput || null; this.changeOutput = data.changeOutput || null;
// ps = Pending Since
this.ps = this.ts === 0 ? +new Date() / 1000 : 0;
} }
TX.fee = 10000; TX.fee = 10000;
@ -837,18 +837,6 @@ TX.prototype.funds = function funds(side) {
return acc; return acc;
}; };
TX.prototype.__defineSetter__('height', function(height) {
return this._height = height;
});
TX.prototype.__defineGetter__('height', function() {
return this.getHeight(bcoin.chain.global);
});
TX.prototype.__defineGetter__('confirmations', function() {
return this.getConfirmations(bcoin.chain.global);
});
TX.prototype.getHeight = function getHeight(chain) { TX.prototype.getHeight = function getHeight(chain) {
if (this._height >= 0) if (this._height >= 0)
return this._height; return this._height;
@ -893,6 +881,26 @@ TX.prototype.__defineGetter__('rhash', function() {
return utils.revHex(this.hash('hex')); return utils.revHex(this.hash('hex'));
}); });
TX.prototype.__defineGetter__('fee', function() {
return this.getFee();
});
TX.prototype.__defineGetter__('value', function() {
return this.funds('in');
});
TX.prototype.__defineSetter__('height', function(height) {
return this._height = height;
});
TX.prototype.__defineGetter__('height', function() {
return this.getHeight(bcoin.chain.global);
});
TX.prototype.__defineGetter__('confirmations', function() {
return this.getConfirmations(bcoin.chain.global);
});
TX.prototype.inspect = function inspect() { TX.prototype.inspect = function inspect() {
var copy = bcoin.tx(this); var copy = bcoin.tx(this);
copy.__proto__ = null; copy.__proto__ = null;
@ -902,6 +910,8 @@ TX.prototype.inspect = function inspect() {
copy.hash = this.hash('hex'); copy.hash = this.hash('hex');
copy.rhash = this.rhash; copy.rhash = this.rhash;
copy.rblock = this.rblock; copy.rblock = this.rblock;
copy.value = utils.btc(this.value);
copy.fee = utils.btc(this.fee);
copy.height = this.height; copy.height = this.height;
copy.confirmations = this.confirmations; copy.confirmations = this.confirmations;
return copy; return copy;

View File

@ -410,12 +410,12 @@ Wallet.prototype.ownInput = function ownInput(tx, index) {
if (bcoin.script.isPubkeyhashInput(input.script, key)) if (bcoin.script.isPubkeyhashInput(input.script, key))
return true; return true;
if (bcoin.script.isScripthashInput(input.script, redeem))
return true;
// if (bcoin.script.isMultisigInput(input.script, key, tx, i)) // if (bcoin.script.isMultisigInput(input.script, key, tx, i))
// return true; // return true;
if (bcoin.script.isScripthashInput(input.script, redeem))
return true;
if (!input.out.tx) if (!input.out.tx)
return false; return false;