Skip to content
This repository was archived by the owner on Jan 25, 2024. It is now read-only.

Commit 79d7700

Browse files
refactor(block): use BufferReader/BufferWriter
Tracking upstream change bitcoinjs/bitcoinjs-lib@f48abd3 Issue: BG-16466
1 parent fe8d6c6 commit 79d7700

File tree

1 file changed

+35
-67
lines changed

1 file changed

+35
-67
lines changed

src/block.js

Lines changed: 35 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ var bcrypto = require('./crypto')
33
var fastMerkleRoot = require('merkle-lib/fastRoot')
44
var typeforce = require('typeforce')
55
var types = require('./types')
6+
var bufferutils = require('./bufferutils')
67
var varuint = require('varuint-bitcoin')
78
var networks = require('./networks')
89
var coins = require('./coins')
@@ -33,57 +34,35 @@ Block.fromBuffer = function (buffer, network) {
3334
if (buffer.length < 80) throw new Error('Buffer too small (< 80 bytes)')
3435
network = network || networks.bitcoin
3536

36-
var offset = 0
37-
function readSlice (n) {
38-
offset += n
39-
return buffer.slice(offset - n, offset)
40-
}
41-
42-
function readUInt32 () {
43-
var i = buffer.readUInt32LE(offset)
44-
offset += 4
45-
return i
46-
}
47-
48-
function readInt32 () {
49-
var i = buffer.readInt32LE(offset)
50-
offset += 4
51-
return i
52-
}
53-
54-
function readVarInt () {
55-
var vi = varuint.decode(buffer, offset)
56-
offset += varuint.decode.bytes
57-
return vi
58-
}
37+
const bufferReader = new bufferutils.BufferReader(buffer)
5938

6039
var block = new Block(network)
61-
block.version = readInt32()
62-
block.prevHash = readSlice(32)
63-
block.merkleRoot = readSlice(32)
40+
block.version = bufferReader.readInt32()
41+
block.prevHash = bufferReader.readSlice(32)
42+
block.merkleRoot = bufferReader.readSlice(32)
6443
if (coins.isZcash(network)) {
65-
block.finalSaplingRoot = readSlice(32)
44+
block.finalSaplingRoot = bufferReader.readSlice(32)
6645
}
67-
block.timestamp = readUInt32()
68-
block.bits = readUInt32()
46+
block.timestamp = bufferReader.readUInt32()
47+
block.bits = bufferReader.readUInt32()
6948
if (coins.isZcash(network)) {
70-
block.nonce = readSlice(32)
71-
block.solutionSize = readVarInt()
72-
block.solution = readSlice(1344)
49+
block.nonce = bufferReader.readSlice(32)
50+
block.solutionSize = bufferReader.readVarInt()
51+
block.solution = bufferReader.readSlice(1344)
7352
} else {
7453
// Not sure sure why the nonce is read as UInt 32 and not as a slice
75-
block.nonce = readUInt32()
54+
block.nonce = bufferReader.readUInt32()
7655
}
7756

78-
if (buffer.length === 80) return block
57+
if (bufferReader.buffer.length === 80) return block
7958

8059
function readTransaction () {
81-
var tx = Transaction.fromBuffer(buffer.slice(offset), network, true)
82-
offset += tx.byteLength()
60+
var tx = Transaction.fromBuffer(buffer.slice(bufferReader.offset), network, true)
61+
bufferReader.offset += tx.byteLength()
8362
return tx
8463
}
8564

86-
var nTransactions = readVarInt()
65+
var nTransactions = bufferReader.readVarInt()
8766
block.transactions = []
8867

8968
for (var i = 0; i < nTransactions; ++i) {
@@ -135,49 +114,38 @@ Block.prototype.getUTCDate = function () {
135114
// TODO: buffer, offset compatibility
136115
Block.prototype.toBuffer = function (headersOnly) {
137116
var buffer = Buffer.allocUnsafe(this.byteLength(headersOnly))
117+
var bufferWriter = new bufferutils.BufferWriter(buffer)
138118

139-
var offset = 0
140-
function writeSlice (slice) {
141-
slice.copy(buffer, offset)
142-
offset += slice.length
143-
}
144-
145-
function writeInt32 (i) {
146-
buffer.writeInt32LE(i, offset)
147-
offset += 4
148-
}
149-
function writeUInt32 (i) {
150-
buffer.writeUInt32LE(i, offset)
151-
offset += 4
152-
}
153-
154-
writeInt32(this.version)
155-
writeSlice(this.prevHash)
156-
writeSlice(this.merkleRoot)
119+
bufferWriter.writeInt32(this.version)
120+
bufferWriter.writeSlice(this.prevHash)
121+
bufferWriter.writeSlice(this.merkleRoot)
157122
if (coins.isZcash(this.network)) {
158-
writeSlice(this.finalSaplingRoot)
123+
bufferWriter.writeSlice(this.finalSaplingRoot)
159124
}
160-
writeUInt32(this.timestamp)
161-
writeUInt32(this.bits)
125+
bufferWriter.writeUInt32(this.timestamp)
126+
bufferWriter.writeUInt32(this.bits)
162127
if (coins.isZcash(this.network)) {
163-
writeSlice(this.nonce)
164-
varuint.encode(this.solutionSize, buffer, offset)
165-
offset += varuint.encode.bytes
166-
writeSlice(this.solution)
128+
bufferWriter.writeSlice(this.nonce)
129+
// TODO: use writeVarInt
130+
varuint.encode(this.solutionSize, bufferWriter.buffer, bufferWriter.offset)
131+
bufferWriter.offset += varuint.encode.bytes
132+
bufferWriter.writeSlice(this.solution)
167133
} else {
168134
// Not sure sure why the nonce is interpreted as UInt 32 and not a slice in bitcoin
169-
writeUInt32(this.nonce)
135+
bufferWriter.writeUInt32(this.nonce)
170136
}
171137

172138
if (headersOnly || !this.transactions) return buffer
173139

174-
varuint.encode(this.transactions.length, buffer, offset)
175-
offset += varuint.encode.bytes
140+
// TODO: use writeVarInt
141+
varuint.encode(this.transactions.length, bufferWriter.buffer, bufferWriter.offset)
142+
bufferWriter.offset += varuint.encode.bytes
176143

144+
// TODO: use writeVarInt
177145
this.transactions.forEach(function (tx) {
178146
var txSize = tx.byteLength() // TODO: extract from toBuffer?
179-
tx.toBuffer(buffer, offset)
180-
offset += txSize
147+
tx.toBuffer(bufferWriter.buffer, bufferWriter.offset)
148+
bufferWriter.offset += txSize
181149
})
182150

183151
return buffer

0 commit comments

Comments
 (0)