bech32: optimize bits conversion.

This commit is contained in:
Christopher Jeffrey 2017-05-13 15:51:51 -07:00
parent 44f6dd9386
commit c1dbac3a4a
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
2 changed files with 10 additions and 8 deletions

View File

@ -35,6 +35,7 @@ var native = require('./native').binding;
* @module utils/bech32 * @module utils/bech32
*/ */
var POOL65 = new Buffer(65);
var CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'; var CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';
var TABLE = [ var TABLE = [
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@ -205,7 +206,7 @@ function deserialize(str) {
* Convert serialized data to bits, * Convert serialized data to bits,
* suitable to be serialized as bech32. * suitable to be serialized as bech32.
* @param {Buffer} data * @param {Buffer} data
* @param {Number} size * @param {Buffer} output
* @param {Number} frombits * @param {Number} frombits
* @param {Number} tobits * @param {Number} tobits
* @param {Number} pad * @param {Number} pad
@ -213,11 +214,10 @@ function deserialize(str) {
* @returns {Buffer} * @returns {Buffer}
*/ */
function convert(data, size, frombits, tobits, pad, off) { function convert(data, output, frombits, tobits, pad, off) {
var acc = 0; var acc = 0;
var bits = 0; var bits = 0;
var maxv = (1 << tobits) - 1; var maxv = (1 << tobits) - 1;
var output = new Buffer(size);
var j = 0; var j = 0;
var i, value; var i, value;
@ -259,7 +259,8 @@ function convert(data, size, frombits, tobits, pad, off) {
*/ */
function encode(hrp, version, hash) { function encode(hrp, version, hash) {
var data = convert(hash, 65, 8, 5, version, 0); var output = POOL65;
var data = convert(hash, output, 8, 5, version, 0);
return serialize(hrp, data); return serialize(hrp, data);
} }
@ -276,13 +277,14 @@ function decode(str) {
var result = deserialize(str); var result = deserialize(str);
var hrp = result.hrp; var hrp = result.hrp;
var data = result.data; var data = result.data;
var version, hash; var version, hash, output;
if (data.length < 1) if (data.length < 1)
throw new Error('Invalid bech32 data length.'); throw new Error('Invalid bech32 data length.');
version = data[0]; version = data[0];
hash = convert(data, 84, 5, 8, -1, 1); output = data;
hash = convert(data, output, 5, 8, -1, 1);
return new AddrResult(hrp, version, hash); return new AddrResult(hrp, version, hash);
} }

View File

@ -105,7 +105,7 @@ describe('Bech32', function() {
if (dec.hrp !== hrp || dec.data.length < 1 || dec.data[0] > 16) if (dec.hrp !== hrp || dec.data.length < 1 || dec.data[0] > 16)
throw new Error('Invalid bech32 prefix or data length.'); throw new Error('Invalid bech32 prefix or data length.');
data = bech32.convert(dec.data, 84, 5, 8, -1, 1); data = bech32.convert(dec.data, new Buffer(84), 5, 8, -1, 1);
if (data.length < 2 || data.length > 40) if (data.length < 2 || data.length > 40)
throw new Error('Invalid witness program size.'); throw new Error('Invalid witness program size.');
@ -120,7 +120,7 @@ describe('Bech32', function() {
} }
function toAddress(hrp, version, program) { function toAddress(hrp, version, program) {
var data = bech32.convert(program, 65, 8, 5, version, 0); var data = bech32.convert(program, new Buffer(65), 8, 5, version, 0);
var ret = bech32.serialize(hrp, data); var ret = bech32.serialize(hrp, data);
fromAddress(hrp, ret); fromAddress(hrp, ret);