UNPKG

@tgrospic/rnode-grpc-js

Version:
131 lines 5.35 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseRevAddress = exports.newRevAddress = exports.verifyRevAddr = exports.getAddrFromPrivateKey = exports.getAddrFromPublicKey = exports.getAddrFromEth = void 0; var js_sha3_1 = require("js-sha3"); var blakejs_1 = require("blakejs"); var elliptic_1 = require("elliptic"); var codecs_1 = require("./codecs"); var secp256k1 = new elliptic_1.ec('secp256k1'); // Algorithm to generate ETH and REV address is taken from RNode source // https://github.com/rchain/rchain/blob/bf7a30e1/rholang/src/main/scala/coop/rchain/rholang/interpreter/util/AddressTools.scala#L47 // Prefix as defined in https://github.com/rchain/rchain/blob/c6721a6/rholang/src/main/scala/coop/rchain/rholang/interpreter/util/RevAddress.scala#L13 var prefix = { coinId: "000000", version: "00" }; /** * Parses REV address from ETH address. */ function getAddrFromEth(ethAddrRaw) { var ethAddr = ethAddrRaw.replace(/^0x/, ''); if (!ethAddr || ethAddr.length !== 40) return; // Hash ETH address var ethAddrBytes = (0, codecs_1.decodeBase16)(ethAddr); var ethHash = (0, js_sha3_1.keccak256)(ethAddrBytes); // Add prefix with hash and calculate checksum (blake2b-256 hash) var payload = "".concat(prefix.coinId).concat(prefix.version).concat(ethHash); var payloadBytes = (0, codecs_1.decodeBase16)(payload); var checksum = (0, blakejs_1.blake2bHex)(payloadBytes, void 666, 32).slice(0, 8); // Return REV address return (0, codecs_1.encodeBase58)("".concat(payload).concat(checksum)); } exports.getAddrFromEth = getAddrFromEth; /** * Parses REV address (with ETH address) from public key. */ function getAddrFromPublicKey(publicKeyRaw) { var publicKey = publicKeyRaw.replace(/^0x/, ''); if (!publicKey || publicKey.length !== 130) return void 666; // Public key bytes from hex string var pubKeyBytes = (0, codecs_1.decodeBase16)(publicKey); // Remove one byte from pk bytes and hash var pkHash = (0, js_sha3_1.keccak256)(pubKeyBytes.slice(1)); // Take last 40 chars from hashed pk (ETH address) var pkHash40 = pkHash.slice(-40); // Return both REV and ETH address var revAddr = getAddrFromEth(pkHash40); return !!revAddr ? { revAddr: revAddr, ethAddr: pkHash40 } : void 666; } exports.getAddrFromPublicKey = getAddrFromPublicKey; /** * Parses REV address (with ETH address and public key) from private key. */ function getAddrFromPrivateKey(privateKeyRaw) { var privateKey = privateKeyRaw.replace(/^0x/, ''); if (!privateKey || privateKey.length !== 64) return; // Generate REV address from private key var key = secp256k1.keyFromPrivate(privateKey); var pubKey = key.getPublic('hex'); var addr = getAddrFromPublicKey(pubKey); // Return public key, REV and ETH address return !!addr ? __assign({ pubKey: pubKey }, addr) : void 666; } exports.getAddrFromPrivateKey = getAddrFromPrivateKey; /** * Verifes REV address as hex string. */ function verifyRevAddr(revAddr) { var revBytes = (0, codecs_1.decodeBase58safe)(revAddr); if (!revBytes) return false; // Extract payload and checksum var revHex = (0, codecs_1.encodeBase16)(revBytes); var payload = revHex.slice(0, -8); // without checksum var checksum = revHex.slice(-8); // without payload // Calculate checksum var payloadBytes = (0, codecs_1.decodeBase16)(payload); var checksumCalc = (0, blakejs_1.blake2bHex)(payloadBytes, void 666, 32).slice(0, 8); return checksum === checksumCalc; } exports.verifyRevAddr = verifyRevAddr; /** * Generates a new REV address with corresponding private, public key and ETH address. */ function newRevAddress() { // Generate new key and REV address from it var key = secp256k1.genKeyPair(); var privKey = key.getPrivate('hex'); var addr = getAddrFromPrivateKey(privKey); // Return private, public key, REV and ETH address return __assign({ privKey: privKey }, addr); } exports.newRevAddress = newRevAddress; /** * Parses REV address from different sources in string hex format. * (private key -> public key -> ETH address -> REV address) */ function parseRevAddress(text) { var val = text.replace(/^0x/, '').trim(); // Account from private key, public key, ETH or REV address var fromPriv = getAddrFromPrivateKey(val); var fromPub = getAddrFromPublicKey(val); var fromEth = getAddrFromEth(val); var isRev = verifyRevAddr(val); if (isRev) { return { revAddr: text }; } else if (!!fromPriv) { return __assign({ privKey: val }, fromPriv); } else if (!!fromPub) { return __assign({ pubKey: val }, fromPub); } else if (!!fromEth) { return { privKey: '', pubKey: '', ethAddr: val, revAddr: fromEth }; } else return void 666; } exports.parseRevAddress = parseRevAddress; //# sourceMappingURL=rev-address.js.map