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)), (f.PRIMARIES.nm, IterableField(LimitedLengthStringField(max_length=NAME_FIELD_LIMIT))), (f.ORIGINAL_VIEW_NO.nm, NonNegativeNumberField()), )
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.ORIGINAL_VIEW_NO.nm, NonNegativeNumberField()), (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
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 ClientTAAAcceptance(MessageValidator): """ Transaction Author Agreement metadata. """ schema = ( (f.TAA_ACCEPTANCE_DIGEST.nm, Sha256HexField()), (f.TAA_ACCEPTANCE_MECHANISM.nm, LimitedLengthStringField( max_length=TAA_ACCEPTANCE_MECHANISM_FIELD_LIMIT)), (f.TAA_ACCEPTANCE_TIME.nm, TimestampField()), )
class Prepare(MessageBase): typename = PREPARE schema = ( (f.INST_ID.nm, NonNegativeNumberField()), (f.VIEW_NO.nm, NonNegativeNumberField()), (f.PP_SEQ_NO.nm, NonNegativeNumberField()), (f.PP_TIME.nm, TimestampField()), (f.DIGEST.nm, LimitedLengthStringField(max_length=DIGEST_FIELD_LIMIT)), (f.STATE_ROOT.nm, MerkleRootField(nullable=True)), (f.TXN_ROOT.nm, MerkleRootField(nullable=True)), )
class Ordered(MessageBase): typename = ORDERED schema = ( (f.INST_ID.nm, NonNegativeNumberField()), (f.VIEW_NO.nm, NonNegativeNumberField()), (f.REQ_IDR.nm, IterableField(RequestIdentifierField())), (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)), )
class PrePrepare(MessageBase): typename = PREPREPARE 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(RequestIdentifierField())), (f.DISCARDED.nm, NonNegativeNumberField()), (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)), )
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=True))), (f.LEDGER_ID.nm, LedgerIdField()), (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()))
class PrePrepare(MessageBase): typename = PREPREPARE 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(RequestIdentifierField())), (f.DISCARDED.nm, NonNegativeNumberField()), (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)), # TODO: support multiple multi-sigs for multiple previous batches (f.BLS_MULTI_SIG.nm, BlsMultiSignatureField(optional=True, nullable=True)))
from plenum.common.messages.fields import TimestampField from plenum.common.util import get_utc_epoch validator = TimestampField() timestamp = get_utc_epoch() def test_valid_value(): assert not validator.validate(timestamp) def test_invalid_value(): assert validator.validate(-1) assert validator.validate(validator._oldest_time - 1)