Use getblockhashafter command in getWalletRestoreHeight.
This commit is contained in:
		
							parent
							
								
									1476ad3cec
								
							
						
					
					
						commit
						3ba551c9da
					
				@ -1,3 +1,3 @@
 | 
			
		||||
name = "basicswap"
 | 
			
		||||
 | 
			
		||||
__version__ = "0.0.30"
 | 
			
		||||
__version__ = "0.0.31"
 | 
			
		||||
 | 
			
		||||
@ -1474,7 +1474,7 @@ class BasicSwap(BaseApp):
 | 
			
		||||
                wrh = session.query(DBKVInt).filter_by(key=key_str).first().value
 | 
			
		||||
            except Exception:
 | 
			
		||||
                wrh = ci.getWalletRestoreHeight()
 | 
			
		||||
                self.log.info('Found restore height for %s', ci.coin_name())
 | 
			
		||||
                self.log.info('Found restore height for %s, block %d', ci.coin_name(), wrh)
 | 
			
		||||
                session.add(DBKVInt(
 | 
			
		||||
                    key=key_str,
 | 
			
		||||
                    value=wrh
 | 
			
		||||
 | 
			
		||||
@ -5,10 +5,12 @@
 | 
			
		||||
# Distributed under the MIT software license, see the accompanying
 | 
			
		||||
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
 | 
			
		||||
 | 
			
		||||
import json
 | 
			
		||||
import time
 | 
			
		||||
import base64
 | 
			
		||||
import hashlib
 | 
			
		||||
import logging
 | 
			
		||||
import traceback
 | 
			
		||||
from io import BytesIO
 | 
			
		||||
from basicswap.contrib.test_framework import segwit_addr
 | 
			
		||||
 | 
			
		||||
@ -67,7 +69,7 @@ from .basicswap_util import (
 | 
			
		||||
    TxLockTypes)
 | 
			
		||||
 | 
			
		||||
from .chainparams import CoinInterface, Coins
 | 
			
		||||
from .rpc import make_rpc_func
 | 
			
		||||
from .rpc import make_rpc_func, openrpc
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SEQUENCE_LOCKTIME_GRANULARITY = 9  # 512 seconds
 | 
			
		||||
@ -168,13 +170,34 @@ class BTCInterface(CoinInterface):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, coin_settings, network, swap_client=None):
 | 
			
		||||
        super().__init__(network)
 | 
			
		||||
        rpc_host = coin_settings.get('rpchost', '127.0.0.1')
 | 
			
		||||
        self.rpc_callback = make_rpc_func(coin_settings['rpcport'], coin_settings['rpcauth'], host=rpc_host)
 | 
			
		||||
        self._rpc_host = coin_settings.get('rpchost', '127.0.0.1')
 | 
			
		||||
        self._rpcport = coin_settings['rpcport']
 | 
			
		||||
        self._rpcauth = coin_settings['rpcauth']
 | 
			
		||||
        self.rpc_callback = make_rpc_func(self._rpcport, self._rpcauth, host=self._rpc_host)
 | 
			
		||||
        self.blocks_confirmed = coin_settings['blocks_confirmed']
 | 
			
		||||
        self.setConfTarget(coin_settings['conf_target'])
 | 
			
		||||
        self._sc = swap_client
 | 
			
		||||
        self._log = self._sc.log if self._sc and self._sc.log else logging
 | 
			
		||||
 | 
			
		||||
    def open_rpc(self, wallet=None):
 | 
			
		||||
        return openrpc(self._rpcport, self._rpcauth, wallet=wallet, host=self._rpc_host)
 | 
			
		||||
 | 
			
		||||
    def json_request(self, rpc_conn, method, params):
 | 
			
		||||
        try:
 | 
			
		||||
            v = rpc_conn.json_request(method, params)
 | 
			
		||||
            r = json.loads(v.decode('utf-8'))
 | 
			
		||||
        except Exception as ex:
 | 
			
		||||
            traceback.print_exc()
 | 
			
		||||
            raise ValueError('RPC Server Error ' + str(ex))
 | 
			
		||||
 | 
			
		||||
        if 'error' in r and r['error'] is not None:
 | 
			
		||||
            raise ValueError('RPC error ' + str(r['error']))
 | 
			
		||||
 | 
			
		||||
        return r['result']
 | 
			
		||||
 | 
			
		||||
    def close_rpc(self, rpc_conn):
 | 
			
		||||
        rpc_conn.close()
 | 
			
		||||
 | 
			
		||||
    def setConfTarget(self, new_conf_target):
 | 
			
		||||
        assert(new_conf_target >= 1 and new_conf_target < 33), 'Invalid conf_target value'
 | 
			
		||||
        self._conf_target = new_conf_target
 | 
			
		||||
@ -226,12 +249,18 @@ class BTCInterface(CoinInterface):
 | 
			
		||||
        if chain_synced < 1.0:
 | 
			
		||||
            raise ValueError('{} chain isn\'t synced.'.format(self.coin_name()))
 | 
			
		||||
 | 
			
		||||
        self._log.debug('Finding block at time: {}'.format(start_time))
 | 
			
		||||
 | 
			
		||||
        rpc_conn = self.open_rpc()
 | 
			
		||||
        try:
 | 
			
		||||
            block_hash = best_block
 | 
			
		||||
            while True:
 | 
			
		||||
            block_header = self.rpc_callback('getblockheader', [block_hash])
 | 
			
		||||
                block_header = self.json_request(rpc_conn, 'getblockheader', [block_hash])
 | 
			
		||||
                if block_header['time'] < start_time:
 | 
			
		||||
                    return block_header['height']
 | 
			
		||||
                block_hash = block_header['previousblockhash']
 | 
			
		||||
        finally:
 | 
			
		||||
            self.close_rpc(rpc_conn)
 | 
			
		||||
 | 
			
		||||
    def getWalletSeedID(self):
 | 
			
		||||
        return self.rpc_callback('getwalletinfo')['hdseedid']
 | 
			
		||||
 | 
			
		||||
@ -109,6 +109,21 @@ class PARTInterface(BTCInterface):
 | 
			
		||||
            length += getWitnessElementLen(len(e) // 2)  # hex -> bytes
 | 
			
		||||
        return length
 | 
			
		||||
 | 
			
		||||
    def getWalletRestoreHeight(self):
 | 
			
		||||
        start_time = self.rpc_callback('getwalletinfo')['keypoololdest']
 | 
			
		||||
 | 
			
		||||
        blockchaininfo = self.rpc_callback('getblockchaininfo')
 | 
			
		||||
        best_block = blockchaininfo['bestblockhash']
 | 
			
		||||
 | 
			
		||||
        chain_synced = round(blockchaininfo['verificationprogress'], 3)
 | 
			
		||||
        if chain_synced < 1.0:
 | 
			
		||||
            raise ValueError('{} chain isn\'t synced.'.format(self.coin_name()))
 | 
			
		||||
 | 
			
		||||
        self._log.debug('Finding block at time: {}'.format(start_time))
 | 
			
		||||
        block_hash = self.rpc_callback('getblockhashafter', [start_time])
 | 
			
		||||
        block_header = self.rpc_callback('getblockheader', [block_hash])
 | 
			
		||||
        return block_header['height']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PARTInterfaceBlind(PARTInterface):
 | 
			
		||||
    @staticmethod
 | 
			
		||||
 | 
			
		||||
@ -107,7 +107,7 @@ def callrpc(rpc_port, auth, method, params=[], wallet=None, host='127.0.0.1'):
 | 
			
		||||
        r = json.loads(v.decode('utf-8'))
 | 
			
		||||
    except Exception as ex:
 | 
			
		||||
        traceback.print_exc()
 | 
			
		||||
        raise ValueError('RPC Server Error ' + str(ex))
 | 
			
		||||
        raise ValueError('RPC server error ' + str(ex))
 | 
			
		||||
 | 
			
		||||
    if 'error' in r and r['error'] is not None:
 | 
			
		||||
        raise ValueError('RPC error ' + str(r['error']))
 | 
			
		||||
@ -115,6 +115,17 @@ def callrpc(rpc_port, auth, method, params=[], wallet=None, host='127.0.0.1'):
 | 
			
		||||
    return r['result']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def openrpc(rpc_port, auth, wallet=None, host='127.0.0.1'):
 | 
			
		||||
    try:
 | 
			
		||||
        url = 'http://{}@{}:{}/'.format(auth, host, rpc_port)
 | 
			
		||||
        if wallet is not None:
 | 
			
		||||
            url += 'wallet/' + urllib.parse.quote(wallet)
 | 
			
		||||
        return Jsonrpc(url)
 | 
			
		||||
    except Exception as ex:
 | 
			
		||||
        traceback.print_exc()
 | 
			
		||||
        raise ValueError('RPC error ' + str(ex))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def callrpc_cli(bindir, datadir, chain, cmd, cli_bin='particl-cli'):
 | 
			
		||||
    cli_bin = os.path.join(bindir, cli_bin)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,15 @@
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
0.0.31
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
- XMR swaps: Coin to balance is checked before sending a bid.
 | 
			
		||||
- Use getblockhashafter command in getWalletRestoreHeight where possible.
 | 
			
		||||
  - Avoids rpc Errno 49 issue
 | 
			
		||||
  - Reuse rpc connection when getblockhashafter is not available.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
0.0.30
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user