diff --git a/lib/config.py b/lib/config.py index 9f932190..04d31a85 100644 --- a/lib/config.py +++ b/lib/config.py @@ -28,10 +28,6 @@ def get_dash_conf(): return dash_conf -def get_network(): - return sentinel_cfg.get('network', 'mainnet') - - def get_rpchost(): if 'RPCHOST' in os.environ: return os.environ['RPCHOST'] @@ -89,6 +85,5 @@ def get_db_conn(): dash_conf = get_dash_conf() -network = get_network() rpc_host = get_rpchost() db = get_db_conn() diff --git a/lib/dashd.py b/lib/dashd.py index 8923b0a9..b1a3f585 100644 --- a/lib/dashd.py +++ b/lib/dashd.py @@ -25,6 +25,7 @@ def __init__(self, **kwargs): # memoize calls to some dashd methods self.governance_info = None + self.blockchain_info = None self.gobject_votes = {} @property @@ -95,10 +96,31 @@ def govinfo(self): self.governance_info = self.rpc_command('getgovernanceinfo') return self.governance_info + @property + def blockchaininfo(self): + if (not self.blockchain_info): + self.blockchain_info = self.rpc_command('getblockchaininfo') + return self.blockchain_info + # governance info convenience methods def superblockcycle(self): return self.govinfo['superblockcycle'] + def network(self): + # from dash/src/chainparamsbase.cpp + # CBaseChainParams::MAIN = "main"; + # CBaseChainParams::TESTNET = "test"; + # CBaseChainParams::DEVNET = "devnet"; + # CBaseChainParams::REGTEST = "regtest"; + networks = { + 'test': 'testnet', + 'main': 'mainnet', + } + chain = self.blockchaininfo['chain'] + + # returns 'testnet' and 'mainnet' instead of 'test' and 'main' + return networks[chain] if chain in networks else chain + def last_superblock_height(self): return self.govinfo['lastsuperblock'] @@ -146,7 +168,7 @@ def get_my_gobject_votes(self, object_hash): def is_govobj_maturity_phase(self): # 3-day period for govobj maturity maturity_phase_delta = 1662 # ~(60*24*3)/2.6 - if config.network == 'testnet': + if self.network() == 'testnet': maturity_phase_delta = 24 # testnet event_block_height = self.next_superblock_height() diff --git a/lib/models.py b/lib/models.py index 6d060a10..ff9119e6 100644 --- a/lib/models.py +++ b/lib/models.py @@ -147,7 +147,7 @@ def import_gobject_from_dashd(self, dashd, rec): try: newdikt = subdikt.copy() newdikt['object_hash'] = object_hash - if subclass(**newdikt).is_valid() is False: + if subclass(**newdikt).is_valid(dashd) is False: govobj.vote_delete(dashd) return (govobj, None) @@ -283,7 +283,7 @@ class Meta: # leave for now so this doesn't break the generic govobj validity check # above in the import - def is_valid(self): + def is_valid(self, dashd=None): return True def is_expired(self, superblockcycle=None): @@ -373,16 +373,20 @@ class Superblock(BaseModel, GovernanceClass): class Meta: table_name = 'superblocks' - def is_valid(self): + def is_valid(self, dashd=None): import dashlib import decimal printdbg("In Superblock#is_valid, for SB: %s" % self.__dict__) + network = 'mainnet' + if dashd is not None: + network = dashd.network() + # it's a string from the DB... addresses = self.payment_addresses.split('|') for addr in addresses: - if not dashlib.is_valid_dash_address(addr, config.network): + if not dashlib.is_valid_dash_address(addr, network): printdbg("\tInvalid address [%s], returning False" % addr) return False diff --git a/test/conftest.py b/test/conftest.py index 211a248f..43e158a9 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -6,3 +6,12 @@ os.environ['RPCUSER'] = 'hi' os.environ['SENTINEL_ENV'] = 'test' os.environ['SENTINEL_CONFIG'] = os.path.normpath(os.path.join(os.path.dirname(__file__), './test_sentinel.conf')) + +sys.path.append(os.path.normpath(os.path.join(os.path.dirname(__file__), '../lib'))) +import dashd + + +class MockDashDaemon(dashd.DashDaemon): + + def network(self): + return 'testnet' diff --git a/test/test_sentinel.conf b/test/test_sentinel.conf index 913fbf41..3ba5b450 100644 --- a/test/test_sentinel.conf +++ b/test/test_sentinel.conf @@ -1,3 +1,2 @@ -network=testnet db_name=database/sentinel.db db_driver=sqlite diff --git a/test/unit/models/test_superblocks.py b/test/unit/models/test_superblocks.py index 88b64973..6e14f4d1 100644 --- a/test/unit/models/test_superblocks.py +++ b/test/unit/models/test_superblocks.py @@ -6,6 +6,7 @@ import misc import config from models import GovernanceObject, Proposal, Superblock, Vote +from conftest import MockDashDaemon # clear DB tables before each execution @@ -121,97 +122,94 @@ def superblock(): def test_superblock_is_valid(superblock): - from dashd import DashDaemon - for var in ['RPCHOST', 'RPCPASSWORD', 'RPCPORT', 'RPCUSER']: - os.environ[var] = 'hi' - dashd = DashDaemon.initialize(config.dash_conf) + dashd = MockDashDaemon.initialize(None) orig = Superblock(**superblock.get_dict()) # make a copy # original as-is should be valid - assert orig.is_valid() is True + assert orig.is_valid(dashd) is True # mess with payment amounts superblock.payment_amounts = '7|yyzx' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False superblock.payment_amounts = '7,|yzx' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False superblock.payment_amounts = '7|8' - assert superblock.is_valid() is True + assert superblock.is_valid(dashd) is True superblock.payment_amounts = ' 7|8' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False superblock.payment_amounts = '7|8 ' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False superblock.payment_amounts = ' 7|8 ' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False # reset superblock = Superblock(**orig.get_dict()) - assert superblock.is_valid() is True + assert superblock.is_valid(dashd) is True # mess with payment addresses superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV|1234 Anywhere ST, Chicago, USA' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False # leading spaces in payment addresses superblock.payment_addresses = ' yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '5.00' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False # trailing spaces in payment addresses superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV ' superblock.payment_amounts = '5.00' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False # leading & trailing spaces in payment addresses superblock.payment_addresses = ' yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV ' superblock.payment_amounts = '5.00' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False # single payment addr/amt is ok superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '5.00' - assert superblock.is_valid() is True + assert superblock.is_valid(dashd) is True # ensure number of payment addresses matches number of payments superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '37.00|23.24' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False superblock.payment_addresses = 'yYe8KwyaUu5YswSYmB3q3ryx8XTUu9y7Ui|yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '37.00' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False # ensure amounts greater than zero superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '-37.00' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False # reset superblock = Superblock(**orig.get_dict()) - assert superblock.is_valid() is True + assert superblock.is_valid(dashd) is True # mess with proposal hashes superblock.proposal_hashes = '7|yyzx' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False superblock.proposal_hashes = '7,|yyzx' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False superblock.proposal_hashes = '0|1' - assert superblock.is_valid() is False + assert superblock.is_valid(dashd) is False superblock.proposal_hashes = '0000000000000000000000000000000000000000000000000000000000000000|1111111111111111111111111111111111111111111111111111111111111111' - assert superblock.is_valid() is True + assert superblock.is_valid(dashd) is True # reset superblock = Superblock(**orig.get_dict()) - assert superblock.is_valid() is True + assert superblock.is_valid(dashd) is True def test_serialisable_fields(): @@ -227,10 +225,7 @@ def test_serialisable_fields(): def test_deterministic_superblock_creation(go_list_proposals): import dashlib import misc - from dashd import DashDaemon - for var in ['RPCHOST', 'RPCPASSWORD', 'RPCPORT', 'RPCUSER']: - os.environ[var] = 'hi' - dashd = DashDaemon.initialize(config.dash_conf) + dashd = MockDashDaemon.initialize(None) for item in go_list_proposals: (go, subobj) = GovernanceObject.import_gobject_from_dashd(dashd, item) @@ -249,10 +244,7 @@ def test_deterministic_superblock_creation(go_list_proposals): def test_deterministic_superblock_selection(go_list_superblocks): - from dashd import DashDaemon - for var in ['RPCHOST', 'RPCPASSWORD', 'RPCPORT', 'RPCUSER']: - os.environ[var] = 'hi' - dashd = DashDaemon.initialize(config.dash_conf) + dashd = MockDashDaemon.initialize(None) for item in go_list_superblocks: (go, subobj) = GovernanceObject.import_gobject_from_dashd(dashd, item)