From b574e815a37e284009b0cf7432a73354792b1316 Mon Sep 17 00:00:00 2001 From: Fabian Schuh Date: Tue, 16 Feb 2016 10:01:13 +0100 Subject: [PATCH 1/6] Remove unnecessariy warning --- libraries/app/database_api.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index ddd63832..fb381f65 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -235,10 +235,6 @@ fc::variants database_api_impl::get_objects(const vector& ids)co this->subscribe_to_item( id ); } } - else - { - elog( "getObjects without subscribe callback??" ); - } fc::variants result; result.reserve(ids.size()); From 7caf77d6bf91aa8fb0b9247c5ec3c410ff8726e1 Mon Sep 17 00:00:00 2001 From: Michael Vandeberg Date: Thu, 17 Mar 2016 18:18:00 -0400 Subject: [PATCH 2/6] Bug Fix --- libraries/app/database_api.cpp | 39 ++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index 734d68b2..4b425b2e 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -1029,39 +1029,42 @@ market_ticker database_api_impl::get_ticker( const string& base, const string& q uint32_t day = 86400; auto now = fc::time_point_sec( fc::time_point::now() ); - auto orders = get_order_book( base, quote, 1 ); auto trades = get_trade_history( base, quote, now, fc::time_point_sec( now.sec_since_epoch() - day ), 100 ); - result.latest = trades[0].price; - - for ( market_trade t: trades ) + if ( trades.size() ) { - result.base_volume += t.value; - result.quote_volume += t.amount; - } - - while (trades.size() == 100) - { - trades = get_trade_history( base, quote, trades[99].date, fc::time_point_sec( now.sec_since_epoch() - day ), 100 ); + result.latest = trades[0].price; for ( market_trade t: trades ) { result.base_volume += t.value; result.quote_volume += t.amount; } + + while (trades.size() == 100) + { + trades = get_trade_history( base, quote, trades[99].date, fc::time_point_sec( now.sec_since_epoch() - day ), 100 ); + + for ( market_trade t: trades ) + { + result.base_volume += t.value; + result.quote_volume += t.amount; + } + } + + trades = get_trade_history( base, quote, trades.back().date, fc::time_point_sec(), 1 ); + result.percent_change = trades.size() > 0 ? ( ( result.latest / trades.back().price ) - 1 ) * 100 : 0; } - trades = get_trade_history( base, quote, trades.back().date, fc::time_point_sec(), 1 ); - result.percent_change = trades.size() > 0 ? ( ( result.latest / trades.back().price ) - 1 ) * 100 : 0; - - //if (assets[0]->id == base_id) - { + auto orders = get_order_book( base, quote, 1 ); + if( orders.asks.size() ) result.lowest_ask = orders.asks[0].price; + if( orders.bids.size() ) result.highest_bid = orders.bids[0].price; - } - return result; } FC_CAPTURE_AND_RETHROW( (base)(quote) ) + + return result; } market_volume database_api::get_24_volume( const string& base, const string& quote )const From 0f7f8acc03fb19c2861c8c1caf58f8de6a2a5b38 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Mon, 28 Mar 2016 15:54:32 -0400 Subject: [PATCH 3/6] debug_node: Create README.md --- programs/debug_node/README.md | 104 ++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 programs/debug_node/README.md diff --git a/programs/debug_node/README.md b/programs/debug_node/README.md new file mode 100644 index 00000000..53d56733 --- /dev/null +++ b/programs/debug_node/README.md @@ -0,0 +1,104 @@ + +Introduction +------------ + +The `debug_node` is a tool to allow developers to run many interesting sorts of "what-if" tests using state from a production blockchain. +Like "what happens if I produce enough blocks for the next hardfork time to arrive?" or "what would happen if this account (which I don't have a private key for) did this transaction?" + +Setup +----- + +Be sure you've built the right build targets: + + $ make get_dev_key debug_node cli_wallet witness_node + +Use the `get_dev_key` utility to generate a keypair: + + $ programs/genesis_util/get_dev_key "" nathan + [{"private_key":"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3","public_key":"BTS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV","address":"BTSFAbAx7yuxt725qSZvfwWqkdCwp9ZnUama"}] + +Obtain a copy of the blockchain in `block_db` directory: + $ programs/witness_node/witness_node --data-dir data/mydatadir + # ... wait for chain to sync + ^C + $ cp -Rp data/mydatadir/blockchain/database/block_num_to_block ./block_db + +Set up a new datadir with the following `config.ini` settings: + + # setup API endpoint + rpc-endpoint = 127.0.0.1:8090 + # setting this to empty effectively disables the p2p network + seed-nodes = [] + # set apiaccess.json so we can set up + api-access = "data/debug_datadir/api-access.json" + +Then set up `data/debug_datadir/api-access.json` to allow access to the debug API like this: + + { + "permission_map" : + [ + [ + "bytemaster", + { + "password_hash_b64" : "9e9GF7ooXVb9k4BoSfNIPTelXeGOZ5DrgOYMj94elaY=", + "password_salt_b64" : "INDdM6iCi/8=", + "allowed_apis" : ["database_api", "network_broadcast_api", "history_api", "network_node_api", "debug_api"] + } + ], + [ + "*", + { + "password_hash_b64" : "*", + "password_salt_b64" : "*", + "allowed_apis" : ["database_api", "network_broadcast_api", "history_api"] + } + ] + ] + } + +See [here](https://github.com/cryptonomex/graphene#accessing-restricted-apis) for more detail on the `api-access.json` format. + +Once that is set up, run `debug_node` against your newly prepared datadir: + + programs/debug_node/debug_node --data-dir data/debug_datadir + +Run `cli_wallet` to connect to the `debug_node` port, using the username and password to access the new `debug_api` (and also a different wallet file): + + programs/cli_wallet/cli_wallet -s 127.0.0.1:8090 -w debug.wallet -u bytemaster -p supersecret + +Example usage +------------- + +Load some blocks from the datadir: + + dbg_push_blocks block_db 20000 + +Note, when pushing a very large number of blocks sometimes `cli_wallet` hangs and you must Ctrl+C and restart it (leaving the `debug_node` running). + +Generate (fake) blocks with our own private key: + + dbg_generate_blocks 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 1000 + +Update `angel` account to be controlled by our own private key and generate a (fake) transfer: + + dbg_update_object {"_action":"update", "id":"1.2.1090", "active":{"weight_threshold":1,"key_auths":[["BTS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",1]]}} + import_key angel 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 + transfer angel init0 999999 BTS "" true + +How it works +------------ + +The commands work by creating diff(s) from the main chain that are applied to the local chain at specified block height(s). It lets you easily check out "what-if" +scenarios in a fantasy debug toy world forked from the real chain, e.g. "if we take all of the blocks until today, then generate a bunch more until a hardfork time +in the future arrives, does the chain stay up? Can I do transactions X, Y, and Z in the wallet after the hardfork?" Anyone connecting to this node sees the same +fantasy world, so you can e.g. make changes with the `cli_wallet` and see them exist in other `cli_wallet` instances (or GUI wallets or API scripts). + +Limitations +----------- + +The main limitations are: + +- No export format for the diffs, so you can't really [1] connect multiple `debug_node` to each other. +- Once faked block(s) or tx(s) have been produced on your chain, you can't really [1] stream blocks or tx's from the main network to your chain. + +[1] It should theoretically be possible, but it's non-trivial and totally untested. From aa844f56faac4dda0d542520a672c4704fb0e617 Mon Sep 17 00:00:00 2001 From: abitmore Date: Mon, 16 May 2016 22:03:08 +0200 Subject: [PATCH 4/6] Fix seed node stuck issue #654 --- libraries/net/node.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/net/node.cpp b/libraries/net/node.cpp index 6fb212c7..8df99538 100644 --- a/libraries/net/node.cpp +++ b/libraries/net/node.cpp @@ -4192,7 +4192,7 @@ namespace graphene { namespace net { namespace detail { // limit the rate at which we accept connections to mitigate DOS attacks fc::usleep( fc::milliseconds(10) ); - } FC_CAPTURE_AND_RETHROW() + } FC_CAPTURE_AND_LOG( () ) } } // accept_loop() From ead2db3272f75fd477a7ed64b56427c29c54ec02 Mon Sep 17 00:00:00 2001 From: abitmore Date: Sat, 30 Jul 2016 05:39:41 +0800 Subject: [PATCH 5/6] application.cpp: Validate block timestamps #645 --- libraries/app/application.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/app/application.cpp b/libraries/app/application.cpp index 64464488..ee74f808 100644 --- a/libraries/app/application.cpp +++ b/libraries/app/application.cpp @@ -463,6 +463,7 @@ namespace detail { { try { auto latency = graphene::time::now() - blk_msg.block.timestamp; + FC_ASSERT( (latency.count()/1000) > -5000, "Rejecting block with timestamp in the future" ); if (!sync_mode || blk_msg.block.block_num() % 10000 == 0) { const auto& witness = blk_msg.block.witness(*_chain_db); From 5ad763b0bf7ec327ced8465bcef7efed58a665e6 Mon Sep 17 00:00:00 2001 From: abitmore Date: Tue, 6 Sep 2016 20:57:01 +0200 Subject: [PATCH 6/6] Catch all exception when connecting to other peers --- libraries/net/node.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/net/node.cpp b/libraries/net/node.cpp index 8df99538..9e13e599 100644 --- a/libraries/net/node.cpp +++ b/libraries/net/node.cpp @@ -979,6 +979,7 @@ namespace graphene { namespace net { namespace detail { { elog("${e}", ("e", e)); } + FC_CAPTURE_AND_LOG( () ) }// while(!canceled) }