Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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)