// CalcBlockSubsidy returns the subsidy amount a block at the provided height // should have. This is mainly used for determining how much the coinbase for // newly generated blocks awards as well as validating the coinbase for blocks // has the expected value. // // Subsidy calculation for exponential reductions: // 0 for i in range (0, height / ReductionInterval): // 1 subsidy *= MulSubsidy // 2 subsidy /= DivSubsidy // // Safe for concurrent access. func calcBlockSubsidy(height int64, params *chaincfg.Params) int64 { // Block height 1 subsidy is 'special' and used to // distribute initial tokens, if any. if height == 1 { return params.BlockOneSubsidy() } iterations := height / params.ReductionInterval subsidy := params.BaseSubsidy // You could stick all these values in a LUT for faster access if you // wanted to, but this calculation is already really fast until you // get very very far into the blockchain. The other method you could // use is storing the total subsidy in a block node and do the // multiplication and division when needed when adding a block. if iterations > 0 { for i := int64(0); i < iterations; i++ { subsidy *= params.MulSubsidy subsidy /= params.DivSubsidy } } return subsidy }