Exemplo n.º 1
0
def _create_prepare_and_preprepare(inst_id, pp_sq_no, view_no, timestamp,
                                   sdk_wallet_client):
    time = int(timestamp)
    req_idr = ["random request digest"]
    preprepare = PrePrepare(inst_id,
                            pp_sq_no,
                            view_no,
                            time,
                            req_idr,
                            init_discarded(),
                            "123",
                            1,
                            None,
                            None,
                            0,
                            True)
    prepare = Prepare(inst_id,
                      pp_sq_no,
                      view_no,
                      time,
                      "321",
                      None,
                      None
                      )
    return preprepare, prepare
 def from_request(req, three_phase_handler):
     replica = three_phase_handler.master_replica
     args = [
         replica.instId, replica.viewNo, replica.lastPrePrepareSeqNo + 1,
         get_utc_epoch(), [req.digest],
         init_discarded(), req.digest, DOMAIN_LEDGER_ID,
         replica.stateRootHash(TOKEN_LEDGER_ID),
         replica.txnRootHash(TOKEN_LEDGER_ID), 0, True
     ]
     return PrePrepare(*args)
        def nonPrimarySeesCorrectNumberOfPREPREPAREs():
            """
            1. no of PRE-PREPARE as seen by processPrePrepare method for
            non-primaries must be 1; whn zero faulty nodes in system.

            2. no of PRE-PREPARE as seen by processPrePrepare method for
            non-primaries must be greater than or equal to 0;
            with faults in system.
            """
            tm = get_utc_epoch()
            expectedPrePrepareRequest = PrePrepare(
                instId,
                primary.viewNo,
                primary.lastPrePrepareSeqNo,
                tm,
                [propagated1.digest],
                init_discarded(),
                primary._ordering_service.generate_pp_digest([propagated1.digest], primary.viewNo, tm),
                DOMAIN_LEDGER_ID,
                primary._ordering_service.get_state_root_hash(DOMAIN_LEDGER_ID),
                primary._ordering_service.get_txn_root_hash(DOMAIN_LEDGER_ID),
                0,
                True,
                primary._ordering_service.get_state_root_hash(POOL_LEDGER_ID),
                primary._ordering_service.get_txn_root_hash(AUDIT_LEDGER_ID),
            )

            passes = 0
            for npr in nonPrimaryReplicas:
                actualMsgs = len([param for param in
                                  getAllArgs(npr._ordering_service,
                                             npr._ordering_service.process_preprepare)
                                  if (param['pre_prepare'][0:3] +
                                      param['pre_prepare'][4:6] +
                                      param['pre_prepare'][7:],
                                      param['sender']) == (
                                      expectedPrePrepareRequest[0:3] +
                                      expectedPrePrepareRequest[4:6] +
                                      param['pre_prepare'][7:],
                                      primary.name)])

                numOfMsgsWithZFN = 1
                numOfMsgsWithFaults = 0

                passes += int(msgCountOK(nodesSize,
                                         faultyNodes,
                                         actualMsgs,
                                         numOfMsgsWithZFN,
                                         numOfMsgsWithFaults))
            assert passes >= len(nonPrimaryReplicas) - faultyNodes, \
                '1Non-primary sees correct number pre-prepares - {}'.format(passes)
Exemplo n.º 4
0
def test_msg_len_limit_large_enough_for_preprepare():
    config = getConfig()

    batch_size = config.Max3PCBatchSize
    requests = [Request(signatures={})] * batch_size
    req_idr = [req.digest for req in requests]
    digest = Replica.batchDigest(requests)
    state_root = Base58Serializer().serialize(BLANK_ROOT)
    txn_root = Ledger.hashToStr(CompactMerkleTree().root_hash)

    pp = PrePrepare(0, 0, 0, get_utc_epoch(), req_idr, init_discarded(),
                    digest, 0, state_root, txn_root, 0, True)

    assert len(ZStack.serializeMsg(pp)) <= config.MSG_LEN_LIMIT
