lisk-framework
Version:
Lisk blockchain application platform
83 lines • 3.39 kB
JavaScript
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
;