def superblock(): from models import Superblock # NOTE: no governance_object_id is set sbobj = Superblock( event_block_height=62500, payment_addresses='tCa7rDMXs1KeqaqmcFoXxXMmwT9eq9r7oK|t7RKTBNZsTbjwAoXYfsSsTSwimxzDKh5Fu', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sbobj
def test_deterministic_superblock_selection(go_list_superblocks): from aywad import AywaDaemon aywad = AywaDaemon.from_aywa_conf(config.aywa_conf) for item in go_list_superblocks: (go, subobj) = GovernanceObject.import_gobject_from_aywad(aywad, item) # highest hash wins if same -- so just order by hash sb = Superblock.find_highest_deterministic( '542f4433e438bdd64697b8381fda1a7a9b7a111c3a4e32fad524d1821d820394') assert sb.object_hash == 'bc2834f357da7504138566727c838e6ada74d079e63b6104701f4f8eb05dae36'
def test_deterministic_superblock_selection(go_list_superblocks): from dynamicd import DynamicDaemon dynamicd = DynamicDaemon.from_dynamic_conf(config.dynamic_conf) for item in go_list_superblocks: (go, subobj) = GovernanceObject.import_gobject_from_dynamicd( dynamicd, item) # highest hash wins if same -- so just order by hash sb = Superblock.find_highest_deterministic( '22a5f429c5ffb2b79b1b30c3ac30751284e3efa4e710bc7fd35fbe7456b1e485')
def test_serialisable_fields(): s1 = [ 'event_block_height', 'payment_addresses', 'payment_amounts', 'proposal_hashes' ] s2 = Superblock.serialisable_fields() s1.sort() s2.sort() assert s2 == s1
def test_deterministic_superblock_selection(go_list_superblocks): from dashd import DashDaemon dashd = DashDaemon.from_dash_conf(config.dash_conf) for item in go_list_superblocks: (go, subobj) = GovernanceObject.import_gobject_from_dashd(dashd, item) # highest hash wins if same -- so just order by hash sb = Superblock.find_highest_deterministic( '5c7c28ddec8c1ad54b49f6f1e79369e7ccaf76f5ddc30e502569d674e458ccf3') assert sb.object_hash == 'bc2834f357da7504138566727c838e6ada74d079e63b6104701f4f8eb05dae36'
def test_deterministic_superblock_selection(go_list_superblocks): from bitenxd import DashDaemon bitenxd = DashDaemon.from_bitenx_conf(config.bitenx_conf) for item in go_list_superblocks: (go, subobj) = GovernanceObject.import_gobject_from_bitenxd(bitenxd, item) # highest hash wins if same -- so just order by hash sb = Superblock.find_highest_deterministic('22a5f429c5ffb2b79b1b30c3ac30751284e3efa4e710bc7fd35fbe7456b1e485') assert sb.object_hash == 'bc2834f357da7504138566727c838e6ada74d079e63b6104701f4f8eb05dae36'
def test_deterministic_superblock_selection(go_list_superblocks): from soyuzd import SoyuzDaemon soyuzd = SoyuzDaemon.from_soyuz_conf(config.soyuz_conf) for item in go_list_superblocks: (go, subobj) = GovernanceObject.import_gobject_from_soyuzd(soyuzd, item) # highest hash wins if same -- so just order by hash sb = Superblock.find_highest_deterministic('22a5f429c5ffb2b79b1b30c3ac30751284e3efa4e710bc7fd35fbe7456b1e485') assert sb.object_hash == 'a10bab2993a11f206d8094024b254d36bf0c9a34ee34ce60f11bc75e44d70c93'
def superblock(): from models import Superblock # NOTE: no governance_object_id is set sbobj = Superblock( event_block_height=62500, payment_addresses='TXDSaTXerg68SCyLkWw2ERsqoTMWRBZiZQ|TDWz9KfMo55wzj2brbgaXxnDz28nAbdPcY', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sbobj
def superblock(): from models import Superblock # NOTE: no governance_object_id is set sbobj = Superblock( event_block_height=62500, payment_addresses='mtHjXMx6dvTwgcvkDvsuWftiyNPi26RqDq|mocfCW5mUWLdcqphNxbcsVKjzqTgdKckW6', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sbobj
def test_serialisable_fields(): pytest.skip('Superblock not currently supported') s1 = [ 'event_block_height', 'payment_addresses', 'payment_amounts', 'proposal_hashes' ] s2 = Superblock.serialisable_fields() s1.sort() s2.sort() assert s2 == s1
def test_deterministic_superblock_selection(go_list_superblocks): from virclesd import VirclesDaemon virclesd = VirclesDaemon.from_vircles_conf(config.vircles_conf) for item in go_list_superblocks: (go, subobj) = GovernanceObject.import_gobject_from_virclesd( virclesd, item) # highest hash wins if same -- so just order by hash sb = Superblock.find_highest_deterministic( '3fe3938349a350469670348adf9ebd2e8023b7ebe65ecbb87837cfa74ca8bbfa') assert sb.object_hash == 'bc2834f357da7504138566727c838e6ada74d079e63b6104701f4f8eb05dae36'
def test_superblock_size_limit(go_list_proposals): import exiliumlib import misc from exiliumd import ExiliumDaemon exiliumd = ExiliumDaemon.from_exilium_conf(config.exilium_conf) for item in go_list_proposals: (go, subobj) = GovernanceObject.import_gobject_from_exiliumd( exiliumd, item) max_budget = 60 prop_list = Proposal.approved_and_ranked( proposal_quorum=1, next_superblock_max_budget=max_budget) # mock maxgovobjdatasize by setting equal to the size of a trigger # (serialized) if only the first proposal had been included... anything # larger should break the limit single_proposal_sb = Superblock( event_block_height=72000, payment_addresses=prop_list[0].payment_address, payment_amounts="{0:.8f}".format(prop_list[0].payment_amount), proposal_hashes=prop_list[0].object_hash, ) maxgovobjdatasize = len(single_proposal_sb.serialise()) # now try and create a Superblock with the entire proposal list sb = exiliumlib.create_superblock(prop_list, 72000, max_budget, misc.now(), maxgovobjdatasize) # two proposals in the list, but... assert len(prop_list) == 2 # only one should have been included in the SB, because the 2nd one is over the size limit assert sb.event_block_height == 72000 assert sb.payment_addresses == 'yYe8KwyaUu5YswSYmB3q3ryx8XTUu9y7Ui' assert sb.payment_amounts == '25.75000000' assert sb.proposal_hashes == 'dfd7d63979c0b62456b63d5fc5306dbec451180adee85876cbf5b28c69d1a86c' assert sb.hex_hash( ) == '6b8cababf797644f1d62003e4cc68c1c40a8c1873c8a68ed0fc88772ea77cc44'
def superblock(): from models import Superblock # NOTE: no governance_object_id is set sbobj = Superblock( event_block_height=62500, payment_addresses= 'ThMRLUwtH6fVkU5p2SeEhg2FBt5viWQcJc|Td3K6Z1xxAXYh5s3V4EwyWmrDiFxWucvMH', payment_amounts='5|3', proposal_hashes= 'e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sbobj
def superblock(): from models import Superblock # NOTE: no governance_object_id is set sbobj = Superblock( event_block_height=62500, payment_addresses= 'qfvtZk8GYfeM37gwZiHPZgVJGnwREsXkoT|qaSQZnZyVz5CEwpFVJkAdByf6tKfu9ejTo', payment_amounts='50000|30000', proposal_hashes= 'e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sbobj
def superblock(): from models import Superblock # NOTE: no governance_object_id is set sbobj = Superblock( event_block_height=62500, payment_addresses= 'yYe8KwyaUu5YswSYmB3q3ryx8XTUu9y7Ui|yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV', payment_amounts='5|3', proposal_hashes= 'e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sbobj
def test_deterministic_superblock_selection(go_list_superblocks): from paccoind import PaccoinDaemon paccoind = PaccoinDaemon.from_paccoin_conf(config.paccoin_conf) for item in go_list_superblocks: (go, subobj) = GovernanceObject.import_gobject_from_paccoind( paccoind, item) # highest hash wins if same -- so just order by hash sb = Superblock.find_highest_deterministic( '14d34a90db210c7158ee9d80852f15bf37234b8d298ff95c78b86f1c787489f5') assert sb.object_hash == 'bc2834f357da7504138566727c838e6ada74d079e63b6104701f4f8eb05dae36'
def test_deterministic_superblock_selection(go_list_superblocks): from terracoind import TerracoinDaemon terracoind = TerracoinDaemon.from_terracoin_conf(config.terracoin_conf) for item in go_list_superblocks: (go, subobj) = GovernanceObject.import_gobject_from_terracoind( terracoind, item) # highest hash wins if same -- so just order by hash sb = Superblock.find_highest_deterministic( 'd663b0e76cc87882ff4a6d17d7d302b9145c263eb970e0e5c6b3acd42b570347') assert sb.object_hash == 'bc2834f357da7504138566727c838e6ada74d079e63b6104701f4f8eb05dae36'
def superblock(): from models import Superblock # NOTE: no governance_object_id is set sbobj = Superblock( event_block_height=62500, #payment_addresses='mtHjXMx6dvTwgcvkDvsuWftiyNPi26RqDq|mocfCW5mUWLdcqphNxbcsVKjzqTgdKckW6', # Keep the same till proposal hashes are updated payment_addresses='yYe8KwyaUu5YswSYmB3q3ryx8XTUu9y7Ui|yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sbobj
def test_deterministic_superblock_selection(go_list_superblocks): pytest.skip('Superblock not currently supported') from syscoind import SyscoinDaemon syscoind = SyscoinDaemon.from_syscoin_conf(config.syscoin_conf) for item in go_list_superblocks: (go, subobj) = GovernanceObject.import_gobject_from_syscoind( syscoind, item) # highest hash wins if same -- so just order by hash sb = Superblock.find_highest_deterministic( '22a5f429c5ffb2b79b1b30c3ac30751284e3efa4e710bc7fd35fbe7456b1e485') assert sb.object_hash == 'bc2834f357da7504138566727c838e6ada74d079e63b6104701f4f8eb05dae36'
def create_superblock(proposals, event_block_height, budget_max, sb_epoch_time): from models import Superblock, GovernanceObject, Proposal from constants import SUPERBLOCK_FUDGE_WINDOW # don't create an empty superblock if (len(proposals) == 0): printdbg("No proposals, cannot create an empty superblock.") return None budget_allocated = Decimal(0) fudge = SUPERBLOCK_FUDGE_WINDOW # fudge-factor to allow for slighly incorrect estimates payments = [] for proposal in proposals: fmt_string = "name: %s, rank: %4d, hash: %s, amount: %s <= %s" # skip proposals that are too expensive... if (budget_allocated + proposal.payment_amount) > budget_max: printdbg( fmt_string % ( proposal.name, proposal.rank, proposal.object_hash, proposal.payment_amount, "skipped (blows the budget)", ) ) continue # skip proposals if the SB isn't within the Proposal time window... window_start = proposal.start_epoch - fudge window_end = proposal.end_epoch + fudge printdbg("\twindow_start: %s" % epoch2str(window_start)) printdbg("\twindow_end: %s" % epoch2str(window_end)) printdbg("\tsb_epoch_time: %s" % epoch2str(sb_epoch_time)) if (sb_epoch_time < window_start or sb_epoch_time > window_end): printdbg( fmt_string % ( proposal.name, proposal.rank, proposal.object_hash, proposal.payment_amount, "skipped (SB time is outside of Proposal window)", ) ) continue printdbg( fmt_string % ( proposal.name, proposal.rank, proposal.object_hash, proposal.payment_amount, "adding", ) ) # else add proposal and keep track of total budget allocation budget_allocated += proposal.payment_amount payment = {'address': proposal.payment_address, 'amount': "{0:.8f}".format(proposal.payment_amount), 'proposal': "{}".format(proposal.object_hash)} payments.append(payment) # don't create an empty superblock if not payments: printdbg("No proposals made the cut!") return None # 'payments' now contains all the proposals for inclusion in the # Superblock, but needs to be sorted by proposal hash descending payments.sort(key=lambda k: k['proposal'], reverse=True) sb = Superblock( event_block_height=event_block_height, payment_addresses='|'.join([pd['address'] for pd in payments]), payment_amounts='|'.join([pd['amount'] for pd in payments]), proposal_hashes='|'.join([pd['proposal'] for pd in payments]), ) printdbg("generated superblock: %s" % sb.__dict__) return sb
def test_superblock_is_valid(superblock): from suncoind import SunCoinDaemon suncoind = SunCoinDaemon.from_suncoin_conf(config.suncoin_conf) orig = Superblock(**superblock.get_dict()) # make a copy # original as-is should be valid assert orig.is_valid() is True # mess with payment amounts superblock.payment_amounts = '7|yyzx' assert superblock.is_valid() is False superblock.payment_amounts = '7,|yzx' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with payment addresses superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV|1234 Anywhere ST, Chicago, USA' assert superblock.is_valid() is False # single payment addr/amt is ok superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '5.00' assert superblock.is_valid() 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 superblock.payment_addresses = 'yYe8KwyaUu5YswSYmB3q3ryx8XTUu9y7Ui|yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '37.00' assert superblock.is_valid() is False # ensure amounts greater than zero superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '-37.00' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with proposal hashes superblock.proposal_hashes = '7|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '7,|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '0|1' assert superblock.is_valid() is False superblock.proposal_hashes = '0000000000000000000000000000000000000000000000000000000000000000|1111111111111111111111111111111111111111111111111111111111111111' assert superblock.is_valid() is True # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True
def setup(): # clear tables first... Vote.delete().execute() Proposal.delete().execute() Superblock.delete().execute() GovernanceObject.delete().execute()
def attempt_superblock_creation(Xchanged): import Xchangelib if not Xchanged.is_masternode(): print("We are not a Masternode... can't submit superblocks!") return # query votes for this specific ebh... if we have voted for this specific # ebh, then it's voted on. since we track votes this is all done using joins # against the votes table # # has this masternode voted on *any* superblocks at the given event_block_height? # have we voted FUNDING=YES for a superblock for this specific event_block_height? event_block_height = Xchanged.next_superblock_height() if Superblock.is_voted_funding(event_block_height): # printdbg("ALREADY VOTED! 'til next time!") # vote down any new SBs because we've already chosen a winner for sb in Superblock.at_height(event_block_height): if not sb.voted_on(signal=VoteSignals.funding): sb.vote(Xchanged, VoteSignals.funding, VoteOutcomes.no) # now return, we're done return if not Xchanged.is_govobj_maturity_phase(): printdbg("Not in maturity phase yet -- will not attempt Superblock") return proposals = Proposal.approved_and_ranked( proposal_quorum=Xchanged.governance_quorum(), next_superblock_max_budget=Xchanged.next_superblock_max_budget()) budget_max = Xchanged.get_superblock_budget_allocation(event_block_height) sb_epoch_time = Xchanged.block_height_to_epoch(event_block_height) sb = Xchangelib.create_superblock(proposals, event_block_height, budget_max, sb_epoch_time) if not sb: printdbg("No superblock created, sorry. Returning.") return # find the deterministic SB w/highest object_hash in the DB dbrec = Superblock.find_highest_deterministic(sb.hex_hash()) if dbrec: dbrec.vote(Xchanged, VoteSignals.funding, VoteOutcomes.yes) # any other blocks which match the sb_hash are duplicates, delete them for sb in Superblock.select().where( Superblock.sb_hash == sb.hex_hash()): if not sb.voted_on(signal=VoteSignals.funding): sb.vote(Xchanged, VoteSignals.delete, VoteOutcomes.yes) printdbg( "VOTED FUNDING FOR SB! We're done here 'til next superblock cycle." ) return else: printdbg("The correct superblock wasn't found on the network...") # if we are the elected masternode... if (Xchanged.we_are_the_winner()): printdbg("we are the winner! Submit SB to network") sb.submit(Xchanged)
def test_superblock_is_valid(superblock): from terracoind import TerracoinDaemon terracoind = TerracoinDaemon.from_terracoin_conf(config.terracoin_conf) orig = Superblock(**superblock.get_dict()) # make a copy # original as-is should be valid assert orig.is_valid(terracoind) is True # mess with payment amounts superblock.payment_amounts = '7|yyzx' assert superblock.is_valid(terracoind) is False superblock.payment_amounts = '7,|yzx' assert superblock.is_valid(terracoind) is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid(terracoind) is True # mess with payment addresses superblock.payment_addresses = 'mocfCW5mUWLdcqphNxbcsVKjzqTgdKckW6|1234 Anywhere ST, Chicago, USA' assert superblock.is_valid(terracoind) is False # single payment addr/amt is ok superblock.payment_addresses = 'mocfCW5mUWLdcqphNxbcsVKjzqTgdKckW6' superblock.payment_amounts = '5.00' assert superblock.is_valid(terracoind) is True # ensure number of payment addresses matches number of payments superblock.payment_addresses = 'mocfCW5mUWLdcqphNxbcsVKjzqTgdKckW6' superblock.payment_amounts = '37.00|23.24' assert superblock.is_valid(terracoind) is False superblock.payment_addresses = 'mtHjXMx6dvTwgcvkDvsuWftiyNPi26RqDq|mocfCW5mUWLdcqphNxbcsVKjzqTgdKckW6' superblock.payment_amounts = '37.00' assert superblock.is_valid(terracoind) is False # ensure amounts greater than zero superblock.payment_addresses = 'mocfCW5mUWLdcqphNxbcsVKjzqTgdKckW6' superblock.payment_amounts = '-37.00' assert superblock.is_valid(terracoind) is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid(terracoind) is True # mess with proposal hashes superblock.proposal_hashes = '7|yyzx' assert superblock.is_valid(terracoind) is False superblock.proposal_hashes = '7,|yyzx' assert superblock.is_valid(terracoind) is False superblock.proposal_hashes = '0|1' assert superblock.is_valid(terracoind) is False superblock.proposal_hashes = '0000000000000000000000000000000000000000000000000000000000000000|1111111111111111111111111111111111111111111111111111111111111111' assert superblock.is_valid(terracoind) is True # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid(terracoind) is True
def test_superblock_is_valid(superblock): from nextd import NextcoinDaemon nextd = NextcoinDaemon.from_next_conf(config.next_conf) orig = Superblock(**superblock.get_dict()) # make a copy # original as-is should be valid assert orig.is_valid() is True # mess with payment amounts superblock.payment_amounts = '7|yyzx' assert superblock.is_valid() is False superblock.payment_amounts = '7,|yzx' assert superblock.is_valid() is False superblock.payment_amounts = '7|8' assert superblock.is_valid() is True superblock.payment_amounts = ' 7|8' assert superblock.is_valid() is False superblock.payment_amounts = '7|8 ' assert superblock.is_valid() is False superblock.payment_amounts = ' 7|8 ' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with payment addresses superblock.payment_addresses = 'TEjMnhB5mAPrpg7R4CUCSGQNnJqPeAFBTH|1234 Anywhere ST, Chicago, USA' assert superblock.is_valid() is False # leading spaces in payment addresses superblock.payment_addresses = ' TEjMnhB5mAPrpg7R4CUCSGQNnJqPeAFBTH' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # trailing spaces in payment addresses superblock.payment_addresses = 'TEjMnhB5mAPrpg7R4CUCSGQNnJqPeAFBTH ' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # leading & trailing spaces in payment addresses superblock.payment_addresses = ' TEjMnhB5mAPrpg7R4CUCSGQNnJqPeAFBTH ' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # single payment addr/amt is ok superblock.payment_addresses = 'TEjMnhB5mAPrpg7R4CUCSGQNnJqPeAFBTH' superblock.payment_amounts = '5.00' assert superblock.is_valid() is True # ensure number of payment addresses matches number of payments superblock.payment_addresses = 'TEjMnhB5mAPrpg7R4CUCSGQNnJqPeAFBTH' superblock.payment_amounts = '37.00|23.24' assert superblock.is_valid() is False superblock.payment_addresses = 'TSTfeMeWwQiCDwMSTWRaj9wwVGNjZFfvFk|TEjMnhB5mAPrpg7R4CUCSGQNnJqPeAFBTH' superblock.payment_amounts = '37.00' assert superblock.is_valid() is False # ensure amounts greater than zero superblock.payment_addresses = 'TEjMnhB5mAPrpg7R4CUCSGQNnJqPeAFBTH' superblock.payment_amounts = '-37.00' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with proposal hashes superblock.proposal_hashes = '7|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '7,|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '0|1' assert superblock.is_valid() is False superblock.proposal_hashes = '0000000000000000000000000000000000000000000000000000000000000000|1111111111111111111111111111111111111111111111111111111111111111' assert superblock.is_valid() is True # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True
def test_superblock_is_valid(superblock): from historiad import HistoriaDaemon historiad = HistoriaDaemon.from_historia_conf(config.historia_conf) orig = Superblock(**superblock.get_dict()) # make a copy # original as-is should be valid assert orig.is_valid() is True # mess with payment amounts superblock.payment_amounts = '7|yyzx' assert superblock.is_valid() is False superblock.payment_amounts = '7,|yzx' assert superblock.is_valid() is False superblock.payment_amounts = '7|8' assert superblock.is_valid() is True superblock.payment_amounts = ' 7|8' assert superblock.is_valid() is False superblock.payment_amounts = '7|8 ' assert superblock.is_valid() is False superblock.payment_amounts = ' 7|8 ' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with payment addresses superblock.payment_addresses = 'TwThXv2jrUuk4HG2YD2bxg1RUFzi4Fn4XQ|1234 Anywhere ST, Chicago, USA' assert superblock.is_valid() is False # leading spaces in payment addresses superblock.payment_addresses = ' TwThXv2jrUuk4HG2YD2bxg1RUFzi4Fn4XQ' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # trailing spaces in payment addresses superblock.payment_addresses = 'TwThXv2jrUuk4HG2YD2bxg1RUFzi4Fn4XQ ' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # leading & trailing spaces in payment addresses superblock.payment_addresses = ' TwThXv2jrUuk4HG2YD2bxg1RUFzi4Fn4XQ ' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # single payment addr/amt is ok superblock.payment_addresses = 'TwThXv2jrUuk4HG2YD2bxg1RUFzi4Fn4XQ' superblock.payment_amounts = '5.00' assert superblock.is_valid() is True # ensure number of payment addresses matches number of payments superblock.payment_addresses = 'TwThXv2jrUuk4HG2YD2bxg1RUFzi4Fn4XQ' superblock.payment_amounts = '37.00|23.24' assert superblock.is_valid() is False superblock.payment_addresses = 'TwBnvi9FfwBSuq5ck9LEG7i8ZfdEK55L3L|TwThXv2jrUuk4HG2YD2bxg1RUFzi4Fn4XQ' superblock.payment_amounts = '37.00' assert superblock.is_valid() is False # ensure amounts greater than zero superblock.payment_addresses = 'TwThXv2jrUuk4HG2YD2bxg1RUFzi4Fn4XQ' superblock.payment_amounts = '-37.00' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with proposal hashes superblock.proposal_hashes = '7|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '7,|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '0|1' assert superblock.is_valid() is False superblock.proposal_hashes = '0000000000000000000000000000000000000000000000000000000000000000|1111111111111111111111111111111111111111111111111111111111111111' assert superblock.is_valid() is True # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True
def test_superblock_is_valid(superblock): from gobyted import GoByteDaemon gobyted = GoByteDaemon.from_gobyte_conf(config.gobyte_conf) orig = Superblock(**superblock.get_dict()) # make a copy # original as-is should be valid assert orig.is_valid() is True # mess with payment amounts superblock.payment_amounts = '7|yyzx' assert superblock.is_valid() is False superblock.payment_amounts = '7,|yzx' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with payment addresses superblock.payment_addresses = 'nJUUwdV8JvDXjoMLhmqi9mQCgiA86xPL4h|1234 Anywhere ST, Chicago, USA' assert superblock.is_valid() is False # single payment addr/amt is ok superblock.payment_addresses = 'nJUUwdV8JvDXjoMLhmqi9mQCgiA86xPL4h' superblock.payment_amounts = '5.00' assert superblock.is_valid() is True # ensure number of payment addresses matches number of payments superblock.payment_addresses = 'nJUUwdV8JvDXjoMLhmqi9mQCgiA86xPL4h' superblock.payment_amounts = '37.00|23.24' assert superblock.is_valid() is False superblock.payment_addresses = 'nBYbLHE1TTNPABrZFdfG4ARZHNXDhaZTb1|nJUUwdV8JvDXjoMLhmqi9mQCgiA86xPL4h' superblock.payment_amounts = '37.00' assert superblock.is_valid() is False # ensure amounts greater than zero superblock.payment_addresses = 'nJUUwdV8JvDXjoMLhmqi9mQCgiA86xPL4h' superblock.payment_amounts = '-37.00' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with proposal hashes superblock.proposal_hashes = '7|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '7,|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '0|1' assert superblock.is_valid() is False superblock.proposal_hashes = '0000000000000000000000000000000000000000000000000000000000000000|1111111111111111111111111111111111111111111111111111111111111111' assert superblock.is_valid() is True # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True
def test_superblock_is_valid(superblock): from paccoind import PaccoinDaemon paccoind = PaccoinDaemon.from_paccoin_conf(config.paccoin_conf) orig = Superblock(**superblock.get_dict()) # make a copy # original as-is should be valid assert orig.is_valid() is True # mess with payment amounts superblock.payment_amounts = '7|yyzx' assert superblock.is_valid() is False superblock.payment_amounts = '7,|yzx' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with payment addresses superblock.payment_addresses = 'qaSQZnZyVz5CEwpFVJkAdByf6tKfu9ejTo|1234 Anywhere ST, Chicago, USA' assert superblock.is_valid() is False # single payment addr/amt is ok superblock.payment_addresses = 'qaSQZnZyVz5CEwpFVJkAdByf6tKfu9ejTo' superblock.payment_amounts = '5.00' assert superblock.is_valid() is True # ensure number of payment addresses matches number of payments superblock.payment_addresses = 'qaSQZnZyVz5CEwpFVJkAdByf6tKfu9ejTo' superblock.payment_amounts = '37.00|23.24' assert superblock.is_valid() is False superblock.payment_addresses = 'qfvtZk8GYfeM37gwZiHPZgVJGnwREsXkoT|qaSQZnZyVz5CEwpFVJkAdByf6tKfu9ejTo' superblock.payment_amounts = '37.00' assert superblock.is_valid() is False # ensure amounts greater than zero superblock.payment_addresses = 'qaSQZnZyVz5CEwpFVJkAdByf6tKfu9ejTo' superblock.payment_amounts = '-37.00' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with proposal hashes superblock.proposal_hashes = '7|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '7,|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '0|1' assert superblock.is_valid() is False superblock.proposal_hashes = '0000000000000000000000000000000000000000000000000000000000000000|1111111111111111111111111111111111111111111111111111111111111111' assert superblock.is_valid() is True # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True
def test_superblock_is_valid(superblock): from bitgreend import BitgreenDaemon bitgreend = BitgreenDaemon.from_bitgreen_conf(config.bitgreen_conf) orig = Superblock(**superblock.get_dict()) # make a copy # original as-is should be valid assert orig.is_valid() is True # mess with payment amounts superblock.payment_amounts = '7|yyzx' assert superblock.is_valid() is False superblock.payment_amounts = '7,|yzx' assert superblock.is_valid() is False superblock.payment_amounts = '7|8' assert superblock.is_valid() is True superblock.payment_amounts = ' 7|8' assert superblock.is_valid() is False superblock.payment_amounts = '7|8 ' assert superblock.is_valid() is False superblock.payment_amounts = ' 7|8 ' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with payment addresses superblock.payment_addresses = 'gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7|1234 Anywhere ST, Chicago, USA' assert superblock.is_valid() is False # leading spaces in payment addresses superblock.payment_addresses = ' gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # trailing spaces in payment addresses superblock.payment_addresses = 'gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7 ' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # leading & trailing spaces in payment addresses superblock.payment_addresses = ' gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7 ' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # single payment addr/amt is ok superblock.payment_addresses = 'gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7' superblock.payment_amounts = '5.00' assert superblock.is_valid() is True # ensure number of payment addresses matches number of payments superblock.payment_addresses = 'gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7' superblock.payment_amounts = '37.00|23.24' assert superblock.is_valid() is False superblock.payment_addresses = 'gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7|gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7' superblock.payment_amounts = '37.00' assert superblock.is_valid() is False # ensure amounts greater than zero superblock.payment_addresses = 'gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7' superblock.payment_amounts = '-37.00' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with proposal hashes superblock.proposal_hashes = '7|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '7,|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '0|1' assert superblock.is_valid() is False superblock.proposal_hashes = '0000000000000000000000000000000000000000000000000000000000000000|1111111111111111111111111111111111111111111111111111111111111111' assert superblock.is_valid() is True # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True
def test_superblock_is_valid(superblock): from polisd import PolisDaemon polisd = PolisDaemon.from_polis_conf(config.polis_conf) orig = Superblock(**superblock.get_dict()) # make a copy # original as-is should be valid assert orig.is_valid() is True # mess with payment amounts superblock.payment_amounts = '7|yyzx' assert superblock.is_valid() is False superblock.payment_amounts = '7,|yzx' assert superblock.is_valid() is False superblock.payment_amounts = '7|8' assert superblock.is_valid() is True superblock.payment_amounts = ' 7|8' assert superblock.is_valid() is False superblock.payment_amounts = '7|8 ' assert superblock.is_valid() is False superblock.payment_amounts = ' 7|8 ' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with payment addresses superblock.payment_addresses = 'TDWz9KfMo55wzj2brbgaXxnDz28nAbdPcY|1234 Anywhere ST, Chicago, USA' assert superblock.is_valid() is False # leading spaces in payment addresses superblock.payment_addresses = ' TDWz9KfMo55wzj2brbgaXxnDz28nAbdPcY' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # trailing spaces in payment addresses superblock.payment_addresses = 'TDWz9KfMo55wzj2brbgaXxnDz28nAbdPcY ' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # leading & trailing spaces in payment addresses superblock.payment_addresses = ' TDWz9KfMo55wzj2brbgaXxnDz28nAbdPcY ' superblock.payment_amounts = '5.00' assert superblock.is_valid() is False # single payment addr/amt is ok superblock.payment_addresses = 'TDWz9KfMo55wzj2brbgaXxnDz28nAbdPcY' superblock.payment_amounts = '5.00' assert superblock.is_valid() is True # ensure number of payment addresses matches number of payments superblock.payment_addresses = 'TDWz9KfMo55wzj2brbgaXxnDz28nAbdPcY' superblock.payment_amounts = '37.00|23.24' assert superblock.is_valid() is False superblock.payment_addresses = 'TXDSaTXerg68SCyLkWw2ERsqoTMWRBZiZQ|TDWz9KfMo55wzj2brbgaXxnDz28nAbdPcY' superblock.payment_amounts = '37.00' assert superblock.is_valid() is False # ensure amounts greater than zero superblock.payment_addresses = 'TDWz9KfMo55wzj2brbgaXxnDz28nAbdPcY' superblock.payment_amounts = '-37.00' assert superblock.is_valid() is False # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True # mess with proposal hashes superblock.proposal_hashes = '7|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '7,|yyzx' assert superblock.is_valid() is False superblock.proposal_hashes = '0|1' assert superblock.is_valid() is False superblock.proposal_hashes = '0000000000000000000000000000000000000000000000000000000000000000|1111111111111111111111111111111111111111111111111111111111111111' assert superblock.is_valid() is True # reset superblock = Superblock(**orig.get_dict()) assert superblock.is_valid() is True