@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
JavaScript
;
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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