diff --git a/docs/rpc-interface.rst b/docs/rpc-interface.rst index e1c716e..8a34d4d 100644 --- a/docs/rpc-interface.rst +++ b/docs/rpc-interface.rst @@ -204,7 +204,8 @@ query ----- Run a query of the UTXO and history databases against one or more -addresses or hex scripts. `--limit ` or `-l ` limits the output +addresses, hex scripts or ASCII names (for coins that have an index +on names like Namecoin). `--limit ` or `-l ` limits the output for each kind to that many entries. History is printed in blockchain order; UTXOs in an arbitrary order. diff --git a/electrumx/lib/coins.py b/electrumx/lib/coins.py index aa7a5de..33941c8 100644 --- a/electrumx/lib/coins.py +++ b/electrumx/lib/coins.py @@ -942,6 +942,27 @@ class Namecoin(NameMixin, AuxPowMixin, Coin): ] BLOCK_PROCESSOR = block_proc.NamecoinBlockProcessor + # Name opcodes + OP_NAME_NEW = OpCodes.OP_1 + OP_NAME_FIRSTUPDATE = OpCodes.OP_2 + OP_NAME_UPDATE = OpCodes.OP_3 + + @classmethod + def build_name_index_script(cls, name): + """Returns the normalised script by which names are indexed""" + + from electrumx.lib.script import Script + + normalized_name_op_script = bytearray() + normalized_name_op_script.append(cls.OP_NAME_UPDATE) + normalized_name_op_script.extend(Script.push_data(name)) + normalized_name_op_script.extend(Script.push_data(bytes([]))) + normalized_name_op_script.append(OpCodes.OP_2DROP) + normalized_name_op_script.append(OpCodes.OP_DROP) + normalized_name_op_script.append(OpCodes.OP_RETURN) + + return bytes(normalized_name_op_script) + @classmethod def split_name_script(cls, script): from electrumx.lib.script import _match_ops, Script, ScriptError @@ -953,16 +974,11 @@ class Namecoin(NameMixin, AuxPowMixin, Coin): match = _match_ops - # Name opcodes - OP_NAME_NEW = OpCodes.OP_1 - OP_NAME_FIRSTUPDATE = OpCodes.OP_2 - OP_NAME_UPDATE = OpCodes.OP_3 - # Opcode sequences for name operations - NAME_NEW_OPS = [OP_NAME_NEW, -1, OpCodes.OP_2DROP] - NAME_FIRSTUPDATE_OPS = [OP_NAME_FIRSTUPDATE, -1, -1, -1, + NAME_NEW_OPS = [cls.OP_NAME_NEW, -1, OpCodes.OP_2DROP] + NAME_FIRSTUPDATE_OPS = [cls.OP_NAME_FIRSTUPDATE, -1, -1, -1, OpCodes.OP_2DROP, OpCodes.OP_2DROP] - NAME_UPDATE_OPS = [OP_NAME_UPDATE, -1, -1, OpCodes.OP_2DROP, + NAME_UPDATE_OPS = [cls.OP_NAME_UPDATE, -1, -1, OpCodes.OP_2DROP, OpCodes.OP_DROP] name_script_op_count = None @@ -991,14 +1007,7 @@ class Namecoin(NameMixin, AuxPowMixin, Coin): if name_pushdata is None: return None, address_script - normalized_name_op_script = bytearray() - normalized_name_op_script.append(OP_NAME_UPDATE) - normalized_name_op_script.extend(Script.push_data(name_pushdata[1])) - normalized_name_op_script.extend(Script.push_data(bytes([]))) - normalized_name_op_script.append(OpCodes.OP_2DROP) - normalized_name_op_script.append(OpCodes.OP_DROP) - normalized_name_op_script.append(OpCodes.OP_RETURN) - + normalized_name_op_script = cls.build_name_index_script(name_pushdata[1]) return bytes(normalized_name_op_script), address_script @classmethod diff --git a/electrumx/server/session.py b/electrumx/server/session.py index 99d0f67..48fa03f 100644 --- a/electrumx/server/session.py +++ b/electrumx/server/session.py @@ -490,7 +490,7 @@ class SessionManager: return self.peer_mgr.rpc_data() async def rpc_query(self, items, limit): - '''Return a list of data about server peers.''' + '''Returns data about a script, address or name.''' coin = self.env.coin db = self.db lines = [] @@ -505,11 +505,20 @@ class SessionManager: try: hashX = coin.address_to_hashX(arg) - except Base58Error as e: - lines.append(e.args[0]) - return None - lines.append(f'Address: {arg}') - return hashX + lines.append(f'Address: {arg}') + return hashX + except Base58Error: + pass + + try: + script = coin.build_name_index_script(arg.encode("ascii")) + hashX = coin.name_hashX_from_script(script) + lines.append(f'Name: {arg}') + return hashX + except (AttributeError, UnicodeEncodeError): + pass + + return None for arg in items: hashX = arg_to_hashX(arg)