UNPKG

keystore_wdc

Version:

``` npm i keystore_wdc; const KeyStore = require('keystore_wdc'); const ks = new KeyStore(); ``` #### 生成keystore ``` async function create(){ const keystore = await ks.Create("your password"); } ``` * 返回keystore,密码格式不正确返回-1。

588 lines 19.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.dig2BigInt = exports.dig2BN = exports.encodeUint32 = exports.encodeBE = exports.bin2hex = exports.uuidv4 = exports.bin2str = exports.toSafeInt = exports.inverse = exports.convert = exports.bytesToF64 = exports.padPrefix = exports.f64ToBytes = exports.trimLeadingZeros = exports.str2bin = exports.normalizeAddress = exports.assertAddress = exports.concatBytes = exports.concatArray = exports.extendPrivateKey = exports.publicKeyHash2Address = exports.address2PublicKeyHash = exports.publicKey2Hash = exports.privateKey2PublicKey = exports.compareBytes = exports.dig2str = exports.hex2bin = exports.assert = exports.rmd160 = exports.digest = exports.isBin = void 0; var types_1 = require("./types"); var nacl = require("../nacl.min.js"); var RMD160 = (new (require('../hashes.js').RMD160)); var _keccak256 = require('../sha3.js').keccak256; var base58_1 = require("./base58"); var BN = require("../bn"); RMD160.setUTF8(false); var EMPTY_BYTES = new Uint8Array(0); function isBin(r) { return r && (r instanceof Uint8Array || r instanceof ArrayBuffer); } exports.isBin = isBin; /** * 计算 keccak256哈希 */ function digest(_msg) { var msg = hex2bin(_msg); var hasher = _keccak256.create(); hasher.update(msg); return new Uint8Array(hasher.arrayBuffer()); } exports.digest = digest; /** * rmd160 哈希值计算 */ function rmd160(bin) { var o = hex2bin(bin); return hex2bin(RMD160.hex(new FakeString(o))); } exports.rmd160 = rmd160; // rmd 不支持对 Uint8Array 进行哈希值计算,需要把 Uint8Array 类型伪装成字符串 var FakeString = /** @class */ (function () { function FakeString(u8) { this.u8 = hex2bin(u8); this.length = this.u8.length; } FakeString.prototype.charCodeAt = function (i) { return this.u8[i]; }; return FakeString; }()); function assert(truth, err) { if (!truth) throw new Error(err); } exports.assert = assert; /** * 解析十六进制字符串 * decode hex string */ function hex2bin(s) { if (s instanceof ArrayBuffer) return new Uint8Array(s); if (s instanceof Uint8Array) return s; if (s.startsWith('0x')) s = s.substr(2, s.length - 2); assert(s.length % 2 === 0, 'invalid char'); var ret = new Uint8Array(s.length / 2); for (var i = 0; i < s.length / 2; i++) { var h = s.charCodeAt(i * 2); var l = s.charCodeAt(i * 2 + 1); ret[i] = (hexToInt(h) << 4) + hexToInt(l); } return ret; } exports.hex2bin = hex2bin; function hexToInt(x) { if (48 <= x && x <= 57) return x - 48; if (97 <= x && x <= 102) return x - 87; if (65 <= x && x <= 70) return x - 55; return 0; } function dig2str(s) { if (typeof s === 'string') { if (s.startsWith('0x')) s = new BN(s.substr(2), 16); else return s; } return s.toString(10); } exports.dig2str = dig2str; /** * 比较两个字节数组 */ function compareBytes(_a, _b) { var a = hex2bin(_a); var b = hex2bin(_b); if (a.length > b.length) return 1; if (b.length > a.length) return -1; for (var i = 0; i < a.length; i++) { var ai = a[i]; var bi = b[i]; if (ai > bi) return 1; if (bi > ai) return -1; } return 0; } exports.compareBytes = compareBytes; /** * 私钥转公钥 */ function privateKey2PublicKey(_privateKey) { var privateKey = hex2bin(_privateKey); if (privateKey.length === 64) privateKey = privateKey.slice(32); var pair = nacl.sign.keyPair.fromSeed(privateKey); return pair.publicKey; } exports.privateKey2PublicKey = privateKey2PublicKey; /** * 公钥转公钥哈希 */ function publicKey2Hash(_publicKey) { var publicKey = hex2bin(_publicKey); publicKey = digest(publicKey); return rmd160(publicKey); } exports.publicKey2Hash = publicKey2Hash; /** * 地址转公钥哈希 */ function address2PublicKeyHash(str) { assert(typeof str === 'string', 'address is string'); var r5; if (str.indexOf("1") === 0) { r5 = base58_1.Base58.decode(str); } else { r5 = base58_1.Base58.decode(str.substr(2)); } return r5.slice(1, r5.length - 4); } exports.address2PublicKeyHash = address2PublicKeyHash; /** * 公钥哈希转地址 */ function publicKeyHash2Address(_hash) { var hash = hex2bin(_hash); var r2 = concatBytes(new Uint8Array([0]), hash); var r3 = digest(digest(hash)); var b4 = r3.slice(0, 4); var b5 = concatBytes(r2, b4); return base58_1.Base58.encode(b5); } exports.publicKeyHash2Address = publicKeyHash2Address; /** * 32 字节私钥转成 64字节私钥 */ function extendPrivateKey(_sk) { var sk = hex2bin(_sk); if (sk.length === 64) return sk; return concatBytes(sk, privateKey2PublicKey(sk)); } exports.extendPrivateKey = extendPrivateKey; function concatArray(arr) { var ret = new Uint8Array(0); arr.forEach(function (a) { ret = concatBytes(ret, a); }); return ret; } exports.concatArray = concatArray; function concatBytes(_x, _y) { var x = hex2bin(_x); var y = hex2bin(_y); var ret = new Uint8Array(x.length + y.length); for (var i = 0; i < x.length; i++) { ret[i] = x[i]; } for (var i = 0; i < y.length; i++) { ret[x.length + i] = y[i]; } return ret; } exports.concatBytes = concatBytes; /** * 断言正确的地址 * @param {string} address */ function assertAddress(address) { if (typeof address !== 'string') throw new Error('invalid address not a string'); if (!address.startsWith('1') && !address.startsWith('WX') && !address.startsWith('WR')) { throw new Error('address should starts with 1, WX or WR'); } if (address.startsWith('WX') || address.startsWith('WR')) address = address.substr(2); var _r5 = base58_1.Base58.decode(address); var a = address2PublicKeyHash(address); var c = digest(a); var r3 = digest(c); var b4 = r3.slice(0, 4); var _b4 = _r5.slice(21, 25); if (compareBytes(b4, _b4) != 0) { throw new Error('invalid address ' + address); } } exports.assertAddress = assertAddress; /** * 公钥、地址、或者公钥哈希 转成公钥哈希 * @returns {Uint8Array} */ function normalizeAddress(_addr) { var addr; if ((typeof _addr === 'string' && isHex(_addr)) || _addr instanceof Uint8Array || _addr instanceof ArrayBuffer) { addr = hex2bin(_addr); if (addr.length === 20) return addr; if (addr.length === 32) return publicKey2Hash(addr); throw new Error("invalid size " + addr.length); } // 地址转公钥哈希 assertAddress(_addr); return address2PublicKeyHash(_addr); } exports.normalizeAddress = normalizeAddress; /** * 判断是否是合法的十六进制字符串 * @param {string} hex * @returns {boolean} */ function isHex(hex) { if (hex.startsWith('0x')) hex = hex.substr(2); if (hex.length % 2 !== 0) return false; hex = hex.toLowerCase(); for (var i = 0; i < hex.length; i++) { var code = hex.charCodeAt(i); if ((code >= 48 && code <= 57) || (code >= 97 && code <= 102)) { } else { return false; } } return true; } /** * 字符串 utf8 编码 * @param str 字符串 */ function str2bin(str) { if (typeof Buffer === 'function') return Buffer.from(str, 'utf-8'); if (typeof TextEncoder === 'function') return new TextEncoder().encode(str); throw new Error('encode string to utf8 failed'); } exports.str2bin = str2bin; function trimLeadingZeros(data) { var k = -1; for (var i = 0; i < data.length; i++) { if (data[i] !== 0) { k = i; break; } } if (k === -1) return new Uint8Array(0); return data.slice(k, data.length); } exports.trimLeadingZeros = trimLeadingZeros; function reverse(_arr) { var arr = hex2bin(_arr); var ret = new Uint8Array(arr.length); for (var i = 0; i < arr.length; i++) { ret[i] = arr[arr.length - i - 1]; } return ret; } /** * 浮点数转字节数组 */ function f64ToBytes(f) { var _buf = new ArrayBuffer(8); var float = new Float64Array(_buf); float[0] = f; var buf = new Uint8Array(_buf); return trimLeadingZeros(reverse(buf)); } exports.f64ToBytes = f64ToBytes; /** * pad prefix to size */ function padPrefix(arr, prefix, size) { if (arr.length >= size) return arr; var ret = new Uint8Array(size); for (var i = 0; i < ret.length; i++) { ret[i + size - arr.length] = arr[i]; } if (prefix === 0) return ret; for (var i = 0; i < size - arr.length; i++) ret[i] = prefix; } exports.padPrefix = padPrefix; /** * 字节数组转浮点数 * @param {Uint8Array} buf */ function bytesToF64(buf) { return new Float64Array(padPrefix(reverse(buf), 0, 8).buffer)[0]; } exports.bytesToF64 = bytesToF64; function convert(o, type) { if (typeof o === 'bigint') o = new BN(o.toString()); if (o instanceof Uint8Array || o instanceof ArrayBuffer) { switch (type) { case types_1.ABI_DATA_TYPE.bool: case types_1.ABI_DATA_TYPE.u256: case types_1.ABI_DATA_TYPE.i64: case types_1.ABI_DATA_TYPE.u64: case types_1.ABI_DATA_TYPE.f64: { throw new Error('cannot convert uint8array to u64, u256 or bool'); } case types_1.ABI_DATA_TYPE.string: { throw new Error('cannot convert uint8array to string'); } case types_1.ABI_DATA_TYPE.bytes: return hex2bin(o); case types_1.ABI_DATA_TYPE.address: return normalizeAddress(o); } throw new Error("unexpected abi type " + type); } if (typeof o === 'string') { switch (type) { case types_1.ABI_DATA_TYPE.u256: case types_1.ABI_DATA_TYPE.u64: { var ret = void 0; if (o.substr(0, 2) === '0x') { ret = new BN(o.substr(2, o.length - 2), 16); } else { ret = new BN(o, 10); } if (type === types_1.ABI_DATA_TYPE.u64) assert(ret.cmp(types_1.MAX_U64) <= 0 && !ret.isNeg(), ret.toString(10) + " overflows max u64 " + types_1.MAX_U64.toString(10)); if (type === types_1.ABI_DATA_TYPE.u256) assert(ret.cmp(types_1.MAX_U256) <= 0 && !ret.isNeg(), ret.toString(10) + " overflows max u256 " + types_1.MAX_U256.toString(10)); return ret; } case types_1.ABI_DATA_TYPE.i64: { if (o.substr(0, 2) === '0x') { var ret = new BN(o.substr(2, o.length - 2), 16); assert(ret.cmp(types_1.MAX_I64) <= 0, ret.toString(10) + " overflows max i64 " + types_1.MAX_I64.toString(10)); assert(ret.cmp(types_1.MIN_I64) >= 0, ret.toString(10) + " overflows min i64 " + types_1.MIN_I64.toString(10)); return ret; } return convert(parseInt(o), types_1.ABI_DATA_TYPE.i64); } case types_1.ABI_DATA_TYPE.f64: { var f = parseFloat(o); return f64ToBytes(f); } case types_1.ABI_DATA_TYPE.string: { return o; } case types_1.ABI_DATA_TYPE.bool: { var l = o.toLowerCase(); if ('true' === l) return types_1.ONE; if ('false' === l) return types_1.ZERO; // @ts-ignore if (isNaN(o)) throw new Error("cannot convert " + o + " to bool"); var ln = parseInt(o); if (1 === ln || 0 === ln) return l; throw new Error("convert " + l + " to bool failed, provide 1 or 0"); } case types_1.ABI_DATA_TYPE.bytes: return hex2bin(o); case types_1.ABI_DATA_TYPE.address: { return normalizeAddress(o); } } throw new Error("unexpected abi type " + type); } if (typeof o === 'number') { switch (type) { case types_1.ABI_DATA_TYPE.u256: case types_1.ABI_DATA_TYPE.u64: { if (o < 0 || !Number.isInteger(o)) throw new Error('o is negative or not a integer'); return new BN(o); } case types_1.ABI_DATA_TYPE.string: { return o.toString(10); } case types_1.ABI_DATA_TYPE.bool: { if (1 === o || 0 === o) return 1 === o ? types_1.ONE : types_1.ZERO; throw new Error("convert " + o + " to bool failed, provide 1 or 0"); } case types_1.ABI_DATA_TYPE.bytes: case types_1.ABI_DATA_TYPE.address: { throw new Error("cannot convert number to address or bytes"); } case types_1.ABI_DATA_TYPE.i64: { if (!Number.isInteger(o)) throw new Error('o is negative or not a integer'); if (o >= 0) return new BN(o); return convert(new BN(o), types_1.ABI_DATA_TYPE.i64); } case types_1.ABI_DATA_TYPE.f64: { return f64ToBytes(o); } } throw new Error("unexpected abi type " + type); } if (o instanceof BN) { switch (type) { case types_1.ABI_DATA_TYPE.u256: case types_1.ABI_DATA_TYPE.u64: { if (o.isNeg()) throw new Error("cannot convert negative " + o.toString() + " to uint"); return o; } case types_1.ABI_DATA_TYPE.string: { return o.toString(10); } case types_1.ABI_DATA_TYPE.bytes: case types_1.ABI_DATA_TYPE.address: { throw new Error("cannot convert big number to address or bytes"); } case types_1.ABI_DATA_TYPE.bool: { if (o.cmp(new BN(1)) === 0 || o.cmp(new BN(0)) === 0) return o; throw new Error("convert " + o + " to bool failed, provide 1 or 0"); } case types_1.ABI_DATA_TYPE.i64: { assert(o.cmp(types_1.MAX_I64) <= 0, o.toString(10) + " overflows max i64 " + types_1.MAX_I64.toString(10)); assert(o.cmp(types_1.MIN_I64) >= 0, o.toString(10) + " overflows min i64 " + types_1.MIN_I64.toString(10)); if (o.cmp(new BN(0)) >= 0) return o; var buf = o.neg().toArrayLike(Uint8Array, 'be', 8); buf = inverse(buf); return new BN(buf).add(types_1.ONE); } case types_1.ABI_DATA_TYPE.f64: { return f64ToBytes(o.toNumber()); } } throw new Error("unexpected abi type " + type); } if (typeof o === 'boolean') { switch (type) { case types_1.ABI_DATA_TYPE.u256: case types_1.ABI_DATA_TYPE.i64: case types_1.ABI_DATA_TYPE.u64: { return o ? types_1.ONE : types_1.ZERO; } case types_1.ABI_DATA_TYPE.string: { return o.toString(); } case types_1.ABI_DATA_TYPE.bytes: case types_1.ABI_DATA_TYPE.address: { throw new Error("cannot convert boolean to address or bytes"); } case types_1.ABI_DATA_TYPE.bool: { return o ? types_1.ONE : types_1.ZERO; } case types_1.ABI_DATA_TYPE.f64: { return f64ToBytes(o ? 1 : 0); } } throw new Error("unexpected abi type " + type); } throw new Error("unexpected type " + o); } exports.convert = convert; /** * 对字节数组取反 */ function inverse(arr) { var ret = new Uint8Array(arr.length); for (var i = 0; i < ret.length; i++) { ret[i] = (~arr[i] & 0xff); } return ret; } exports.inverse = inverse; function toSafeInt(x) { var bn; if (typeof x === 'bigint') x = new BN(x.toString()); if (typeof x === 'number') return x; if (typeof x === 'string') { var hex = x.startsWith('0x'); x = hex ? x.substr(2, x.length - 2) : x; bn = new BN(x, hex ? 16 : 10); } if (x instanceof ArrayBuffer || x instanceof Uint8Array) { var arr = x instanceof ArrayBuffer ? new Uint8Array(x) : x; bn = new BN(arr); } if (x instanceof BN) bn = x; if (bn.cmp(types_1.MAX_SAFE_INTEGER) <= 0 && bn.cmp(types_1.MIN_SAFE_INTEGER) >= 0) return bn.toNumber(); return bn.toString(10); } exports.toSafeInt = toSafeInt; /** * decode binary as utf8 string */ function bin2str(_bin) { if (typeof _bin === 'string') return _bin; var bin = hex2bin(_bin); if (typeof TextDecoder === 'function') return new TextDecoder().decode(bin); if (typeof Buffer === 'function') return Buffer.from(bin).toString('utf8'); throw new Error('bin2str failed'); } exports.bin2str = bin2str; function uuidv4() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } exports.uuidv4 = uuidv4; function bin2hex(s) { if (typeof s === 'string') { assert(isHex(s), 'hex string'); return s; } if (!(s instanceof ArrayBuffer) && !(s instanceof Uint8Array) && !Array.isArray(s)) throw new Error("input " + s + " is not ArrayBuffer Uint8Array or Buffer and other array-like "); if (!(s instanceof Uint8Array)) s = new Uint8Array(s); // input maybe Buffer or Uint8Array if (typeof Buffer === 'function') return Buffer.from(s).toString('hex'); return Array.prototype.map.call(s, function (x) { return ('00' + x.toString(16)).slice(-2); }).join(''); } exports.bin2hex = bin2hex; function encodeBE(i) { var n = dig2BN(i); return trimLeadingZeros(n.toArrayLike(Uint8Array, 'be')); } exports.encodeBE = encodeBE; function encodeUint32(i) { var buf = new ArrayBuffer(4); var v = new DataView(buf); v.setUint32(0, Number(i), true); return buf; } exports.encodeUint32 = encodeUint32; function dig2BN(i) { return i instanceof BN ? i : new BN(i.toString()); } exports.dig2BN = dig2BN; function dig2BigInt(i) { if (typeof i === 'bigint') return i; if (typeof i === 'string') return i.startsWith('0x') ? BigInt(new BN(i, 16).toString(10)) : BigInt(i); if (i instanceof BN) return BigInt(i.toString(10)); return BigInt(i); } exports.dig2BigInt = dig2BigInt; //# sourceMappingURL=utils.js.map