trait MessageDispatcher extends AnyRef
Dispatches the incoming messages of the com.digitalasset.canton.sequencing.client.SequencerClient to the different processors. It also informs the conflictdetection.RequestTracker about the passing of time for messages that are not processed by the TransactionProcessor.
- Self Type
- MessageDispatcher with NamedLogging
Linear Supertypes
Known Subclasses
Ordering
- Alphabetic
- By Inheritance
Inherited
- MessageDispatcher
- AnyRef
- Any
- Hide All
- Show All
Visibility
- Public
- Protected
Type Members
- abstract type ProcessingAsyncResult
- Attributes
- protected
- type ProcessingResult = FutureUnlessShutdown[(MessageDispatcher.this)#ProcessingAsyncResult]
- Attributes
- protected
Abstract Value Members
- abstract def acsCommitmentProcessor: ProcessorType
- Attributes
- protected
- abstract def badRootHashMessagesRequestProcessor: BadRootHashMessagesRequestProcessor
- Attributes
- protected
- abstract def doProcess(kind: MessageKind): (MessageDispatcher.this)#ProcessingResult
- Attributes
- protected
- implicit abstract val ec: ExecutionContext
- Attributes
- protected
- abstract def handleAll(events: Traced[Seq[WithOpeningErrors[PossiblyIgnoredProtocolEvent]]]): HandlerResult
- abstract def inFlightSubmissionSynchronizerTracker: InFlightSubmissionSynchronizerTracker
- Attributes
- protected
- abstract def metrics: ConnectedSynchronizerMetrics
- Attributes
- protected
- abstract def participantId: ParticipantId
- Attributes
- protected
- implicit abstract def processingAsyncResultMonoid: Monoid[(MessageDispatcher.this)#ProcessingAsyncResult]
- Attributes
- protected
- abstract def protocolVersion: ProtocolVersion
- Attributes
- protected
- abstract def recordOrderPublisher: RecordOrderPublisher
- Attributes
- protected
- abstract def requestCounterAllocator: RequestCounterAllocator
- Attributes
- protected
- abstract def requestProcessors: RequestProcessors
- Attributes
- protected
- abstract def requestTracker: RequestTracker
- Attributes
- protected
- abstract def synchronizerId: SynchronizerId
- Attributes
- protected
- abstract def topologyProcessor: ParticipantTopologyProcessor
- Attributes
- protected
- abstract def trafficProcessor: TrafficControlProcessor
- Attributes
- protected
Concrete Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def alarm(sc: SequencerCounter, ts: CantonTimestamp, msg: String)(implicit traceContext: TraceContext): Unit
- Attributes
- protected
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def checkSingleRootHashMessage(rootHashMessages: Seq[OpenEnvelope[RootHashMessage[SerializedRootHashMessagePayload]]], hasEncryptedViews: Boolean): Checked[FailedRootHashMessageCheck, String, OpenEnvelope[RootHashMessage[SerializedRootHashMessagePayload]]]
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @IntrinsicCandidate() @native()
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def filterBatchForSynchronizerId(batch: Batch[DefaultOpenEnvelope], sc: SequencerCounter, ts: CantonTimestamp)(implicit traceContext: TraceContext): Seq[DefaultOpenEnvelope]
- Attributes
- protected
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @IntrinsicCandidate() @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @IntrinsicCandidate() @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def logDeliveryError(sc: SequencerCounter, ts: CantonTimestamp, msgId: MessageId, status: Status)(implicit traceContext: TraceContext): Unit
- Attributes
- protected
- def logEvent(sc: SequencerCounter, ts: CantonTimestamp, msgId: Option[MessageId], evt: SignedContent[SequencedEvent[DefaultOpenEnvelope]])(implicit traceContext: TraceContext): Unit
- Attributes
- protected
- def logFaultyEvent(sc: SequencerCounter, ts: CantonTimestamp, msgId: Option[MessageId], err: WithOpeningErrors[SequencedEvent[DefaultOpenEnvelope]])(implicit traceContext: TraceContext): Unit
- Attributes
- protected
- def logTimeProof(sc: SequencerCounter, ts: CantonTimestamp)(implicit traceContext: TraceContext): Unit
- Attributes
- protected
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @IntrinsicCandidate() @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @IntrinsicCandidate() @native()
- def observeDeliverError(error: DeliverError)(implicit traceContext: TraceContext): (MessageDispatcher.this)#ProcessingResult
- Attributes
- protected
- def observeSequencing(events: Seq[RawProtocolEvent])(implicit traceContext: TraceContext): (MessageDispatcher.this)#ProcessingResult
- Attributes
- protected
- def processBatch(sequencerCounter: SequencerCounter, eventE: WithOpeningErrors[SignedContent[Deliver[DefaultOpenEnvelope]]])(implicit traceContext: TraceContext): (MessageDispatcher.this)#ProcessingResult
Rules for processing batches of envelopes:
Rules for processing batches of envelopes:
- Identity transactions can be included in any batch of envelopes. They must be processed first. The identity processor ignores replayed or invalid transactions and merely logs an error.
- Acs commitments can be included in any batch of envelopes. They must be processed before
the requests and results to meet the precondition of
com.digitalasset.canton.participant.pruning.AcsCommitmentProcessor's
processBatch
method. - A com.digitalasset.canton.protocol.messages.ConfirmationResultMessage message should be sent only by the trusted mediator of the synchronizer. The mediator should never include further messages with a com.digitalasset.canton.protocol.messages.ConfirmationResultMessage. So a participant accepts a com.digitalasset.canton.protocol.messages.ConfirmationResultMessage only if there are no other messages (except topology transactions and ACS commitments) in the batch. Otherwise, the participant ignores the com.digitalasset.canton.protocol.messages.ConfirmationResultMessage and raises an alarm.
- Request messages originate from untrusted participants. If the batch contains exactly one com.digitalasset.canton.protocol.messages.RootHashMessage that is sent to the participant and the mediator only, the participant processes only request messages with the same root hash. If there are no such root hash message or multiple thereof, the participant does not process the request at all because the mediator will reject the request as a whole.
- We do not know the submitting member of a particular submission because such a submission may be sequenced through an untrusted individual sequencer node (e.g., on a BFT synchronizer). Such a sequencer node could lie about the actual submitting member. These lies work even with signed submission requests when an earlier submission request is replayed. So we cannot rely on honest synchronizer nodes sending their messages only once and instead must deduplicate replays on the recipient side.
- Attributes
- protected
- def processTopologyTransactions(sc: SequencerCounter, ts: SequencedTime, topologyTimestampO: Option[CantonTimestamp], envelopes: Seq[DefaultOpenEnvelope])(implicit traceContext: TraceContext): (MessageDispatcher.this)#ProcessingResult
- Attributes
- protected
- def processTraffic(ts: CantonTimestamp, timestampOfSigningKeyO: Option[CantonTimestamp], envelopes: Seq[DefaultOpenEnvelope])(implicit traceContext: TraceContext): (MessageDispatcher.this)#ProcessingResult
- Attributes
- protected
- def pureProcessingResult: (MessageDispatcher.this)#ProcessingResult
- Attributes
- protected
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])