diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index ab267cb1..271c1664 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory( cli_wallet ) +add_subdirectory( genesis_util ) add_subdirectory( witness_node ) add_subdirectory( delayed_node ) add_subdirectory( js_operation_serializer ) diff --git a/programs/genesis_util/CMakeLists.txt b/programs/genesis_util/CMakeLists.txt new file mode 100644 index 00000000..1125a108 --- /dev/null +++ b/programs/genesis_util/CMakeLists.txt @@ -0,0 +1,29 @@ + +add_executable( genesis_update genesis_update.cpp ) +if( UNIX AND NOT APPLE ) + set(rt_library rt ) +endif() + +target_link_libraries( genesis_update + PRIVATE graphene_app graphene_chain graphene_egenesis_none fc ${CMAKE_DL_LIBS} ${PLATFORM_SPECIFIC_LIBS} ) + +install( TARGETS + genesis_update + + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib +) + +add_executable( get_dev_key get_dev_key.cpp ) + +target_link_libraries( get_dev_key + PRIVATE graphene_app graphene_chain graphene_egenesis_none graphene_utilities fc ${CMAKE_DL_LIBS} ${PLATFORM_SPECIFIC_LIBS} ) + +install( TARGETS + get_dev_key + + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib +) diff --git a/programs/genesis_util/genesis_update.cpp b/programs/genesis_util/genesis_update.cpp new file mode 100644 index 00000000..4923e72e --- /dev/null +++ b/programs/genesis_util/genesis_update.cpp @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2015, Cryptonomex, Inc. + * All rights reserved. + * + * This source code is provided for evaluation in private test networks only, until September 8, 2015. After this date, this license expires and + * the code may not be used, modified or distributed for any purpose. Redistribution and use in source and binary forms, with or without modification, + * are permitted until September 8, 2015, provided that the following conditions are met: + * + * 1. The code and/or derivative works are used only for private test networks consisting of no more than 10 P2P nodes. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#ifndef WIN32 +#include +#endif + +using namespace graphene::app; +using namespace graphene::chain; +using namespace graphene::utilities; +using namespace std; +namespace bpo = boost::program_options; + +// hack: import create_example_genesis() even though it's a way, way +// specific internal detail +namespace graphene { namespace app { namespace detail { +genesis_state_type create_example_genesis(); +} } } // graphene::app::detail + +int main( int argc, char** argv ) +{ + try + { + bpo::options_description cli_options("Graphene empty blocks"); + cli_options.add_options() + ("help,h", "Print this help message and exit.") + ("genesis-json,g", bpo::value(), "File to read genesis state from") + ("out,o", bpo::value(), "File to output new genesis to") + ("dev-account-prefix", bpo::value()->default_value("devacct"), "Prefix for dev accounts") + ("dev-key-prefix", bpo::value()->default_value("devkey-"), "Prefix for dev key") + ("dev-account-count", bpo::value()->default_value(0), "Prefix for dev accounts") + ("dev-balance-count", bpo::value()->default_value(0), "Prefix for dev balances") + ("dev-balance-amount", bpo::value()->default_value(uint64_t(1000)*uint64_t(1000)*uint64_t(100000)), "Amount in each dev balance") + ; + + bpo::variables_map options; + try + { + boost::program_options::store( boost::program_options::parse_command_line(argc, argv, cli_options), options ); + } + catch (const boost::program_options::error& e) + { + std::cerr << "empty_blocks: error parsing command line: " << e.what() << "\n"; + return 1; + } + + if( options.count("help") ) + { + std::cout << cli_options << "\n"; + return 1; + } + + if( !options.count( "genesis-json" ) ) + { + std::cerr << "--genesis-json option is required\n"; + return 1; + } + + if( !options.count( "out" ) ) + { + std::cerr << "--out option is required\n"; + return 1; + } + + genesis_state_type genesis; + if( options.count("genesis-json") ) + { + fc::path genesis_json_filename = options["genesis-json"].as(); + std::cerr << "update_genesis: Reading genesis from file " << genesis_json_filename.preferred_string() << "\n"; + std::string genesis_json; + read_file_contents( genesis_json_filename, genesis_json ); + genesis = fc::json::from_string( genesis_json ).as< genesis_state_type >(); + } + else + { + std::cerr << "update_genesis: Using example genesis\n"; + genesis = graphene::app::detail::create_example_genesis(); + } + + std::string dev_key_prefix = options["dev-key-prefix"].as(); + + auto get_dev_key = [&]( std::string prefix, uint32_t i ) -> public_key_type + { + return fc::ecc::private_key::regenerate( fc::sha256::hash( dev_key_prefix + prefix + std::to_string(i) ) ).get_public_key(); + }; + + uint32_t dev_account_count = options["dev-account-count"].as(); + std::string dev_account_prefix = options["dev-account-prefix"].as(); + for(uint32_t i=0;i(); + uint64_t dev_balance_amount = options["dev-balance-amount"].as(); + for(uint32_t i=0;i name2index; + size_t num_accounts = genesis.initial_accounts.size(); + for( size_t i=0; i(); + fc::json::save_to_file( genesis, output_filename ); + } + catch ( const fc::exception& e ) + { + std::cout << e.to_detail_string() << "\n"; + return 1; + } + return 0; +} diff --git a/programs/genesis_util/get_dev_key.cpp b/programs/genesis_util/get_dev_key.cpp new file mode 100644 index 00000000..2a5b110e --- /dev/null +++ b/programs/genesis_util/get_dev_key.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2015, Cryptonomex, Inc. + * All rights reserved. + * + * This source code is provided for evaluation in private test networks only, until September 8, 2015. After this date, this license expires and + * the code may not be used, modified or distributed for any purpose. Redistribution and use in source and binary forms, with or without modification, + * are permitted until September 8, 2015, provided that the following conditions are met: + * + * 1. The code and/or derivative works are used only for private test networks consisting of no more than 10 P2P nodes. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include +#include + +#include +#include +#include + +#ifndef WIN32 +#include +#endif + +using namespace std; + +int main( int argc, char** argv ) +{ + try + { + std::string dev_key_prefix; + bool need_help; + if( argc < 2 ) + need_help = true; + else + { + dev_key_prefix = argv[1]; + if( (dev_key_prefix == "-h") + || (dev_key_prefix == "--help") + ) + need_help = true; + } + + if( need_help ) + { + std::cerr << "get-dev-key ...\n" + "\n" + "example:\n" + "\n" + "get-dev-key wxyz- owner-5 active-7 balance-9 wit-block-signing-3 wit-owner-5 wit-active-33\n" + "get-dev-key wxyz- wit-block-signing-0:101\n" + "\n"; + return 1; + } + + bool comma = false; + + auto show_key = [&]( const fc::ecc::private_key& priv_key ) + { + fc::mutable_variant_object mvo; + graphene::chain::public_key_type pub_key = priv_key.get_public_key(); + mvo( "private_key", graphene::utilities::key_to_wif( priv_key ) ) + ( "public_key", std::string( pub_key ) ) + ( "address", graphene::chain::address( pub_key ) ) + ; + if( comma ) + std::cout << ",\n"; + std::cout << fc::json::to_string( mvo ); + comma = true; + }; + + std::cout << "["; + + for( int i=2; i keys; + if( lep >= 0 ) + { + for( int k=lep; k