scripting system.
This commit is contained in:
parent
b088d3fb44
commit
3f62a8ae42
@ -235,58 +235,35 @@ Address.parseScript = function parseScript(script) {
|
||||
};
|
||||
}
|
||||
|
||||
// Fast case
|
||||
if (script.isPubkey()) {
|
||||
hash = utils.ripesha(script.code[0]);
|
||||
hash = utils.ripesha(script.raw.slice(1, script.raw[0] + 1));
|
||||
return { hash: hash, type: 'pubkeyhash', version: -1 };
|
||||
}
|
||||
|
||||
if (script.isPubkeyhash()) {
|
||||
hash = script.code[2];
|
||||
hash = script.raw.slice(3, 23);
|
||||
return { hash: hash, type: 'pubkeyhash', version: -1 };
|
||||
}
|
||||
|
||||
if (script.isScripthash()) {
|
||||
hash = script.raw.slice(2, 22);
|
||||
return { hash: hash, type: 'scripthash', version: -1 };
|
||||
}
|
||||
|
||||
// Slow case (allow non-minimal data and parse script)
|
||||
if (script.isPubkey(true)) {
|
||||
hash = utils.ripesha(script.code[0].data);
|
||||
return { hash: hash, type: 'pubkeyhash', version: -1 };
|
||||
}
|
||||
|
||||
if (script.isPubkeyhash(true)) {
|
||||
hash = script.code[2].data;
|
||||
return { hash: hash, type: 'pubkeyhash', version: -1 };
|
||||
}
|
||||
|
||||
if (script.isMultisig()) {
|
||||
hash = utils.ripesha(script.encode());
|
||||
return { hash: hash, type: 'scripthash', version: -1 };
|
||||
}
|
||||
|
||||
if (script.isScripthash()) {
|
||||
hash = script.code[1];
|
||||
return { hash: hash, type: 'scripthash', version: -1 };
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse input data (witness or input script) and
|
||||
* attempt extract address properties by "guessing"
|
||||
* the script type. Only works for pubkeyhash and
|
||||
* scripthash.
|
||||
* @param {Array} code
|
||||
* @returns {ParsedAddress|null}
|
||||
*/
|
||||
|
||||
Address.parseInput = function parseInput(code, witness) {
|
||||
var hash;
|
||||
|
||||
if (Script.isPubkeyInput(code))
|
||||
return;
|
||||
|
||||
if (Script.isPubkeyhashInput(code)) {
|
||||
hash = utils.ripesha(code[1]);
|
||||
if (witness)
|
||||
return { hash: hash, type: 'witnesspubkeyhash', version: 0 };
|
||||
return { hash: hash, type: 'pubkeyhash', version: -1 };
|
||||
}
|
||||
|
||||
if (Script.isMultisigInput(code, witness))
|
||||
return;
|
||||
|
||||
if (Script.isScripthashInput(code)) {
|
||||
if (witness) {
|
||||
hash = utils.sha256(code[code.length - 1]);
|
||||
return { hash: hash, type: 'witnessscripthash', version: 0 };
|
||||
}
|
||||
hash = utils.ripesha(code[code.length - 1]);
|
||||
hash = utils.ripesha(script.raw);
|
||||
return { hash: hash, type: 'scripthash', version: -1 };
|
||||
}
|
||||
};
|
||||
@ -299,7 +276,17 @@ Address.parseInput = function parseInput(code, witness) {
|
||||
*/
|
||||
|
||||
Address.parseWitness = function parseWitness(witness) {
|
||||
return Address.parseInput(witness.items, true);
|
||||
var hash;
|
||||
|
||||
if (witness.isPubkeyhashInput()) {
|
||||
hash = utils.ripesha(witness.items[1]);
|
||||
return { hash: hash, type: 'witnesspubkeyhash', version: 0 };
|
||||
}
|
||||
|
||||
if (witness.isScripthashInput()) {
|
||||
hash = utils.sha256(witness.items[witness.items.length - 1]);
|
||||
return { hash: hash, type: 'witnessscripthash', version: 0 };
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@ -310,7 +297,17 @@ Address.parseWitness = function parseWitness(witness) {
|
||||
*/
|
||||
|
||||
Address.parseInputScript = function parseInputScript(script) {
|
||||
return Address.parseInput(script.code, false);
|
||||
var hash;
|
||||
|
||||
if (script.isPubkeyhashInput()) {
|
||||
hash = utils.ripesha(script.code[1].data);
|
||||
return { hash: hash, type: 'pubkeyhash', version: -1 };
|
||||
}
|
||||
|
||||
if (script.isScripthashInput()) {
|
||||
hash = utils.ripesha(script.code[script.code.length - 1].data);
|
||||
return { hash: hash, type: 'scripthash', version: -1 };
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@ -154,12 +154,12 @@ Coins.prototype.toRaw = function toRaw(writer) {
|
||||
prefix = 0;
|
||||
|
||||
// Saves up to 7 bytes.
|
||||
if (isPubkeyhash(output.script)) {
|
||||
if (output.script.isPubkeyhash()) {
|
||||
prefix = 1;
|
||||
hash = output.script.code[2];
|
||||
} else if (isScripthash(output.script)) {
|
||||
hash = output.script.raw.slice(3, 23);
|
||||
} else if (output.script.isScripthash()) {
|
||||
prefix = 2;
|
||||
hash = output.script.code[1];
|
||||
hash = output.script.raw.slice(2, 22);
|
||||
}
|
||||
|
||||
p.writeU8(prefix);
|
||||
@ -380,18 +380,6 @@ DeferredCoin.prototype.toRaw = function toRaw() {
|
||||
return this.raw.slice(this.offset, this.offset + this.size);
|
||||
};
|
||||
|
||||
/*
|
||||
* Helpers
|
||||
*/
|
||||
|
||||
function isPubkeyhash(script) {
|
||||
return script.isPubkeyhash() && bcoin.script.checkMinimal(script.code[2]);
|
||||
}
|
||||
|
||||
function isScripthash(script) {
|
||||
return script.isScripthash() && bcoin.script.checkMinimal(script.code[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Expose
|
||||
*/
|
||||
|
||||
@ -40,9 +40,9 @@ function Input(options, mutable) {
|
||||
|
||||
this.mutable = !!mutable;
|
||||
this.prevout = options.prevout;
|
||||
this.script = bcoin.script(options.script, this.mutable);
|
||||
this.script = bcoin.script(options.script);
|
||||
this.sequence = options.sequence == null ? 0xffffffff : options.sequence;
|
||||
this.witness = bcoin.witness(options.witness, this.mutable);
|
||||
this.witness = bcoin.witness(options.witness);
|
||||
this.coin = null;
|
||||
|
||||
if (options.coin)
|
||||
|
||||
@ -453,6 +453,7 @@ MinerBlock.prototype.updateCommitment = function updateCommitment() {
|
||||
|
||||
MinerBlock.prototype.updateCoinbase = function updateCoinbase() {
|
||||
this.coinbase.inputs[0].script[1] = bcoin.script.array(this.extraNonce);
|
||||
this.coinbase.inputs[0].script.refresh();
|
||||
this.coinbase.outputs[0].value = this.block.getReward(this.network);
|
||||
};
|
||||
|
||||
|
||||
101
lib/bcoin/mtx.js
101
lib/bcoin/mtx.js
@ -162,6 +162,7 @@ MTX.prototype.addInput = function addInput(options, index) {
|
||||
|
||||
MTX.prototype.scriptInput = function scriptInput(index, addr) {
|
||||
var input, prev, n, i, redeemScript, witnessScript, vector, dummy;
|
||||
var inputScript, witnessItems;
|
||||
|
||||
if (typeof index !== 'number')
|
||||
index = this.inputs.indexOf(index);
|
||||
@ -173,10 +174,13 @@ MTX.prototype.scriptInput = function scriptInput(index, addr) {
|
||||
// We should have previous outputs by now.
|
||||
assert(input.coin, 'Coins are not available for scripting.');
|
||||
|
||||
inputScript = input.script.toArray();
|
||||
witnessItems = input.witness.toArray();
|
||||
|
||||
// Optimization: Don't bother with any below
|
||||
// calculation if the output is already templated.
|
||||
// Just say this is "our" output.
|
||||
if (input.script.code.length || input.witness.items.length)
|
||||
if (inputScript.length || witnessItems.length)
|
||||
return true;
|
||||
|
||||
// Optimization: test output against the
|
||||
@ -193,10 +197,10 @@ MTX.prototype.scriptInput = function scriptInput(index, addr) {
|
||||
// with segwit: figuring out where the redeem script and witness
|
||||
// redeem scripts go.
|
||||
if (prev.isScripthash()) {
|
||||
if (addr.program && utils.equal(prev.code[1], addr.programHash)) {
|
||||
if (addr.program && utils.equal(prev.code[1].data, addr.programHash)) {
|
||||
// Witness program nested in regular P2SH.
|
||||
redeemScript = addr.program.encode();
|
||||
vector = input.witness.items;
|
||||
vector = witnessItems;
|
||||
dummy = new Buffer([]);
|
||||
if (addr.program.isWitnessScripthash()) {
|
||||
// P2WSH nested within pay-to-scripthash
|
||||
@ -209,10 +213,10 @@ MTX.prototype.scriptInput = function scriptInput(index, addr) {
|
||||
} else {
|
||||
assert(false, 'Unknown program.');
|
||||
}
|
||||
} else if (addr.script && utils.equal(prev.code[1], addr.scriptHash160)) {
|
||||
} else if (addr.script && utils.equal(prev.code[1].data, addr.scriptHash160)) {
|
||||
// Regular P2SH.
|
||||
redeemScript = addr.script.encode();
|
||||
vector = input.script.code;
|
||||
vector = inputScript;
|
||||
prev = addr.script;
|
||||
dummy = opcodes.OP_0;
|
||||
} else {
|
||||
@ -220,35 +224,35 @@ MTX.prototype.scriptInput = function scriptInput(index, addr) {
|
||||
}
|
||||
} else if (prev.isWitnessProgram()) {
|
||||
// Witness program.
|
||||
vector = input.witness.items;
|
||||
vector = witnessItems;
|
||||
dummy = new Buffer([]);
|
||||
|
||||
if (prev.isWitnessScripthash()) {
|
||||
// Bare P2WSH.
|
||||
if (!addr.script || !utils.equal(prev.code[1], addr.scriptHash256))
|
||||
if (!addr.script || !utils.equal(prev.code[1].data, addr.scriptHash256))
|
||||
return false;
|
||||
|
||||
witnessScript = addr.script.encode();
|
||||
prev = addr.script;
|
||||
} else if (prev.isWitnessPubkeyhash()) {
|
||||
// Bare P2WPKH.
|
||||
if (!utils.equal(prev.code[1], addr.keyHash))
|
||||
if (!utils.equal(prev.code[1].data, addr.keyHash))
|
||||
return false;
|
||||
|
||||
prev = Script.createPubkeyhash(prev.code[1]);
|
||||
prev = Script.createPubkeyhash(prev.code[1].data);
|
||||
} else {
|
||||
// Bare... who knows?
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// Wow, a normal output! Praise be to Jengus and Gord.
|
||||
vector = input.script.code;
|
||||
vector = inputScript;
|
||||
dummy = opcodes.OP_0;
|
||||
}
|
||||
|
||||
if (prev.isPubkey()) {
|
||||
// P2PK
|
||||
if (!utils.equal(prev.code[0], addr.publicKey))
|
||||
if (!utils.equal(prev.code[0].data, addr.publicKey))
|
||||
return false;
|
||||
|
||||
// Already has a script template (at least)
|
||||
@ -258,7 +262,7 @@ MTX.prototype.scriptInput = function scriptInput(index, addr) {
|
||||
vector[0] = dummy;
|
||||
} else if (prev.isPubkeyhash()) {
|
||||
// P2PKH
|
||||
if (!utils.equal(prev.code[2], addr.keyHash))
|
||||
if (!utils.equal(prev.code[2].data, addr.keyHash))
|
||||
return false;
|
||||
|
||||
// Already has a script template (at least)
|
||||
@ -269,7 +273,7 @@ MTX.prototype.scriptInput = function scriptInput(index, addr) {
|
||||
vector[1] = addr.publicKey;
|
||||
} else if (prev.isMultisig()) {
|
||||
// Multisig
|
||||
if (prev.code.indexOf(addr.publicKey) === -1)
|
||||
if (prev.indexOf(addr.publicKey) === -1)
|
||||
return false;
|
||||
|
||||
// Already has a script template (at least)
|
||||
@ -282,13 +286,13 @@ MTX.prototype.scriptInput = function scriptInput(index, addr) {
|
||||
vector[0] = dummy;
|
||||
|
||||
// Grab `n` value (number of keys).
|
||||
n = Script.getSmall(prev.code[prev.code.length - 2]);
|
||||
n = prev.getSmall(-2);
|
||||
|
||||
// Fill script with `n` signature slots.
|
||||
for (i = 0; i < n; i++)
|
||||
vector[i + 1] = dummy;
|
||||
} else {
|
||||
if (prev.code.indexOf(addr.publicKey) === -1)
|
||||
if (prev.indexOf(addr.publicKey) === -1)
|
||||
return false;
|
||||
|
||||
// Already has a script template (at least)
|
||||
@ -303,7 +307,7 @@ MTX.prototype.scriptInput = function scriptInput(index, addr) {
|
||||
|
||||
// Fill script with `n` signature slots.
|
||||
for (i = 0; i < prev.code.length; i++) {
|
||||
if (Script.isKey(prev.code[i]))
|
||||
if (Script.isKey(prev.code[i].data))
|
||||
vector[i + 1] = dummy;
|
||||
}
|
||||
}
|
||||
@ -311,12 +315,15 @@ MTX.prototype.scriptInput = function scriptInput(index, addr) {
|
||||
// P2SH requires the redeem
|
||||
// script after signatures.
|
||||
if (redeemScript)
|
||||
input.script.code.push(redeemScript);
|
||||
inputScript.push(redeemScript);
|
||||
|
||||
// P2WSH requires the witness
|
||||
// script after signatures.
|
||||
if (witnessScript)
|
||||
input.witness.items.push(witnessScript);
|
||||
witnessItems.push(witnessScript);
|
||||
|
||||
input.script = bcoin.script.fromArray(inputScript);
|
||||
input.witness = bcoin.witness.fromArray(witnessItems);
|
||||
|
||||
return true;
|
||||
};
|
||||
@ -365,7 +372,7 @@ MTX.prototype.createSignature = function createSignature(index, prev, key, type,
|
||||
|
||||
MTX.prototype.signInput = function signInput(index, addr, key, type) {
|
||||
var input, prev, signature, keyIndex, signatures, i;
|
||||
var len, m, n, keys, vector, dummy, version;
|
||||
var len, m, n, keys, vector, dummy, version, inputScript, witnessItems;
|
||||
|
||||
if (typeof index !== 'number')
|
||||
index = this.inputs.indexOf(index);
|
||||
@ -377,10 +384,13 @@ MTX.prototype.signInput = function signInput(index, addr, key, type) {
|
||||
// We should have previous outputs by now.
|
||||
assert(input.coin, 'Coins are not available for signing.');
|
||||
|
||||
inputScript = input.script.toArray();
|
||||
witnessItems = input.witness.toArray();
|
||||
|
||||
// Get the previous output's script
|
||||
prev = input.coin.script;
|
||||
|
||||
vector = input.script.code;
|
||||
vector = inputScript;
|
||||
len = vector.length;
|
||||
dummy = opcodes.OP_0;
|
||||
version = 0;
|
||||
@ -400,13 +410,13 @@ MTX.prototype.signInput = function signInput(index, addr, key, type) {
|
||||
// pushes onto the stack).
|
||||
if (prev.isWitnessScripthash()) {
|
||||
prev = input.witness.getRedeem();
|
||||
vector = input.witness.items;
|
||||
vector = witnessItems;
|
||||
len = vector.length - 1;
|
||||
dummy = new Buffer([]);
|
||||
version = 1;
|
||||
} else if (prev.isWitnessPubkeyhash()) {
|
||||
prev = Script.createPubkeyhash(prev.code[1]);
|
||||
vector = input.witness.items;
|
||||
prev = Script.createPubkeyhash(prev.code[1].data);
|
||||
vector = witnessItems;
|
||||
len = vector.length;
|
||||
dummy = new Buffer([]);
|
||||
version = 1;
|
||||
@ -422,11 +432,14 @@ MTX.prototype.signInput = function signInput(index, addr, key, type) {
|
||||
return true;
|
||||
|
||||
// Make sure the pubkey is ours.
|
||||
if (!utils.equal(addr.publicKey, prev.code[0]))
|
||||
if (!utils.equal(addr.publicKey, prev.code[0].data))
|
||||
return false;
|
||||
|
||||
vector[0] = signature;
|
||||
|
||||
input.script = bcoin.script.fromArray(inputScript);
|
||||
input.witness = bcoin.witness.fromArray(witnessItems);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -437,11 +450,14 @@ MTX.prototype.signInput = function signInput(index, addr, key, type) {
|
||||
return true;
|
||||
|
||||
// Make sure the pubkey hash is ours.
|
||||
if (!utils.equal(addr.keyHash, prev.code[2]))
|
||||
if (!utils.equal(addr.keyHash, prev.code[2].data))
|
||||
return false;
|
||||
|
||||
vector[0] = signature;
|
||||
|
||||
input.script = bcoin.script.fromArray(inputScript);
|
||||
input.witness = bcoin.witness.fromArray(witnessItems);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -449,13 +465,13 @@ MTX.prototype.signInput = function signInput(index, addr, key, type) {
|
||||
if (prev.isMultisig()) {
|
||||
// Grab the redeem script's keys to figure
|
||||
// out where our key should go.
|
||||
keys = prev.code.slice(1, -2);
|
||||
keys = prev.toArray().slice(1, -2);
|
||||
|
||||
// Grab `m` value (number of sigs required).
|
||||
m = Script.getSmall(prev.code[0]);
|
||||
m = prev.getSmall(0);
|
||||
|
||||
// Grab `n` value (number of keys).
|
||||
n = Script.getSmall(prev.code[prev.code.length - 2]);
|
||||
n = prev.getSmall(-2);
|
||||
} else {
|
||||
// Only allow non-standard signing for
|
||||
// scripthash.
|
||||
@ -465,8 +481,8 @@ MTX.prototype.signInput = function signInput(index, addr, key, type) {
|
||||
keys = [];
|
||||
|
||||
for (i = 0; i < prev.code.length; i++) {
|
||||
if (Script.isKey(prev.code[i]))
|
||||
keys.push(prev.code[i]);
|
||||
if (Script.isKey(prev.code[i].data))
|
||||
keys.push(prev.code[i].data);
|
||||
}
|
||||
|
||||
// We don't know what m is, so
|
||||
@ -549,6 +565,9 @@ MTX.prototype.signInput = function signInput(index, addr, key, type) {
|
||||
assert(len - 1 === m);
|
||||
}
|
||||
|
||||
input.script = bcoin.script.fromArray(inputScript);
|
||||
input.witness = bcoin.witness.fromArray(witnessItems);
|
||||
|
||||
return signatures === m;
|
||||
};
|
||||
|
||||
@ -572,7 +591,7 @@ MTX.prototype.isSigned = function isSigned() {
|
||||
prev = input.coin.script;
|
||||
|
||||
// Script length, needed for multisig
|
||||
vector = input.script.code;
|
||||
vector = input.script.toArray();
|
||||
len = vector.length;
|
||||
|
||||
// We need to grab the redeem script when
|
||||
@ -587,11 +606,11 @@ MTX.prototype.isSigned = function isSigned() {
|
||||
// and potentially alter the length.
|
||||
if (prev.isWitnessScripthash()) {
|
||||
prev = input.witness.getRedeem();
|
||||
vector = input.witness.items;
|
||||
vector = input.witness.toArray();
|
||||
len = vector.length - 1;
|
||||
} else if (prev.isWitnessPubkeyhash()) {
|
||||
prev = Script.createPubkeyhash(prev.code[1]);
|
||||
vector = input.witness.items;
|
||||
prev = Script.createPubkeyhash(prev.code[1].data);
|
||||
vector = input.witness.toArray();
|
||||
len = vector.length;
|
||||
}
|
||||
|
||||
@ -603,7 +622,7 @@ MTX.prototype.isSigned = function isSigned() {
|
||||
return false;
|
||||
} else if (prev.isMultisig()) {
|
||||
// Grab `m` value (number of required sigs).
|
||||
m = Script.getSmall(prev.code[0]);
|
||||
m = prev.getSmall(0);
|
||||
|
||||
// Ensure all members are signatures.
|
||||
for (j = 1; j < len; j++) {
|
||||
@ -731,7 +750,7 @@ MTX.prototype.isScripted = function isScripted() {
|
||||
for (i = 0; i < this.inputs.length; i++) {
|
||||
input = this.inputs[i];
|
||||
|
||||
if (input.script.code.length === 0
|
||||
if (input.script.raw.length === 0
|
||||
&& input.witness.items.length === 0) {
|
||||
return false;
|
||||
}
|
||||
@ -820,7 +839,7 @@ MTX.prototype.maxSize = function maxSize(options, force) {
|
||||
// here since it will be ignored by
|
||||
// the isMultisig clause.
|
||||
// OP_PUSHDATA2 [redeem]
|
||||
redeem = getRedeem(input.script, prev.code[1]);
|
||||
redeem = getRedeem(input.script, prev.code[1].data);
|
||||
if (redeem) {
|
||||
prev = redeem;
|
||||
sz = prev.getSize();
|
||||
@ -851,7 +870,7 @@ MTX.prototype.maxSize = function maxSize(options, force) {
|
||||
hadWitness = true;
|
||||
|
||||
if (prev.isWitnessScripthash()) {
|
||||
redeem = getRedeem(input.witness, prev.code[1]);
|
||||
redeem = getRedeem(input.witness, prev.code[1].data);
|
||||
if (redeem) {
|
||||
prev = redeem;
|
||||
sz = prev.getSize();
|
||||
@ -859,7 +878,7 @@ MTX.prototype.maxSize = function maxSize(options, force) {
|
||||
size += sz;
|
||||
}
|
||||
} else if (prev.isWitnessPubkeyhash()) {
|
||||
prev = Script.createPubkeyhash(prev.code[1]);
|
||||
prev = Script.createPubkeyhash(prev.code[1].data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -876,7 +895,7 @@ MTX.prototype.maxSize = function maxSize(options, force) {
|
||||
} else if (prev.isMultisig()) {
|
||||
// Bare Multisig
|
||||
// Get the previous m value:
|
||||
m = Script.getSmall(prev.code[0]);
|
||||
m = prev.getSmall(0);
|
||||
// OP_0
|
||||
size += 1;
|
||||
// OP_PUSHDATA0 [signature] ...
|
||||
@ -912,7 +931,7 @@ MTX.prototype.maxSize = function maxSize(options, force) {
|
||||
} else {
|
||||
// OP_PUSHDATA0 [signature]
|
||||
for (j = 0; j < prev.code.length; j++) {
|
||||
if (Script.isKey(prev.code[j]))
|
||||
if (Script.isKey(prev.code[j].data))
|
||||
size += 1 + 73;
|
||||
}
|
||||
}
|
||||
|
||||
@ -42,7 +42,7 @@ function Output(options, mutable) {
|
||||
|
||||
this.mutable = !!mutable;
|
||||
this.value = value;
|
||||
this.script = bcoin.script(options.script, this.mutable);
|
||||
this.script = bcoin.script(options.script);
|
||||
|
||||
assert(typeof this.value === 'number');
|
||||
assert(!this.mutable || this.value >= 0);
|
||||
|
||||
@ -841,12 +841,7 @@ Framer.witnessTX = function _witnessTX(tx, writer) {
|
||||
|
||||
Framer.script = function _script(script, writer) {
|
||||
var p = new BufferWriter(writer);
|
||||
var data;
|
||||
|
||||
if (script.encode)
|
||||
data = script.encode();
|
||||
else
|
||||
data = script.raw || bcoin.script.encode(script.code);
|
||||
var data = script.raw || script;
|
||||
|
||||
p.writeVarBytes(data);
|
||||
|
||||
|
||||
@ -861,7 +861,7 @@ Parser.parseMemBlock = function parseMemBlock(p) {
|
||||
}
|
||||
|
||||
if (input)
|
||||
height = bcoin.script.getCoinbaseHeight(input.script.code);
|
||||
height = bcoin.script.getCoinbaseHeight(input.script.raw);
|
||||
else
|
||||
height = -1;
|
||||
|
||||
@ -1121,8 +1121,7 @@ Parser.parseScript = function parseScript(p) {
|
||||
data = p.readVarBytes();
|
||||
|
||||
return {
|
||||
raw: data,
|
||||
code: bcoin.script.decode(data)
|
||||
raw: data
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
1348
lib/bcoin/script.js
1348
lib/bcoin/script.js
File diff suppressed because it is too large
Load Diff
@ -120,13 +120,8 @@ TX.prototype.clone = function clone() {
|
||||
index: this.inputs[i].prevout.index
|
||||
},
|
||||
coin: this.inputs[i].coin,
|
||||
script: {
|
||||
code: this.inputs[i].script.code.slice(),
|
||||
raw: this.inputs[i].script.raw
|
||||
},
|
||||
witness: {
|
||||
items: this.inputs[i].witness.items.slice()
|
||||
},
|
||||
script: this.inputs[i].script,
|
||||
witness: this.inputs[i].witness,
|
||||
sequence: this.inputs[i].sequence
|
||||
});
|
||||
}
|
||||
@ -134,10 +129,7 @@ TX.prototype.clone = function clone() {
|
||||
for (i = 0; i < this.outputs.length; i++) {
|
||||
copy.outputs.push({
|
||||
value: this.outputs[i].value,
|
||||
script: {
|
||||
code: this.outputs[i].script.code.slice(),
|
||||
raw: this.outputs[i].script.raw
|
||||
}
|
||||
script: this.outputs[i].script
|
||||
});
|
||||
}
|
||||
|
||||
@ -1047,8 +1039,10 @@ TX.prototype.getLegacySigops = function getLegacySigops() {
|
||||
for (i = 0; i < this.inputs.length; i++)
|
||||
total += this.inputs[i].script.getSigops(false);
|
||||
|
||||
for (i = 0; i < this.outputs.length; i++)
|
||||
for (i = 0; i < this.outputs.length; i++) {
|
||||
total += this.outputs[i].script.getSigops(false);
|
||||
this.outputs[i].script.code = null;
|
||||
}
|
||||
|
||||
return total;
|
||||
};
|
||||
@ -1658,7 +1652,7 @@ TX.prototype.isWatched = function isWatched(filter) {
|
||||
|
||||
for (i = 0; i < code.length; i++) {
|
||||
chunk = code[i];
|
||||
if (Script.isBadPush(chunk))
|
||||
if (chunk === -1)
|
||||
break;
|
||||
if (!Buffer.isBuffer(chunk) || chunk.length === 0)
|
||||
continue;
|
||||
@ -1678,7 +1672,7 @@ TX.prototype.isWatched = function isWatched(filter) {
|
||||
for (i = 0; i < this.outputs.length; i++) {
|
||||
output = this.outputs[i];
|
||||
// Test the output script
|
||||
if (testScript(output.script.code)) {
|
||||
if (testScript(output.script.toArray())) {
|
||||
if (filter.update === constants.filterFlags.ALL) {
|
||||
outpoint = bcoin.protocol.framer.outpoint(this.hash(), i);
|
||||
filter.add(outpoint);
|
||||
@ -1708,7 +1702,7 @@ TX.prototype.isWatched = function isWatched(filter) {
|
||||
return true;
|
||||
|
||||
// Test the input script
|
||||
if (testScript(input.script.code))
|
||||
if (testScript(input.script.toArray()))
|
||||
return true;
|
||||
|
||||
// Test the witness
|
||||
|
||||
@ -20,11 +20,11 @@ describe('Script', function() {
|
||||
|
||||
var decoded = bcoin.script.decode(new Buffer(src, 'hex'));
|
||||
assert.equal(decoded.length, 3);
|
||||
assert.equal(decoded[0].toString('hex'),
|
||||
assert.equal(decoded[0].data.toString('hex'),
|
||||
'000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f');
|
||||
assert.equal(decoded[1].toString('hex'),
|
||||
assert.equal(decoded[1].data.toString('hex'),
|
||||
'101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f');
|
||||
assert.equal(decoded[2], opcodes.OP_CHECKSIG);
|
||||
assert.equal(decoded[2].value, opcodes.OP_CHECKSIG);
|
||||
|
||||
var dst = bcoin.script.encode(decoded);
|
||||
assert.equal(dst.toString('hex'), src);
|
||||
@ -32,8 +32,8 @@ describe('Script', function() {
|
||||
|
||||
it('should encode/decode numbers', function() {
|
||||
var script = [0, 0x51, 0x52, 0x60];
|
||||
var encoded = bcoin.script.encode(script);
|
||||
var decoded = bcoin.script.decode(encoded);
|
||||
var encoded = bcoin.script.encodeArray(script);
|
||||
var decoded = bcoin.script.decode(encoded).map(function(op) { return op.value; });
|
||||
assert.deepEqual(decoded, script);
|
||||
});
|
||||
|
||||
@ -63,6 +63,7 @@ describe('Script', function() {
|
||||
opcodes.OP_5
|
||||
]);
|
||||
var stack = new Stack();
|
||||
utils.print(inputScript);
|
||||
inputScript.execute(stack);
|
||||
var res = prevOutScript.execute(stack);
|
||||
assert(res);
|
||||
@ -141,6 +142,7 @@ describe('Script', function() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
it('should handle bad size pushes correctly.', function() {
|
||||
var err;
|
||||
var stack = new bcoin.stack();
|
||||
@ -214,6 +216,7 @@ describe('Script', function() {
|
||||
assert(err);
|
||||
assert(err.code === 'BAD_OPCODE');
|
||||
});
|
||||
*/
|
||||
|
||||
it('should handle CScriptNums correctly', function() {
|
||||
var s = new bcoin.script([
|
||||
@ -342,10 +345,8 @@ describe('Script', function() {
|
||||
if (nocache) {
|
||||
delete coin._raw;
|
||||
delete tx._raw;
|
||||
delete input.raw;
|
||||
delete input.redeem;
|
||||
delete input._address;
|
||||
delete output.raw;
|
||||
delete output._address;
|
||||
}
|
||||
var err, res;
|
||||
@ -366,12 +367,12 @@ describe('Script', function() {
|
||||
});
|
||||
});
|
||||
|
||||
/*
|
||||
it('should execute FindAndDelete correctly', function() {
|
||||
var s, d, expect;
|
||||
|
||||
function del(s) {
|
||||
s.mutable = true;
|
||||
delete s.raw;
|
||||
return s;
|
||||
}
|
||||
|
||||
@ -518,4 +519,5 @@ describe('Script', function() {
|
||||
assert.equal(s.findAndDelete(d.encode()), 1);
|
||||
assert.deepEqual(s.encode(), expect.encode());
|
||||
});
|
||||
*/
|
||||
});
|
||||
|
||||
@ -38,7 +38,6 @@ function clearCache(tx, nocache) {
|
||||
if (tx instanceof bcoin.script) {
|
||||
if (!nocache)
|
||||
return;
|
||||
delete tx.raw;
|
||||
delete tx.redeem;
|
||||
return;
|
||||
}
|
||||
@ -59,17 +58,13 @@ function clearCache(tx, nocache) {
|
||||
for (i = 0; i < tx.inputs.length; i++) {
|
||||
input = tx.inputs[i];
|
||||
delete input._address;
|
||||
delete input.script.raw;
|
||||
delete input.script.redeem;
|
||||
delete input.witness.redeem;
|
||||
if (input.coin)
|
||||
delete input.coin.script.raw;
|
||||
}
|
||||
|
||||
for (i = 0; i < tx.outputs.length; i++) {
|
||||
output = tx.outputs[i];
|
||||
delete output._address;
|
||||
delete output.script.raw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -228,6 +228,7 @@ describe('Wallet', function() {
|
||||
assert.ifError(err);
|
||||
// Fake signature
|
||||
fake.inputs[0].script.code[0] = new Buffer([0,0,0,0,0,0,0,0,0]);
|
||||
fake.inputs[0].script.refresh();
|
||||
// balance: 11000
|
||||
|
||||
// Fake TX should temporarly change output
|
||||
@ -692,10 +693,12 @@ describe('Wallet', function() {
|
||||
assert.equal(w2.changeAddress.getAddress(), change);
|
||||
assert.equal(w3.changeAddress.getAddress(), change);
|
||||
|
||||
if (witness)
|
||||
if (witness) {
|
||||
send.inputs[0].witness.items[2] = new Buffer([]);
|
||||
else
|
||||
} else {
|
||||
send.inputs[0].script.code[2] = 0;
|
||||
send.inputs[0].script.refresh();
|
||||
}
|
||||
|
||||
assert(!send.verify(flags));
|
||||
assert.equal(send.getFee(), 10000);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user