Skip to content

Commit 91e6c8a

Browse files
committed
Move to bufferutils and add BufferReader
1 parent cec5fb5 commit 91e6c8a

File tree

8 files changed

+233
-123
lines changed

8 files changed

+233
-123
lines changed

src/buffer_writer.js

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/bufferutils.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
'use strict';
22
Object.defineProperty(exports, '__esModule', { value: true });
3+
const types = require('./types');
4+
const typeforce = require('typeforce');
5+
const varuint = require('varuint-bitcoin');
36
// https://github.com/feross/buffer/blob/master/index.js#L1127
47
function verifuint(value, max) {
58
if (typeof value !== 'number')
@@ -38,3 +41,90 @@ function reverseBuffer(buffer) {
3841
return buffer;
3942
}
4043
exports.reverseBuffer = reverseBuffer;
44+
/**
45+
* Helper class for serialization of bitcoin data types into a pre-allocated buffer.
46+
*/
47+
class BufferWriter {
48+
constructor(buffer, offset = 0) {
49+
this.buffer = buffer;
50+
this.offset = offset;
51+
typeforce(types.tuple(types.Buffer, types.UInt32), [buffer, offset]);
52+
}
53+
writeUInt8(i) {
54+
this.offset = this.buffer.writeUInt8(i, this.offset);
55+
}
56+
writeInt32(i) {
57+
this.offset = this.buffer.writeInt32LE(i, this.offset);
58+
}
59+
writeUInt32(i) {
60+
this.offset = this.buffer.writeUInt32LE(i, this.offset);
61+
}
62+
writeUInt64(i) {
63+
this.offset = writeUInt64LE(this.buffer, i, this.offset);
64+
}
65+
writeVarInt(i) {
66+
varuint.encode(i, this.buffer, this.offset);
67+
this.offset += varuint.encode.bytes;
68+
}
69+
writeSlice(slice) {
70+
this.offset += slice.copy(this.buffer, this.offset);
71+
}
72+
writeVarSlice(slice) {
73+
this.writeVarInt(slice.length);
74+
this.writeSlice(slice);
75+
}
76+
writeVector(vector) {
77+
this.writeVarInt(vector.length);
78+
vector.forEach(buf => this.writeVarSlice(buf));
79+
}
80+
}
81+
exports.BufferWriter = BufferWriter;
82+
/**
83+
* Helper class for serialization of bitcoin data types into a pre-allocated buffer.
84+
*/
85+
class BufferReader {
86+
constructor(buffer, offset = 0) {
87+
this.buffer = buffer;
88+
this.offset = offset;
89+
typeforce(types.tuple(types.Buffer, types.UInt32), [buffer, offset]);
90+
}
91+
readUInt8() {
92+
const result = this.buffer.readUInt8(this.offset);
93+
this.offset++;
94+
return result;
95+
}
96+
readInt32() {
97+
const result = this.buffer.readInt32LE(this.offset);
98+
this.offset += 4;
99+
return result;
100+
}
101+
readUInt32() {
102+
const result = this.buffer.readUInt32LE(this.offset);
103+
this.offset += 4;
104+
return result;
105+
}
106+
readUInt64() {
107+
const result = readUInt64LE(this.buffer, this.offset);
108+
this.offset += 8;
109+
return result;
110+
}
111+
readVarInt() {
112+
const vi = varuint.decode(this.buffer, this.offset);
113+
this.offset += varuint.decode.bytes;
114+
return vi;
115+
}
116+
readSlice(n) {
117+
this.offset += n;
118+
return this.buffer.slice(this.offset - n, this.offset);
119+
}
120+
readVarSlice() {
121+
return this.readSlice(this.readVarInt());
122+
}
123+
readVector() {
124+
const count = this.readVarInt();
125+
const vector = [];
126+
for (let i = 0; i < count; i++) vector.push(this.readVarSlice());
127+
return vector;
128+
}
129+
}
130+
exports.BufferReader = BufferReader;

src/transaction.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
'use strict';
22
Object.defineProperty(exports, '__esModule', { value: true });
3-
const buffer_writer_1 = require('./buffer_writer');
43
const bufferutils = require('./bufferutils');
54
const bufferutils_1 = require('./bufferutils');
65
const bcrypto = require('./crypto');
@@ -303,7 +302,7 @@ class Transaction {
303302
let hashSequence = ZERO;
304303
if (!(hashType & Transaction.SIGHASH_ANYONECANPAY)) {
305304
tbuffer = Buffer.allocUnsafe(36 * this.ins.length);
306-
bufferWriter = new buffer_writer_1.BufferWriter(tbuffer, 0);
305+
bufferWriter = new bufferutils_1.BufferWriter(tbuffer, 0);
307306
this.ins.forEach(txIn => {
308307
bufferWriter.writeSlice(txIn.hash);
309308
bufferWriter.writeUInt32(txIn.index);
@@ -316,7 +315,7 @@ class Transaction {
316315
(hashType & 0x1f) !== Transaction.SIGHASH_NONE
317316
) {
318317
tbuffer = Buffer.allocUnsafe(4 * this.ins.length);
319-
bufferWriter = new buffer_writer_1.BufferWriter(tbuffer, 0);
318+
bufferWriter = new bufferutils_1.BufferWriter(tbuffer, 0);
320319
this.ins.forEach(txIn => {
321320
bufferWriter.writeUInt32(txIn.sequence);
322321
});
@@ -330,7 +329,7 @@ class Transaction {
330329
return sum + 8 + varSliceSize(output.script);
331330
}, 0);
332331
tbuffer = Buffer.allocUnsafe(txOutsSize);
333-
bufferWriter = new buffer_writer_1.BufferWriter(tbuffer, 0);
332+
bufferWriter = new bufferutils_1.BufferWriter(tbuffer, 0);
334333
this.outs.forEach(out => {
335334
bufferWriter.writeUInt64(out.value);
336335
bufferWriter.writeVarSlice(out.script);
@@ -342,13 +341,13 @@ class Transaction {
342341
) {
343342
const output = this.outs[inIndex];
344343
tbuffer = Buffer.allocUnsafe(8 + varSliceSize(output.script));
345-
bufferWriter = new buffer_writer_1.BufferWriter(tbuffer, 0);
344+
bufferWriter = new bufferutils_1.BufferWriter(tbuffer, 0);
346345
bufferWriter.writeUInt64(output.value);
347346
bufferWriter.writeVarSlice(output.script);
348347
hashOutputs = bcrypto.hash256(tbuffer);
349348
}
350349
tbuffer = Buffer.allocUnsafe(156 + varSliceSize(prevOutScript));
351-
bufferWriter = new buffer_writer_1.BufferWriter(tbuffer, 0);
350+
bufferWriter = new bufferutils_1.BufferWriter(tbuffer, 0);
352351
const input = this.ins[inIndex];
353352
bufferWriter.writeUInt32(this.version);
354353
bufferWriter.writeSlice(hashPrevouts);
@@ -388,7 +387,7 @@ class Transaction {
388387
}
389388
__toBuffer(buffer, initialOffset, _ALLOW_WITNESS = false) {
390389
if (!buffer) buffer = Buffer.allocUnsafe(this.byteLength(_ALLOW_WITNESS));
391-
const bufferWriter = new buffer_writer_1.BufferWriter(
390+
const bufferWriter = new bufferutils_1.BufferWriter(
392391
buffer,
393392
initialOffset || 0,
394393
);

ts_src/buffer_writer.ts

Lines changed: 0 additions & 54 deletions
This file was deleted.

ts_src/bufferutils.ts

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import * as types from './types';
2+
3+
const typeforce = require('typeforce');
4+
const varuint = require('varuint-bitcoin');
5+
16
// https://github.com/feross/buffer/blob/master/index.js#L1127
27
function verifuint(value: number, max: number): void {
38
if (typeof value !== 'number')
@@ -42,3 +47,102 @@ export function reverseBuffer(buffer: Buffer): Buffer {
4247
}
4348
return buffer;
4449
}
50+
51+
/**
52+
* Helper class for serialization of bitcoin data types into a pre-allocated buffer.
53+
*/
54+
export class BufferWriter {
55+
constructor(private buffer: Buffer, public offset: number = 0) {
56+
typeforce(types.tuple(types.Buffer, types.UInt32), [buffer, offset]);
57+
}
58+
59+
writeUInt8(i: number): void {
60+
this.offset = this.buffer.writeUInt8(i, this.offset);
61+
}
62+
63+
writeInt32(i: number): void {
64+
this.offset = this.buffer.writeInt32LE(i, this.offset);
65+
}
66+
67+
writeUInt32(i: number): void {
68+
this.offset = this.buffer.writeUInt32LE(i, this.offset);
69+
}
70+
71+
writeUInt64(i: number): void {
72+
this.offset = writeUInt64LE(this.buffer, i, this.offset);
73+
}
74+
75+
writeVarInt(i: number): void {
76+
varuint.encode(i, this.buffer, this.offset);
77+
this.offset += varuint.encode.bytes;
78+
}
79+
80+
writeSlice(slice: Buffer): void {
81+
this.offset += slice.copy(this.buffer, this.offset);
82+
}
83+
84+
writeVarSlice(slice: Buffer): void {
85+
this.writeVarInt(slice.length);
86+
this.writeSlice(slice);
87+
}
88+
89+
writeVector(vector: Buffer[]): void {
90+
this.writeVarInt(vector.length);
91+
vector.forEach((buf: Buffer) => this.writeVarSlice(buf));
92+
}
93+
}
94+
95+
/**
96+
* Helper class for serialization of bitcoin data types into a pre-allocated buffer.
97+
*/
98+
export class BufferReader {
99+
constructor(private buffer: Buffer, public offset: number = 0) {
100+
typeforce(types.tuple(types.Buffer, types.UInt32), [buffer, offset]);
101+
}
102+
103+
readUInt8(): number {
104+
const result = this.buffer.readUInt8(this.offset);
105+
this.offset++;
106+
return result;
107+
}
108+
109+
readInt32(): number {
110+
const result = this.buffer.readInt32LE(this.offset);
111+
this.offset += 4;
112+
return result;
113+
}
114+
115+
readUInt32(): number {
116+
const result = this.buffer.readUInt32LE(this.offset);
117+
this.offset += 4;
118+
return result;
119+
}
120+
121+
readUInt64(): number {
122+
const result = readUInt64LE(this.buffer, this.offset);
123+
this.offset += 8;
124+
return result;
125+
}
126+
127+
readVarInt(): number {
128+
const vi = varuint.decode(this.buffer, this.offset);
129+
this.offset += varuint.decode.bytes;
130+
return vi;
131+
}
132+
133+
readSlice(n: number): Buffer {
134+
this.offset += n;
135+
return this.buffer.slice(this.offset - n, this.offset);
136+
}
137+
138+
readVarSlice(): Buffer {
139+
return this.readSlice(this.readVarInt());
140+
}
141+
142+
readVector(): Buffer[] {
143+
const count = this.readVarInt();
144+
const vector: Buffer[] = [];
145+
for (let i = 0; i < count; i++) vector.push(this.readVarSlice());
146+
return vector;
147+
}
148+
}

ts_src/transaction.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { BufferWriter } from './buffer_writer';
21
import * as bufferutils from './bufferutils';
3-
import { reverseBuffer } from './bufferutils';
2+
import { BufferWriter, reverseBuffer } from './bufferutils';
43
import * as bcrypto from './crypto';
54
import * as bscript from './script';
65
import { OPS as opcodes } from './script';

types/buffer_writer.d.ts

Lines changed: 0 additions & 16 deletions
This file was deleted.

0 commit comments

Comments
 (0)