Announcement: Release Phase 1 of Beacon R-DPoS

Following the design, in the last 2 months, we had been working to achieve the first phase of our decentralization effort. With this first phase, we support full beacon life-cycle, including:

  • Staking Beacon: a shard validator now can promote itself to be a beacon candidate
  • Add Stake Beacon: a beacon validator can add stake to maintain its position in the committee
  • Unstake Beacon: a beacon validator can be unstaked, but its staking amount will be locked for a period of time, depending on its performance score.
  • Slash Beacon: a beacon validator will be slashed if its performance is below a threshold.

The code will be released this week, but we need 75% of nodes to update new code to trigger this feature.

Protocol Details:


To become a beacon validator, user needs to

  • be in shard validator (commitee/pending status)
  • have a minimum amount of 87500 PRV

After stake beacon, the validator will be in Waiting List. At this stage, node need to finish 10 round of Shard Committee, and sync all shard database. Only satisfy these requirements, node will be join Pending pool.

Every node maintains a reputation score = staking amount * performance.

Based on the reputation score, nodes will be ranked. The top 32 nodes will be select to be join Committee. The rest will be in Pending pool. To increase the reputation score, validator can add more PRV by using addstake rpc.

Any node that send unstake, or is slashed (performance score less than 100) will be put to Locking pool. The number of locking epochs is base period + performance penalty. For mainnet:

  • base period = 160

  • performance penalty = 10 * (1000 - performance)/100

After the locking period, all staking amount will be released to the validator.

RPC Usage:

  • Stake beacon:

     curl --location --request POST 'https://mainnet.incognito.org/fullnode' \
     --header 'Content-Type: application/json' \
     --data-raw '{
        "id": 1,
        "jsonrpc": "1.0",
        "method": "createandsendstakingtransaction",
        "params": [
            "private_key",
            {
                "burning_address": 87500000000000
            },
            -1,
            0,
            {
                "StakingType": 64,
                "CandidatePaymentAddress": "candidate_payment_address",
                "PrivateSeed": "mining_key",
                "RewardReceiverPaymentAddress": "reward_receiver_payment_address",
                "AutoReStaking": true,
                "Delegate": ""
            }
        ]
     }'
    
  • private_key: private key of the account will pay for this request

  • burning_address: burning address of the network

  • candidate_payment_addrees: payment address of validator

  • mining_key: mining key of validator

  • reward_receiver_payment_address: reward receiver payment address

  • AutoRestaking field type boolean

  • Add stake:

      curl --location --request POST 'https://mainnet.incognito.org/fullnode' \
      --header 'Content-Type: application/json' \
      --data-raw '{
         "id": 1,
         "jsonrpc": "1.0",
         "method": "createandsendaddstakingtransaction",
         "params": [
             "private_key",
             {
                 "burning_address": 1750000000000
             },
             -1,
             0,
             {
                 "CandidatePaymentAddress": "candidate_payment_address",
                 "PrivateSeed": "mining_key",
                 "AddStakingAmount": 1750000000000
             }
         ]
      }'
    
  • private_key: private key of the account will pay for this request

  • burning_address: burning address of the network

  • candidate_payment_addrees: payment address of validator

  • mining_key: mining key of validator

  • Unstake:

      curl --location --request POST 'https://mainnet.incognito.org/fullnode' \
      --header 'Content-Type: application/json' \
      --data-raw '{
        "jsonrpc": "1.0",
        "id": 1,
        "method": "createunstaketransaction",
        "params": [
           "private_key",
           {
              "burning_address": 0
           },
           -1,
           0,
           {
              "UnStakingType": 210,
              "CandidatePaymentAddress": "candidate_payment_address",
              "PrivateSeed": "mining_key"
           }
        ]
      }'
    
  • private_key: private key of the account will pay for this request

  • burning_address: burning address of the network

  • candidate_payment_addrees: payment address of validator

  • mining_key: mining key of validator

5 Likes