Validate signatures from both 0.8.7 and 0.10.4 using OMIT_TX_COMMENT flag
This commit is contained in:
parent
a764fa2eca
commit
9184bf1cfa
@ -545,6 +545,14 @@ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) {
|
|||||||
|
|
||||||
bw.writeU32(this.locktime);
|
bw.writeU32(this.locktime);
|
||||||
|
|
||||||
|
var fOmitTxComment = !!(type & hashType.OMIT_TX_COMMENT);
|
||||||
|
|
||||||
|
if (this.version >= 2 && !fOmitTxComment) {
|
||||||
|
bw.writeVarBytes(Buffer.from(this.strFloData));
|
||||||
|
}
|
||||||
|
|
||||||
|
type &= ~hashType.OMIT_TX_COMMENT;
|
||||||
|
|
||||||
// Append the hash type.
|
// Append the hash type.
|
||||||
bw.writeU32(type);
|
bw.writeU32(type);
|
||||||
|
|
||||||
@ -594,6 +602,19 @@ TX.prototype.hashSize = function hashSize(index, prev, type) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var fOmitTxComment = !!(type & hashType.OMIT_TX_COMMENT);
|
||||||
|
|
||||||
|
if (!fOmitTxComment){
|
||||||
|
let bufferLength = Buffer.from(this.strFloData).length;
|
||||||
|
|
||||||
|
if (this.strFloData.length > 0){
|
||||||
|
size += encoding.sizeVarint(bufferLength);
|
||||||
|
size += bufferLength
|
||||||
|
} else {
|
||||||
|
size += encoding.sizeVarint(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size += 8;
|
size += 8;
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
@ -709,10 +730,19 @@ TX.prototype.checksig = function checksig(index, prev, value, sig, key, version)
|
|||||||
if (sig.length === 0)
|
if (sig.length === 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const type = sig[sig.length - 1];
|
let type = sig[sig.length - 1];
|
||||||
const hash = this.signatureHash(index, prev, value, type, version);
|
let signature = sig.slice(0, -1);
|
||||||
|
let hash = this.signatureHash(index, prev, value, type, version);
|
||||||
|
|
||||||
return secp256k1.verify(hash, sig.slice(0, -1), key);
|
if (secp256k1.verify(hash, signature, key)){
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
type ^= hashType.OMIT_TX_COMMENT;
|
||||||
|
|
||||||
|
hash = this.signatureHash(index, prev, value, type, version);
|
||||||
|
|
||||||
|
return secp256k1.verify(hash, signature, key);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2194,7 +2224,8 @@ TX.prototype.getJSON = function getJSON(network, view, entry, index) {
|
|||||||
return output.getJSON(network);
|
return output.getJSON(network);
|
||||||
}),
|
}),
|
||||||
locktime: this.locktime,
|
locktime: this.locktime,
|
||||||
hex: this.toRaw().toString('hex')
|
hex: this.toRaw().toString('hex'),
|
||||||
|
floData: this.strFloData
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2296,7 +2327,7 @@ TX.prototype.fromReader = function fromReader(br) {
|
|||||||
|
|
||||||
if (this.version >= 2){
|
if (this.version >= 2){
|
||||||
var floDataBuffer = br.readVarBytes();
|
var floDataBuffer = br.readVarBytes();
|
||||||
this.floDataStr = Buffer.from(floDataBuffer).toString();
|
this.strFloData = Buffer.from(floDataBuffer).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.mutable) {
|
if (!this.mutable) {
|
||||||
@ -2369,7 +2400,7 @@ TX.prototype.fromWitnessReader = function fromWitnessReader(br) {
|
|||||||
if (this.version >= 2){
|
if (this.version >= 2){
|
||||||
var floDataLength = br.readVarint();
|
var floDataLength = br.readVarint();
|
||||||
var floDataBuffer = br.readBytes(floDataLength);
|
var floDataBuffer = br.readBytes(floDataLength);
|
||||||
this.floDataStr = Buffer.from(floDataBuffer).toString();
|
this.strFloData = Buffer.from(floDataBuffer).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.mutable && hasWitness) {
|
if (!this.mutable && hasWitness) {
|
||||||
@ -2438,7 +2469,6 @@ TX.prototype.writeNormal = function writeNormal(bw) {
|
|||||||
bw.writeU32(this.locktime);
|
bw.writeU32(this.locktime);
|
||||||
|
|
||||||
if (this.version >= 2){
|
if (this.version >= 2){
|
||||||
bw.writeVarint(this.strFloData);
|
|
||||||
bw.writeVarBytes(Buffer.from(this.strFloData));
|
bw.writeVarBytes(Buffer.from(this.strFloData));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2507,6 +2537,17 @@ TX.prototype.getNormalSizes = function getNormalSizes() {
|
|||||||
for (const output of this.outputs)
|
for (const output of this.outputs)
|
||||||
base += output.getSize();
|
base += output.getSize();
|
||||||
|
|
||||||
|
if (this.version >= 2){
|
||||||
|
let bufferLength = Buffer.from(this.strFloData).length;
|
||||||
|
|
||||||
|
if (this.strFloData.length > 0){
|
||||||
|
base += encoding.sizeVarint(bufferLength);
|
||||||
|
base += bufferLength
|
||||||
|
} else {
|
||||||
|
base += encoding.sizeVarint(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
base += 4;
|
base += 4;
|
||||||
|
|
||||||
return new RawTX(base, 0);
|
return new RawTX(base, 0);
|
||||||
|
|||||||
@ -286,7 +286,13 @@ exports.hashType = {
|
|||||||
* Sign only the current input (mask).
|
* Sign only the current input (mask).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ANYONECANPAY: 0x80
|
ANYONECANPAY: 0x80,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Omit the Flo TX Comment from the signature
|
||||||
|
*/
|
||||||
|
|
||||||
|
OMIT_TX_COMMENT: (1 << 6)
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -1169,9 +1169,21 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers
|
|||||||
let res = false;
|
let res = false;
|
||||||
|
|
||||||
if (sig.length > 0) {
|
if (sig.length > 0) {
|
||||||
const type = sig[sig.length - 1];
|
let type = sig[sig.length - 1];
|
||||||
const hash = tx.signatureHash(index, subscript, value, type, version);
|
let hash;
|
||||||
res = checksig(hash, sig, key);
|
|
||||||
|
try {
|
||||||
|
hash = tx.signatureHash(index, subscript, value, type, version);
|
||||||
|
res = checksig(hash, sig, key);
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
if (!res){
|
||||||
|
type ^= Script.hashType.OMIT_TX_COMMENT;
|
||||||
|
try {
|
||||||
|
hash = tx.signatureHash(index, subscript, value, type, version);
|
||||||
|
res = checksig(hash, sig, key);
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!res && (flags & Script.flags.VERIFY_NULLFAIL)) {
|
if (!res && (flags & Script.flags.VERIFY_NULLFAIL)) {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "fcoin",
|
"name": "fcoin",
|
||||||
"version": "1.0.0-beta.16",
|
"version": "1.0.0-beta.17",
|
||||||
"description": "Flo bike-shed",
|
"description": "Flo bike-shed",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "git://github.com/oipwg/fcoin.git",
|
"repository": "git://github.com/oipwg/fcoin.git",
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user