move reader and writer.
This commit is contained in:
parent
5fb16d29e6
commit
b356790136
@ -9,6 +9,7 @@ var network = require('./network');
|
||||
var constants = require('./constants');
|
||||
var utils = require('../utils');
|
||||
var assert = utils.assert;
|
||||
var BufferWriter = require('../writer');
|
||||
|
||||
/**
|
||||
* Framer
|
||||
@ -233,7 +234,7 @@ Framer._inv = function _inv(items, writer) {
|
||||
|
||||
assert(items.length <= 50000);
|
||||
|
||||
p.writeIntv(items.length);
|
||||
p.writeUIntv(items.length);
|
||||
|
||||
for (i = 0; i < items.length; i++) {
|
||||
p.writeU32(constants.inv[items[i].type]);
|
||||
@ -305,7 +306,7 @@ Framer._getBlocks = function _getBlocks(hashes, stop, writer) {
|
||||
var i;
|
||||
|
||||
p.writeU32(constants.version);
|
||||
p.writeIntv(hashes.length);
|
||||
p.writeUIntv(hashes.length);
|
||||
|
||||
for (i = 0; i < hashes.length; i++)
|
||||
p.writeHash(hashes[i]);
|
||||
@ -582,7 +583,7 @@ Framer._block = function _block(block, useWitness, writer) {
|
||||
p.writeU32(block.ts);
|
||||
p.writeU32(block.bits);
|
||||
p.writeU32(block.nonce);
|
||||
p.writeIntv(block.txs.length);
|
||||
p.writeUIntv(block.txs.length);
|
||||
|
||||
for (i = 0; i < block.txs.length; i++) {
|
||||
Framer.renderTX(block.txs[i], useWitness, p);
|
||||
@ -609,7 +610,7 @@ Framer.merkleBlock = function _merkleBlock(block, writer) {
|
||||
p.writeU32(block.nonce);
|
||||
p.writeU32(block.totalTX);
|
||||
|
||||
p.writeIntv(block.hashes.length);
|
||||
p.writeUIntv(block.hashes.length);
|
||||
|
||||
for (i = 0; i < block.hashes.length; i++)
|
||||
p.writeHash(block.hashes[i]);
|
||||
@ -631,7 +632,7 @@ Framer.headers = function _headers(block, writer) {
|
||||
p.writeU32(block.ts);
|
||||
p.writeU32(block.bits);
|
||||
p.writeU32(block.nonce);
|
||||
p.writeIntv(block.totalTX);
|
||||
p.writeUIntv(block.totalTX);
|
||||
|
||||
if (!writer)
|
||||
p = p.render();
|
||||
@ -643,7 +644,7 @@ Framer.reject = function reject(details, writer) {
|
||||
var p = new BufferWriter(writer);
|
||||
|
||||
p.writeVarString(details.message || '', 'ascii');
|
||||
p.writeU8(details.ccode || constants.reject.malformed);
|
||||
p.writeU8(constants.reject[details.ccode] || constants.reject.malformed);
|
||||
p.writeVarString(details.reason || '', 'ascii');
|
||||
if (details.data)
|
||||
p.writeBytes(details.data);
|
||||
@ -658,7 +659,7 @@ Framer.addr = function addr(peers, writer) {
|
||||
var p = new BufferWriter(writer);
|
||||
var i, peer;
|
||||
|
||||
p.writeIntv(peers.length);
|
||||
p.writeUIntv(peers.length);
|
||||
|
||||
for (i = 0; i < peers.length; i++) {
|
||||
peer = peers[i];
|
||||
@ -681,169 +682,8 @@ Framer.mempool = function mempool() {
|
||||
return new Buffer([]);
|
||||
};
|
||||
|
||||
function BufferWriter(options) {
|
||||
if (options instanceof BufferWriter)
|
||||
return options;
|
||||
|
||||
if (!(this instanceof BufferWriter))
|
||||
return new BufferWriter(options);
|
||||
|
||||
this.data = [];
|
||||
this.written = 0;
|
||||
}
|
||||
|
||||
BufferWriter.prototype.render = function render() {
|
||||
var data = new Buffer(this.written);
|
||||
var off = 0;
|
||||
var i, item;
|
||||
|
||||
for (i = 0; i < this.data.length; i++) {
|
||||
item = this.data[i];
|
||||
switch (item[0]) {
|
||||
case 'u8': off += utils.writeU8(data, item[1], off); break;
|
||||
case 'u16': off += utils.writeU16(data, item[1], off); break;
|
||||
case 'u16be': off += utils.writeU16BE(data, item[1], off); break;
|
||||
case 'u32': off += utils.writeU32(data, item[1], off); break;
|
||||
case 'u32be': off += utils.writeU32BE(data, item[1], off); break;
|
||||
case 'u64': off += utils.writeU64(data, item[1], off); break;
|
||||
case 'u64be': off += utils.writeU64BE(data, item[1], off); break;
|
||||
case '8': off += utils.write8(data, item[1], off); break;
|
||||
case '16': off += utils.write16(data, item[1], off); break;
|
||||
case '16be': off += utils.write16BE(data, item[1], off); break;
|
||||
case '32': off += utils.write32(data, item[1], off); break;
|
||||
case '32be': off += utils.write32BE(data, item[1], off); break;
|
||||
case '64': off += utils.write64(data, item[1], off); break;
|
||||
case '64be': off += utils.write64BE(data, item[1], off); break;
|
||||
case 'varint': off += utils.writeIntv(data, item[1], off); break;
|
||||
case 'bytes': off += utils.copy(item[1], data, off); break;
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU8 = function writeU8(value) {
|
||||
this.written += 1;
|
||||
this.data.push(['u8', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU16 = function writeU16(value) {
|
||||
this.written += 2;
|
||||
this.data.push(['u16', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU16BE = function writeU16BE(value) {
|
||||
this.written += 2;
|
||||
this.data.push(['u16be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU32 = function writeU32(value) {
|
||||
this.written += 4;
|
||||
this.data.push(['u32', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU32BE = function writeU32BE(value) {
|
||||
this.written += 4;
|
||||
this.data.push(['u32be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU64 = function writeU64(value) {
|
||||
this.written += 8;
|
||||
this.data.push(['u64', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU64BE = function writeU64BE(value) {
|
||||
this.written += 8;
|
||||
this.data.push(['u64be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write8 = function write8(value) {
|
||||
this.written += 1;
|
||||
this.data.push(['8', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write16 = function write16(value) {
|
||||
this.written += 2;
|
||||
this.data.push(['16', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write16BE = function write16BE(value) {
|
||||
this.written += 2;
|
||||
this.data.push(['16be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write32 = function write32(value) {
|
||||
this.written += 4;
|
||||
this.data.push(['32', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write32BE = function write32BE(value) {
|
||||
this.written += 4;
|
||||
this.data.push(['32be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write64 = function write64(value) {
|
||||
this.written += 8;
|
||||
this.data.push(['64', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write64BE = function write64BE(value) {
|
||||
this.written += 8;
|
||||
this.data.push(['64be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeBytes = function writeBytes(value) {
|
||||
this.written += value.length;
|
||||
this.data.push(['bytes', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.getSize = function getSize() {
|
||||
return this.written;
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeString = function writeString(value, enc) {
|
||||
if (typeof value === 'string')
|
||||
value = new Buffer(value, enc);
|
||||
this.writeBytes(value);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeHash = function writeHash(value) {
|
||||
if (typeof value === 'string')
|
||||
value = new Buffer(value, 'hex');
|
||||
this.writeBytes(value);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeVarString = function writeVarString(value, enc) {
|
||||
if (typeof value === 'string')
|
||||
value = new Buffer(value, enc);
|
||||
this.writeVarBytes(value);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeVarBytes = function writeVarBytes(value) {
|
||||
this.written += utils.sizeIntv(value.length);
|
||||
this.written += value.length;
|
||||
this.data.push(['varint', value.length]);
|
||||
this.data.push(['bytes', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeNullString = function writeNullString(value, enc) {
|
||||
this.writeString(value, enc);
|
||||
this.writeU8(0);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeIntv = function writeIntv(value) {
|
||||
this.written += utils.sizeIntv(value);
|
||||
this.data.push(['varint', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeUIntv = function writeUIntv(value) {
|
||||
this.written += utils.sizeIntv(value);
|
||||
this.data.push(['varint', value]);
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose
|
||||
*/
|
||||
|
||||
Framer.BufferWriter = BufferWriter;
|
||||
module.exports = Framer;
|
||||
|
||||
@ -5,12 +5,12 @@
|
||||
*/
|
||||
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
|
||||
var bcoin = require('../../bcoin');
|
||||
var utils = require('../utils');
|
||||
var assert = utils.assert;
|
||||
var constants = require('./constants');
|
||||
var network = require('./network');
|
||||
var BufferReader = require('../reader');
|
||||
|
||||
/**
|
||||
* Parser
|
||||
@ -688,209 +688,8 @@ Parser.parseMempool = function parseMempool(p) {
|
||||
return {};
|
||||
};
|
||||
|
||||
function BufferReader(data, offset) {
|
||||
if (data instanceof BufferReader)
|
||||
return data;
|
||||
this.data = data;
|
||||
this.offset = offset || 0;
|
||||
this.stack = [];
|
||||
}
|
||||
|
||||
BufferReader.prototype.start = function start() {
|
||||
this.stack.push(this.offset);
|
||||
};
|
||||
|
||||
BufferReader.prototype.end = function end() {
|
||||
assert(this.stack.length > 0);
|
||||
var start = this.stack.pop();
|
||||
var end = this.offset;
|
||||
if (this.stack.length === 0) {
|
||||
delete this.offset;
|
||||
delete this.stack;
|
||||
delete this.data;
|
||||
}
|
||||
return end - start;
|
||||
};
|
||||
|
||||
BufferReader.prototype.endData = function endData() {
|
||||
assert(this.stack.length > 0);
|
||||
var start = this.stack.pop();
|
||||
var end = this.offset;
|
||||
var size = end - start;
|
||||
var data = this.data;
|
||||
|
||||
if (this.stack.length === 0) {
|
||||
delete this.offset;
|
||||
delete this.stack;
|
||||
delete this.data;
|
||||
}
|
||||
|
||||
if (size === data.length)
|
||||
return data;
|
||||
|
||||
return utils.slice(data, start, end);
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU8 = function readU8() {
|
||||
assert(this.offset + 1 <= this.data.length);
|
||||
var ret = utils.readU8(this.data, this.offset);
|
||||
this.offset += 1;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU16 = function readU16() {
|
||||
assert(this.offset + 2 <= this.data.length);
|
||||
var ret = utils.readU16(this.data, this.offset);
|
||||
this.offset += 2;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU16BE = function readU16BE() {
|
||||
assert(this.offset + 2 <= this.data.length);
|
||||
var ret = utils.readU16BE(this.data, this.offset);
|
||||
this.offset += 2;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU32 = function readU32() {
|
||||
assert(this.offset + 4 <= this.data.length);
|
||||
var ret = utils.readU32(this.data, this.offset);
|
||||
this.offset += 4;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU32BE = function readU32BE() {
|
||||
assert(this.offset + 4 <= this.data.length);
|
||||
var ret = utils.readU32BE(this.data, this.offset);
|
||||
this.offset += 4;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU64 = function readU64() {
|
||||
assert(this.offset + 8 <= this.data.length);
|
||||
var ret = utils.readU64(this.data, this.offset);
|
||||
this.offset += 8;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU64BE = function readU64BE() {
|
||||
assert(this.offset + 8 <= this.data.length);
|
||||
var ret = utils.readU64BE(this.data, this.offset);
|
||||
this.offset += 8;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read8 = function read8() {
|
||||
assert(this.offset + 1 <= this.data.length);
|
||||
var ret = utils.read8(this.data, this.offset);
|
||||
this.offset += 1;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read16 = function read16() {
|
||||
assert(this.offset + 2 <= this.data.length);
|
||||
var ret = utils.read16(this.data, this.offset);
|
||||
this.offset += 2;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read16BE = function read16BE() {
|
||||
assert(this.offset + 2 <= this.data.length);
|
||||
var ret = utils.read16BE(this.data, this.offset);
|
||||
this.offset += 2;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read32 = function read32() {
|
||||
assert(this.offset + 4 <= this.data.length);
|
||||
var ret = utils.read32(this.data, this.offset);
|
||||
this.offset += 4;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read32BE = function read32BE() {
|
||||
assert(this.offset + 4 <= this.data.length);
|
||||
var ret = utils.read32BE(this.data, this.offset);
|
||||
this.offset += 4;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read64 = function read64() {
|
||||
assert(this.offset + 8 <= this.data.length);
|
||||
var ret = utils.read64(this.data, this.offset);
|
||||
this.offset += 8;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read64BE = function read64BE() {
|
||||
assert(this.offset + 8 <= this.data.length);
|
||||
var ret = utils.read64BE(this.data, this.offset);
|
||||
this.offset += 8;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readBytes = function readBytes(size) {
|
||||
assert(size >= 0);
|
||||
assert(this.offset + size <= this.data.length);
|
||||
var ret = utils.slice(this.data, this.offset, this.offset + size);
|
||||
this.offset += size;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readString = function readString(enc, size) {
|
||||
assert(size >= 0);
|
||||
assert(this.offset + size <= this.data.length);
|
||||
var ret = this.data.toString(enc, this.offset, this.offset + size);
|
||||
this.offset += size;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readHash = function readHash() {
|
||||
return this.readBytes(32);
|
||||
};
|
||||
|
||||
BufferReader.prototype.readVarString = function readVarString(enc) {
|
||||
return this.readString(enc, this.readUIntv());
|
||||
};
|
||||
|
||||
BufferReader.prototype.readVarBytes = function readVarBytes() {
|
||||
return this.readBytes(this.readUIntv());
|
||||
};
|
||||
|
||||
BufferReader.prototype.readNullString = function readNullString(enc) {
|
||||
assert(this.offset + 1 <= this.data.length);
|
||||
for (var i = this.offset; i < this.data.length; i++) {
|
||||
if (this.data[i] === 0)
|
||||
break;
|
||||
}
|
||||
assert(i !== this.data.length);
|
||||
var ret = this.readString(enc, i - this.offset);
|
||||
this.offset = i + 1;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.left = function left() {
|
||||
assert(this.offset <= this.data.length);
|
||||
return this.data.length - this.offset;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readIntv = function readIntv() {
|
||||
assert(this.offset + 1 <= this.data.length);
|
||||
var result = utils.readIntv(this.data, this.offset);
|
||||
assert(result.off <= this.data.length);
|
||||
this.offset = result.off;
|
||||
return result.r;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readUIntv = function readUIntv() {
|
||||
var result = this.readIntv();
|
||||
assert(result >= 0);
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose
|
||||
*/
|
||||
|
||||
Parser.BufferReader = BufferReader;
|
||||
module.exports = Parser;
|
||||
|
||||
222
lib/bcoin/reader.js
Normal file
222
lib/bcoin/reader.js
Normal file
@ -0,0 +1,222 @@
|
||||
/**
|
||||
* reader.js - buffer reader for bcoin
|
||||
* Copyright (c) 2014-2015, Fedor Indutny (MIT License)
|
||||
* https://github.com/indutny/bcoin
|
||||
*/
|
||||
|
||||
var utils = require('./utils');
|
||||
var assert = utils.assert;
|
||||
|
||||
/**
|
||||
* BufferReader
|
||||
*/
|
||||
|
||||
function BufferReader(data, offset) {
|
||||
if (data instanceof BufferReader)
|
||||
return data;
|
||||
this.data = data;
|
||||
this.offset = offset || 0;
|
||||
this.stack = [];
|
||||
}
|
||||
|
||||
BufferReader.prototype.start = function start() {
|
||||
this.stack.push(this.offset);
|
||||
};
|
||||
|
||||
BufferReader.prototype.end = function end() {
|
||||
assert(this.stack.length > 0);
|
||||
|
||||
var start = this.stack.pop();
|
||||
var end = this.offset;
|
||||
|
||||
if (this.stack.length === 0) {
|
||||
delete this.offset;
|
||||
delete this.stack;
|
||||
delete this.data;
|
||||
}
|
||||
|
||||
return end - start;
|
||||
};
|
||||
|
||||
BufferReader.prototype.endData = function endData() {
|
||||
assert(this.stack.length > 0);
|
||||
|
||||
var start = this.stack.pop();
|
||||
var end = this.offset;
|
||||
var size = end - start;
|
||||
var data = this.data;
|
||||
|
||||
if (this.stack.length === 0) {
|
||||
delete this.offset;
|
||||
delete this.stack;
|
||||
delete this.data;
|
||||
}
|
||||
|
||||
if (size === data.length)
|
||||
return data;
|
||||
|
||||
return utils.slice(data, start, end);
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU8 = function readU8() {
|
||||
assert(this.offset + 1 <= this.data.length);
|
||||
var ret = utils.readU8(this.data, this.offset);
|
||||
this.offset += 1;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU16 = function readU16() {
|
||||
assert(this.offset + 2 <= this.data.length);
|
||||
var ret = utils.readU16(this.data, this.offset);
|
||||
this.offset += 2;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU16BE = function readU16BE() {
|
||||
assert(this.offset + 2 <= this.data.length);
|
||||
var ret = utils.readU16BE(this.data, this.offset);
|
||||
this.offset += 2;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU32 = function readU32() {
|
||||
assert(this.offset + 4 <= this.data.length);
|
||||
var ret = utils.readU32(this.data, this.offset);
|
||||
this.offset += 4;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU32BE = function readU32BE() {
|
||||
assert(this.offset + 4 <= this.data.length);
|
||||
var ret = utils.readU32BE(this.data, this.offset);
|
||||
this.offset += 4;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU64 = function readU64() {
|
||||
assert(this.offset + 8 <= this.data.length);
|
||||
var ret = utils.readU64(this.data, this.offset);
|
||||
this.offset += 8;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readU64BE = function readU64BE() {
|
||||
assert(this.offset + 8 <= this.data.length);
|
||||
var ret = utils.readU64BE(this.data, this.offset);
|
||||
this.offset += 8;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read8 = function read8() {
|
||||
assert(this.offset + 1 <= this.data.length);
|
||||
var ret = utils.read8(this.data, this.offset);
|
||||
this.offset += 1;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read16 = function read16() {
|
||||
assert(this.offset + 2 <= this.data.length);
|
||||
var ret = utils.read16(this.data, this.offset);
|
||||
this.offset += 2;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read16BE = function read16BE() {
|
||||
assert(this.offset + 2 <= this.data.length);
|
||||
var ret = utils.read16BE(this.data, this.offset);
|
||||
this.offset += 2;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read32 = function read32() {
|
||||
assert(this.offset + 4 <= this.data.length);
|
||||
var ret = utils.read32(this.data, this.offset);
|
||||
this.offset += 4;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read32BE = function read32BE() {
|
||||
assert(this.offset + 4 <= this.data.length);
|
||||
var ret = utils.read32BE(this.data, this.offset);
|
||||
this.offset += 4;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read64 = function read64() {
|
||||
assert(this.offset + 8 <= this.data.length);
|
||||
var ret = utils.read64(this.data, this.offset);
|
||||
this.offset += 8;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.read64BE = function read64BE() {
|
||||
assert(this.offset + 8 <= this.data.length);
|
||||
var ret = utils.read64BE(this.data, this.offset);
|
||||
this.offset += 8;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readBytes = function readBytes(size) {
|
||||
assert(size >= 0);
|
||||
assert(this.offset + size <= this.data.length);
|
||||
var ret = utils.slice(this.data, this.offset, this.offset + size);
|
||||
this.offset += size;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readString = function readString(enc, size) {
|
||||
assert(size >= 0);
|
||||
assert(this.offset + size <= this.data.length);
|
||||
var ret = this.data.toString(enc, this.offset, this.offset + size);
|
||||
this.offset += size;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readHash = function readHash() {
|
||||
return this.readBytes(32);
|
||||
};
|
||||
|
||||
BufferReader.prototype.readVarString = function readVarString(enc) {
|
||||
return this.readString(enc, this.readUIntv());
|
||||
};
|
||||
|
||||
BufferReader.prototype.readVarBytes = function readVarBytes() {
|
||||
return this.readBytes(this.readUIntv());
|
||||
};
|
||||
|
||||
BufferReader.prototype.readNullString = function readNullString(enc) {
|
||||
assert(this.offset + 1 <= this.data.length);
|
||||
for (var i = this.offset; i < this.data.length; i++) {
|
||||
if (this.data[i] === 0)
|
||||
break;
|
||||
}
|
||||
assert(i !== this.data.length);
|
||||
var ret = this.readString(enc, i - this.offset);
|
||||
this.offset = i + 1;
|
||||
return ret;
|
||||
};
|
||||
|
||||
BufferReader.prototype.left = function left() {
|
||||
assert(this.offset <= this.data.length);
|
||||
return this.data.length - this.offset;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readIntv = function readIntv() {
|
||||
assert(this.offset + 1 <= this.data.length);
|
||||
var result = utils.readIntv(this.data, this.offset);
|
||||
assert(result.off <= this.data.length);
|
||||
this.offset = result.off;
|
||||
return result.r;
|
||||
};
|
||||
|
||||
BufferReader.prototype.readUIntv = function readUIntv() {
|
||||
var result = this.readIntv();
|
||||
assert(result >= 0);
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose
|
||||
*/
|
||||
|
||||
module.exports = BufferReader;
|
||||
@ -9,6 +9,7 @@ var bn = require('bn.js');
|
||||
var constants = bcoin.protocol.constants;
|
||||
var utils = require('./utils');
|
||||
var assert = utils.assert;
|
||||
var BufferWriter = require('./writer');
|
||||
|
||||
function Witness(items) {
|
||||
if (!(this instanceof Witness))
|
||||
@ -2544,7 +2545,7 @@ Script.decode = function decode(buf) {
|
||||
};
|
||||
|
||||
Script.encode = function encode(code) {
|
||||
var p = new bcoin.protocol.framer.BufferWriter();
|
||||
var p = new BufferWriter();
|
||||
var opcodes = constants.opcodes;
|
||||
var i = 0;
|
||||
var op;
|
||||
|
||||
@ -11,6 +11,8 @@ var utils = require('./utils');
|
||||
var assert = utils.assert;
|
||||
var constants = bcoin.protocol.constants;
|
||||
var Script = bcoin.script;
|
||||
var BufferReader = require('./reader');
|
||||
var BufferWriter = require('./writer');
|
||||
|
||||
/**
|
||||
* TX
|
||||
@ -1063,7 +1065,7 @@ TX.prototype.toExtended = function toExtended(saveCoins) {
|
||||
var height = this.height;
|
||||
var index = this.index;
|
||||
var changeIndex = this.changeIndex != null ? this.changeIndex : -1;
|
||||
var p = new bcoin.protocol.framer.BufferWriter();
|
||||
var p = new BufferWriter();
|
||||
|
||||
if (height === -1)
|
||||
height = 0x7fffffff;
|
||||
@ -1083,7 +1085,7 @@ TX.prototype.toExtended = function toExtended(saveCoins) {
|
||||
// p.writeU32(changeIndex);
|
||||
|
||||
if (saveCoins) {
|
||||
p.writeIntv(this.inputs.length);
|
||||
p.writeUIntv(this.inputs.length);
|
||||
this.inputs.forEach(function(input) {
|
||||
if (!input.output) {
|
||||
p.writeVarBytes(new Buffer([]));
|
||||
@ -1098,7 +1100,7 @@ TX.prototype.toExtended = function toExtended(saveCoins) {
|
||||
};
|
||||
|
||||
TX._fromExtended = function _fromExtended(buf, saveCoins) {
|
||||
var p = new bcoin.protocol.parser.BufferReader(buf);
|
||||
var p = new BufferReader(buf);
|
||||
var tx, coinCount, coin, i;
|
||||
|
||||
p.start();
|
||||
|
||||
178
lib/bcoin/writer.js
Normal file
178
lib/bcoin/writer.js
Normal file
@ -0,0 +1,178 @@
|
||||
/**
|
||||
* writer.js - buffer writer for bcoin
|
||||
* Copyright (c) 2014-2015, Fedor Indutny (MIT License)
|
||||
* https://github.com/indutny/bcoin
|
||||
*/
|
||||
|
||||
var utils = require('./utils');
|
||||
var assert = utils.assert;
|
||||
|
||||
/**
|
||||
* BufferWriter
|
||||
*/
|
||||
|
||||
function BufferWriter(options) {
|
||||
if (options instanceof BufferWriter)
|
||||
return options;
|
||||
|
||||
if (!(this instanceof BufferWriter))
|
||||
return new BufferWriter(options);
|
||||
|
||||
this.data = [];
|
||||
this.written = 0;
|
||||
}
|
||||
|
||||
BufferWriter.prototype.render = function render() {
|
||||
var data = new Buffer(this.written);
|
||||
var off = 0;
|
||||
var i, item;
|
||||
|
||||
for (i = 0; i < this.data.length; i++) {
|
||||
item = this.data[i];
|
||||
switch (item[0]) {
|
||||
case 'u8': off += utils.writeU8(data, item[1], off); break;
|
||||
case 'u16': off += utils.writeU16(data, item[1], off); break;
|
||||
case 'u16be': off += utils.writeU16BE(data, item[1], off); break;
|
||||
case 'u32': off += utils.writeU32(data, item[1], off); break;
|
||||
case 'u32be': off += utils.writeU32BE(data, item[1], off); break;
|
||||
case 'u64': off += utils.writeU64(data, item[1], off); break;
|
||||
case 'u64be': off += utils.writeU64BE(data, item[1], off); break;
|
||||
case '8': off += utils.write8(data, item[1], off); break;
|
||||
case '16': off += utils.write16(data, item[1], off); break;
|
||||
case '16be': off += utils.write16BE(data, item[1], off); break;
|
||||
case '32': off += utils.write32(data, item[1], off); break;
|
||||
case '32be': off += utils.write32BE(data, item[1], off); break;
|
||||
case '64': off += utils.write64(data, item[1], off); break;
|
||||
case '64be': off += utils.write64BE(data, item[1], off); break;
|
||||
case 'varint': off += utils.writeIntv(data, item[1], off); break;
|
||||
case 'bytes': off += utils.copy(item[1], data, off); break;
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU8 = function writeU8(value) {
|
||||
this.written += 1;
|
||||
this.data.push(['u8', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU16 = function writeU16(value) {
|
||||
this.written += 2;
|
||||
this.data.push(['u16', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU16BE = function writeU16BE(value) {
|
||||
this.written += 2;
|
||||
this.data.push(['u16be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU32 = function writeU32(value) {
|
||||
this.written += 4;
|
||||
this.data.push(['u32', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU32BE = function writeU32BE(value) {
|
||||
this.written += 4;
|
||||
this.data.push(['u32be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU64 = function writeU64(value) {
|
||||
this.written += 8;
|
||||
this.data.push(['u64', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeU64BE = function writeU64BE(value) {
|
||||
this.written += 8;
|
||||
this.data.push(['u64be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write8 = function write8(value) {
|
||||
this.written += 1;
|
||||
this.data.push(['8', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write16 = function write16(value) {
|
||||
this.written += 2;
|
||||
this.data.push(['16', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write16BE = function write16BE(value) {
|
||||
this.written += 2;
|
||||
this.data.push(['16be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write32 = function write32(value) {
|
||||
this.written += 4;
|
||||
this.data.push(['32', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write32BE = function write32BE(value) {
|
||||
this.written += 4;
|
||||
this.data.push(['32be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write64 = function write64(value) {
|
||||
this.written += 8;
|
||||
this.data.push(['64', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.write64BE = function write64BE(value) {
|
||||
this.written += 8;
|
||||
this.data.push(['64be', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeBytes = function writeBytes(value) {
|
||||
this.written += value.length;
|
||||
this.data.push(['bytes', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.getSize = function getSize() {
|
||||
return this.written;
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeString = function writeString(value, enc) {
|
||||
if (typeof value === 'string')
|
||||
value = new Buffer(value, enc);
|
||||
this.writeBytes(value);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeHash = function writeHash(value) {
|
||||
if (typeof value === 'string')
|
||||
value = new Buffer(value, 'hex');
|
||||
this.writeBytes(value);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeVarString = function writeVarString(value, enc) {
|
||||
if (typeof value === 'string')
|
||||
value = new Buffer(value, enc);
|
||||
this.writeVarBytes(value);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeVarBytes = function writeVarBytes(value) {
|
||||
this.written += utils.sizeIntv(value.length);
|
||||
this.written += value.length;
|
||||
this.data.push(['varint', value.length]);
|
||||
this.data.push(['bytes', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeNullString = function writeNullString(value, enc) {
|
||||
this.writeString(value, enc);
|
||||
this.writeU8(0);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeIntv = function writeIntv(value) {
|
||||
this.written += utils.sizeIntv(value);
|
||||
this.data.push(['varint', value]);
|
||||
};
|
||||
|
||||
BufferWriter.prototype.writeUIntv = function writeUIntv(value) {
|
||||
this.written += utils.sizeIntv(value);
|
||||
this.data.push(['varint', value]);
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose
|
||||
*/
|
||||
|
||||
module.exports = BufferWriter;
|
||||
Loading…
Reference in New Issue
Block a user