Add support for Overwinter transactions.
This commit is contained in:
parent
97f7b5d3e3
commit
542b3f5893
|
@ -282,7 +282,19 @@ Transaction.prototype.toBuffer = function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
Transaction.prototype.toBufferWriter = function(writer) {
|
Transaction.prototype.toBufferWriter = function(writer) {
|
||||||
writer.writeUInt32LE(this.version);
|
if (!this.fOverwintered) {
|
||||||
|
writer.writeUInt32LE(this.version);
|
||||||
|
} else {
|
||||||
|
// We don't use bitwise operators which expect 32 bit operands and return a 32 bit signed integer.
|
||||||
|
// For example, var header = 0x80000000 | this.version; returns -7fffffff (-2147483645).
|
||||||
|
var header = 0x80000000 + this.version;
|
||||||
|
writer.writeUInt32LE(header);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.fOverwintered) {
|
||||||
|
writer.writeUInt32LE(this.nVersionGroupId);
|
||||||
|
}
|
||||||
|
|
||||||
writer.writeVarintNum(this.inputs.length);
|
writer.writeVarintNum(this.inputs.length);
|
||||||
_.each(this.inputs, function(input) {
|
_.each(this.inputs, function(input) {
|
||||||
input.toBufferWriter(writer);
|
input.toBufferWriter(writer);
|
||||||
|
@ -292,6 +304,11 @@ Transaction.prototype.toBufferWriter = function(writer) {
|
||||||
output.toBufferWriter(writer);
|
output.toBufferWriter(writer);
|
||||||
});
|
});
|
||||||
writer.writeUInt32LE(this.nLockTime);
|
writer.writeUInt32LE(this.nLockTime);
|
||||||
|
|
||||||
|
if (this.fOverwintered) {
|
||||||
|
writer.writeUInt32LE(this.nExpiryHeight);
|
||||||
|
}
|
||||||
|
|
||||||
if (this.version >= 2) {
|
if (this.version >= 2) {
|
||||||
writer.writeVarintNum(this.joinSplits.length);
|
writer.writeVarintNum(this.joinSplits.length);
|
||||||
_.each(this.joinSplits, function(jsdesc) {
|
_.each(this.joinSplits, function(jsdesc) {
|
||||||
|
@ -314,15 +331,15 @@ Transaction.prototype.fromBufferReader = function(reader) {
|
||||||
$.checkArgument(!reader.finished(), 'No transaction data received');
|
$.checkArgument(!reader.finished(), 'No transaction data received');
|
||||||
var i, sizeTxIns, sizeTxOuts, sizeJSDescs;
|
var i, sizeTxIns, sizeTxOuts, sizeJSDescs;
|
||||||
var header = reader.readUInt32LE();
|
var header = reader.readUInt32LE();
|
||||||
this.fOverwintered = header & 0x80000000;
|
|
||||||
|
|
||||||
if ( this.fOverwintered == true ) {
|
this.fOverwintered = ((header >>> 31) == 1);
|
||||||
this.version = header & 0x7fffffff;
|
if (this.fOverwintered == true) {
|
||||||
|
this.version = header & 0x7fffffff;
|
||||||
} else {
|
} else {
|
||||||
this.version = header;
|
this.version = header;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( this.version >= 3 ){
|
if (this.version >= 3 ){
|
||||||
this.nVersionGroupId = reader.readUInt32LE();
|
this.nVersionGroupId = reader.readUInt32LE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,10 +352,13 @@ Transaction.prototype.fromBufferReader = function(reader) {
|
||||||
for (i = 0; i < sizeTxOuts; i++) {
|
for (i = 0; i < sizeTxOuts; i++) {
|
||||||
this.outputs.push(Output.fromBufferReader(reader));
|
this.outputs.push(Output.fromBufferReader(reader));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.nLockTime = reader.readUInt32LE();
|
this.nLockTime = reader.readUInt32LE();
|
||||||
|
|
||||||
if (this.version >= 3) {
|
if (this.version >= 3) {
|
||||||
this.nExpiryHeight = reader.readUInt32LE();
|
this.nExpiryHeight = reader.readUInt32LE();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.version >= 2) {
|
if (this.version >= 2) {
|
||||||
sizeJSDescs = reader.readVarintNum();
|
sizeJSDescs = reader.readVarintNum();
|
||||||
for (i = 0; i < sizeJSDescs; i++) {
|
for (i = 0; i < sizeJSDescs; i++) {
|
||||||
|
@ -363,12 +383,19 @@ Transaction.prototype.toObject = Transaction.prototype.toJSON = function toObjec
|
||||||
});
|
});
|
||||||
var obj = {
|
var obj = {
|
||||||
hash: this.hash,
|
hash: this.hash,
|
||||||
|
fOverwintered: this.fOverwintered,
|
||||||
version: this.version,
|
version: this.version,
|
||||||
inputs: inputs,
|
inputs: inputs,
|
||||||
outputs: outputs,
|
outputs: outputs,
|
||||||
nLockTime: this.nLockTime
|
nLockTime: this.nLockTime
|
||||||
};
|
};
|
||||||
if (this.version >= 3) {
|
|
||||||
|
if (this.fOverwintered) {
|
||||||
|
obj.nVersionGroupId = this.nVersionGroupId;
|
||||||
|
obj.nExpiryHeight = this.nExpiryHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.version >= 2) {
|
||||||
var joinSplits = [];
|
var joinSplits = [];
|
||||||
this.joinSplits.forEach(function(joinSplit) {
|
this.joinSplits.forEach(function(joinSplit) {
|
||||||
joinSplits.push(joinSplit.toObject());
|
joinSplits.push(joinSplit.toObject());
|
||||||
|
@ -435,6 +462,17 @@ Transaction.prototype.fromObject = function fromObject(arg) {
|
||||||
}
|
}
|
||||||
this.nLockTime = transaction.nLockTime;
|
this.nLockTime = transaction.nLockTime;
|
||||||
this.version = transaction.version;
|
this.version = transaction.version;
|
||||||
|
|
||||||
|
|
||||||
|
this.fOverwintered = transaction.fOverwintered;
|
||||||
|
if (this.fOverwintered) {
|
||||||
|
this.nExpiryHeight = transaction.nExpiryHeight;
|
||||||
|
this.nVersionGroupId = transaction.nVersionGroupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (this.version >= 2) {
|
if (this.version >= 2) {
|
||||||
_.each(transaction.joinSplits, function(joinSplit) {
|
_.each(transaction.joinSplits, function(joinSplit) {
|
||||||
self.joinSplits.push(new JSDescription(joinSplit));
|
self.joinSplits.push(new JSDescription(joinSplit));
|
||||||
|
|
Loading…
Reference in New Issue