bech32: optimize bits conversion.
This commit is contained in:
parent
44f6dd9386
commit
c1dbac3a4a
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user