class Batch(MessageBase): typename = BATCH schema = ( (f.MSGS.nm, IterableField(SerializedValueField())), (f.SIG.nm, SignatureField(max_length=SIGNATURE_FIELD_LIMIT)), )
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
import pytest from plenum.common.messages.fields import SerializedValueField validator = SerializedValueField() def test_non_empty_string(): assert not validator.validate("x") def test_empty_string(): assert validator.validate("") def test_non_empty_bytes(): assert not validator.validate(b"hello") def test_empty_bytes(): assert validator.validate(b"")