Add support for Overwinter transactions.

This commit is contained in:
Simon 2018-05-07 23:28:04 -07:00
parent 97f7b5d3e3
commit 542b3f5893
1 changed files with 45 additions and 7 deletions

View File

@ -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));