better key and sig parsing for scripts.
This commit is contained in:
parent
c8da41aa9d
commit
b389dd1b5f
@ -642,7 +642,7 @@ Block.prototype.toJSON = function toJSON() {
|
||||
ts: this.ts,
|
||||
network: this.network,
|
||||
relayedBy: this.relayedBy,
|
||||
block: utils.toHex(bcoin.protocol.framer.block(this, this.subtype))
|
||||
block: utils.toHex(this.render())
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -51,6 +51,10 @@ Input.prototype.__defineGetter__('type', function() {
|
||||
return this.data.type;
|
||||
});
|
||||
|
||||
Input.prototype.__defineGetter__('subtype', function() {
|
||||
return this.data.subtype;
|
||||
});
|
||||
|
||||
Input.prototype.__defineGetter__('signature', function() {
|
||||
return this.signatures[0];
|
||||
});
|
||||
@ -105,12 +109,6 @@ Input.prototype.__defineGetter__('lock', function() {
|
||||
return this.output.lock;
|
||||
});
|
||||
|
||||
Input.prototype.__defineGetter__('lockType', function() {
|
||||
if (!this.output)
|
||||
return 'height';
|
||||
return this.output.lockType;
|
||||
});
|
||||
|
||||
Input.prototype.__defineGetter__('text', function() {
|
||||
return this.data.text;
|
||||
});
|
||||
@ -225,7 +223,7 @@ Input.getData = function getData(input) {
|
||||
if (input.out && input.out.tx) {
|
||||
output = input.out.tx.outputs[input.out.index];
|
||||
if (output) {
|
||||
data = bcoin.script.getData(input.script, output.script);
|
||||
data = bcoin.script.getInputData(input.script, output.script);
|
||||
data.value = output.value;
|
||||
return utils.merge(def, data);
|
||||
}
|
||||
@ -245,14 +243,13 @@ Input.prototype.inspect = function inspect() {
|
||||
|
||||
return {
|
||||
type: this.type,
|
||||
subtype: this.data.subtype,
|
||||
subtype: this.subtype,
|
||||
address: this.address,
|
||||
addresses: this.addresses,
|
||||
signatures: this.signatures.map(utils.toHex),
|
||||
keys: this.keys.map(utils.toHex),
|
||||
text: this.text,
|
||||
lock: this.lock,
|
||||
lockType: this.lockType,
|
||||
value: utils.btc(output.value),
|
||||
script: bcoin.script.format(this.script)[0],
|
||||
redeem: this.redeem ? bcoin.script.format(this.redeem)[0] : null,
|
||||
|
||||
@ -105,10 +105,6 @@ Output.prototype.__defineGetter__('lock', function() {
|
||||
return bcoin.script.lockTime(this.script);
|
||||
});
|
||||
|
||||
Output.prototype.__defineGetter__('lockType', function() {
|
||||
return this.lock < constants.locktimeThreshold ? 'height' : 'time';
|
||||
});
|
||||
|
||||
Output.prototype.__defineGetter__('text', function() {
|
||||
return this.data.text;
|
||||
});
|
||||
@ -202,7 +198,6 @@ Output.prototype.inspect = function inspect() {
|
||||
n: this.n,
|
||||
text: this.text,
|
||||
lock: this.lock,
|
||||
lockType: this.lockType,
|
||||
value: utils.btc(this.value),
|
||||
script: bcoin.script.format(this.script)[0]
|
||||
};
|
||||
|
||||
@ -217,7 +217,7 @@ script.verify = function verify(input, output, tx, i, flags) {
|
||||
res = script.execute(output, stack, tx, i, flags);
|
||||
|
||||
// Verify the script did not fail as well as the stack values
|
||||
if (!res || stack.length === 0 || script.num(stack.pop()).cmpn(0) === 0)
|
||||
if (!res || stack.length === 0 || !script.bool(stack.pop()))
|
||||
return false;
|
||||
|
||||
// If the script is P2SH, execute the real output script
|
||||
@ -245,7 +245,7 @@ script.verify = function verify(input, output, tx, i, flags) {
|
||||
res = script.execute(redeem, stack, tx, i, flags);
|
||||
|
||||
// Verify the script did not fail as well as the stack values
|
||||
if (!res || stack.length === 0 || script.num(stack.pop()).cmpn(0) === 0)
|
||||
if (!res || stack.length === 0 || !script.bool(stack.pop()))
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1248,13 +1248,15 @@ script.spendable = function spendable(s, lockTime) {
|
||||
return true;
|
||||
};
|
||||
|
||||
script.getData = function getData(s, prev) {
|
||||
script.getInputData = function getData(s, prev) {
|
||||
var output;
|
||||
|
||||
if (prev && !script.isScripthash(prev)) {
|
||||
output = script.getOutputData(prev);
|
||||
output.side = 'input';
|
||||
|
||||
// We could call getInputData, but
|
||||
// we really only need the signatures.
|
||||
if (output.type === 'pubkey') {
|
||||
output.signatures = [s[0]];
|
||||
} else if (output.type === 'pubkeyhash') {
|
||||
@ -1262,15 +1264,17 @@ script.getData = function getData(s, prev) {
|
||||
output.keys = [s[1]];
|
||||
} else if (output.type === 'multisig') {
|
||||
output.signatures = s.slice(1);
|
||||
} else {
|
||||
output.signatures = script.getUnknownData(s).signatures;
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
return script.getInputData(s);
|
||||
return script._getInputData(s);
|
||||
};
|
||||
|
||||
script.getInputData = function getInputData(s) {
|
||||
script._getInputData = function _getInputData(s) {
|
||||
var sig, key, hash, raw, redeem, lock, hash, address, input, output;
|
||||
|
||||
if (script.isPubkeyInput(s)) {
|
||||
@ -1329,10 +1333,7 @@ script.getInputData = function getInputData(s) {
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
type: 'unknown',
|
||||
none: true
|
||||
};
|
||||
return script.getUnknownData(s);
|
||||
};
|
||||
|
||||
script.getOutputData = function getOutputData(s) {
|
||||
@ -1390,9 +1391,36 @@ script.getOutputData = function getOutputData(s) {
|
||||
};
|
||||
}
|
||||
|
||||
return script.getUnknownData(s);
|
||||
};
|
||||
|
||||
script.getUnknownData = function getUnknownData(s) {
|
||||
var sig = [];
|
||||
var key = [];
|
||||
var hash, address, i;
|
||||
|
||||
for (i = 0; i < s.length; i++) {
|
||||
if (script.isSignatureEncoding(s[i]))
|
||||
sig.push(s[i]);
|
||||
else if (script.isKeyEncoding(s[i]))
|
||||
key.push(s[i]);
|
||||
}
|
||||
|
||||
hash = key.map(function(key) {
|
||||
return bcoin.wallet.key2hash(key);
|
||||
});
|
||||
|
||||
address = hash.map(function(hash) {
|
||||
return bcoin.wallet.hash2addr(hash, 'pubkey');
|
||||
});
|
||||
|
||||
return {
|
||||
type: 'unknown',
|
||||
none: true
|
||||
signatures: sig,
|
||||
keys: key,
|
||||
hashes: hash,
|
||||
addresses: address,
|
||||
none: key.length === 0
|
||||
};
|
||||
};
|
||||
|
||||
@ -1488,8 +1516,6 @@ script.isMultisig = function isMultisig(s, keys) {
|
||||
}
|
||||
|
||||
if (keys) {
|
||||
keys = utils.sortKeys(keys);
|
||||
|
||||
for (i = 1; i < n + 1; i++) {
|
||||
for (j = 0; j < keys.length; j++) {
|
||||
if (utils.isEqual(s[i], keys[j])) {
|
||||
|
||||
@ -18,11 +18,11 @@ var constants = bcoin.protocol.constants;
|
||||
function TX(data, block) {
|
||||
if (!(this instanceof TX))
|
||||
return new TX(data, block);
|
||||
this.type = 'tx';
|
||||
|
||||
if (!data)
|
||||
data = {};
|
||||
|
||||
this.type = 'tx';
|
||||
this.version = data.version || 1;
|
||||
this.inputs = [];
|
||||
this.outputs = [];
|
||||
@ -36,7 +36,6 @@ function TX(data, block) {
|
||||
|
||||
this.network = data.network || false;
|
||||
this.relayedBy = data.relayedBy || '0.0.0.0';
|
||||
this.rbf = !!data.rbf;
|
||||
|
||||
this._chain = data.chain;
|
||||
|
||||
@ -1269,7 +1268,7 @@ TX.prototype.isStandardInputs = function isStandardInputs(flags) {
|
||||
if (!input.out.tx)
|
||||
return false;
|
||||
|
||||
prev = input.out.tx[input.out.index];
|
||||
prev = input.out.tx.outputs[input.out.index];
|
||||
|
||||
if (!prev)
|
||||
return false;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user