PHP WebShell
Текущая директория: /opt/BitGoJS/node_modules/near-api-js/lib
Просмотр файла: validators.js
'use strict';
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.diffEpochValidators = exports.findSeatPrice = void 0;
const bn_js_1 = __importDefault(require("bn.js"));
const depd_1 = __importDefault(require("depd"));
/** Finds seat price given validators stakes and number of seats.
* Calculation follow the spec: https://nomicon.io/Economics/README.html#validator-selection
* @params validators: current or next epoch validators.
* @params maxNumberOfSeats: maximum number of seats in the network.
* @params minimumStakeRatio: minimum stake ratio
* @params protocolVersion: version of the protocol from genesis config
*/
function findSeatPrice(validators, maxNumberOfSeats, minimumStakeRatio, protocolVersion) {
if (protocolVersion && protocolVersion < 49) {
return findSeatPriceForProtocolBefore49(validators, maxNumberOfSeats);
}
if (!minimumStakeRatio) {
const deprecate = depd_1.default('findSeatPrice(validators, maxNumberOfSeats)');
deprecate('`use `findSeatPrice(validators, maxNumberOfSeats, minimumStakeRatio)` instead');
minimumStakeRatio = [1, 6250]; // harcoded minimumStakeRation from 12/7/21
}
return findSeatPriceForProtocolAfter49(validators, maxNumberOfSeats, minimumStakeRatio);
}
exports.findSeatPrice = findSeatPrice;
function findSeatPriceForProtocolBefore49(validators, numSeats) {
const stakes = validators.map(v => new bn_js_1.default(v.stake, 10)).sort((a, b) => a.cmp(b));
const num = new bn_js_1.default(numSeats);
const stakesSum = stakes.reduce((a, b) => a.add(b));
if (stakesSum.lt(num)) {
throw new Error('Stakes are below seats');
}
// assert stakesSum >= numSeats
let left = new bn_js_1.default(1), right = stakesSum.add(new bn_js_1.default(1));
while (!left.eq(right.sub(new bn_js_1.default(1)))) {
const mid = left.add(right).div(new bn_js_1.default(2));
let found = false;
let currentSum = new bn_js_1.default(0);
for (let i = 0; i < stakes.length; ++i) {
currentSum = currentSum.add(stakes[i].div(mid));
if (currentSum.gte(num)) {
left = mid;
found = true;
break;
}
}
if (!found) {
right = mid;
}
}
return left;
}
// nearcore reference: https://github.com/near/nearcore/blob/5a8ae263ec07930cd34d0dcf5bcee250c67c02aa/chain/epoch_manager/src/validator_selection.rs#L308;L315
function findSeatPriceForProtocolAfter49(validators, maxNumberOfSeats, minimumStakeRatio) {
if (minimumStakeRatio.length != 2) {
throw Error('minimumStakeRatio should have 2 elements');
}
const stakes = validators.map(v => new bn_js_1.default(v.stake, 10)).sort((a, b) => a.cmp(b));
const stakesSum = stakes.reduce((a, b) => a.add(b));
if (validators.length < maxNumberOfSeats) {
return stakesSum.mul(new bn_js_1.default(minimumStakeRatio[0])).div(new bn_js_1.default(minimumStakeRatio[1]));
}
else {
return stakes[0].add(new bn_js_1.default(1));
}
}
/** Diff validators between current and next epoch.
* Returns additions, subtractions and changes to validator set.
* @params currentValidators: list of current validators.
* @params nextValidators: list of next validators.
*/
function diffEpochValidators(currentValidators, nextValidators) {
const validatorsMap = new Map();
currentValidators.forEach(v => validatorsMap.set(v.account_id, v));
const nextValidatorsSet = new Set(nextValidators.map(v => v.account_id));
return {
newValidators: nextValidators.filter(v => !validatorsMap.has(v.account_id)),
removedValidators: currentValidators.filter(v => !nextValidatorsSet.has(v.account_id)),
changedValidators: nextValidators.filter(v => (validatorsMap.has(v.account_id) && validatorsMap.get(v.account_id).stake != v.stake))
.map(v => ({ current: validatorsMap.get(v.account_id), next: v }))
};
}
exports.diffEpochValidators = diffEpochValidators;
Выполнить команду
Для локальной разработки. Не используйте в интернете!