Proof of Participation: Consensus Refined

Proof of Participation: Consensus Refined

These past two weeks, I spend most of my time on the part of ZooBC that matters more than anything else.

Consensus.

Everything else can be rewritten, optimized, or replaced. Consensus is different. It defines what the network believes, who it trusts, and how it survives disagreement. This is the heart of ZooBC, and it is where the project either proves it deserves to exist or quietly fails.

Proof of Participation is not a new idea I am inventing today. It is the same concept ZooBC was built around years ago, but this time I am refining it with clearer rules, cleaner boundaries, and fewer compromises.

Why Participation Matters

Proof of Work wastes energy.
Proof of Stake concentrates power.

Both systems work, but both carry trade-offs I was never comfortable with.

Proof of Participation takes a different approach. It rewards nodes for behaving like good citizens of the network. Not for being rich. Not for burning electricity. But for showing up and doing the work.

Nodes earn participation by:

  • Producing blocks when they are selected
  • Exchanging receipts with other nodes
  • Staying online, reachable, and responsive

Participation is not abstract. It is measured continuously, and it has consequences.

Deterministic Blocksmith Selection

Block production itself must be boring. Predictable. Unambiguous.

Blocksmith selection in ZooBC is deterministic. Given the same inputs, every node must reach the same conclusion, without coordination, without negotiation, and without randomness leaking in from the outside.

The algorithm is simple by design:

// Reset RNG with block seed
rng_->Reset("zbc-blocksmith", previous_block.block_seed);

// Get active nodes sorted by node_id
auto nodes = node_registry_->GetActiveNodes();

// Generate random number and select
int64_t rand_number = rng_->NextInt63();
int64_t idx = rand_number % nodes.size();
return nodes[idx];

The random number generator is deterministic.
The node registry is ordered.
The modulo operation is stable.

Given the same previous block and the same active node set, every node agrees on who should produce the next block. There is no voting. No race. No ambiguity.

This is intentional. Block production is not a reward. It is a responsibility.

Separating Power From Rewards

One of the most important design choices in Proof of Participation is what participation does not affect.

Participation scores do not influence blocksmith selection.

This is a deliberate separation of concerns. Block production remains evenly distributed among active nodes. No node gains disproportionate influence over the chain just because it has a higher score.

Instead, participation scores affect coinbase distribution.

This is where incentives live.

Nodes with higher participation scores receive a larger share of block rewards. Nodes that contribute more, earn more. Nodes that slack off slowly lose their advantage.

This creates an economic incentive for good behavior without centralizing control over block production itself.

How Scores Change

Participation scores are not static. They evolve based on observable behavior.

Each node exchanges receipts with peers. Those receipts are counted and compared against a network-wide pivot value. The formula is intentionally simple:

If receipts >= pivot:
    delta = +increase_unit * network_size * (receipts - pivot)
Else:
    delta = -decrease_unit * network_size * (pivot - receipts)

Nodes that contribute more than expected gain score.
Nodes that contribute less lose score.

Scores are bounded between zero and a defined maximum. Hit zero, and the node is expelled from the registry. Participation is not optional. It is enforced.

Refinement, Not Reinvention

As I implement and test this logic again, I realize something important.

Proof of Participation did not fail before because it was flawed. It failed because everything around it was fragile. This time, the surrounding architecture is stronger, clearer, and less forgiving of shortcuts.

Sitting alone in my lab, replaying block sequences and watching participation scores evolve exactly as expected, I feel a quiet confidence returning. Not excitement. Not hype.

Just the sense that the rules are finally precise enough to hold.

Consensus is no longer a theory again.

It is running code.