def test_superblock_size_limit(go_list_proposals): import chaincoinlib import misc from chaincoind import ChaincoinDaemon chaincoind = ChaincoinDaemon.from_chaincoin_conf(config.chaincoin_conf) for item in go_list_proposals: (go, subobj) = GovernanceObject.import_gobject_from_chaincoind(chaincoind, 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 = chaincoinlib.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 == 'ZHJV7jhBWgaB1uxazbVsnQU5HUDAqX14Bz|ZH6bt95skGVco2t3gRuHggcSUrtRZ5BUsr' assert sb.payment_amounts == '315.75000000|21.05000000' assert sb.proposal_hashes == '7fa2798fee8ea74c3a369db72ae872096bd4e4714f1f5027c730ccfbf58aac02|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e' assert sb.hex_hash() == 'bb3f33ccf95415c396bd09d35325dbcbc7b067010d51c7ccf772a9e839c1e414'
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses='gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7|gXcKEE2cr7gXxaupoSU7J2iwjGvGDUtKi7', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses='nFr5So8SVuREU8bghTF4eZewiMuKaZ4M2t|nGSspKw2vnGQMvX3BiRLNSCD21MVXbCcwt', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses='mtHjXMx6dvTwgcvkDvsuWftiyNPi26RqDq|mocfCW5mUWLdcqphNxbcsVKjzqTgdKckW6', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses='ZHJV7jhBWgaB1uxazbVsnQU5HUDAqX14Bz|ZH6bt95skGVco2t3gRuHggcSUrtRZ5BUsr', payment_amounts='5|3', proposal_hashes='7fa2798fee8ea74c3a369db72ae872096bd4e4714f1f5027c730ccfbf58aac02|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses='TwBnvi9FfwBSuq5ck9LEG7i8ZfdEK55L3L|TwThXv2jrUuk4HG2YD2bxg1RUFzi4Fn4XQ', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses='yYe8KwyaUu5YswSYmB3q3ryx8XTUu9y7Ui|yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses='TXDSaTXerg68SCyLkWw2ERsqoTMWRBZiZQ|TDWz9KfMo55wzj2brbgaXxnDz28nAbdPcY', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses='seVNpH5rkau8dKhumiLF1BYspp2vf7Lkyb|sftsJedhmLqYBWPkbvpqksqsvS9pAbLaLS', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses='nBYbLHE1TTNPABrZFdfG4ARZHNXDhaZTb1|nJUUwdV8JvDXjoMLhmqi9mQCgiA86xPL4h', payment_amounts='5|3', proposal_hashes='e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def create_superblock(dashd, proposals, event_block_height): from models import Superblock, GovernanceObject, Proposal # don't create an empty superblock if (len(proposals) == 0): printdbg("No proposals, cannot create an empty superblock.") return None budget_allocated = Decimal(0) budget_max = dashd.get_superblock_budget_allocation(event_block_height) 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 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), 'object_hash': proposal.object_hash } payments.append(payment) # don't create an empty superblock if not payments: printdbg("No proposals made the cut!") return None 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]), payment_objects_hashes='|'.join([pd['object_hash'] for pd in payments]), ) return sb
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") return sbobj
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses= 'ScHeMAQrdB2BAMZ5V8hfrd9Xveosj2F8DN|mocfCW5mUWLdcqphNxbcsVKjzqTgdKckW6', payment_amounts='5|3', proposal_hashes= 'e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=43800, payment_addresses= 'TFcpmdvna59VuWdhCQQYsKE4jm6tUMeuEJ|TEjMnhB5mAPrpg7R4CUCSGQNnJqPeAFBTH', payment_amounts='5|3', proposal_hashes= 'e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses= 'tCa7rDMXs1KeqaqmcFoXxXMmwT9eq9r7oK|t7RKTBNZsTbjwAoXYfsSsTSwimxzDKh5Fu', payment_amounts='5|3', proposal_hashes= 'e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses= "yYe8KwyaUu5YswSYmB3q3ryx8XTUu9y7Ui|yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV", payment_amounts="5|3") # NOTE: this object is (intentionally) not saved yet. # We want to return an built, but unsaved, object return sb
def superblock(): sb = Superblock( event_block_height=43800, payment_addresses= 'TSTfeMeWwQiCDwMSTWRaj9wwVGNjZFfvFk|TEjMnhB5mAPrpg7R4CUCSGQNnJqPeAFBTH', payment_amounts='5|3', proposal_hashes= 'e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
def superblock(): sb = Superblock( event_block_height=62500, payment_addresses= 'qfvtZk8GYfeM37gwZiHPZgVJGnwREsXkoT|qaSQZnZyVz5CEwpFVJkAdByf6tKfu9ejTo', payment_amounts='50000|30000', proposal_hashes= 'e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87|d1ce73527d7cd6f2218f8ca893990bc7d5c6b9334791ce7973bfa22f155f826e', ) return sb
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='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_superblock_is_valid(superblock): from dashd import DashDaemon dashd = DashDaemon.from_dash_conf(config.dash_conf) current_ebh = dashd.next_superblock_height() superblock.event_block_height = current_ebh orig = Superblock(**superblock.get_dict()) # make a copy # original as-is should be valid assert orig.is_valid(dashd) == True # mess with payment amounts superblock.payment_amounts = '7|yyzx' assert superblock.is_valid(dashd) == False superblock.payment_amounts = '7,|yzx' assert superblock.is_valid(dashd) == False # reset superblock.payment_amounts = orig.payment_amounts assert superblock.is_valid(dashd) == True # mess with payment addresses superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV|1234 Anywhere ST, Chicago, USA' assert superblock.is_valid(dashd) == False # single payment addr/amt is ok superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '5.00' assert superblock.is_valid(dashd) == 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(dashd) == False superblock.payment_addresses = 'yYe8KwyaUu5YswSYmB3q3ryx8XTUu9y7Ui|yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '37.00' assert superblock.is_valid(dashd) == False # ensure amounts greater than zero superblock.payment_addresses = 'yTC62huR4YQEPn9AJHjnQxxreHSbgAoatV' superblock.payment_amounts = '-37.00' assert superblock.is_valid(dashd) == False
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 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 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 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 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 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