Release of Canton 3.7.0
Canton 3.7.0 has been released on October 29, 2026.Summary
This minor release introduces protocol version 37. The main themes:- Multi-synchronizer: no feature flag needed on protocol version 37, and Ledger API changes for multi-synchronizer applications (see Breaking changes).
- Party replication: new
v31topology transactions that track the hosting state of each participant of a party, to enable Hybrid Party Replication (HyPR). Applications that decodePartyToParticipanttransactions may need to act (see the migration guide). - CantonBFT: lower ordering latency and faster catch-up and onboarding.
- Traffic management: traffic can be purchased for participants before they register with the sequencer, and cost estimation covers reassignments.
- Hardening and scalability: protocol version 37 bounds more protocol, topology, and ACS commitment collections, and sequencer and topology states larger than 2 GB can be exported and imported.
- Ledger API:
StateServiceexcludes incomplete reassignments unlessincludeIncompleteReassignmentsis set, and rejects continuation and page tokens of previous versions.GenerateExternalPartyTopologyreturnsv31topology transactions on protocol version 37, unless explicitly requested for protocol version 36.- Contracts with a non-zero reassignment counter that repair commands import, add or purge appear as Assigned and Unassigned events.
- Node APIs and console:
- Sequencers and mediators no longer store their onboarding transactions. Use
generate_onboarding_transactionsinstead ofidentity_transactions. propose_deltano longer moves an Active participant back to Onboarding.
- Sequencers and mediators no longer store their onboarding transactions. Use
- Protocol:
- (*) Synchronizers on protocol version 36 are not affected. Protocol version 37 will be rolled out as a new protocol version.
- Configuration: changed default values for safety.
- The participant repair service is disabled by default (
canton.features.enable-repair-commands = false). - Key export is disabled by default (
canton.parameters.enable-key-download = false). - The Docker images no longer set
canton.parameters.non-standard-config = trueby default.
- The participant repair service is disabled by default (
What’s New
Protocol version 37
Multi-synchronizer without feature flag
Starting with protocol version 37:- The
EnableMultiSynchronizerfeature flag is not needed to enable multi-synchronizer. - Any stakeholder can submit the assignment as soon as the unassignment is completed. The
assignment_exclusivityfield of unassigned events is not set, and the synchronizer parameterassignmentExclusivityTimeouthas no effect. - New participant configuration
canton.participants.<participant>.parameters.reassignments-config.enable-automatic-assignment(defaulttrue). When set totrue, the participant tries to complete the reassignments initiated by other participants by submitting their assignment, and upon reconnection to a synchronizer it tries to complete its pending reassignments. - New participant configuration
canton.participants.<participant>.parameters.reassignments-config.automatic-assignment-delay(default60s). The automatic assignment is submitted after a delay drawn between this value and twice this value, counted from the sequencing time of the unassignment on the local clock.
New collection size limits
Starting with protocol version 37, the following collections are bounded. Messages exceeding a limit are rejected.
The signing key limit applies to
OwnerToKeyMapping, PartyToKeyMapping, and the party signing keys in
PartyToParticipant.
Note that the default limits only apply when used through the console.
When using the API directly to bootstrap a synchronizer on PV37, the latest protobuf version (32) of the StaticSynchronizerParameters message must be used, which contains the new limit fields.
Values for those new limits must then be set explicitly.
During submission (i.e. phase 1), the engine emits the following limit metrics for transactions (with a limit label
for the currently configured threshold limit):
daml.participant.transaction-node.acting-partiesdaml.participant.transaction-node.choice-authorizersdaml.participant.transaction-node.choice-observersdaml.participant.transaction-node.external-call-result-sizedaml.participant.transaction-node.external-call-resultsdaml.participant.transaction-node.input-contract-countdaml.participant.transaction-node.key-maintainersdaml.participant.transaction-node.lf-valuedaml.participant.transaction-node.node-children-sizedaml.participant.transaction-node.node-countdaml.participant.transaction-node.root-node-countdaml.participant.transaction-node.signatoriesdaml.participant.transaction-node.stakeholdersdaml.participant.transaction-node.total-informees
daml.participant.sync.protocol-messages.transaction-view.sub-viewsdaml.participant.sync.protocol-messages.transaction-view.tree-depth
New v31 topology transactions: action may be required for decoders
Protocol version 37 adds v31 topology transactions (com.digitalasset.canton.protocol.v31.TopologyTransaction)
to enable Hybrid Party Replication (HyPR). In v31, the PartyToParticipant mapping gives each hosting
participant a hosting state (Nominated, Freezing, Onboarding, Active) instead of the onboarding flag. All other
mappings are unchanged. Synchronizers on protocol version 37 accept both v30 and v31 transactions, and a v30
entry counts as Onboarding if its onboarding flag is set, and as Active otherwise.
Do not use the Nominated and Freezing states until a future 3.7 release announces their support. A Freezing
entry blocks every transaction and reassignment that involves the party on that synchronizer (error
FROZEN_PARTIES) until the entry is removed.
Applications that create or decode PartyToParticipant transactions need to act, as described in the
migration guide for external signers
below.
Other changes:
- On protocol version 37, moving a hosting entry backward, e.g. from Active to Onboarding, is rejected. A
v30transaction may still set the onboarding flag of an Active entry if the current mapping isv30too. - Ledger API topology events:
ParticipantAuthorizationOnboardingwhen an entry becomes Onboarding,ParticipantAuthorizationAddedwhen it becomes Active, andParticipantAuthorizationRevokedwhen an Onboarding or Active entry is removed. - A node skips a
PartyToParticipantmapping with a Nominated or Freezing entry when it pushes its authorized store to a synchronizer on protocol version 36, which cannot express these states, and logs a warning. Propose such mappings in the synchronizer’s store.
Migration guide for external signers of PartyToParticipant transactions
For applications that create PartyToParticipant (PTP) topology transactions, or decode them to show them to a user
before signing. Protocol version 36 accepts only v30 PTP transactions. Protocol version 37 accepts v30 and
v31, and nodes create v31 unless asked for v30.
Decode v31
On protocol version 37, you can receive v31
- from
GenerateExternalPartyTopologyunless you requestv30, - from the topology admin API
GenerateTransactionsalways, - from changes that participants make themselves, and
- as stored proposals to co-sign.
- Decode the
dataof theUntypedVersionedMessageby itsversion: 30 asv30.TopologyTransaction, 31 asv31.TopologyTransaction, and reject others. Never decodev31with thev30schema: it parses, but drops the party signing keys and the hosting states. v31.PartyToParticipantreplaces theonboardingflag with a hostingstateper participant, and movesparty_signing_keysfrom field number 6 to 4. All other mappings are unchanged.- Show each participant’s hosting state: Nominated and Freezing participants do not host the party yet.
- Hashing and signing are unchanged.
ListPartyToParticipantreturnsv30items unless the client sends aclient_versionof 3.7 or later, as long as no entry is Nominated or Freezing.
Or keep using v30 for now
Protocol version 37 accepts v30 PTP transactions as a transition aid. Plan the move to v31.
- Request
v30with protocol version 36:protocol_versioninGenerateExternalPartyTopology(protocolVersionin the JSON Ledger API) and the topology admin APIAuthorize,protocolVersionin the console commandsparty_to_participant_mappings.proposeandpropose_delta, and--protocol-versionin the topology scripts.GenerateTransactionsalways returnsv31.AllocateExternalPartyaccepts both versions. - To co-sign, sign the transaction that you received. Do not rebuild it as
v30: av30and av31proposal of the same change never combine. - While a party has a Nominated or Freezing entry,
v30PTP transactions for it are rejected withTOPOLOGY_HOSTING_STATES_NOT_EXPRESSIBLE, asv30cannot express these states.
v31: an external party can be
replicated with HyPR only if its signer creates and decodes v31 PTP transactions.
Protocol version downgrades via LSU are forbidden
Logical synchronizer upgrades from a synchronizer running protocol version 37 or higher to a successor with a lower protocol version are now rejected. Both the topology manager and the topology processor reject suchLsuAnnouncement topology mappings with the error
TOPOLOGY_INVALID_SUCCESSOR_PHYSICAL_SYNCHRONIZER_ID.
For application developers
Synchronizer record time to offset conversion
A new Ledger API endpoint in theStateService converts a pair of synchronizer id and record time into a participant
offset, which makes requests across participants easier.
Synthetic synchronizer events, like repair related events, are put on the same record time as the last observed
synchronizer event at the time of their creation. Multiple participant offsets can therefore exist for a single record
time. The endpoint returns the first offset at the requested record time, or the last offset before it if there is no
offset at the requested record time. If updates at the requested record time were already partially pruned, the
request is rejected with RECORD_TIME_NOT_FOUND.
Traffic cost estimation for reassignments
WhenCostEstimationHints are passed to PrepareSubmission, the CostEstimation of the response now also contains
reassignment_costs: one ReassignmentCost per reassignment that the submission requires, with the source and target
synchronizer, the reassigned contract ids, and the estimated traffic cost of the unassignment and assignment requests
and responses. total_traffic_cost_estimation includes these costs. The JSON API exposes the same fields.
Source and target validation packages can be overridden
- The following console commands now take optional
overrideSourceValidationPackageIdsandoverrideTargetValidationPackageIdsarguments:submit_unassignsubmit_unassign_with_formatsubmit_reassignsubmit_unassign_async
- The
UnassignCommandJava binding also supports these additional fields.
Synchronizer operators
CantonBFT
- Improved configuration defaults for better ordering latency.
- Request pre-prepare via retransmissions if a weak quorum of prepares is reached without having the pre-prepare. This is an important performance improvement when there is high latency between some nodes and pre-prepares are often delayed or lost.
- Starting with PV37, state transfer responses can carry multiple commit certificates. This allows for more efficient catch-up and onboarding.
- Patience-based dissemination retries (
availability-dissemination-patience) are now disabled by default. When enabled, they also apply to batches that have reached the minimum dissemination threshold but have neither been disseminated to all nodes nor become part of a block proposal. - Observability:
- Logs of the dissemination stage of the ordering protocol have been improved for easier troubleshooting.
- Improved logging about oversized gRPC messages.
- Improved metrics about P2P connection status and ISS consensus segment leadership.
- P2P: TCP- and HTTP2-level metrics.
- Added metrics for the time ordered blocks wait before delivery while lower-numbered blocks are still pending.
- Added metrics for pre-prepares accepted coming from retransmissions.
- Fixed: the P2P connection direction was incorrectly reported in metrics and console/admin endpoints in some circumstances.
Initialization changes for sequencers and mediators
Rather than generating the onboarding topology transactions during node initialization and storing these in the authorized store, sequencers and mediators now skip this step and generate them when needed. This ensures these topology transactions are generated in the right protocol version (which is not known during initialization). See Breaking changes for the console command to use instead ofidentity_transactions().
File-based console commands for sequencer initialization and topology snapshots
Added new console commands that stream the state to or from a file, for states larger than 2 GB:node.topology.transactions.export_genesis_statenode.topology.transactions.export_topology_snapshot_to_filesequencer.setup.export_onboarding_state_for_sequencersequencer.setup.export_onboarding_state_at_timestampsequencer.setup.import_genesis_statesequencer.setup.import_onboarding_state
node.topology.transactions.import_topology_snapshot_fromV2 now supports files larger than 2 GB.
Traffic purchase for members that are not registered yet
Traffic can now be purchased for a participant that is not yet registered with the sequencer, which improves the onboarding process of participants. It requires protocol version 37 or higher. On earlier protocol versions, the sequencer rejects such a purchase withTRAFFIC_CONTROL_TOP_UP_SUBMISSION_FAILED, because the sequencer
snapshot format used there cannot represent a member that is still onboarding.
To support this, new v31 versions of SequencerSnapshot, SequencerPruningStatus, SequencerMemberStatus and
OnboardingStateForSequencerV2 have been added in com.digitalasset.canton.sequencer.admin.v31. Sequencer snapshots
and onboarding states use them from protocol version 37 onwards. Earlier protocol versions keep using the v30
messages and are not affected.
Participant node operators
Traffic enforcement app: pruning of submission correlations
Added the traffic enforcement admin endpointPrune (JSON POST /v2/traffic/prune, console command ledger_api.traffic.prune).
It prunes events and submission correlations, and reports the pruned event and correlation counts separately.
The timestamp must be at least the participant’s max deduplication duration (canton.participants.<participant>.init.ledger-api.max-deduplication-duration, default 7 days) in the past, otherwise the request fails with TRAFFIC_UNSAFE_TO_PRUNE.
WARNING: Prune only correlations of completed submissions. Pruning the correlation of an in-flight submission affects
its traffic accounting.
Traffic enforcement app: traffic top-ups from the ledger (experimental)
The traffic enforcement app can credit traffic top-ups fromTrafficPurchaser contracts on the ledger. Top-up
ingestion is enabled by setting the trusted paymaster parties, which must be hosted on the participant, in
canton.participants.<participant>.traffic-accounting.traffic-enforcement-server.projection.top-up-paymasters
(default empty, i.e. disabled). Ingestion starts at the participant’s pruning offset unless
projection.initial-top-up-offset-begin-exclusive is set. A top-up that cannot be credited is reported with the error
code TRAFFIC_TOP_UP_NOT_CREDITED, which carries the update_id and offset of the top-up.
All node operators
Key management operations are bound to a synchronizer
The following console commands now take an optionalsynchronizerId argument:
node.topology.owner_to_key_mappings.add_keynode.topology.owner_to_key_mappings.add_keysnode.topology.owner_to_key_mappings.remove_keynode.topology.owner_to_key_mappings.rotate_keynode.keys.secret.rotate_kms_node_keynode.keys.secret.rotate_node_keynode.keys.secret.rotate_node_keys
Breaking changes
Ledger API (application developers)
StateService excludes incomplete reassignments by default
Incomplete reassignments (IncompleteAssigned and IncompleteUnassigned events) are only relevant
to clients that work with contracts reassigned between multiple synchronizers. Most clients only
need the active contracts. Until now, the snapshot always included these events.
A flag includeIncompleteReassignments has been added to the GetActiveContractsRequest
and GetActiveContractsPageRequest of the StateService, and to the JSON API accordingly (see the OpenAPI
specification). If the flag is not set, the reassignments are excluded from the response stream. For example,
the following request for the active-contracts-page endpoint returns only the active contracts
and excludes any reassignments:
false, so reassignments are excluded from the response
stream. To restore the previous behavior, set includeIncompleteReassignments to true in the request. This affects
all early adopters of the multi-synchronizer alpha feature.
The GetActiveContracts stream continuation token and the GetActiveContractsPage page token formats
have changed to take the new flag into account, so tokens issued by previous Canton versions are rejected
with INVALID_CONTINUATION_TOKEN and INVALID_ACS_PAGE_TOKEN respectively.
GenerateExternalPartyTopology returns v31 topology transactions on protocol version 37
For a synchronizer on protocol version 37, the Ledger API GenerateExternalPartyTopology returns the topology
transactions to sign as v31 TopologyTransaction (com.digitalasset.canton.protocol.v31). Applications that
decode these transactions, for example to show them to the party before signing, must support v31, or set the
new protocol_version field of the request to 36 to get v30 transactions. See the
migration guide for external signers.
Repair commands represent contracts depending on their reassignment counter
ACS imports and the repairadd/purge commands used either Created/Archive events or
Assigned/Unassigned events for all contracts, depending on enable-all-ledger-api-reassignments.
Created/Archive events cannot carry a non-zero reassignment counter, so such contracts could not be
imported when the flag was set to false.
The meaning of the participant parameter
canton.participants.<participant>.parameters.enable-all-ledger-api-reassignments has changed:
true: unchanged, all contracts are represented as Assigned (import, add) or Unassigned (purge) events.false(default): contracts with a zero reassignment counter are represented as Created (import, add) or Archive (purge) events, contracts with a non-zero reassignment counter are represented as Assigned (import, add) or Unassigned (purge) events, preserving the reassignment counter. Previously, all contracts were represented as Created/Archive events and the import of contracts with a non-zero reassignment counter was rejected.
enable-all-ledger-api-reassignments. Ledger API consumers must be able to process Assigned and
Unassigned events for such contracts.
Submission ids of automatic reassignments
When a command requires automatic reassignments, the unassignments and assignments get their own submission ids, derived from the command’s submission id as<submissionId>-u<uuid> and <submissionId>-a<uuid>, instead of reusing
it. Such a command is rejected with the new error code INVALID_SUBMISSION_ID if its submission id is longer than
221 characters.
Synchronizer operators
Sequencer and mediator onboarding transactions
Sequencers and mediators no longer store their onboarding topology transactions in the authorized store during initialization. Instead of thenode.topology.transactions.identity_transactions() console command, use
node.topology.transactions.generate_onboarding_transactions(protocolVersion).
With an offline root key, pass a temporaryStore seeded with the signed root certificate and a namespace delegation
to an intermediate key on the node, or keep signing the transactions manually.
Participant node operators
The participant repair service requires enable-repair-commands
The participant serves the repair admin API (ParticipantRepairService) only if
canton.features.enable-repair-commands = true (default false), like the console repair commands. Set it on
participants whose repair endpoints are called through the admin API.
Topology: propose_delta no longer moves an Active participant back to Onboarding
The submitting node rejects setting the onboarding flag of an Active PartyToParticipant entry on every protocol
version, so propose_delta with requiresPartyToBeOnboarded no longer moves an Active participant back to
Onboarding. Set topology.disable-optional-topology-checks to submit it anyway.
All node operators
Key export requires enable-key-download
The admin API VaultService.ExportKeyPair, used by the console commands keys.secret.download and download_to, is
only served if canton.parameters.enable-key-download = true (default false). Otherwise, calls fail with
FAILED_PRECONDITION. The console commands still require
canton.features.enable-preview-commands = yes. Enable key download only while you export keys, not in production.
Docker images no longer set non-standard-config
The default canton.parameters.non-standard-config = true has been removed from the Docker images configuration, as
it is not required for the default configuration. Deployments that rely on non-standard configuration options must
set it explicitly.
Deprecations
- The traffic enforcement Ledger API endpoint
TrafficService.PruneEvents, the JSON endpointPOST /v2/traffic/events/pruneand the console commandledger_api.traffic.prune_eventsare deprecated. UseTrafficService.Prune(POST /v2/traffic/prune, consoleledger_api.traffic.prune) instead. They will be disabled by default in 3.8 and removed in 3.9. Settingcanton.participants.<participant>.features.deprecated.enable-deprecated-endpoints-37 = false(defaulttrue) disables them earlier, and calls then fail withDEPRECATED_API_DISABLED. - The sequencer configuration
canton.sequencers.<sequencer>.parameters.produce-post-ordering-topology-ticksis deprecated and ignored with a warning: post-ordering topology ticks are always produced.
Minor Improvements
Ledger API
- Manual pruning over the Ledger API is iterative, like scheduled pruning, with the maximum offset range of one
iteration set by
canton.participants.<participant>.parameters.batching.max-pruning-batch-size. Contract pruning is iterative as well, with at mostcanton.participants.<participant>.ledger-api.index-service.contract-pruning-batch-sizecontracts per iteration (default 10000). - Improved the performance of Ledger API pruning. The query plan change behind it can be turned off with
canton.participants.<participant>.ledger-api.index-service.disable-merge-and-hash-joins = false(defaulttrue). - Improved the performance of Ledger API update and active contract streams, and of the paged updates endpoint
(
GetUpdatesPage). - Improved the performance of Ledger API party queries, and party listings now reflect changes to the hosting of multi-hosted parties faithfully.
- Unassignments and assignments are rejected with
ContractSerializationVersionNotSupportedif a contract requires a higher LF serialization version than the target synchronizer’s protocol version supports. - Increased the log level of Ledger API indexer initialization and termination errors to WARN, except known transient failures that stay on INFO.
- Fixed an internal error when calling
JoseService.GetJwksfor Ed25519 keys. - When the last locally hosted stakeholder of an unassigned contract is offboarded from the participant, the
reassignment no longer counts as incomplete from that offset on, so the
StateServicewithincludeIncompleteReassignmentsand the check for stuck assignments no longer report it.
Synchronizer operators
- Sequencer acknowledgements are now rejected synchronously whenever the sequencer cannot accept them.
- The sequencer reports malformed submission requests with the new error codes
SEQUENCER_SUBMISSION_REQUEST_MALFORMED_REJECTEDon protocol version 37 andSEQUENCER_SUBMISSION_REQUEST_MALFORMEDon protocol version 36. The alarm codesINVALID_ENVELOPE_SIGNATUREandMULTIPLE_MEDIATOR_RECIPIENTShave been removed: update alerts that match on them.
Participant node operators
- The participant status report now tracks the health components of all connected synchronizers instead of only the
last connected one. Each per-synchronizer component status carries the physical synchronizer id in a new
labelsfield (synchronizerkey) ofComponentStatusin the health admin API, and theComponents:section ofparticipant.health.statusrenders node-level components as before, followed by aSynchronizers:section with the component states per connected synchronizer. The status can also be restricted to a single synchronizer viaparticipant.health.status(synchronizerId)(accepting a logical or physical synchronizer id), backed by a new optionalsynchronizer_idfield onParticipantStatusRequest. - Participants validate synchronizer connections (connect, register, modify, migrate) through a temporary sequencer
connection pool. All validation modes except
DISABLEDnow behave likeTHRESHOLD_ACTIVE, soAllandActiveno longer require every configured sequencer to be reachable. Validation failures are reported asFailedToConnectToSequencersorSynchronizerIsNotAvailable. - New participant reassignment metrics:
daml.participant.sync.reassignments.submitted,daml.participant.sync.reassignments.requests,daml.participant.sync.reassignments.finalized,daml.participant.sync.reassignments.batch-sizeanddaml.participant.sync.reassignments.unassignment.local-target-timestamp-lag. repair.purgerejects contracts that are reassigned away from the synchronizer, or skips them whenignoreAlreadyPurgedis set.- To maintain ledger consistency when importing repair events, repair events are now rejected if the last persisted event was a topology event. If this happens, reconnect to the synchronizer to move the record time. If you cannot reconnect, use the
forceRepairWhenTopologyTransactionAtLedgerEndflag. Using the force flag can corrupt the data in the system. - Participants reconnect to a synchronizer faster. On reconnect, the participant looks up its latest request before a given time. This lookup could scan the whole request journal and now uses its index.
All node operators
- New cache configuration
canton.<node>.parameters.caching.transparency-check-cache(defaultmaximum-size = 10000,expire-after-timeout = 5m) for the results of transparency checks, used if the static synchronizer parameterenable_transparency_checksis set. It previously shared the session key receiver cache configuration. - Topology:
- When a topology transaction submission loses the race against a concurrent topology transaction submission for the same serial, a
TOPOLOGY_SERIAL_MISMATCHis reported instead of a semantic error related to the content of the transaction. - The submitting node now logs an INFO when a topology transaction sent through the queue-based or store-based topology outbox is sequenced but rejected during topology validation.
- The topology and offline root key scripts can build topology transactions of proto version
v31, used from protocol version 37. They take the protocol version of the synchronizer:--protocol-versionforprepare-cert.sh,interactive_submission.py,interactive_topology_example.pyandinteractive_topology_example.sh, an optional last argument for the functions oftopology_util.sh, and the keyword argumentprotocol_versionfor the Python helpers.- The protocol version defaults to 36, i.e. to
v30topology transactions as in earlier releases. Synchronizers on protocol versions 36 and 37 accept them. - Pass 37 to build
v31topology transactions for a synchronizer on protocol version 37. Such synchronizers acceptv30only to ease the transition, so switch to 37 once your synchronizers run protocol version 37. prepare-cert.sh: keep 36 while the node connects to any synchronizer running protocol version 36, and switch to 37 once all of them run it. A node can’t convert a certificate signed with the offline root key, so a certificate of the wrong version must be prepared again.- An unsupported protocol version fails with an explanation of the choices.
- The protocol version defaults to 36, i.e. to
prepare-cert.shrejects--intermediate-delegationcombined with--root-delegationor--delegation-restrictions.
- When a topology transaction submission loses the race against a concurrent topology transaction submission for the same serial, a
- KMS:
- Added AWS KMS support for
Ed25519signing keys like GCP KMS. - Fixed creation of Ed25519 keys in GCP KMS to use only the software protection level, because they are not available with HSM protection level.
- Added AWS KMS support for
- Improved error reporting of various admin API endpoints in case of the server being shut down:
ABORTED_DUE_TO_SHUTDOWNis now reported in some cases instead of internal errors. - gRPC server handler logs now carry the request’s trace id when a client calls with an empty
TraceContext, for example the sequencer connection pool’sAuthenticate,SubscribeandDownloadTopologyStateForInit. The client interceptor uses a default trace id when the caller supplied none, instead of sending notraceparent. - Dependency updates to address security vulnerabilities: Bouncy Castle 1.86, gRPC 1.85, jackson 2.22.4, and OpenTelemetry and its instrumentation.
- The sequencer aggregator no longer fails on old messages delivered by a lagging sequencer.
- Fixed a regression where the Canton console printed party IDs, synchronizer IDs and other identifiers as raw case
classes (e.g.
PartyId(uid = UniqueIdentifier(...))) instead of their compact form. - The Docker images use da-base-image 1.0.18, whose JDK no longer trusts the eMudhra root CA. TLS certificates that chain to it are rejected.
Daml
- Fixed the transaction trace shown for unhandled exceptions: when the exception passed through a try-catch that did not handle it, the trace started at the choice enclosing the try-catch instead of the choice where the exception was thrown.
Compatibility
The following Canton protocol versions are supported:
Protocol versions 34 and 35 are no longer supported. Upgrade synchronizers on protocol version 34 or 35 to a
supported protocol version with a Canton 3.6 release before upgrading the nodes to this release.
Canton has been tested against the following versions of its dependencies: