Feature Proposal/Vote: Pico-inflation on Mainnet-Beta!

Hi Validators!

tl;dr - The on-chain vote to enable PICO-inflation on Mainnet-Beta is now open! Voting instructions below.

On the next stop on our path toward full-inflation on Mainnet-Beta, today we’re kicking off a Feature Proposal Program vote to enable PICO-inflation on Mainnet-Beta!

The pico-inflation parameters in this proposal match those that we’ve previously accepted and validated on Testnet, namely:

  • Initial Inflation Rate: 0.01%
  • Dis-inflation Rate: 0%

The purpose of enabling this small amount of inflation on Mainnet-Beta is for validation purposes before the full-inflation proposal is circulated (Jan 2021).

If you haven’t already, I highly recommend validators read through the Feature Proposal Program description here: https://spl.solana.com/feature-proposal.

What has already happened:

We have created a Feature Proposal for enabling pico-inflation on Mainnet-Beta and it is ready to be voted on!

The dormant pico-inflation feature was implemented and deployed with v1.4.11 with Feature ID: 4RWNif6C2WCNiKVW7otP4G7dkmkHGyKQWRpuZ1pxKU5m (observable via solana feature status). Using the same keypair that the pico-inflation feature id was derived from, the Solana Foundation initiated the community proposal process via spl-feature-proposal propose <pico-inflation keypair>

By initiating the proposal process, a mint of SPL tokens was created in 1:1 proportion to the amount of stake on the network. These SPL tokens were then delivered to each validator’s identity pubkey, the amount matching the amount of SOL staked to that validator’s node.

Pico-inflation on Mainnet-Beta will now be enabled if >= 67% of these SPL tokens are sent as “votes” to the Feature Proposal acceptance token address (see below)!


On-chain governance!

Validators should follow these two steps to participate in the vote:

  1. First look up your pico-inflation SPL vote token address via:

spl-token --url https://api.mainnet-beta.solana.com/ --owner ~/validator-keypair.json accounts 432FsYZLkqu6fiXbEm7NDVR58xJPfJTHNzsTSEE1KmwW

Where 432FsYZLkqu6fiXbEm7NDVR58xJPfJTHNzsTSEE1KmwW is the Mint Address for the pico-inflation SPL vote token created for this specific proposal.

  1. Submit votes by sending some or all of the SPL tokens to the pico-inflation on Mainnet-Beta acceptance address: 3iAe6JeecrC5XgrJtrCqFWXqfeh55JEBjcTes3siFbB6 This is done via:

spl-token --url https://api.mainnet-beta.solana.com/ --owner ~/validator-keypair.json transfer <TOKEN_ACCOUNT_ADDRESS> ALL 3iAe6JeecrC5XgrJtrCqFWXqfeh55JEBjcTes3siFbB6

Where <TOKEN_ACCOUNT_ADDRESS> was determined in step 1.

As mentioned above, when >= 67% of the SPL vote tokens are observed to be received at the Feature Proposal acceptance address (3iAe6JeecrC5XgrJtrCqFWXqfeh55JEBjcTes3siFbB6), the pico-inflation feature will automatically be enabled on Mainnet-Beta at the start of the subsequent epoch. If you don’t support the proposal, i.e. you’d like to vote “no”, just abstain from voting. The current feature proposal process is “opt-in” - your vote is counted “yes” as the proportion of tokens that are transferred to the acceptance address.

At any time, the votes can be tallied by anyone (after cargo install spl-feature-proposal-cli) using:

spl-feature-proposal tally D3Uc73L9mm9P4aVV6iAkHm33Nu2h5jU5cDmtBHGUWgYW

This vote will be open for 2 weeks (expiring on 2021-01-01T23:17:32Z) if the threshold is not met at the end of that timeframe, it will be considered to not have passed and a new proposal/vote might have to be initiated.


Testnet inflation validation

In advance of the pico-inflation feature proposal on mainnet-beta, we validated inflationary rewards distribution on the testnet. This post roughly shares how we validated it as a final confirmation.

As a quick context, we’ve fixed numerous bugs in staking and inflation over the past months in preparation of inflation, including security-related ones. While fixing them, we sensed the need for actually validating the various internal inflation/staking data to prevent these logic errors from concurring again.

Thus, our validation methodology is designed like this: we introduced various optional hooks to expose intermediate calculation data into the actual inflation implementation, which is actually executed on the testnet/mainnet-beta. Then, the collected data is validated by a specially-developed logic validation tool (note still messy code). This way, we minimized the risk of wrong data collection to begin with and solidified the confidence in the actual implementation our validators depend on, instead of some simulated validation using manually copied staking information. As a bonus, this makes it easy for anyone not only us to validate it with future inflation data if urged to audit the inflation.

The data collected from hooks is saved into a CSV file so that the validation tool can be run many times independently and retrospectively with possibility of future validation logic improvement (or general clean-up…). Basically, the validation code replicates all aspects of the inflation/staking calculation from actual credits in vote accounts and delegated amounts in stake accounts to the final inflation distribution rewarded both to vote and stake accounts. Additionally, it includes all specific checks for fixed past bugs.

For example:

  • Ensure effective delegated stake amount is no more than the stake account’s balance
  • Ensure all staked accounts to the same vote account should have similar rewarded amount with some negligible margin of error.
  • Ensure there are no incorrectly repeated inflation rewards by marking stake accounts as rewarded only if done so.

For anyone interested, you can also run the data using the snapshot and genesis file (a bit old) and run solana-ledger-tool --ledger path/to/snapshot-dir capitalization --warp-epoch +1 --csv-filename testnet-full-inflation.csv. You can anchor the trust with printed slot 52796255’s last_blockash (the last block in the rewarded epoch) compared to the explorer or with your validator logs and/or ledger, and then compare with solana --url http://testnet.solana.com block 52796261 (52796261 is the first block of the next epoch) or solana stake-account --url http://testnet.solana.com <stake account> (and search for epoch 134). Also note that as a known issue, the rate of full inflation of testnet is incorrect. Fix is applied to devnet only at the moment (Needless to say, mainnet-beta will be applied with the correct rate like devnet).

1 Like

Great to see this happening! Is there any update on this? When should we expect normal inflation to be proposed?