UNPKG

lisk-framework

Version:

Lisk blockchain application platform

83 lines 3.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.bitwiseXOR = exports.getRandomSeed = exports.getSeedRevealValidity = exports.isSeedValidInput = void 0; const lisk_cryptography_1 = require("@liskhq/lisk-cryptography"); const constants_1 = require("./constants"); const isSeedValidInput = (generatorAddress, seedReveal, validatorsReveal) => { let lastSeed; for (let i = validatorsReveal.length - 1; i >= 0; i -= 1) { const validatorReveal = validatorsReveal[i]; if (validatorReveal.generatorAddress.equals(generatorAddress)) { lastSeed = validatorReveal; break; } } if (!lastSeed) { return false; } return lastSeed.seedReveal.equals(lisk_cryptography_1.utils.hash(seedReveal).slice(0, constants_1.SEED_LENGTH)); }; exports.isSeedValidInput = isSeedValidInput; const getSeedRevealValidity = (generatorAddress, seedReveal, validatorsReveal) => { let lastSeed; let maxheight = 0; for (const validatorReveal of validatorsReveal) { if (validatorReveal.generatorAddress.equals(generatorAddress) && validatorReveal.height > maxheight) { maxheight = validatorReveal.height; lastSeed = validatorReveal; } } return !lastSeed || lastSeed.seedReveal.equals(lisk_cryptography_1.utils.hash(seedReveal).slice(0, constants_1.SEED_LENGTH)); }; exports.getSeedRevealValidity = getSeedRevealValidity; const getRandomSeed = (height, numberOfSeeds, validatorsReveal) => { if (!Number.isInteger(height) || !Number.isInteger(numberOfSeeds)) { throw new Error('Height or number of seeds cannot be non integer.'); } if (height < 0 || numberOfSeeds < 0) { throw new Error('Height or number of seeds cannot be negative.'); } if (numberOfSeeds > 1000) { throw new Error('Number of seeds cannot be greater than 1000.'); } const initRandomBuffer = lisk_cryptography_1.utils.intToBuffer(height + numberOfSeeds, 4); let randomSeed = lisk_cryptography_1.utils.hash(initRandomBuffer).slice(0, constants_1.SEED_LENGTH); let isInFuture = true; const currentSeeds = []; for (const validatorReveal of validatorsReveal) { if (validatorReveal.height >= height) { isInFuture = false; if (validatorReveal.height < height + numberOfSeeds) { currentSeeds.push(validatorReveal); } } } if (isInFuture) { throw new Error('Height is in the future.'); } for (const seedObject of currentSeeds) { if (seedObject.valid) { randomSeed = (0, exports.bitwiseXOR)([randomSeed, seedObject.seedReveal]); } } return randomSeed; }; exports.getRandomSeed = getRandomSeed; const bitwiseXOR = (bufferArray) => { if (bufferArray.length === 1) { return bufferArray[0]; } const bufferSizes = new Set(bufferArray.map(buffer => buffer.length)); if (bufferSizes.size > 1) { throw new Error('All input for XOR should be same size'); } const outputSize = [...bufferSizes][0]; const result = Buffer.alloc(outputSize, 0); for (let i = 0; i < outputSize; i += 1) { result[i] = bufferArray.map(b => b[i]).reduce((a, b) => a ^ b, 0); } return result; }; exports.bitwiseXOR = bitwiseXOR; //# sourceMappingURL=utils.js.map