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. """ expectedPrePrepareRequest = PrePrepare( instId, primary.viewNo, primary.lastPrePrepareSeqNo, get_utc_epoch(), [propagated1.digest], init_discarded(), Replica.batchDigest([ propagated1, ]), DOMAIN_LEDGER_ID, primary.stateRootHash(DOMAIN_LEDGER_ID), primary.txnRootHash(DOMAIN_LEDGER_ID), 0, True) passes = 0 for npr in nonPrimaryReplicas: actualMsgs = len([ param for param in getAllArgs(npr, npr.processPrePrepare) if (param['pre_prepare'][0:3] + param['pre_prepare'][4:], param['sender']) == (expectedPrePrepareRequest[0:3] + expectedPrePrepareRequest[4:], primary.name) ]) numOfMsgsWithZFN = 1 numOfMsgsWithFaults = 0 passes += int( msgCountOK(nodesSize, faultyNodes, actualMsgs, numOfMsgsWithZFN, numOfMsgsWithFaults)) assert passes >= len(nonPrimaryReplicas) - faultyNodes, \ 'Non-primary sees correct number pre-prepares - {}'.format(passes)
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 create_pre_prepare_params(state_root, ledger_id=DOMAIN_LEDGER_ID, txn_root=None, timestamp=None, bls_multi_sig=None, view_no=0, pool_state_root=None, pp_seq_no=0, inst_id=0, audit_txn_root=None, reqs=None): digest = Replica.batchDigest(reqs) if reqs is not None else "random digest" req_idrs = [req.key for req in reqs] if reqs is not None else ["random request"] params = [ inst_id, view_no, pp_seq_no, timestamp or get_utc_epoch(), req_idrs, init_discarded(0), digest, ledger_id, state_root, txn_root or '1' * 32, 0, True ] if pool_state_root is not None: params.append(pool_state_root) params.append(audit_txn_root or generate_state_root()) if bls_multi_sig: params.append(bls_multi_sig.as_list()) return params
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 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. """ expectedPrePrepareRequest = PrePrepare( instId, primary.viewNo, primary.lastPrePrepareSeqNo, get_utc_epoch(), [propagated1.digest], init_discarded(), Replica.batchDigest([propagated1, ]), DOMAIN_LEDGER_ID, primary.stateRootHash(DOMAIN_LEDGER_ID), primary.txnRootHash(DOMAIN_LEDGER_ID), 0, True, primary.stateRootHash(POOL_LEDGER_ID) ) passes = 0 for npr in nonPrimaryReplicas: actualMsgs = len([param for param in getAllArgs(npr, npr.processPrePrepare) if (param['pre_prepare'][0:3] + param['pre_prepare'][4:], param['sender']) == ( expectedPrePrepareRequest[0:3] + expectedPrePrepareRequest[4:], primary.name)]) numOfMsgsWithZFN = 1 numOfMsgsWithFaults = 0 passes += int(msgCountOK(nodesSize, faultyNodes, actualMsgs, numOfMsgsWithZFN, numOfMsgsWithFaults)) assert passes >= len(nonPrimaryReplicas) - faultyNodes, \ 'Non-primary sees correct number pre-prepares - {}'.format(passes)
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. """ expectedPrePrepareRequest = PrePrepare( instId, primary.viewNo, primary.lastPrePrepareSeqNo, time.time(), [[propagated1.identifier, propagated1.reqId]], 1, Replica.batchDigest([ propagated1, ]), DOMAIN_LEDGER_ID, primary.stateRootHash(DOMAIN_LEDGER_ID), primary.txnRootHash(DOMAIN_LEDGER_ID), ) passes = 0 for npr in nonPrimaryReplicas: actualMsgs = len([ param for param in getAllArgs(npr, npr.processPrePrepare) if (param['pp'][0:3] + param['pp'][4:], param['sender']) == (expectedPrePrepareRequest[0:3] + expectedPrePrepareRequest[4:], primary.name) ]) numOfMsgsWithZFN = 1 numOfMsgsWithFaults = 0 passes += int( msgCountOK(nodesSize, faultyNodes, actualMsgs, numOfMsgsWithZFN, numOfMsgsWithFaults)) assert passes >= len(nonPrimaryReplicas) - faultyNodes