From 407add9aa594be2a5344ad941a622b6a90129fae Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Fri, 28 Jan 2022 19:33:06 +0300 Subject: [PATCH] add: kitabu validators contract (untested) --- bloxberg.json | 161 ---------------------- contracts/validators/KitabuValidators.sol | 93 +++++++++++++ 2 files changed, 93 insertions(+), 161 deletions(-) delete mode 100644 bloxberg.json create mode 100644 contracts/validators/KitabuValidators.sol diff --git a/bloxberg.json b/bloxberg.json deleted file mode 100644 index ac036a3..0000000 --- a/bloxberg.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "name": "Bloxberg", - "engine": { - "authorityRound": { - "params": { - "maximumUncleCountTransition": 0, - "maximumUncleCount": 0, - "stepDuration": "5", - "validators": { - "multi": { - "0": { - "list": [ - "0x25327e6ec0B7A0b552Fb907bD6b3726A2F3D99FE", - "0x92db87a17af5083b3327f35b3d77d8d4abfb0cdc", - "0x09e5abedae50639406df6c86d748fbaff66a6df1", - "0x411636d64bb7ba6e1cc3b950bec9a837f59cd46f" - ] - } - } - } - } - } - }, - "params": { - "gasLimitBoundDivisor": "0x400", - "maximumExtraDataSize": "0x20", - "minGasLimit": "0x7A1200", - "networkID": "0x2325", - - "eip140Transition": "0x0", - "eip211Transition": "0x0", - "eip214Transition": "0x0", - "eip658Transition": "0x0", - - "eip145Transition": "0x0", - "eip1014Transition": "0x0", - "eip1052Transition": "0x0", - - "eip1283Transition": "0x0", - "eip1344Transition": "0x0", - "eip1706Transition": "0x0", - "eip1884Transition": "0x0", - "eip2028Transition": "0x0" - }, - "genesis": { - "seal": { - "authorityRound": { - "step": "0x0", - "signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - } - }, - "difficulty": "0x20000", - "gasLimit": "0x7A1200" - }, - "accounts": { - "0x0000000000000000000000000000000000000001": { - "balance": "1", - "builtin": { - "name": "ecrecover", - "pricing": { "linear": { "base": 3000, "word": 0 } } - } - }, - "0x0000000000000000000000000000000000000002": { - "balance": "1", - "builtin": { - "name": "sha256", - "pricing": { "linear": { "base": 60, "word": 12 } } - } - }, - "0x0000000000000000000000000000000000000003": { - "balance": "1", - "builtin": { - "name": "ripemd160", - "pricing": { "linear": { "base": 600, "word": 120 } } - } - }, - "0x0000000000000000000000000000000000000004": { - "balance": "1", - "builtin": { - "name": "identity", - "pricing": { "linear": { "base": 15, "word": 3 } } - } - }, - "0x0000000000000000000000000000000000000005": { - "builtin": { - "name": "modexp", - "activate_at": 0, - "pricing": { "modexp": { "divisor": 20 } } - } - }, - "0x0000000000000000000000000000000000000006": { - "builtin": { - "name": "alt_bn128_add", - "activate_at": 0, - "pricing": { - "alt_bn128_const_operations": { - "price": 500 - } - } - } - }, - "0000000000000000000000000000000000000007": { - "builtin": { - "name": "alt_bn128_mul", - "pricing": { - "0": { - "info": "Istanbul HF", - "price": { - "alt_bn128_const_operations": { - "price": 6000 - } - } - } - } - } - }, - "0000000000000000000000000000000000000008": { - "builtin": { - "name": "alt_bn128_pairing", - "pricing": { - "0": { - "info": "Istanbul HF", - "price": { - "alt_bn128_pairing": { - "base": 45000, - "pair": 34000 - } - } - } - } - } - }, - "0x0000000000000000000000000000000000000009": { - "builtin": { - "name": "blake2_f", - "pricing": { - "0": { - "info": "Istanbul HF", - "price": { - "blake2_f": { - "gas_per_round": 1 - } - } - } - } - } - }, - "0x25327e6ec0B7A0b552Fb907bD6b3726A2F3D99FE": { - "balance": "100000000000000000000000000000000" - }, - "0x92db87a17af5083b3327f35b3d77d8d4abfb0cdc": { - "balance": "100000000000000000000000000000000" - }, - "0x09e5abedae50639406df6c86d748fbaff66a6df1": { - "balance": "100000000000000000000000000000000" - }, - "0x411636d64bb7ba6e1cc3b950bec9a837f59cd46f": { - "balance": "100000000000000000000000000000000" - } - } -} diff --git a/contracts/validators/KitabuValidators.sol b/contracts/validators/KitabuValidators.sol new file mode 100644 index 0000000..e97617f --- /dev/null +++ b/contracts/validators/KitabuValidators.sol @@ -0,0 +1,93 @@ +// Author: Mohamed Sohail +// SPDX-License-Identifier: GPL-3.0-or-later + +pragma solidity >=0.6.12; + +contract KitabuValidators { + address constant SYSTEM_ADDRESS = + 0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE; + address public admissionController = + 0x77Bea3320Fa46aFF3C7c128B83F5E436596Ba73D; + + address[] public validators; + + bool public finalized; + + mapping(address => uint256) validatorSetIndex; + + event NewAdmissionController( + address indexed old, + address indexed newController + ); + event InitiateChange(bytes32 indexed parentHash, address[] newSet); + event ChangeFinalized(address[] currentSet); + + modifier onlySystemChange() { + require(msg.sender == SYSTEM_ADDRESS); + _; + } + + modifier pendingFinalization() { + require(finalized); + _; + } + + modifier onlyAdmissionController() { + require(msg.sender == admissionController); + _; + } + + constructor() { + validators.push(admissionController); + validatorSetIndex[admissionController] = 0; + } + + function setNewAdmissionController(address newController) + public + onlyAdmissionController + { + emit NewAdmissionController(admissionController, newController); + admissionController = newController; + } + + function getValidators() public view returns (address[] memory) { + return validators; + } + + function initiateChange() private { + finalized = false; + emit InitiateChange(blockhash(block.number - 1), getValidators()); + } + + function finalizeChange() public onlySystemChange { + finalized = true; + emit ChangeFinalized(validators); + } + + function addValidator(address newValidator) + public + onlyAdmissionController + pendingFinalization + { + validators.push(newValidator); + validatorSetIndex[newValidator] = validators.length - 1; + initiateChange(); + } + + function removeValidator(address exValidator) + public + onlyAdmissionController + pendingFinalization + { + orderedRemoval(validatorSetIndex[exValidator]); + delete validatorSetIndex[exValidator]; + initiateChange(); + } + + function orderedRemoval(uint256 index) private { + for (uint256 i = index; i < validators.length - 1; i++) { + validators[i] = validators[i + 1]; + } + validators.pop(); + } +}