From 59758802d371d3b040ceb3ff413a284de3a2598e Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Mon, 12 Oct 2015 16:22:28 -0400 Subject: [PATCH 1/9] Implement new genesis_util's --- programs/genesis_util/apply_patch.py | 49 ++++++++++++++ programs/genesis_util/canonical_format.py | 14 ++++ programs/genesis_util/generate_init_patch.py | 68 ++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100755 programs/genesis_util/apply_patch.py create mode 100755 programs/genesis_util/canonical_format.py create mode 100755 programs/genesis_util/generate_init_patch.py diff --git a/programs/genesis_util/apply_patch.py b/programs/genesis_util/apply_patch.py new file mode 100755 index 00000000..a251199c --- /dev/null +++ b/programs/genesis_util/apply_patch.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +import argparse +import json +import sys + +def dump_json(obj, out, pretty): + if pretty: + json.dump(obj, out, indent=2, sort_keys=True) + else: + json.dump(obj, out, separators=(",", ":"), sort_keys=True) + return + +def main(): + parser = argparse.ArgumentParser(description="Remove entities from snapshot") + parser.add_argument("-o", "--output", metavar="OUT", default="-", help="output filename (default: stdout)") + parser.add_argument("-i", "--input", metavar="IN", default="-", help="input filename (default: stdin)") + parser.add_argument("-d", "--delta", metavar="DELTA", nargs="+", help="list of delta file(s) to apply") + parser.add_argument("-p", "--pretty", action="store_true", default=False, help="pretty print output") + opts = parser.parse_args() + + if opts.input == "-": + genesis = json.load(sys.stdin) + else: + with open(opts.input, "r") as f: + genesis = json.load(f) + + if opts.delta is None: + opts.delta = [] + for filename in opts.delta: + with open(filename, "r") as f: + patch = json.load(f) + for k, v in patch.get("append", {}).items(): + genesis[k].extend(v) + print("appended {n} items to {k}".format(n=len(v), k=k)) + for k, v in patch.get("replace", {}).items(): + genesis[k] = v + print("replaced item {k}".format(k=k)) + + if opts.output == "-": + dump_json( genesis, sys.stdout, opts.pretty ) + sys.stdout.flush() + else: + with open(opts.output, "w") as f: + dump_json( genesis, f, opts.pretty ) + return + +if __name__ == "__main__": + main() diff --git a/programs/genesis_util/canonical_format.py b/programs/genesis_util/canonical_format.py new file mode 100755 index 00000000..82850136 --- /dev/null +++ b/programs/genesis_util/canonical_format.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +import argparse +import json +import sys + +if len(sys.argv) < 3: + print("syntax: "+sys.argv[0]+" INFILE OUTFILE") + sys.exit(0) + +with open(sys.argv[1], "r") as infile: + genesis = json.load(infile) +with open(sys.argv[2], "w") as outfile: + json.dump(genesis, outfile, separators=(',', ':'), sort_keys=True) diff --git a/programs/genesis_util/generate_init_patch.py b/programs/genesis_util/generate_init_patch.py new file mode 100755 index 00000000..c6acba77 --- /dev/null +++ b/programs/genesis_util/generate_init_patch.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 + +import argparse +import json +import subprocess +import sys + +def dump_json(obj, out, pretty): + if pretty: + json.dump(obj, out, indent=2, sort_keys=True) + else: + json.dump(obj, out, separators=(",", ":"), sort_keys=True) + return + +def main(): + parser = argparse.ArgumentParser(description="Remove entities from snapshot") + parser.add_argument("-o", "--output", metavar="OUT", default="-", help="output filename (default: stdout)") + parser.add_argument("-n", "--num", metavar="N", default=11, type=int, help="number of init witnesses") + parser.add_argument("-p", "--pretty", action="store_true", default=False, help="pretty print output") + parser.add_argument("-s", "--secret", metavar="SECRET", default=None, help="private key generation secret") + opts = parser.parse_args() + + if opts.secret is None: + sys.stderr.write("missing required parameter --secret\n") + sys.stderr.flush() + sys.exit(1) + + wit_accounts = [] + wit_wits = [] + + for i in range(opts.num): + owner_str = subprocess.check_output(["programs/genesis_util/get_dev_key", opts.secret, "wit-owner-"+str(i)]).decode("utf-8") + active_str = subprocess.check_output(["programs/genesis_util/get_dev_key", opts.secret, "wit-active-"+str(i)]).decode("utf-8") + prod_str = subprocess.check_output(["programs/genesis_util/get_dev_key", opts.secret, "wit-block-signing-"+str(i)]).decode("utf-8") + owner = json.loads(owner_str) + active = json.loads(active_str) + prod = json.loads(prod_str) + wit_accounts.append({ + "name" : "init"+str(i), + "owner_key" : owner[0]["public_key"], + "active_key" : active[0]["public_key"], + "is_lifetime_member" : True, + }) + wit_wits.append({ + "owner_name" : "init"+str(i), + "block_signing_key" : prod[0]["public_key"], + }) + + result = { + "append" : { + "initial_accounts" : wit_accounts }, + "replace" : { + "initial_workers" : [], + "initial_witnesses" : wit_wits, + } + } + + if opts.output == "-": + dump_json( result, sys.stdout, opts.pretty ) + sys.stdout.flush() + else: + with open(opts.output, "w") as f: + dump_json( result, f, opts.pretty ) + + return + +if __name__ == "__main__": + main() From 9d19358a0cfa344e2f5e5c126f4959e707426c03 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Mon, 12 Oct 2015 16:59:20 -0400 Subject: [PATCH 2/9] db_init.cpp: Make genesis BitAssets require 7 price feeds --- libraries/chain/db_init.cpp | 1 + libraries/chain/include/graphene/chain/config.hpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/libraries/chain/db_init.cpp b/libraries/chain/db_init.cpp index e6bfa88c..04d454df 100644 --- a/libraries/chain/db_init.cpp +++ b/libraries/chain/db_init.cpp @@ -478,6 +478,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) bitasset_data_id = create([&](asset_bitasset_data_object& b) { b.options.short_backing_asset = core_asset.id; + b.options.minimum_feeds = GRAPHENE_DEFAULT_MINIMUM_FEEDS; }).id; } diff --git a/libraries/chain/include/graphene/chain/config.hpp b/libraries/chain/include/graphene/chain/config.hpp index 755a1c49..f3c74323 100644 --- a/libraries/chain/include/graphene/chain/config.hpp +++ b/libraries/chain/include/graphene/chain/config.hpp @@ -124,6 +124,8 @@ #define GRAPHENE_DEFAULT_WITNESS_PAY_VESTING_SECONDS (60*60*24) #define GRAPHENE_DEFAULT_WORKER_BUDGET_PER_DAY (GRAPHENE_BLOCKCHAIN_PRECISION * int64_t(500) * 1000 ) +#define GRAPHENE_DEFAULT_MINIMUM_FEEDS 7 + #define GRAPHENE_MAX_INTEREST_APR uint16_t( 10000 ) #define GRAPHENE_RECENTLY_MISSED_COUNT_INCREMENT 4 From 089249109651051bee28038c87c0515be307753a Mon Sep 17 00:00:00 2001 From: Nicolas Wack Date: Mon, 5 Oct 2015 22:30:40 +0200 Subject: [PATCH 3/9] Added network get_info api call --- libraries/app/api.cpp | 7 +++++++ libraries/app/include/graphene/app/api.hpp | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/libraries/app/api.cpp b/libraries/app/api.cpp index 4471548a..55cf4c5c 100644 --- a/libraries/app/api.cpp +++ b/libraries/app/api.cpp @@ -132,6 +132,13 @@ namespace graphene { namespace app { { } + fc::variant network_node_api::get_info() const + { + fc::mutable_variant_object result = _app.p2p_node()->network_get_info(); + result["connection_count"] = _app.p2p_node()->get_connection_count(); + return result; + } + void network_node_api::add_node(const fc::ip::endpoint& ep) { _app.p2p_node()->add_node(ep); diff --git a/libraries/app/include/graphene/app/api.hpp b/libraries/app/include/graphene/app/api.hpp index c83ad289..23bed82f 100644 --- a/libraries/app/include/graphene/app/api.hpp +++ b/libraries/app/include/graphene/app/api.hpp @@ -126,6 +126,11 @@ namespace graphene { namespace app { public: network_node_api(application& a); + /** + * @brief Return general network information, such as p2p port + */ + fc::variant get_info() const; + /** * @brief add_node Connect to a new peer * @param ep The IP/Port of the peer to connect to @@ -198,6 +203,7 @@ FC_API(graphene::app::network_broadcast_api, (broadcast_block) ) FC_API(graphene::app::network_node_api, + (get_info) (add_node) (get_connected_peers) ) From f57cd74f1b35646a688e0b591300c1af88e1c8dc Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Mon, 12 Oct 2015 18:04:43 -0400 Subject: [PATCH 4/9] generate_init_patch.py: Fix small problems --- programs/genesis_util/generate_init_patch.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/programs/genesis_util/generate_init_patch.py b/programs/genesis_util/generate_init_patch.py index c6acba77..576007fb 100755 --- a/programs/genesis_util/generate_init_patch.py +++ b/programs/genesis_util/generate_init_patch.py @@ -27,6 +27,7 @@ def main(): wit_accounts = [] wit_wits = [] + committee = [] for i in range(opts.num): owner_str = subprocess.check_output(["programs/genesis_util/get_dev_key", opts.secret, "wit-owner-"+str(i)]).decode("utf-8") @@ -45,13 +46,15 @@ def main(): "owner_name" : "init"+str(i), "block_signing_key" : prod[0]["public_key"], }) + committee.append("init"+str(i)) result = { "append" : { "initial_accounts" : wit_accounts }, "replace" : { - "initial_workers" : [], - "initial_witnesses" : wit_wits, + "initial_worker_candidates" : [], + "initial_witness_candidates" : wit_wits, + "initial_committee_candidates" : committee, } } From 5c0e5746e8237d762da45b9979f4f4f158363ea0 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Mon, 12 Oct 2015 19:30:47 -0400 Subject: [PATCH 5/9] fix committee member format --- programs/genesis_util/generate_init_patch.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/programs/genesis_util/generate_init_patch.py b/programs/genesis_util/generate_init_patch.py index 576007fb..954ec2e9 100755 --- a/programs/genesis_util/generate_init_patch.py +++ b/programs/genesis_util/generate_init_patch.py @@ -46,8 +46,7 @@ def main(): "owner_name" : "init"+str(i), "block_signing_key" : prod[0]["public_key"], }) - committee.append("init"+str(i)) - + committee.append({"owner_name" : "init"+str(i)}) result = { "append" : { "initial_accounts" : wit_accounts }, From 73150e3c7145faa5699ead0928c12976a5b1b3b0 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Mon, 12 Oct 2015 19:43:03 -0400 Subject: [PATCH 6/9] initialize initial_active_witnesses --- programs/genesis_util/generate_init_patch.py | 1 + 1 file changed, 1 insertion(+) diff --git a/programs/genesis_util/generate_init_patch.py b/programs/genesis_util/generate_init_patch.py index 954ec2e9..72966431 100755 --- a/programs/genesis_util/generate_init_patch.py +++ b/programs/genesis_util/generate_init_patch.py @@ -51,6 +51,7 @@ def main(): "append" : { "initial_accounts" : wit_accounts }, "replace" : { + "initial_active_witnesses" : opts.num, "initial_worker_candidates" : [], "initial_witness_candidates" : wit_wits, "initial_committee_candidates" : committee, From 3706c88a0b3691a4c232e4b9b4d31f94f087d4f4 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Tue, 13 Oct 2015 10:30:51 -0400 Subject: [PATCH 7/9] Initialize hash when using egenesis --- libraries/app/application.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/app/application.cpp b/libraries/app/application.cpp index 6e9e29c3..f9947d76 100644 --- a/libraries/app/application.cpp +++ b/libraries/app/application.cpp @@ -274,6 +274,7 @@ namespace detail { graphene::egenesis::compute_egenesis_json( egenesis_json ); FC_ASSERT( egenesis_json != "" ); FC_ASSERT( graphene::egenesis::get_egenesis_json_hash() == fc::sha256::hash( egenesis_json ) ); + genesis.initial_chain_id = fc::sha256::hash( egenesis_json ); return fc::json::from_string( egenesis_json ).as(); } }; From 29cc90ba99b3e317ced330a90f502e33c4f59f1f Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Tue, 13 Oct 2015 10:34:48 -0400 Subject: [PATCH 8/9] Fix build --- libraries/app/application.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/app/application.cpp b/libraries/app/application.cpp index f9947d76..5d66bd73 100644 --- a/libraries/app/application.cpp +++ b/libraries/app/application.cpp @@ -274,8 +274,9 @@ namespace detail { graphene::egenesis::compute_egenesis_json( egenesis_json ); FC_ASSERT( egenesis_json != "" ); FC_ASSERT( graphene::egenesis::get_egenesis_json_hash() == fc::sha256::hash( egenesis_json ) ); + auto genesis = fc::json::from_string( egenesis_json ).as(); genesis.initial_chain_id = fc::sha256::hash( egenesis_json ); - return fc::json::from_string( egenesis_json ).as(); + return genesis; } }; From 6dced3c54ad206055315bdbcf98e834e1db9cc9d Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Tue, 13 Oct 2015 09:37:17 -0400 Subject: [PATCH 9/9] genesis_util: Implement many new genesis utilities --- programs/genesis_util/apply_patch.py | 6 +- .../genesis_util/change_bitasset_owners.py | 40 +++++++++ programs/genesis_util/generate_init_patch.py | 2 +- programs/genesis_util/prefix_accounts.py | 87 +++++++++++++++++++ programs/genesis_util/sort_objects.py | 44 ++++++++++ .../genesis_util/unprefix_asset_owners.py | 43 +++++++++ programs/genesis_util/unprefix_names.py | 58 +++++++++++++ programs/genesis_util/upgrade_members.py | 2 +- 8 files changed, 277 insertions(+), 5 deletions(-) create mode 100755 programs/genesis_util/change_bitasset_owners.py create mode 100755 programs/genesis_util/prefix_accounts.py create mode 100755 programs/genesis_util/sort_objects.py create mode 100755 programs/genesis_util/unprefix_asset_owners.py create mode 100755 programs/genesis_util/unprefix_names.py diff --git a/programs/genesis_util/apply_patch.py b/programs/genesis_util/apply_patch.py index a251199c..259ee6c9 100755 --- a/programs/genesis_util/apply_patch.py +++ b/programs/genesis_util/apply_patch.py @@ -12,7 +12,7 @@ def dump_json(obj, out, pretty): return def main(): - parser = argparse.ArgumentParser(description="Remove entities from snapshot") + parser = argparse.ArgumentParser(description="Apply a patch file to a JSON object") parser.add_argument("-o", "--output", metavar="OUT", default="-", help="output filename (default: stdout)") parser.add_argument("-i", "--input", metavar="IN", default="-", help="input filename (default: stdin)") parser.add_argument("-d", "--delta", metavar="DELTA", nargs="+", help="list of delta file(s) to apply") @@ -32,10 +32,10 @@ def main(): patch = json.load(f) for k, v in patch.get("append", {}).items(): genesis[k].extend(v) - print("appended {n} items to {k}".format(n=len(v), k=k)) + sys.stderr.write("appended {n} items to {k}\n".format(n=len(v), k=k)) for k, v in patch.get("replace", {}).items(): genesis[k] = v - print("replaced item {k}".format(k=k)) + sys.stderr.write("replaced item {k}\n".format(k=k)) if opts.output == "-": dump_json( genesis, sys.stdout, opts.pretty ) diff --git a/programs/genesis_util/change_bitasset_owners.py b/programs/genesis_util/change_bitasset_owners.py new file mode 100755 index 00000000..94aa0057 --- /dev/null +++ b/programs/genesis_util/change_bitasset_owners.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 + +import argparse +import json +import sys + +def dump_json(obj, out, pretty): + if pretty: + json.dump(obj, out, indent=2, sort_keys=True) + else: + json.dump(obj, out, separators=(",", ":"), sort_keys=True) + return + +def main(): + parser = argparse.ArgumentParser(description="Change initial_assets owned by the witness-account to the committee-account") + parser.add_argument("-o", "--output", metavar="OUT", default="-", help="output filename (default: stdout)") + parser.add_argument("-i", "--input", metavar="IN", default="-", help="input filename (default: stdin)") + parser.add_argument("-p", "--pretty", action="store_true", default=False, help="pretty print output") + opts = parser.parse_args() + + if opts.input == "-": + genesis = json.load(sys.stdin) + else: + with open(opts.input, "r") as f: + genesis = json.load(f) + + for asset in genesis["initial_assets"]: + if asset["issuer_name"] == "witness-account": + asset["issuer_name"] = "committee-account" + + if opts.output == "-": + dump_json( genesis, sys.stdout, opts.pretty ) + sys.stdout.flush() + else: + with open(opts.output, "w") as f: + dump_json( genesis, f, opts.pretty ) + return + +if __name__ == "__main__": + main() diff --git a/programs/genesis_util/generate_init_patch.py b/programs/genesis_util/generate_init_patch.py index 72966431..25b68579 100755 --- a/programs/genesis_util/generate_init_patch.py +++ b/programs/genesis_util/generate_init_patch.py @@ -13,7 +13,7 @@ def dump_json(obj, out, pretty): return def main(): - parser = argparse.ArgumentParser(description="Remove entities from snapshot") + parser = argparse.ArgumentParser(description="Generate a patch file that adds init accounts") parser.add_argument("-o", "--output", metavar="OUT", default="-", help="output filename (default: stdout)") parser.add_argument("-n", "--num", metavar="N", default=11, type=int, help="number of init witnesses") parser.add_argument("-p", "--pretty", action="store_true", default=False, help="pretty print output") diff --git a/programs/genesis_util/prefix_accounts.py b/programs/genesis_util/prefix_accounts.py new file mode 100755 index 00000000..ee5820a7 --- /dev/null +++ b/programs/genesis_util/prefix_accounts.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 + +import argparse +import json +import sys + +def dump_json(obj, out, pretty): + if pretty: + json.dump(obj, out, indent=2, sort_keys=True) + else: + json.dump(obj, out, separators=(",", ":"), sort_keys=True) + return + +def main(): + parser = argparse.ArgumentParser(description="Add a prefix to selected account names") + parser.add_argument("-o", "--output", metavar="OUT", default="-", help="output filename (default: stdout)") + parser.add_argument("-i", "--input", metavar="IN", default="-", help="input filename (default: stdin)") + parser.add_argument("-b", "--begin", metavar="PREFIX", default="", help="prefix to add") + parser.add_argument("-p", "--pretty", action="store_true", default=False, help="pretty print output") + opts = parser.parse_args() + + if opts.input == "-": + genesis = json.load(sys.stdin) + else: + with open(opts.input, "r") as f: + genesis = json.load(f) + + taken_names = set() + unsettled_names = [] + name_map = {} + prefix = opts.begin + + for account in genesis["initial_accounts"]: + is_prefixed = account["is_prefixed"] + name = account["name"] + if is_prefixed: + unsettled_names.append(name) + name_map[name] = name + else: + taken_names.add(name) + + pass_num = 0 + while len(unsettled_names) > 0: + num_resolved = 0 + pass_num += 1 + sys.stderr.write("attempting to resolve {n} names\n".format(n=len(unsettled_names))) + if pass_num > 1: + sys.stderr.write("names: {}\n".format("\n".join(unsettled_names))) + new_unsettled_names = [] + for name in unsettled_names: + new_name = prefix+name_map[name] + name_map[name] = new_name + if new_name in taken_names: + new_unsettled_names.append(name) + else: + taken_names.add(name) + num_resolved += 1 + sys.stderr.write("resolved {n} names\n".format(n=num_resolved)) + unsettled_names = new_unsettled_names + + for account in genesis["initial_accounts"]: + name = account["name"] + account["name"] = name_map.get(name, name) + del account["is_prefixed"] + for asset in genesis["initial_assets"]: + issuer_name = asset["issuer_name"] + asset["issuer_name"] = name_map.get(issuer_name, issuer_name) + for witness in genesis["initial_witness_candidates"]: + owner_name = witness["owner_name"] + witness["owner_name"] = name_map.get(owner_name, owner_name) + for committee in genesis["initial_committee_candidates"]: + owner_name = member["owner_name"] + member["owner_name"] = name_map.get(owner_name, owner_name) + for worker in genesis["initial_worker_candidates"]: + owner_name = worker["owner_name"] + worker["owner_name"] = name_map.get(owner_name, owner_name) + + if opts.output == "-": + dump_json( genesis, sys.stdout, opts.pretty ) + sys.stdout.flush() + else: + with open(opts.output, "w") as f: + dump_json( genesis, f, opts.pretty ) + return + +if __name__ == "__main__": + main() diff --git a/programs/genesis_util/sort_objects.py b/programs/genesis_util/sort_objects.py new file mode 100755 index 00000000..82401277 --- /dev/null +++ b/programs/genesis_util/sort_objects.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 + +import argparse +import json +import sys + +def dump_json(obj, out, pretty): + if pretty: + json.dump(obj, out, indent=2, sort_keys=True) + else: + json.dump(obj, out, separators=(",", ":"), sort_keys=True) + return + +def main(): + parser = argparse.ArgumentParser(description="Sort initial_accounts and initial_assets by \"id\" member, then remove \"id\" member") + parser.add_argument("-o", "--output", metavar="OUT", default="-", help="output filename (default: stdout)") + parser.add_argument("-i", "--input", metavar="IN", default="-", help="input filename (default: stdin)") + parser.add_argument("-p", "--pretty", action="store_true", default=False, help="pretty print output") + opts = parser.parse_args() + + if opts.input == "-": + genesis = json.load(sys.stdin) + else: + with open(opts.input, "r") as f: + genesis = json.load(f) + + genesis["initial_assets"].sort( key=lambda e : e["id"] ) + genesis["initial_accounts"].sort( key=lambda e : e["id"] ) + + for e in genesis["initial_assets"]: + del e["id"] + for e in genesis["initial_accounts"]: + del e["id"] + + if opts.output == "-": + dump_json( genesis, sys.stdout, opts.pretty ) + sys.stdout.flush() + else: + with open(opts.output, "w") as f: + dump_json( genesis, f, opts.pretty ) + return + +if __name__ == "__main__": + main() diff --git a/programs/genesis_util/unprefix_asset_owners.py b/programs/genesis_util/unprefix_asset_owners.py new file mode 100755 index 00000000..81935390 --- /dev/null +++ b/programs/genesis_util/unprefix_asset_owners.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +import argparse +import json +import sys + +def dump_json(obj, out, pretty): + if pretty: + json.dump(obj, out, indent=2, sort_keys=True) + else: + json.dump(obj, out, separators=(",", ":"), sort_keys=True) + return + +def main(): + parser = argparse.ArgumentParser(description="Set is_prefixed=false for all asset owners") + parser.add_argument("-o", "--output", metavar="OUT", default="-", help="output filename (default: stdout)") + parser.add_argument("-i", "--input", metavar="IN", default="-", help="input filename (default: stdin)") + parser.add_argument("-p", "--pretty", action="store_true", default=False, help="pretty print output") + opts = parser.parse_args() + + if opts.input == "-": + genesis = json.load(sys.stdin) + else: + with open(opts.input, "r") as f: + genesis = json.load(f) + + asset_owners = set() + for asset in genesis["initial_assets"]: + asset_owners.add(asset["issuer_name"]) + for account in genesis["initial_accounts"]: + if account["name"] in asset_owners: + account["is_prefixed"] = False + + if opts.output == "-": + dump_json( genesis, sys.stdout, opts.pretty ) + sys.stdout.flush() + else: + with open(opts.output, "w") as f: + dump_json( genesis, f, opts.pretty ) + return + +if __name__ == "__main__": + main() diff --git a/programs/genesis_util/unprefix_names.py b/programs/genesis_util/unprefix_names.py new file mode 100755 index 00000000..0c7341fa --- /dev/null +++ b/programs/genesis_util/unprefix_names.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +import argparse +import json +import sys + +def dump_json(obj, out, pretty): + if pretty: + json.dump(obj, out, indent=2, sort_keys=True) + else: + json.dump(obj, out, separators=(",", ":"), sort_keys=True) + return + +def load_names(infile): + names = set() + for line in infile: + if '#' in line: + line = line[:line.index('#')] + line = line.strip() + if line == "": + continue + names.add(line) + return names + +def main(): + parser = argparse.ArgumentParser(description="Set is_prefixed=False for a list of names") + parser.add_argument("-o", "--output", metavar="OUT", default="-", help="output filename (default: stdout)") + parser.add_argument("-i", "--input", metavar="IN", default="-", help="input filename (default: stdin)") + parser.add_argument("-n", "--names", metavar="NAMES", help="list of names to unprefix") + parser.add_argument("-p", "--pretty", action="store_true", default=False, help="pretty print output") + opts = parser.parse_args() + + if opts.input == "-": + genesis = json.load(sys.stdin) + else: + with open(opts.input, "r") as f: + genesis = json.load(f) + + if opts.names == "-": + names = load_names(sys.stdin) + else: + with open(opts.names, "r") as f: + names = load_names(f) + + for account in genesis["initial_accounts"]: + if account["name"] in names: + account["is_prefixed"] = False + + if opts.output == "-": + dump_json( genesis, sys.stdout, opts.pretty ) + sys.stdout.flush() + else: + with open(opts.output, "w") as f: + dump_json( genesis, f, opts.pretty ) + return + +if __name__ == "__main__": + main() diff --git a/programs/genesis_util/upgrade_members.py b/programs/genesis_util/upgrade_members.py index 3ca42258..83b74234 100755 --- a/programs/genesis_util/upgrade_members.py +++ b/programs/genesis_util/upgrade_members.py @@ -26,7 +26,7 @@ def load_names(infile): return names def main(): - parser = argparse.ArgumentParser(description="Remove entities from snapshot") + parser = argparse.ArgumentParser(description="Upgrade a list of members") parser.add_argument("-o", "--output", metavar="OUT", default="-", help="output filename (default: stdout)") parser.add_argument("-i", "--input", metavar="IN", default="-", help="input filename (default: stdin)") parser.add_argument("-n", "--names", metavar="NAMES", default="", help="file containing names to upgrade")