Remove private __byteLength from Transaction

This commit is contained in:
junderw 2019-12-09 10:37:55 +09:00
parent 48bf08c0d3
commit 10fcf3d9e1
No known key found for this signature in database
GPG key ID: B256185D3A971908
5 changed files with 50 additions and 60 deletions

View file

@ -137,8 +137,7 @@ class Block {
return ( return (
80 + 80 +
varuint.encodingLength(this.transactions.length) + varuint.encodingLength(this.transactions.length) +
// @ts-ignore using the __byteLength private method on Transaction this.transactions.reduce((a, x) => a + x.byteLength(allowWitness), 0)
this.transactions.reduce((a, x) => a + x.__byteLength(allowWitness), 0)
); );
} }
getHash() { getHash() {

View file

@ -179,15 +179,31 @@ class Transaction {
}); });
} }
weight() { weight() {
const base = this.__byteLength(false); const base = this.byteLength(false);
const total = this.__byteLength(true); const total = this.byteLength(true);
return base * 3 + total; return base * 3 + total;
} }
virtualSize() { virtualSize() {
return Math.ceil(this.weight() / 4); return Math.ceil(this.weight() / 4);
} }
byteLength() { byteLength(_ALLOW_WITNESS = true) {
return this.__byteLength(true); const hasWitnesses = _ALLOW_WITNESS && this.hasWitnesses();
return (
(hasWitnesses ? 10 : 8) +
varuint.encodingLength(this.ins.length) +
varuint.encodingLength(this.outs.length) +
this.ins.reduce((sum, input) => {
return sum + 40 + varSliceSize(input.script);
}, 0) +
this.outs.reduce((sum, output) => {
return sum + 8 + varSliceSize(output.script);
}, 0) +
(hasWitnesses
? this.ins.reduce((sum, input) => {
return sum + vectorSize(input.witness);
}, 0)
: 0)
);
} }
clone() { clone() {
const newTx = new Transaction(); const newTx = new Transaction();
@ -269,7 +285,7 @@ class Transaction {
txTmp.ins[inIndex].script = ourScript; txTmp.ins[inIndex].script = ourScript;
} }
// serialize and hash // serialize and hash
const buffer = Buffer.allocUnsafe(txTmp.__byteLength(false) + 4); const buffer = Buffer.allocUnsafe(txTmp.byteLength(false) + 4);
buffer.writeInt32LE(hashType, buffer.length - 4); buffer.writeInt32LE(hashType, buffer.length - 4);
txTmp.__toBuffer(buffer, 0, false); txTmp.__toBuffer(buffer, 0, false);
return bcrypto.hash256(buffer); return bcrypto.hash256(buffer);
@ -386,27 +402,8 @@ class Transaction {
typeforce(types.tuple(types.Number, [types.Buffer]), arguments); typeforce(types.tuple(types.Number, [types.Buffer]), arguments);
this.ins[index].witness = witness; this.ins[index].witness = witness;
} }
__byteLength(_ALLOW_WITNESS) { __toBuffer(buffer, initialOffset, _ALLOW_WITNESS = false) {
const hasWitnesses = _ALLOW_WITNESS && this.hasWitnesses(); if (!buffer) buffer = Buffer.allocUnsafe(this.byteLength(_ALLOW_WITNESS));
return (
(hasWitnesses ? 10 : 8) +
varuint.encodingLength(this.ins.length) +
varuint.encodingLength(this.outs.length) +
this.ins.reduce((sum, input) => {
return sum + 40 + varSliceSize(input.script);
}, 0) +
this.outs.reduce((sum, output) => {
return sum + 8 + varSliceSize(output.script);
}, 0) +
(hasWitnesses
? this.ins.reduce((sum, input) => {
return sum + vectorSize(input.witness);
}, 0)
: 0)
);
}
__toBuffer(buffer, initialOffset, _ALLOW_WITNESS) {
if (!buffer) buffer = Buffer.allocUnsafe(this.__byteLength(_ALLOW_WITNESS));
let offset = initialOffset || 0; let offset = initialOffset || 0;
function writeSlice(slice) { function writeSlice(slice) {
offset += slice.copy(buffer, offset); offset += slice.copy(buffer, offset);

View file

@ -160,8 +160,7 @@ export class Block {
return ( return (
80 + 80 +
varuint.encodingLength(this.transactions.length) + varuint.encodingLength(this.transactions.length) +
// @ts-ignore using the __byteLength private method on Transaction this.transactions.reduce((a, x) => a + x.byteLength(allowWitness), 0)
this.transactions.reduce((a, x) => a + x.__byteLength(allowWitness), 0)
); );
} }

View file

@ -237,8 +237,8 @@ export class Transaction {
} }
weight(): number { weight(): number {
const base = this.__byteLength(false); const base = this.byteLength(false);
const total = this.__byteLength(true); const total = this.byteLength(true);
return base * 3 + total; return base * 3 + total;
} }
@ -246,8 +246,25 @@ export class Transaction {
return Math.ceil(this.weight() / 4); return Math.ceil(this.weight() / 4);
} }
byteLength(): number { byteLength(_ALLOW_WITNESS: boolean = true): number {
return this.__byteLength(true); const hasWitnesses = _ALLOW_WITNESS && this.hasWitnesses();
return (
(hasWitnesses ? 10 : 8) +
varuint.encodingLength(this.ins.length) +
varuint.encodingLength(this.outs.length) +
this.ins.reduce((sum, input) => {
return sum + 40 + varSliceSize(input.script);
}, 0) +
this.outs.reduce((sum, output) => {
return sum + 8 + varSliceSize(output.script);
}, 0) +
(hasWitnesses
? this.ins.reduce((sum, input) => {
return sum + vectorSize(input.witness);
}, 0)
: 0)
);
} }
clone(): Transaction { clone(): Transaction {
@ -352,7 +369,7 @@ export class Transaction {
} }
// serialize and hash // serialize and hash
const buffer: Buffer = Buffer.allocUnsafe(txTmp.__byteLength(false) + 4); const buffer: Buffer = Buffer.allocUnsafe(txTmp.byteLength(false) + 4);
buffer.writeInt32LE(hashType, buffer.length - 4); buffer.writeInt32LE(hashType, buffer.length - 4);
txTmp.__toBuffer(buffer, 0, false); txTmp.__toBuffer(buffer, 0, false);
@ -506,34 +523,13 @@ export class Transaction {
this.ins[index].witness = witness; this.ins[index].witness = witness;
} }
private __byteLength(_ALLOW_WITNESS: boolean): number {
const hasWitnesses = _ALLOW_WITNESS && this.hasWitnesses();
return (
(hasWitnesses ? 10 : 8) +
varuint.encodingLength(this.ins.length) +
varuint.encodingLength(this.outs.length) +
this.ins.reduce((sum, input) => {
return sum + 40 + varSliceSize(input.script);
}, 0) +
this.outs.reduce((sum, output) => {
return sum + 8 + varSliceSize(output.script);
}, 0) +
(hasWitnesses
? this.ins.reduce((sum, input) => {
return sum + vectorSize(input.witness);
}, 0)
: 0)
);
}
private __toBuffer( private __toBuffer(
buffer?: Buffer, buffer?: Buffer,
initialOffset?: number, initialOffset?: number,
_ALLOW_WITNESS?: boolean, _ALLOW_WITNESS: boolean = false,
): Buffer { ): Buffer {
if (!buffer) if (!buffer)
buffer = Buffer.allocUnsafe(this.__byteLength(_ALLOW_WITNESS!)) as Buffer; buffer = Buffer.allocUnsafe(this.byteLength(_ALLOW_WITNESS)) as Buffer;
let offset = initialOffset || 0; let offset = initialOffset || 0;

View file

@ -30,7 +30,7 @@ export declare class Transaction {
hasWitnesses(): boolean; hasWitnesses(): boolean;
weight(): number; weight(): number;
virtualSize(): number; virtualSize(): number;
byteLength(): number; byteLength(_ALLOW_WITNESS?: boolean): number;
clone(): Transaction; clone(): Transaction;
/** /**
* Hash transaction for signing a specific input. * Hash transaction for signing a specific input.
@ -48,6 +48,5 @@ export declare class Transaction {
toHex(): string; toHex(): string;
setInputScript(index: number, scriptSig: Buffer): void; setInputScript(index: number, scriptSig: Buffer): void;
setWitness(index: number, witness: Buffer[]): void; setWitness(index: number, witness: Buffer[]): void;
private __byteLength;
private __toBuffer; private __toBuffer;
} }