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 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 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 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 ConsistencyProof(MessageBase): typename = CONSISTENCY_PROOF schema = ( (f.LEDGER_ID.nm, LedgerIdField()), (f.SEQ_NO_START.nm, NonNegativeNumberField()), (f.SEQ_NO_END.nm, NonNegativeNumberField()), (f.VIEW_NO.nm, NonNegativeNumberField()), (f.PP_SEQ_NO.nm, NonNegativeNumberField()), (f.OLD_MERKLE_ROOT.nm, MerkleRootField()), (f.NEW_MERKLE_ROOT.nm, MerkleRootField()), (f.HASHES.nm, IterableField(LimitedLengthStringField(max_length=HASH_FIELD_LIMIT))), )
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)))
class Checkpoint(MessageBase): typename = CHECKPOINT schema = ( (f.INST_ID.nm, NonNegativeNumberField()), (f.VIEW_NO.nm, NonNegativeNumberField()), # This will no longer be used soon (f.SEQ_NO_START.nm, NonNegativeNumberField()), # This is no longer used and must always be 0 (f.SEQ_NO_END.nm, NonNegativeNumberField()), (f.DIGEST.nm, MerkleRootField(nullable=True)), # This is actually audit ledger merkle root )
class LedgerStatusInOldFormat(MessageBase): """ LedgerStatus class without protocol version """ typename = LEDGER_STATUS schema = ((f.LEDGER_ID.nm, LedgerIdField()), (f.TXN_SEQ_NO.nm, NonNegativeNumberField()), (f.VIEW_NO.nm, NonNegativeNumberField(nullable=True)), (f.PP_SEQ_NO.nm, NonNegativeNumberField(nullable=True)), (f.MERKLE_ROOT.nm, MerkleRootField()))
class LedgerStatus(MessageBase): """ Purpose: spread status of ledger copy on a specific node. When node receives this message and see that it has different status of ledger it should reply with LedgerStatus that contains its status """ typename = LEDGER_STATUS schema = ((f.LEDGER_ID.nm, LedgerIdField()), (f.TXN_SEQ_NO.nm, NonNegativeNumberField()), (f.VIEW_NO.nm, NonNegativeNumberField(nullable=True)), (f.PP_SEQ_NO.nm, NonNegativeNumberField(nullable=True)), (f.MERKLE_ROOT.nm, MerkleRootField()), (f.PROTOCOL_VERSION.nm, ProtocolVersionField()))
from plenum.common.messages.fields import MerkleRootField from plenum.test.input_validation.utils import b58_by_len validator = MerkleRootField() def test_non_empty_merkle_roots(): for byte_len in range(1, 33): val = b58_by_len(byte_len) if byte_len == 32: assert not validator.validate(val) else: assert validator.validate(val) def test_empty_string(): assert validator.validate('') def test_invalid_symbol(): res = validator.validate(b58_by_len(32)[:-1] + '0') assert res assert (res == "should not contain the following chars {}".format( sorted(set('0'))))