class BatchCommitted(MessageBase): """ Purpose: pass to Observable after each batch is committed (so that Observable can propagate the data to Observers using ObservedData msg) """ typename = BATCH_COMMITTED schema = ( (f.REQUESTS.nm, IterableField( ClientMessageValidator( operation_schema_is_strict=OPERATION_SCHEMA_IS_STRICT))), (f.LEDGER_ID.nm, LedgerIdField()), (f.INST_ID.nm, NonNegativeNumberField()), (f.VIEW_NO.nm, NonNegativeNumberField()), (f.PP_SEQ_NO.nm, NonNegativeNumberField()), (f.PP_TIME.nm, TimestampField()), (f.STATE_ROOT.nm, MerkleRootField()), (f.TXN_ROOT.nm, MerkleRootField()), (f.SEQ_NO_START.nm, NonNegativeNumberField()), (f.SEQ_NO_END.nm, NonNegativeNumberField()), (f.AUDIT_TXN_ROOT_HASH.nm, MerkleRootField(nullable=True)), )
class Ordered(MessageBase): typename = ORDERED schema = ((f.INST_ID.nm, NonNegativeNumberField()), (f.VIEW_NO.nm, NonNegativeNumberField()), (f.VALID_REQ_IDR.nm, IterableField( LimitedLengthStringField(max_length=DIGEST_FIELD_LIMIT))), (f.INVALID_REQ_IDR.nm, IterableField( LimitedLengthStringField(max_length=DIGEST_FIELD_LIMIT))), (f.PP_SEQ_NO.nm, NonNegativeNumberField()), (f.PP_TIME.nm, TimestampField()), (f.LEDGER_ID.nm, LedgerIdField()), (f.STATE_ROOT.nm, MerkleRootField(nullable=True)), (f.TXN_ROOT.nm, MerkleRootField(nullable=True)), (f.AUDIT_TXN_ROOT_HASH.nm, MerkleRootField(nullable=True)), (f.PRIMARIES.nm, IterableField( LimitedLengthStringField(max_length=NAME_FIELD_LIMIT))), (f.PLUGIN_FIELDS.nm, AnyMapField(optional=True, nullable=True)))
class PrePrepare(MessageBase): schema = ( (f.INST_ID.nm, NonNegativeNumberField()), (f.VIEW_NO.nm, NonNegativeNumberField()), (f.PP_SEQ_NO.nm, NonNegativeNumberField()), (f.PP_TIME.nm, TimestampField()), (f.REQ_IDR.nm, IterableField( LimitedLengthStringField(max_length=DIGEST_FIELD_LIMIT))), (f.DISCARDED.nm, SerializedValueField(nullable=True)), (f.DIGEST.nm, LimitedLengthStringField(max_length=DIGEST_FIELD_LIMIT)), (f.LEDGER_ID.nm, LedgerIdField()), (f.STATE_ROOT.nm, MerkleRootField(nullable=True)), (f.TXN_ROOT.nm, MerkleRootField(nullable=True)), (f.SUB_SEQ_NO.nm, NonNegativeNumberField()), (f.FINAL.nm, BooleanField()), (f.POOL_STATE_ROOT_HASH.nm, MerkleRootField(optional=True, nullable=True)), (f.AUDIT_TXN_ROOT_HASH.nm, MerkleRootField(optional=True, nullable=True)), # TODO: support multiple multi-sigs for multiple previous batches (f.BLS_MULTI_SIG.nm, BlsMultiSignatureField(optional=True, nullable=True)), (f.PLUGIN_FIELDS.nm, AnyMapField(optional=True, nullable=True)), ) typename = PREPREPARE def _post_process(self, input_as_dict: Dict) -> Dict: # make validated input hashable input_as_dict[f.REQ_IDR.nm] = tuple(input_as_dict[f.REQ_IDR.nm]) bls = input_as_dict.get(f.BLS_MULTI_SIG.nm, None) if bls is not None: input_as_dict[f.BLS_MULTI_SIG.nm] = (bls[0], tuple(bls[1]), tuple(bls[2])) return input_as_dict
class PrePrepare(MessageBase): schema = ( (f.INST_ID.nm, NonNegativeNumberField()), (f.VIEW_NO.nm, NonNegativeNumberField()), (f.PP_SEQ_NO.nm, NonNegativeNumberField()), (f.PP_TIME.nm, TimestampField()), (f.REQ_IDR.nm, IterableField( LimitedLengthStringField(max_length=DIGEST_FIELD_LIMIT))), (f.DISCARDED.nm, SerializedValueField(nullable=True)), (f.DIGEST.nm, LimitedLengthStringField(max_length=DIGEST_FIELD_LIMIT)), (f.LEDGER_ID.nm, LedgerIdField()), (f.STATE_ROOT.nm, MerkleRootField(nullable=True)), (f.TXN_ROOT.nm, MerkleRootField(nullable=True)), (f.SUB_SEQ_NO.nm, NonNegativeNumberField()), (f.FINAL.nm, BooleanField()), (f.POOL_STATE_ROOT_HASH.nm, MerkleRootField(optional=True, nullable=True)), # TODO: support multiple multi-sigs for multiple previous batches (f.BLS_MULTI_SIG.nm, BlsMultiSignatureField(optional=True, nullable=True)), (f.PLUGIN_FIELDS.nm, AnyMapField(optional=True, nullable=True)), ) typename = PREPREPARE
class ClientGetTxnOperation(MessageValidator): schema = ( (TXN_TYPE, ConstantField(GET_TXN)), (f.LEDGER_ID.nm, LedgerIdField(optional=True)), (DATA, TxnSeqNoField()), )
from plenum.common.messages.fields import LedgerIdField from plenum.common.constants import POOL_LEDGER_ID, DOMAIN_LEDGER_ID from plenum import PLUGIN_LEDGER_IDS validator = LedgerIdField() def test_valid_ledger_id(): assert not validator.validate(POOL_LEDGER_ID) assert not validator.validate(DOMAIN_LEDGER_ID) def test_invalid_ledger_id(): not_existing_ledger = 100 assert validator.validate(not_existing_ledger)