@@ -3,6 +3,7 @@ var bcrypto = require('./crypto')
33var fastMerkleRoot = require ( 'merkle-lib/fastRoot' )
44var typeforce = require ( 'typeforce' )
55var types = require ( './types' )
6+ var bufferutils = require ( './bufferutils' )
67var varuint = require ( 'varuint-bitcoin' )
78var networks = require ( './networks' )
89var 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
136115Block . 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