mirror of
				https://git.wownero.com/wownero/wownero.git
				synced 2024-08-15 01:03:23 +00:00 
			
		
		
		
	Allow unrestricted rpc calls to get full txpool info
This commit is contained in:
		
							parent
							
								
									57854a3e21
								
							
						
					
					
						commit
						babf25d2ec
					
				
					 6 changed files with 49 additions and 27 deletions
				
			
		| 
						 | 
				
			
			@ -428,9 +428,9 @@ namespace cryptonote
 | 
			
		|||
    return m_blockchain_storage.get_split_transactions_blobs(txs_ids, txs, missed_txs);
 | 
			
		||||
  }
 | 
			
		||||
  //-----------------------------------------------------------------------------------------------
 | 
			
		||||
  bool core::get_txpool_backlog(std::vector<tx_backlog_entry>& backlog) const
 | 
			
		||||
  bool core::get_txpool_backlog(std::vector<tx_backlog_entry>& backlog, bool include_sensitive_txes) const
 | 
			
		||||
  {
 | 
			
		||||
    m_mempool.get_transaction_backlog(backlog);
 | 
			
		||||
    m_mempool.get_transaction_backlog(backlog, include_sensitive_txes);
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  //-----------------------------------------------------------------------------------------------
 | 
			
		||||
| 
						 | 
				
			
			@ -1544,9 +1544,9 @@ namespace cryptonote
 | 
			
		|||
    return m_blockchain_storage.get_db().get_block_cumulative_difficulty(height);
 | 
			
		||||
  }
 | 
			
		||||
  //-----------------------------------------------------------------------------------------------
 | 
			
		||||
  size_t core::get_pool_transactions_count() const
 | 
			
		||||
  size_t core::get_pool_transactions_count(bool include_sensitive_txes) const
 | 
			
		||||
  {
 | 
			
		||||
    return m_mempool.get_transactions_count();
 | 
			
		||||
    return m_mempool.get_transactions_count(include_sensitive_txes);
 | 
			
		||||
  }
 | 
			
		||||
  //-----------------------------------------------------------------------------------------------
 | 
			
		||||
  bool core::have_block(const crypto::hash& id) const
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -469,10 +469,11 @@ namespace cryptonote
 | 
			
		|||
 | 
			
		||||
     /**
 | 
			
		||||
      * @copydoc tx_memory_pool::get_txpool_backlog
 | 
			
		||||
      * @param include_sensitive_txes include private transactions
 | 
			
		||||
      *
 | 
			
		||||
      * @note see tx_memory_pool::get_txpool_backlog
 | 
			
		||||
      */
 | 
			
		||||
     bool get_txpool_backlog(std::vector<tx_backlog_entry>& backlog) const;
 | 
			
		||||
     bool get_txpool_backlog(std::vector<tx_backlog_entry>& backlog, bool include_sensitive_txes = false) const;
 | 
			
		||||
     
 | 
			
		||||
     /**
 | 
			
		||||
      * @copydoc tx_memory_pool::get_transactions
 | 
			
		||||
| 
						 | 
				
			
			@ -514,10 +515,11 @@ namespace cryptonote
 | 
			
		|||
 | 
			
		||||
     /**
 | 
			
		||||
      * @copydoc tx_memory_pool::get_transactions_count
 | 
			
		||||
      * @param include_sensitive_txes include private transactions
 | 
			
		||||
      *
 | 
			
		||||
      * @note see tx_memory_pool::get_transactions_count
 | 
			
		||||
      */
 | 
			
		||||
     size_t get_pool_transactions_count() const;
 | 
			
		||||
     size_t get_pool_transactions_count(bool include_sensitive_txes = false) const;
 | 
			
		||||
 | 
			
		||||
     /**
 | 
			
		||||
      * @copydoc Blockchain::get_total_transactions
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -438,7 +438,7 @@ namespace cryptonote
 | 
			
		|||
    store_difficulty(m_core.get_blockchain_storage().get_difficulty_for_next_block(), res.difficulty, res.wide_difficulty, res.difficulty_top64);
 | 
			
		||||
    res.target = m_core.get_blockchain_storage().get_difficulty_target();
 | 
			
		||||
    res.tx_count = m_core.get_blockchain_storage().get_total_transactions() - res.height; //without coinbase
 | 
			
		||||
    res.tx_pool_size = m_core.get_pool_transactions_count();
 | 
			
		||||
    res.tx_pool_size = m_core.get_pool_transactions_count(!restricted);
 | 
			
		||||
    res.alt_blocks_count = restricted ? 0 : m_core.get_blockchain_storage().get_alternative_blocks_count();
 | 
			
		||||
    uint64_t total_conn = restricted ? 0 : m_p2p.get_public_connections_count();
 | 
			
		||||
    res.outgoing_connections_count = restricted ? 0 : m_p2p.get_public_outgoing_connections_count();
 | 
			
		||||
| 
						 | 
				
			
			@ -1119,6 +1119,8 @@ namespace cryptonote
 | 
			
		|||
    }
 | 
			
		||||
    res.sanity_check_failed = false;
 | 
			
		||||
 | 
			
		||||
    const bool restricted = m_restricted && ctx;
 | 
			
		||||
 | 
			
		||||
    tx_verification_context tvc{};
 | 
			
		||||
    if(!m_core.handle_incoming_tx({tx_blob, crypto::null_hash}, tvc, (req.do_not_relay ? relay_method::none : relay_method::local), false) || tvc.m_verifivation_failed)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -1423,12 +1425,13 @@ namespace cryptonote
 | 
			
		|||
 | 
			
		||||
    const bool restricted = m_restricted && ctx;
 | 
			
		||||
    const bool request_has_rpc_origin = ctx != NULL;
 | 
			
		||||
    const bool allow_sensitive = !request_has_rpc_origin || !restricted;
 | 
			
		||||
 | 
			
		||||
    size_t n_txes = m_core.get_pool_transactions_count();
 | 
			
		||||
    size_t n_txes = m_core.get_pool_transactions_count(allow_sensitive);
 | 
			
		||||
    if (n_txes > 0)
 | 
			
		||||
    {
 | 
			
		||||
      CHECK_PAYMENT_SAME_TS(req, res, n_txes * COST_PER_TX);
 | 
			
		||||
      m_core.get_pool_transactions_and_spent_keys_info(res.transactions, res.spent_key_images, !request_has_rpc_origin || !restricted);
 | 
			
		||||
      m_core.get_pool_transactions_and_spent_keys_info(res.transactions, res.spent_key_images, allow_sensitive);
 | 
			
		||||
      for (tx_info& txi : res.transactions)
 | 
			
		||||
        txi.tx_blob = epee::string_tools::buff_to_hex_nodelimer(txi.tx_blob);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1448,12 +1451,13 @@ namespace cryptonote
 | 
			
		|||
 | 
			
		||||
    const bool restricted = m_restricted && ctx;
 | 
			
		||||
    const bool request_has_rpc_origin = ctx != NULL;
 | 
			
		||||
    const bool allow_sensitive = !request_has_rpc_origin || !restricted;
 | 
			
		||||
 | 
			
		||||
    size_t n_txes = m_core.get_pool_transactions_count();
 | 
			
		||||
    size_t n_txes = m_core.get_pool_transactions_count(allow_sensitive);
 | 
			
		||||
    if (n_txes > 0)
 | 
			
		||||
    {
 | 
			
		||||
      CHECK_PAYMENT_SAME_TS(req, res, n_txes * COST_PER_POOL_HASH);
 | 
			
		||||
      m_core.get_pool_transaction_hashes(res.tx_hashes, !request_has_rpc_origin || !restricted);
 | 
			
		||||
      m_core.get_pool_transaction_hashes(res.tx_hashes, allow_sensitive);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    res.status = CORE_RPC_STATUS_OK;
 | 
			
		||||
| 
						 | 
				
			
			@ -1471,13 +1475,14 @@ namespace cryptonote
 | 
			
		|||
 | 
			
		||||
    const bool restricted = m_restricted && ctx;
 | 
			
		||||
    const bool request_has_rpc_origin = ctx != NULL;
 | 
			
		||||
    const bool allow_sensitive = !request_has_rpc_origin || !restricted;
 | 
			
		||||
 | 
			
		||||
    size_t n_txes = m_core.get_pool_transactions_count();
 | 
			
		||||
    size_t n_txes = m_core.get_pool_transactions_count(allow_sensitive);
 | 
			
		||||
    if (n_txes > 0)
 | 
			
		||||
    {
 | 
			
		||||
      CHECK_PAYMENT_SAME_TS(req, res, n_txes * COST_PER_POOL_HASH);
 | 
			
		||||
      std::vector<crypto::hash> tx_hashes;
 | 
			
		||||
      m_core.get_pool_transaction_hashes(tx_hashes, !request_has_rpc_origin || !restricted);
 | 
			
		||||
      m_core.get_pool_transaction_hashes(tx_hashes, allow_sensitive);
 | 
			
		||||
      res.tx_hashes.reserve(tx_hashes.size());
 | 
			
		||||
      for (const crypto::hash &tx_hash: tx_hashes)
 | 
			
		||||
        res.tx_hashes.push_back(epee::string_tools::pod_to_hex(tx_hash));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,8 +34,8 @@ try:
 | 
			
		|||
except:
 | 
			
		||||
  tests = DEFAULT_TESTS
 | 
			
		||||
 | 
			
		||||
N_MONERODS = 2
 | 
			
		||||
N_WALLETS = 4
 | 
			
		||||
N_MONERODS = 3
 | 
			
		||||
N_WALLETS = 7
 | 
			
		||||
WALLET_DIRECTORY = builddir + "/functional-tests-directory"
 | 
			
		||||
DIFFICULTY = 10
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -43,9 +43,17 @@ monerod_base = [builddir + "/bin/monerod", "--regtest", "--fixed-difficulty", st
 | 
			
		|||
monerod_extra = [
 | 
			
		||||
  [],
 | 
			
		||||
  ["--rpc-payment-address", "44SKxxLQw929wRF6BA9paQ1EWFshNnKhXM3qz6Mo3JGDE2YG3xyzVutMStEicxbQGRfrYvAAYxH6Fe8rnD56EaNwUiqhcwR", "--rpc-payment-difficulty", str(DIFFICULTY), "--rpc-payment-credits", "5000", "--data-dir", builddir + "/functional-tests-directory/monerod1"],
 | 
			
		||||
  ["--rpc-restricted-bind-port", "18482", "--data-dir", builddir + "/functional-tests-directory/monerod2"]
 | 
			
		||||
]
 | 
			
		||||
wallet_base = [builddir + "/bin/monero-wallet-rpc", "--wallet-dir", WALLET_DIRECTORY, "--rpc-bind-port", "wallet_port", "--disable-rpc-login", "--rpc-ssl", "disabled", "--daemon-ssl", "disabled", "--daemon-port", "18180", "--log-level", "1"]
 | 
			
		||||
wallet_base = [builddir + "/bin/monero-wallet-rpc", "--wallet-dir", WALLET_DIRECTORY, "--rpc-bind-port", "wallet_port", "--disable-rpc-login", "--rpc-ssl", "disabled", "--daemon-ssl", "disabled", "--log-level", "1"]
 | 
			
		||||
wallet_extra = [
 | 
			
		||||
  ["--daemon-port", "18180"],
 | 
			
		||||
  ["--daemon-port", "18180"],
 | 
			
		||||
  ["--daemon-port", "18180"],
 | 
			
		||||
  ["--daemon-port", "18180"],
 | 
			
		||||
  ["--daemon-port", "18182"],
 | 
			
		||||
  ["--daemon-port", "18182"],
 | 
			
		||||
  ["--daemon-port", "18182"]
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
command_lines = []
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,14 +45,14 @@ class TransferTest():
 | 
			
		|||
 | 
			
		||||
    def reset(self):
 | 
			
		||||
        print('Resetting blockchain')
 | 
			
		||||
        daemon = Daemon()
 | 
			
		||||
        daemon = Daemon(idx=2)
 | 
			
		||||
        res = daemon.get_height()
 | 
			
		||||
        daemon.pop_blocks(res.height - 1)
 | 
			
		||||
        daemon.flush_txpool()
 | 
			
		||||
 | 
			
		||||
    def create(self):
 | 
			
		||||
        print('Creating wallet')
 | 
			
		||||
        wallet = Wallet()
 | 
			
		||||
        wallet = Wallet(idx = 4)
 | 
			
		||||
        # close the wallet if any, will throw if none is loaded
 | 
			
		||||
        try: wallet.close_wallet()
 | 
			
		||||
        except: pass
 | 
			
		||||
| 
						 | 
				
			
			@ -61,8 +61,8 @@ class TransferTest():
 | 
			
		|||
 | 
			
		||||
    def mine(self):
 | 
			
		||||
        print("Mining some blocks")
 | 
			
		||||
        daemon = Daemon()
 | 
			
		||||
        wallet = Wallet()
 | 
			
		||||
        daemon = Daemon(idx = 2)
 | 
			
		||||
        wallet = Wallet(idx = 4)
 | 
			
		||||
 | 
			
		||||
        daemon.generateblocks('42ey1afDFnn4886T7196doS9GPMzexD9gXpsZJDwVjeRVdFCSoHnv7KPbBeGpzJBzHRCAs9UxqeoyFQMYbqSWYTfJJQAWDm', 80)
 | 
			
		||||
        wallet.refresh()
 | 
			
		||||
| 
						 | 
				
			
			@ -70,8 +70,8 @@ class TransferTest():
 | 
			
		|||
    def create_txes(self, address, ntxes):
 | 
			
		||||
        print('Creating ' + str(ntxes) + ' transactions')
 | 
			
		||||
 | 
			
		||||
        daemon = Daemon()
 | 
			
		||||
        wallet = Wallet()
 | 
			
		||||
        daemon = Daemon(idx = 2)
 | 
			
		||||
        wallet = Wallet(idx = 4)
 | 
			
		||||
 | 
			
		||||
        dst = {'address': address, 'amount': 1000000000000}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -83,8 +83,10 @@ class TransferTest():
 | 
			
		|||
        return txes
 | 
			
		||||
 | 
			
		||||
    def check_empty_pool(self):
 | 
			
		||||
        daemon = Daemon()
 | 
			
		||||
        self.check_empty_rpc_pool(Daemon(idx = 2))
 | 
			
		||||
        self.check_empty_rpc_pool(Daemon(idx = 2, restricted_rpc = True))
 | 
			
		||||
 | 
			
		||||
    def check_empty_rpc_pool(self, daemon):
 | 
			
		||||
        res = daemon.get_transaction_pool_hashes()
 | 
			
		||||
        assert not 'tx_hashes' in res or len(res.tx_hashes) == 0
 | 
			
		||||
        res = daemon.get_transaction_pool_stats()
 | 
			
		||||
| 
						 | 
				
			
			@ -103,8 +105,9 @@ class TransferTest():
 | 
			
		|||
        assert res.pool_stats.num_double_spends == 0
 | 
			
		||||
 | 
			
		||||
    def check_txpool(self):
 | 
			
		||||
        daemon = Daemon()
 | 
			
		||||
        wallet = Wallet()
 | 
			
		||||
        daemon = Daemon(idx = 2)
 | 
			
		||||
        restricted_daemon = Daemon(idx = 2, restricted_rpc = True)
 | 
			
		||||
        wallet = Wallet(idx = 4)
 | 
			
		||||
 | 
			
		||||
        res = daemon.get_info()
 | 
			
		||||
        height = res.height
 | 
			
		||||
| 
						 | 
				
			
			@ -117,6 +120,7 @@ class TransferTest():
 | 
			
		|||
        res = daemon.get_info()
 | 
			
		||||
        assert res.tx_pool_size == txpool_size + 5
 | 
			
		||||
        txpool_size = res.tx_pool_size
 | 
			
		||||
        self.check_empty_rpc_pool(restricted_daemon)
 | 
			
		||||
 | 
			
		||||
        res = daemon.get_transaction_pool()
 | 
			
		||||
        assert len(res.transactions) == txpool_size
 | 
			
		||||
| 
						 | 
				
			
			@ -160,6 +164,7 @@ class TransferTest():
 | 
			
		|||
        print('Flushing 2 transactions')
 | 
			
		||||
        txes_keys = list(txes.keys())
 | 
			
		||||
        daemon.flush_txpool([txes_keys[1], txes_keys[3]])
 | 
			
		||||
        self.check_empty_rpc_pool(restricted_daemon)
 | 
			
		||||
        res = daemon.get_transaction_pool()
 | 
			
		||||
        assert len(res.transactions) == txpool_size - 2
 | 
			
		||||
        assert len([x for x in res.transactions if x.id_hash == txes_keys[1]]) == 0
 | 
			
		||||
| 
						 | 
				
			
			@ -210,6 +215,7 @@ class TransferTest():
 | 
			
		|||
        print('Flushing unknown transactions')
 | 
			
		||||
        unknown_txids = ['1'*64, '2'*64, '3'*64]
 | 
			
		||||
        daemon.flush_txpool(unknown_txids)
 | 
			
		||||
        self.check_empty_rpc_pool(restricted_daemon)
 | 
			
		||||
        res = daemon.get_transaction_pool()
 | 
			
		||||
        assert len(res.transactions) == txpool_size - 2
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,10 +32,11 @@ from .rpc import JSONRPC
 | 
			
		|||
 | 
			
		||||
class Daemon(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, protocol='http', host='127.0.0.1', port=0, idx=0):
 | 
			
		||||
    def __init__(self, protocol='http', host='127.0.0.1', port=0, idx=0, restricted_rpc = False):
 | 
			
		||||
        base = 18480 if restricted_rpc else 18180
 | 
			
		||||
        self.host = host
 | 
			
		||||
        self.port = port
 | 
			
		||||
        self.rpc = JSONRPC('{protocol}://{host}:{port}'.format(protocol=protocol, host=host, port=port if port else 18180+idx))
 | 
			
		||||
        self.rpc = JSONRPC('{protocol}://{host}:{port}'.format(protocol=protocol, host=host, port=port if port else base+idx))
 | 
			
		||||
 | 
			
		||||
    def getblocktemplate(self, address, prev_block = "", client = ""):
 | 
			
		||||
        getblocktemplate = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue