def check( state_engine ): global zonefile_hash # not revealed, but ready ns = state_engine.get_namespace_reveal( "test" ) if ns is not None: print "namespace reveal exists" return False ns = state_engine.get_namespace( "test" ) if ns is None: print "no namespace" return False if ns['namespace_id'] != 'test': print "wrong namespace" return False # registered name_rec = state_engine.get_name( "foo.test" ) if name_rec is None: print "name does not exist" return False # revoked if not name_rec['revoked']: print "not revoked" return False # owned by owner_address = wallets[4].addr if name_rec['address'] != owner_address or name_rec['sender'] != virtualchain.make_payment_script(owner_address): print "sender is wrong" return False # no zonefile hash if name_rec['value_hash'] is not None: print "still have value hash" return False # doesn't show up in listing names_owned = testlib.ysi_cli_names() if 'error' in names_owned: print "rpc names: %s" % names_owned['error'] return False if len(names_owned['names_owned']) != 0: print "owned: %s" % names_owned['names_owned'] return False # all queues are drained queue_info = testlib.ysi_client_queue_state() if len(queue_info) > 0: print "Still in queue:\n%s" % json.dumps(queue_info, indent=4, sort_keys=True) return False return True
def check(state_engine): global zonefile_hash # not revealed, but ready ns = state_engine.get_namespace_reveal("test") if ns is not None: print "namespace reveal exists" return False ns = state_engine.get_namespace("test") if ns is None: print "no namespace" return False if ns['namespace_id'] != 'test': print "wrong namespace" return False # registered name_rec = state_engine.get_name("foo.test") if name_rec is None: print "name does not exist" return False # owned by owner_address = wallets[3].addr if name_rec['address'] != owner_address or name_rec[ 'sender'] != virtualchain.make_payment_script(owner_address): print "sender is wrong" return False # value hash if name_rec['value_hash'] != zonefile_hash: print "wrong zonefile hash: %s != %s" % (name_rec['value_hash'], zonefile_hash) return False # replicated? zonefile = testlib.ysi_get_zonefile(zonefile_hash) if 'error' in zonefile: print "zonefile error: %s" % zonefile['error'] return False # right hash? if ysi_client.hash_zonefile(zonefile) != zonefile_hash: print "wrong zonefile: %s != %s" % (ysi_client.hash_zonefile(zonefile), zonefile_hash) return False # all queues are drained queue_info = testlib.ysi_client_queue_state() if len(queue_info) > 0: print "Still in queue:\n%s" % json.dumps( queue_info, indent=4, sort_keys=True) return False return True
def check( state_engine ): # not revealed, but ready ns = state_engine.get_namespace_reveal( "test" ) if ns is not None: print "namespace reveal exists" return False ns = state_engine.get_namespace( "test" ) if ns is None: print "no namespace" return False if ns['namespace_id'] != 'test': print "wrong namespace" return False names = ['foo.test', 'bar.test', 'baz.test', 'goo.test'] addresses = [wallets[2].addr, wallets[3].addr, wallets[4].addr, wallets[5].addr] zonefiles = ["Hello foo.test!", "Hello bar.test!", "Hello baz.test!", "Hello goo.test!"] for i in xrange(0, len(names)): name = names[i] owner_address = addresses[i] zonefile = zonefiles[i] # registered name_rec = state_engine.get_name( name ) if name_rec is None: print "name {} does not exist".format(name) return False # owned by the right address if name_rec['address'] != owner_address or name_rec['sender'] != virtualchain.make_payment_script(owner_address): print "sender is wrong for {}".format(name) return False # has the right zone file zf = testlib.ysi_get_zonefile(name_rec['value_hash'], parse=False) if zf is None: print "no zonefile for {}".format(name) return False if zf != zonefile: print "zonefile mismatch: expected {}, got {}".format(zonefile, zf) return False # all queues are drained queue_info = testlib.ysi_client_queue_state() if len(queue_info) > 0: print "Still in queue:\n%s" % json.dumps(queue_info, indent=4, sort_keys=True) return False return True
def check(state_engine): global zonefile_hash # not revealed, but ready ns = state_engine.get_namespace_reveal("test") if ns is not None: print "namespace reveal exists" return False ns = state_engine.get_namespace("test") if ns is None: print "no namespace" return False if ns['namespace_id'] != 'test': print "wrong namespace" return False # registered name_rec = state_engine.get_name("foo.test") if name_rec is None: print "name does not exist" return False # owned by owner_address = wallets[4].addr if name_rec['address'] != owner_address or name_rec[ 'sender'] != virtualchain.make_payment_script(owner_address): print "sender is wrong" return False # value hash if name_rec['value_hash'] != zonefile_hash: print "wrong zonefile hash: %s != %s" % (name_rec['value_hash'], zonefile_hash) return False # replicated? zonefile = testlib.ysi_get_zonefile(zonefile_hash) if 'error' in zonefile: print "zonefile error: %s" % zonefile['error'] return False # right hash? if ysi_client.hash_zonefile(zonefile) != zonefile_hash: print "wrong zonefile: %s != %s" % (ysi_client.hash_zonefile(zonefile), zonefile_hash) return False # latest key? if not zonefile.has_key("txt"): print "no txt:\n%s" % json.dumps(zonefile, indent=4, sort_keys=True) return False if len(zonefile['txt']) != 2: print "wrong number of txt records:\n%s" % json.dumps( zonefile, indent=4, sort_keys=True) return False for txtrec in zonefile['txt']: if txtrec['name'] == 'pubkey': if new_data_pubkey not in txtrec['txt']: print "wrong pubkey:\n%s" % json.dumps( zonefile, indent=4, sort_keys=True) print "missing %s" % new_data_pubkey return False names_owned = testlib.ysi_cli_names() if 'error' in names_owned: print "rpc names: %s" % names_owned['error'] return False # we still own the name if len(names_owned['names_owned']) != 1: print "owned: %s" % names_owned['names_owned'] return False # all queues are drained queue_info = testlib.ysi_client_queue_state() if len(queue_info) > 0: print "Still in queue:\n%s" % json.dumps( queue_info, indent=4, sort_keys=True) return False return True
def check(state_engine): global zonefile_hash, new_expire_block # not revealed, but ready ns = state_engine.get_namespace_reveal("test") if ns is not None: print "namespace reveal exists" return False ns = state_engine.get_namespace("test") if ns is None: print "no namespace" return False if ns['namespace_id'] != 'test': print "wrong namespace" return False # registered name_rec = state_engine.get_name("foo.test") if name_rec is None: print "name does not exist" return False # owned by owner_address = wallets[3].addr if name_rec['address'] != owner_address or name_rec[ 'sender'] != virtualchain.make_payment_script(owner_address): print "sender is wrong" return False # value hash if name_rec['value_hash'] != zonefile_hash: print "wrong zonefile hash: %s != %s" % (name_rec['value_hash'], zonefile_hash) return False # replicated? zonefile = testlib.ysi_get_zonefile(zonefile_hash) if 'error' in zonefile: print "zonefile error: %s" % zonefile['error'] return False # right hash? if ysi_client.hash_zonefile(zonefile) != zonefile_hash: print "wrong zonefile: %s != %s" % (ysi_client.hash_zonefile(zonefile), zonefile_hash) return False # all queues are drained queue_info = testlib.ysi_client_queue_state() if len(queue_info) > 0: print "Still in queue:\n%s" % json.dumps( queue_info, indent=4, sort_keys=True) return False # final balance is correct? name_fee = ysi_server.price_name("foo", ns, new_expire_block) preorder_dust_fees = 3 * DEFAULT_DUST_FEE + DEFAULT_OP_RETURN_FEE register_dust_fees = 4 * DEFAULT_DUST_FEE + DEFAULT_OP_RETURN_FEE renewal_dust_fees = 3 * DEFAULT_DUST_FEE + DEFAULT_OP_RETURN_FEE total_fee = name_fee * 2 + preorder_dust_fees + register_dust_fees + renewal_dust_fees payment_address = wallets[2].addr # TODO: check return True
def check(state_engine): # not revealed, but ready ns = state_engine.get_namespace_reveal("test") if ns is not None: print "namespace reveal exists" return False ns = state_engine.get_namespace("test") if ns is None: print "no namespace" return False if ns['namespace_id'] != 'test': print "wrong namespace" return False # registered name_rec = state_engine.get_name("foo.test") if name_rec is None: print "name does not exist" return False # owned by the right address owner_address = wallets[4].addr if name_rec['address'] != owner_address or name_rec[ 'sender'] != virtualchain.make_payment_script(owner_address): print "sender is wrong" return False # all queues are drained queue_info = testlib.ysi_client_queue_state() if len(queue_info) > 0: print "Still in queue:\n%s" % json.dumps( queue_info, indent=4, sort_keys=True) return False # have an update hash if 'value_hash' not in name_rec or name_rec.get('value_hash', None) is None: print "No value hash" return False # have a zonefile zonefile = testlib.ysi_get_zonefile(name_rec['value_hash']) if zonefile is None or 'error' in zonefile: if zonefile is not None: print "zonefile lookup error: %s" % zonefile['error'] else: print "no zonefile returned" return False # hashes to this zonefile if ysi_client.hash_zonefile(zonefile) != name_rec['value_hash']: print "wrong zonefile: %s != %s" % (ysi_client.hash_zonefile(zonefile), name_rec['value_hash']) return False # zonefile has the right data public key zonefile_pubk = ysi_client.user.user_zonefile_data_pubkey(zonefile) if keylib.key_formatting.compress( zonefile_pubk) != keylib.key_formatting.compress( wallets[4].pubkey_hex) or zonefile_pubk is None: print 'pubkey mismatch: {} != {}'.format(zonefile_pubk, wallets[4].pubkey_hex) return False # zonefile has the right drivers zonefile_urls = ysi_client.user.user_zonefile_urls(zonefile) driver_urls = ysi_client.storage.make_mutable_data_urls( 'foo.test', use_only=['dht', 'disk']) if driver_urls != zonefile_urls: print 'url mismatch: {} != {}'.format(driver_urls, zonefile_urls) return False # verify that the profile is NOT there profile = testlib.ysi_get_profile("foo.test") if profile is not None and 'error' not in profile: print 'make a profile by mistake: {}'.format(profile) return False return True
def check(state_engine): # not revealed, but ready ns = state_engine.get_namespace_reveal("test") if ns is not None: print "namespace reveal exists" return False ns = state_engine.get_namespace("test") if ns is None: print "no namespace" return False if ns['namespace_id'] != 'test': print "wrong namespace" return False # registered name_rec = state_engine.get_name("foo.test") if name_rec is None: print "name does not exist" return False # owned by the right address owner_address = wallets[4].addr if name_rec['address'] != owner_address or name_rec[ 'sender'] != virtualchain.make_payment_script(owner_address): print "sender is wrong" print "%s != %s or %s != %s" % ( name_rec['address'], owner_address, name_rec['sender'], virtualchain.make_payment_script(owner_address)) return False # all queues are drained queue_info = testlib.ysi_client_queue_state() if len(queue_info) > 0: print "Still in queue:\n%s" % json.dumps( queue_info, indent=4, sort_keys=True) return False # have an update hash if 'value_hash' not in name_rec or name_rec.get('value_hash', None) is None: print "No value hash" return False # have a zonefile zonefile = testlib.ysi_get_zonefile(name_rec['value_hash']) if zonefile is None or 'error' in zonefile: if zonefile is not None: print "zonefile lookup error: %s" % zonefile['error'] else: print "no zonefile returned" return False # hashes to this zonefile if ysi_client.hash_zonefile(zonefile) != name_rec['value_hash']: print "wrong zonefile: %s != %s" % (ysi_client.hash_zonefile(zonefile), name_rec['value_hash']) return False # verify that the profile is there profile = testlib.ysi_get_profile("foo.test") if profile is None or 'error' in profile: if profile is None: print "no profile returned" else: print "profile lookup error: %s" % profile['error'] return False return True
def check( state_engine ): global preorder_info, register_info, update_info, balance_before, balance_after, names_owned_before, names_owned_after, whois, blockchain_record, deposit_info, price_info global blockchain_history, zonefile_info, all_names_info, namespace_names_info, wallet_info, lookup_info, update_history, zonefile_history, names_info # not revealed, but ready ns = state_engine.get_namespace_reveal( "test" ) if ns is not None: print "namespace reveal exists" return False ns = state_engine.get_namespace( "test" ) if ns is None: print "no namespace" return False if ns['namespace_id'] != 'test': print "wrong namespace" return False # registered name_rec = state_engine.get_name( "foo.test" ) if name_rec is None: print "name does not exist" return False # owned by the right address owner_address = wallets[3].addr if name_rec['address'] != owner_address or name_rec['sender'] != virtualchain.make_payment_script(owner_address): print "sender is wrong" return False # all queues are drained queue_info = testlib.ysi_client_queue_state() if len(queue_info) > 0: print "Still in queue:\n%s" % json.dumps(queue_info, indent=4, sort_keys=True) return False # have an update hash if 'value_hash' not in name_rec or name_rec.get('value_hash', None) is None: print "No value hash" return False # have a zonefile zonefile = testlib.ysi_get_zonefile( name_rec['value_hash'] ) if zonefile is None or 'error' in zonefile: if zonefile is not None: print "zonefile lookup error: %s" % zonefile['error'] else: print "no zonefile returned" return False # hashes to this zonefile if ysi_client.hash_zonefile( zonefile ) != name_rec['value_hash']: print "wrong zonefile: %s != %s" % (ysi_client.hash_zonefile(zonefile), name_rec['value_hash']) return False # verify that the profile is there profile = testlib.ysi_get_profile( "foo.test" ) if profile is None or 'error' in profile: if profile is None: print "no profile returned" else: print "profile lookup error: %s" % profile['error'] return False # check queue operations for queue_type, queue_state in [("preorder", preorder_info), ("register", register_info), ("update", update_info)]: if not queue_state.has_key('queues'): print "missing queues:\n%s" % json.dumps(queue_state, indent=4, sort_keys=True) return False for k in ['name', 'confirmations', 'tx_hash']: for q in queue_state['queues'][queue_type]: if not q.has_key(k): print "missing key %s\n%s" % (k, json.dumps(queue_state, indent=4, sort_keys=True)) return False if q['name'] != 'foo.test': print "wrong name: %s" % queue_state['name'] return False # check price for k in ['preorder_tx_fee', 'register_tx_fee', 'total_estimated_cost', 'name_price']: if not price_info.has_key(k): print "bad price info (missing %s):\n%s" % (k, json.dumps(price_info, indent=4, sort_keys=True)) return False # deposit info if not deposit_info.has_key('address') or deposit_info['address'] != wallets[2].addr: print "bad deposit info:\n%s" % json.dumps(deposit_info, indent=4, sort_keys=True) return False # whois info for k in ['block_preordered_at', 'block_renewed_at', 'last_transaction_id', 'owner_address', 'owner_script', 'expire_block', 'has_zonefile', 'zonefile_hash']: if not whois.has_key(k): print "bad whois: missing %s\n%s" % (k, json.dumps(whois, indent=4, sort_keys=True)) return False # balance for balance_info in [balance_before, balance_after]: for k in ['total_balance', 'addresses']: if not balance_info.has_key(k): print "missing '%s'\n%s" % (k, json.dumps(balance_info, indent=4, sort_keys=True)) return False # name listing if len(names_owned_before) != 0: print "owned before: %s" % names_owned_before return False if len(names_owned_after) != 1 or names_owned_after[0] != 'foo.test': print "owned after: %s" % names_owned_after return False # blockchain record for k in ['name', 'op', 'op_fee', 'opcode', 'vtxindex', 'txid', 'value_hash', 'sender', 'address', 'history']: if not blockchain_record.has_key(k): print "missing %s\n%s" % (k, json.dumps(blockchain_record, indent=4, sort_keys=True)) return False # blockchain history (should have a preorder, register, and 2 updates) if len(blockchain_history) != 4: print "invalid history\n%s\n" % json.dumps(blockchain_history, indent=4, sort_keys=True) return False block_heights = blockchain_history.keys() block_heights.sort() expected_opcodes = ['NAME_PREORDER', 'NAME_REGISTRATION', 'NAME_UPDATE', 'NAME_UPDATE'] for bh, opcode in zip(block_heights, expected_opcodes): if len(blockchain_history[bh]) != 1: print "invalid history: multiple ops at %s\n%s" % (bh, json.dumps(blockchain_history, indent=4, sort_keys=True)) return False if blockchain_history[bh][0]['opcode'] != opcode: print "invalid history: expected %s at %s\n%s" % (opcode, bh, json.dumps(blockchain_history, indent=4, sort_keys=True)) return False # zonefile info if zonefile_info is None or type(zonefile_info) != str: print "invalid zonefile\n%s\n" % zonefile_info return False # name query if type(all_names_info) == dict and 'error' in all_names_info: print "error in all_names: %s" % all_names_info return False all_names = all_names_info if len(all_names) != 1 or all_names != ['foo.test']: print "all names: %s" % all_names return False # namespace query if type(namespace_names_info) == dict and 'error' in namespace_names_info: print "error in namesace_names: %s" % namespace_names_info return False namespace_names = namespace_names_info if len(namespace_names) != 1 or namespace_names != ['foo.test']: print "all namespace names: %s" % namespace_names return False # wallet info for k in ['payment_privkey', 'owner_privkey', 'data_privkey', 'payment_address', 'owner_address', 'data_pubkey']: if not wallet_info.has_key(k): print "missing %s\n%s" % (k, json.dumps(wallet_info, indent=4, sort_keys=True)) return False # profile info for k in ['profile', 'zonefile']: if not lookup_info.has_key(k): print "missing '%s'\n%s" % (k, json.dumps(lookup_info, indent=4, sort_keys=True)) return False if lookup_info['zonefile'] != zonefile_info: print "unequal zonefiles:\n%s\n%s" % (json.dumps(lookup_info['zonefile'], indent=4, sort_keys=True), json.dumps(zonefile_info, indent=4, sort_keys=True)) return False # update history (2 items) if len(update_history) != 2 or update_history[1] != blockchain_record['value_hash']: print "invalid update history\n%s" % json.dumps(update_history, indent=4, sort_keys=True) return False # zonefile history (expect 2 items) if len(zonefile_history) != 2 or zonefile_history[1] != zonefile_info: print "invalid zonefile history\n%s" % json.dumps(zonefile_history, indent=4, sort_keys=True) print "zonefile current:\n%s" % json.dumps(zonefile_info, indent=4, sort_keys=True) return False # names info if type(names_info) != dict: print "invalid names info: %s" % names_info return False for k in ['names_owned', 'addresses']: if not names_info.has_key(k): print "invalid names info (missing %s): %s" % (k, names_info) return False if len(names_info['addresses']) != 1: print "invalid names info (addresses): %s" % names_info return False if names_info['addresses'][0]['names_owned'] != ['foo.test']: print "invalid names info (names_owned): %s" % names_info return False if names_info['addresses'][0]['address'] != wallets[3].addr: print "invalid names info (addresses.address): %s" % names_info return False # immutable data immutable_data = testlib.ysi_cli_get_immutable( "foo.test", "hello_world" ) if 'error' in immutable_data: print "Failed to get immutable data 'hello_world'" print json.dumps(immutable_data, indent=4, sort_keys=True) return False if 'data' not in immutable_data: print "invalid immutable_data: %s" % immutable_data return False if json.loads(immutable_data['data']) != {'hello': 'world'}: print "failed to get immutable data" print 'exected %s, got %s' % ({'hello': 'world'}, immutable_data['data']) return False return True