UNPKG

@kba-tools/genesis-tool

Version:

A forked repo from ConsenSys which helps to generate genesis block for Besu Network with xemptyBlockPeriod field.

164 lines 12.7 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generatePrivateKey = generatePrivateKey; exports.derivePublicKey = derivePublicKey; exports.deriveAddress = deriveAddress; exports.generateEthAccount = generateEthAccount; exports.generateNodeKeys = generateNodeKeys; exports.generateQuorumCliqueExtraDataString = generateQuorumCliqueExtraDataString; exports.generateExtraDataString = generateExtraDataString; const secp256k1_1 = __importDefault(require("secp256k1")); const keccak_1 = __importDefault(require("keccak")); const crypto_1 = require("crypto"); const R1 = __importStar(require("./nodeKeysR1")); const ethereumjs_wallet_1 = __importDefault(require("ethereumjs-wallet")); const rlp_1 = __importDefault(require("rlp")); const VANITY_DATA = "0x0000000000000000000000000000000000000000000000000000000000000000"; const CLIQUE_PROPOSER_SIGNATURE = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; function generatePrivateKey() { let privKey; do { privKey = (0, crypto_1.randomBytes)(32); } while (!secp256k1_1.default.privateKeyVerify(privKey)); return privKey; } function derivePublicKey(privKey) { // slice on the end to remove the compression prefix ie. uncompressed use 04 prefix & compressed use 02 or 03 // we generate the address, which wont work with the compression prefix const pubKey = secp256k1_1.default.publicKeyCreate(privKey, false).slice(1); return Buffer.from(pubKey); } function deriveAddress(pubKey) { if (!Buffer.isBuffer(pubKey)) { console.error("ERROR - pubKey is not a buffer"); process.exit(); } const keyHash = (0, keccak_1.default)('keccak256').update(pubKey).digest(); return keyHash.slice(Math.max(keyHash.length - 20, 1)); } function generateEthAccount(password) { return __awaiter(this, void 0, void 0, function* () { const wallet = ethereumjs_wallet_1.default.generate(); const v3keystore = yield wallet.toV3(password); const ethAccount = { privateKey: wallet.getPrivateKeyString(), publicKey: wallet.getPublicKeyString(), address: wallet.getAddressString(), keystore: JSON.stringify(v3keystore), password }; return ethAccount; }); } function generateNodeKeys(password, curve) { return __awaiter(this, void 0, void 0, function* () { let privateKey; let publicKey; if (curve === "r1" /* CryptoCurve.r1 */) { privateKey = R1.generatePrivateKey(); publicKey = R1.derivePublicKey(privateKey); } else { privateKey = generatePrivateKey(); publicKey = derivePublicKey(privateKey); } const address = deriveAddress(publicKey); const ethAccount = yield generateEthAccount(password); const nodeKeys = { privateKey, publicKey, address, ethAccount }; return nodeKeys; }); } // goquorum requires the validator accounts addresses not the validator nodekey addresses // https://github.com/ethereum/EIPs/issues/225 function generateQuorumCliqueExtraDataString(signers) { const extraData = [VANITY_DATA, signers.join(''), CLIQUE_PROPOSER_SIGNATURE].join(''); return extraData; } // extraData field calculation function generateExtraDataString(validatorAddressList, consensus) { let extraData; switch (consensus) { case "clique" /* Consensus.clique */: { // NOTE: this is only applicable to Besu for clique. For GoQ please see the method above `generateQuorumCliqueExtraDataString` // // clique just appends https://besu.hyperledger.org/en/latest/HowTo/Configure/Consensus-Protocols/Clique/ // 65 bytes for the proposer signature. In the genesis block there is no initial proposer, so the proposer signature is all zeros. // [0x prefix, 32 bytes vanity, List<Validators> (20bytes each), proposer signature - 65 bytes of 0s (see comment above)] const signers = validatorAddressList.map(_ => _.toString('hex')); extraData = [VANITY_DATA, signers.join(''), CLIQUE_PROPOSER_SIGNATURE].join(''); break; } case "raft" /* Consensus.raft */: { // statements; extraData = VANITY_DATA; break; } // ibft case "ibft" /* Consensus.ibft */: { // ibft = 0x + <32 bytes Vanity> + RLP(List<Validators>, proposer Seals, seals]). const extraDataContent = [validatorAddressList, null, []]; const extraDataCoded = rlp_1.default.encode(extraDataContent); extraData = VANITY_DATA + Buffer.from(extraDataCoded).toString('hex'); break; } // ibft2 case "ibft2" /* Consensus.ibft2 */: { const roundBuffer = Buffer.alloc(4); roundBuffer.writeUInt32LE(0, 0); const extraDataContent = [new Uint8Array(32), validatorAddressList, null, roundBuffer, []]; const extraDataCoded = rlp_1.default.encode(extraDataContent); extraData = '0x' + Buffer.from(extraDataCoded).toString('hex'); break; } // qbft default: { // ibft2, qbft as normal ie RLP([32 bytes Vanity, List<Validators>, No Vote, Round=Int(0), 0 Seals]). const extraDataContent = [new Uint8Array(32), validatorAddressList, [], null, []]; const extraDataCoded = rlp_1.default.encode(extraDataContent); extraData = '0x' + Buffer.from(extraDataCoded).toString('hex'); break; } } return extraData; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZUtleXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL25vZGVLZXlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQSxnREFNQztBQUVELDBDQUtDO0FBRUQsc0NBT0M7QUFFRCxnREFXQztBQUVELDRDQW1CQztBQUlELGtGQUdDO0FBR0QsMERBK0NDO0FBNUhELDBEQUFrQztBQUNsQyxvREFBNEI7QUFDNUIsbUNBQXFDO0FBQ3JDLGlEQUFtQztBQUNuQywwRUFBdUM7QUFDdkMsOENBQXNCO0FBR3RCLE1BQU0sV0FBVyxHQUFHLG9FQUFvRSxDQUFDO0FBQ3pGLE1BQU0seUJBQXlCLEdBQUcsb0lBQW9JLENBQUM7QUFFdkssU0FBZ0Isa0JBQWtCO0lBQ2hDLElBQUksT0FBbUIsQ0FBQztJQUN4QixHQUFHLENBQUM7UUFDRixPQUFPLEdBQUcsSUFBQSxvQkFBVyxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUMsUUFBUSxDQUFDLG1CQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUU7SUFDL0MsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQWdCLGVBQWUsQ0FBQyxPQUFlO0lBQzdDLDZHQUE2RztJQUM3Ryx1RUFBdUU7SUFDdkUsTUFBTSxNQUFNLEdBQWUsbUJBQVMsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxNQUFrQjtJQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNo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