def create_superblock(proposals, event_block_height, budget_max, sb_epoch_time, maxgovobjdatasize): 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 slightly 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", ) ) payment = {'address': proposal.payment_address, 'amount': "{0:.8f}".format(proposal.payment_amount), 'proposal': "{}".format(proposal.object_hash)} # calculate current sb data size sb_temp = 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]) ) data_size = len(sb_temp.dashd_serialise()) if data_size > maxgovobjdatasize: printdbg("MAX_GOVERNANCE_OBJECT_DATA_SIZE limit reached!") break # else add proposal and keep track of total budget allocation budget_allocated += proposal.payment_amount 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
sbobj = Superblock( event_block_height=event_block_height, payment_addresses='yYe8KwyaUu5YswSYmB3q3ryx8XTUu9y7Ui', payment_amounts='{0}'.format(payment_amounts), proposal_hashes= 'e8a0057914a2e1964ae8a945c4723491caae2077a90a00a2aabee22b40081a87', ) ratecheckbuffer = list() #hash = sbobj.submit(node1) #cmd = sbobj.get_submit_command() sb_time = int(now()) cmd = ['gobject', 'submit', '0', '1', str(sb_time), sbobj.dashd_serialise()] object_hash = node1.rpc_command(*cmd) print '\nperform basic checks\n' ratecheckbuffer.append(sb_time) log1.expect_minimum('push_inventory:govobj {0}'.format(object_hash), 1) log2.expect('govobj_accepted:{0}'.format(object_hash), 1) log3.expect('govobj_accepted:{0}'.format(object_hash), 1) log2.expect_minimum('push_inventory:govobj {0}'.format(object_hash), 1) log3.expect_minimum('push_inventory:govobj {0}'.format(object_hash), 1) print '\nwaiting 15 seconds' time.sleep(15)