From db24f468cbbac7704ae200d398f2ed2599459e40 Mon Sep 17 00:00:00 2001 From: PastaClaw Date: Tue, 26 May 2026 11:52:22 -0500 Subject: [PATCH 1/4] feat(encoding,block): accept Uint8Array as input alongside Buffer --- lib/block/blockheader.js | 4 ++-- lib/encoding/bufferreader.js | 4 ++-- lib/util/buffer.js | 15 ++++++++++++--- test/block/blockheader.js | 18 ++++++++++++++++++ test/encoding/bufferreader.js | 12 ++++++++++++ 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/lib/block/blockheader.js b/lib/block/blockheader.js index 64df63090..7992425b3 100644 --- a/lib/block/blockheader.js +++ b/lib/block/blockheader.js @@ -1,6 +1,6 @@ const _ = require('lodash'); const BN = require('../crypto/bn'); -const { isBuffer, reverse: reverseBuffer } = require('../util/buffer'); +const { isBytes, isBuffer, reverse: reverseBuffer } = require('../util/buffer'); const BufferReader = require('../encoding/bufferreader'); const BufferWriter = require('../encoding/bufferwriter'); const Hash = require('../crypto/hash'); @@ -47,7 +47,7 @@ const BlockHeader = function BlockHeader(arg) { */ BlockHeader._from = function _from(arg) { let info = {}; - if (isBuffer(arg)) { + if (isBytes(arg)) { info = BlockHeader._fromBufferReader(BufferReader(arg)); } else if (_.isObject(arg)) { info = BlockHeader._fromObject(arg); diff --git a/lib/encoding/bufferreader.js b/lib/encoding/bufferreader.js index 2ff70db80..cb5e0c683 100644 --- a/lib/encoding/bufferreader.js +++ b/lib/encoding/bufferreader.js @@ -21,9 +21,9 @@ var BufferReader = function BufferReader(buf) { if (_.isUndefined(buf)) { return; } - if (Buffer.isBuffer(buf)) { + if (buf instanceof Uint8Array) { this.set({ - buf: buf, + buf: Buffer.isBuffer(buf) ? buf : Buffer.from(buf), }); } else if (_.isString(buf)) { this.set({ diff --git a/lib/util/buffer.js b/lib/util/buffer.js index e53c8171a..ee360bfd6 100644 --- a/lib/util/buffer.js +++ b/lib/util/buffer.js @@ -52,14 +52,23 @@ module.exports = { }, /** - * Returns true if the given argument is an instance of a buffer. Tests for - * both node's Buffer and Uint8Array + * Returns true if the given argument is an instance of a buffer. * * @param {*} arg * @return {boolean} */ isBuffer: function isBuffer(arg) { - return Buffer.isBuffer(arg) || arg instanceof Uint8Array; + return Buffer.isBuffer(arg); + }, + + /** + * Returns true if the given argument is a byte array, including Buffer. + * + * @param {*} arg + * @return {boolean} + */ + isBytes: function isBytes(arg) { + return arg instanceof Uint8Array; }, /** diff --git a/test/block/blockheader.js b/test/block/blockheader.js index a3020de05..da877e4d1 100644 --- a/test/block/blockheader.js +++ b/test/block/blockheader.js @@ -161,6 +161,24 @@ describe('BlockHeader', function () { .toString('hex') .should.equal(bhhex); }); + + it('should accept Uint8Array', function () { + var bytes = new Uint8Array(bhbuf); + var fromBuffer = BlockHeader.fromBuffer(bhbuf); + var fromBytes = new BlockHeader(bytes); + + fromBytes.version.should.equal(fromBuffer.version); + fromBytes.prevHash.toString('hex').should.equal( + fromBuffer.prevHash.toString('hex') + ); + fromBytes.merkleRoot.toString('hex').should.equal( + fromBuffer.merkleRoot.toString('hex') + ); + fromBytes.time.should.equal(fromBuffer.time); + fromBytes.bits.should.equal(fromBuffer.bits); + fromBytes.nonce.should.equal(fromBuffer.nonce); + fromBytes.toBuffer().toString('hex').should.equal(bhhex); + }); }); describe('#fromBufferReader', function () { diff --git a/test/encoding/bufferreader.js b/test/encoding/bufferreader.js index ca3d77813..dd3086175 100644 --- a/test/encoding/bufferreader.js +++ b/test/encoding/bufferreader.js @@ -23,6 +23,18 @@ describe('BufferReader', function () { should.exist(br); Buffer.isBuffer(br.buf).should.equal(true); }); + + it('should accept Uint8Array', function () { + var bytes = new Uint8Array([1, 2, 0x34, 0x12, 0xdd, 0xcc, 0xbb, 0xaa]); + var br = new BufferReader(bytes); + should.exist(br); + Buffer.isBuffer(br.buf).should.equal(true); + br.readUInt8().should.equal(1); + br.readUInt8().should.equal(2); + br.readUInt16LE().should.equal(0x1234); + br.readUInt32LE().should.equal(0xaabbccdd); + }); + it('should fail for invalid object', function () { var fail = function () { return new BufferReader(5); From 45d8b3ec12f4182034929071673fb3783f3338f4 Mon Sep 17 00:00:00 2001 From: PastaClaw Date: Tue, 26 May 2026 12:07:40 -0500 Subject: [PATCH 2/4] docs(block): document Uint8Array block header input --- lib/block/blockheader.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/block/blockheader.js b/lib/block/blockheader.js index 7992425b3..415efbb24 100644 --- a/lib/block/blockheader.js +++ b/lib/block/blockheader.js @@ -12,7 +12,7 @@ const GENESIS_BITS = 0x1d00ffff; * Instantiate a BlockHeader from a Buffer, JSON object, or Object with * the properties of the BlockHeader * - * @param {BlockHeader.fromObjectParams|Buffer} arg - A Buffer, JSON string, or Object + * @param {BlockHeader.fromObjectParams|Buffer|Uint8Array} arg - A Buffer, Uint8Array, JSON string, or Object * @returns {BlockHeader} - An instance of block header * @constructor */ @@ -40,7 +40,7 @@ const BlockHeader = function BlockHeader(arg) { }; /** - * @param {BlockHeader.fromObjectParams|Buffer} arg - A Buffer, JSON string or Object + * @param {BlockHeader.fromObjectParams|Buffer|Uint8Array} arg - A Buffer, Uint8Array, JSON string or Object * @returns {Object} - An object representing block header data * @throws {TypeError} - If the argument was not recognized * @private From 121d48b6a0dda4cfb4e61d4a005c683055a2587e Mon Sep 17 00:00:00 2001 From: PastaClaw Date: Tue, 26 May 2026 12:08:01 -0500 Subject: [PATCH 3/4] fix(util): preserve isBuffer byte-array semantics --- lib/util/buffer.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/util/buffer.js b/lib/util/buffer.js index ee360bfd6..078cea971 100644 --- a/lib/util/buffer.js +++ b/lib/util/buffer.js @@ -52,13 +52,14 @@ module.exports = { }, /** - * Returns true if the given argument is an instance of a buffer. + * Returns true if the given argument is an instance of a buffer. Tests for + * both node's Buffer and Uint8Array * * @param {*} arg * @return {boolean} */ isBuffer: function isBuffer(arg) { - return Buffer.isBuffer(arg); + return Buffer.isBuffer(arg) || arg instanceof Uint8Array; }, /** From 18e6f550a161a641dfb73440ff16959b92e15809 Mon Sep 17 00:00:00 2001 From: PastaClaw Date: Tue, 26 May 2026 12:23:27 -0500 Subject: [PATCH 4/4] refactor(util): reuse existing byte buffer predicate --- lib/block/blockheader.js | 4 ++-- lib/util/buffer.js | 10 ---------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/lib/block/blockheader.js b/lib/block/blockheader.js index 415efbb24..7390a2a28 100644 --- a/lib/block/blockheader.js +++ b/lib/block/blockheader.js @@ -1,6 +1,6 @@ const _ = require('lodash'); const BN = require('../crypto/bn'); -const { isBytes, isBuffer, reverse: reverseBuffer } = require('../util/buffer'); +const { isBuffer, reverse: reverseBuffer } = require('../util/buffer'); const BufferReader = require('../encoding/bufferreader'); const BufferWriter = require('../encoding/bufferwriter'); const Hash = require('../crypto/hash'); @@ -47,7 +47,7 @@ const BlockHeader = function BlockHeader(arg) { */ BlockHeader._from = function _from(arg) { let info = {}; - if (isBytes(arg)) { + if (isBuffer(arg)) { info = BlockHeader._fromBufferReader(BufferReader(arg)); } else if (_.isObject(arg)) { info = BlockHeader._fromObject(arg); diff --git a/lib/util/buffer.js b/lib/util/buffer.js index 078cea971..e53c8171a 100644 --- a/lib/util/buffer.js +++ b/lib/util/buffer.js @@ -62,16 +62,6 @@ module.exports = { return Buffer.isBuffer(arg) || arg instanceof Uint8Array; }, - /** - * Returns true if the given argument is a byte array, including Buffer. - * - * @param {*} arg - * @return {boolean} - */ - isBytes: function isBytes(arg) { - return arg instanceof Uint8Array; - }, - /** * Returns a zero-filled byte array *