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
*/
var POOL65 = new Buffer(65);
var CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';
var TABLE = [
-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,
* suitable to be serialized as bech32.
* @param {Buffer} data
* @param {Number} size
* @param {Buffer} output
* @param {Number} frombits
* @param {Number} tobits
* @param {Number} pad
@ -213,11 +214,10 @@ function deserialize(str) {
* @returns {Buffer}
*/
function convert(data, size, frombits, tobits, pad, off) {
function convert(data, output, frombits, tobits, pad, off) {
var acc = 0;
var bits = 0;
var maxv = (1 << tobits) - 1;
var output = new Buffer(size);
var j = 0;
var i, value;
@ -259,7 +259,8 @@ function convert(data, size, frombits, tobits, pad, off) {
*/
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);
}
@ -276,13 +277,14 @@ function decode(str) {
var result = deserialize(str);
var hrp = result.hrp;
var data = result.data;
var version, hash;
var version, hash, output;
if (data.length < 1)
throw new Error('Invalid bech32 data length.');
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);
}

View File

@ -105,7 +105,7 @@ describe('Bech32', function() {
if (dec.hrp !== hrp || dec.data.length < 1 || dec.data[0] > 16)
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)
throw new Error('Invalid witness program size.');
@ -120,7 +120,7 @@ describe('Bech32', function() {
}
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);
fromAddress(hrp, ret);