Dynamo Proposal #1 — Proof of Stake

Shaun Neal
5 min readApr 10, 2022

Purpose/Incentive

Implementing Proof of Stake on the Dynamo Coin Mainnet will create economic incentives to acquire and hold coins for future value and returns.

A Hybrid Proof of Work / Proof of Stake model is more secure and less centralized than a pure Proof of Work or Proof of Stake coin.

Proof of Stake node operators enhance the security and robustness of the network by operating full nodes.

Economics

Currently, the block reward for proof of work miners is 1.0 DMO per block. This proposal modifies that to 0.6 DMO to miners and 0.4 DMO to a staking pool. The staking pool is awarded to stakers based on the schedule below.

Stakers may choose to stake any amount of coins.

Stakers must be running a full node to claim staking rewards.

There is no slashing, however stakers which do not claim their rewards timely lose the ability to claim them.

Stakers must stake for a minimum fixed period of time: approximately 30, 60 or 90 days, equivalent to 130,000, 260,000 or 390,000 blocks. The actual lock time is measured in blocks based on the block when the coins were staked.

Coins can be unstaked at any time. If coins are unstaked prior to the reward block, then all pending rewards are forfeit. If coins are unstaked after the reward block, rewards can continue to be claimed at the current rate.

The pool weighted earning rate for staking is 1x coins for 30 day tranche, 3x coins for 60 day tranche and 6x coins for 90 day tranche. A person staking 600 coins for 30 days will earn the same pool % as a person staking 100 coins for 90 days.

Staking is accomplished by sending coins to a burn address with a designated OP_RETURN code, which will flag those coins sent as staked in the given tranche. Unstaking is accomplished by sending a small transaction (e.g. 0.0001 DMO) to a burn address with a designated OP_RETURN code.

When coins are sent to the staking address, the TXID of that transaction is used as the stakers’ voting ticket.

After the generation of each block by the proof of work miners, current stakers will be eligible to submit voting tickets on that block as it is replicated. Stakers must submit staking tickets within 10 blocks of being eligible. Staking tickets submitted after 10 blocks will be rejected by the mempool. A staking ticket submission consists of a coinbase transaction claiming the number of staked coins in a particular tranche.

A staking ticket will increase the total work of the chain, thereby increasing the chance that chains with more honest votes will become the main chain.

Stakers will be self-selected using a pseudo-random hash based on the current block hash and the 20 most recent block hashes. The selection hash is based on the current block hash which is hashed with the 20 most recent block hashes and then logically XOR’d with the staker’s TXID of the claimed hash. If the resulting hash mod 256 = 0 then that ticket is eligible to claim a stake for that block.

Stakers may stake as many different times as they like. Each TXID will be independently eligible for a reward.

Staking rewards are calculated every 1000 blocks. Rewards are calculated as the proportional amount of coins staked times the number of tickets claimed times the amount of block rewards during the reward cycle. Calculated rewards are paid at the end of the staking cycle unless coins are unstaked in which case all pending rewards are forfeit and burned.

Example:

Staker A stakes 2,000 coins on block 1,400,000 for 130,000 blocks (30 day)

Staker B stakes 1,000 coins on block 1,425,000 for 260,000 blocks (60 day)

Staker C stakes 1,000 coins on block 1,450,000 for 130,000 blocks (30 day)

For block rewards between 1,400,000 and 1,500,000 (as an example):

For blocks 1,400,000 to 1,424,999 — Staker A is the only person staking and thus receives 100% of rewards which is 400 DMO per 1,000 blocks or 25 x 400 = 10,000 DMO.

For blocks 1,425,000 to to 1,449,000 Staker A has 2,000 in the 30 day tranche and staker B has 1000 coins in the 60 day tranche. The pool weights are thus 2,000 for A (1x coins) and 3,000 for B (3x coins). A will receive 40% of the block rewards and B will receive 60%. [2000 + 3000 = 5000 … 2,000/5,000 = 40% and 3,000 / 5,000 = 60%].So for these 25,000 blocks, there will be 400 DMO per 1,000 blocks, so Staker A will receive 400 x 25 x 40% = 4,000 DMO and Staker B will receive 400 x 25 x 60% = 6,000 DMO.

For blocks 1,450,000 and beyond, there are three Stakers — A with 2,000 in the 30 day, B with 1,000 in the 60 day and C with 1,000 in the 30 day. Total staking pool is 2000 (at 1x), 1000 (at 3x) and 1000 (at 1x) = 6000. So the rewards will be split 33% to A, 50% to B and 16% to C.

Rewards for A will begin being paid on block 1,540,000 for block rewards earned between 1,400,000 and 1,400,999 (e.g. 130,000 blocks after the expiration of the first reward period).

Implementation

Create two new OP_RETURN opcodes — stake coins and unstake coins

Create local database maintained by fullnode which tracks staking rewards

Modify fullnode to generate staking tickets for all coins staked by it

Modify consensus to adjust work based on POW hash plus tickets submitted

Modify accept to mempool to allow for staking coinbase transactions

Modify accept to mempool to reject invalid staking tickets

Modify miner to add staking coinsbase transactions into CB vout

Timeline

Testnet versions available approximately 2 weeks after voting on this proposal is complete.

Release to mainnet after 2 to 3 months of testing.

Voting

Ratification requires 67% of voting coins to enter proposal on a ballot

If put on ballot, the measure must have 90% of voting coins in favor to pass

Ratification ending block: 1,517,000 (votes to ratify must be cast PRIOR to this block). Votes will be tallied on block 1,517,500.

If put on ballot, ballot ending block: 1,562,000 (votes for or against must be cast PRIOR to this block). Votes will be tallied on block 1,562,500.

Ratification YES vote burn address:

Ratification NO vote burn address:

Ballot YES vote burn address:

Ballot NO vote burn address:

--

--