def pre_prepare_incorrect(state_root, request): if request.param == 'state_root': params = create_pre_prepare_params(state_root=generate_state_root()) elif request.param == 'ledger_id': params = create_pre_prepare_params(state_root=state_root, ledger_id=DOMAIN_LEDGER_ID) elif request.param == 'timestamp': params = create_pre_prepare_params(state_root=state_root, timestamp=get_utc_epoch() + 1000) elif request.param == 'txn_root': params = create_pre_prepare_params(state_root=state_root, txn_root=generate_state_root()) return PrePrepare(*params)
def pre_prepare_with_bls_pool_ledger(multi_signature): params = create_pre_prepare_params( state_root=multi_signature.value.state_root_hash, pool_state_root=multi_signature.value.pool_state_root_hash, bls_multi_sig=multi_signature, ledger_id=POOL_LEDGER_ID) return PrePrepare(*params)
def test_process_pre_prepare_with_incorrect_audit_txn_root( replica_with_requests, state_roots, txn_roots, multi_sig, fake_requests): def reportSuspiciousNodeEx(ex): assert Suspicions.PPR_AUDIT_TXN_ROOT_HASH_WRONG.code == ex.code raise ex replica_with_requests.node.reportSuspiciousNodeEx = reportSuspiciousNodeEx pre_prepare_params = create_pre_prepare_params( state_root=state_roots[DOMAIN_LEDGER_ID], ledger_id=DOMAIN_LEDGER_ID, txn_root=txn_roots[DOMAIN_LEDGER_ID], bls_multi_sig=multi_sig, view_no=replica_with_requests.viewNo, inst_id=replica_with_requests.instId, pool_state_root=state_roots[POOL_LEDGER_ID], # INVALID! audit_txn_root="HSai3sMHKeAva4gWMabDrm1yNhezvPHfXnGyHf2ex1L4", reqs=fake_requests) pre_prepare = PrePrepare(*pre_prepare_params) with pytest.raises(SuspiciousNode): replica_with_requests.processPrePrepare( pre_prepare, replica_with_requests.primaryName)
def test_process_pre_prepare_with_incorrect_audit_txn_root( orderer_with_requests, state_roots, txn_roots, multi_sig, fake_requests): expect_suspicious(orderer_with_requests, Suspicions.PPR_AUDIT_TXN_ROOT_HASH_WRONG.code) pre_prepare_params = create_pre_prepare_params( state_root=state_roots[DOMAIN_LEDGER_ID], ledger_id=DOMAIN_LEDGER_ID, txn_root=txn_roots[DOMAIN_LEDGER_ID], bls_multi_sig=multi_sig, view_no=orderer_with_requests.view_no, inst_id=0, pool_state_root=state_roots[POOL_LEDGER_ID], # INVALID! audit_txn_root="HSai3sMHKeAva4gWMabDrm1yNhezvPHfXnGyHf2ex1L4", reqs=fake_requests, pp_seq_no=1) pre_prepare = PrePrepare(*pre_prepare_params) _register_pp_ts(orderer_with_requests, pre_prepare, orderer_with_requests.primary_name) with pytest.raises(SuspiciousNode): orderer_with_requests.process_preprepare( pre_prepare, orderer_with_requests.primary_name)
def fake_pre_prepare_with_bls(fake_multi_sig, ledger_id): params = create_pre_prepare_params( state_root=fake_multi_sig.value.state_root_hash, ledger_id=ledger_id, pool_state_root=fake_multi_sig.value.pool_state_root_hash, bls_multi_sig=fake_multi_sig) return PrePrepare(*params)
def test_update_pre_prepare_first_time(bls_bft_replicas, state_root, ledger_id): params = create_pre_prepare_params(state_root, ledger_id=ledger_id) params_initial = copy(params) for bls_bft_replica in bls_bft_replicas: params = bls_bft_replica.update_pre_prepare(params, ledger_id) assert params == params_initial
def test_process_pre_prepare_with_incorrect_audit_txn_root(orderer_with_requests, state_roots, txn_roots, multi_sig, fake_requests): if not orderer_with_requests.is_master: return handler = Mock() orderer_with_requests._bus.subscribe(RaisedSuspicion, handler) pre_prepare_params = create_pre_prepare_params(state_root=state_roots[DOMAIN_LEDGER_ID], ledger_id=DOMAIN_LEDGER_ID, txn_root=txn_roots[DOMAIN_LEDGER_ID], bls_multi_sig=multi_sig, view_no=orderer_with_requests.view_no, inst_id=0, pool_state_root=state_roots[POOL_LEDGER_ID], # INVALID! audit_txn_root="HSai3sMHKeAva4gWMabDrm1yNhezvPHfXnGyHf2ex1L4", reqs=fake_requests, pp_seq_no=1) pre_prepare = PrePrepare(*pre_prepare_params) _register_pp_ts(orderer_with_requests, pre_prepare, orderer_with_requests.primary_name) orderer_with_requests.process_preprepare(pre_prepare, orderer_with_requests.primary_name) check_suspicious(handler, RaisedSuspicion(inst_id=orderer_with_requests._data.inst_id, ex=SuspiciousNode(orderer_with_requests.primary_name, Suspicions.PPR_AUDIT_TXN_ROOT_HASH_WRONG, pre_prepare)))
def pre_prepare_with_bls(multi_signature, ledger_id): params = create_pre_prepare_params( state_root=multi_signature.value.state_root_hash, ledger_id=ledger_id, pool_state_root=multi_signature.value.pool_state_root_hash, bls_multi_sig=multi_signature) return PrePrepare(*params)
def pre_prepare(checkpoint_service): params = create_pre_prepare_params(None, ledger_id=DOMAIN_LEDGER_ID, view_no=checkpoint_service.view_no, pp_seq_no=1) pp = PrePrepare(*params) return pp
def fake_pre_prepare_with_bls_pool_ledger(fake_multi_sig): params = create_pre_prepare_params( state_root=fake_multi_sig.value.state_root_hash, pool_state_root=fake_multi_sig.value.pool_state_root_hash, bls_multi_sig=fake_multi_sig, ledger_id=POOL_LEDGER_ID) return PrePrepare(*params)
def test_suspicious_on_wrong_list_of_primaries(orderer_with_requests, state_roots, txn_roots, multi_sig, fake_requests): if not orderer_with_requests.is_master: return handler = Mock() orderer_with_requests._bus.subscribe(RaisedSuspicion, handler) pre_prepare_params = create_pre_prepare_params(state_root=state_roots[DOMAIN_LEDGER_ID], ledger_id=DOMAIN_LEDGER_ID, txn_root=txn_roots[DOMAIN_LEDGER_ID], bls_multi_sig=multi_sig, view_no=orderer_with_requests.view_no, inst_id=0, pool_state_root=state_roots[POOL_LEDGER_ID], audit_txn_root=state_roots[AUDIT_LEDGER_ID], reqs=fake_requests, pp_seq_no=1, primaries=["Some", "Other", "Primaries"]) pre_prepare = PrePrepare(*pre_prepare_params) _register_pp_ts(orderer_with_requests, pre_prepare, orderer_with_requests.primary_name) orderer_with_requests.process_preprepare(pre_prepare, orderer_with_requests.primary_name) check_suspicious(handler, RaisedSuspicion(inst_id=orderer_with_requests._data.inst_id, ex=SuspiciousNode(orderer_with_requests.primary_name, Suspicions.PPR_WITH_WRONG_PRIMARIES, pre_prepare)))
def pre_prepare_with_incorrect_bls(multi_signature): multi_signature.signature = base58.b58encode( b"somefakesignaturesomefakesignaturesomefakesignature").decode("utf-8") params = create_pre_prepare_params( state_root=multi_signature.value.state_root_hash, pool_state_root=multi_signature.value.pool_state_root_hash, bls_multi_sig=multi_signature) return PrePrepare(*params)
def pre_prepare(replica, pool_state_root, fake_state_root_hash, fake_multi_sig, request): params = create_pre_prepare_params(state_root=fake_state_root_hash, view_no=replica.viewNo, pool_state_root=pool_state_root) pp = PrePrepare(*params) if request.param: setattr(pre_prepare, f.BLS_MULTI_SIG.nm, fake_multi_sig) return pp
def test_update_pre_prepare_after_ordered(bls_bft_replicas, state_root, fake_multi_sig): for bls_bft_replica in bls_bft_replicas: bls_bft_replica._bls_latest_multi_sig = fake_multi_sig params = create_pre_prepare_params(state_root) params_initial = copy(params) for bls_bft_replica in bls_bft_replicas: params = bls_bft_replica.update_pre_prepare(params, DOMAIN_LEDGER_ID) assert params != params_initial
def test_update_pre_prepare_after_ordered(bls_bft_replicas, state_root, fake_multi_sig, ledger_id): for bls_bft_replica in bls_bft_replicas: bls_bft_replica._bls_latest_multi_sig = fake_multi_sig params = create_pre_prepare_params(state_root, ledger_id=ledger_id) params_initial = copy(params) for bls_bft_replica in bls_bft_replicas: params = bls_bft_replica.update_pre_prepare(params, ledger_id) assert params != params_initial
def pre_prepare(replica, state_roots, txn_roots, multi_sig, fake_requests): params = create_pre_prepare_params(state_root=state_roots[DOMAIN_LEDGER_ID], ledger_id=DOMAIN_LEDGER_ID, txn_root=txn_roots[DOMAIN_LEDGER_ID], bls_multi_sig=multi_sig, view_no=replica.viewNo, inst_id=replica.instId, pool_state_root=state_roots[POOL_LEDGER_ID], audit_txn_root=txn_roots[AUDIT_LEDGER_ID], reqs=fake_requests) pp = PrePrepare(*params) return pp
def test_validate_commit_signature_without_pool_state_root( bls_bft_replicas, multi_signature): key = (0, 0) params = create_pre_prepare_params( state_root=multi_signature.value.state_root_hash) pre_prepare = PrePrepare(*params) setattr(pre_prepare, f.BLS_MULTI_SIG.nm, multi_signature) for sender_bls_bft in bls_bft_replicas: commit = create_commit_bls_sig(sender_bls_bft, key, pre_prepare) for verifier_bls_bft in bls_bft_replicas: assert verifier_bls_bft.validate_commit( commit, sender_bls_bft.node_id, pre_prepare) is None
def _pre_prepare(orderer, state_roots, txn_roots, multi_sig, fake_requests): params = create_pre_prepare_params(state_root=state_roots[DOMAIN_LEDGER_ID], ledger_id=DOMAIN_LEDGER_ID, txn_root=txn_roots[DOMAIN_LEDGER_ID], bls_multi_sig=multi_sig, view_no=orderer.view_no, inst_id=0, pool_state_root=state_roots[POOL_LEDGER_ID], audit_txn_root=txn_roots[AUDIT_LEDGER_ID], reqs=fake_requests, pp_seq_no=1) pp = PrePrepare(*params) return pp
def test_rolling_release_for_bls_fixes(bls_bft_replicas, nodes_updated, quorums, multi_signature, pre_prepare_with_bls, ledger_id, state_root): key = (0, 0) for i in range(len(bls_bft_replicas)): commit = create_commit_bls_sig(bls_bft_replicas[i], (0, 0), pre_prepare_with_bls) if i < nodes_updated: assert commit.blsSigs is not None assert len(commit.blsSigs.items()) == 2 for verifier_bls_bft in bls_bft_replicas: status = verifier_bls_bft.validate_commit( commit, bls_bft_replicas[i].node_id, pre_prepare_with_bls) assert status != BlsBftReplica.CM_BLS_SIG_WRONG verifier_bls_bft.process_commit(commit, bls_bft_replicas[i].node_id) for bls_bft in bls_bft_replicas: bls_bft.process_order(key, quorums, pre_prepare_with_bls) params = create_pre_prepare_params(state_root, ledger_id=ledger_id) params_initial = copy(params) for i in range(len(bls_bft_replicas)): params_res = bls_bft_replicas[i].update_pre_prepare( copy(params), ledger_id) assert params_res != params_initial if i < nodes_updated: assert len(params_res) - len(params_initial) == 2 pre_prepare = PrePrepare(*params_res) if quorums.bls_signatures.is_reached( nodes_updated) and i < nodes_updated: assert len(pre_prepare.blsMultiSigs) == 2 for verifier_bls_bft in bls_bft_replicas: status = verifier_bls_bft.validate_pre_prepare( pre_prepare, bls_bft_replicas[i].node_id) assert status != BlsBftReplica.PPR_BLS_MULTISIG_WRONG verifier_bls_bft.process_pre_prepare(pre_prepare, bls_bft_replicas[i].node_id) for i in range(len(bls_bft_replicas)): if quorums.bls_signatures.is_reached( nodes_updated) and i < nodes_updated: assert bls_bft_replicas[i]._bls_bft.bls_store.get( multi_signature.value.state_root_hash) assert bls_bft_replicas[i]._bls_bft.bls_store.get( "2UQ3Da54cQ6SamunzXVAtBozFnkACELBH7HzbRPgfKzm") else: assert bls_bft_replicas[i]._bls_bft.bls_store.get( multi_signature.value.state_root_hash)
def test_update_pre_prepare_after_ordered_with_multiple_sigs( bls_bft_replicas, state_root, fake_multi_sig, ledger_id, create_audit_txn_with_multiple_ledgers): for bls_bft_replica in bls_bft_replicas: bls_bft_replica._bls_latest_multi_sig = fake_multi_sig bls_bft_replica._all_bls_latest_multi_sigs = [fake_multi_sig] params = create_pre_prepare_params(state_root, ledger_id=ledger_id) params_initial = copy(params) for bls_bft_replica in bls_bft_replicas: params_res = bls_bft_replica.update_pre_prepare( copy(params), ledger_id) assert params_res != params_initial assert len(params_res) - len(params_initial) == 2
def test_process_pre_prepare_with_incorrect_pool_state_root( replica_with_requests, state_roots, txn_roots, multi_sig, fake_requests): expect_suspicious(replica_with_requests, Suspicions.PPR_POOL_STATE_ROOT_HASH_WRONG.code) pre_prepare_params = create_pre_prepare_params( state_root=state_roots[DOMAIN_LEDGER_ID], ledger_id=DOMAIN_LEDGER_ID, txn_root=txn_roots[DOMAIN_LEDGER_ID], bls_multi_sig=multi_sig, view_no=replica_with_requests.viewNo, inst_id=replica_with_requests.instId, # INVALID! pool_state_root="HSai3sMHKeAva4gWMabDrm1yNhezvPHfXnGyHf2ex1L4", audit_txn_root=txn_roots[AUDIT_LEDGER_ID], reqs=fake_requests) pre_prepare = PrePrepare(*pre_prepare_params) with pytest.raises(SuspiciousNode): replica_with_requests.processPrePrepare( pre_prepare, replica_with_requests.primaryName)
def fake_pp(ledger_id=DOMAIN_LEDGER_ID): params = create_pre_prepare_params(state_root=generate_state_root(), ledger_id=ledger_id) return PrePrepare(*params)
def test_update_pre_prepare_first_time(bls_bft_replicas, state_root): params = create_pre_prepare_params(state_root) params_initial = copy(params) for bls_bft_replica in bls_bft_replicas: params = bls_bft_replica.update_pre_prepare(params, DOMAIN_LEDGER_ID) assert params == params_initial
def pre_prepare_no_bls(state_root, pool_state_root, ledger_id): params = create_pre_prepare_params(state_root=state_root, ledger_id=ledger_id, pool_state_root=pool_state_root) return PrePrepare(*params)