@tgrospic/rnode-grpc-js
Version:
RNode gRPC helpers
131 lines • 5.35 kB
JavaScript
;
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