def testReplicasRejectSamePrePrepareMsg(looper, txnPoolNodeSet,
                                        sdk_pool_handle, sdk_wallet_client):
    """
    Replicas should not accept PRE-PREPARE for view "v" and prepare sequence
    number "n" if it has already accepted a request with view number "v" and
    sequence number "n"

    """
    numOfNodes = 4
    fValue = getMaxFailures(numOfNodes)
    primaryRepl = getPrimaryReplica(txnPoolNodeSet, 1)
    logger.debug("Primary Replica: {}".format(primaryRepl))
    nonPrimaryReplicas = getNonPrimaryReplicas(txnPoolNodeSet, 1)
    logger.debug("Non Primary Replicas: " + str(nonPrimaryReplicas))

    # Delay COMMITs so request is not ordered and checks can be made
    c_delay = 10
    for node in txnPoolNodeSet:
        node.nodeIbStasher.delay(cDelay(delay=c_delay, instId=1))

    req1 = sdk_send_random_requests(looper, sdk_pool_handle, sdk_wallet_client,
                                    1)[0]
    request1 = sdk_json_to_request_object(req1[0])
    for npr in nonPrimaryReplicas:
        looper.run(
            eventually(checkPrepareReqSent,
                       npr,
                       request1.key,
                       primaryRepl.viewNo,
                       retryWait=1))
    prePrepareReq = primaryRepl._ordering_service.sent_preprepares[
        primaryRepl.viewNo, primaryRepl.lastPrePrepareSeqNo]
    looper.run(
        eventually(checkPrePrepareReqRecvd,
                   nonPrimaryReplicas,
                   prePrepareReq,
                   retryWait=1))

    # logger.debug("Patching the primary replica's pre-prepare sending method ")
    # orig_method = primaryRepl.sendPrePrepare

    # def patched(self, ppReq):
    #     self._ordering_service.sent_preprepares[ppReq.viewNo, ppReq.ppSeqNo] = ppReq
    #     ppReq = updateNamedTuple(ppReq, **{f.PP_SEQ_NO.nm: 1})
    #     self.send(ppReq, TPCStat.PrePrepareSent)
    #
    # primaryRepl.sendPrePrepare = types.MethodType(patched, primaryRepl)
    logger.debug(
        "Decrementing the primary replica's pre-prepare sequence number by "
        "one...")
    primaryRepl._ordering_service._lastPrePrepareSeqNo -= 1
    view_no = primaryRepl.viewNo
    request2 = sdk_json_to_request_object(
        sdk_send_random_requests(looper, sdk_pool_handle, sdk_wallet_client,
                                 1)[0][0])
    timeout = waits.expectedPrePrepareTime(len(txnPoolNodeSet))
    looper.run(
        eventually(checkPrePrepareReqSent,
                   primaryRepl,
                   request2,
                   retryWait=1,
                   timeout=timeout))

    # Since the node is malicious, it will not be able to process requests due
    # to conflicts in PRE-PREPARE
    primaryRepl.node.stop()
    looper.removeProdable(primaryRepl.node)

    reqIdr = [request2.digest]
    prePrepareReq = PrePrepare(
        primaryRepl.instId, view_no, primaryRepl.lastPrePrepareSeqNo,
        get_utc_epoch(), reqIdr, init_discarded(),
        primaryRepl.batchDigest([request2]), DOMAIN_LEDGER_ID,
        primaryRepl._ordering_service.get_state_root_hash(DOMAIN_LEDGER_ID),
        primaryRepl._ordering_service.get_txn_root_hash(DOMAIN_LEDGER_ID), 0,
        True, [])

    logger.debug("""Checking whether all the non primary replicas have received
                the pre-prepare request with same sequence number""")
    timeout = waits.expectedPrePrepareTime(len(txnPoolNodeSet))
    looper.run(
        eventually(checkPrePrepareReqRecvd,
                   nonPrimaryReplicas,
                   prePrepareReq,
                   retryWait=1,
                   timeout=timeout))
    logger.debug("""Check that none of the non primary replicas didn't send
    any prepare message "
                             in response to the pre-prepare message""")
    timeout = waits.expectedPrepareTime(len(txnPoolNodeSet))
    looper.runFor(timeout)  # expect prepare processing timeout

    # check if prepares have not been sent
    for npr in nonPrimaryReplicas:
        with pytest.raises(AssertionError):
            looper.run(
                eventually(checkPrepareReqSent,
                           npr,
                           request2.key,
                           view_no,
                           retryWait=1,
                           timeout=timeout))

    timeout = waits.expectedTransactionExecutionTime(
        len(txnPoolNodeSet)) + c_delay
    result1 = sdk_get_replies(looper, [req1])[0][1]
    logger.debug("request {} gives result {}".format(request1, result1))
    return PMessageRep


def patched_LedgerStatus():
    class PLedgerStatus(LedgerStatus):
        schema = LedgerStatus.schema[:-1]

    return PLedgerStatus


discard_counts = {}

pre_prepare_msg = PrePrepare(
    0, 1, 3, get_utc_epoch(), [
        '4AdS22kC7xzb4bcqg9JATuCfAMNcQYcZa1u5eWzs6cSJ',
    ], init_discarded(),
    'f99937241d4c891c08e92a3cc25966607315ca66b51827b170d492962d58a9be', 1,
    'CZecK1m7VYjSNCC7pGHj938DSW2tfbqoJp1bMJEtFqvG',
    '7WrAMboPTcMaQCU1raoj28vnhu2bPMMd2Lr9tEcsXeCJ', 0, True)

prepare_msg = Prepare(
    0,
    1,
    3,
    get_utc_epoch(),
    'f99937241d4c891c08e92a3cc25966607315ca66b51827b170d492962d58a9be',
    'CZecK1m7VYjSNCC7pGHj938DSW2tfbqoJp1bMJEtFqvG',
    '7WrAMboPTcMaQCU1raoj28vnhu2bPMMd2Lr9tEcsXeCJ',
)

commit_msg = Commit(