From 4d422c5a03c87e037423e37b54eb0d120277f83c Mon Sep 17 00:00:00 2001 From: cyyber Date: Mon, 2 Mar 2020 19:32:40 +0530 Subject: [PATCH 01/23] Bug fixes for API --- src/qrl/core/ChainManager.py | 6 ++++++ src/qrl/core/OptimizedAddressState.py | 4 ++++ src/qrl/core/qrlnode.py | 10 +++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/qrl/core/ChainManager.py b/src/qrl/core/ChainManager.py index f58971632..ed2398636 100644 --- a/src/qrl/core/ChainManager.py +++ b/src/qrl/core/ChainManager.py @@ -102,6 +102,7 @@ def get_address_is_used(self, address: bytes) -> bool: def get_address_state(self, address: bytes) -> AddressState: """ Transform Optimized Address State into Older Address State format + This should only be used by API. """ optimized_address_state = self.get_optimized_address_state(address) ots_bitfield = [b'\x00'] * max(1024, int(ceil((2 ** optimized_address_state.height) / 8))) @@ -133,6 +134,11 @@ def get_address_state(self, address: bytes) -> AddressState: page_data = self.get_token_transaction_hashes(address, page * config.dev.data_per_page) for token_txn_hash in page_data: token_balance = self.get_token(address, token_txn_hash) + # token_balance None is only possible when the token transaction + # is done by a QRL address as an owner, which has not been + # assigned any token balance. + if token_balance is None: + continue tokens[token_txn_hash] = token_balance.balance max_slave_page = ceil(optimized_address_state.slaves_count() / config.dev.data_per_page) diff --git a/src/qrl/core/OptimizedAddressState.py b/src/qrl/core/OptimizedAddressState.py index f92db37e8..27fb48ae5 100644 --- a/src/qrl/core/OptimizedAddressState.py +++ b/src/qrl/core/OptimizedAddressState.py @@ -41,6 +41,10 @@ def __init__(self, protobuf_block=None): def bin_to_qaddress(binAddress): return 'Q' + bin2hstr(binAddress) + @staticmethod + def get_height_from_address(bin_address): + return bin_address[1] << 1 + @property def pbdata(self): """ diff --git a/src/qrl/core/qrlnode.py b/src/qrl/core/qrlnode.py index 4990e6079..7c50494f0 100644 --- a/src/qrl/core/qrlnode.py +++ b/src/qrl/core/qrlnode.py @@ -401,8 +401,16 @@ def get_ots(self, page_from: int, page_count: int, unused_ots_index_from: int) -> (list, Optional[int], bool): + if not OptimizedAddressState.address_is_valid(address): + return None, None, None + + max_bitfield = 2 ** OptimizedAddressState.get_height_from_address(address) + max_pages = (max_bitfield // config.dev.ots_tracking_per_page) + 1 + page_from = min(page_from, max_pages) + max_pages = min(page_from + page_count, max_pages) + bitfields = list() - for page in range(page_from, page_from + page_count): + for page in range(page_from, max_pages): bitfield = self._chain_manager.get_bitfield(address, page) bitfields.append(qrl_pb2.OTSBitfieldByPage(ots_bitfield=bitfield, page_number=page)) From 851878938d1d476ea87c1c3b1aa8324361b262e4 Mon Sep 17 00:00:00 2001 From: cyyber Date: Mon, 2 Mar 2020 20:32:22 +0530 Subject: [PATCH 02/23] Share peer address with public port shared by peer itself --- src/qrl/core/p2p/p2pPeerManager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qrl/core/p2p/p2pPeerManager.py b/src/qrl/core/p2p/p2pPeerManager.py index 1788929e5..32b5bb891 100644 --- a/src/qrl/core/p2p/p2pPeerManager.py +++ b/src/qrl/core/p2p/p2pPeerManager.py @@ -67,7 +67,11 @@ def trusted_peer(self, channel: P2PProtocol): @property def trusted_addresses(self): - return set([peer.peer.full_address for peer in self._p2p_factory.connections if self.trusted_peer(peer)]) + ip_public_port_set = set() + for peer in self._p2p_factory.connections: + if self.trusted_peer(peer) and peer.public_port != 0: + ip_public_port_set.add(peer.ip_public_port) + return ip_public_port_set @property def peer_node_status(self): From ceeee70bf05d00cccf37737d581c9c8d56de76a9 Mon Sep 17 00:00:00 2001 From: cyyber Date: Wed, 4 Mar 2020 11:21:01 +0530 Subject: [PATCH 03/23] Allow duplicate addresses in initial balance while creating Token Transaction --- src/qrl/core/txs/TokenTransaction.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/qrl/core/txs/TokenTransaction.py b/src/qrl/core/txs/TokenTransaction.py index f1a5899dc..06ddfef83 100644 --- a/src/qrl/core/txs/TokenTransaction.py +++ b/src/qrl/core/txs/TokenTransaction.py @@ -97,21 +97,14 @@ def _validate_custom(self): logger.warning('Token decimals cannot be more than 19') return False - addresses = set() sum_of_initial_balances = 0 for initial_balance in self.initial_balances: sum_of_initial_balances += initial_balance.amount - addresses.add(initial_balance.address) # TODO: Hard fork code, check if compatible with older blocks if initial_balance.amount <= 0: logger.warning('Invalid Initial Amount in Token Transaction') logger.warning('Address %s | Amount %s', initial_balance.address, initial_balance.amount) return False - # TODO: Hard fork code, check if compatible with older blocks - if len(addresses) != len(self.initial_balances): - logger.warning('Invalid Token Initialization. Duplicate address found initial_balance') - return False - allowed_decimals = self.calc_allowed_decimals(sum_of_initial_balances // 10 ** self.decimals) if self.decimals > allowed_decimals: @@ -183,10 +176,17 @@ def apply(self, if initial_balance.address == addr_from_pk: addr_from_pk_processed = True - state_container.tokens.data[(initial_balance.address, - self.txhash)] = TokenBalance(balance=initial_balance.amount, - decimals=self.decimals, - delete=False) + # If a QRL address has been mentioned multiple times in initial balance + # then check if that address has already been initialized with some token + # balance, if found, then add the new balance the already initialized balance + if (initial_balance.address, self.txhash) in state_container.tokens.data: + state_container.tokens.data[(initial_balance.address, + self.txhash)].balance += initial_balance.amount + else: + state_container.tokens.data[(initial_balance.address, + self.txhash)] = TokenBalance(balance=initial_balance.amount, + decimals=self.decimals, + delete=False) address_state = state_container.addresses_state[initial_balance.address] state_container.paginated_tx_hash.insert(address_state, self.txhash) state_container.paginated_tokens_hash.insert(address_state, self.txhash) From ebad8b55bebbfdde93b21fdbd2cadc8e899fa8b0 Mon Sep 17 00:00:00 2001 From: cyyber Date: Thu, 5 Mar 2020 10:48:45 +0530 Subject: [PATCH 04/23] Fix: TransferTokenTransaction should be storing token_txhash into paginated tokens --- src/qrl/core/txs/TransferTokenTransaction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qrl/core/txs/TransferTokenTransaction.py b/src/qrl/core/txs/TransferTokenTransaction.py index 79a99a9a5..378e69f57 100644 --- a/src/qrl/core/txs/TransferTokenTransaction.py +++ b/src/qrl/core/txs/TransferTokenTransaction.py @@ -170,7 +170,7 @@ def apply(self, self.token_txhash)] = TokenBalance(balance=0, decimals=decimals, delete=False) - state_container.paginated_tokens_hash.insert(address_state, self.txhash) + state_container.paginated_tokens_hash.insert(address_state, self.token_txhash) state_container.tokens.data[(addr_to, self.token_txhash)].balance += amount From 887bbf97c4aec6dbabb019efffd8f1e184fb5da8 Mon Sep 17 00:00:00 2001 From: cyyber Date: Thu, 5 Mar 2020 11:15:23 +0530 Subject: [PATCH 05/23] Fix: Conversion of ots bitfield from paginated state to legacy address state --- src/qrl/core/ChainManager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qrl/core/ChainManager.py b/src/qrl/core/ChainManager.py index ed2398636..2fe8bbc22 100644 --- a/src/qrl/core/ChainManager.py +++ b/src/qrl/core/ChainManager.py @@ -112,15 +112,14 @@ def get_address_state(self, address: bytes) -> AddressState: max_bitfield_page = ceil((2 ** optimized_address_state.height) / config.dev.ots_tracking_per_page) - offset = 0 for page in range(1, max_bitfield_page + 1): + offset = (page - 1) * config.dev.ots_tracking_per_page page_data = self.get_bitfield(address, page) for data in page_data: if offset >= len(ots_bitfield): break ots_bitfield[offset] = data offset += 1 - offset = (page - 1) * config.dev.ots_tracking_per_page max_transaction_hash_page = ceil(optimized_address_state.transaction_hash_count() / config.dev.data_per_page) From 63345fff1a5b8c1f9a8eda4d59dfee6e6ad35b37 Mon Sep 17 00:00:00 2001 From: cyyber Date: Wed, 11 Mar 2020 12:12:31 +0530 Subject: [PATCH 06/23] Fix: Loading mining_thread_count from testnet config when network-type is testnet --- src/qrl/main.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/qrl/main.py b/src/qrl/main.py index 0f1aa33f2..3ef3a9506 100644 --- a/src/qrl/main.py +++ b/src/qrl/main.py @@ -23,7 +23,7 @@ def parse_arguments(): parser = argparse.ArgumentParser(description='QRL node') parser.add_argument('--mining_thread_count', '-m', dest='mining_thread_count', type=int, required=False, - default=config.user.mining_thread_count, help="Number of threads for mining") + default=None, help="Number of threads for mining") parser.add_argument('--quiet', '-q', dest='quiet', action='store_true', required=False, default=False, help="Avoid writing data to the console") parser.add_argument('--qrldir', '-d', dest='qrl_dir', default=config.user.qrl_dir, @@ -79,6 +79,9 @@ def main(): config.user.qrl_dir = os.path.expanduser(os.path.normpath(args.qrl_dir) + qrl_dir_post_fix) config.create_path(config.user.qrl_dir, copy_files) config.user.load_yaml(config.user.config_path) + + if args.mining_thread_count is None: + args.mining_thread_count = config.user.mining_thread_count logger.debug("=====================================================================================") config.create_path(config.user.wallet_dir) From e03cba43d9b47ef1716a50a79d7a1770614ee765 Mon Sep 17 00:00:00 2001 From: cyyber Date: Wed, 11 Mar 2020 14:02:26 +0530 Subject: [PATCH 07/23] FIX: Maintain order of tokens and slave_pks_access_type while generating legacy address state --- src/qrl/core/ChainManager.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qrl/core/ChainManager.py b/src/qrl/core/ChainManager.py index 2fe8bbc22..dc6471a5c 100644 --- a/src/qrl/core/ChainManager.py +++ b/src/qrl/core/ChainManager.py @@ -3,6 +3,7 @@ # file LICENSE or http://www.opensource.org/licenses/mit-license.php. import sys import threading +from collections import OrderedDict from typing import Optional, Tuple from math import ceil @@ -107,8 +108,8 @@ def get_address_state(self, address: bytes) -> AddressState: optimized_address_state = self.get_optimized_address_state(address) ots_bitfield = [b'\x00'] * max(1024, int(ceil((2 ** optimized_address_state.height) / 8))) transaction_hashes = list() - tokens = dict() - slave_pks_access_type = dict() + tokens = OrderedDict() + slave_pks_access_type = OrderedDict() max_bitfield_page = ceil((2 ** optimized_address_state.height) / config.dev.ots_tracking_per_page) From 9633dcc976d8ff60b64b564acf99eccb712fac5f Mon Sep 17 00:00:00 2001 From: cyyber Date: Wed, 11 Mar 2020 15:14:30 +0530 Subject: [PATCH 08/23] Fix: Wallet Daemon fixes to support multi sig spend transaction --- src/qrl/core/qrlnode.py | 7 + src/qrl/daemon/walletd.py | 140 ++++++++++------- src/qrl/generated/qrlwallet_pb2.py | 194 +++++++++++------------- src/qrl/generated/qrlwallet_pb2_grpc.py | 18 +-- src/qrl/protos/qrlwallet.proto | 8 +- src/qrl/services/WalletAPIService.py | 20 ++- 6 files changed, 205 insertions(+), 182 deletions(-) diff --git a/src/qrl/core/qrlnode.py b/src/qrl/core/qrlnode.py index 7c50494f0..005bbffeb 100644 --- a/src/qrl/core/qrlnode.py +++ b/src/qrl/core/qrlnode.py @@ -572,6 +572,13 @@ def get_mini_transactions_by_address(self, address: bytes, item_per_page: int, p elif isinstance(tx, CoinBase): if tx.addr_to == address: amount += tx.amount + elif isinstance(tx, MultiSigSpend): + try: + for i in range(len(tx.addrs_to)): + if tx.addrs_to[i] == address: + amount += tx.amounts[i] + except ValueError: + pass if amount < 0: mini_transaction.out = True diff --git a/src/qrl/daemon/walletd.py b/src/qrl/daemon/walletd.py index 894afc1ee..a12eb1e57 100644 --- a/src/qrl/daemon/walletd.py +++ b/src/qrl/daemon/walletd.py @@ -312,7 +312,7 @@ def sign_and_push_transaction(self, raise Exception("Invalid Transaction") if enable_save: - if slave_index == None: # noqa + if slave_index is None: # noqa self._wallet.set_ots_index(index, xmss.ots_index) # Move to next OTS index before broadcasting txn else: self._wallet.set_slave_ots_index(index, group_index, slave_index, xmss.ots_index) @@ -373,69 +373,103 @@ def get_slave(self, master_qaddress): # Should we check available OTS for master # Get slave list using address state address_state = self.get_address_state(master_qaddress) - group_index = len(item.slaves) - 1 - slave_group = None - while group_index >= 0: - slave = item.slaves[group_index][0] - if self.is_slave(address_state.address, bytes(hstr2bin(slave.pk))): - slave_group = item.slaves[group_index] - break - group_index -= 1 - if group_index > 0: - xmss = self.try_txn_with_last_slave(item, index, group_index - 1) - if xmss: - return index, group_index - 1, len(item.slaves[group_index - 1]) - 1, xmss - - if slave_group is None: - # Relay slave txn using master address using ots index 0 - return index, -1, -1, None - - for slave_index, slave in enumerate(slave_group): - if slave.index > 2 ** slave.height - 1: - continue - - if slave_index + 1 == len(slave_group) and slave.index >= 2 ** slave.height - 5: - continue + + slave = item.slaves[-1][0] + if not address_state.validate_slave_with_access_type(str(bytes(hstr2bin(slave.pk))), [0]): + if len(item.slaves) == 1: + qaddress = item.qaddress + target_address_item = item + group_index = None + else: + qaddress = item.slaves[-2][-1].qaddress + target_address_item = item.slaves[-2][-1] + group_index = -2 + + address_state = self.get_address_state(qaddress) + ots_index = address_state.get_unused_ots_index() + + if ots_index >= UNRESERVED_OTS_INDEX_START: + raise Exception('Fatal Error!!! No reserved OTS index found') if self._passphrase: - slave = self._wallet.decrypt_address_item(slave, self._passphrase) + target_address_item = self._wallet.decrypt_address_item(target_address_item, self._passphrase) + + xmss = self._wallet.get_xmss_by_item(target_address_item, ots_index) + + slaves_pk = [bytes(hstr2bin(slave_item.pk)) for slave_item in item.slaves[-1]] + tx = self.generate_slave_tx(xmss.pk, + slaves_pk, + self.qaddress_to_address(master_qaddress)) + + self.sign_and_push_transaction(tx, + xmss, + index, + enable_save=False) + + if len(item.slaves) > 1: + if self.try_txn_with_last_slave(item, index, group_index, xmss): + return index, len(item.slaves) - 2, len(item.slaves[group_index]) - 1, xmss + + else: + if len(item.slaves) > 1: + group_index = len(item.slaves) - 2 + xmss = self.try_txn_with_last_slave(item, index, group_index) + if xmss: + return index, group_index, len(item.slaves[group_index]) - 1, xmss + group_index = len(item.slaves) - 1 + last_slaves = item.slaves[-1] + for slave_index in range(len(last_slaves)): + slave = last_slaves[slave_index] + + # Check if all ots index has been marked as used + if slave.index > 2 ** slave.height - 1: + continue + + # Ignore usage of last 5 ots indexes for the last slave in slave group + if slave_index + 1 == len(last_slaves) and slave.index >= 2 ** slave.height - 5: + continue + + if self._passphrase: + slave = self._wallet.decrypt_address_item(slave, self._passphrase) + + slave_address_state = self.get_address_state(slave.qaddress) + + if slave_index + 1 == len(last_slaves) and slave.index > 2 ** slave.height - 100: - slave_address_state = self.get_address_state(slave.qaddress) + ots_index = slave_address_state.get_unused_ots_index(0) + if ots_index >= UNRESERVED_OTS_INDEX_START: + raise Exception("Fatal Error, no unused reserved OTS index") - ots_index = self.get_unused_ots_index(slave_address_state.address, slave.index) - if slave_index + 1 == len(slave_group) and max(ots_index, slave.index) > 2 ** slave.height - 100: - ots_index_reserved = self.get_unused_ots_index(slave_address_state.address, 0) - if ots_index_reserved >= UNRESERVED_OTS_INDEX_START: - raise Exception("Fatal Error, no unused reserved OTS index", ots_index_reserved) + curr_slave_xmss = self._wallet.get_xmss_by_item(slave, ots_index) - curr_slave_xmss = self._wallet.get_xmss_by_item(slave, ots_index_reserved) + slave_xmss_list = self._wallet.add_slave(index=index, + height=slave.height, + number_of_slaves=config.user.number_of_slaves, + passphrase=self._passphrase, + force=True) + slave_pk_list = self.get_pk_list_from_xmss_list(slave_xmss_list) - slave_xmss_list = self._wallet.add_slave(index=index, - height=slave.height, - number_of_slaves=config.user.number_of_slaves, - passphrase=self._passphrase, - force=True) - slave_pk_list = self.get_pk_list_from_xmss_list(slave_xmss_list) + tx = self.generate_slave_tx(bytes(hstr2bin(slave.pk)), + slave_pk_list, + self.qaddress_to_address(item.qaddress)) - tx = self.generate_slave_tx(bytes(hstr2bin(slave.pk)), - slave_pk_list, - self.qaddress_to_address(item.qaddress)) + self.sign_and_push_transaction(tx, + curr_slave_xmss, + index, + enable_save=False) - self.sign_and_push_transaction(tx, - curr_slave_xmss, - index, - enable_save=False) + ots_index = slave_address_state.get_unused_ots_index(slave.index) - if ots_index is None: - self._wallet.set_slave_ots_index(index, - group_index, - slave_index, - 2 ** slave.height) - continue + if ots_index is None: # noqa + self._wallet.set_slave_ots_index(index, + group_index, + slave_index, + 2 ** slave.height) + continue - slave_xmss = self._wallet.get_xmss_by_item(slave, ots_index) + slave_xmss = self._wallet.get_xmss_by_item(slave, ots_index) - return index, group_index, slave_index, slave_xmss + return index, group_index, slave_index, slave_xmss return index, -1, -1, None diff --git a/src/qrl/generated/qrlwallet_pb2.py b/src/qrl/generated/qrlwallet_pb2.py index 917f070d3..867975fb6 100644 --- a/src/qrl/generated/qrlwallet_pb2.py +++ b/src/qrl/generated/qrlwallet_pb2.py @@ -20,7 +20,7 @@ name='qrlwallet.proto', package='qrl', syntax='proto3', - serialized_pb=_b('\n\x0fqrlwallet.proto\x12\x03qrl\x1a\tqrl.proto\"9\n\x10\x41\x64\x64NewAddressReq\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12\x15\n\rhash_function\x18\x02 \x01(\t\"A\n\x11\x41\x64\x64NewAddressResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x03 \x01(\t\"]\n\x1a\x41\x64\x64NewAddressWithSlavesReq\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12\x18\n\x10number_of_slaves\x18\x02 \x01(\x04\x12\x15\n\rhash_function\x18\x03 \x01(\t\"%\n\x15\x41\x64\x64\x41\x64\x64ressFromSeedReq\x12\x0c\n\x04seed\x18\x01 \x01(\t\"F\n\x16\x41\x64\x64\x41\x64\x64ressFromSeedResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x03 \x01(\t\"\x12\n\x10ListAddressesReq\"C\n\x11ListAddressesResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x11\n\taddresses\x18\x03 \x03(\t\"#\n\x10RemoveAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"0\n\x11RemoveAddressResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\"\n\x0fValidAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\">\n\x10ValidAddressResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\r\n\x05valid\x18\x03 \x01(\t\"&\n\x10\x45ncryptWalletReq\x12\x12\n\npassphrase\x18\x01 \x01(\t\"0\n\x11\x45ncryptWalletResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"%\n\x0fUnlockWalletReq\x12\x12\n\npassphrase\x18\x01 \x01(\t\"/\n\x10UnlockWalletResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x0f\n\rLockWalletReq\"-\n\x0eLockWalletResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"&\n\x13GetRecoverySeedsReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"V\n\x14GetRecoverySeedsResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07hexseed\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\"\x12\n\x10GetWalletInfoReq\"n\n\x11GetWalletInfoResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\r\x12\x15\n\raddress_count\x18\x04 \x01(\x04\x12\x14\n\x0cis_encrypted\x18\x05 \x01(\x08\"\x8c\x01\n\x13RelayTransferTxnReq\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x01 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x02 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x03 \x01(\x04\x12\x16\n\x0emaster_address\x18\x04 \x01(\t\x12\x16\n\x0esigner_address\x18\x05 \x01(\t\x12\x11\n\tots_index\x18\x06 \x01(\x04\"h\n\x1aRelayTransferTxnBySlaveReq\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x01 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x02 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x03 \x01(\x04\x12\x16\n\x0emaster_address\x18\x04 \x01(\t\"u\n\x12RelayMessageTxnReq\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0b\n\x03\x66\x65\x65\x18\x02 \x01(\x04\x12\x16\n\x0emaster_address\x18\x03 \x01(\t\x12\x16\n\x0esigner_address\x18\x04 \x01(\t\x12\x11\n\tots_index\x18\x05 \x01(\x04\"Q\n\x19RelayMessageTxnBySlaveReq\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0b\n\x03\x66\x65\x65\x18\x02 \x01(\x04\x12\x16\n\x0emaster_address\x18\x03 \x01(\t\"\xc5\x01\n\x10RelayTokenTxnReq\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05owner\x18\x03 \x01(\t\x12\x10\n\x08\x64\x65\x63imals\x18\x04 \x01(\x04\x12\x11\n\taddresses\x18\x05 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x06 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x07 \x01(\x04\x12\x16\n\x0emaster_address\x18\x08 \x01(\t\x12\x16\n\x0esigner_address\x18\t \x01(\t\x12\x11\n\tots_index\x18\n \x01(\x04\"\xa1\x01\n\x17RelayTokenTxnBySlaveReq\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05owner\x18\x03 \x01(\t\x12\x10\n\x08\x64\x65\x63imals\x18\x04 \x01(\x04\x12\x11\n\taddresses\x18\x05 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x06 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x07 \x01(\x04\x12\x16\n\x0emaster_address\x18\x08 \x01(\t\"\xa7\x01\n\x18RelayTransferTokenTxnReq\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x01 \x03(\t\x12\x14\n\x0ctoken_txhash\x18\x02 \x01(\t\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x04 \x01(\x04\x12\x16\n\x0emaster_address\x18\x05 \x01(\t\x12\x16\n\x0esigner_address\x18\x06 \x01(\t\x12\x11\n\tots_index\x18\x07 \x01(\x04\"\x83\x01\n\x1fRelayTransferTokenTxnBySlaveReq\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x01 \x03(\t\x12\x14\n\x0ctoken_txhash\x18\x02 \x01(\t\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x04 \x01(\x04\x12\x16\n\x0emaster_address\x18\x05 \x01(\t\"\x8b\x01\n\x10RelaySlaveTxnReq\x12\x11\n\tslave_pks\x18\x01 \x03(\x0c\x12\x14\n\x0c\x61\x63\x63\x65ss_types\x18\x02 \x03(\r\x12\x0b\n\x03\x66\x65\x65\x18\x03 \x01(\x04\x12\x16\n\x0emaster_address\x18\x04 \x01(\t\x12\x16\n\x0esigner_address\x18\x05 \x01(\t\x12\x11\n\tots_index\x18\x06 \x01(\x04\"g\n\x17RelaySlaveTxnBySlaveReq\x12\x11\n\tslave_pks\x18\x01 \x03(\x0c\x12\x14\n\x0c\x61\x63\x63\x65ss_types\x18\x02 \x03(\r\x12\x0b\n\x03\x66\x65\x65\x18\x03 \x01(\x04\x12\x16\n\x0emaster_address\x18\x04 \x01(\t\"N\n\x0cRelayTxnResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12!\n\x02tx\x18\x03 \x01(\x0b\x32\x15.qrl.PlainTransaction\"C\n\x13\x43hangePassphraseReq\x12\x15\n\roldPassphrase\x18\x01 \x01(\t\x12\x15\n\rnewPassphrase\x18\x02 \x01(\t\"3\n\x14\x43hangePassphraseResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"[\n\x1cMiniTransactionsByAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x15\n\ritem_per_page\x18\x02 \x01(\x04\x12\x13\n\x0bpage_number\x18\x03 \x01(\x04\"~\n\x1dMiniTransactionsByAddressResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12/\n\x11mini_transactions\x18\x03 \x03(\x0b\x32\x14.qrl.MiniTransaction\x12\x0f\n\x07\x62\x61lance\x18\x04 \x01(\x04\"!\n\x0eTransactionReq\x12\x0f\n\x07tx_hash\x18\x01 \x01(\t\"\x99\x01\n\x0fTransactionResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12!\n\x02tx\x18\x03 \x01(\x0b\x32\x15.qrl.PlainTransaction\x12\x15\n\rconfirmations\x18\x04 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x05 \x01(\x04\x12\x19\n\x11\x62lock_header_hash\x18\x06 \x01(\t\"\x1d\n\nBalanceReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\";\n\x0b\x42\x61lanceResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07\x62\x61lance\x18\x03 \x01(\t\"\x11\n\x0fTotalBalanceReq\"@\n\x10TotalBalanceResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07\x62\x61lance\x18\x03 \x01(\t\"\x19\n\x06OTSReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"\x9b\x01\n\x07OTSResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x34\n\x14ots_bitfield_by_page\x18\x03 \x03(\x0b\x32\x16.qrl.OTSBitfieldByPage\x12\x1d\n\x15next_unused_ots_index\x18\x04 \x01(\x04\x12\x1e\n\x16unused_ots_index_found\x18\x05 \x01(\x08\"\x0b\n\tHeightReq\"9\n\nHeightResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0e\n\x06height\x18\x03 \x01(\x04\"\x1f\n\x08\x42lockReq\x12\x13\n\x0bheader_hash\x18\x01 \x01(\t\"H\n\tBlockResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x1e\n\x05\x62lock\x18\x03 \x01(\x0b\x32\x0f.qrl.PlainBlock\"(\n\x10\x42lockByNumberReq\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\"\x1e\n\x10\x41\x64\x64ressFromPKReq\x12\n\n\x02pk\x18\x01 \x01(\t\"A\n\x11\x41\x64\x64ressFromPKResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x03 \x01(\t\"\r\n\x0bNodeInfoReq\"\xc1\x01\n\x0cNodeInfoResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x17\n\x0fnum_connections\x18\x04 \x01(\t\x12\x17\n\x0fnum_known_peers\x18\x05 \x01(\t\x12\x0e\n\x06uptime\x18\x06 \x01(\x04\x12\x14\n\x0c\x62lock_height\x18\x07 \x01(\x04\x12\x17\n\x0f\x62lock_last_hash\x18\x08 \x01(\t\x12\x12\n\nnetwork_id\x18\t \x01(\t\"7\n\x13PlainGenesisBalance\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\"5\n\x12PlainAddressAmount\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x04\"\xce\x07\n\x10PlainTransaction\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\t\x12\x0b\n\x03\x66\x65\x65\x18\x02 \x01(\x04\x12\x12\n\npublic_key\x18\x03 \x01(\t\x12\x11\n\tsignature\x18\x04 \x01(\t\x12\r\n\x05nonce\x18\x05 \x01(\x04\x12\x18\n\x10transaction_hash\x18\x06 \x01(\t\x12\x13\n\x0bsigner_addr\x18\x07 \x01(\t\x12\x32\n\x08transfer\x18\x08 \x01(\x0b\x32\x1e.qrl.PlainTransaction.TransferH\x00\x12\x32\n\x08\x63oinbase\x18\t \x01(\x0b\x32\x1e.qrl.PlainTransaction.CoinBaseH\x00\x12;\n\tlatticePK\x18\n \x01(\x0b\x32&.qrl.PlainTransaction.LatticePublicKeyH\x00\x12\x30\n\x07message\x18\x0b \x01(\x0b\x32\x1d.qrl.PlainTransaction.MessageH\x00\x12,\n\x05token\x18\x0c \x01(\x0b\x32\x1b.qrl.PlainTransaction.TokenH\x00\x12=\n\x0etransfer_token\x18\r \x01(\x0b\x32#.qrl.PlainTransaction.TransferTokenH\x00\x12,\n\x05slave\x18\x0e \x01(\x0b\x32\x1b.qrl.PlainTransaction.SlaveH\x00\x1a-\n\x08Transfer\x12\x10\n\x08\x61\x64\x64rs_to\x18\x01 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x02 \x03(\x04\x1a+\n\x08\x43oinBase\x12\x0f\n\x07\x61\x64\x64r_to\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x04\x1a:\n\x10LatticePublicKey\x12\x10\n\x08kyber_pk\x18\x01 \x01(\t\x12\x14\n\x0c\x64ilithium_pk\x18\x02 \x01(\t\x1a\x1f\n\x07Message\x12\x14\n\x0cmessage_hash\x18\x01 \x01(\t\x1ay\n\x05Token\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05owner\x18\x03 \x01(\t\x12\x10\n\x08\x64\x65\x63imals\x18\x04 \x01(\x04\x12\x31\n\x10initial_balances\x18\x05 \x03(\x0b\x32\x17.qrl.PlainAddressAmount\x1aH\n\rTransferToken\x12\x14\n\x0ctoken_txhash\x18\x01 \x01(\t\x12\x10\n\x08\x61\x64\x64rs_to\x18\x02 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x1a\x30\n\x05Slave\x12\x11\n\tslave_pks\x18\x01 \x03(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_types\x18\x02 \x03(\rB\x11\n\x0ftransactionType\"\xdc\x01\n\x10PlainBlockHeader\x12\x13\n\x0bhash_header\x18\x01 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x02 \x01(\x04\x12\x19\n\x11timestamp_seconds\x18\x03 \x01(\x04\x12\x18\n\x10hash_header_prev\x18\x04 \x01(\t\x12\x14\n\x0creward_block\x18\x05 \x01(\x04\x12\x12\n\nreward_fee\x18\x06 \x01(\x04\x12\x13\n\x0bmerkle_root\x18\x07 \x01(\t\x12\x14\n\x0cmining_nonce\x18\x08 \x01(\r\x12\x13\n\x0b\x65xtra_nonce\x18\t \x01(\x04\"\x93\x01\n\nPlainBlock\x12%\n\x06header\x18\x01 \x01(\x0b\x32\x15.qrl.PlainBlockHeader\x12+\n\x0ctransactions\x18\x02 \x03(\x0b\x32\x15.qrl.PlainTransaction\x12\x31\n\x0fgenesis_balance\x18\x03 \x03(\x0b\x32\x18.qrl.PlainGenesisBalance2\xf1\x0f\n\tWalletAPI\x12>\n\rAddNewAddress\x12\x15.qrl.AddNewAddressReq\x1a\x16.qrl.AddNewAddressResp\x12R\n\x17\x41\x64\x64NewAddressWithSlaves\x12\x1f.qrl.AddNewAddressWithSlavesReq\x1a\x16.qrl.AddNewAddressResp\x12>\n\rListAddresses\x12\x15.qrl.ListAddressesReq\x1a\x16.qrl.ListAddressesResp\x12>\n\rRemoveAddress\x12\x15.qrl.RemoveAddressReq\x1a\x16.qrl.RemoveAddressResp\x12=\n\x0eIsValidAddress\x12\x14.qrl.ValidAddressReq\x1a\x15.qrl.ValidAddressResp\x12>\n\rEncryptWallet\x12\x15.qrl.EncryptWalletReq\x1a\x16.qrl.EncryptWalletResp\x12\x35\n\nLockWallet\x12\x12.qrl.LockWalletReq\x1a\x13.qrl.LockWalletResp\x12;\n\x0cUnlockWallet\x12\x14.qrl.UnlockWalletReq\x1a\x15.qrl.UnlockWalletResp\x12G\n\x10GetRecoverySeeds\x12\x18.qrl.GetRecoverySeedsReq\x1a\x19.qrl.GetRecoverySeedsResp\x12>\n\rGetWalletInfo\x12\x15.qrl.GetWalletInfoReq\x1a\x16.qrl.GetWalletInfoResp\x12?\n\x10RelayTransferTxn\x12\x18.qrl.RelayTransferTxnReq\x1a\x11.qrl.RelayTxnResp\x12M\n\x17RelayTransferTxnBySlave\x12\x1f.qrl.RelayTransferTxnBySlaveReq\x1a\x11.qrl.RelayTxnResp\x12=\n\x0fRelayMessageTxn\x12\x17.qrl.RelayMessageTxnReq\x1a\x11.qrl.RelayTxnResp\x12K\n\x16RelayMessageTxnBySlave\x12\x1e.qrl.RelayMessageTxnBySlaveReq\x1a\x11.qrl.RelayTxnResp\x12\x39\n\rRelayTokenTxn\x12\x15.qrl.RelayTokenTxnReq\x1a\x11.qrl.RelayTxnResp\x12G\n\x14RelayTokenTxnBySlave\x12\x1c.qrl.RelayTokenTxnBySlaveReq\x1a\x11.qrl.RelayTxnResp\x12I\n\x15RelayTransferTokenTxn\x12\x1d.qrl.RelayTransferTokenTxnReq\x1a\x11.qrl.RelayTxnResp\x12W\n\x1cRelayTransferTokenTxnBySlave\x12$.qrl.RelayTransferTokenTxnBySlaveReq\x1a\x11.qrl.RelayTxnResp\x12\x39\n\rRelaySlaveTxn\x12\x15.qrl.RelaySlaveTxnReq\x1a\x11.qrl.RelayTxnResp\x12G\n\x14RelaySlaveTxnBySlave\x12\x1c.qrl.RelaySlaveTxnBySlaveReq\x1a\x11.qrl.RelayTxnResp\x12G\n\x10\x43hangePassphrase\x12\x18.qrl.ChangePassphraseReq\x1a\x19.qrl.ChangePassphraseResp\x12\x65\n\x1cGetMiniTransactionsByAddress\x12!.qrl.MiniTransactionsByAddressReq\x1a\".qrl.MiniTransactionsByAddressResp\x12;\n\x0eGetTransaction\x12\x13.qrl.TransactionReq\x1a\x14.qrl.TransactionResp\x12/\n\nGetBalance\x12\x0f.qrl.BalanceReq\x1a\x10.qrl.BalanceResp\x12>\n\x0fGetTotalBalance\x12\x14.qrl.TotalBalanceReq\x1a\x15.qrl.TotalBalanceResp\x12#\n\x06GetOTS\x12\x0b.qrl.OTSReq\x1a\x0c.qrl.OTSResp\x12,\n\tGetHeight\x12\x0e.qrl.HeightReq\x1a\x0f.qrl.HeightResp\x12)\n\x08GetBlock\x12\r.qrl.BlockReq\x1a\x0e.qrl.BlockResp\x12\x39\n\x10GetBlockByNumber\x12\x15.qrl.BlockByNumberReq\x1a\x0e.qrl.BlockResp\x12\x41\n\x10GetAddressFromPK\x12\x15.qrl.AddressFromPKReq\x1a\x16.qrl.AddressFromPKResp\x12\x32\n\x0bGetNodeInfo\x12\x10.qrl.NodeInfoReq\x1a\x11.qrl.NodeInfoRespb\x06proto3') + serialized_pb=_b('\n\x0fqrlwallet.proto\x12\x03qrl\x1a\tqrl.proto\"9\n\x10\x41\x64\x64NewAddressReq\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12\x15\n\rhash_function\x18\x02 \x01(\t\"A\n\x11\x41\x64\x64NewAddressResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x03 \x01(\t\"]\n\x1a\x41\x64\x64NewAddressWithSlavesReq\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12\x18\n\x10number_of_slaves\x18\x02 \x01(\x04\x12\x15\n\rhash_function\x18\x03 \x01(\t\"%\n\x15\x41\x64\x64\x41\x64\x64ressFromSeedReq\x12\x0c\n\x04seed\x18\x01 \x01(\t\"F\n\x16\x41\x64\x64\x41\x64\x64ressFromSeedResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x03 \x01(\t\"\x12\n\x10ListAddressesReq\"C\n\x11ListAddressesResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x11\n\taddresses\x18\x03 \x03(\t\"#\n\x10RemoveAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"0\n\x11RemoveAddressResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\"\n\x0fValidAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\">\n\x10ValidAddressResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\r\n\x05valid\x18\x03 \x01(\t\"&\n\x10\x45ncryptWalletReq\x12\x12\n\npassphrase\x18\x01 \x01(\t\"0\n\x11\x45ncryptWalletResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"%\n\x0fUnlockWalletReq\x12\x12\n\npassphrase\x18\x01 \x01(\t\"/\n\x10UnlockWalletResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x0f\n\rLockWalletReq\"-\n\x0eLockWalletResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"&\n\x13GetRecoverySeedsReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"V\n\x14GetRecoverySeedsResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07hexseed\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\"\x12\n\x10GetWalletInfoReq\"n\n\x11GetWalletInfoResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\r\x12\x15\n\raddress_count\x18\x04 \x01(\x04\x12\x14\n\x0cis_encrypted\x18\x05 \x01(\x08\"\x8c\x01\n\x13RelayTransferTxnReq\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x01 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x02 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x03 \x01(\x04\x12\x16\n\x0emaster_address\x18\x04 \x01(\t\x12\x16\n\x0esigner_address\x18\x05 \x01(\t\x12\x11\n\tots_index\x18\x06 \x01(\x04\"h\n\x1aRelayTransferTxnBySlaveReq\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x01 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x02 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x03 \x01(\x04\x12\x16\n\x0emaster_address\x18\x04 \x01(\t\"u\n\x12RelayMessageTxnReq\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0b\n\x03\x66\x65\x65\x18\x02 \x01(\x04\x12\x16\n\x0emaster_address\x18\x03 \x01(\t\x12\x16\n\x0esigner_address\x18\x04 \x01(\t\x12\x11\n\tots_index\x18\x05 \x01(\x04\"Q\n\x19RelayMessageTxnBySlaveReq\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0b\n\x03\x66\x65\x65\x18\x02 \x01(\x04\x12\x16\n\x0emaster_address\x18\x03 \x01(\t\"\xc5\x01\n\x10RelayTokenTxnReq\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05owner\x18\x03 \x01(\t\x12\x10\n\x08\x64\x65\x63imals\x18\x04 \x01(\x04\x12\x11\n\taddresses\x18\x05 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x06 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x07 \x01(\x04\x12\x16\n\x0emaster_address\x18\x08 \x01(\t\x12\x16\n\x0esigner_address\x18\t \x01(\t\x12\x11\n\tots_index\x18\n \x01(\x04\"\xa1\x01\n\x17RelayTokenTxnBySlaveReq\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05owner\x18\x03 \x01(\t\x12\x10\n\x08\x64\x65\x63imals\x18\x04 \x01(\x04\x12\x11\n\taddresses\x18\x05 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x06 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x07 \x01(\x04\x12\x16\n\x0emaster_address\x18\x08 \x01(\t\"\xa7\x01\n\x18RelayTransferTokenTxnReq\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x01 \x03(\t\x12\x14\n\x0ctoken_txhash\x18\x02 \x01(\t\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x04 \x01(\x04\x12\x16\n\x0emaster_address\x18\x05 \x01(\t\x12\x16\n\x0esigner_address\x18\x06 \x01(\t\x12\x11\n\tots_index\x18\x07 \x01(\x04\"\x83\x01\n\x1fRelayTransferTokenTxnBySlaveReq\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x01 \x03(\t\x12\x14\n\x0ctoken_txhash\x18\x02 \x01(\t\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x04 \x01(\x04\x12\x16\n\x0emaster_address\x18\x05 \x01(\t\"\x8b\x01\n\x10RelaySlaveTxnReq\x12\x11\n\tslave_pks\x18\x01 \x03(\x0c\x12\x14\n\x0c\x61\x63\x63\x65ss_types\x18\x02 \x03(\r\x12\x0b\n\x03\x66\x65\x65\x18\x03 \x01(\x04\x12\x16\n\x0emaster_address\x18\x04 \x01(\t\x12\x16\n\x0esigner_address\x18\x05 \x01(\t\x12\x11\n\tots_index\x18\x06 \x01(\x04\"g\n\x17RelaySlaveTxnBySlaveReq\x12\x11\n\tslave_pks\x18\x01 \x03(\x0c\x12\x14\n\x0c\x61\x63\x63\x65ss_types\x18\x02 \x03(\r\x12\x0b\n\x03\x66\x65\x65\x18\x03 \x01(\x04\x12\x16\n\x0emaster_address\x18\x04 \x01(\t\"N\n\x0cRelayTxnResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12!\n\x02tx\x18\x03 \x01(\x0b\x32\x15.qrl.PlainTransaction\"C\n\x13\x43hangePassphraseReq\x12\x15\n\roldPassphrase\x18\x01 \x01(\t\x12\x15\n\rnewPassphrase\x18\x02 \x01(\t\"3\n\x14\x43hangePassphraseResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"+\n\x18TransactionsByAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"z\n\x19TransactionsByAddressResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12/\n\x11mini_transactions\x18\x03 \x03(\x0b\x32\x14.qrl.MiniTransaction\x12\x0f\n\x07\x62\x61lance\x18\x04 \x01(\x04\"!\n\x0eTransactionReq\x12\x0f\n\x07tx_hash\x18\x01 \x01(\t\"\x99\x01\n\x0fTransactionResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12!\n\x02tx\x18\x03 \x01(\x0b\x32\x15.qrl.PlainTransaction\x12\x15\n\rconfirmations\x18\x04 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x05 \x01(\x04\x12\x19\n\x11\x62lock_header_hash\x18\x06 \x01(\t\"\x1d\n\nBalanceReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\";\n\x0b\x42\x61lanceResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07\x62\x61lance\x18\x03 \x01(\t\"\x11\n\x0fTotalBalanceReq\"@\n\x10TotalBalanceResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07\x62\x61lance\x18\x03 \x01(\t\"\x19\n\x06OTSReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\"\x9b\x01\n\x07OTSResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x34\n\x14ots_bitfield_by_page\x18\x03 \x03(\x0b\x32\x16.qrl.OTSBitfieldByPage\x12\x1d\n\x15next_unused_ots_index\x18\x04 \x01(\x04\x12\x1e\n\x16unused_ots_index_found\x18\x05 \x01(\x08\"\x0b\n\tHeightReq\"9\n\nHeightResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0e\n\x06height\x18\x03 \x01(\x04\"\x1f\n\x08\x42lockReq\x12\x13\n\x0bheader_hash\x18\x01 \x01(\t\"H\n\tBlockResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x1e\n\x05\x62lock\x18\x03 \x01(\x0b\x32\x0f.qrl.PlainBlock\"(\n\x10\x42lockByNumberReq\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\"\x1e\n\x10\x41\x64\x64ressFromPKReq\x12\n\n\x02pk\x18\x01 \x01(\t\"A\n\x11\x41\x64\x64ressFromPKResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x03 \x01(\t\"\r\n\x0bNodeInfoReq\"\xc1\x01\n\x0cNodeInfoResp\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x17\n\x0fnum_connections\x18\x04 \x01(\t\x12\x17\n\x0fnum_known_peers\x18\x05 \x01(\t\x12\x0e\n\x06uptime\x18\x06 \x01(\x04\x12\x14\n\x0c\x62lock_height\x18\x07 \x01(\x04\x12\x17\n\x0f\x62lock_last_hash\x18\x08 \x01(\t\x12\x12\n\nnetwork_id\x18\t \x01(\t\"7\n\x13PlainGenesisBalance\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\"5\n\x12PlainAddressAmount\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x04\"\xce\x07\n\x10PlainTransaction\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\t\x12\x0b\n\x03\x66\x65\x65\x18\x02 \x01(\x04\x12\x12\n\npublic_key\x18\x03 \x01(\t\x12\x11\n\tsignature\x18\x04 \x01(\t\x12\r\n\x05nonce\x18\x05 \x01(\x04\x12\x18\n\x10transaction_hash\x18\x06 \x01(\t\x12\x13\n\x0bsigner_addr\x18\x07 \x01(\t\x12\x32\n\x08transfer\x18\x08 \x01(\x0b\x32\x1e.qrl.PlainTransaction.TransferH\x00\x12\x32\n\x08\x63oinbase\x18\t \x01(\x0b\x32\x1e.qrl.PlainTransaction.CoinBaseH\x00\x12;\n\tlatticePK\x18\n \x01(\x0b\x32&.qrl.PlainTransaction.LatticePublicKeyH\x00\x12\x30\n\x07message\x18\x0b \x01(\x0b\x32\x1d.qrl.PlainTransaction.MessageH\x00\x12,\n\x05token\x18\x0c \x01(\x0b\x32\x1b.qrl.PlainTransaction.TokenH\x00\x12=\n\x0etransfer_token\x18\r \x01(\x0b\x32#.qrl.PlainTransaction.TransferTokenH\x00\x12,\n\x05slave\x18\x0e \x01(\x0b\x32\x1b.qrl.PlainTransaction.SlaveH\x00\x1a-\n\x08Transfer\x12\x10\n\x08\x61\x64\x64rs_to\x18\x01 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x02 \x03(\x04\x1a+\n\x08\x43oinBase\x12\x0f\n\x07\x61\x64\x64r_to\x18\x01 \x01(\t\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x04\x1a:\n\x10LatticePublicKey\x12\x10\n\x08kyber_pk\x18\x01 \x01(\t\x12\x14\n\x0c\x64ilithium_pk\x18\x02 \x01(\t\x1a\x1f\n\x07Message\x12\x14\n\x0cmessage_hash\x18\x01 \x01(\t\x1ay\n\x05Token\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05owner\x18\x03 \x01(\t\x12\x10\n\x08\x64\x65\x63imals\x18\x04 \x01(\x04\x12\x31\n\x10initial_balances\x18\x05 \x03(\x0b\x32\x17.qrl.PlainAddressAmount\x1aH\n\rTransferToken\x12\x14\n\x0ctoken_txhash\x18\x01 \x01(\t\x12\x10\n\x08\x61\x64\x64rs_to\x18\x02 \x03(\t\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x1a\x30\n\x05Slave\x12\x11\n\tslave_pks\x18\x01 \x03(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_types\x18\x02 \x03(\rB\x11\n\x0ftransactionType\"\xdc\x01\n\x10PlainBlockHeader\x12\x13\n\x0bhash_header\x18\x01 \x01(\t\x12\x14\n\x0c\x62lock_number\x18\x02 \x01(\x04\x12\x19\n\x11timestamp_seconds\x18\x03 \x01(\x04\x12\x18\n\x10hash_header_prev\x18\x04 \x01(\t\x12\x14\n\x0creward_block\x18\x05 \x01(\x04\x12\x12\n\nreward_fee\x18\x06 \x01(\x04\x12\x13\n\x0bmerkle_root\x18\x07 \x01(\t\x12\x14\n\x0cmining_nonce\x18\x08 \x01(\r\x12\x13\n\x0b\x65xtra_nonce\x18\t \x01(\x04\"\x93\x01\n\nPlainBlock\x12%\n\x06header\x18\x01 \x01(\x0b\x32\x15.qrl.PlainBlockHeader\x12+\n\x0ctransactions\x18\x02 \x03(\x0b\x32\x15.qrl.PlainTransaction\x12\x31\n\x0fgenesis_balance\x18\x03 \x03(\x0b\x32\x18.qrl.PlainGenesisBalance2\xe5\x0f\n\tWalletAPI\x12>\n\rAddNewAddress\x12\x15.qrl.AddNewAddressReq\x1a\x16.qrl.AddNewAddressResp\x12R\n\x17\x41\x64\x64NewAddressWithSlaves\x12\x1f.qrl.AddNewAddressWithSlavesReq\x1a\x16.qrl.AddNewAddressResp\x12>\n\rListAddresses\x12\x15.qrl.ListAddressesReq\x1a\x16.qrl.ListAddressesResp\x12>\n\rRemoveAddress\x12\x15.qrl.RemoveAddressReq\x1a\x16.qrl.RemoveAddressResp\x12=\n\x0eIsValidAddress\x12\x14.qrl.ValidAddressReq\x1a\x15.qrl.ValidAddressResp\x12>\n\rEncryptWallet\x12\x15.qrl.EncryptWalletReq\x1a\x16.qrl.EncryptWalletResp\x12\x35\n\nLockWallet\x12\x12.qrl.LockWalletReq\x1a\x13.qrl.LockWalletResp\x12;\n\x0cUnlockWallet\x12\x14.qrl.UnlockWalletReq\x1a\x15.qrl.UnlockWalletResp\x12G\n\x10GetRecoverySeeds\x12\x18.qrl.GetRecoverySeedsReq\x1a\x19.qrl.GetRecoverySeedsResp\x12>\n\rGetWalletInfo\x12\x15.qrl.GetWalletInfoReq\x1a\x16.qrl.GetWalletInfoResp\x12?\n\x10RelayTransferTxn\x12\x18.qrl.RelayTransferTxnReq\x1a\x11.qrl.RelayTxnResp\x12M\n\x17RelayTransferTxnBySlave\x12\x1f.qrl.RelayTransferTxnBySlaveReq\x1a\x11.qrl.RelayTxnResp\x12=\n\x0fRelayMessageTxn\x12\x17.qrl.RelayMessageTxnReq\x1a\x11.qrl.RelayTxnResp\x12K\n\x16RelayMessageTxnBySlave\x12\x1e.qrl.RelayMessageTxnBySlaveReq\x1a\x11.qrl.RelayTxnResp\x12\x39\n\rRelayTokenTxn\x12\x15.qrl.RelayTokenTxnReq\x1a\x11.qrl.RelayTxnResp\x12G\n\x14RelayTokenTxnBySlave\x12\x1c.qrl.RelayTokenTxnBySlaveReq\x1a\x11.qrl.RelayTxnResp\x12I\n\x15RelayTransferTokenTxn\x12\x1d.qrl.RelayTransferTokenTxnReq\x1a\x11.qrl.RelayTxnResp\x12W\n\x1cRelayTransferTokenTxnBySlave\x12$.qrl.RelayTransferTokenTxnBySlaveReq\x1a\x11.qrl.RelayTxnResp\x12\x39\n\rRelaySlaveTxn\x12\x15.qrl.RelaySlaveTxnReq\x1a\x11.qrl.RelayTxnResp\x12G\n\x14RelaySlaveTxnBySlave\x12\x1c.qrl.RelaySlaveTxnBySlaveReq\x1a\x11.qrl.RelayTxnResp\x12G\n\x10\x43hangePassphrase\x12\x18.qrl.ChangePassphraseReq\x1a\x19.qrl.ChangePassphraseResp\x12Y\n\x18GetTransactionsByAddress\x12\x1d.qrl.TransactionsByAddressReq\x1a\x1e.qrl.TransactionsByAddressResp\x12;\n\x0eGetTransaction\x12\x13.qrl.TransactionReq\x1a\x14.qrl.TransactionResp\x12/\n\nGetBalance\x12\x0f.qrl.BalanceReq\x1a\x10.qrl.BalanceResp\x12>\n\x0fGetTotalBalance\x12\x14.qrl.TotalBalanceReq\x1a\x15.qrl.TotalBalanceResp\x12#\n\x06GetOTS\x12\x0b.qrl.OTSReq\x1a\x0c.qrl.OTSResp\x12,\n\tGetHeight\x12\x0e.qrl.HeightReq\x1a\x0f.qrl.HeightResp\x12)\n\x08GetBlock\x12\r.qrl.BlockReq\x1a\x0e.qrl.BlockResp\x12\x39\n\x10GetBlockByNumber\x12\x15.qrl.BlockByNumberReq\x1a\x0e.qrl.BlockResp\x12\x41\n\x10GetAddressFromPK\x12\x15.qrl.AddressFromPKReq\x1a\x16.qrl.AddressFromPKResp\x12\x32\n\x0bGetNodeInfo\x12\x10.qrl.NodeInfoReq\x1a\x11.qrl.NodeInfoRespb\x06proto3') , dependencies=[qrl__pb2.DESCRIPTOR,]) @@ -1578,34 +1578,20 @@ ) -_MINITRANSACTIONSBYADDRESSREQ = _descriptor.Descriptor( - name='MiniTransactionsByAddressReq', - full_name='qrl.MiniTransactionsByAddressReq', +_TRANSACTIONSBYADDRESSREQ = _descriptor.Descriptor( + name='TransactionsByAddressReq', + full_name='qrl.TransactionsByAddressReq', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='address', full_name='qrl.MiniTransactionsByAddressReq.address', index=0, + name='address', full_name='qrl.TransactionsByAddressReq.address', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='item_per_page', full_name='qrl.MiniTransactionsByAddressReq.item_per_page', index=1, - number=2, type=4, cpp_type=4, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='page_number', full_name='qrl.MiniTransactionsByAddressReq.page_number', index=2, - number=3, type=4, cpp_type=4, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -1619,40 +1605,40 @@ oneofs=[ ], serialized_start=2713, - serialized_end=2804, + serialized_end=2756, ) -_MINITRANSACTIONSBYADDRESSRESP = _descriptor.Descriptor( - name='MiniTransactionsByAddressResp', - full_name='qrl.MiniTransactionsByAddressResp', +_TRANSACTIONSBYADDRESSRESP = _descriptor.Descriptor( + name='TransactionsByAddressResp', + full_name='qrl.TransactionsByAddressResp', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='code', full_name='qrl.MiniTransactionsByAddressResp.code', index=0, + name='code', full_name='qrl.TransactionsByAddressResp.code', index=0, number=1, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='error', full_name='qrl.MiniTransactionsByAddressResp.error', index=1, + name='error', full_name='qrl.TransactionsByAddressResp.error', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='mini_transactions', full_name='qrl.MiniTransactionsByAddressResp.mini_transactions', index=2, + name='mini_transactions', full_name='qrl.TransactionsByAddressResp.mini_transactions', index=2, number=3, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='balance', full_name='qrl.MiniTransactionsByAddressResp.balance', index=3, + name='balance', full_name='qrl.TransactionsByAddressResp.balance', index=3, number=4, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, @@ -1670,8 +1656,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2806, - serialized_end=2932, + serialized_start=2758, + serialized_end=2880, ) @@ -1701,8 +1687,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2934, - serialized_end=2967, + serialized_start=2882, + serialized_end=2915, ) @@ -1767,8 +1753,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2970, - serialized_end=3123, + serialized_start=2918, + serialized_end=3071, ) @@ -1798,8 +1784,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3125, - serialized_end=3154, + serialized_start=3073, + serialized_end=3102, ) @@ -1843,8 +1829,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3156, - serialized_end=3215, + serialized_start=3104, + serialized_end=3163, ) @@ -1867,8 +1853,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3217, - serialized_end=3234, + serialized_start=3165, + serialized_end=3182, ) @@ -1912,8 +1898,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3236, - serialized_end=3300, + serialized_start=3184, + serialized_end=3248, ) @@ -1943,8 +1929,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3302, - serialized_end=3327, + serialized_start=3250, + serialized_end=3275, ) @@ -2002,8 +1988,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3330, - serialized_end=3485, + serialized_start=3278, + serialized_end=3433, ) @@ -2026,8 +2012,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3487, - serialized_end=3498, + serialized_start=3435, + serialized_end=3446, ) @@ -2071,8 +2057,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3500, - serialized_end=3557, + serialized_start=3448, + serialized_end=3505, ) @@ -2102,8 +2088,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3559, - serialized_end=3590, + serialized_start=3507, + serialized_end=3538, ) @@ -2147,8 +2133,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3592, - serialized_end=3664, + serialized_start=3540, + serialized_end=3612, ) @@ -2178,8 +2164,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3666, - serialized_end=3706, + serialized_start=3614, + serialized_end=3654, ) @@ -2209,8 +2195,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3708, - serialized_end=3738, + serialized_start=3656, + serialized_end=3686, ) @@ -2254,8 +2240,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3740, - serialized_end=3805, + serialized_start=3688, + serialized_end=3753, ) @@ -2278,8 +2264,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3807, - serialized_end=3820, + serialized_start=3755, + serialized_end=3768, ) @@ -2365,8 +2351,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3823, - serialized_end=4016, + serialized_start=3771, + serialized_end=3964, ) @@ -2403,8 +2389,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4018, - serialized_end=4073, + serialized_start=3966, + serialized_end=4021, ) @@ -2441,8 +2427,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4075, - serialized_end=4128, + serialized_start=4023, + serialized_end=4076, ) @@ -2479,8 +2465,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4656, - serialized_end=4701, + serialized_start=4604, + serialized_end=4649, ) _PLAINTRANSACTION_COINBASE = _descriptor.Descriptor( @@ -2516,8 +2502,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4703, - serialized_end=4746, + serialized_start=4651, + serialized_end=4694, ) _PLAINTRANSACTION_LATTICEPUBLICKEY = _descriptor.Descriptor( @@ -2553,8 +2539,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4748, - serialized_end=4806, + serialized_start=4696, + serialized_end=4754, ) _PLAINTRANSACTION_MESSAGE = _descriptor.Descriptor( @@ -2583,8 +2569,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4808, - serialized_end=4839, + serialized_start=4756, + serialized_end=4787, ) _PLAINTRANSACTION_TOKEN = _descriptor.Descriptor( @@ -2641,8 +2627,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4841, - serialized_end=4962, + serialized_start=4789, + serialized_end=4910, ) _PLAINTRANSACTION_TRANSFERTOKEN = _descriptor.Descriptor( @@ -2685,8 +2671,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4964, - serialized_end=5036, + serialized_start=4912, + serialized_end=4984, ) _PLAINTRANSACTION_SLAVE = _descriptor.Descriptor( @@ -2722,8 +2708,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5038, - serialized_end=5086, + serialized_start=4986, + serialized_end=5034, ) _PLAINTRANSACTION = _descriptor.Descriptor( @@ -2846,8 +2832,8 @@ name='transactionType', full_name='qrl.PlainTransaction.transactionType', index=0, containing_type=None, fields=[]), ], - serialized_start=4131, - serialized_end=5105, + serialized_start=4079, + serialized_end=5053, ) @@ -2933,8 +2919,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5108, - serialized_end=5328, + serialized_start=5056, + serialized_end=5276, ) @@ -2978,12 +2964,12 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5331, - serialized_end=5478, + serialized_start=5279, + serialized_end=5426, ) _RELAYTXNRESP.fields_by_name['tx'].message_type = _PLAINTRANSACTION -_MINITRANSACTIONSBYADDRESSRESP.fields_by_name['mini_transactions'].message_type = qrl__pb2._MINITRANSACTION +_TRANSACTIONSBYADDRESSRESP.fields_by_name['mini_transactions'].message_type = qrl__pb2._MINITRANSACTION _TRANSACTIONRESP.fields_by_name['tx'].message_type = _PLAINTRANSACTION _OTSRESP.fields_by_name['ots_bitfield_by_page'].message_type = qrl__pb2._OTSBITFIELDBYPAGE _BLOCKRESP.fields_by_name['block'].message_type = _PLAINBLOCK @@ -3060,8 +3046,8 @@ DESCRIPTOR.message_types_by_name['RelayTxnResp'] = _RELAYTXNRESP DESCRIPTOR.message_types_by_name['ChangePassphraseReq'] = _CHANGEPASSPHRASEREQ DESCRIPTOR.message_types_by_name['ChangePassphraseResp'] = _CHANGEPASSPHRASERESP -DESCRIPTOR.message_types_by_name['MiniTransactionsByAddressReq'] = _MINITRANSACTIONSBYADDRESSREQ -DESCRIPTOR.message_types_by_name['MiniTransactionsByAddressResp'] = _MINITRANSACTIONSBYADDRESSRESP +DESCRIPTOR.message_types_by_name['TransactionsByAddressReq'] = _TRANSACTIONSBYADDRESSREQ +DESCRIPTOR.message_types_by_name['TransactionsByAddressResp'] = _TRANSACTIONSBYADDRESSRESP DESCRIPTOR.message_types_by_name['TransactionReq'] = _TRANSACTIONREQ DESCRIPTOR.message_types_by_name['TransactionResp'] = _TRANSACTIONRESP DESCRIPTOR.message_types_by_name['BalanceReq'] = _BALANCEREQ @@ -3324,19 +3310,19 @@ )) _sym_db.RegisterMessage(ChangePassphraseResp) -MiniTransactionsByAddressReq = _reflection.GeneratedProtocolMessageType('MiniTransactionsByAddressReq', (_message.Message,), dict( - DESCRIPTOR = _MINITRANSACTIONSBYADDRESSREQ, +TransactionsByAddressReq = _reflection.GeneratedProtocolMessageType('TransactionsByAddressReq', (_message.Message,), dict( + DESCRIPTOR = _TRANSACTIONSBYADDRESSREQ, __module__ = 'qrlwallet_pb2' - # @@protoc_insertion_point(class_scope:qrl.MiniTransactionsByAddressReq) + # @@protoc_insertion_point(class_scope:qrl.TransactionsByAddressReq) )) -_sym_db.RegisterMessage(MiniTransactionsByAddressReq) +_sym_db.RegisterMessage(TransactionsByAddressReq) -MiniTransactionsByAddressResp = _reflection.GeneratedProtocolMessageType('MiniTransactionsByAddressResp', (_message.Message,), dict( - DESCRIPTOR = _MINITRANSACTIONSBYADDRESSRESP, +TransactionsByAddressResp = _reflection.GeneratedProtocolMessageType('TransactionsByAddressResp', (_message.Message,), dict( + DESCRIPTOR = _TRANSACTIONSBYADDRESSRESP, __module__ = 'qrlwallet_pb2' - # @@protoc_insertion_point(class_scope:qrl.MiniTransactionsByAddressResp) + # @@protoc_insertion_point(class_scope:qrl.TransactionsByAddressResp) )) -_sym_db.RegisterMessage(MiniTransactionsByAddressResp) +_sym_db.RegisterMessage(TransactionsByAddressResp) TransactionReq = _reflection.GeneratedProtocolMessageType('TransactionReq', (_message.Message,), dict( DESCRIPTOR = _TRANSACTIONREQ, @@ -3556,8 +3542,8 @@ file=DESCRIPTOR, index=0, options=None, - serialized_start=5481, - serialized_end=7514, + serialized_start=5429, + serialized_end=7450, methods=[ _descriptor.MethodDescriptor( name='AddNewAddress', @@ -3749,12 +3735,12 @@ options=None, ), _descriptor.MethodDescriptor( - name='GetMiniTransactionsByAddress', - full_name='qrl.WalletAPI.GetMiniTransactionsByAddress', + name='GetTransactionsByAddress', + full_name='qrl.WalletAPI.GetTransactionsByAddress', index=21, containing_service=None, - input_type=_MINITRANSACTIONSBYADDRESSREQ, - output_type=_MINITRANSACTIONSBYADDRESSRESP, + input_type=_TRANSACTIONSBYADDRESSREQ, + output_type=_TRANSACTIONSBYADDRESSRESP, options=None, ), _descriptor.MethodDescriptor( diff --git a/src/qrl/generated/qrlwallet_pb2_grpc.py b/src/qrl/generated/qrlwallet_pb2_grpc.py index 1a5ca73a4..d63f2eaac 100644 --- a/src/qrl/generated/qrlwallet_pb2_grpc.py +++ b/src/qrl/generated/qrlwallet_pb2_grpc.py @@ -127,10 +127,10 @@ def __init__(self, channel): request_serializer=qrlwallet__pb2.ChangePassphraseReq.SerializeToString, response_deserializer=qrlwallet__pb2.ChangePassphraseResp.FromString, ) - self.GetMiniTransactionsByAddress = channel.unary_unary( - '/qrl.WalletAPI/GetMiniTransactionsByAddress', - request_serializer=qrlwallet__pb2.MiniTransactionsByAddressReq.SerializeToString, - response_deserializer=qrlwallet__pb2.MiniTransactionsByAddressResp.FromString, + self.GetTransactionsByAddress = channel.unary_unary( + '/qrl.WalletAPI/GetTransactionsByAddress', + request_serializer=qrlwallet__pb2.TransactionsByAddressReq.SerializeToString, + response_deserializer=qrlwallet__pb2.TransactionsByAddressResp.FromString, ) self.GetTransaction = channel.unary_unary( '/qrl.WalletAPI/GetTransaction', @@ -319,7 +319,7 @@ def ChangePassphrase(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') - def GetMiniTransactionsByAddress(self, request, context): + def GetTransactionsByAddress(self, request, context): # missing associated documentation comment in .proto file context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') @@ -487,10 +487,10 @@ def add_WalletAPIServicer_to_server(servicer, server): request_deserializer=qrlwallet__pb2.ChangePassphraseReq.FromString, response_serializer=qrlwallet__pb2.ChangePassphraseResp.SerializeToString, ), - 'GetMiniTransactionsByAddress': grpc.unary_unary_rpc_method_handler( - servicer.GetMiniTransactionsByAddress, - request_deserializer=qrlwallet__pb2.MiniTransactionsByAddressReq.FromString, - response_serializer=qrlwallet__pb2.MiniTransactionsByAddressResp.SerializeToString, + 'GetTransactionsByAddress': grpc.unary_unary_rpc_method_handler( + servicer.GetTransactionsByAddress, + request_deserializer=qrlwallet__pb2.TransactionsByAddressReq.FromString, + response_serializer=qrlwallet__pb2.TransactionsByAddressResp.SerializeToString, ), 'GetTransaction': grpc.unary_unary_rpc_method_handler( servicer.GetTransaction, diff --git a/src/qrl/protos/qrlwallet.proto b/src/qrl/protos/qrlwallet.proto index 865a0f252..876d21115 100644 --- a/src/qrl/protos/qrlwallet.proto +++ b/src/qrl/protos/qrlwallet.proto @@ -62,7 +62,7 @@ service WalletAPI rpc ChangePassphrase(ChangePassphraseReq) returns (ChangePassphraseResp); - rpc GetMiniTransactionsByAddress(MiniTransactionsByAddressReq) returns (MiniTransactionsByAddressResp); + rpc GetTransactionsByAddress(TransactionsByAddressReq) returns (TransactionsByAddressResp); rpc GetTransaction(TransactionReq) returns (TransactionResp); @@ -294,13 +294,11 @@ message ChangePassphraseResp { string error = 2; } -message MiniTransactionsByAddressReq { +message TransactionsByAddressReq { string address = 1; - uint64 item_per_page = 2; - uint64 page_number = 3; } -message MiniTransactionsByAddressResp { +message TransactionsByAddressResp { uint32 code = 1; string error = 2; repeated MiniTransaction mini_transactions = 3; diff --git a/src/qrl/services/WalletAPIService.py b/src/qrl/services/WalletAPIService.py index a036f55cc..d74ab7676 100644 --- a/src/qrl/services/WalletAPIService.py +++ b/src/qrl/services/WalletAPIService.py @@ -323,17 +323,15 @@ def ChangePassphrase(self, return resp - @GrpcExceptionWrapper(qrlwallet_pb2.MiniTransactionsByAddressResp) - def GetMiniTransactionsByAddress(self, - request: qrlwallet_pb2.MiniTransactionsByAddressReq, - context) -> qrlwallet_pb2.MiniTransactionsByAddressResp: - resp = qrlwallet_pb2.MiniTransactionsByAddressResp() - try: - mini_transactions, balance = self._walletd.get_mini_transactions_by_address( - request.address, - request.item_per_page, - request.page_number - ) + @GrpcExceptionWrapper(qrlwallet_pb2.TransactionsByAddressResp) + def GetTransactionsByAddress(self, + request: qrlwallet_pb2.TransactionsByAddressReq, + context) -> qrlwallet_pb2.TransactionsByAddressResp: + resp = qrlwallet_pb2.TransactionsByAddressResp() + try: + mini_transactions, balance = self._walletd.get_mini_transactions_by_address(qaddress=request.address, + item_per_page=1000000, + page_number=1) resp.mini_transactions.extend(mini_transactions) resp.balance = balance except Exception as e: From d8680f3296079e8df60ed6f0608cf405c0f83ff8 Mon Sep 17 00:00:00 2001 From: cyyber Date: Wed, 11 Mar 2020 15:29:29 +0530 Subject: [PATCH 09/23] Codacy Fix --- src/qrl/daemon/walletd.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/qrl/daemon/walletd.py b/src/qrl/daemon/walletd.py index a12eb1e57..89847d080 100644 --- a/src/qrl/daemon/walletd.py +++ b/src/qrl/daemon/walletd.py @@ -418,9 +418,7 @@ def get_slave(self, master_qaddress): return index, group_index, len(item.slaves[group_index]) - 1, xmss group_index = len(item.slaves) - 1 last_slaves = item.slaves[-1] - for slave_index in range(len(last_slaves)): - slave = last_slaves[slave_index] - + for slave_index, slave in enumerate(last_slaves): # Check if all ots index has been marked as used if slave.index > 2 ** slave.height - 1: continue From 73ea9ac796c09c86c5215a38449ddcabf8093850 Mon Sep 17 00:00:00 2001 From: cyyber Date: Thu, 12 Mar 2020 13:02:20 +0530 Subject: [PATCH 10/23] Unit test updated for WalletD and WalletAPIService --- tests/daemon/test_walletd.py | 212 +++++++----------------- tests/services/test_WalletAPIService.py | 49 +++--- 2 files changed, 79 insertions(+), 182 deletions(-) diff --git a/tests/daemon/test_walletd.py b/tests/daemon/test_walletd.py index b9e45ab56..97ea7d08e 100644 --- a/tests/daemon/test_walletd.py +++ b/tests/daemon/test_walletd.py @@ -1,8 +1,6 @@ # coding=utf-8 # Distributed under the MIT software license, see the accompanying # file LICENSE or http://www.opensource.org/licenses/mit-license.php. -import grpc -from concurrent.futures import ThreadPoolExecutor from unittest import TestCase from mock import Mock @@ -10,18 +8,13 @@ from qrl.daemon.walletd import WalletD from qrl.generated import qrl_pb2 -from qrl.core import config -from qrl.core.State import State -from qrl.core.qrlnode import QRLNode -from qrl.generated.qrl_pb2_grpc import add_PublicAPIServicer_to_server -from qrl.services.PublicAPIService import PublicAPIService -from qrl.core.ChainManager import ChainManager from qrl.core.AddressState import AddressState from qrl.core.txs.TransferTransaction import TransferTransaction from qrl.core.txs.MessageTransaction import MessageTransaction from qrl.daemon.helper.DaemonHelper import WalletDecryptionError from qrl.core.misc import logger from tests.misc.helper import set_qrl_dir, get_alice_xmss, get_bob_xmss +from tests.misc.MockHelper.mock_function import MockFunction logger.initialize_default() @@ -101,170 +94,110 @@ def test_is_slave(self): self.assertTrue(walletd.is_slave(walletd.qaddress_to_address(qaddress), walletd.qaddress_to_address(qaddress))) def test_get_slave(self): - with set_qrl_dir("wallet_ver1") and set_qrl_dir('no_data'): - state = State() - chain_manager = ChainManager(state) - qrl_node = QRLNode(mining_address=b'') - qrl_node.set_chain_manager(chain_manager) - - public_api_server = grpc.server(ThreadPoolExecutor(max_workers=1), maximum_concurrent_rpcs=1) - - add_PublicAPIServicer_to_server(PublicAPIService(qrl_node), public_api_server) - public_api_server.add_insecure_port("{0}:{1}".format(config.user.public_api_host, - config.user.public_api_port)) - public_api_server.start() - + with set_qrl_dir("wallet_ver1"): walletd = WalletD() + m = MockFunction() + walletd.get_address_state = m.get walletd._public_stub.PushTransaction = Mock( return_value=qrl_pb2.PushTransactionResp(error_code=qrl_pb2.PushTransactionResp.SUBMITTED)) qaddress = walletd.add_new_address_with_slaves(height=10) - master_address = walletd.qaddress_to_address(qaddress) walletd.encrypt_wallet(self.passphrase) walletd.unlock_wallet(self.passphrase) - slaves = walletd.get_slave_list(qaddress) + master_addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + m.put(qaddress, master_addr_state) - state_container = chain_manager.new_state_container({master_address, - walletd.qaddress_to_address(slaves[0][0].qaddress), - walletd.qaddress_to_address(slaves[0][1].qaddress), - walletd.qaddress_to_address(slaves[0][2].qaddress)}, - 5, - True, - None) - - state_container.slaves.data[(master_address, - bytes(hstr2bin(slaves[0][0].pk)))] = qrl_pb2.SlaveMetadata(access_type=0, - tx_hash=b'txhash0') - state_container.slaves.data[(master_address, - bytes(hstr2bin(slaves[0][1].pk)))] = qrl_pb2.SlaveMetadata(access_type=0, - tx_hash=b'txhash0') - state_container.slaves.data[(master_address, - bytes(hstr2bin(slaves[0][2].pk)))] = qrl_pb2.SlaveMetadata(access_type=0, - tx_hash=b'txhash0') - state_container.slaves.put(None) + slaves = walletd.get_slave_list(qaddress) self.assertEqual(len(slaves), 1) self.assertEqual(len(slaves[0]), 3) + master_addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) + master_addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][1].pk)), 0) + master_addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][2].pk)), 0) + slave00_addr_state = AddressState.get_default(walletd.qaddress_to_address(slaves[0][0].qaddress)) + slave01_addr_state = AddressState.get_default(walletd.qaddress_to_address(slaves[0][1].qaddress)) + slave02_addr_state = AddressState.get_default(walletd.qaddress_to_address(slaves[0][2].qaddress)) + self.assertEqual(slaves[0][0].index, 0) for i in range(0, 1024): - state_container.paginated_bitfield.set_ots_key(state_container.addresses_state, - walletd.qaddress_to_address(slaves[0][0].qaddress), - i) + slave00_addr_state.set_ots_key(i) walletd._wallet.set_slave_ots_index(0, 0, 0, 1020) + m.put(slaves[0][0].qaddress, slave00_addr_state) self.assertEqual(slaves[0][1].index, 0) for i in range(0, 1024): - state_container.paginated_bitfield.set_ots_key(state_container.addresses_state, - walletd.qaddress_to_address(slaves[0][1].qaddress), - i) + slave01_addr_state.set_ots_key(i) walletd._wallet.set_slave_ots_index(0, 0, 1, 1020) + m.put(slaves[0][1].qaddress, slave01_addr_state) self.assertEqual(slaves[0][2].index, 5) for i in range(5, 1000): - state_container.paginated_bitfield.set_ots_key(state_container.addresses_state, - walletd.qaddress_to_address(slaves[0][2].qaddress), - i) + slave02_addr_state.set_ots_key(i) walletd._wallet.set_slave_ots_index(0, 0, 2, 1018) - - state_container.paginated_bitfield.put_addresses_bitfield(None) - AddressState.put_addresses_state(state, state_container.addresses_state) + m.put(slaves[0][2].qaddress, slave02_addr_state) walletd.get_slave(qaddress) slaves = walletd.get_slave_list(qaddress) self.assertEqual(len(slaves), 2) walletd._wallet.set_slave_ots_index(0, 0, 2, 1019) - state_container = chain_manager.new_state_container({master_address, - walletd.qaddress_to_address(slaves[1][0].qaddress), - walletd.qaddress_to_address(slaves[1][1].qaddress), - walletd.qaddress_to_address(slaves[1][2].qaddress)}, - 5, - True, - None) - - state_container.slaves.data[(master_address, - bytes(hstr2bin(slaves[1][0].pk)))] = qrl_pb2.SlaveMetadata(access_type=0, - tx_hash=b'txhash1') - state_container.slaves.data[(master_address, - bytes(hstr2bin(slaves[1][1].pk)))] = qrl_pb2.SlaveMetadata(access_type=0, - tx_hash=b'txhash1') - state_container.slaves.data[(master_address, - bytes(hstr2bin(slaves[1][2].pk)))] = qrl_pb2.SlaveMetadata(access_type=0, - tx_hash=b'txhash1') - state_container.slaves.put(None) + master_addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[1][0].pk)), 0) + master_addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[1][1].pk)), 0) + master_addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[1][2].pk)), 0) + slave10_addr_state = AddressState.get_default(walletd.qaddress_to_address(slaves[1][0].qaddress)) + slave11_addr_state = AddressState.get_default(walletd.qaddress_to_address(slaves[1][1].qaddress)) + slave12_addr_state = AddressState.get_default(walletd.qaddress_to_address(slaves[1][2].qaddress)) self.assertEqual(slaves[1][0].index, 0) for i in range(0, 1024): - state_container.paginated_bitfield.set_ots_key(state_container.addresses_state, - walletd.qaddress_to_address(slaves[1][0].qaddress), - i) + slave10_addr_state.set_ots_key(i) walletd._wallet.set_slave_ots_index(0, 1, 0, 1020) + m.put(slaves[1][0].qaddress, slave10_addr_state) self.assertEqual(slaves[1][1].index, 0) for i in range(0, 1024): - state_container.paginated_bitfield.set_ots_key(state_container.addresses_state, - walletd.qaddress_to_address(slaves[1][1].qaddress), - i) + slave11_addr_state.set_ots_key(i) walletd._wallet.set_slave_ots_index(0, 1, 1, 1020) + m.put(slaves[1][1].qaddress, slave11_addr_state) self.assertEqual(slaves[1][2].index, 5) for i in range(5, 1000): - state_container.paginated_bitfield.set_ots_key(state_container.addresses_state, - walletd.qaddress_to_address(slaves[1][2].qaddress), - i) + slave12_addr_state.set_ots_key(i) walletd._wallet.set_slave_ots_index(0, 1, 2, 1018) - state_container.paginated_bitfield.put_addresses_bitfield(None) - AddressState.put_addresses_state(state, state_container.addresses_state) + m.put(slaves[1][2].qaddress, slave12_addr_state) walletd.get_slave(qaddress) slaves = walletd.get_slave_list(qaddress) self.assertEqual(len(slaves), 3) walletd._wallet.set_slave_ots_index(0, 1, 2, 1019) - state_container = chain_manager.new_state_container({master_address, - walletd.qaddress_to_address(slaves[2][0].qaddress), - walletd.qaddress_to_address(slaves[2][1].qaddress), - walletd.qaddress_to_address(slaves[2][2].qaddress)}, - 5, - True, - None) - - state_container.slaves.data[(master_address, - bytes(hstr2bin(slaves[2][0].pk)))] = qrl_pb2.SlaveMetadata(access_type=0, - tx_hash=b'txhash2') - state_container.slaves.data[(master_address, - bytes(hstr2bin(slaves[2][1].pk)))] = qrl_pb2.SlaveMetadata(access_type=0, - tx_hash=b'txhash2') - state_container.slaves.data[(master_address, - bytes(hstr2bin(slaves[2][2].pk)))] = qrl_pb2.SlaveMetadata(access_type=0, - tx_hash=b'txhash2') - state_container.slaves.put(None) + master_addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[2][0].pk)), 0) + master_addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[2][1].pk)), 0) + master_addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[2][2].pk)), 0) + slave20_addr_state = AddressState.get_default(walletd.qaddress_to_address(slaves[2][0].qaddress)) + slave21_addr_state = AddressState.get_default(walletd.qaddress_to_address(slaves[2][1].qaddress)) + slave22_addr_state = AddressState.get_default(walletd.qaddress_to_address(slaves[2][2].qaddress)) self.assertEqual(slaves[2][0].index, 0) for i in range(0, 1024): - state_container.paginated_bitfield.set_ots_key(state_container.addresses_state, - walletd.qaddress_to_address(slaves[2][0].qaddress), - i) + slave20_addr_state.set_ots_key(i) walletd._wallet.set_slave_ots_index(0, 2, 0, 1020) + m.put(slaves[2][0].qaddress, slave20_addr_state) self.assertEqual(slaves[2][1].index, 0) for i in range(0, 1024): - state_container.paginated_bitfield.set_ots_key(state_container.addresses_state, - walletd.qaddress_to_address(slaves[2][1].qaddress), - i) + slave21_addr_state.set_ots_key(i) walletd._wallet.set_slave_ots_index(0, 2, 1, 1020) + m.put(slaves[2][1].qaddress, slave21_addr_state) self.assertEqual(slaves[2][2].index, 5) for i in range(5, 1000): - state_container.paginated_bitfield.set_ots_key(state_container.addresses_state, - walletd.qaddress_to_address(slaves[2][2].qaddress), - i) + slave22_addr_state.set_ots_key(i) walletd._wallet.set_slave_ots_index(0, 2, 2, 1018) - state_container.paginated_bitfield.put_addresses_bitfield(None) - AddressState.put_addresses_state(state, state_container.addresses_state) + m.put(slaves[2][2].qaddress, slave22_addr_state) walletd.get_slave(qaddress) slaves = walletd.get_slave_list(qaddress) @@ -560,15 +493,12 @@ def test_relay_transfer_txn_by_slave(self): walletd._public_stub.PushTransaction = Mock( return_value=qrl_pb2.PushTransactionResp(error_code=qrl_pb2.PushTransactionResp.SUBMITTED)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) qaddress = walletd.add_new_address_with_slaves(height=8) addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) @@ -588,15 +518,12 @@ def test_relay_transfer_txn2_by_slave(self): walletd = WalletD() walletd._public_stub.PushTransaction = Mock( return_value=qrl_pb2.PushTransactionResp(error_code=qrl_pb2.PushTransactionResp.SUBMITTED)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) qaddress = walletd.add_new_address_with_slaves(height=8) addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) @@ -683,16 +610,12 @@ def test_relay_message_txn_by_slave(self): walletd = WalletD() walletd._public_stub.PushTransaction = Mock( return_value=qrl_pb2.PushTransactionResp(error_code=qrl_pb2.PushTransactionResp.SUBMITTED)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) qaddress = walletd.add_new_address_with_slaves(height=8) addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) - # addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) @@ -739,15 +662,12 @@ def test_relay_message_txn2_by_slave(self): walletd = WalletD() walletd._public_stub.PushTransaction = Mock( return_value=qrl_pb2.PushTransactionResp(error_code=qrl_pb2.PushTransactionResp.SUBMITTED)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) qaddress = walletd.add_new_address_with_slaves(height=8) addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) @@ -804,12 +724,9 @@ def test_relay_token_txn_by_slave(self): return_value=qrl_pb2.PushTransactionResp(error_code=qrl_pb2.PushTransactionResp.SUBMITTED)) qaddress = walletd.add_new_address_with_slaves(height=8) addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) + slaves = walletd.get_slave_list(qaddress) + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) @@ -881,15 +798,12 @@ def test_relay_token_txn2_by_slave(self): walletd = WalletD() walletd._public_stub.PushTransaction = Mock( return_value=qrl_pb2.PushTransactionResp(error_code=qrl_pb2.PushTransactionResp.SUBMITTED)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) qaddress = walletd.add_new_address_with_slaves(height=8) addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) @@ -1020,15 +934,12 @@ def test_relay_transfer_token_txn_by_slave(self): walletd = WalletD() walletd._public_stub.PushTransaction = Mock( return_value=qrl_pb2.PushTransactionResp(error_code=qrl_pb2.PushTransactionResp.SUBMITTED)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) qaddress = walletd.add_new_address_with_slaves(height=8) addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) @@ -1101,15 +1012,12 @@ def test_relay_slave_txn_by_slave(self): walletd = WalletD() walletd._public_stub.PushTransaction = Mock( return_value=qrl_pb2.PushTransactionResp(error_code=qrl_pb2.PushTransactionResp.SUBMITTED)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) qaddress = walletd.add_new_address_with_slaves(height=8) addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) diff --git a/tests/services/test_WalletAPIService.py b/tests/services/test_WalletAPIService.py index 15140aebf..090520881 100644 --- a/tests/services/test_WalletAPIService.py +++ b/tests/services/test_WalletAPIService.py @@ -175,13 +175,11 @@ def test_relayTransferTxnBySlave(self): resp = service.AddNewAddressWithSlaves(qrlwallet_pb2.AddNewAddressWithSlavesReq(), context=None) qaddress = resp.address addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) alice_xmss = get_alice_xmss(4) bob_xmss = get_bob_xmss(4) @@ -234,13 +232,12 @@ def test_relayMessageTxnBySlave(self): resp = service.AddNewAddressWithSlaves(qrlwallet_pb2.AddNewAddressWithSlavesReq(), context=None) qaddress = resp.address addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) + walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) resp = service.RelayMessageTxnBySlave( qrlwallet_pb2.RelayMessageTxnReq(message=b'Hello QRL!', @@ -299,13 +296,11 @@ def test_relayTokenTxnBySlave(self): resp = service.AddNewAddressWithSlaves(qrlwallet_pb2.AddNewAddressWithSlavesReq(), context=None) qaddress = resp.address addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) alice_xmss = get_alice_xmss(4) bob_xmss = get_bob_xmss(4) @@ -371,13 +366,11 @@ def test_relayTransferTokenTxnBySlave(self): resp = service.AddNewAddressWithSlaves(qrlwallet_pb2.AddNewAddressWithSlavesReq(), context=None) qaddress = resp.address addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) alice_xmss = get_alice_xmss(4) bob_xmss = get_bob_xmss(4) @@ -438,13 +431,11 @@ def test_relaySlaveTxnBySlave(self): resp = service.AddNewAddressWithSlaves(qrlwallet_pb2.AddNewAddressWithSlavesReq(), context=None) qaddress = resp.address addr_state = AddressState.get_default(walletd.qaddress_to_address(qaddress)) + slaves = walletd.get_slave_list(qaddress) + + addr_state.add_slave_pks_access_type(bytes(hstr2bin(slaves[0][0].pk)), 0) walletd._public_stub.GetAddressState = Mock( return_value=qrl_pb2.GetAddressStateResp(state=addr_state.pbdata)) - walletd._public_stub.IsSlave = Mock( - return_value=qrl_pb2.IsSlaveResp(result=True)) - walletd._public_stub.GetOTS = Mock( - return_value=qrl_pb2.GetOTSResp(next_unused_ots_index=0, - unused_ots_index_found=True)) alice_xmss = get_alice_xmss(4) slave_pks = [alice_xmss.pk] @@ -577,7 +568,7 @@ def test_changePassphrase(self): resp = service.UnlockWallet(qrlwallet_pb2.UnlockWalletReq(passphrase=new_passphrase), context=None) self.assertEqual(resp.code, 0) - def test_getMiniTransactionsByAddress(self): + def test_getTransactionsByAddress(self): with set_qrl_dir("wallet_ver1"): walletd = WalletD() service = WalletAPIService(walletd) @@ -586,10 +577,8 @@ def test_getMiniTransactionsByAddress(self): return_value=qrl_pb2.GetMiniTransactionsByAddressResp(mini_transactions=[], balance=0)) - resp = service.GetMiniTransactionsByAddress( - qrlwallet_pb2.MiniTransactionsByAddressReq(address=get_alice_xmss(4).qaddress, - item_per_page=10, - page_number=1), context=None) + resp = service.GetTransactionsByAddress( + qrlwallet_pb2.TransactionsByAddressReq(address=get_alice_xmss(4).qaddress), context=None) self.assertEqual(resp.code, 0) self.assertEqual(len(resp.mini_transactions), 0) From 951cb24705ddbe262d10ab6804ea979b7799e486 Mon Sep 17 00:00:00 2001 From: cyyber Date: Fri, 13 Mar 2020 10:58:56 +0530 Subject: [PATCH 11/23] Fork Recovery Fix --- src/qrl/core/VoteStats.py | 2 +- src/qrl/core/txs/LatticeTransaction.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qrl/core/VoteStats.py b/src/qrl/core/VoteStats.py index facc4a628..88b0692f6 100644 --- a/src/qrl/core/VoteStats.py +++ b/src/qrl/core/VoteStats.py @@ -233,7 +233,7 @@ def revert(self, addr_to = multi_sig_spend.addrs_to[index] address_state = addresses_state[addr_to] if addr_to not in (multi_sig_spend.addr_from, addr_from_pk): - paginated_tx_hash.insert(address_state, multi_sig_spend.txhash) + paginated_tx_hash.remove(address_state, multi_sig_spend.txhash) address_state.update_balance(state_container, multi_sig_spend.amounts[index], subtract=True) self._data.executed = False diff --git a/src/qrl/core/txs/LatticeTransaction.py b/src/qrl/core/txs/LatticeTransaction.py index cd5921a41..7fc7be15a 100644 --- a/src/qrl/core/txs/LatticeTransaction.py +++ b/src/qrl/core/txs/LatticeTransaction.py @@ -113,7 +113,7 @@ def revert(self, address_state = state_container.addresses_state[self.addr_from] address_state.update_balance(state_container, self.fee) state_container.paginated_lattice_pk.remove(address_state, self.txhash) - state_container.paginated_tx_hash.remmove(address_state, self.txhash) + state_container.paginated_tx_hash.remove(address_state, self.txhash) state_container.lattice_pk.data[(self.addr_from, self.pk1, self.pk2, self.pk3)] = LatticePKMetadata(enabled=False) From 53ab289608e22c8b63a6aa49f1726b6c73e36776 Mon Sep 17 00:00:00 2001 From: cyyber Date: Fri, 13 Mar 2020 16:40:03 +0530 Subject: [PATCH 12/23] Remove token hash when token balance becomes 0 while reverting TransferTokenTransaction --- src/qrl/core/txs/TransferTokenTransaction.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qrl/core/txs/TransferTokenTransaction.py b/src/qrl/core/txs/TransferTokenTransaction.py index 378e69f57..22c6b6d77 100644 --- a/src/qrl/core/txs/TransferTokenTransaction.py +++ b/src/qrl/core/txs/TransferTokenTransaction.py @@ -193,6 +193,8 @@ def revert(self, address_state = state_container.addresses_state[addr_to] state_container.tokens.data[(addr_to, self.token_txhash)].balance -= amount + if state_container.tokens.data[(addr_to, self.token_txhash)].balance == 0: + state_container.paginated_tokens_hash.remove(address_state, self.token_txhash) if self.addr_from != addr_to: state_container.paginated_tx_hash.remove(address_state, self.txhash) From 9f669a0a1b71286ec8f8b0b552206ef12bf7279f Mon Sep 17 00:00:00 2001 From: cyyber Date: Fri, 13 Mar 2020 16:54:42 +0530 Subject: [PATCH 13/23] Updated Unit Tests --- tests/core/txs/test_TransferTokenTransactionStateChanges.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/core/txs/test_TransferTokenTransactionStateChanges.py b/tests/core/txs/test_TransferTokenTransactionStateChanges.py index 8cb7be9ea..0f32ba0d8 100644 --- a/tests/core/txs/test_TransferTokenTransactionStateChanges.py +++ b/tests/core/txs/test_TransferTokenTransactionStateChanges.py @@ -157,7 +157,6 @@ def test_revert_transfer_token_txn(self): addresses_state[self.bob.address].pbdata.balance = 0 tokens = Indexer(b'token', None) tokens.data[(self.alice.address, tx.token_txhash)] = TokenBalance(balance=1000) - tokens.data[(self.bob.address, tx.token_txhash)] = TokenBalance(balance=0) state_container = StateContainer(addresses_state=addresses_state, tokens=tokens, slaves=Indexer(b'slave', None), @@ -200,8 +199,6 @@ def test_revert_transfer_token_txn_multi_send(self): addresses_state[slave.address] = OptimizedAddressState.get_default(slave.address) tokens = Indexer(b'token', None) tokens.data[(self.alice.address, tx.token_txhash)] = TokenBalance(balance=1100) - tokens.data[(self.bob.address, tx.token_txhash)] = TokenBalance(balance=0) - tokens.data[(slave.address, tx.token_txhash)] = TokenBalance(balance=0) state_container = StateContainer(addresses_state=addresses_state, tokens=tokens, @@ -239,7 +236,6 @@ def test_revert_transfer_token_txn_empty_addresses_state(self): addresses_state = dict(self.addresses_state) tokens = Indexer(b'token', None) tokens.data[(self.alice.address, tx.token_txhash)] = TokenBalance(balance=100) - tokens.data[(self.bob.address, tx.token_txhash)] = TokenBalance(balance=0) state_container = StateContainer(addresses_state=addresses_state, tokens=tokens, slaves=Indexer(b'slave', None), From 60ef7dd2f9bd36e78c382936c4acf8d9220dd5d6 Mon Sep 17 00:00:00 2001 From: cyyber Date: Fri, 13 Mar 2020 17:19:46 +0530 Subject: [PATCH 14/23] Delete indexed data while reverting transactions --- src/qrl/core/txs/LatticeTransaction.py | 3 ++- src/qrl/core/txs/TransferTokenTransaction.py | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qrl/core/txs/LatticeTransaction.py b/src/qrl/core/txs/LatticeTransaction.py index 7fc7be15a..695bc9416 100644 --- a/src/qrl/core/txs/LatticeTransaction.py +++ b/src/qrl/core/txs/LatticeTransaction.py @@ -116,6 +116,7 @@ def revert(self, state_container.paginated_tx_hash.remove(address_state, self.txhash) state_container.lattice_pk.data[(self.addr_from, - self.pk1, self.pk2, self.pk3)] = LatticePKMetadata(enabled=False) + self.pk1, self.pk2, self.pk3)] = LatticePKMetadata(enabled=False, + delete=True) return self._revert_state_changes_for_PK(state_container) diff --git a/src/qrl/core/txs/TransferTokenTransaction.py b/src/qrl/core/txs/TransferTokenTransaction.py index 22c6b6d77..775b6d78d 100644 --- a/src/qrl/core/txs/TransferTokenTransaction.py +++ b/src/qrl/core/txs/TransferTokenTransaction.py @@ -191,9 +191,11 @@ def revert(self, addr_to = self.addrs_to[index] amount = self.amounts[index] address_state = state_container.addresses_state[addr_to] + key = (addr_to, self.token_txhash) - state_container.tokens.data[(addr_to, self.token_txhash)].balance -= amount - if state_container.tokens.data[(addr_to, self.token_txhash)].balance == 0: + state_container.tokens.data[key].balance -= amount + if state_container.tokens.data[key].balance == 0: + state_container.tokens.data[key].delete = True state_container.paginated_tokens_hash.remove(address_state, self.token_txhash) if self.addr_from != addr_to: From e5c0aadb6fd49a50f705fb93f620481190214272 Mon Sep 17 00:00:00 2001 From: cyyber Date: Sat, 14 Mar 2020 12:01:34 +0530 Subject: [PATCH 15/23] Re-ordered revert in TransferTokenTransaction --- src/qrl/core/txs/TransferTokenTransaction.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/qrl/core/txs/TransferTokenTransaction.py b/src/qrl/core/txs/TransferTokenTransaction.py index 775b6d78d..ea1962e05 100644 --- a/src/qrl/core/txs/TransferTokenTransaction.py +++ b/src/qrl/core/txs/TransferTokenTransaction.py @@ -182,11 +182,6 @@ def apply(self, def revert(self, state: State, state_container: StateContainer) -> bool: - state_container.tokens.data[(self.addr_from, self.token_txhash)].balance += self.total_amount - address_state = state_container.addresses_state[self.addr_from] - address_state.update_balance(state_container, self.fee) - state_container.paginated_tx_hash.remove(address_state, self.txhash) - for index in range(0, len(self.addrs_to)): addr_to = self.addrs_to[index] amount = self.amounts[index] @@ -201,4 +196,10 @@ def revert(self, if self.addr_from != addr_to: state_container.paginated_tx_hash.remove(address_state, self.txhash) + state_container.tokens.data[(self.addr_from, self.token_txhash)].balance += self.total_amount + state_container.tokens.data[(self.addr_from, self.token_txhash)].delete = False + address_state = state_container.addresses_state[self.addr_from] + address_state.update_balance(state_container, self.fee) + state_container.paginated_tx_hash.remove(address_state, self.txhash) + return self._revert_state_changes_for_PK(state_container) From da065f08f871f5a9ce01e073b6948dfe9932f693 Mon Sep 17 00:00:00 2001 From: cyyber Date: Sat, 14 Mar 2020 13:11:40 +0530 Subject: [PATCH 16/23] Track txhash responsible for the insertion of token into an Address --- src/qrl/core/txs/TokenTransaction.py | 1 + src/qrl/core/txs/TransferTokenTransaction.py | 3 +- src/qrl/generated/qrl_pb2.py | 131 ++++++++++--------- src/qrl/protos/qrl.proto | 3 +- 4 files changed, 74 insertions(+), 64 deletions(-) diff --git a/src/qrl/core/txs/TokenTransaction.py b/src/qrl/core/txs/TokenTransaction.py index 06ddfef83..5099592e5 100644 --- a/src/qrl/core/txs/TokenTransaction.py +++ b/src/qrl/core/txs/TokenTransaction.py @@ -186,6 +186,7 @@ def apply(self, state_container.tokens.data[(initial_balance.address, self.txhash)] = TokenBalance(balance=initial_balance.amount, decimals=self.decimals, + tx_hash=self.txhash, delete=False) address_state = state_container.addresses_state[initial_balance.address] state_container.paginated_tx_hash.insert(address_state, self.txhash) diff --git a/src/qrl/core/txs/TransferTokenTransaction.py b/src/qrl/core/txs/TransferTokenTransaction.py index ea1962e05..989353e3c 100644 --- a/src/qrl/core/txs/TransferTokenTransaction.py +++ b/src/qrl/core/txs/TransferTokenTransaction.py @@ -169,6 +169,7 @@ def apply(self, state_container.tokens.data[(addr_to, self.token_txhash)] = TokenBalance(balance=0, decimals=decimals, + tx_hash=self.txhash, delete=False) state_container.paginated_tokens_hash.insert(address_state, self.token_txhash) @@ -189,7 +190,7 @@ def revert(self, key = (addr_to, self.token_txhash) state_container.tokens.data[key].balance -= amount - if state_container.tokens.data[key].balance == 0: + if state_container.tokens.data[key].tx_hash == self.txhash: state_container.tokens.data[key].delete = True state_container.paginated_tokens_hash.remove(address_state, self.token_txhash) diff --git a/src/qrl/generated/qrl_pb2.py b/src/qrl/generated/qrl_pb2.py index a0de28dce..e991abe04 100644 --- a/src/qrl/generated/qrl_pb2.py +++ b/src/qrl/generated/qrl_pb2.py @@ -19,7 +19,7 @@ name='qrl.proto', package='qrl', syntax='proto3', - serialized_pb=_b('\n\tqrl.proto\x12\x03qrl\"\x07\n\x05\x45mpty\"\x11\n\x0fGetNodeStateReq\"/\n\x10GetNodeStateResp\x12\x1b\n\x04info\x18\x01 \x01(\x0b\x32\r.qrl.NodeInfo\"\x12\n\x10GetKnownPeersReq\"U\n\x11GetKnownPeersResp\x12 \n\tnode_info\x18\x01 \x01(\x0b\x32\r.qrl.NodeInfo\x12\x1e\n\x0bknown_peers\x18\x02 \x03(\x0b\x32\t.qrl.Peer\"\x11\n\x0fGetPeersStatReq\"5\n\x10GetPeersStatResp\x12!\n\npeers_stat\x18\x01 \x03(\x0b\x32\r.qrl.PeerStat\"\x12\n\x10GetChainStatsReq\"U\n\x11GetChainStatsResp\x12\x12\n\nstate_size\x18\x01 \x01(\x04\x12\x15\n\rstate_size_mb\x18\x02 \x01(\t\x12\x15\n\rstate_size_gb\x18\x03 \x01(\t\")\n\x0bGetStatsReq\x12\x1a\n\x12include_timeseries\x18\x01 \x01(\x08\"\x84\x02\n\x0cGetStatsResp\x12 \n\tnode_info\x18\x01 \x01(\x0b\x32\r.qrl.NodeInfo\x12\r\n\x05\x65poch\x18\x02 \x01(\x04\x12\x16\n\x0euptime_network\x18\x03 \x01(\x04\x12\x19\n\x11\x62lock_last_reward\x18\x04 \x01(\x04\x12\x17\n\x0f\x62lock_time_mean\x18\x05 \x01(\x04\x12\x15\n\rblock_time_sd\x18\x06 \x01(\x04\x12\x1a\n\x12\x63oins_total_supply\x18\x07 \x01(\x04\x12\x15\n\rcoins_emitted\x18\x08 \x01(\x04\x12-\n\x10\x62lock_timeseries\x18\t \x03(\x0b\x32\x13.qrl.BlockDataPoint\"!\n\x13GetAddressFromPKReq\x12\n\n\x02pk\x18\x01 \x01(\x0c\"\'\n\x14GetAddressFromPKResp\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\"\xb2\x01\n\x0e\x42lockDataPoint\x12\x0e\n\x06number\x18\x01 \x01(\x04\x12\x12\n\ndifficulty\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\x04\x12\x11\n\ttime_last\x18\x04 \x01(\x04\x12\x13\n\x0btime_movavg\x18\x05 \x01(\x04\x12\x12\n\nhash_power\x18\x06 \x01(\x02\x12\x13\n\x0bheader_hash\x18\x07 \x01(\x0c\x12\x18\n\x10header_hash_prev\x18\x08 \x01(\x0c\"g\n\x12GetAddressStateReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x1c\n\x14\x65xclude_ots_bitfield\x18\x02 \x01(\x08\x12\"\n\x1a\x65xclude_transaction_hashes\x18\x03 \x01(\x08\"7\n\x13GetAddressStateResp\x12 \n\x05state\x18\x01 \x01(\x0b\x32\x11.qrl.AddressState\"I\n\x1cGetOptimizedAddressStateResp\x12)\n\x05state\x18\x01 \x01(\x0b\x32\x1a.qrl.OptimizedAddressState\"-\n\x1aGetMultiSigAddressStateReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\"G\n\x1bGetMultiSigAddressStateResp\x12(\n\x05state\x18\x01 \x01(\x0b\x32\x19.qrl.MultiSigAddressState\"6\n\nIsSlaveReq\x12\x16\n\x0emaster_address\x18\x01 \x01(\x0c\x12\x10\n\x08slave_pk\x18\x02 \x01(\x0c\"\x1d\n\x0bIsSlaveResp\x12\x0e\n\x06result\x18\x01 \x01(\x08\"\"\n\x0fParseAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\"J\n\x10ParseAddressResp\x12\x10\n\x08is_valid\x18\x01 \x01(\x08\x12$\n\x04\x64\x65sc\x18\x02 \x01(\x0b\x32\x16.qrl.AddressDescriptor\"\x1d\n\x0cGetObjectReq\x12\r\n\x05query\x18\x01 \x01(\x0c\"\xbc\x01\n\rGetObjectResp\x12\r\n\x05\x66ound\x18\x01 \x01(\x08\x12\x33\n\raddress_state\x18\x02 \x01(\x0b\x32\x1a.qrl.OptimizedAddressStateH\x00\x12/\n\x0btransaction\x18\x03 \x01(\x0b\x32\x18.qrl.TransactionExtendedH\x00\x12,\n\x0e\x62lock_extended\x18\x04 \x01(\x0b\x32\x12.qrl.BlockExtendedH\x00\x42\x08\n\x06result\"\xb7\x01\n\x10GetLatestDataReq\x12,\n\x06\x66ilter\x18\x01 \x01(\x0e\x32\x1c.qrl.GetLatestDataReq.Filter\x12\x0e\n\x06offset\x18\x02 \x01(\r\x12\x10\n\x08quantity\x18\x03 \x01(\r\"S\n\x06\x46ilter\x12\x07\n\x03\x41LL\x10\x00\x12\x10\n\x0c\x42LOCKHEADERS\x10\x01\x12\x10\n\x0cTRANSACTIONS\x10\x02\x12\x1c\n\x18TRANSACTIONS_UNCONFIRMED\x10\x03\"\xaf\x01\n\x11GetLatestDataResp\x12.\n\x0c\x62lockheaders\x18\x01 \x03(\x0b\x32\x18.qrl.BlockHeaderExtended\x12.\n\x0ctransactions\x18\x02 \x03(\x0b\x32\x18.qrl.TransactionExtended\x12:\n\x18transactions_unconfirmed\x18\x03 \x03(\x0b\x32\x18.qrl.TransactionExtended\"\x82\x01\n\x10TransferCoinsReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x02 \x03(\x0c\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x12\x14\n\x0cmessage_data\x18\x04 \x01(\x0c\x12\x0b\n\x03\x66\x65\x65\x18\x05 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x06 \x01(\x0c\"T\n\x11TransferCoinsResp\x12?\n\x1d\x65xtended_transaction_unsigned\x18\x01 \x01(\x0b\x32\x18.qrl.TransactionExtended\"B\n\x12PushTransactionReq\x12,\n\x12transaction_signed\x18\x01 \x01(\x0b\x32\x10.qrl.Transaction\"\xca\x01\n\x13PushTransactionResp\x12\x39\n\nerror_code\x18\x01 \x01(\x0e\x32%.qrl.PushTransactionResp.ResponseCode\x12\x19\n\x11\x65rror_description\x18\x02 \x01(\t\x12\x0f\n\x07tx_hash\x18\x03 \x01(\x0c\"L\n\x0cResponseCode\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x15\n\x11VALIDATION_FAILED\x10\x02\x12\r\n\tSUBMITTED\x10\x03\"\x82\x01\n\x14MultiSigCreateTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x13\n\x0bsignatories\x18\x02 \x03(\x0c\x12\x0f\n\x07weights\x18\x03 \x03(\r\x12\x11\n\tthreshold\x18\x04 \x01(\r\x12\x0b\n\x03\x66\x65\x65\x18\x05 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x06 \x01(\x0c\"\xa3\x01\n\x13MultiSigSpendTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x19\n\x11multi_sig_address\x18\x02 \x01(\x0c\x12\x10\n\x08\x61\x64\x64rs_to\x18\x03 \x03(\x0c\x12\x0f\n\x07\x61mounts\x18\x04 \x03(\x04\x12\x1b\n\x13\x65xpiry_block_number\x18\x05 \x01(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x06 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x07 \x01(\x0c\"k\n\x12MultiSigVoteTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x12\n\nshared_key\x18\x02 \x01(\x0c\x12\x0e\n\x06unvote\x18\x03 \x01(\x08\x12\x0b\n\x03\x66\x65\x65\x18\x04 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x05 \x01(\x0c\"d\n\rMessageTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64r_to\x18\x03 \x01(\x0c\x12\x0b\n\x03\x66\x65\x65\x18\x04 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x05 \x01(\x0c\"\xad\x01\n\x0bTokenTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x0e\n\x06symbol\x18\x02 \x01(\x0c\x12\x0c\n\x04name\x18\x03 \x01(\x0c\x12\r\n\x05owner\x18\x04 \x01(\x0c\x12\x10\n\x08\x64\x65\x63imals\x18\x05 \x01(\x04\x12,\n\x10initial_balances\x18\x06 \x03(\x0b\x32\x12.qrl.AddressAmount\x12\x0b\n\x03\x66\x65\x65\x18\x07 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x08 \x01(\x0c\"\x85\x01\n\x13TransferTokenTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x02 \x03(\x0c\x12\x14\n\x0ctoken_txhash\x18\x03 \x01(\x0c\x12\x0f\n\x07\x61mounts\x18\x04 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x05 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x06 \x01(\x0c\"i\n\x0bSlaveTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x11\n\tslave_pks\x18\x02 \x03(\x0c\x12\x14\n\x0c\x61\x63\x63\x65ss_types\x18\x03 \x03(\r\x12\x0b\n\x03\x66\x65\x65\x18\x04 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x05 \x01(\x0c\"i\n\rLatticeTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x0b\n\x03pk1\x18\x02 \x01(\x0c\x12\x0b\n\x03pk2\x18\x03 \x01(\x0c\x12\x0b\n\x03pk3\x18\x04 \x01(\x0c\x12\x0b\n\x03\x66\x65\x65\x18\x05 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x06 \x01(\x0c\"H\n\x0fMiniTransaction\x12\x18\n\x10transaction_hash\x18\x01 \x01(\t\x12\x0b\n\x03out\x18\x02 \x01(\x08\x12\x0e\n\x06\x61mount\x18\x03 \x01(\x04\"$\n\x11GetTransactionReq\x12\x0f\n\x07tx_hash\x18\x01 \x01(\x0c\"\xa0\x01\n\x12GetTransactionResp\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.qrl.Transaction\x12\x15\n\rconfirmations\x18\x02 \x01(\x04\x12\x14\n\x0c\x62lock_number\x18\x03 \x01(\x04\x12\x19\n\x11\x62lock_header_hash\x18\x04 \x01(\x0c\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12\x11\n\taddr_from\x18\x06 \x01(\x0c\"^\n\x1fGetMiniTransactionsByAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x15\n\ritem_per_page\x18\x02 \x01(\x04\x12\x13\n\x0bpage_number\x18\x03 \x01(\x04\"d\n GetMiniTransactionsByAddressResp\x12/\n\x11mini_transactions\x18\x01 \x03(\x0b\x32\x14.qrl.MiniTransaction\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\"Z\n\x1bGetTransactionsByAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x15\n\ritem_per_page\x18\x02 \x01(\x04\x12\x13\n\x0bpage_number\x18\x03 \x01(\x04\"T\n\x1cGetTransactionsByAddressResp\x12\x34\n\x13transactions_detail\x18\x01 \x03(\x0b\x32\x17.qrl.GetTransactionResp\"\xb8\x02\n\x1fGetMultiSigSpendTxsByAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x15\n\ritem_per_page\x18\x02 \x01(\x04\x12\x13\n\x0bpage_number\x18\x03 \x01(\x04\x12\x44\n\x0b\x66ilter_type\x18\x04 \x01(\x0e\x32/.qrl.GetMultiSigSpendTxsByAddressReq.FilterType\"\x91\x01\n\nFilterType\x12\x08\n\x04NONE\x10\x00\x12\x11\n\rEXECUTED_ONLY\x10\x01\x12\x10\n\x0cNON_EXECUTED\x10\x02\x12\x0b\n\x07\x45XPIRED\x10\x03\x12\x0f\n\x0bNON_EXPIRED\x10\x04\x12\x18\n\x14NON_EXECUTED_EXPIRED\x10\x05\x12\x1c\n\x18NON_EXECUTED_NON_EXPIRED\x10\x06\"X\n GetMultiSigSpendTxsByAddressResp\x12\x34\n\x13transactions_detail\x18\x01 \x03(\x0b\x32\x17.qrl.GetTransactionResp\"2\n\x0fGetVoteStatsReq\x12\x1f\n\x17multi_sig_spend_tx_hash\x18\x01 \x01(\x0c\"6\n\x10GetVoteStatsResp\x12\"\n\nvote_stats\x18\x01 \x01(\x0b\x32\x0e.qrl.VoteStats\"U\n\x1dGetInboxMessagesByAddressResp\x12\x34\n\x13transactions_detail\x18\x01 \x03(\x0b\x32\x17.qrl.GetTransactionResp\"l\n\x0cInboxMessage\x12\x11\n\taddr_from\x18\x01 \x01(\x0c\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0f\n\x07tx_hash\x18\x04 \x01(\x0c\x12\x14\n\x0c\x62lock_number\x18\x05 \x01(\x04\"R\n\x0bTokenDetail\x12\x14\n\x0ctoken_txhash\x18\x01 \x01(\x0c\x12\x0c\n\x04name\x18\x02 \x01(\x0c\x12\x0e\n\x06symbol\x18\x03 \x01(\x0c\x12\x0f\n\x07\x62\x61lance\x18\x04 \x01(\x04\"A\n\x16GetTokensByAddressResp\x12\'\n\rtokens_detail\x18\x01 \x03(\x0b\x32\x10.qrl.TokenDetail\"9\n\x0bSlaveDetail\x12\x15\n\rslave_address\x18\x01 \x01(\x0c\x12\x13\n\x0b\x61\x63\x63\x65ss_type\x18\x02 \x01(\x04\"A\n\x16GetSlavesByAddressResp\x12\'\n\rslaves_detail\x18\x01 \x03(\x0b\x32\x10.qrl.SlaveDetail\"J\n\x10LatticePKsDetail\x12\x0b\n\x03pk1\x18\x01 \x01(\x0c\x12\x0b\n\x03pk2\x18\x02 \x01(\x0c\x12\x0b\n\x03pk3\x18\x03 \x01(\x0c\x12\x0f\n\x07tx_hash\x18\x04 \x01(\x0c\"O\n\x1aGetLatticePKsByAddressResp\x12\x31\n\x12lattice_pks_detail\x18\x01 \x03(\x0b\x32\x15.qrl.LatticePKsDetail\"2\n\x0eMultiSigDetail\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\"R\n!GetMultiSigAddressesByAddressResp\x12-\n\x10multi_sig_detail\x18\x01 \x03(\x0b\x32\x13.qrl.MultiSigDetail\" \n\rGetBalanceReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\"!\n\x0eGetBalanceResp\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\"\'\n\x12GetTotalBalanceReq\x12\x11\n\taddresses\x18\x01 \x03(\x0c\"&\n\x13GetTotalBalanceResp\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\"b\n\tGetOTSReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tpage_from\x18\x02 \x01(\x04\x12\x12\n\npage_count\x18\x03 \x01(\x04\x12\x1d\n\x15unused_ots_index_from\x18\x04 \x01(\x04\">\n\x11OTSBitfieldByPage\x12\x14\n\x0cots_bitfield\x18\x01 \x03(\x0c\x12\x13\n\x0bpage_number\x18\x02 \x01(\x04\"\x81\x01\n\nGetOTSResp\x12\x34\n\x14ots_bitfield_by_page\x18\x01 \x03(\x0b\x32\x16.qrl.OTSBitfieldByPage\x12\x1d\n\x15next_unused_ots_index\x18\x02 \x01(\x04\x12\x1e\n\x16unused_ots_index_found\x18\x03 \x01(\x08\"\x0e\n\x0cGetHeightReq\"\x1f\n\rGetHeightResp\x12\x0e\n\x06height\x18\x01 \x01(\x04\"\"\n\x0bGetBlockReq\x12\x13\n\x0bheader_hash\x18\x01 \x01(\x0c\")\n\x0cGetBlockResp\x12\x19\n\x05\x62lock\x18\x01 \x01(\x0b\x32\n.qrl.Block\"+\n\x13GetBlockByNumberReq\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\"1\n\x14GetBlockByNumberResp\x12\x19\n\x05\x62lock\x18\x01 \x01(\x0b\x32\n.qrl.Block\"\x16\n\x14GetLocalAddressesReq\"*\n\x15GetLocalAddressesResp\x12\x11\n\taddresses\x18\x01 \x03(\x0c\"\x8d\x02\n\x08NodeInfo\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\"\n\x05state\x18\x02 \x01(\x0e\x32\x13.qrl.NodeInfo.State\x12\x17\n\x0fnum_connections\x18\x03 \x01(\r\x12\x17\n\x0fnum_known_peers\x18\x04 \x01(\r\x12\x0e\n\x06uptime\x18\x05 \x01(\x04\x12\x14\n\x0c\x62lock_height\x18\x06 \x01(\x04\x12\x17\n\x0f\x62lock_last_hash\x18\x07 \x01(\x0c\x12\x12\n\nnetwork_id\x18\x08 \x01(\t\"G\n\x05State\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0c\n\x08UNSYNCED\x10\x01\x12\x0b\n\x07SYNCING\x10\x02\x12\n\n\x06SYNCED\x10\x03\x12\n\n\x06\x46ORKED\x10\x04\"\x85\x01\n\x11\x41\x64\x64ressDescriptor\x12\x15\n\rhash_function\x18\x01 \x01(\t\x12\x18\n\x10signature_scheme\x18\x02 \x01(\t\x12\x13\n\x0btree_height\x18\x03 \x01(\r\x12\x12\n\nsignatures\x18\x04 \x01(\r\x12\x16\n\x0e\x61\x64\x64ress_format\x18\x05 \x01(\t\"\'\n\x0bStoredPeers\x12\x18\n\x05peers\x18\x01 \x03(\x0b\x32\t.qrl.Peer\"\x12\n\x04Peer\x12\n\n\x02ip\x18\x01 \x01(\t\"\x91\x03\n\x0c\x41\x64\x64ressState\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\x12\r\n\x05nonce\x18\x03 \x01(\x04\x12\x14\n\x0cots_bitfield\x18\x04 \x03(\x0c\x12\x1a\n\x12transaction_hashes\x18\x05 \x03(\x0c\x12-\n\x06tokens\x18\x06 \x03(\x0b\x32\x1d.qrl.AddressState.TokensEntry\x12&\n\x0elatticePK_list\x18\x07 \x03(\x0b\x32\x0e.qrl.LatticePK\x12H\n\x15slave_pks_access_type\x18\x08 \x03(\x0b\x32).qrl.AddressState.SlavePksAccessTypeEntry\x12\x13\n\x0bots_counter\x18\t \x01(\x04\x1a-\n\x0bTokensEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a\x39\n\x17SlavePksAccessTypeEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\xe0\x03\n\x15OptimizedAddressState\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\x12\r\n\x05nonce\x18\x03 \x01(\x04\x12\x1e\n\x16ots_bitfield_used_page\x18\x04 \x01(\x04\x12\x1a\n\x12used_ots_key_count\x18\x05 \x01(\x04\x12\x1e\n\x16transaction_hash_count\x18\x06 \x01(\x04\x12\x14\n\x0ctokens_count\x18\x07 \x01(\x04\x12\x14\n\x0cslaves_count\x18\x08 \x01(\x04\x12\x18\n\x10lattice_pk_count\x18\t \x01(\x04\x12\x1f\n\x17multi_sig_address_count\x18\n \x01(\x04\x12\x1d\n\x15multi_sig_spend_count\x18\x0b \x01(\x04\x12\x1b\n\x13inbox_message_count\x18\x0c \x01(\x04\x12+\n#foundation_multi_sig_spend_txn_hash\x18\r \x03(\x0c\x12*\n\"foundation_multi_sig_vote_txn_hash\x18\x0e \x03(\x0c\x12\x0f\n\x07unvotes\x18\x0f \x03(\x0c\x12-\n\x13proposal_vote_stats\x18\x10 \x03(\x0b\x32\x10.qrl.Transaction\"\x93\x03\n\x14MultiSigAddressState\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x18\n\x10\x63reation_tx_hash\x18\x02 \x01(\x0c\x12\r\n\x05nonce\x18\x03 \x01(\x04\x12\x0f\n\x07\x62\x61lance\x18\x04 \x01(\x04\x12\x13\n\x0bsignatories\x18\x05 \x03(\x0c\x12\x0f\n\x07weights\x18\x06 \x03(\r\x12\x11\n\tthreshold\x18\x07 \x01(\r\x12\x1e\n\x16transaction_hash_count\x18\x08 \x01(\x04\x12\x1d\n\x15multi_sig_spend_count\x18\t \x01(\x04\x12\x1f\n\x17multi_sig_address_count\x18\n \x01(\x04\x12+\n#foundation_multi_sig_spend_txn_hash\x18\x0b \x03(\x0c\x12*\n\"foundation_multi_sig_vote_txn_hash\x18\x0c \x03(\x0c\x12\x0f\n\x07unvotes\x18\r \x03(\x0c\x12-\n\x13proposal_vote_stats\x18\x0e \x03(\x0b\x32\x10.qrl.Transaction\"\'\n\x15MultiSigAddressesList\x12\x0e\n\x06hashes\x18\x01 \x03(\x0c\"\x1a\n\x08\x44\x61taList\x12\x0e\n\x06values\x18\x01 \x03(\x0c\"\x1d\n\x08\x42itfield\x12\x11\n\tbitfields\x18\x01 \x03(\x0c\"%\n\x13TransactionHashList\x12\x0e\n\x06hashes\x18\x01 \x03(\x0c\"3\n\tLatticePK\x12\x10\n\x08kyber_pk\x18\x01 \x01(\x0c\x12\x14\n\x0c\x64ilithium_pk\x18\x02 \x01(\x0c\"0\n\rAddressAmount\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x04\"\xd7\x01\n\x0b\x42lockHeader\x12\x13\n\x0bhash_header\x18\x01 \x01(\x0c\x12\x14\n\x0c\x62lock_number\x18\x02 \x01(\x04\x12\x19\n\x11timestamp_seconds\x18\x03 \x01(\x04\x12\x18\n\x10hash_header_prev\x18\x04 \x01(\x0c\x12\x14\n\x0creward_block\x18\x05 \x01(\x04\x12\x12\n\nreward_fee\x18\x06 \x01(\x04\x12\x13\n\x0bmerkle_root\x18\x07 \x01(\x0c\x12\x14\n\x0cmining_nonce\x18\x08 \x01(\r\x12\x13\n\x0b\x65xtra_nonce\x18\t \x01(\x04\"i\n\x13\x42lockHeaderExtended\x12 \n\x06header\x18\x01 \x01(\x0b\x32\x10.qrl.BlockHeader\x12\x30\n\x11transaction_count\x18\x02 \x01(\x0b\x32\x15.qrl.TransactionCount\"q\n\x10TransactionCount\x12/\n\x05\x63ount\x18\x01 \x03(\x0b\x32 .qrl.TransactionCount.CountEntry\x1a,\n\nCountEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\x91\x01\n\x13TransactionExtended\x12 \n\x06header\x18\x01 \x01(\x0b\x32\x10.qrl.BlockHeader\x12\x1c\n\x02tx\x18\x02 \x01(\x0b\x32\x10.qrl.Transaction\x12\x11\n\taddr_from\x18\x03 \x01(\x0c\x12\x0c\n\x04size\x18\x04 \x01(\x04\x12\x19\n\x11timestamp_seconds\x18\x05 \x01(\x04\"\xa6\x01\n\rBlockExtended\x12 \n\x06header\x18\x01 \x01(\x0b\x32\x10.qrl.BlockHeader\x12\x37\n\x15\x65xtended_transactions\x18\x02 \x03(\x0b\x32\x18.qrl.TransactionExtended\x12,\n\x0fgenesis_balance\x18\x03 \x03(\x0b\x32\x13.qrl.GenesisBalance\x12\x0c\n\x04size\x18\x04 \x01(\x04\"\x7f\n\x05\x42lock\x12 \n\x06header\x18\x01 \x01(\x0b\x32\x10.qrl.BlockHeader\x12&\n\x0ctransactions\x18\x02 \x03(\x0b\x32\x10.qrl.Transaction\x12,\n\x0fgenesis_balance\x18\x03 \x03(\x0b\x32\x13.qrl.GenesisBalance\"2\n\x0eGenesisBalance\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\"D\n\x11\x42lockMetaDataList\x12/\n\x13\x62lock_number_hashes\x18\x01 \x03(\x0b\x32\x12.qrl.BlockMetaData\"\xaa\x15\n\x0bTransaction\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x0b\n\x03\x66\x65\x65\x18\x02 \x01(\x04\x12\x12\n\npublic_key\x18\x03 \x01(\x0c\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\r\n\x05nonce\x18\x05 \x01(\x04\x12\x18\n\x10transaction_hash\x18\x06 \x01(\x0c\x12-\n\x08transfer\x18\x07 \x01(\x0b\x32\x19.qrl.Transaction.TransferH\x00\x12-\n\x08\x63oinbase\x18\x08 \x01(\x0b\x32\x19.qrl.Transaction.CoinBaseH\x00\x12\x36\n\tlatticePK\x18\t \x01(\x0b\x32!.qrl.Transaction.LatticePublicKeyH\x00\x12+\n\x07message\x18\n \x01(\x0b\x32\x18.qrl.Transaction.MessageH\x00\x12\'\n\x05token\x18\x0b \x01(\x0b\x32\x16.qrl.Transaction.TokenH\x00\x12\x38\n\x0etransfer_token\x18\x0c \x01(\x0b\x32\x1e.qrl.Transaction.TransferTokenH\x00\x12\'\n\x05slave\x18\r \x01(\x0b\x32\x16.qrl.Transaction.SlaveH\x00\x12;\n\x10multi_sig_create\x18\x0e \x01(\x0b\x32\x1f.qrl.Transaction.MultiSigCreateH\x00\x12\x39\n\x0fmulti_sig_spend\x18\x0f \x01(\x0b\x32\x1e.qrl.Transaction.MultiSigSpendH\x00\x12\x37\n\x0emulti_sig_vote\x18\x10 \x01(\x0b\x32\x1d.qrl.Transaction.MultiSigVoteH\x00\x12:\n\x0fproposal_create\x18\x11 \x01(\x0b\x32\x1f.qrl.Transaction.ProposalCreateH\x00\x12\x36\n\rproposal_vote\x18\x12 \x01(\x0b\x32\x1d.qrl.Transaction.ProposalVoteH\x00\x1a\x43\n\x08Transfer\x12\x10\n\x08\x61\x64\x64rs_to\x18\x01 \x03(\x0c\x12\x0f\n\x07\x61mounts\x18\x02 \x03(\x04\x12\x14\n\x0cmessage_data\x18\x03 \x01(\x0c\x1a+\n\x08\x43oinBase\x12\x0f\n\x07\x61\x64\x64r_to\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x04\x1a\x39\n\x10LatticePublicKey\x12\x0b\n\x03pk1\x18\x01 \x01(\x0c\x12\x0b\n\x03pk2\x18\x02 \x01(\x0c\x12\x0b\n\x03pk3\x18\x03 \x01(\x0c\x1a\x30\n\x07Message\x12\x14\n\x0cmessage_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64r_to\x18\x02 \x01(\x0c\x1at\n\x05Token\x12\x0e\n\x06symbol\x18\x01 \x01(\x0c\x12\x0c\n\x04name\x18\x02 \x01(\x0c\x12\r\n\x05owner\x18\x03 \x01(\x0c\x12\x10\n\x08\x64\x65\x63imals\x18\x04 \x01(\x04\x12,\n\x10initial_balances\x18\x05 \x03(\x0b\x32\x12.qrl.AddressAmount\x1aH\n\rTransferToken\x12\x14\n\x0ctoken_txhash\x18\x01 \x01(\x0c\x12\x10\n\x08\x61\x64\x64rs_to\x18\x02 \x03(\x0c\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x1a\x30\n\x05Slave\x12\x11\n\tslave_pks\x18\x01 \x03(\x0c\x12\x14\n\x0c\x61\x63\x63\x65ss_types\x18\x02 \x03(\r\x1aI\n\x0eMultiSigCreate\x12\x13\n\x0bsignatories\x18\x01 \x03(\x0c\x12\x0f\n\x07weights\x18\x02 \x03(\r\x12\x11\n\tthreshold\x18\x03 \x01(\r\x1aj\n\rMultiSigSpend\x12\x19\n\x11multi_sig_address\x18\x01 \x01(\x0c\x12\x10\n\x08\x61\x64\x64rs_to\x18\x02 \x03(\x0c\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x12\x1b\n\x13\x65xpiry_block_number\x18\x04 \x01(\x04\x1aH\n\x0cMultiSigVote\x12\x12\n\nshared_key\x18\x01 \x01(\x0c\x12\x0e\n\x06unvote\x18\x02 \x01(\x08\x12\x14\n\x0cprev_tx_hash\x18\x03 \x01(\x0c\x1a\x9b\t\n\x0eProposalCreate\x12\x1b\n\x13\x65xpiry_block_number\x18\x01 \x01(\x04\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x32\n\x03qip\x18\x03 \x01(\x0b\x32#.qrl.Transaction.ProposalCreate.QIPH\x00\x12\x38\n\x06\x63onfig\x18\x04 \x01(\x0b\x32&.qrl.Transaction.ProposalCreate.ConfigH\x00\x12\x36\n\x05other\x18\x05 \x01(\x0b\x32%.qrl.Transaction.ProposalCreate.OtherH\x00\x1a\x17\n\x03QIP\x12\x10\n\x08qip_link\x18\x01 \x01(\t\x1a\xed\x06\n\x06\x43onfig\x12\x18\n\x10\x63hanges_bitfield\x18\x01 \x03(\x0c\x12\x13\n\x0breorg_limit\x18\x02 \x01(\x04\x12\x17\n\x0fmax_coin_supply\x18\x03 \x01(\x04\x12,\n$complete_emission_time_span_in_years\x18\x04 \x01(\x04\x12\x1b\n\x13mining_nonce_offset\x18\x05 \x01(\x04\x12\x1a\n\x12\x65xtra_nonce_offset\x18\x06 \x01(\x04\x12!\n\x19mining_blob_size_in_bytes\x18\x07 \x01(\x04\x12\x1f\n\x17\x62lock_timing_in_seconds\x18\x08 \x01(\x04\x12 \n\x18number_of_blocks_analyze\x18\t \x01(\x04\x12\x1d\n\x15\x62lock_size_multiplier\x18\n \x01(\x04\x12%\n\x1d\x62lock_min_size_limit_in_bytes\x18\x0b \x01(\x04\x12&\n\x1etransaction_multi_output_limit\x18\x0c \x01(\x04\x12\x1a\n\x12message_max_length\x18\r \x01(\x04\x12\x1f\n\x17token_symbol_max_length\x18\x0e \x01(\x04\x12\x1d\n\x15token_name_max_length\x18\x0f \x01(\x04\x12\x1e\n\x16lattice_pk1_max_length\x18\x10 \x01(\x04\x12\x1e\n\x16lattice_pk2_max_length\x18\x11 \x01(\x04\x12\x1e\n\x16lattice_pk3_max_length\x18\x12 \x01(\x04\x12\x39\n1foundation_multi_sig_address_threshold_percentage\x18\x13 \x01(\x04\x12\x1e\n\x16proposal_threshold_per\x18\x14 \x01(\x04\x12 \n\x18proposal_default_options\x18\x15 \x03(\t\x12\x1e\n\x16\x64\x65scription_max_length\x18\x16 \x01(\x04\x12\x1a\n\x12options_max_number\x18\x17 \x01(\x04\x12\x1e\n\x16option_max_text_length\x18\x18 \x01(\x04\x12(\n proposal_config_activation_delay\x18\x19 \x01(\x04\x12\x15\n\rN_measurement\x18\x1a \x01(\x04\x12\n\n\x02kp\x18\x1b \x01(\x04\x1a\x18\n\x05Other\x12\x0f\n\x07options\x18\x01 \x03(\tB\x0e\n\x0cproposalType\x1a\x32\n\x0cProposalVote\x12\x12\n\nshared_key\x18\x01 \x01(\x0c\x12\x0e\n\x06option\x18\x02 \x01(\rB\x11\n\x0ftransactionType\"\xb8\x01\n\tVoteStats\x12\x19\n\x11multi_sig_address\x18\x01 \x01(\x0c\x12\x12\n\nshared_key\x18\x02 \x01(\x0c\x12\x13\n\x0bsignatories\x18\x03 \x03(\x0c\x12\x11\n\ttx_hashes\x18\x04 \x03(\x0c\x12\x0f\n\x07unvotes\x18\x05 \x03(\x08\x12\x1b\n\x13\x65xpiry_block_number\x18\x06 \x01(\x04\x12\x14\n\x0ctotal_weight\x18\x07 \x01(\x04\x12\x10\n\x08\x65xecuted\x18\x08 \x01(\x08\"\xb7\x01\n\x11ProposalVoteStats\x12\x11\n\taddr_from\x18\x01 \x01(\x0c\x12\x12\n\nshared_key\x18\x02 \x01(\x0c\x12\x15\n\rproposal_type\x18\x03 \x01(\t\x12\x18\n\x10weight_by_option\x18\x04 \x03(\x04\x12\x1b\n\x13\x65xpiry_block_number\x18\x05 \x01(\x04\x12\x10\n\x08\x65xecuted\x18\x06 \x01(\x08\x12\x1b\n\x13number_of_tx_hashes\x18\x07 \x01(\x04\"-\n\x0eProposalRecord\x12\x1b\n\x13number_of_tx_hashes\x18\x01 \x01(\x04\"!\n\tTokenList\x12\x14\n\x0ctoken_txhash\x18\x01 \x03(\x0c\"A\n\x0cTokenBalance\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08\x64\x65\x63imals\x18\x02 \x01(\x04\x12\x0e\n\x06\x64\x65lete\x18\x03 \x01(\x08\"E\n\rSlaveMetadata\x12\x13\n\x0b\x61\x63\x63\x65ss_type\x18\x01 \x01(\x04\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\x12\x0e\n\x06\x64\x65lete\x18\x03 \x01(\x08\"E\n\x11LatticePKMetadata\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\x12\x0e\n\x06\x64\x65lete\x18\x03 \x01(\x08\"G\n\rTokenMetadata\x12\x14\n\x0ctoken_txhash\x18\x01 \x01(\x0c\x12 \n\x18transfer_token_tx_hashes\x18\x02 \x03(\x0c\"\xc4\x01\n\x19\x45ncryptedEphemeralMessage\x12\x0e\n\x06msg_id\x18\x01 \x01(\x0c\x12\x0b\n\x03ttl\x18\x02 \x01(\x04\x12\x0b\n\x03ttr\x18\x03 \x01(\x04\x12\x37\n\x07\x63hannel\x18\x05 \x01(\x0b\x32&.qrl.EncryptedEphemeralMessage.Channel\x12\r\n\x05nonce\x18\x06 \x01(\x04\x12\x0f\n\x07payload\x18\x07 \x01(\x0c\x1a$\n\x07\x43hannel\x12\x19\n\x11\x65nc_aes256_symkey\x18\x04 \x01(\x0c\" \n\x0b\x41\x64\x64ressList\x12\x11\n\taddresses\x18\x01 \x03(\x0c\"`\n\x0f\x42lockHeightData\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\x12\x18\n\x10\x62lock_headerhash\x18\x02 \x01(\x0c\x12\x1d\n\x15\x63umulative_difficulty\x18\x03 \x01(\x0c\"\x81\x01\n\rBlockMetaData\x12\x18\n\x10\x62lock_difficulty\x18\x01 \x01(\x0c\x12\x1d\n\x15\x63umulative_difficulty\x18\x02 \x01(\x0c\x12\x1a\n\x12\x63hild_headerhashes\x18\x03 \x03(\x0c\x12\x1b\n\x13last_N_headerhashes\x18\x04 \x03(\x0c\"A\n\x12\x42lockNumberMapping\x12\x12\n\nheaderhash\x18\x01 \x01(\x0c\x12\x17\n\x0fprev_headerhash\x18\x02 \x01(\x0c\"X\n\x08PeerStat\x12\x0f\n\x07peer_ip\x18\x01 \x01(\x0c\x12\x0c\n\x04port\x18\x02 \x01(\r\x12-\n\x10node_chain_state\x18\x03 \x01(\x0b\x32\x13.qrl.NodeChainState\"~\n\x0eNodeChainState\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\x12\x13\n\x0bheader_hash\x18\x02 \x01(\x0c\x12\x1d\n\x15\x63umulative_difficulty\x18\x03 \x01(\x0c\x12\x0f\n\x07version\x18\x04 \x01(\t\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\"<\n\x0eNodeHeaderHash\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\x12\x14\n\x0cheaderhashes\x18\x02 \x03(\x0c\"-\n\x12P2PAcknowledgement\x12\x17\n\x0f\x62ytes_processed\x18\x01 \x01(\r\"|\n\x08PeerInfo\x12\x0f\n\x07peer_ip\x18\x01 \x01(\x0c\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x18\n\x10\x62\x61nned_timestamp\x18\x03 \x01(\r\x12\x13\n\x0b\x63redibility\x18\x04 \x01(\r\x12\"\n\x1alast_connections_timestamp\x18\x05 \x03(\r\".\n\x05Peers\x12%\n\x0epeer_info_list\x18\x01 \x03(\x0b\x32\r.qrl.PeerInfo\"\xbb\x0c\n\tDevConfig\x12\x16\n\x0eprev_state_key\x18\x01 \x01(\x0c\x12\x19\n\x11\x63urrent_state_key\x18\x02 \x01(\x0c\x12\x1e\n\x16\x61\x63tivation_header_hash\x18\x03 \x01(\x0c\x12\x1f\n\x17\x61\x63tivation_block_number\x18\x04 \x01(\x04\x12#\n\x05\x63hain\x18\x05 \x01(\x0b\x32\x14.qrl.DevConfig.Chain\x12#\n\x05\x62lock\x18\x06 \x01(\x0b\x32\x14.qrl.DevConfig.Block\x12/\n\x0btransaction\x18\x07 \x01(\x0b\x32\x1a.qrl.DevConfig.Transaction\x12\x1f\n\x03pow\x18\x08 \x01(\x0b\x32\x12.qrl.DevConfig.POW\x1a\x63\n\x05\x43hain\x12\x13\n\x0breorg_limit\x18\x01 \x01(\x04\x12\x17\n\x0fmax_coin_supply\x18\x02 \x01(\x04\x12,\n$complete_emission_time_span_in_years\x18\x03 \x01(\x04\x1a\xc6\x02\n\x05\x42lock\x12\x1b\n\x13mining_nonce_offset\x18\x01 \x01(\x04\x12\x1a\n\x12\x65xtra_nonce_offset\x18\x02 \x01(\x04\x12!\n\x19mining_blob_size_in_bytes\x18\x03 \x01(\x04\x12\x1f\n\x17\x62lock_timing_in_seconds\x18\x04 \x01(\x04\x12G\n\x15\x62lock_size_controller\x18\x05 \x01(\x0b\x32(.qrl.DevConfig.Block.BlockSizeController\x1aw\n\x13\x42lockSizeController\x12 \n\x18number_of_blocks_analyze\x18\x01 \x01(\x04\x12\x17\n\x0fsize_multiplier\x18\x02 \x01(\x04\x12%\n\x1d\x62lock_min_size_limit_in_bytes\x18\x03 \x01(\x04\x1a\xc5\x06\n\x0bTransaction\x12\x1a\n\x12multi_output_limit\x18\x01 \x01(\x04\x12\x33\n\x07message\x18\x02 \x01(\x0b\x32\".qrl.DevConfig.Transaction.Message\x12/\n\x05slave\x18\x03 \x01(\x0b\x32 .qrl.DevConfig.Transaction.Slave\x12/\n\x05token\x18\x04 \x01(\x0b\x32 .qrl.DevConfig.Transaction.Token\x12\x33\n\x07lattice\x18\x05 \x01(\x0b\x32\".qrl.DevConfig.Transaction.Lattice\x12K\n\x14\x66oundation_multi_sig\x18\x06 \x01(\x0b\x32-.qrl.DevConfig.Transaction.FoundationMultiSig\x12\x35\n\x08proposal\x18\x07 \x01(\x0b\x32#.qrl.DevConfig.Transaction.Proposal\x1a\x1d\n\x07Message\x12\x12\n\nmax_length\x18\x01 \x01(\x04\x1a$\n\x05Slave\x12\x1b\n\x13slave_pk_max_length\x18\x02 \x01(\x04\x1a;\n\x05Token\x12\x19\n\x11symbol_max_length\x18\x01 \x01(\x04\x12\x17\n\x0fname_max_length\x18\x02 \x01(\x04\x1aQ\n\x07Lattice\x12\x16\n\x0epk1_max_length\x18\x01 \x01(\x04\x12\x16\n\x0epk2_max_length\x18\x02 \x01(\x04\x12\x16\n\x0epk3_max_length\x18\x03 \x01(\x04\x1a\x32\n\x12\x46oundationMultiSig\x12\x1c\n\x14threshold_percentage\x18\x01 \x01(\x04\x1a\xc0\x01\n\x08Proposal\x12\x15\n\rthreshold_per\x18\x01 \x01(\x04\x12\x17\n\x0f\x64\x65\x66\x61ult_options\x18\x02 \x03(\t\x12\x1e\n\x16\x64\x65scription_max_length\x18\x03 \x01(\x04\x12\x1a\n\x12options_max_number\x18\x04 \x01(\x04\x12\x1e\n\x16option_max_text_length\x18\x05 \x01(\x04\x12(\n proposal_config_activation_delay\x18\x06 \x01(\x04\x1a(\n\x03POW\x12\x15\n\rN_measurement\x18\x01 \x01(\x04\x12\n\n\x02kp\x18\x02 \x01(\x04\x32\xd6\x15\n\tPublicAPI\x12;\n\x0cGetNodeState\x12\x14.qrl.GetNodeStateReq\x1a\x15.qrl.GetNodeStateResp\x12>\n\rGetKnownPeers\x12\x15.qrl.GetKnownPeersReq\x1a\x16.qrl.GetKnownPeersResp\x12;\n\x0cGetPeersStat\x12\x14.qrl.GetPeersStatReq\x1a\x15.qrl.GetPeersStatResp\x12/\n\x08GetStats\x12\x10.qrl.GetStatsReq\x1a\x11.qrl.GetStatsResp\x12\x44\n\x0fGetAddressState\x12\x17.qrl.GetAddressStateReq\x1a\x18.qrl.GetAddressStateResp\x12V\n\x18GetOptimizedAddressState\x12\x17.qrl.GetAddressStateReq\x1a!.qrl.GetOptimizedAddressStateResp\x12\\\n\x17GetMultiSigAddressState\x12\x1f.qrl.GetMultiSigAddressStateReq\x1a .qrl.GetMultiSigAddressStateResp\x12,\n\x07IsSlave\x12\x0f.qrl.IsSlaveReq\x1a\x10.qrl.IsSlaveResp\x12\x32\n\tGetObject\x12\x11.qrl.GetObjectReq\x1a\x12.qrl.GetObjectResp\x12>\n\rGetLatestData\x12\x15.qrl.GetLatestDataReq\x1a\x16.qrl.GetLatestDataResp\x12\x44\n\x0fPushTransaction\x12\x17.qrl.PushTransactionReq\x1a\x18.qrl.PushTransactionResp\x12>\n\rTransferCoins\x12\x15.qrl.TransferCoinsReq\x1a\x16.qrl.TransferCoinsResp\x12;\n\x0cParseAddress\x12\x14.qrl.ParseAddressReq\x1a\x15.qrl.ParseAddressResp\x12>\n\rGetChainStats\x12\x15.qrl.GetChainStatsReq\x1a\x16.qrl.GetChainStatsResp\x12G\n\x10GetAddressFromPK\x12\x18.qrl.GetAddressFromPKReq\x1a\x19.qrl.GetAddressFromPKResp\x12I\n\x14GetMultiSigCreateTxn\x12\x19.qrl.MultiSigCreateTxnReq\x1a\x16.qrl.TransferCoinsResp\x12G\n\x13GetMultiSigSpendTxn\x12\x18.qrl.MultiSigSpendTxnReq\x1a\x16.qrl.TransferCoinsResp\x12\x45\n\x12GetMultiSigVoteTxn\x12\x17.qrl.MultiSigVoteTxnReq\x1a\x16.qrl.TransferCoinsResp\x12;\n\rGetMessageTxn\x12\x12.qrl.MessageTxnReq\x1a\x16.qrl.TransferCoinsResp\x12\x37\n\x0bGetTokenTxn\x12\x10.qrl.TokenTxnReq\x1a\x16.qrl.TransferCoinsResp\x12G\n\x13GetTransferTokenTxn\x12\x18.qrl.TransferTokenTxnReq\x1a\x16.qrl.TransferCoinsResp\x12\x37\n\x0bGetSlaveTxn\x12\x10.qrl.SlaveTxnReq\x1a\x16.qrl.TransferCoinsResp\x12;\n\rGetLatticeTxn\x12\x12.qrl.LatticeTxnReq\x1a\x16.qrl.TransferCoinsResp\x12\x41\n\x0eGetTransaction\x12\x16.qrl.GetTransactionReq\x1a\x17.qrl.GetTransactionResp\x12k\n\x1cGetMiniTransactionsByAddress\x12$.qrl.GetMiniTransactionsByAddressReq\x1a%.qrl.GetMiniTransactionsByAddressResp\x12_\n\x18GetTransactionsByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a!.qrl.GetTransactionsByAddressResp\x12S\n\x12GetTokensByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a\x1b.qrl.GetTokensByAddressResp\x12S\n\x12GetSlavesByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a\x1b.qrl.GetSlavesByAddressResp\x12[\n\x16GetLatticePKsByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a\x1f.qrl.GetLatticePKsByAddressResp\x12i\n\x1dGetMultiSigAddressesByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a&.qrl.GetMultiSigAddressesByAddressResp\x12k\n\x1cGetMultiSigSpendTxsByAddress\x12$.qrl.GetMultiSigSpendTxsByAddressReq\x1a%.qrl.GetMultiSigSpendTxsByAddressResp\x12;\n\x0cGetVoteStats\x12\x14.qrl.GetVoteStatsReq\x1a\x15.qrl.GetVoteStatsResp\x12\x61\n\x19GetInboxMessagesByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a\".qrl.GetInboxMessagesByAddressResp\x12\x35\n\nGetBalance\x12\x12.qrl.GetBalanceReq\x1a\x13.qrl.GetBalanceResp\x12\x44\n\x0fGetTotalBalance\x12\x17.qrl.GetTotalBalanceReq\x1a\x18.qrl.GetTotalBalanceResp\x12)\n\x06GetOTS\x12\x0e.qrl.GetOTSReq\x1a\x0f.qrl.GetOTSResp\x12\x32\n\tGetHeight\x12\x11.qrl.GetHeightReq\x1a\x12.qrl.GetHeightResp\x12/\n\x08GetBlock\x12\x10.qrl.GetBlockReq\x1a\x11.qrl.GetBlockResp\x12G\n\x10GetBlockByNumber\x12\x18.qrl.GetBlockByNumberReq\x1a\x19.qrl.GetBlockByNumberResp2\n\n\x08\x41\x64minAPIb\x06proto3') + serialized_pb=_b('\n\tqrl.proto\x12\x03qrl\"\x07\n\x05\x45mpty\"\x11\n\x0fGetNodeStateReq\"/\n\x10GetNodeStateResp\x12\x1b\n\x04info\x18\x01 \x01(\x0b\x32\r.qrl.NodeInfo\"\x12\n\x10GetKnownPeersReq\"U\n\x11GetKnownPeersResp\x12 \n\tnode_info\x18\x01 \x01(\x0b\x32\r.qrl.NodeInfo\x12\x1e\n\x0bknown_peers\x18\x02 \x03(\x0b\x32\t.qrl.Peer\"\x11\n\x0fGetPeersStatReq\"5\n\x10GetPeersStatResp\x12!\n\npeers_stat\x18\x01 \x03(\x0b\x32\r.qrl.PeerStat\"\x12\n\x10GetChainStatsReq\"U\n\x11GetChainStatsResp\x12\x12\n\nstate_size\x18\x01 \x01(\x04\x12\x15\n\rstate_size_mb\x18\x02 \x01(\t\x12\x15\n\rstate_size_gb\x18\x03 \x01(\t\")\n\x0bGetStatsReq\x12\x1a\n\x12include_timeseries\x18\x01 \x01(\x08\"\x84\x02\n\x0cGetStatsResp\x12 \n\tnode_info\x18\x01 \x01(\x0b\x32\r.qrl.NodeInfo\x12\r\n\x05\x65poch\x18\x02 \x01(\x04\x12\x16\n\x0euptime_network\x18\x03 \x01(\x04\x12\x19\n\x11\x62lock_last_reward\x18\x04 \x01(\x04\x12\x17\n\x0f\x62lock_time_mean\x18\x05 \x01(\x04\x12\x15\n\rblock_time_sd\x18\x06 \x01(\x04\x12\x1a\n\x12\x63oins_total_supply\x18\x07 \x01(\x04\x12\x15\n\rcoins_emitted\x18\x08 \x01(\x04\x12-\n\x10\x62lock_timeseries\x18\t \x03(\x0b\x32\x13.qrl.BlockDataPoint\"!\n\x13GetAddressFromPKReq\x12\n\n\x02pk\x18\x01 \x01(\x0c\"\'\n\x14GetAddressFromPKResp\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\"\xb2\x01\n\x0e\x42lockDataPoint\x12\x0e\n\x06number\x18\x01 \x01(\x04\x12\x12\n\ndifficulty\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\x04\x12\x11\n\ttime_last\x18\x04 \x01(\x04\x12\x13\n\x0btime_movavg\x18\x05 \x01(\x04\x12\x12\n\nhash_power\x18\x06 \x01(\x02\x12\x13\n\x0bheader_hash\x18\x07 \x01(\x0c\x12\x18\n\x10header_hash_prev\x18\x08 \x01(\x0c\"g\n\x12GetAddressStateReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x1c\n\x14\x65xclude_ots_bitfield\x18\x02 \x01(\x08\x12\"\n\x1a\x65xclude_transaction_hashes\x18\x03 \x01(\x08\"7\n\x13GetAddressStateResp\x12 \n\x05state\x18\x01 \x01(\x0b\x32\x11.qrl.AddressState\"I\n\x1cGetOptimizedAddressStateResp\x12)\n\x05state\x18\x01 \x01(\x0b\x32\x1a.qrl.OptimizedAddressState\"-\n\x1aGetMultiSigAddressStateReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\"G\n\x1bGetMultiSigAddressStateResp\x12(\n\x05state\x18\x01 \x01(\x0b\x32\x19.qrl.MultiSigAddressState\"6\n\nIsSlaveReq\x12\x16\n\x0emaster_address\x18\x01 \x01(\x0c\x12\x10\n\x08slave_pk\x18\x02 \x01(\x0c\"\x1d\n\x0bIsSlaveResp\x12\x0e\n\x06result\x18\x01 \x01(\x08\"\"\n\x0fParseAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\"J\n\x10ParseAddressResp\x12\x10\n\x08is_valid\x18\x01 \x01(\x08\x12$\n\x04\x64\x65sc\x18\x02 \x01(\x0b\x32\x16.qrl.AddressDescriptor\"\x1d\n\x0cGetObjectReq\x12\r\n\x05query\x18\x01 \x01(\x0c\"\xbc\x01\n\rGetObjectResp\x12\r\n\x05\x66ound\x18\x01 \x01(\x08\x12\x33\n\raddress_state\x18\x02 \x01(\x0b\x32\x1a.qrl.OptimizedAddressStateH\x00\x12/\n\x0btransaction\x18\x03 \x01(\x0b\x32\x18.qrl.TransactionExtendedH\x00\x12,\n\x0e\x62lock_extended\x18\x04 \x01(\x0b\x32\x12.qrl.BlockExtendedH\x00\x42\x08\n\x06result\"\xb7\x01\n\x10GetLatestDataReq\x12,\n\x06\x66ilter\x18\x01 \x01(\x0e\x32\x1c.qrl.GetLatestDataReq.Filter\x12\x0e\n\x06offset\x18\x02 \x01(\r\x12\x10\n\x08quantity\x18\x03 \x01(\r\"S\n\x06\x46ilter\x12\x07\n\x03\x41LL\x10\x00\x12\x10\n\x0c\x42LOCKHEADERS\x10\x01\x12\x10\n\x0cTRANSACTIONS\x10\x02\x12\x1c\n\x18TRANSACTIONS_UNCONFIRMED\x10\x03\"\xaf\x01\n\x11GetLatestDataResp\x12.\n\x0c\x62lockheaders\x18\x01 \x03(\x0b\x32\x18.qrl.BlockHeaderExtended\x12.\n\x0ctransactions\x18\x02 \x03(\x0b\x32\x18.qrl.TransactionExtended\x12:\n\x18transactions_unconfirmed\x18\x03 \x03(\x0b\x32\x18.qrl.TransactionExtended\"\x82\x01\n\x10TransferCoinsReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x02 \x03(\x0c\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x12\x14\n\x0cmessage_data\x18\x04 \x01(\x0c\x12\x0b\n\x03\x66\x65\x65\x18\x05 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x06 \x01(\x0c\"T\n\x11TransferCoinsResp\x12?\n\x1d\x65xtended_transaction_unsigned\x18\x01 \x01(\x0b\x32\x18.qrl.TransactionExtended\"B\n\x12PushTransactionReq\x12,\n\x12transaction_signed\x18\x01 \x01(\x0b\x32\x10.qrl.Transaction\"\xca\x01\n\x13PushTransactionResp\x12\x39\n\nerror_code\x18\x01 \x01(\x0e\x32%.qrl.PushTransactionResp.ResponseCode\x12\x19\n\x11\x65rror_description\x18\x02 \x01(\t\x12\x0f\n\x07tx_hash\x18\x03 \x01(\x0c\"L\n\x0cResponseCode\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x15\n\x11VALIDATION_FAILED\x10\x02\x12\r\n\tSUBMITTED\x10\x03\"\x82\x01\n\x14MultiSigCreateTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x13\n\x0bsignatories\x18\x02 \x03(\x0c\x12\x0f\n\x07weights\x18\x03 \x03(\r\x12\x11\n\tthreshold\x18\x04 \x01(\r\x12\x0b\n\x03\x66\x65\x65\x18\x05 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x06 \x01(\x0c\"\xa3\x01\n\x13MultiSigSpendTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x19\n\x11multi_sig_address\x18\x02 \x01(\x0c\x12\x10\n\x08\x61\x64\x64rs_to\x18\x03 \x03(\x0c\x12\x0f\n\x07\x61mounts\x18\x04 \x03(\x04\x12\x1b\n\x13\x65xpiry_block_number\x18\x05 \x01(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x06 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x07 \x01(\x0c\"k\n\x12MultiSigVoteTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x12\n\nshared_key\x18\x02 \x01(\x0c\x12\x0e\n\x06unvote\x18\x03 \x01(\x08\x12\x0b\n\x03\x66\x65\x65\x18\x04 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x05 \x01(\x0c\"d\n\rMessageTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64r_to\x18\x03 \x01(\x0c\x12\x0b\n\x03\x66\x65\x65\x18\x04 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x05 \x01(\x0c\"\xad\x01\n\x0bTokenTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x0e\n\x06symbol\x18\x02 \x01(\x0c\x12\x0c\n\x04name\x18\x03 \x01(\x0c\x12\r\n\x05owner\x18\x04 \x01(\x0c\x12\x10\n\x08\x64\x65\x63imals\x18\x05 \x01(\x04\x12,\n\x10initial_balances\x18\x06 \x03(\x0b\x32\x12.qrl.AddressAmount\x12\x0b\n\x03\x66\x65\x65\x18\x07 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x08 \x01(\x0c\"\x85\x01\n\x13TransferTokenTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64resses_to\x18\x02 \x03(\x0c\x12\x14\n\x0ctoken_txhash\x18\x03 \x01(\x0c\x12\x0f\n\x07\x61mounts\x18\x04 \x03(\x04\x12\x0b\n\x03\x66\x65\x65\x18\x05 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x06 \x01(\x0c\"i\n\x0bSlaveTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x11\n\tslave_pks\x18\x02 \x03(\x0c\x12\x14\n\x0c\x61\x63\x63\x65ss_types\x18\x03 \x03(\r\x12\x0b\n\x03\x66\x65\x65\x18\x04 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x05 \x01(\x0c\"i\n\rLatticeTxnReq\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x0b\n\x03pk1\x18\x02 \x01(\x0c\x12\x0b\n\x03pk2\x18\x03 \x01(\x0c\x12\x0b\n\x03pk3\x18\x04 \x01(\x0c\x12\x0b\n\x03\x66\x65\x65\x18\x05 \x01(\x04\x12\x0f\n\x07xmss_pk\x18\x06 \x01(\x0c\"H\n\x0fMiniTransaction\x12\x18\n\x10transaction_hash\x18\x01 \x01(\t\x12\x0b\n\x03out\x18\x02 \x01(\x08\x12\x0e\n\x06\x61mount\x18\x03 \x01(\x04\"$\n\x11GetTransactionReq\x12\x0f\n\x07tx_hash\x18\x01 \x01(\x0c\"\xa0\x01\n\x12GetTransactionResp\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.qrl.Transaction\x12\x15\n\rconfirmations\x18\x02 \x01(\x04\x12\x14\n\x0c\x62lock_number\x18\x03 \x01(\x04\x12\x19\n\x11\x62lock_header_hash\x18\x04 \x01(\x0c\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12\x11\n\taddr_from\x18\x06 \x01(\x0c\"^\n\x1fGetMiniTransactionsByAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x15\n\ritem_per_page\x18\x02 \x01(\x04\x12\x13\n\x0bpage_number\x18\x03 \x01(\x04\"d\n GetMiniTransactionsByAddressResp\x12/\n\x11mini_transactions\x18\x01 \x03(\x0b\x32\x14.qrl.MiniTransaction\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\"Z\n\x1bGetTransactionsByAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x15\n\ritem_per_page\x18\x02 \x01(\x04\x12\x13\n\x0bpage_number\x18\x03 \x01(\x04\"T\n\x1cGetTransactionsByAddressResp\x12\x34\n\x13transactions_detail\x18\x01 \x03(\x0b\x32\x17.qrl.GetTransactionResp\"\xb8\x02\n\x1fGetMultiSigSpendTxsByAddressReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x15\n\ritem_per_page\x18\x02 \x01(\x04\x12\x13\n\x0bpage_number\x18\x03 \x01(\x04\x12\x44\n\x0b\x66ilter_type\x18\x04 \x01(\x0e\x32/.qrl.GetMultiSigSpendTxsByAddressReq.FilterType\"\x91\x01\n\nFilterType\x12\x08\n\x04NONE\x10\x00\x12\x11\n\rEXECUTED_ONLY\x10\x01\x12\x10\n\x0cNON_EXECUTED\x10\x02\x12\x0b\n\x07\x45XPIRED\x10\x03\x12\x0f\n\x0bNON_EXPIRED\x10\x04\x12\x18\n\x14NON_EXECUTED_EXPIRED\x10\x05\x12\x1c\n\x18NON_EXECUTED_NON_EXPIRED\x10\x06\"X\n GetMultiSigSpendTxsByAddressResp\x12\x34\n\x13transactions_detail\x18\x01 \x03(\x0b\x32\x17.qrl.GetTransactionResp\"2\n\x0fGetVoteStatsReq\x12\x1f\n\x17multi_sig_spend_tx_hash\x18\x01 \x01(\x0c\"6\n\x10GetVoteStatsResp\x12\"\n\nvote_stats\x18\x01 \x01(\x0b\x32\x0e.qrl.VoteStats\"U\n\x1dGetInboxMessagesByAddressResp\x12\x34\n\x13transactions_detail\x18\x01 \x03(\x0b\x32\x17.qrl.GetTransactionResp\"l\n\x0cInboxMessage\x12\x11\n\taddr_from\x18\x01 \x01(\x0c\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0f\n\x07tx_hash\x18\x04 \x01(\x0c\x12\x14\n\x0c\x62lock_number\x18\x05 \x01(\x04\"R\n\x0bTokenDetail\x12\x14\n\x0ctoken_txhash\x18\x01 \x01(\x0c\x12\x0c\n\x04name\x18\x02 \x01(\x0c\x12\x0e\n\x06symbol\x18\x03 \x01(\x0c\x12\x0f\n\x07\x62\x61lance\x18\x04 \x01(\x04\"A\n\x16GetTokensByAddressResp\x12\'\n\rtokens_detail\x18\x01 \x03(\x0b\x32\x10.qrl.TokenDetail\"9\n\x0bSlaveDetail\x12\x15\n\rslave_address\x18\x01 \x01(\x0c\x12\x13\n\x0b\x61\x63\x63\x65ss_type\x18\x02 \x01(\x04\"A\n\x16GetSlavesByAddressResp\x12\'\n\rslaves_detail\x18\x01 \x03(\x0b\x32\x10.qrl.SlaveDetail\"J\n\x10LatticePKsDetail\x12\x0b\n\x03pk1\x18\x01 \x01(\x0c\x12\x0b\n\x03pk2\x18\x02 \x01(\x0c\x12\x0b\n\x03pk3\x18\x03 \x01(\x0c\x12\x0f\n\x07tx_hash\x18\x04 \x01(\x0c\"O\n\x1aGetLatticePKsByAddressResp\x12\x31\n\x12lattice_pks_detail\x18\x01 \x03(\x0b\x32\x15.qrl.LatticePKsDetail\"2\n\x0eMultiSigDetail\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\"R\n!GetMultiSigAddressesByAddressResp\x12-\n\x10multi_sig_detail\x18\x01 \x03(\x0b\x32\x13.qrl.MultiSigDetail\" \n\rGetBalanceReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\"!\n\x0eGetBalanceResp\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\"\'\n\x12GetTotalBalanceReq\x12\x11\n\taddresses\x18\x01 \x03(\x0c\"&\n\x13GetTotalBalanceResp\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\"b\n\tGetOTSReq\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tpage_from\x18\x02 \x01(\x04\x12\x12\n\npage_count\x18\x03 \x01(\x04\x12\x1d\n\x15unused_ots_index_from\x18\x04 \x01(\x04\">\n\x11OTSBitfieldByPage\x12\x14\n\x0cots_bitfield\x18\x01 \x03(\x0c\x12\x13\n\x0bpage_number\x18\x02 \x01(\x04\"\x81\x01\n\nGetOTSResp\x12\x34\n\x14ots_bitfield_by_page\x18\x01 \x03(\x0b\x32\x16.qrl.OTSBitfieldByPage\x12\x1d\n\x15next_unused_ots_index\x18\x02 \x01(\x04\x12\x1e\n\x16unused_ots_index_found\x18\x03 \x01(\x08\"\x0e\n\x0cGetHeightReq\"\x1f\n\rGetHeightResp\x12\x0e\n\x06height\x18\x01 \x01(\x04\"\"\n\x0bGetBlockReq\x12\x13\n\x0bheader_hash\x18\x01 \x01(\x0c\")\n\x0cGetBlockResp\x12\x19\n\x05\x62lock\x18\x01 \x01(\x0b\x32\n.qrl.Block\"+\n\x13GetBlockByNumberReq\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\"1\n\x14GetBlockByNumberResp\x12\x19\n\x05\x62lock\x18\x01 \x01(\x0b\x32\n.qrl.Block\"\x16\n\x14GetLocalAddressesReq\"*\n\x15GetLocalAddressesResp\x12\x11\n\taddresses\x18\x01 \x03(\x0c\"\x8d\x02\n\x08NodeInfo\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\"\n\x05state\x18\x02 \x01(\x0e\x32\x13.qrl.NodeInfo.State\x12\x17\n\x0fnum_connections\x18\x03 \x01(\r\x12\x17\n\x0fnum_known_peers\x18\x04 \x01(\r\x12\x0e\n\x06uptime\x18\x05 \x01(\x04\x12\x14\n\x0c\x62lock_height\x18\x06 \x01(\x04\x12\x17\n\x0f\x62lock_last_hash\x18\x07 \x01(\x0c\x12\x12\n\nnetwork_id\x18\x08 \x01(\t\"G\n\x05State\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0c\n\x08UNSYNCED\x10\x01\x12\x0b\n\x07SYNCING\x10\x02\x12\n\n\x06SYNCED\x10\x03\x12\n\n\x06\x46ORKED\x10\x04\"\x85\x01\n\x11\x41\x64\x64ressDescriptor\x12\x15\n\rhash_function\x18\x01 \x01(\t\x12\x18\n\x10signature_scheme\x18\x02 \x01(\t\x12\x13\n\x0btree_height\x18\x03 \x01(\r\x12\x12\n\nsignatures\x18\x04 \x01(\r\x12\x16\n\x0e\x61\x64\x64ress_format\x18\x05 \x01(\t\"\'\n\x0bStoredPeers\x12\x18\n\x05peers\x18\x01 \x03(\x0b\x32\t.qrl.Peer\"\x12\n\x04Peer\x12\n\n\x02ip\x18\x01 \x01(\t\"\x91\x03\n\x0c\x41\x64\x64ressState\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\x12\r\n\x05nonce\x18\x03 \x01(\x04\x12\x14\n\x0cots_bitfield\x18\x04 \x03(\x0c\x12\x1a\n\x12transaction_hashes\x18\x05 \x03(\x0c\x12-\n\x06tokens\x18\x06 \x03(\x0b\x32\x1d.qrl.AddressState.TokensEntry\x12&\n\x0elatticePK_list\x18\x07 \x03(\x0b\x32\x0e.qrl.LatticePK\x12H\n\x15slave_pks_access_type\x18\x08 \x03(\x0b\x32).qrl.AddressState.SlavePksAccessTypeEntry\x12\x13\n\x0bots_counter\x18\t \x01(\x04\x1a-\n\x0bTokensEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a\x39\n\x17SlavePksAccessTypeEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\xe0\x03\n\x15OptimizedAddressState\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\x12\r\n\x05nonce\x18\x03 \x01(\x04\x12\x1e\n\x16ots_bitfield_used_page\x18\x04 \x01(\x04\x12\x1a\n\x12used_ots_key_count\x18\x05 \x01(\x04\x12\x1e\n\x16transaction_hash_count\x18\x06 \x01(\x04\x12\x14\n\x0ctokens_count\x18\x07 \x01(\x04\x12\x14\n\x0cslaves_count\x18\x08 \x01(\x04\x12\x18\n\x10lattice_pk_count\x18\t \x01(\x04\x12\x1f\n\x17multi_sig_address_count\x18\n \x01(\x04\x12\x1d\n\x15multi_sig_spend_count\x18\x0b \x01(\x04\x12\x1b\n\x13inbox_message_count\x18\x0c \x01(\x04\x12+\n#foundation_multi_sig_spend_txn_hash\x18\r \x03(\x0c\x12*\n\"foundation_multi_sig_vote_txn_hash\x18\x0e \x03(\x0c\x12\x0f\n\x07unvotes\x18\x0f \x03(\x0c\x12-\n\x13proposal_vote_stats\x18\x10 \x03(\x0b\x32\x10.qrl.Transaction\"\x93\x03\n\x14MultiSigAddressState\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x18\n\x10\x63reation_tx_hash\x18\x02 \x01(\x0c\x12\r\n\x05nonce\x18\x03 \x01(\x04\x12\x0f\n\x07\x62\x61lance\x18\x04 \x01(\x04\x12\x13\n\x0bsignatories\x18\x05 \x03(\x0c\x12\x0f\n\x07weights\x18\x06 \x03(\r\x12\x11\n\tthreshold\x18\x07 \x01(\r\x12\x1e\n\x16transaction_hash_count\x18\x08 \x01(\x04\x12\x1d\n\x15multi_sig_spend_count\x18\t \x01(\x04\x12\x1f\n\x17multi_sig_address_count\x18\n \x01(\x04\x12+\n#foundation_multi_sig_spend_txn_hash\x18\x0b \x03(\x0c\x12*\n\"foundation_multi_sig_vote_txn_hash\x18\x0c \x03(\x0c\x12\x0f\n\x07unvotes\x18\r \x03(\x0c\x12-\n\x13proposal_vote_stats\x18\x0e \x03(\x0b\x32\x10.qrl.Transaction\"\'\n\x15MultiSigAddressesList\x12\x0e\n\x06hashes\x18\x01 \x03(\x0c\"\x1a\n\x08\x44\x61taList\x12\x0e\n\x06values\x18\x01 \x03(\x0c\"\x1d\n\x08\x42itfield\x12\x11\n\tbitfields\x18\x01 \x03(\x0c\"%\n\x13TransactionHashList\x12\x0e\n\x06hashes\x18\x01 \x03(\x0c\"3\n\tLatticePK\x12\x10\n\x08kyber_pk\x18\x01 \x01(\x0c\x12\x14\n\x0c\x64ilithium_pk\x18\x02 \x01(\x0c\"0\n\rAddressAmount\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x04\"\xd7\x01\n\x0b\x42lockHeader\x12\x13\n\x0bhash_header\x18\x01 \x01(\x0c\x12\x14\n\x0c\x62lock_number\x18\x02 \x01(\x04\x12\x19\n\x11timestamp_seconds\x18\x03 \x01(\x04\x12\x18\n\x10hash_header_prev\x18\x04 \x01(\x0c\x12\x14\n\x0creward_block\x18\x05 \x01(\x04\x12\x12\n\nreward_fee\x18\x06 \x01(\x04\x12\x13\n\x0bmerkle_root\x18\x07 \x01(\x0c\x12\x14\n\x0cmining_nonce\x18\x08 \x01(\r\x12\x13\n\x0b\x65xtra_nonce\x18\t \x01(\x04\"i\n\x13\x42lockHeaderExtended\x12 \n\x06header\x18\x01 \x01(\x0b\x32\x10.qrl.BlockHeader\x12\x30\n\x11transaction_count\x18\x02 \x01(\x0b\x32\x15.qrl.TransactionCount\"q\n\x10TransactionCount\x12/\n\x05\x63ount\x18\x01 \x03(\x0b\x32 .qrl.TransactionCount.CountEntry\x1a,\n\nCountEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\x91\x01\n\x13TransactionExtended\x12 \n\x06header\x18\x01 \x01(\x0b\x32\x10.qrl.BlockHeader\x12\x1c\n\x02tx\x18\x02 \x01(\x0b\x32\x10.qrl.Transaction\x12\x11\n\taddr_from\x18\x03 \x01(\x0c\x12\x0c\n\x04size\x18\x04 \x01(\x04\x12\x19\n\x11timestamp_seconds\x18\x05 \x01(\x04\"\xa6\x01\n\rBlockExtended\x12 \n\x06header\x18\x01 \x01(\x0b\x32\x10.qrl.BlockHeader\x12\x37\n\x15\x65xtended_transactions\x18\x02 \x03(\x0b\x32\x18.qrl.TransactionExtended\x12,\n\x0fgenesis_balance\x18\x03 \x03(\x0b\x32\x13.qrl.GenesisBalance\x12\x0c\n\x04size\x18\x04 \x01(\x04\"\x7f\n\x05\x42lock\x12 \n\x06header\x18\x01 \x01(\x0b\x32\x10.qrl.BlockHeader\x12&\n\x0ctransactions\x18\x02 \x03(\x0b\x32\x10.qrl.Transaction\x12,\n\x0fgenesis_balance\x18\x03 \x03(\x0b\x32\x13.qrl.GenesisBalance\"2\n\x0eGenesisBalance\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x0f\n\x07\x62\x61lance\x18\x02 \x01(\x04\"D\n\x11\x42lockMetaDataList\x12/\n\x13\x62lock_number_hashes\x18\x01 \x03(\x0b\x32\x12.qrl.BlockMetaData\"\xaa\x15\n\x0bTransaction\x12\x13\n\x0bmaster_addr\x18\x01 \x01(\x0c\x12\x0b\n\x03\x66\x65\x65\x18\x02 \x01(\x04\x12\x12\n\npublic_key\x18\x03 \x01(\x0c\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\r\n\x05nonce\x18\x05 \x01(\x04\x12\x18\n\x10transaction_hash\x18\x06 \x01(\x0c\x12-\n\x08transfer\x18\x07 \x01(\x0b\x32\x19.qrl.Transaction.TransferH\x00\x12-\n\x08\x63oinbase\x18\x08 \x01(\x0b\x32\x19.qrl.Transaction.CoinBaseH\x00\x12\x36\n\tlatticePK\x18\t \x01(\x0b\x32!.qrl.Transaction.LatticePublicKeyH\x00\x12+\n\x07message\x18\n \x01(\x0b\x32\x18.qrl.Transaction.MessageH\x00\x12\'\n\x05token\x18\x0b \x01(\x0b\x32\x16.qrl.Transaction.TokenH\x00\x12\x38\n\x0etransfer_token\x18\x0c \x01(\x0b\x32\x1e.qrl.Transaction.TransferTokenH\x00\x12\'\n\x05slave\x18\r \x01(\x0b\x32\x16.qrl.Transaction.SlaveH\x00\x12;\n\x10multi_sig_create\x18\x0e \x01(\x0b\x32\x1f.qrl.Transaction.MultiSigCreateH\x00\x12\x39\n\x0fmulti_sig_spend\x18\x0f \x01(\x0b\x32\x1e.qrl.Transaction.MultiSigSpendH\x00\x12\x37\n\x0emulti_sig_vote\x18\x10 \x01(\x0b\x32\x1d.qrl.Transaction.MultiSigVoteH\x00\x12:\n\x0fproposal_create\x18\x11 \x01(\x0b\x32\x1f.qrl.Transaction.ProposalCreateH\x00\x12\x36\n\rproposal_vote\x18\x12 \x01(\x0b\x32\x1d.qrl.Transaction.ProposalVoteH\x00\x1a\x43\n\x08Transfer\x12\x10\n\x08\x61\x64\x64rs_to\x18\x01 \x03(\x0c\x12\x0f\n\x07\x61mounts\x18\x02 \x03(\x04\x12\x14\n\x0cmessage_data\x18\x03 \x01(\x0c\x1a+\n\x08\x43oinBase\x12\x0f\n\x07\x61\x64\x64r_to\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x04\x1a\x39\n\x10LatticePublicKey\x12\x0b\n\x03pk1\x18\x01 \x01(\x0c\x12\x0b\n\x03pk2\x18\x02 \x01(\x0c\x12\x0b\n\x03pk3\x18\x03 \x01(\x0c\x1a\x30\n\x07Message\x12\x14\n\x0cmessage_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64r_to\x18\x02 \x01(\x0c\x1at\n\x05Token\x12\x0e\n\x06symbol\x18\x01 \x01(\x0c\x12\x0c\n\x04name\x18\x02 \x01(\x0c\x12\r\n\x05owner\x18\x03 \x01(\x0c\x12\x10\n\x08\x64\x65\x63imals\x18\x04 \x01(\x04\x12,\n\x10initial_balances\x18\x05 \x03(\x0b\x32\x12.qrl.AddressAmount\x1aH\n\rTransferToken\x12\x14\n\x0ctoken_txhash\x18\x01 \x01(\x0c\x12\x10\n\x08\x61\x64\x64rs_to\x18\x02 \x03(\x0c\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x1a\x30\n\x05Slave\x12\x11\n\tslave_pks\x18\x01 \x03(\x0c\x12\x14\n\x0c\x61\x63\x63\x65ss_types\x18\x02 \x03(\r\x1aI\n\x0eMultiSigCreate\x12\x13\n\x0bsignatories\x18\x01 \x03(\x0c\x12\x0f\n\x07weights\x18\x02 \x03(\r\x12\x11\n\tthreshold\x18\x03 \x01(\r\x1aj\n\rMultiSigSpend\x12\x19\n\x11multi_sig_address\x18\x01 \x01(\x0c\x12\x10\n\x08\x61\x64\x64rs_to\x18\x02 \x03(\x0c\x12\x0f\n\x07\x61mounts\x18\x03 \x03(\x04\x12\x1b\n\x13\x65xpiry_block_number\x18\x04 \x01(\x04\x1aH\n\x0cMultiSigVote\x12\x12\n\nshared_key\x18\x01 \x01(\x0c\x12\x0e\n\x06unvote\x18\x02 \x01(\x08\x12\x14\n\x0cprev_tx_hash\x18\x03 \x01(\x0c\x1a\x9b\t\n\x0eProposalCreate\x12\x1b\n\x13\x65xpiry_block_number\x18\x01 \x01(\x04\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x32\n\x03qip\x18\x03 \x01(\x0b\x32#.qrl.Transaction.ProposalCreate.QIPH\x00\x12\x38\n\x06\x63onfig\x18\x04 \x01(\x0b\x32&.qrl.Transaction.ProposalCreate.ConfigH\x00\x12\x36\n\x05other\x18\x05 \x01(\x0b\x32%.qrl.Transaction.ProposalCreate.OtherH\x00\x1a\x17\n\x03QIP\x12\x10\n\x08qip_link\x18\x01 \x01(\t\x1a\xed\x06\n\x06\x43onfig\x12\x18\n\x10\x63hanges_bitfield\x18\x01 \x03(\x0c\x12\x13\n\x0breorg_limit\x18\x02 \x01(\x04\x12\x17\n\x0fmax_coin_supply\x18\x03 \x01(\x04\x12,\n$complete_emission_time_span_in_years\x18\x04 \x01(\x04\x12\x1b\n\x13mining_nonce_offset\x18\x05 \x01(\x04\x12\x1a\n\x12\x65xtra_nonce_offset\x18\x06 \x01(\x04\x12!\n\x19mining_blob_size_in_bytes\x18\x07 \x01(\x04\x12\x1f\n\x17\x62lock_timing_in_seconds\x18\x08 \x01(\x04\x12 \n\x18number_of_blocks_analyze\x18\t \x01(\x04\x12\x1d\n\x15\x62lock_size_multiplier\x18\n \x01(\x04\x12%\n\x1d\x62lock_min_size_limit_in_bytes\x18\x0b \x01(\x04\x12&\n\x1etransaction_multi_output_limit\x18\x0c \x01(\x04\x12\x1a\n\x12message_max_length\x18\r \x01(\x04\x12\x1f\n\x17token_symbol_max_length\x18\x0e \x01(\x04\x12\x1d\n\x15token_name_max_length\x18\x0f \x01(\x04\x12\x1e\n\x16lattice_pk1_max_length\x18\x10 \x01(\x04\x12\x1e\n\x16lattice_pk2_max_length\x18\x11 \x01(\x04\x12\x1e\n\x16lattice_pk3_max_length\x18\x12 \x01(\x04\x12\x39\n1foundation_multi_sig_address_threshold_percentage\x18\x13 \x01(\x04\x12\x1e\n\x16proposal_threshold_per\x18\x14 \x01(\x04\x12 \n\x18proposal_default_options\x18\x15 \x03(\t\x12\x1e\n\x16\x64\x65scription_max_length\x18\x16 \x01(\x04\x12\x1a\n\x12options_max_number\x18\x17 \x01(\x04\x12\x1e\n\x16option_max_text_length\x18\x18 \x01(\x04\x12(\n proposal_config_activation_delay\x18\x19 \x01(\x04\x12\x15\n\rN_measurement\x18\x1a \x01(\x04\x12\n\n\x02kp\x18\x1b \x01(\x04\x1a\x18\n\x05Other\x12\x0f\n\x07options\x18\x01 \x03(\tB\x0e\n\x0cproposalType\x1a\x32\n\x0cProposalVote\x12\x12\n\nshared_key\x18\x01 \x01(\x0c\x12\x0e\n\x06option\x18\x02 \x01(\rB\x11\n\x0ftransactionType\"\xb8\x01\n\tVoteStats\x12\x19\n\x11multi_sig_address\x18\x01 \x01(\x0c\x12\x12\n\nshared_key\x18\x02 \x01(\x0c\x12\x13\n\x0bsignatories\x18\x03 \x03(\x0c\x12\x11\n\ttx_hashes\x18\x04 \x03(\x0c\x12\x0f\n\x07unvotes\x18\x05 \x03(\x08\x12\x1b\n\x13\x65xpiry_block_number\x18\x06 \x01(\x04\x12\x14\n\x0ctotal_weight\x18\x07 \x01(\x04\x12\x10\n\x08\x65xecuted\x18\x08 \x01(\x08\"\xb7\x01\n\x11ProposalVoteStats\x12\x11\n\taddr_from\x18\x01 \x01(\x0c\x12\x12\n\nshared_key\x18\x02 \x01(\x0c\x12\x15\n\rproposal_type\x18\x03 \x01(\t\x12\x18\n\x10weight_by_option\x18\x04 \x03(\x04\x12\x1b\n\x13\x65xpiry_block_number\x18\x05 \x01(\x04\x12\x10\n\x08\x65xecuted\x18\x06 \x01(\x08\x12\x1b\n\x13number_of_tx_hashes\x18\x07 \x01(\x04\"-\n\x0eProposalRecord\x12\x1b\n\x13number_of_tx_hashes\x18\x01 \x01(\x04\"!\n\tTokenList\x12\x14\n\x0ctoken_txhash\x18\x01 \x03(\x0c\"R\n\x0cTokenBalance\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08\x64\x65\x63imals\x18\x02 \x01(\x04\x12\x0f\n\x07tx_hash\x18\x03 \x01(\x0c\x12\x0e\n\x06\x64\x65lete\x18\x04 \x01(\x08\"E\n\rSlaveMetadata\x12\x13\n\x0b\x61\x63\x63\x65ss_type\x18\x01 \x01(\x04\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\x12\x0e\n\x06\x64\x65lete\x18\x03 \x01(\x08\"E\n\x11LatticePKMetadata\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\x12\x0e\n\x06\x64\x65lete\x18\x03 \x01(\x08\"G\n\rTokenMetadata\x12\x14\n\x0ctoken_txhash\x18\x01 \x01(\x0c\x12 \n\x18transfer_token_tx_hashes\x18\x02 \x03(\x0c\"\xc4\x01\n\x19\x45ncryptedEphemeralMessage\x12\x0e\n\x06msg_id\x18\x01 \x01(\x0c\x12\x0b\n\x03ttl\x18\x02 \x01(\x04\x12\x0b\n\x03ttr\x18\x03 \x01(\x04\x12\x37\n\x07\x63hannel\x18\x05 \x01(\x0b\x32&.qrl.EncryptedEphemeralMessage.Channel\x12\r\n\x05nonce\x18\x06 \x01(\x04\x12\x0f\n\x07payload\x18\x07 \x01(\x0c\x1a$\n\x07\x43hannel\x12\x19\n\x11\x65nc_aes256_symkey\x18\x04 \x01(\x0c\" \n\x0b\x41\x64\x64ressList\x12\x11\n\taddresses\x18\x01 \x03(\x0c\"`\n\x0f\x42lockHeightData\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\x12\x18\n\x10\x62lock_headerhash\x18\x02 \x01(\x0c\x12\x1d\n\x15\x63umulative_difficulty\x18\x03 \x01(\x0c\"\x81\x01\n\rBlockMetaData\x12\x18\n\x10\x62lock_difficulty\x18\x01 \x01(\x0c\x12\x1d\n\x15\x63umulative_difficulty\x18\x02 \x01(\x0c\x12\x1a\n\x12\x63hild_headerhashes\x18\x03 \x03(\x0c\x12\x1b\n\x13last_N_headerhashes\x18\x04 \x03(\x0c\"A\n\x12\x42lockNumberMapping\x12\x12\n\nheaderhash\x18\x01 \x01(\x0c\x12\x17\n\x0fprev_headerhash\x18\x02 \x01(\x0c\"X\n\x08PeerStat\x12\x0f\n\x07peer_ip\x18\x01 \x01(\x0c\x12\x0c\n\x04port\x18\x02 \x01(\r\x12-\n\x10node_chain_state\x18\x03 \x01(\x0b\x32\x13.qrl.NodeChainState\"~\n\x0eNodeChainState\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\x12\x13\n\x0bheader_hash\x18\x02 \x01(\x0c\x12\x1d\n\x15\x63umulative_difficulty\x18\x03 \x01(\x0c\x12\x0f\n\x07version\x18\x04 \x01(\t\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\"<\n\x0eNodeHeaderHash\x12\x14\n\x0c\x62lock_number\x18\x01 \x01(\x04\x12\x14\n\x0cheaderhashes\x18\x02 \x03(\x0c\"-\n\x12P2PAcknowledgement\x12\x17\n\x0f\x62ytes_processed\x18\x01 \x01(\r\"|\n\x08PeerInfo\x12\x0f\n\x07peer_ip\x18\x01 \x01(\x0c\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x18\n\x10\x62\x61nned_timestamp\x18\x03 \x01(\r\x12\x13\n\x0b\x63redibility\x18\x04 \x01(\r\x12\"\n\x1alast_connections_timestamp\x18\x05 \x03(\r\".\n\x05Peers\x12%\n\x0epeer_info_list\x18\x01 \x03(\x0b\x32\r.qrl.PeerInfo\"\xbb\x0c\n\tDevConfig\x12\x16\n\x0eprev_state_key\x18\x01 \x01(\x0c\x12\x19\n\x11\x63urrent_state_key\x18\x02 \x01(\x0c\x12\x1e\n\x16\x61\x63tivation_header_hash\x18\x03 \x01(\x0c\x12\x1f\n\x17\x61\x63tivation_block_number\x18\x04 \x01(\x04\x12#\n\x05\x63hain\x18\x05 \x01(\x0b\x32\x14.qrl.DevConfig.Chain\x12#\n\x05\x62lock\x18\x06 \x01(\x0b\x32\x14.qrl.DevConfig.Block\x12/\n\x0btransaction\x18\x07 \x01(\x0b\x32\x1a.qrl.DevConfig.Transaction\x12\x1f\n\x03pow\x18\x08 \x01(\x0b\x32\x12.qrl.DevConfig.POW\x1a\x63\n\x05\x43hain\x12\x13\n\x0breorg_limit\x18\x01 \x01(\x04\x12\x17\n\x0fmax_coin_supply\x18\x02 \x01(\x04\x12,\n$complete_emission_time_span_in_years\x18\x03 \x01(\x04\x1a\xc6\x02\n\x05\x42lock\x12\x1b\n\x13mining_nonce_offset\x18\x01 \x01(\x04\x12\x1a\n\x12\x65xtra_nonce_offset\x18\x02 \x01(\x04\x12!\n\x19mining_blob_size_in_bytes\x18\x03 \x01(\x04\x12\x1f\n\x17\x62lock_timing_in_seconds\x18\x04 \x01(\x04\x12G\n\x15\x62lock_size_controller\x18\x05 \x01(\x0b\x32(.qrl.DevConfig.Block.BlockSizeController\x1aw\n\x13\x42lockSizeController\x12 \n\x18number_of_blocks_analyze\x18\x01 \x01(\x04\x12\x17\n\x0fsize_multiplier\x18\x02 \x01(\x04\x12%\n\x1d\x62lock_min_size_limit_in_bytes\x18\x03 \x01(\x04\x1a\xc5\x06\n\x0bTransaction\x12\x1a\n\x12multi_output_limit\x18\x01 \x01(\x04\x12\x33\n\x07message\x18\x02 \x01(\x0b\x32\".qrl.DevConfig.Transaction.Message\x12/\n\x05slave\x18\x03 \x01(\x0b\x32 .qrl.DevConfig.Transaction.Slave\x12/\n\x05token\x18\x04 \x01(\x0b\x32 .qrl.DevConfig.Transaction.Token\x12\x33\n\x07lattice\x18\x05 \x01(\x0b\x32\".qrl.DevConfig.Transaction.Lattice\x12K\n\x14\x66oundation_multi_sig\x18\x06 \x01(\x0b\x32-.qrl.DevConfig.Transaction.FoundationMultiSig\x12\x35\n\x08proposal\x18\x07 \x01(\x0b\x32#.qrl.DevConfig.Transaction.Proposal\x1a\x1d\n\x07Message\x12\x12\n\nmax_length\x18\x01 \x01(\x04\x1a$\n\x05Slave\x12\x1b\n\x13slave_pk_max_length\x18\x02 \x01(\x04\x1a;\n\x05Token\x12\x19\n\x11symbol_max_length\x18\x01 \x01(\x04\x12\x17\n\x0fname_max_length\x18\x02 \x01(\x04\x1aQ\n\x07Lattice\x12\x16\n\x0epk1_max_length\x18\x01 \x01(\x04\x12\x16\n\x0epk2_max_length\x18\x02 \x01(\x04\x12\x16\n\x0epk3_max_length\x18\x03 \x01(\x04\x1a\x32\n\x12\x46oundationMultiSig\x12\x1c\n\x14threshold_percentage\x18\x01 \x01(\x04\x1a\xc0\x01\n\x08Proposal\x12\x15\n\rthreshold_per\x18\x01 \x01(\x04\x12\x17\n\x0f\x64\x65\x66\x61ult_options\x18\x02 \x03(\t\x12\x1e\n\x16\x64\x65scription_max_length\x18\x03 \x01(\x04\x12\x1a\n\x12options_max_number\x18\x04 \x01(\x04\x12\x1e\n\x16option_max_text_length\x18\x05 \x01(\x04\x12(\n proposal_config_activation_delay\x18\x06 \x01(\x04\x1a(\n\x03POW\x12\x15\n\rN_measurement\x18\x01 \x01(\x04\x12\n\n\x02kp\x18\x02 \x01(\x04\x32\xd6\x15\n\tPublicAPI\x12;\n\x0cGetNodeState\x12\x14.qrl.GetNodeStateReq\x1a\x15.qrl.GetNodeStateResp\x12>\n\rGetKnownPeers\x12\x15.qrl.GetKnownPeersReq\x1a\x16.qrl.GetKnownPeersResp\x12;\n\x0cGetPeersStat\x12\x14.qrl.GetPeersStatReq\x1a\x15.qrl.GetPeersStatResp\x12/\n\x08GetStats\x12\x10.qrl.GetStatsReq\x1a\x11.qrl.GetStatsResp\x12\x44\n\x0fGetAddressState\x12\x17.qrl.GetAddressStateReq\x1a\x18.qrl.GetAddressStateResp\x12V\n\x18GetOptimizedAddressState\x12\x17.qrl.GetAddressStateReq\x1a!.qrl.GetOptimizedAddressStateResp\x12\\\n\x17GetMultiSigAddressState\x12\x1f.qrl.GetMultiSigAddressStateReq\x1a .qrl.GetMultiSigAddressStateResp\x12,\n\x07IsSlave\x12\x0f.qrl.IsSlaveReq\x1a\x10.qrl.IsSlaveResp\x12\x32\n\tGetObject\x12\x11.qrl.GetObjectReq\x1a\x12.qrl.GetObjectResp\x12>\n\rGetLatestData\x12\x15.qrl.GetLatestDataReq\x1a\x16.qrl.GetLatestDataResp\x12\x44\n\x0fPushTransaction\x12\x17.qrl.PushTransactionReq\x1a\x18.qrl.PushTransactionResp\x12>\n\rTransferCoins\x12\x15.qrl.TransferCoinsReq\x1a\x16.qrl.TransferCoinsResp\x12;\n\x0cParseAddress\x12\x14.qrl.ParseAddressReq\x1a\x15.qrl.ParseAddressResp\x12>\n\rGetChainStats\x12\x15.qrl.GetChainStatsReq\x1a\x16.qrl.GetChainStatsResp\x12G\n\x10GetAddressFromPK\x12\x18.qrl.GetAddressFromPKReq\x1a\x19.qrl.GetAddressFromPKResp\x12I\n\x14GetMultiSigCreateTxn\x12\x19.qrl.MultiSigCreateTxnReq\x1a\x16.qrl.TransferCoinsResp\x12G\n\x13GetMultiSigSpendTxn\x12\x18.qrl.MultiSigSpendTxnReq\x1a\x16.qrl.TransferCoinsResp\x12\x45\n\x12GetMultiSigVoteTxn\x12\x17.qrl.MultiSigVoteTxnReq\x1a\x16.qrl.TransferCoinsResp\x12;\n\rGetMessageTxn\x12\x12.qrl.MessageTxnReq\x1a\x16.qrl.TransferCoinsResp\x12\x37\n\x0bGetTokenTxn\x12\x10.qrl.TokenTxnReq\x1a\x16.qrl.TransferCoinsResp\x12G\n\x13GetTransferTokenTxn\x12\x18.qrl.TransferTokenTxnReq\x1a\x16.qrl.TransferCoinsResp\x12\x37\n\x0bGetSlaveTxn\x12\x10.qrl.SlaveTxnReq\x1a\x16.qrl.TransferCoinsResp\x12;\n\rGetLatticeTxn\x12\x12.qrl.LatticeTxnReq\x1a\x16.qrl.TransferCoinsResp\x12\x41\n\x0eGetTransaction\x12\x16.qrl.GetTransactionReq\x1a\x17.qrl.GetTransactionResp\x12k\n\x1cGetMiniTransactionsByAddress\x12$.qrl.GetMiniTransactionsByAddressReq\x1a%.qrl.GetMiniTransactionsByAddressResp\x12_\n\x18GetTransactionsByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a!.qrl.GetTransactionsByAddressResp\x12S\n\x12GetTokensByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a\x1b.qrl.GetTokensByAddressResp\x12S\n\x12GetSlavesByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a\x1b.qrl.GetSlavesByAddressResp\x12[\n\x16GetLatticePKsByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a\x1f.qrl.GetLatticePKsByAddressResp\x12i\n\x1dGetMultiSigAddressesByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a&.qrl.GetMultiSigAddressesByAddressResp\x12k\n\x1cGetMultiSigSpendTxsByAddress\x12$.qrl.GetMultiSigSpendTxsByAddressReq\x1a%.qrl.GetMultiSigSpendTxsByAddressResp\x12;\n\x0cGetVoteStats\x12\x14.qrl.GetVoteStatsReq\x1a\x15.qrl.GetVoteStatsResp\x12\x61\n\x19GetInboxMessagesByAddress\x12 .qrl.GetTransactionsByAddressReq\x1a\".qrl.GetInboxMessagesByAddressResp\x12\x35\n\nGetBalance\x12\x12.qrl.GetBalanceReq\x1a\x13.qrl.GetBalanceResp\x12\x44\n\x0fGetTotalBalance\x12\x17.qrl.GetTotalBalanceReq\x1a\x18.qrl.GetTotalBalanceResp\x12)\n\x06GetOTS\x12\x0e.qrl.GetOTSReq\x1a\x0f.qrl.GetOTSResp\x12\x32\n\tGetHeight\x12\x11.qrl.GetHeightReq\x1a\x12.qrl.GetHeightResp\x12/\n\x08GetBlock\x12\x10.qrl.GetBlockReq\x1a\x11.qrl.GetBlockResp\x12G\n\x10GetBlockByNumber\x12\x18.qrl.GetBlockByNumberReq\x1a\x19.qrl.GetBlockByNumberResp2\n\n\x08\x41\x64minAPIb\x06proto3') ) @@ -5645,8 +5645,15 @@ is_extension=False, extension_scope=None, options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='delete', full_name='qrl.TokenBalance.delete', index=2, - number=3, type=8, cpp_type=7, label=1, + name='tx_hash', full_name='qrl.TokenBalance.tx_hash', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='delete', full_name='qrl.TokenBalance.delete', index=3, + number=4, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -5664,7 +5671,7 @@ oneofs=[ ], serialized_start=12485, - serialized_end=12550, + serialized_end=12567, ) @@ -5708,8 +5715,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12552, - serialized_end=12621, + serialized_start=12569, + serialized_end=12638, ) @@ -5753,8 +5760,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12623, - serialized_end=12692, + serialized_start=12640, + serialized_end=12709, ) @@ -5791,8 +5798,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12694, - serialized_end=12765, + serialized_start=12711, + serialized_end=12782, ) @@ -5822,8 +5829,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12928, - serialized_end=12964, + serialized_start=12945, + serialized_end=12981, ) _ENCRYPTEDEPHEMERALMESSAGE = _descriptor.Descriptor( @@ -5887,8 +5894,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12768, - serialized_end=12964, + serialized_start=12785, + serialized_end=12981, ) @@ -5918,8 +5925,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12966, - serialized_end=12998, + serialized_start=12983, + serialized_end=13015, ) @@ -5963,8 +5970,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13000, - serialized_end=13096, + serialized_start=13017, + serialized_end=13113, ) @@ -6015,8 +6022,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13099, - serialized_end=13228, + serialized_start=13116, + serialized_end=13245, ) @@ -6053,8 +6060,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13230, - serialized_end=13295, + serialized_start=13247, + serialized_end=13312, ) @@ -6098,8 +6105,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13297, - serialized_end=13385, + serialized_start=13314, + serialized_end=13402, ) @@ -6157,8 +6164,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13387, - serialized_end=13513, + serialized_start=13404, + serialized_end=13530, ) @@ -6195,8 +6202,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13515, - serialized_end=13575, + serialized_start=13532, + serialized_end=13592, ) @@ -6226,8 +6233,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13577, - serialized_end=13622, + serialized_start=13594, + serialized_end=13639, ) @@ -6285,8 +6292,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13624, - serialized_end=13748, + serialized_start=13641, + serialized_end=13765, ) @@ -6316,8 +6323,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13750, - serialized_end=13796, + serialized_start=13767, + serialized_end=13813, ) @@ -6361,8 +6368,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14084, - serialized_end=14183, + serialized_start=14101, + serialized_end=14200, ) _DEVCONFIG_BLOCK_BLOCKSIZECONTROLLER = _descriptor.Descriptor( @@ -6405,8 +6412,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14393, - serialized_end=14512, + serialized_start=14410, + serialized_end=14529, ) _DEVCONFIG_BLOCK = _descriptor.Descriptor( @@ -6463,8 +6470,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14186, - serialized_end=14512, + serialized_start=14203, + serialized_end=14529, ) _DEVCONFIG_TRANSACTION_MESSAGE = _descriptor.Descriptor( @@ -6493,8 +6500,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14894, - serialized_end=14923, + serialized_start=14911, + serialized_end=14940, ) _DEVCONFIG_TRANSACTION_SLAVE = _descriptor.Descriptor( @@ -6523,8 +6530,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14925, - serialized_end=14961, + serialized_start=14942, + serialized_end=14978, ) _DEVCONFIG_TRANSACTION_TOKEN = _descriptor.Descriptor( @@ -6560,8 +6567,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14963, - serialized_end=15022, + serialized_start=14980, + serialized_end=15039, ) _DEVCONFIG_TRANSACTION_LATTICE = _descriptor.Descriptor( @@ -6604,8 +6611,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15024, - serialized_end=15105, + serialized_start=15041, + serialized_end=15122, ) _DEVCONFIG_TRANSACTION_FOUNDATIONMULTISIG = _descriptor.Descriptor( @@ -6634,8 +6641,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15107, - serialized_end=15157, + serialized_start=15124, + serialized_end=15174, ) _DEVCONFIG_TRANSACTION_PROPOSAL = _descriptor.Descriptor( @@ -6699,8 +6706,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15160, - serialized_end=15352, + serialized_start=15177, + serialized_end=15369, ) _DEVCONFIG_TRANSACTION = _descriptor.Descriptor( @@ -6771,8 +6778,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14515, - serialized_end=15352, + serialized_start=14532, + serialized_end=15369, ) _DEVCONFIG_POW = _descriptor.Descriptor( @@ -6808,8 +6815,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15354, - serialized_end=15394, + serialized_start=15371, + serialized_end=15411, ) _DEVCONFIG = _descriptor.Descriptor( @@ -6887,8 +6894,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13799, - serialized_end=15394, + serialized_start=13816, + serialized_end=15411, ) _GETNODESTATERESP.fields_by_name['info'].message_type = _NODEINFO @@ -8255,8 +8262,8 @@ file=DESCRIPTOR, index=0, options=None, - serialized_start=15397, - serialized_end=18171, + serialized_start=15414, + serialized_end=18188, methods=[ _descriptor.MethodDescriptor( name='GetNodeState', @@ -8621,8 +8628,8 @@ file=DESCRIPTOR, index=1, options=None, - serialized_start=18173, - serialized_end=18183, + serialized_start=18190, + serialized_end=18200, methods=[ ]) _sym_db.RegisterServiceDescriptor(_ADMINAPI) diff --git a/src/qrl/protos/qrl.proto b/src/qrl/protos/qrl.proto index b0c517d9b..022de4a0c 100644 --- a/src/qrl/protos/qrl.proto +++ b/src/qrl/protos/qrl.proto @@ -946,7 +946,8 @@ message TokenList { message TokenBalance { uint64 balance = 1; uint64 decimals = 2; - bool delete = 3; // For internal use only + bytes tx_hash = 3; // Tx hash responsible for the creation of this data + bool delete = 4; // For internal use only } message SlaveMetadata { From 814a824eceee98f3bc529d5b228e3a1ed36e12b2 Mon Sep 17 00:00:00 2001 From: cyyber Date: Sat, 14 Mar 2020 13:43:07 +0530 Subject: [PATCH 17/23] Reject MultiSigVote in case of invalid shared_key --- src/qrl/core/txs/multisig/MultiSigVote.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qrl/core/txs/multisig/MultiSigVote.py b/src/qrl/core/txs/multisig/MultiSigVote.py index 61aa1dcf9..9f49e72bb 100644 --- a/src/qrl/core/txs/multisig/MultiSigVote.py +++ b/src/qrl/core/txs/multisig/MultiSigVote.py @@ -74,6 +74,9 @@ def _validate_extended(self, state_container: StateContainer): addr_from_state = state_container.addresses_state[self.addr_from] vote_stats = state_container.votes_stats[self.shared_key] + if vote_stats is None: + logger.warning("[MultiSigVote] Invalid Shared key %s", bin2hstr(self.shared_key)) + return False multi_sig_spend_tx = state_container.multi_sig_spend_txs[self.shared_key] block_number = state_container.block_number if vote_stats.executed: From 2582b5f93f66df3bc7816be2da22a9510049f5c0 Mon Sep 17 00:00:00 2001 From: cyyber Date: Sun, 15 Mar 2020 20:49:04 +0530 Subject: [PATCH 18/23] Avoid removal of token_txhash multiple times from paginated token hash --- src/qrl/core/txs/TransferTokenTransaction.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qrl/core/txs/TransferTokenTransaction.py b/src/qrl/core/txs/TransferTokenTransaction.py index 989353e3c..047388bd9 100644 --- a/src/qrl/core/txs/TransferTokenTransaction.py +++ b/src/qrl/core/txs/TransferTokenTransaction.py @@ -190,7 +190,11 @@ def revert(self, key = (addr_to, self.token_txhash) state_container.tokens.data[key].balance -= amount - if state_container.tokens.data[key].tx_hash == self.txhash: + # There is a chance that same address is transmitted with token multiple times, + # in such a case, to avoid removal of token_txhash from paginated_tokens_hash + # delete must be checked for false + if state_container.tokens.data[key].tx_hash == self.txhash and \ + state_container.tokens.data[key].delete is False: state_container.tokens.data[key].delete = True state_container.paginated_tokens_hash.remove(address_state, self.token_txhash) From 6b9dba7b113170ed8c7b959792761d0feb200a30 Mon Sep 17 00:00:00 2001 From: cyyber Date: Mon, 16 Mar 2020 14:50:48 +0530 Subject: [PATCH 19/23] Ban peers in case of invalid block received, incompatible node version or genesis headerhash --- src/qrl/core/p2p/p2pPeerManager.py | 2 ++ src/qrl/core/p2p/p2pfactory.py | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/qrl/core/p2p/p2pPeerManager.py b/src/qrl/core/p2p/p2pPeerManager.py index 32b5bb891..55131e2ba 100644 --- a/src/qrl/core/p2p/p2pPeerManager.py +++ b/src/qrl/core/p2p/p2pPeerManager.py @@ -232,6 +232,7 @@ def handle_version(self, source, message: qrllegacy_pb2.LegacyMessage): source.peer.ip, message.veData.version) source.loseConnection() + self.ban_channel(source) return source.rate_limit = min(config.user.peer_rate_limit, message.veData.rate_limit) @@ -241,6 +242,7 @@ def handle_version(self, source, message: qrllegacy_pb2.LegacyMessage): logger.warning('Expected: %s', config.user.genesis_prev_headerhash) logger.warning('Found: %s', message.veData.genesis_prev_hash) source.loseConnection() + self.ban_channel(source) def handle_peer_list(self, source, message: qrllegacy_pb2.LegacyMessage): P2PBaseObserver._validate_message(message, qrllegacy_pb2.LegacyMessage.PL) diff --git a/src/qrl/core/p2p/p2pfactory.py b/src/qrl/core/p2p/p2pfactory.py index 3923bf032..82ac44a35 100644 --- a/src/qrl/core/p2p/p2pfactory.py +++ b/src/qrl/core/p2p/p2pfactory.py @@ -230,6 +230,7 @@ def block_received(self, source, block: Block): if block.block_number != self._last_requested_block_number: logger.warning('Did not match %s', self._last_requested_block_number) + self._qrl_node.peer_manager.ban_channel(source) return target_start_blocknumber = self._target_node_header_hash.block_number @@ -238,10 +239,12 @@ def block_received(self, source, block: Block): logger.warning('Did not match headerhash') logger.warning('Expected headerhash %s', expected_headerhash) logger.warning('Found headerhash %s', block.headerhash) + self._qrl_node.peer_manager.ban_channel(source) return if not block.validate(self._chain_manager, self.pow.future_blocks): logger.warning('Syncing Failed: Block Validation Failed') + self._qrl_node.peer_manager.ban_channel(source) return if self._chain_manager.add_block(block, check_stale=False): @@ -249,6 +252,7 @@ def block_received(self, source, block: Block): self.pow.suspend_mining_timestamp = ntp.getTime() + config.dev.sync_delay_mining else: logger.warning('Failed to Add Block') + self._qrl_node.peer_manager.ban_channel(source) return try: From 74b958a178f3d0353ac116d8daa4262e08091cca Mon Sep 17 00:00:00 2001 From: cyyber Date: Mon, 16 Mar 2020 16:03:40 +0530 Subject: [PATCH 20/23] Updated P2PPeerManager Unit Tests --- tests/core/p2p/test_p2pPeerManager.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/core/p2p/test_p2pPeerManager.py b/tests/core/p2p/test_p2pPeerManager.py index 36edebc3f..f9d871283 100644 --- a/tests/core/p2p/test_p2pPeerManager.py +++ b/tests/core/p2p/test_p2pPeerManager.py @@ -25,6 +25,7 @@ def make_channel(name=''): channel = Mock(autospec=P2PProtocol, name=name) channel.factory = Mock(autospec=P2PFactory) + channel.peer = IPMetadata(ip_str="127.0.0.1", port=19009) return channel @@ -225,14 +226,15 @@ def test_handle_version_wrong_genesis_prev_headerhash(self): """ If the genesis_prev_headerhash is different, the nodes should disconnect from each other. """ - channel = make_channel() + with set_qrl_dir('no_data'): + channel = make_channel() - message = qrllegacy_pb2.LegacyMessage(func_name=qrllegacy_pb2.LegacyMessage.VE, - veData=qrllegacy_pb2.VEData(version=config.dev.version, - genesis_prev_hash=b'TEST123', - rate_limit=config.user.peer_rate_limit)) - self.peer_manager.handle_version(channel, message) - channel.loseConnection.assert_any_call() + message = qrllegacy_pb2.LegacyMessage(func_name=qrllegacy_pb2.LegacyMessage.VE, + veData=qrllegacy_pb2.VEData(version=config.dev.version, + genesis_prev_hash=b'TEST123', + rate_limit=config.user.peer_rate_limit)) + self.peer_manager.handle_version(channel, message) + channel.loseConnection.assert_any_call() def test_get_better_difficulty(self): """ From 5405c16ea95a2629912f3ebf6bea2fbd101a0886 Mon Sep 17 00:00:00 2001 From: cyyber Date: Tue, 17 Mar 2020 08:29:30 +0530 Subject: [PATCH 21/23] Fix: Re-ordering revert for MultiSigVote transaction --- src/qrl/core/txs/multisig/MultiSigVote.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/qrl/core/txs/multisig/MultiSigVote.py b/src/qrl/core/txs/multisig/MultiSigVote.py index 9f49e72bb..b478abf43 100644 --- a/src/qrl/core/txs/multisig/MultiSigVote.py +++ b/src/qrl/core/txs/multisig/MultiSigVote.py @@ -146,9 +146,6 @@ def apply(self, def revert(self, state: State, state_container: StateContainer) -> bool: - address_state = state_container.addresses_state[self.addr_from] - address_state.update_balance(state_container, self.fee) - state_container.paginated_tx_hash.remove(address_state, self.txhash) vote_stats = state_container.votes_stats[self.shared_key] multi_sig_address = vote_stats.multi_sig_address @@ -161,4 +158,8 @@ def revert(self, logger.info("[MultiSigVote] Failed to revert vote_stats") return False + address_state = state_container.addresses_state[self.addr_from] + address_state.update_balance(state_container, self.fee) + state_container.paginated_tx_hash.remove(address_state, self.txhash) + return self._revert_state_changes_for_PK(state_container) From c4f1234a55ea22e2e7d9514afb793cd59466d3eb Mon Sep 17 00:00:00 2001 From: cyyber Date: Tue, 17 Mar 2020 09:07:47 +0530 Subject: [PATCH 22/23] Updated Unit Test --- tests/core/test_VoteStats.py | 66 ++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/tests/core/test_VoteStats.py b/tests/core/test_VoteStats.py index 73ab3c1e3..50bc5b85b 100644 --- a/tests/core/test_VoteStats.py +++ b/tests/core/test_VoteStats.py @@ -80,7 +80,7 @@ def test_apply_and_put(self): write_access=True, my_db=self.state._db, batch=None) - tx.apply(self.state, state_container) + self.assertTrue(tx.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) @@ -140,7 +140,7 @@ def test_revert_and_put(self): write_access=True, my_db=self.state._db, batch=None) - tx.apply(self.state, state_container) + self.assertTrue(tx.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) @@ -149,7 +149,7 @@ def test_revert_and_put(self): self.assertFalse(vote_stats[spend_tx.txhash].executed) VoteStats.revert_all(self.state, state_container) - tx.revert(self.state, state_container) + self.assertTrue(tx.revert(self.state, state_container)) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) self.assertEqual(state_container.addresses_state[self.alice.address].balance, 5) @@ -216,8 +216,8 @@ def test_apply_and_put2(self): write_access=True, my_db=self.state._db, batch=None) - tx1.apply(self.state, state_container) - tx2.apply(self.state, state_container) + self.assertTrue(tx1.apply(self.state, state_container)) + self.assertTrue(tx2.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 0) @@ -289,8 +289,8 @@ def test_revert_and_put2(self): write_access=True, my_db=self.state._db, batch=None) - tx1.apply(self.state, state_container) - tx2.apply(self.state, state_container) + self.assertTrue(tx1.apply(self.state, state_container)) + self.assertTrue(tx2.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 0) @@ -302,8 +302,8 @@ def test_revert_and_put2(self): self.assertTrue(vote_stats[spend_tx.txhash].executed) VoteStats.revert_all(self.state, state_container) - tx1.revert(self.state, state_container) - tx2.revert(self.state, state_container) + self.assertTrue(tx1.revert(self.state, state_container)) + self.assertTrue(tx2.revert(self.state, state_container)) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) self.assertEqual(state_container.addresses_state[self.alice.address].balance, 5) @@ -362,7 +362,7 @@ def test_apply_and_put3(self): write_access=True, my_db=self.state._db, batch=None) - tx.apply(self.state, state_container) + self.assertTrue(tx.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 0) @@ -423,7 +423,7 @@ def test_revert_and_put3(self): write_access=True, my_db=self.state._db, batch=None) - tx.apply(self.state, state_container) + self.assertTrue(tx.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 0) @@ -433,7 +433,7 @@ def test_revert_and_put3(self): self.assertTrue(vote_stats[spend_tx.txhash].executed) VoteStats.revert_all(self.state, state_container) - tx.revert(self.state, state_container) + self.assertTrue(tx.revert(self.state, state_container)) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) self.assertEqual(state_container.addresses_state[self.alice.address].balance, 5) self.assertFalse(vote_stats[spend_tx.txhash].executed) @@ -491,7 +491,7 @@ def test_apply_and_put4(self): write_access=True, my_db=self.state._db, batch=None) - tx.apply(self.state, state_container) + self.assertTrue(tx.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) # Expected balance is 90, as multi_sig_spend txn is not executed due to insufficient balance @@ -553,7 +553,7 @@ def test_revert_and_put4(self): write_access=True, my_db=self.state._db, batch=None) - tx.apply(self.state, state_container) + self.assertTrue(tx.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) # Expected balance is 90, as multi_sig_spend txn is not executed due to insufficient balance @@ -563,7 +563,7 @@ def test_revert_and_put4(self): self.assertFalse(vote_stats[spend_tx.txhash].executed) VoteStats.revert_all(self.state, state_container) - tx.revert(self.state, state_container) + self.assertTrue(tx.revert(self.state, state_container)) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 90) self.assertEqual(state_container.addresses_state[self.alice.address].balance, 5) @@ -622,7 +622,7 @@ def test_apply_and_put5(self): write_access=True, my_db=self.state._db, batch=None) - tx1.apply(self.state, state_container) + self.assertTrue(tx1.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) # Expected balance is 90, as multi_sig_spend txn is not executed due to insufficient balance @@ -638,7 +638,7 @@ def test_apply_and_put5(self): xmss_pk=self.alice.pk) tx2.sign(self.alice) - tx2.apply(self.state, state_container) + self.assertTrue(tx2.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) # Expected balance is 100 self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) @@ -650,7 +650,7 @@ def test_apply_and_put5(self): fee=0, xmss_pk=self.alice.pk) tx3.sign(self.alice) - tx3.apply(self.state, state_container) + self.assertTrue(tx3.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) # Expected balance is 0, as multi_sig_spend txn has been executed self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 0) @@ -713,7 +713,7 @@ def test_revert_and_put5(self): write_access=True, my_db=self.state._db, batch=None) - tx1.apply(self.state, state_container) + self.assertTrue(tx1.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) # Expected balance is 90, as multi_sig_spend txn is not executed due to insufficient balance @@ -729,7 +729,7 @@ def test_revert_and_put5(self): xmss_pk=self.alice.pk) tx2.sign(self.alice) - tx2.apply(self.state, state_container) + self.assertTrue(tx2.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) # Expected balance is 100 self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) @@ -741,7 +741,7 @@ def test_revert_and_put5(self): fee=0, xmss_pk=self.alice.pk) tx3.sign(self.alice) - tx3.apply(self.state, state_container) + self.assertTrue(tx3.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) # Expected balance is 0, as multi_sig_spend txn has been executed self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 0) @@ -751,7 +751,7 @@ def test_revert_and_put5(self): self.assertTrue(vote_stats[spend_tx.txhash].executed) VoteStats.revert_all(self.state, state_container) - tx3.revert(self.state, state_container) + self.assertTrue(tx3.revert(self.state, state_container)) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) self.assertEqual(state_container.addresses_state[self.alice.address].balance, 0) self.assertFalse(vote_stats[spend_tx.txhash].executed) @@ -759,12 +759,12 @@ def test_revert_and_put5(self): multi_sig_address_state.pbdata.balance = 90 VoteStats.revert_all(self.state, state_container) - tx2.revert(self.state, state_container) + self.assertTrue(tx2.revert(self.state, state_container)) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 90) self.assertEqual(state_container.addresses_state[self.alice.address].balance, 0) VoteStats.revert_all(self.state, state_container) - tx1.revert(self.state, state_container) + self.assertTrue(tx1.revert(self.state, state_container)) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 90) self.assertEqual(state_container.addresses_state[self.alice.address].balance, 5) @@ -829,14 +829,11 @@ def test_apply_and_put6(self): write_access=True, my_db=self.state._db, batch=None) - tx1.apply(self.state, state_container) - tx2.apply(self.state, state_container) + self.assertFalse(tx1.apply(self.state, state_container)) + self.assertFalse(tx2.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) - self.assertEqual(state_container.addresses_state[self.alice.address].balance, 0) - # Expected balance is 1, as 4 quanta paid in MultiSigVote txn as a fee - self.assertEqual(state_container.addresses_state[self.bob.address].balance, 1) self.assertFalse(vote_stats[spend_tx.txhash].executed) def test_revert_and_put6(self): @@ -900,8 +897,8 @@ def test_revert_and_put6(self): write_access=True, my_db=self.state._db, batch=None) - tx1.apply(self.state, state_container) - tx2.apply(self.state, state_container) + self.assertFalse(tx1.apply(self.state, state_container)) + self.assertFalse(tx2.apply(self.state, state_container)) VoteStats.put_all(self.state, state_container) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) @@ -911,10 +908,7 @@ def test_revert_and_put6(self): self.assertFalse(vote_stats[spend_tx.txhash].executed) VoteStats.revert_all(self.state, state_container) - tx2.revert(self.state, state_container) - tx1.revert(self.state, state_container) + self.assertFalse(tx2.revert(self.state, state_container)) + self.assertFalse(tx1.revert(self.state, state_container)) self.assertEqual(state_container.addresses_state[multi_sig_address].balance, 100) - self.assertEqual(state_container.addresses_state[self.alice.address].balance, 5) - self.assertEqual(state_container.addresses_state[self.bob.address].balance, 5) - self.assertFalse(vote_stats[spend_tx.txhash].executed) From ba583e414083fd6be48da4870bc80d5633b0342c Mon Sep 17 00:00:00 2001 From: cyyber Date: Tue, 17 Mar 2020 18:09:35 +0530 Subject: [PATCH 23/23] Updated Hardfork block height for mainnet to 942375 --- src/qrl/core/config.py | 2 +- src/qrl/core/p2p/p2pPeerManager.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qrl/core/config.py b/src/qrl/core/config.py index 79acdfdbc..9aab95f1b 100644 --- a/src/qrl/core/config.py +++ b/src/qrl/core/config.py @@ -305,7 +305,7 @@ def __init__(self, pbdata, ignore_check=False, ignore_singleton=False): # ====================================== # HARD FORK HEIGHTS LIST # ====================================== - self.hard_fork_heights = [1000000] + self.hard_fork_heights = [942375] self.testnet_hard_fork_heights = [10500] # ====================================== diff --git a/src/qrl/core/p2p/p2pPeerManager.py b/src/qrl/core/p2p/p2pPeerManager.py index 55131e2ba..0ad358fc6 100644 --- a/src/qrl/core/p2p/p2pPeerManager.py +++ b/src/qrl/core/p2p/p2pPeerManager.py @@ -199,7 +199,8 @@ def _get_version_compatibility(self, version) -> bool: if int(major_version) < 2: return False except Exception: - return False + logger.warning("Exception while checking version for compatibility") + return True return True