Merge branch 'pulls/199'
This commit is contained in:
commit
0502ee8b8c
5 changed files with 123 additions and 100 deletions
|
@ -1575,19 +1575,19 @@ TEST (rpc, frontier_count)
|
|||
|
||||
TEST (rpc, available_supply)
|
||||
{
|
||||
rai::system system (24000, 1);
|
||||
rai::system system (24000, 1);
|
||||
rai::node_init init1;
|
||||
auto & node1 (*system.nodes [0]);
|
||||
rai::rpc rpc (system.service, node1, rai::rpc_config (true));
|
||||
auto & node1 (*system.nodes [0]);
|
||||
rai::rpc rpc (system.service, node1, rai::rpc_config (true));
|
||||
rpc.start ();
|
||||
boost::property_tree::ptree request1;
|
||||
boost::property_tree::ptree request1;
|
||||
request1.put ("action", "available_supply");
|
||||
test_response response1 (request1, rpc, system.service);
|
||||
while (response1.status == 0)
|
||||
{
|
||||
system.poll ();
|
||||
}
|
||||
ASSERT_EQ (200, response1.status);
|
||||
ASSERT_EQ (200, response1.status);
|
||||
ASSERT_EQ ("0", response1.json.get <std::string> ("available"));
|
||||
system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv);
|
||||
rai::keypair key;
|
||||
|
@ -1597,8 +1597,16 @@ TEST (rpc, available_supply)
|
|||
{
|
||||
system.poll ();
|
||||
}
|
||||
ASSERT_EQ (200, response2.status);
|
||||
ASSERT_EQ (200, response2.status);
|
||||
ASSERT_EQ ("1", response2.json.get <std::string> ("available"));
|
||||
auto block2 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, 100)); // Sending to burning 0 account
|
||||
test_response response3 (request1, rpc, system.service);
|
||||
while (response3.status == 0)
|
||||
{
|
||||
system.poll ();
|
||||
}
|
||||
ASSERT_EQ (200, response3.status);
|
||||
ASSERT_EQ ("1", response3.json.get <std::string> ("available"));
|
||||
}
|
||||
|
||||
TEST (rpc, mrai_to_raw)
|
||||
|
|
|
@ -1176,40 +1176,40 @@ rai::process_return rai::block_processor::process_receive_one (MDB_txn * transac
|
|||
{
|
||||
rai::process_return result;
|
||||
result = node.ledger.process (transaction_a, *block_a);
|
||||
switch (result.code)
|
||||
{
|
||||
case rai::process_result::progress:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
std::string block;
|
||||
block_a->serialize_json (block);
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Processing block %1% %2%") % block_a->hash ().to_string () % block);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::gap_previous:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Gap previous for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
switch (result.code)
|
||||
{
|
||||
case rai::process_result::progress:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
std::string block;
|
||||
block_a->serialize_json (block);
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Processing block %1% %2%") % block_a->hash ().to_string () % block);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::gap_previous:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Gap previous for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
node.store.unchecked_put (transaction_a, block_a->previous (), block_a);
|
||||
node.gap_cache.add (transaction_a, block_a);
|
||||
break;
|
||||
}
|
||||
case rai::process_result::gap_source:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Gap source for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
}
|
||||
case rai::process_result::gap_source:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Gap source for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
node.store.unchecked_put (transaction_a, block_a->source (), block_a);
|
||||
node.gap_cache.add (transaction_a, block_a);
|
||||
break;
|
||||
}
|
||||
case rai::process_result::old:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case rai::process_result::old:
|
||||
{
|
||||
{
|
||||
auto root (block_a->root ());
|
||||
auto hash (block_a->hash ());
|
||||
|
@ -1227,61 +1227,65 @@ rai::process_return rai::block_processor::process_receive_one (MDB_txn * transac
|
|||
// Could have been rolled back, maybe
|
||||
}
|
||||
}
|
||||
if (node.config.logging.ledger_duplicate_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Old for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::bad_signature:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Bad signature for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::overspend:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Overspend for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::unreceivable:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Unreceivable for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::not_receive_from_send:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Not receive from send for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::fork:
|
||||
{
|
||||
if (node.config.logging.ledger_duplicate_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Old for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::bad_signature:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Bad signature for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::overspend:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Overspend for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::unreceivable:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Unreceivable for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::not_receive_from_send:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Not receive from send for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::fork:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Fork for: %1% root: %2%") % block_a->hash ().to_string () % block_a->root ().to_string ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case rai::process_result::account_mismatch:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Account mismatch for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
break;
|
||||
}
|
||||
case rai::process_result::account_mismatch:
|
||||
{
|
||||
if (node.config.logging.ledger_logging ())
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("Account mismatch for: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
}
|
||||
case rai::process_result::opened_burn_account:
|
||||
{
|
||||
BOOST_LOG (node.log) << boost::str (boost::format ("*** Rejecting open block for burn account ***: %1%") % block_a->hash ().to_string ());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
rai::node::node (rai::node_init & init_a, boost::asio::io_service & service_a, uint16_t peering_port_a, boost::filesystem::path const & application_path_a, rai::alarm & alarm_a, rai::logging const & logging_a, rai::work_pool & work_a) :
|
||||
|
|
|
@ -830,7 +830,8 @@ void rai::rpc_handler::available_supply ()
|
|||
auto genesis_balance (node.balance (rai::genesis_account)); // Cold storage genesis
|
||||
auto landing_balance (node.balance (rai::account ("059F68AAB29DE0D3A27443625C7EA9CDDB6517A8B76FE37727EF6A4D76832AD5"))); // Active unavailable account
|
||||
auto faucet_balance (node.balance (rai::account ("8E319CE6F3025E5B2DF66DA7AB1467FE48F1679C13DD43BFDB29FA2E9FC40D3B"))); // Faucet account
|
||||
auto available (rai::genesis_amount - genesis_balance - landing_balance - faucet_balance);
|
||||
auto burned_balance ((node.balance_pending (rai::account (0))).second); // Burning 0 account
|
||||
auto available (rai::genesis_amount - genesis_balance - landing_balance - faucet_balance - burned_balance);
|
||||
boost::property_tree::ptree response_l;
|
||||
response_l.put ("available", available.convert_to <std::string> ());
|
||||
response (response_l);
|
||||
|
|
|
@ -59,7 +59,8 @@ rai_beta_genesis (beta_genesis_data),
|
|||
rai_live_genesis (live_genesis_data),
|
||||
genesis_account (rai::rai_network == rai::rai_networks::rai_test_network ? rai_test_account : rai::rai_network == rai::rai_networks::rai_beta_network ? rai_beta_account : rai_live_account),
|
||||
genesis_block (rai::rai_network == rai::rai_networks::rai_test_network ? rai_test_genesis : rai::rai_network == rai::rai_networks::rai_beta_network ? rai_beta_genesis : rai_live_genesis),
|
||||
genesis_amount (std::numeric_limits <rai::uint128_t>::max ())
|
||||
genesis_amount (std::numeric_limits <rai::uint128_t>::max ()),
|
||||
burn_account (0)
|
||||
{
|
||||
CryptoPP::AutoSeededRandomPool random_pool;
|
||||
// Randomly generating these mean no two nodes will ever have the same sentinal values which protects against some insecure algorithms
|
||||
|
@ -79,6 +80,7 @@ std::string genesis_block;
|
|||
rai::uint128_t genesis_amount;
|
||||
rai::block_hash not_a_block;
|
||||
rai::account not_an_account;
|
||||
rai::account burn_account;
|
||||
};
|
||||
ledger_constants globals;
|
||||
}
|
||||
|
@ -102,6 +104,7 @@ std::string const & rai::genesis_block (globals.genesis_block);
|
|||
rai::uint128_t const & rai::genesis_amount (globals.genesis_amount);
|
||||
rai::block_hash const & rai::not_a_block (globals.not_a_block);
|
||||
rai::block_hash const & rai::not_an_account (globals.not_an_account);
|
||||
rai::account const & rai::burn_account (globals.burn_account);
|
||||
|
||||
boost::filesystem::path rai::working_path ()
|
||||
{
|
||||
|
@ -3151,7 +3154,8 @@ rai::process_return rai::ledger::process (MDB_txn * transaction_a, rai::block co
|
|||
rai::uint128_t rai::ledger::supply (MDB_txn * transaction_a)
|
||||
{
|
||||
auto unallocated (account_balance (transaction_a, rai::genesis_account));
|
||||
auto absolute_supply (rai::genesis_amount - unallocated);
|
||||
auto burned (account_pending (transaction_a, 0));
|
||||
auto absolute_supply (rai::genesis_amount - unallocated - burned);
|
||||
auto adjusted_supply (absolute_supply - inactive_supply);
|
||||
return adjusted_supply <= absolute_supply ? adjusted_supply : 0;
|
||||
}
|
||||
|
@ -3544,16 +3548,20 @@ void ledger_processor::open_block (rai::open_block const & block_a)
|
|||
result.code = ledger.store.pending_get (transaction, key, pending) ? rai::process_result::unreceivable : rai::process_result::progress; // Has this source already been received (Malformed)
|
||||
if (result.code == rai::process_result::progress)
|
||||
{
|
||||
rai::account_info source_info;
|
||||
auto error (ledger.store.account_get (transaction, pending.source, source_info));
|
||||
assert (!error);
|
||||
ledger.store.pending_del (transaction, key);
|
||||
ledger.store.block_put (transaction, hash, block_a);
|
||||
ledger.change_latest (transaction, block_a.hashables.account, hash, hash, pending.amount.number (), info.block_count + 1);
|
||||
ledger.store.representation_add (transaction, hash, pending.amount.number ());
|
||||
ledger.store.frontier_put (transaction, hash, block_a.hashables.account);
|
||||
result.account = block_a.hashables.account;
|
||||
result.amount = pending.amount;
|
||||
result.code = block_a.hashables.account == rai::burn_account ? rai::process_result::opened_burn_account : rai::process_result::progress; // Is it burning 0 account? (Malicious)
|
||||
if (result.code == rai::process_result::progress)
|
||||
{
|
||||
rai::account_info source_info;
|
||||
auto error (ledger.store.account_get (transaction, pending.source, source_info));
|
||||
assert (!error);
|
||||
ledger.store.pending_del (transaction, key);
|
||||
ledger.store.block_put (transaction, hash, block_a);
|
||||
ledger.change_latest (transaction, block_a.hashables.account, hash, hash, pending.amount.number (), info.block_count + 1);
|
||||
ledger.store.representation_add (transaction, hash, pending.amount.number ());
|
||||
ledger.store.frontier_put (transaction, hash, block_a.hashables.account);
|
||||
result.account = block_a.hashables.account;
|
||||
result.amount = pending.amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -517,7 +517,8 @@ enum class process_result
|
|||
gap_previous, // Block marked as previous is unknown
|
||||
gap_source, // Block marked as source is unknown
|
||||
not_receive_from_send, // Receive does not have a send source
|
||||
account_mismatch // Account number in open block doesn't match send destination
|
||||
account_mismatch, // Account number in open block doesn't match send destination
|
||||
opened_burn_account // The impossible happened, someone found the private key associated with the public key '0'.
|
||||
};
|
||||
class process_return
|
||||
{
|
||||
|
@ -585,6 +586,7 @@ extern std::string const & rai_beta_genesis;
|
|||
extern std::string const & rai_live_genesis;
|
||||
extern std::string const & genesis_block;
|
||||
extern rai::account const & genesis_account;
|
||||
extern rai::account const & burn_account;
|
||||
extern rai::uint128_t const & genesis_amount;
|
||||
// A block hash that compares inequal to any real block hash
|
||||
extern rai::block_hash const & not_a_block;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue