diff --git a/lib/bcoin/utils.js b/lib/bcoin/utils.js index 9508ec89..36a86159 100644 --- a/lib/bcoin/utils.js +++ b/lib/bcoin/utils.js @@ -161,9 +161,85 @@ utils.toBase58 = function toBase58(arr) { res = '1' + res; } + //utils.print(res); + //utils.print(utils.toBase582(arr)); + // assert(utils.toBase582(arr) === res); + return res; }; +// Ported from: +// https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp +utils.toBase582 = function toBase582(buf) { + var zeroes = 0; + var length = 0; + for (var i = 0; i < buf.length; i++) { + if (buf[i] !== 0) + break; + zeroes++; + } + var size = ((buf.length * 138 / 100) | 0) + 1; + var b58 = new Buffer(size); + b58.fill(0); + for (; i < buf.length; i++) { + var carry = buf[i]; + var j = 0; + for (var k = b58.length - 1; k >= 0; k--, j++) { + if (carry === 0 && j >= length) + break; + carry += 256 * b58[k]; + b58[k] = carry % 58; + carry = carry / 58 | 0; + } + assert(carry === 0); + length = j; + } + var i = size - length; + while (b58[i] === 0) + i++; + var str = ''; + for (j = 0; j < zeroes; j++) + str += '1'; + for (; i < b58.length; i++) + str += base58[b58[i]]; + return str; +}; + +utils.fromBase582 = function fromBase58(str) { + var zeroes = 0; + var i = 0; + while (str[i] === '1') { + zeroes++; + i++; + } + var b256 = new Buffer(((str.length * 733) / 1000 | 0) + 1); + b256.fill(0); + while (str[i]) { + var ch = unbase58[str[i]]; + if (ch == null) + return; + var carry = ch; + for (var j = b256.length - 1; j >= 0; j--) { + carry += 58 * b256[j]; + b256[j] = carry % 256; + carry = carry / 256 | 0; + } + assert(carry === 0); + i++; + } + if (str[i] != null) + return; + i = 0; + while (b256[i] === 0) + i++; + var vch = new Buffer(zeroes + (b256.length - i)); + for (j = 0; j < zeroes; j++) + vch[j] = 0; + for (; i < b256.length; i++) + vch[i] = b256[i]; + return vch; +}; + utils.fromBase58 = function fromBase58(str) { var i, zeroes, q, w, res, c, z; @@ -198,7 +274,9 @@ utils.fromBase58 = function fromBase58(str) { for (i = 0; i < zeroes; i++) z.push(0); - return new Buffer(z.concat(res.toArray())); + var ret = new Buffer(z.concat(res.toArray())); + // assert(utils.isEqual(ret, utils.fromBase582(str))); + return ret; }; utils.isBase58 = function isBase58(msg) {