Prettify ledger constants (#4793)
This commit is contained in:
parent
b00064b5a7
commit
e69f9f1084
4 changed files with 214 additions and 41 deletions
|
@ -32,6 +32,26 @@ uint8_t account_decode (char value)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* public_key
|
||||
*/
|
||||
|
||||
nano::public_key nano::public_key::from_account (std::string const & text)
|
||||
{
|
||||
nano::public_key result;
|
||||
bool error = result.decode_account (text);
|
||||
release_assert (!error);
|
||||
return result;
|
||||
}
|
||||
|
||||
nano::public_key nano::public_key::from_node_id (std::string const & text)
|
||||
{
|
||||
nano::public_key result;
|
||||
bool error = result.decode_node_id (text);
|
||||
release_assert (!error);
|
||||
return result;
|
||||
}
|
||||
|
||||
void nano::public_key::encode_account (std::string & destination_a) const
|
||||
{
|
||||
debug_assert (destination_a.empty ());
|
||||
|
@ -138,6 +158,10 @@ bool nano::public_key::decode_account (std::string const & source_a)
|
|||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* uint256_union
|
||||
*/
|
||||
|
||||
// Construct a uint256_union = AES_ENC_CTR (cleartext, key, iv)
|
||||
void nano::uint256_union::encrypt (nano::raw_key const & cleartext, nano::raw_key const & key, uint128_union const & iv)
|
||||
{
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <nano/lib/assert.hpp>
|
||||
|
||||
#include <boost/functional/hash_fwd.hpp>
|
||||
#include <boost/multiprecision/cpp_int.hpp>
|
||||
|
||||
|
@ -7,6 +9,7 @@
|
|||
#include <compare>
|
||||
#include <limits>
|
||||
#include <ostream>
|
||||
#include <string_view>
|
||||
|
||||
#include <fmt/ostream.h>
|
||||
|
||||
|
@ -236,6 +239,18 @@ public:
|
|||
std::string to_node_id () const;
|
||||
std::string to_account () const;
|
||||
|
||||
/**
|
||||
* Decode from account string
|
||||
* @warning Aborts at runtime if the input is invalid
|
||||
*/
|
||||
static public_key from_account (std::string const &);
|
||||
|
||||
/**
|
||||
* Decode from node id string
|
||||
* @warning Aborts at runtime if the input is invalid
|
||||
*/
|
||||
static public_key from_node_id (std::string const &);
|
||||
|
||||
public: // Keep operators inlined
|
||||
auto operator<=> (nano::public_key const & other) const
|
||||
{
|
||||
|
@ -338,6 +353,12 @@ class link final : public hash_or_account
|
|||
public:
|
||||
using hash_or_account::hash_or_account;
|
||||
|
||||
explicit link (std::string_view str)
|
||||
{
|
||||
release_assert (str.size () <= bytes.size ());
|
||||
std::copy_n (str.data (), str.size (), bytes.begin ());
|
||||
}
|
||||
|
||||
public: // Keep operators inlined
|
||||
auto operator<=> (nano::link const & other) const
|
||||
{
|
||||
|
|
|
@ -77,17 +77,40 @@ std::shared_ptr<nano::block> parse_block_from_genesis_data (std::string const &
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* nano::dev constants
|
||||
*/
|
||||
|
||||
nano::keypair nano::dev::genesis_key{ dev_private_key_data };
|
||||
nano::network_params nano::dev::network_params{ nano::networks::nano_dev_network };
|
||||
nano::ledger_constants & nano::dev::constants{ nano::dev::network_params.ledger };
|
||||
std::shared_ptr<nano::block> & nano::dev::genesis = nano::dev::constants.genesis;
|
||||
|
||||
nano::network_params::network_params (nano::networks network_a) :
|
||||
work{ network_a == nano::networks::nano_live_network ? nano::work_thresholds::publish_full : network_a == nano::networks::nano_beta_network ? nano::work_thresholds::publish_beta
|
||||
: network_a == nano::networks::nano_test_network ? nano::work_thresholds::publish_test
|
||||
: nano::work_thresholds::publish_dev },
|
||||
network{ work, network_a },
|
||||
ledger{ work, network_a },
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
nano::work_thresholds const & nano::work_thresholds_for_network (nano::networks network_type)
|
||||
{
|
||||
switch (network_type)
|
||||
{
|
||||
case nano::networks::nano_live_network:
|
||||
return nano::work_thresholds::publish_full;
|
||||
case nano::networks::nano_beta_network:
|
||||
return nano::work_thresholds::publish_beta;
|
||||
case nano::networks::nano_dev_network:
|
||||
return nano::work_thresholds::publish_dev;
|
||||
case nano::networks::nano_test_network:
|
||||
return nano::work_thresholds::publish_test;
|
||||
default:
|
||||
release_assert (false, "invalid network");
|
||||
}
|
||||
}
|
||||
|
||||
nano::network_params::network_params (nano::networks network_type) :
|
||||
work{ work_thresholds_for_network (network_type) },
|
||||
network{ work, network_type },
|
||||
ledger{ work, network_type },
|
||||
voting{ network },
|
||||
node{ network },
|
||||
portmapping{ network },
|
||||
|
@ -98,44 +121,116 @@ nano::network_params::network_params (nano::networks network_a) :
|
|||
kdf_work = network.is_dev_network () ? kdf_dev_work : kdf_full_work;
|
||||
}
|
||||
|
||||
nano::ledger_constants::ledger_constants (nano::work_thresholds & work, nano::networks network_a) :
|
||||
work{ work },
|
||||
zero_key ("0"),
|
||||
nano_beta_account (beta_public_key_data),
|
||||
nano_live_account (live_public_key_data),
|
||||
nano_test_account (test_public_key_data),
|
||||
nano_dev_genesis (parse_block_from_genesis_data (dev_genesis_data)),
|
||||
nano_beta_genesis (parse_block_from_genesis_data (beta_genesis_data)),
|
||||
nano_live_genesis (parse_block_from_genesis_data (live_genesis_data)),
|
||||
nano_test_genesis (parse_block_from_genesis_data (test_genesis_data)),
|
||||
genesis (network_a == nano::networks::nano_dev_network ? nano_dev_genesis : network_a == nano::networks::nano_beta_network ? nano_beta_genesis
|
||||
: network_a == nano::networks::nano_test_network ? nano_test_genesis
|
||||
: nano_live_genesis),
|
||||
genesis_amount{ std::numeric_limits<nano::uint128_t>::max () },
|
||||
burn_account{}
|
||||
{
|
||||
nano_beta_genesis->sideband_set (nano::block_sideband (nano_beta_genesis->account_field ().value (), 0, std::numeric_limits<nano::uint128_t>::max (), 1, nano::seconds_since_epoch (), nano::epoch::epoch_0, false, false, false, nano::epoch::epoch_0));
|
||||
nano_dev_genesis->sideband_set (nano::block_sideband (nano_dev_genesis->account_field ().value (), 0, std::numeric_limits<nano::uint128_t>::max (), 1, nano::seconds_since_epoch (), nano::epoch::epoch_0, false, false, false, nano::epoch::epoch_0));
|
||||
nano_live_genesis->sideband_set (nano::block_sideband (nano_live_genesis->account_field ().value (), 0, std::numeric_limits<nano::uint128_t>::max (), 1, nano::seconds_since_epoch (), nano::epoch::epoch_0, false, false, false, nano::epoch::epoch_0));
|
||||
nano_test_genesis->sideband_set (nano::block_sideband (nano_test_genesis->account_field ().value (), 0, std::numeric_limits<nano::uint128_t>::max (), 1, nano::seconds_since_epoch (), nano::epoch::epoch_0, false, false, false, nano::epoch::epoch_0));
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
nano::link epoch_link_v1;
|
||||
char const * epoch_message_v1 ("epoch v1 block");
|
||||
strncpy ((char *)epoch_link_v1.bytes.data (), epoch_message_v1, epoch_link_v1.bytes.size ());
|
||||
nano::ledger_constants::ledger_constants (nano::work_thresholds & work, nano::networks network_type) :
|
||||
work{ work },
|
||||
zero_key{ "0" },
|
||||
nano_beta_account{ beta_public_key_data },
|
||||
nano_live_account{ live_public_key_data },
|
||||
nano_test_account{ test_public_key_data },
|
||||
nano_dev_genesis{ parse_block_from_genesis_data (dev_genesis_data) },
|
||||
nano_beta_genesis{ parse_block_from_genesis_data (beta_genesis_data) },
|
||||
nano_live_genesis{ parse_block_from_genesis_data (live_genesis_data) },
|
||||
nano_test_genesis{ parse_block_from_genesis_data (test_genesis_data) },
|
||||
genesis_amount{ std::numeric_limits<nano::uint128_t>::max () },
|
||||
burn_account{ nano::account{ 0 } }
|
||||
{
|
||||
nano_beta_genesis->sideband_set (nano::block_sideband{
|
||||
/* account */ nano_beta_genesis->account_field ().value (),
|
||||
/* successor (block_hash) */ nano::block_hash{ 0 },
|
||||
/* balance (amount) */ nano::amount{ std::numeric_limits<nano::uint128_t>::max () },
|
||||
/* height */ uint64_t{ 1 },
|
||||
/* local_timestamp */ nano::seconds_since_epoch (),
|
||||
/* epoch */ nano::epoch::epoch_0,
|
||||
/* is_send */ false,
|
||||
/* is_receive */ false,
|
||||
/* is_epoch */ false,
|
||||
/* source_epoch */ nano::epoch::epoch_0 });
|
||||
|
||||
nano_dev_genesis->sideband_set (nano::block_sideband{
|
||||
/* account */ nano_dev_genesis->account_field ().value (),
|
||||
/* successor (block_hash) */ nano::block_hash{ 0 },
|
||||
/* balance (amount) */ nano::amount{ std::numeric_limits<nano::uint128_t>::max () },
|
||||
/* height */ uint64_t{ 1 },
|
||||
/* local_timestamp */ nano::seconds_since_epoch (),
|
||||
/* epoch */ nano::epoch::epoch_0,
|
||||
/* is_send */ false,
|
||||
/* is_receive */ false,
|
||||
/* is_epoch */ false,
|
||||
/* source_epoch */ nano::epoch::epoch_0 });
|
||||
|
||||
nano_live_genesis->sideband_set (nano::block_sideband{
|
||||
/* account */ nano_live_genesis->account_field ().value (),
|
||||
/* successor (block_hash) */ nano::block_hash{ 0 },
|
||||
/* balance (amount) */ nano::amount{ std::numeric_limits<nano::uint128_t>::max () },
|
||||
/* height */ uint64_t{ 1 },
|
||||
/* local_timestamp */ nano::seconds_since_epoch (),
|
||||
/* epoch */ nano::epoch::epoch_0,
|
||||
/* is_send */ false,
|
||||
/* is_receive */ false,
|
||||
/* is_epoch */ false,
|
||||
/* source_epoch */ nano::epoch::epoch_0 });
|
||||
|
||||
nano_test_genesis->sideband_set (nano::block_sideband{
|
||||
/* account */ nano_test_genesis->account_field ().value (),
|
||||
/* successor (block_hash) */ nano::block_hash{ 0 },
|
||||
/* balance (amount) */ nano::amount{ std::numeric_limits<nano::uint128_t>::max () },
|
||||
/* height */ uint64_t{ 1 },
|
||||
/* local_timestamp */ nano::seconds_since_epoch (),
|
||||
/* epoch */ nano::epoch::epoch_0,
|
||||
/* is_send */ false,
|
||||
/* is_receive */ false,
|
||||
/* is_epoch */ false,
|
||||
/* source_epoch */ nano::epoch::epoch_0 });
|
||||
|
||||
nano::account epoch_v2_signer;
|
||||
switch (network_type)
|
||||
{
|
||||
case networks::nano_dev_network:
|
||||
{
|
||||
genesis = nano_dev_genesis;
|
||||
epoch_v2_signer = nano::dev::genesis_key.pub;
|
||||
}
|
||||
break;
|
||||
case networks::nano_live_network:
|
||||
{
|
||||
genesis = nano_live_genesis;
|
||||
epoch_v2_signer = nano::account::from_account ("nano_3qb6o6i1tkzr6jwr5s7eehfxwg9x6eemitdinbpi7u8bjjwsgqfj4wzser3x");
|
||||
}
|
||||
break;
|
||||
case networks::nano_beta_network:
|
||||
{
|
||||
genesis = nano_beta_genesis;
|
||||
epoch_v2_signer = nano_beta_account;
|
||||
}
|
||||
break;
|
||||
case networks::nano_test_network:
|
||||
{
|
||||
genesis = nano_test_genesis;
|
||||
epoch_v2_signer = nano_test_account;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
release_assert (false, "invalid network");
|
||||
break;
|
||||
}
|
||||
release_assert (genesis != nullptr);
|
||||
release_assert (!epoch_v2_signer.is_zero ());
|
||||
|
||||
nano::link const epoch_link_v1{ "epoch v1 block" };
|
||||
epochs.add (nano::epoch::epoch_1, genesis->account (), epoch_link_v1);
|
||||
|
||||
nano::link epoch_link_v2;
|
||||
nano::account nano_live_epoch_v2_signer;
|
||||
auto error (nano_live_epoch_v2_signer.decode_account ("nano_3qb6o6i1tkzr6jwr5s7eehfxwg9x6eemitdinbpi7u8bjjwsgqfj4wzser3x"));
|
||||
debug_assert (!error);
|
||||
auto epoch_v2_signer (network_a == nano::networks::nano_dev_network ? nano::dev::genesis_key.pub : network_a == nano::networks::nano_beta_network ? nano_beta_account
|
||||
: network_a == nano::networks::nano_test_network ? nano_test_account
|
||||
: nano_live_epoch_v2_signer);
|
||||
char const * epoch_message_v2 ("epoch v2 block");
|
||||
strncpy ((char *)epoch_link_v2.bytes.data (), epoch_message_v2, epoch_link_v2.bytes.size ());
|
||||
nano::link const epoch_link_v2{ "epoch v2 block" };
|
||||
epochs.add (nano::epoch::epoch_2, epoch_v2_signer, epoch_link_v2);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
nano::hardened_constants & nano::hardened_constants::get ()
|
||||
{
|
||||
static hardened_constants instance{};
|
||||
|
@ -150,6 +245,10 @@ nano::hardened_constants::hardened_constants () :
|
|||
nano::random_pool::generate_block (random_128.bytes.data (), random_128.bytes.size ());
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
nano::node_constants::node_constants (nano::network_constants & network_constants)
|
||||
{
|
||||
backup_interval = std::chrono::minutes (5);
|
||||
|
@ -160,18 +259,30 @@ nano::node_constants::node_constants (nano::network_constants & network_constant
|
|||
weight_period = 5 * 60; // 5 minutes
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
nano::voting_constants::voting_constants (nano::network_constants & network_constants) :
|
||||
max_cache{ network_constants.is_dev_network () ? 256U : 128U * 1024 },
|
||||
delay{ network_constants.is_dev_network () ? 1 : 15 }
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
nano::portmapping_constants::portmapping_constants (nano::network_constants & network_constants)
|
||||
{
|
||||
lease_duration = std::chrono::seconds (1787); // ~30 minutes
|
||||
health_check_period = std::chrono::seconds (53);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
nano::bootstrap_constants::bootstrap_constants (nano::network_constants & network_constants)
|
||||
{
|
||||
lazy_max_pull_blocks = network_constants.is_dev_network () ? 2 : 512;
|
||||
|
@ -183,6 +294,10 @@ nano::bootstrap_constants::bootstrap_constants (nano::network_constants & networ
|
|||
default_frontiers_age_seconds = network_constants.is_dev_network () ? 1 : 24 * 60 * 60; // 1 second for dev network, 24 hours for live/beta
|
||||
}
|
||||
|
||||
/*
|
||||
* keypair
|
||||
*/
|
||||
|
||||
// Create a new random keypair
|
||||
nano::keypair::keypair ()
|
||||
{
|
||||
|
@ -205,6 +320,10 @@ nano::keypair::keypair (std::string const & prv_a)
|
|||
ed25519_publickey (prv.bytes.data (), pub.bytes.data ());
|
||||
}
|
||||
|
||||
/*
|
||||
* unchecked_info
|
||||
*/
|
||||
|
||||
nano::unchecked_info::unchecked_info (std::shared_ptr<nano::block> const & block_a) :
|
||||
block (block_a),
|
||||
modified_m (nano::seconds_since_epoch ())
|
||||
|
@ -317,6 +436,10 @@ nano::wallet_id nano::random_wallet_id ()
|
|||
return wallet_id;
|
||||
}
|
||||
|
||||
/*
|
||||
* unchecked_key
|
||||
*/
|
||||
|
||||
nano::unchecked_key::unchecked_key (nano::hash_or_account const & dependency) :
|
||||
unchecked_key{ dependency, 0 }
|
||||
{
|
||||
|
@ -365,6 +488,10 @@ nano::block_hash const & nano::unchecked_key::key () const
|
|||
return previous;
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
std::string_view nano::to_string (nano::block_status code)
|
||||
{
|
||||
return nano::enum_util::name (code);
|
||||
|
|
|
@ -163,7 +163,7 @@ class network_params;
|
|||
class ledger_constants
|
||||
{
|
||||
public:
|
||||
ledger_constants (nano::work_thresholds & work, nano::networks network_a);
|
||||
ledger_constants (nano::work_thresholds &, nano::networks);
|
||||
nano::work_thresholds & work;
|
||||
nano::keypair zero_key;
|
||||
nano::account nano_beta_account;
|
||||
|
@ -248,12 +248,13 @@ public:
|
|||
uint32_t default_frontiers_age_seconds;
|
||||
};
|
||||
|
||||
nano::work_thresholds const & work_thresholds_for_network (nano::networks);
|
||||
|
||||
/** Constants whose value depends on the active network */
|
||||
class network_params
|
||||
{
|
||||
public:
|
||||
/** Populate values based on \p network_a */
|
||||
network_params (nano::networks network_a);
|
||||
explicit network_params (nano::networks);
|
||||
|
||||
unsigned kdf_work;
|
||||
nano::work_thresholds work;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue