Skip to content

Instantly share code, notes, and snippets.

@yihuang
Last active February 5, 2020 09:56
Show Gist options
  • Select an option

  • Save yihuang/eaea78ec8384d377dcf8bf84c1b947d3 to your computer and use it in GitHub Desktop.

Select an option

Save yihuang/eaea78ec8384d377dcf8bf84c1b947d3 to your computer and use it in GitHub Desktop.
Using relational database concepts to clarify validator stat logic
-- current validator state, in memory.
create table validator (
  staking_address primary key,
  bonded_coins btree_indexed,
  voting_power = bonded_coins / 10000_0000,
  validator_address unique_indexed,
  council_node_info json,
  proposer_stat int,  -- or vote_stat
  punishment json null,
);
-- validator state snapshoted at last commit time, persisted.
create table validator_committed copy of validator;
-- produce `Vec<ValidatorUpdate>` at end_block

-- get new validators
new = select validator_address, voting_power from validator
  order by bonded_coins, staking_address desc
  where punishment is not null
  limit max_validators

-- get old validators from validator_committed
old = select validator_address, voting_power from validator_committed
  order by bonded_coins, staking_address desc
  where punishment is not null
  limit max_validators
  
updates = diff(old, new)
-- bond/unbond
update validator set bonded_coins += ? where staking_address=?
-- update reward stat
update validator set proposer_stat=proposer_stat+1 where validator_address=?

-- get reward distribution proportion
select sum(proposer_stat) into num_blocks from validator
  where proposer_stat > 0;
select *, proposer_stat / num_blocks as proportion from validator
  where proposer_stat > 0;

-- clear reward stat
update validator set proposer_stat=0;
-- punishment
update validator set punishment = something where staking_address=?
-- remove punishment
update validator set punishment = null where staking_address=?
-- commit
copy validator to validator_committed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment