darkfi_sdk/blockchain.rs
1/* This file is part of DarkFi (https://dark.fi)
2 *
3 * Copyright (C) 2020-2025 Dyne.org foundation
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Affero General Public License as
7 * published by the Free Software Foundation, either version 3 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
19/// Auxiliary function to calculate provided block height block version.
20/// Currently, a single version(1) exists.
21pub fn block_version(_height: u32) -> u8 {
22 1
23}
24
25/// Auxiliary function to calculate provided block height epoch.
26/// Each epoch is defined by the fixed intervals rewards change.
27/// Genesis block is on epoch 0.
28pub fn block_epoch(height: u32) -> u8 {
29 match height {
30 0 => 0,
31 1..=1000 => 1,
32 1001..=2000 => 2,
33 2001..=3000 => 3,
34 3001..=4000 => 4,
35 4001..=5000 => 5,
36 5001..=6000 => 6,
37 6001..=7000 => 7,
38 7001..=8000 => 8,
39 8001..=9000 => 9,
40 9001..=10000 => 10,
41 10001.. => 11,
42 }
43}
44
45/// Auxiliary function to calculate provided block height expected reward value.
46///
47/// Genesis block always returns reward value 0. Rewards are halfed at fixed intervals,
48/// called epochs. After last epoch has started, reward value is based on DARK token-economics.
49pub fn expected_reward(height: u32) -> u64 {
50 // Grab block height epoch
51 let epoch = block_epoch(height);
52
53 // TODO (res) implement reward mechanism with accord to DRK, DARK token-economics.
54 // Configured block rewards (1 DRK == 1 * 10^8)
55 match epoch {
56 0 => 0,
57 1 => 2_000_000_000, // 20 DRK
58 2 => 1_800_000_000, // 18 DRK
59 3 => 1_600_000_000, // 16 DRK
60 4 => 1_400_000_000, // 14 DRK
61 5 => 1_200_000_000, // 12 DRK
62 6 => 1_000_000_000, // 10 DRK
63 7 => 800_000_000, // 8 DRK
64 8 => 600_000_000, // 6 DRK
65 9 => 400_000_000, // 4 DRK
66 10 => 200_000_000, // 2 DRK
67 _ => 100_000_000, // 1 DRK
68 }
69}