2017-05-25 09:13:59 +00:00
/*
* Copyright ( c ) 2015 Cryptonomex , Inc . , and contributors .
*
* The MIT License
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
*/
# include <algorithm>
# include <iomanip>
# include <iostream>
# include <iterator>
# include <fc/io/fstream.hpp>
# include <fc/io/json.hpp>
# include <fc/io/stdio.hpp>
# include <graphene/app/api.hpp>
# include <graphene/chain/protocol/address.hpp>
# include <graphene/chain/protocol/protocol.hpp>
# include <graphene/egenesis/egenesis.hpp>
# include <graphene/utilities/key_conversion.hpp>
# include <boost/filesystem.hpp>
# ifndef WIN32
# include <csignal>
# 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 < boost : : filesystem : : path > ( ) , " File to read genesis state from " )
( " out,o " , bpo : : value < boost : : filesystem : : path > ( ) , " File to output new genesis to " )
( " dev-account-prefix " , bpo : : value < std : : string > ( ) - > default_value ( " devacct " ) , " Prefix for dev accounts " )
( " dev-key-prefix " , bpo : : value < std : : string > ( ) - > default_value ( " devkey- " ) , " Prefix for dev key " )
( " dev-account-count " , bpo : : value < uint32_t > ( ) - > default_value ( 0 ) , " Prefix for dev accounts " )
( " dev-balance-count " , bpo : : value < uint32_t > ( ) - > default_value ( 0 ) , " Prefix for dev balances " )
( " dev-balance-amount " , bpo : : value < uint64_t > ( ) - > default_value ( uint64_t ( 1000 ) * uint64_t ( 1000 ) * uint64_t ( 100000 ) ) , " Amount in each dev balance " )
2017-06-06 08:17:04 +00:00
( " nop " , " just write the genesis file out after reading it in, do not alter any keys or add accounts or balances. used to pretty-print a genesis file " )
( " replace-all-keys " , bpo : : value < boost : : filesystem : : path > ( ) , " Replace all keys/addresses in the genesis files with dev keys based on dev-key-prefix and dump the new keys to this filename. " )
2017-05-25 09:13:59 +00:00
;
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 < boost : : filesystem : : path > ( ) ;
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 ) ;
Merge beatrice(GPOS changes) with master (#270)
* Created unit test for #325
* remove needless find()
* issue - 154: Don't allow to vote when vesting balance is 0
* Increase block creation timeout to 2500ms
* increase delay for node connection
* remove cache from cli get_account
* add cli tests framework
* Adjust newly merged code to new API
* Merged changes from Bitshares PR 1036
* GRPH-76 - Short-cut long sequences of missed blocks
Fixes database::update_global_dynamic_data to speed up counting missed blocks.
(This also fixes a minor issue with counting - the previous algorithm would skip missed blocks for the witness who signed the first block after the gap.)
* Improved resilience of block database against corruption
* Moved reindex logic into database / chain_database, make use of additional blocks in block_database
Fixed tests wrt db.open
* Enable undo + fork database for final blocks in a replay
Dont remove blocks from block db when popping blocks, handle edge case in replay wrt fork_db, adapted unit tests
* Log starting block number of replay
* Prevent unsigned integer underflow
* Fixed lock detection
* Dont leave _data_dir empty if db is locked
* Writing the object_database is now almost atomic
* Improved consistency check for block_log
* Cut back block_log index file if inconsistent
* Fixed undo_database
* Added test case for broken merge on empty undo_db
* exclude second undo_db.enable() call in some cases
* Add missing change
* change bitshares to core in message
* Merge pull request #938 from bitshares/fix-block-storing
Store correct block ID when switching forks
* Fixed integer overflow issue
* Fix for for history ID mismatch ( Bitshares PR #875 )
* Update the FC submodule with the changes for GRPH-4
* Merged Bitshares PR #1462 and compilation fixes
* Support/gitlab (#123)
* Updated gitlab process
* Fix undefined references in cli test
* Updated GitLab CI
* Fix #436 object_database created outside of witness data directory
* supplement more comments on database::_opened variable
* prevent segfault when destructing application obj
* Fixed test failures and compilation issue
* minor performance improvement
* Added comment
* Fix compilation in debug mode
* Fixed duplicate ops returned from get_account_history
* Fixed account_history_pagination test
* Removed unrelated comment
* Update to fixed version of fc
* Skip auth check when pushing self-generated blocks
* Extract public keys before pushing a transaction
* Dereference chain_database shared_ptr
* Updated transaction::signees to mutable
and
* updated get_signature_keys() to return a const reference,
* get_signature_keys() will update signees on first call,
* modified test cases and wallet.cpp accordingly,
* no longer construct a new signed_transaction object before pushing
* Added get_asset_count API
* No longer extract public keys before pushing a trx
and removed unused new added constructor and _get_signature_keys() function from signed_transaction struct
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* Remove leftover comment from merge
* fix for get_vesting_balance API call
* braces update
* Allow sufficient space for new undo_session
* Throw for deep nesting
* node.cpp: Check the attacker/buggy client before updating items ids
The peer is an attacker or buggy, which means the item_hashes_received is
not correct.
Move the check before updating items ids to save some time in this case.
* Create .gitlab-ci.yml
* Added cli_test to CI
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* use random port numbers in app_test (#154)
* Changes to compiple with GCC 7(Ubuntu 18.04)
* proposal fail_reason bug fixed (#157)
* Added Sonarcloud code_quality to CI (#159)
* Added sonarcloud analysis (#158)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Support/gitlab develop (#168)
* Added code_quality to CI
* Update .gitlab-ci.yml
* Point to PBSA/peerplays-fc commit f13d063 (#167)
* [GRPH-3] Additional cli tests (#155)
* Additional cli tests
* Compatible with latest fc changes
* Fixed Spacing issues
* [GRPH-106] Added voting tests (#136)
* Added more voting tests
* Added additional option
* Adjust p2p log level (#180)
* merge gpos to develop (#186)
* issue - 154: Don't allow to vote when vesting balance is 0
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* fix for get_vesting_balance API call
* braces update
* Create .gitlab-ci.yml
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* Changes to compiple with GCC 7(Ubuntu 18.04)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Revert "Revert "GPOS protocol""
This reverts commit 67616417b7f0b5d087b9862de0e48b2d8ccc1bca.
* add new line needed to gpos hardfork file
* comment temporally cli_vote_for_2_witnesses until refactor or delete
* fix gpos tests
* fix gitlab-ci conflict
* Fixed few error messages
* error message corrections at other places
* Updated FC repository to peerplays-network/peerplays-fc (#189)
Point to fc commit hash 6096e94 [latest-fc branch]
* Project name update in Doxyfile (#146)
* changes to allow user to vote in each sub-period
* Fixed GPOS vesting factor issue when proxy is set
* Added unit test for proxy voting
* Review changes
* changes to update last voting time
* resolve merge conflict
* unit test changes and also separated GPOS test suite
* delete unused variables
* removed witness check
* eliminate time gap between two consecutive vesting periods
* deleted GPOS specific test suite and updated gpos tests
* updated GPOS hf
* Fixed dividend distribution issue and added test case
* fix flag
* clean newlines gpos_tests
* adapt gpos_tests to changed flag
* Fix to roll in GPOS rules, carry votes from 6th sub-period
* check was already modified
* comments updated
* updated comments to the benefit of reviewer
* Added token symbol name in error messages
* Added token symbol name in error messages (#204)
* case 1: Fixed last voting time issue
* get_account bug fixed
* Fixed flag issue
* Fixed spelling issue
* remove non needed gcc5 changes to dockerfile
* GRPH134- High CPU Issue, websocket changes (#213)
* update submodule branch to refer to the latest commit on latest-fc branch (#214)
* Improve account maintenance performance (#130)
* Improve account maintenance performance
* merge fixes
* Fixed merge issue
* Fixed indentations and extra ';'
* Update CI for syncing gitmodules (#216)
* Added logging for the old update_expired_feeds bug
The old bug is https://github.com/cryptonomex/graphene/issues/615 .
Due to the bug, `update_median_feeds()` and `check_call_orders()`
will be called when a feed is not actually expired, normally this
should not affect consensus since calling them should not change
any data in the state.
However, the logging indicates that `check_call_orders()` did
change some data under certain circumstances, specifically, when
multiple limit order matching issue (#453) occurred at same block.
* https://github.com/bitshares/bitshares-core/issues/453
* Minor performance improvement for price::is_null()
* Use static refs in db_getter for immutable objects
* Minor performance improvement for db_maint
* Minor code updates for asset_evaluator.cpp
* changed an `assert()` to `FC_ASSERT()`
* replaced one `db.get(asset_id_type())` with `db.get_core_asset()`
* capture only required variables for lambda
* Improve update_expired_feeds performance #1093
* Change static refs to member pointers of db class
* Added getter for witness schedule object
* Added getter for core dynamic data object
* Use getters
* Removed unused variable
* Add comments for update_expired_feeds in db_block
* Minor refactory asset_create_evaluator::do_apply()
* Added FC_ASSERT for dynamic data id of core asset
* Added header inclusions in db_management.cpp
* fix global objects usage during replay
* Logging config parsing issue
* added new files
* compilation fix
* Simplified code in database::pay_workers()
* issue with withdrawl
* Added unit test for empty account history
* set extensions default values
* Update GPOS hardfork date and don't allow GPOS features before hardfork time
* refer to latest commit of latest-fc branch (#224)
* account name or id support in all database api
* asset id or name support in all asset APIs
* Fixed compilation issues
* Fixed alignment issues
* Externalized some API templates
* Externalize serialization of blocks, tx, ops
* Externalized db objects
* Externalized genesis serialization
* Externalized serialization in protocol library
* Undo superfluous change
* remove default value for extension parameter
* fix compilation issues
* GRPH-46-Quit_command_cliwallet
* removed multiple function definition
* Fixed chainparameter update proposal issue
* Move GPOS withdraw logic to have single transaction(also single fee) and update API
* Added log for authorization failure of proposal operations
* Votes consideration on GPOS activation
* bump fc version
* fix gpos tests
* Bump fc version
* Updated gpos/voting_tests
* Fixed withdraw vesting bug
* Added unit test
* Update hardfork date for TESTNET, sync fc module and update logs
* avoid wlog as it filling up space
* Beatrice hot fix(sync issue fix)
* gpos tests fix
* Set hardfork date to Jan5th on TESTNET
Co-authored-by: Peter Conrad <github.com@quisquis.de>
Co-authored-by: John M. Jones <jmjatlanta@gmail.com>
Co-authored-by: obucinac <obucinac@users.noreply.github.com>
Co-authored-by: Bobinson K B <bobinson@gmail.com>
Co-authored-by: Alfredo Garcia <oxarbitrage@gmail.com>
Co-authored-by: Miha Čančula <miha@noughmad.eu>
Co-authored-by: Abit <abitmore@users.noreply.github.com>
Co-authored-by: Roshan Syed <r.syed@pbsa.info>
Co-authored-by: Sandip Patel <sandip@knackroot.com>
Co-authored-by: RichardWeiYang <richard.weiyang@gmail.com>
Co-authored-by: gladcow <jahr@yandex.ru>
Co-authored-by: satyakoneru <satyakoneru.iiith@gmail.com>
2020-02-07 15:53:08 +00:00
genesis = fc : : json : : from_string ( genesis_json ) . as < genesis_state_type > ( 20 ) ;
2017-05-25 09:13:59 +00:00
}
else
{
std : : cerr < < " update_genesis: Using example genesis \n " ;
genesis = graphene : : app : : detail : : create_example_genesis ( ) ;
}
2017-06-06 08:17:04 +00:00
if ( ! options . count ( " nop " ) )
2017-05-25 09:13:59 +00:00
{
Merge beatrice(GPOS changes) with master (#270)
* Created unit test for #325
* remove needless find()
* issue - 154: Don't allow to vote when vesting balance is 0
* Increase block creation timeout to 2500ms
* increase delay for node connection
* remove cache from cli get_account
* add cli tests framework
* Adjust newly merged code to new API
* Merged changes from Bitshares PR 1036
* GRPH-76 - Short-cut long sequences of missed blocks
Fixes database::update_global_dynamic_data to speed up counting missed blocks.
(This also fixes a minor issue with counting - the previous algorithm would skip missed blocks for the witness who signed the first block after the gap.)
* Improved resilience of block database against corruption
* Moved reindex logic into database / chain_database, make use of additional blocks in block_database
Fixed tests wrt db.open
* Enable undo + fork database for final blocks in a replay
Dont remove blocks from block db when popping blocks, handle edge case in replay wrt fork_db, adapted unit tests
* Log starting block number of replay
* Prevent unsigned integer underflow
* Fixed lock detection
* Dont leave _data_dir empty if db is locked
* Writing the object_database is now almost atomic
* Improved consistency check for block_log
* Cut back block_log index file if inconsistent
* Fixed undo_database
* Added test case for broken merge on empty undo_db
* exclude second undo_db.enable() call in some cases
* Add missing change
* change bitshares to core in message
* Merge pull request #938 from bitshares/fix-block-storing
Store correct block ID when switching forks
* Fixed integer overflow issue
* Fix for for history ID mismatch ( Bitshares PR #875 )
* Update the FC submodule with the changes for GRPH-4
* Merged Bitshares PR #1462 and compilation fixes
* Support/gitlab (#123)
* Updated gitlab process
* Fix undefined references in cli test
* Updated GitLab CI
* Fix #436 object_database created outside of witness data directory
* supplement more comments on database::_opened variable
* prevent segfault when destructing application obj
* Fixed test failures and compilation issue
* minor performance improvement
* Added comment
* Fix compilation in debug mode
* Fixed duplicate ops returned from get_account_history
* Fixed account_history_pagination test
* Removed unrelated comment
* Update to fixed version of fc
* Skip auth check when pushing self-generated blocks
* Extract public keys before pushing a transaction
* Dereference chain_database shared_ptr
* Updated transaction::signees to mutable
and
* updated get_signature_keys() to return a const reference,
* get_signature_keys() will update signees on first call,
* modified test cases and wallet.cpp accordingly,
* no longer construct a new signed_transaction object before pushing
* Added get_asset_count API
* No longer extract public keys before pushing a trx
and removed unused new added constructor and _get_signature_keys() function from signed_transaction struct
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* Remove leftover comment from merge
* fix for get_vesting_balance API call
* braces update
* Allow sufficient space for new undo_session
* Throw for deep nesting
* node.cpp: Check the attacker/buggy client before updating items ids
The peer is an attacker or buggy, which means the item_hashes_received is
not correct.
Move the check before updating items ids to save some time in this case.
* Create .gitlab-ci.yml
* Added cli_test to CI
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* use random port numbers in app_test (#154)
* Changes to compiple with GCC 7(Ubuntu 18.04)
* proposal fail_reason bug fixed (#157)
* Added Sonarcloud code_quality to CI (#159)
* Added sonarcloud analysis (#158)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Support/gitlab develop (#168)
* Added code_quality to CI
* Update .gitlab-ci.yml
* Point to PBSA/peerplays-fc commit f13d063 (#167)
* [GRPH-3] Additional cli tests (#155)
* Additional cli tests
* Compatible with latest fc changes
* Fixed Spacing issues
* [GRPH-106] Added voting tests (#136)
* Added more voting tests
* Added additional option
* Adjust p2p log level (#180)
* merge gpos to develop (#186)
* issue - 154: Don't allow to vote when vesting balance is 0
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* fix for get_vesting_balance API call
* braces update
* Create .gitlab-ci.yml
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* Changes to compiple with GCC 7(Ubuntu 18.04)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Revert "Revert "GPOS protocol""
This reverts commit 67616417b7f0b5d087b9862de0e48b2d8ccc1bca.
* add new line needed to gpos hardfork file
* comment temporally cli_vote_for_2_witnesses until refactor or delete
* fix gpos tests
* fix gitlab-ci conflict
* Fixed few error messages
* error message corrections at other places
* Updated FC repository to peerplays-network/peerplays-fc (#189)
Point to fc commit hash 6096e94 [latest-fc branch]
* Project name update in Doxyfile (#146)
* changes to allow user to vote in each sub-period
* Fixed GPOS vesting factor issue when proxy is set
* Added unit test for proxy voting
* Review changes
* changes to update last voting time
* resolve merge conflict
* unit test changes and also separated GPOS test suite
* delete unused variables
* removed witness check
* eliminate time gap between two consecutive vesting periods
* deleted GPOS specific test suite and updated gpos tests
* updated GPOS hf
* Fixed dividend distribution issue and added test case
* fix flag
* clean newlines gpos_tests
* adapt gpos_tests to changed flag
* Fix to roll in GPOS rules, carry votes from 6th sub-period
* check was already modified
* comments updated
* updated comments to the benefit of reviewer
* Added token symbol name in error messages
* Added token symbol name in error messages (#204)
* case 1: Fixed last voting time issue
* get_account bug fixed
* Fixed flag issue
* Fixed spelling issue
* remove non needed gcc5 changes to dockerfile
* GRPH134- High CPU Issue, websocket changes (#213)
* update submodule branch to refer to the latest commit on latest-fc branch (#214)
* Improve account maintenance performance (#130)
* Improve account maintenance performance
* merge fixes
* Fixed merge issue
* Fixed indentations and extra ';'
* Update CI for syncing gitmodules (#216)
* Added logging for the old update_expired_feeds bug
The old bug is https://github.com/cryptonomex/graphene/issues/615 .
Due to the bug, `update_median_feeds()` and `check_call_orders()`
will be called when a feed is not actually expired, normally this
should not affect consensus since calling them should not change
any data in the state.
However, the logging indicates that `check_call_orders()` did
change some data under certain circumstances, specifically, when
multiple limit order matching issue (#453) occurred at same block.
* https://github.com/bitshares/bitshares-core/issues/453
* Minor performance improvement for price::is_null()
* Use static refs in db_getter for immutable objects
* Minor performance improvement for db_maint
* Minor code updates for asset_evaluator.cpp
* changed an `assert()` to `FC_ASSERT()`
* replaced one `db.get(asset_id_type())` with `db.get_core_asset()`
* capture only required variables for lambda
* Improve update_expired_feeds performance #1093
* Change static refs to member pointers of db class
* Added getter for witness schedule object
* Added getter for core dynamic data object
* Use getters
* Removed unused variable
* Add comments for update_expired_feeds in db_block
* Minor refactory asset_create_evaluator::do_apply()
* Added FC_ASSERT for dynamic data id of core asset
* Added header inclusions in db_management.cpp
* fix global objects usage during replay
* Logging config parsing issue
* added new files
* compilation fix
* Simplified code in database::pay_workers()
* issue with withdrawl
* Added unit test for empty account history
* set extensions default values
* Update GPOS hardfork date and don't allow GPOS features before hardfork time
* refer to latest commit of latest-fc branch (#224)
* account name or id support in all database api
* asset id or name support in all asset APIs
* Fixed compilation issues
* Fixed alignment issues
* Externalized some API templates
* Externalize serialization of blocks, tx, ops
* Externalized db objects
* Externalized genesis serialization
* Externalized serialization in protocol library
* Undo superfluous change
* remove default value for extension parameter
* fix compilation issues
* GRPH-46-Quit_command_cliwallet
* removed multiple function definition
* Fixed chainparameter update proposal issue
* Move GPOS withdraw logic to have single transaction(also single fee) and update API
* Added log for authorization failure of proposal operations
* Votes consideration on GPOS activation
* bump fc version
* fix gpos tests
* Bump fc version
* Updated gpos/voting_tests
* Fixed withdraw vesting bug
* Added unit test
* Update hardfork date for TESTNET, sync fc module and update logs
* avoid wlog as it filling up space
* Beatrice hot fix(sync issue fix)
* gpos tests fix
* Set hardfork date to Jan5th on TESTNET
Co-authored-by: Peter Conrad <github.com@quisquis.de>
Co-authored-by: John M. Jones <jmjatlanta@gmail.com>
Co-authored-by: obucinac <obucinac@users.noreply.github.com>
Co-authored-by: Bobinson K B <bobinson@gmail.com>
Co-authored-by: Alfredo Garcia <oxarbitrage@gmail.com>
Co-authored-by: Miha Čančula <miha@noughmad.eu>
Co-authored-by: Abit <abitmore@users.noreply.github.com>
Co-authored-by: Roshan Syed <r.syed@pbsa.info>
Co-authored-by: Sandip Patel <sandip@knackroot.com>
Co-authored-by: RichardWeiYang <richard.weiyang@gmail.com>
Co-authored-by: gladcow <jahr@yandex.ru>
Co-authored-by: satyakoneru <satyakoneru.iiith@gmail.com>
2020-02-07 15:53:08 +00:00
const std : : string dev_key_prefix = options [ " dev-key-prefix " ] . as < std : : string > ( ) ;
auto get_dev_key = [ & dev_key_prefix ] ( std : : string prefix , uint32_t i ) - > public_key_type
2017-06-06 08:17:04 +00:00
{
return fc : : ecc : : private_key : : regenerate ( fc : : sha256 : : hash ( dev_key_prefix + prefix + std : : to_string ( i ) ) ) . get_public_key ( ) ;
} ;
2017-05-25 09:13:59 +00:00
2017-06-06 08:17:04 +00:00
if ( options . count ( " replace-all-keys " ) )
{
unsigned dev_keys_used = 0 ;
std : : map < std : : string , fc : : ecc : : private_key > replacement_keys ;
auto get_replacement_key = [ & ] ( const std : : string & original_key ) - > fc : : ecc : : private_key {
auto iter = replacement_keys . find ( original_key ) ;
if ( iter ! = replacement_keys . end ( ) )
return iter - > second ;
fc : : ecc : : private_key new_private_key = fc : : ecc : : private_key : : regenerate ( fc : : sha256 : : hash ( dev_key_prefix + std : : to_string ( dev_keys_used + + ) ) ) ;
replacement_keys [ original_key ] = new_private_key ;
return new_private_key ;
} ;
2017-05-25 09:13:59 +00:00
2017-06-06 08:17:04 +00:00
for ( genesis_state_type : : initial_balance_type & initial_balance : genesis . initial_balances )
{
std : : string address_string = ( std : : string ) initial_balance . owner ;
initial_balance . owner = address ( get_replacement_key ( address_string ) . get_public_key ( ) ) ;
}
2017-05-25 09:13:59 +00:00
2017-06-06 08:17:04 +00:00
for ( genesis_state_type : : initial_vesting_balance_type & initial_balance : genesis . initial_vesting_balances )
{
std : : string address_string = ( std : : string ) initial_balance . owner ;
initial_balance . owner = address ( get_replacement_key ( address_string ) . get_public_key ( ) ) ;
}
2017-05-25 09:13:59 +00:00
2017-06-06 08:17:04 +00:00
for ( genesis_state_type : : initial_witness_type & initial_witness : genesis . initial_witness_candidates )
{
std : : string public_key_string = ( std : : string ) initial_witness . block_signing_key ;
initial_witness . block_signing_key = get_replacement_key ( public_key_string ) . get_public_key ( ) ;
}
2017-05-25 09:13:59 +00:00
2017-06-06 08:17:04 +00:00
for ( genesis_state_type : : initial_account_type & initial_account : genesis . initial_accounts )
{
std : : string public_key_string = ( std : : string ) initial_account . owner_key ;
initial_account . owner_key = get_replacement_key ( public_key_string ) . get_public_key ( ) ;
public_key_string = ( std : : string ) initial_account . active_key ;
initial_account . active_key = get_replacement_key ( public_key_string ) . get_public_key ( ) ;
}
for ( genesis_state_type : : initial_bts_account_type & initial_account : genesis . initial_bts_accounts )
{
for ( auto iter = initial_account . owner_authority . key_auths . begin ( ) ;
iter ! = initial_account . owner_authority . key_auths . end ( ) ; + + iter )
{
std : : string public_key_string = ( std : : string ) iter - > first ;
iter - > first = get_replacement_key ( public_key_string ) . get_public_key ( ) ;
}
for ( auto iter = initial_account . active_authority . key_auths . begin ( ) ;
iter ! = initial_account . active_authority . key_auths . end ( ) ; + + iter )
{
std : : string public_key_string = ( std : : string ) iter - > first ;
iter - > first = get_replacement_key ( public_key_string ) . get_public_key ( ) ;
}
for ( auto iter = initial_account . owner_authority . address_auths . begin ( ) ;
iter ! = initial_account . owner_authority . address_auths . end ( ) ; + + iter )
{
std : : string address_string = ( std : : string ) iter - > first ;
iter - > first = address ( get_replacement_key ( address_string ) . get_public_key ( ) ) ;
}
for ( auto iter = initial_account . active_authority . address_auths . begin ( ) ;
iter ! = initial_account . active_authority . address_auths . end ( ) ; + + iter )
{
std : : string address_string = ( std : : string ) iter - > first ;
iter - > first = address ( get_replacement_key ( address_string ) . get_public_key ( ) ) ;
}
}
fc : : path keys_csv_path = options [ " replace-all-keys " ] . as < boost : : filesystem : : path > ( ) ;
std : : ofstream keys_csv ( keys_csv_path . string ( ) ) ;
keys_csv < < " wif_private_key,public_key,address \n " ;
for ( const auto & value : replacement_keys )
keys_csv < < graphene : : utilities : : key_to_wif ( value . second ) < < " , " < < std : : string ( public_key_type ( value . second . get_public_key ( ) ) )
< < " , " < < std : : string ( address ( value . second . get_public_key ( ) ) ) < < " \n " ;
}
else
2017-05-25 09:13:59 +00:00
{
2017-06-06 08:17:04 +00:00
uint32_t dev_account_count = options [ " dev-account-count " ] . as < uint32_t > ( ) ;
std : : string dev_account_prefix = options [ " dev-account-prefix " ] . as < std : : string > ( ) ;
for ( uint32_t i = 0 ; i < dev_account_count ; i + + )
{
genesis_state_type : : initial_account_type acct (
dev_account_prefix + std : : to_string ( i ) ,
get_dev_key ( " owner- " , i ) ,
get_dev_key ( " active- " , i ) ,
false ) ;
genesis . initial_accounts . push_back ( acct ) ;
}
uint32_t dev_balance_count = options [ " dev-balance-count " ] . as < uint32_t > ( ) ;
uint64_t dev_balance_amount = options [ " dev-balance-amount " ] . as < uint64_t > ( ) ;
for ( uint32_t i = 0 ; i < dev_balance_count ; i + + )
{
genesis_state_type : : initial_balance_type bal ;
bal . owner = address ( get_dev_key ( " balance- " , i ) ) ;
bal . asset_symbol = " CORE " ;
bal . amount = dev_balance_amount ;
genesis . initial_balances . push_back ( bal ) ;
}
std : : map < std : : string , size_t > name2index ;
size_t num_accounts = genesis . initial_accounts . size ( ) ;
for ( size_t i = 0 ; i < num_accounts ; i + + )
name2index [ genesis . initial_accounts [ i ] . name ] = i ;
for ( uint32_t i = 0 ; i < genesis . initial_active_witnesses ; i + + )
{
genesis_state_type : : initial_witness_type & wit = genesis . initial_witness_candidates [ i ] ;
genesis_state_type : : initial_account_type & wit_acct = genesis . initial_accounts [ name2index [ wit . owner_name ] ] ;
if ( wit . owner_name . substr ( 0 , 4 ) ! = " init " )
{
std : : cerr < < " need " < < genesis . initial_active_witnesses < < " init accounts as first entries in initial_active_witnesses \n " ;
return 1 ;
}
wit . block_signing_key = get_dev_key ( " wit-block-signing- " , i ) ;
wit_acct . owner_key = get_dev_key ( " wit-owner- " , i ) ;
wit_acct . active_key = get_dev_key ( " wit-active- " , i ) ;
}
2017-05-25 09:13:59 +00:00
}
}
fc : : path output_filename = options [ " out " ] . as < boost : : filesystem : : path > ( ) ;
fc : : json : : save_to_file ( genesis , output_filename ) ;
}
catch ( const fc : : exception & e )
{
std : : cout < < e . to_detail_string ( ) < < " \n " ;
return 1 ;
}
return 0 ;
}