ergo_lib/chain/
parameters.rs

1//! Blockchain parameters. This module defines adjustable blockchain parameters that can be voted on by miners
2use std::collections::HashMap;
3
4#[repr(i8)]
5#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
6// TODO: soft-fork parameter
7/// A parameter that can be adjusted by voting
8pub enum Parameter {
9    /// Storage fee factor (per byte per storage period)
10    StorageFeeFactor = 1,
11    ///Minimum monetary value of a box
12    MinValuePerByte = 2,
13    ///Maximum block size
14    MaxBlockSize = 3,
15    ///Maximum cumulative computational cost of a block
16    MaxBlockCost = 4,
17    ///Token access cost
18    TokenAccessCost = 5,
19    /// Cost per one transaction input
20    InputCost = 6,
21    /// Cost per one data input
22    DataInputCost = 7,
23    /// Cost per one transaction output
24    OutputCost = 8,
25    /// Current block version
26    BlockVersion = 123,
27}
28
29/// System parameters which can be adjusted via soft-fork
30#[cfg_attr(feature = "json", derive(serde::Deserialize))]
31#[cfg_attr(
32    feature = "json",
33    serde(try_from = "crate::chain::json::parameters::ParametersJson")
34)]
35#[derive(Clone, Debug, Eq, PartialEq)]
36pub struct Parameters {
37    /// table of adjustable system parameters
38    pub parameters_table: HashMap<Parameter, i32>,
39}
40
41impl Parameters {
42    /// Get current block version
43    pub fn block_version(&self) -> i32 {
44        self.parameters_table[&Parameter::BlockVersion]
45    }
46    /// Cost of storing 1 byte per Storage Period of block chain
47    pub fn storage_fee_factor(&self) -> i32 {
48        self.parameters_table[&Parameter::StorageFeeFactor]
49    }
50    /// Minimum value per byte an output must have to not be considered dust
51    pub fn min_value_per_byte(&self) -> i32 {
52        self.parameters_table[&Parameter::MinValuePerByte]
53    }
54    /// Maximum size of transactions size in a block
55    pub fn max_block_size(&self) -> i32 {
56        self.parameters_table[&Parameter::MaxBlockSize]
57    }
58    /// Maximum total computation cost in a block
59    pub fn max_block_cost(&self) -> i32 {
60        self.parameters_table[&Parameter::MaxBlockCost]
61    }
62    /// Cost of accessing a single token
63    pub fn token_access_cost(&self) -> i32 {
64        self.parameters_table[&Parameter::TokenAccessCost]
65    }
66    /// Validation cost per one transaction input
67    pub fn input_cost(&self) -> i32 {
68        self.parameters_table[&Parameter::InputCost]
69    }
70    /// Validation cost per data input
71    pub fn data_input_cost(&self) -> i32 {
72        self.parameters_table[&Parameter::DataInputCost]
73    }
74    /// Validation cost per one output
75    pub fn output_cost(&self) -> i32 {
76        self.parameters_table[&Parameter::OutputCost]
77    }
78
79    /// Create new parameters from provided blockchain parameters
80    #[allow(clippy::too_many_arguments)]
81    pub fn new(
82        block_version: i32,
83        storage_fee_factor: i32,
84        min_value_per_byte: i32,
85        max_block_size: i32,
86        max_block_cost: i32,
87        token_access_cost: i32,
88        input_cost: i32,
89        data_input_cost: i32,
90        output_cost: i32,
91    ) -> Self {
92        let mut parameters_table = HashMap::new();
93        parameters_table.insert(Parameter::BlockVersion, block_version);
94        parameters_table.insert(Parameter::StorageFeeFactor, storage_fee_factor);
95        parameters_table.insert(Parameter::MinValuePerByte, min_value_per_byte);
96        parameters_table.insert(Parameter::MaxBlockSize, max_block_size);
97        parameters_table.insert(Parameter::MaxBlockCost, max_block_cost);
98        parameters_table.insert(Parameter::TokenAccessCost, token_access_cost);
99        parameters_table.insert(Parameter::InputCost, input_cost);
100        parameters_table.insert(Parameter::DataInputCost, data_input_cost);
101        parameters_table.insert(Parameter::OutputCost, output_cost);
102        Self { parameters_table }
103    }
104}
105
106impl std::default::Default for Parameters {
107    /// Default blockchain parameters
108    // Taken from https://github.com/ergoplatform/ergo/blob/master/ergo-core/src/main/scala/org/ergoplatform/settings/Parameters.scala#L291
109    fn default() -> Self {
110        let mut parameters_table = HashMap::new();
111        parameters_table.insert(Parameter::StorageFeeFactor, 1250000);
112        parameters_table.insert(Parameter::MinValuePerByte, 30 * 12);
113        parameters_table.insert(Parameter::TokenAccessCost, 100);
114        parameters_table.insert(Parameter::InputCost, 2000);
115        parameters_table.insert(Parameter::DataInputCost, 100);
116        parameters_table.insert(Parameter::OutputCost, 100);
117        parameters_table.insert(Parameter::MaxBlockSize, 512 * 1024);
118        parameters_table.insert(Parameter::BlockVersion, 1);
119        Self { parameters_table }
120    }
121}