This article explores a specification for a decentralized mining pool implemented in Kulupu’s protocol level, assuming signed mining.
Those changes are built on top of 53-KSIGNED.
Proof of work operates on seals, and each of them have a
corresponding difficulty. Two seals of difficulty
A should have the
same effect as one seal of difficutly
2 * A, because the former is
equivalent to having the block time cut in half as the later.
On protocol level, we change signed mining to allow multiple seals to
be included in a block header, with each of them having a difficulty
D / N, where
D is the current difficulty, and
N is the number
type MultiSeal = Vec<Seal>;
The seals in the array are built on top of each other. The first
Calculation uses the
pre_hash of the header. The second one use
pre_hash of the completed first
Seal, and so forth.
Note that each seal in this sequence will have the same difficulty. Otherwise, a centralized mining pool can game the system by providing itself a seal with a low difficulty, and asking real miners to provide a seal with a high difficulty.
At this moment, block rewards are calculated and deposited in the same block. This works with single seal system because the sealer is always known in advance. However, with the new system that multiple miners will be building on the same block, we need to move the reward calculation to the beginning of next block.
The runtime, upon initialization, will read the seal data of the previous block and compute its reward. It then handles the reward deposit logic from there.
Built with the protocol changes, multiple decentralized mining pools can be implemented for Kulupu.
Those pools operate on another network layer. Each pool differs in its respective difficulty level, by setting up a fixed number of how many seals it expects to be built in one block.
Upon receiving a new Kulupu block in the network. Peers in a pool drop any existing work, and set the
pre_hashto be a new block that itself is building. Note that at this moment, peers in a single pool will build on different
pre_hash, because they each generates new blocks individually.
The first peer that finds a seal with difficulty
D / Npublishes the header with the seal to the sub-network of the decentralized pool.
Other peers, upon receiving the header, will first verify the runtime logic of the received header, and verify the consensus of the received seal. It then starts to build upon the seal.
Once there are
Nseals accumulated in the header, the sub-network publishes the block to the Kulupu network.