Merge pull request #5160 from mempool/mononaut/fix-nonstandard-label-bug
Fix incorrect non-standard label on reserved segwit output types
This commit is contained in:
commit
136af78147
@ -258,9 +258,15 @@ export class Common {
|
|||||||
let opreturnCount = 0;
|
let opreturnCount = 0;
|
||||||
for (const vout of tx.vout) {
|
for (const vout of tx.vout) {
|
||||||
// scriptpubkey
|
// scriptpubkey
|
||||||
if (['unknown', 'provably_unspendable', 'empty'].includes(vout.scriptpubkey_type)) {
|
if (['nonstandard', 'provably_unspendable', 'empty'].includes(vout.scriptpubkey_type)) {
|
||||||
// (non-standard output type)
|
// (non-standard output type)
|
||||||
return true;
|
return true;
|
||||||
|
} else if (vout.scriptpubkey_type === 'unknown') {
|
||||||
|
// undefined segwit version/length combinations are actually standard in outputs
|
||||||
|
// https://github.com/bitcoin/bitcoin/blob/2c79abc7ad4850e9e3ba32a04c530155cda7f980/src/script/interpreter.cpp#L1950-L1951
|
||||||
|
if (vout.scriptpubkey.startsWith('00') || !this.isWitnessProgram(vout.scriptpubkey)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
} else if (vout.scriptpubkey_type === 'multisig') {
|
} else if (vout.scriptpubkey_type === 'multisig') {
|
||||||
if (!DEFAULT_PERMIT_BAREMULTISIG) {
|
if (!DEFAULT_PERMIT_BAREMULTISIG) {
|
||||||
// bare-multisig
|
// bare-multisig
|
||||||
@ -308,6 +314,27 @@ export class Common {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A witness program is any valid scriptpubkey that consists of a 1-byte push opcode
|
||||||
|
// followed by a data push between 2 and 40 bytes.
|
||||||
|
// https://github.com/bitcoin/bitcoin/blob/2c79abc7ad4850e9e3ba32a04c530155cda7f980/src/script/script.cpp#L224-L240
|
||||||
|
static isWitnessProgram(scriptpubkey: string): false | { version: number, program: string } {
|
||||||
|
if (scriptpubkey.length < 8 || scriptpubkey.length > 84) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const version = parseInt(scriptpubkey.slice(0,2), 16);
|
||||||
|
if (version !== 0 && version < 0x51 || version > 0x60) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const push = parseInt(scriptpubkey.slice(2,4), 16);
|
||||||
|
if (push + 2 === (scriptpubkey.length / 2)) {
|
||||||
|
return {
|
||||||
|
version: version ? version - 0x50 : 0,
|
||||||
|
program: scriptpubkey.slice(4),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static getNonWitnessSize(tx: TransactionExtended): number {
|
static getNonWitnessSize(tx: TransactionExtended): number {
|
||||||
let weight = tx.weight;
|
let weight = tx.weight;
|
||||||
let hasWitness = false;
|
let hasWitness = false;
|
||||||
|
@ -147,9 +147,15 @@ export function isNonStandard(tx: Transaction): boolean {
|
|||||||
let opreturnCount = 0;
|
let opreturnCount = 0;
|
||||||
for (const vout of tx.vout) {
|
for (const vout of tx.vout) {
|
||||||
// scriptpubkey
|
// scriptpubkey
|
||||||
if (['unknown', 'provably_unspendable', 'empty'].includes(vout.scriptpubkey_type)) {
|
if (['nonstandard', 'provably_unspendable', 'empty'].includes(vout.scriptpubkey_type)) {
|
||||||
// (non-standard output type)
|
// (non-standard output type)
|
||||||
return true;
|
return true;
|
||||||
|
} else if (vout.scriptpubkey_type === 'unknown') {
|
||||||
|
// undefined segwit version/length combinations are actually standard in outputs
|
||||||
|
// https://github.com/bitcoin/bitcoin/blob/2c79abc7ad4850e9e3ba32a04c530155cda7f980/src/script/interpreter.cpp#L1950-L1951
|
||||||
|
if (vout.scriptpubkey.startsWith('00') || !isWitnessProgram(vout.scriptpubkey)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
} else if (vout.scriptpubkey_type === 'multisig') {
|
} else if (vout.scriptpubkey_type === 'multisig') {
|
||||||
if (!DEFAULT_PERMIT_BAREMULTISIG) {
|
if (!DEFAULT_PERMIT_BAREMULTISIG) {
|
||||||
// bare-multisig
|
// bare-multisig
|
||||||
@ -197,6 +203,27 @@ export function isNonStandard(tx: Transaction): boolean {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A witness program is any valid scriptpubkey that consists of a 1-byte push opcode
|
||||||
|
// followed by a data push between 2 and 40 bytes.
|
||||||
|
// https://github.com/bitcoin/bitcoin/blob/2c79abc7ad4850e9e3ba32a04c530155cda7f980/src/script/script.cpp#L224-L240
|
||||||
|
function isWitnessProgram(scriptpubkey: string): false | { version: number, program: string } {
|
||||||
|
if (scriptpubkey.length < 8 || scriptpubkey.length > 84) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const version = parseInt(scriptpubkey.slice(0,2), 16);
|
||||||
|
if (version !== 0 && version < 0x51 || version > 0x60) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const push = parseInt(scriptpubkey.slice(2,4), 16);
|
||||||
|
if (push + 2 === (scriptpubkey.length / 2)) {
|
||||||
|
return {
|
||||||
|
version: version ? version - 0x50 : 0,
|
||||||
|
program: scriptpubkey.slice(4),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
export function getNonWitnessSize(tx: Transaction): number {
|
export function getNonWitnessSize(tx: Transaction): number {
|
||||||
let weight = tx.weight;
|
let weight = tx.weight;
|
||||||
let hasWitness = false;
|
let hasWitness = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user