Release of Canton 3.7.3
Canton 3.7.3 has been released on November 12, 2026.Summary
This is a maintenance release that fixes a resource leak on sequencer nodes and makes party replication safer. It also improves the experimental traffic top-ups through the ledger in the traffic enforcement app and the alpha Hybrid Party Replication (HyPR). Its breaking changes affect party replication and the monitoring of CantonBFT P2P connections.What’s New
Participant node operators
Traffic enforcement app: traffic top-ups through a Daml interface (experimental)
The traffic enforcement app (TEA) credits traffic top-ups that applications selling traffic (e.g. wallet providers) publish on the ledger through a new Daml interface. It replaces theTrafficPurchaser contracts of 3.7.0 to 3.7.2:
TEA no longer credits exercises of TrafficPurchaser_PurchaseCredits. Before upgrading, switch the applications that
sell traffic to templates implementing TrafficCreditReporter.
Traffic top-ups through the ledger remain experimental: the Daml interface and the configuration may still change
in a later release.
The new Daml package canton-api-traffic-credit-v1 defines the TrafficCreditReporter interface. Its
PublishCredit choice credits trafficAmount bytes to a TEA accountId and must be exercised with the authority
of the paymaster in the interface view. TEA only ingests credits whose paymaster is one of its configured
paymasters. The choice’s observers argument can notify additional parties of the credit without granting them
authority to publish credits. Implementing templates supply trafficCreditReporter_publishCreditImpl, which must
validate account ids and positive traffic amounts. Validation can evolve with the implementation without changing
the interface package. The DAR canton-api-traffic-credit-v1-1.0.0.dar is shipped in the dars directory of the
release bundle, so applications can depend on it.
Top-up ingestion is enabled in the new block
canton.participants.<participant>.traffic-accounting.traffic-enforcement-server.top-up:
type = disabled. paymasters must not be empty, and the parties must be hosted on the participant.
This block replaces the settings projection.top-up-paymasters and
projection.initial-top-up-offset-begin-exclusive of 3.7.0 to 3.7.2, which are removed. Move them to the new block
before upgrading, as the participant does not start with them. Once an ingestion offset has been persisted, it takes
precedence over initial-offset-begin-exclusive. Changing that setting does not reprocess transactions at or before
the persisted offset.
With Daml top-ups enabled, the participant uploads the canton-api-traffic-credit-v1 DAR before starting TEA and
vets it on every synchronizer it connects to, as long as
canton.participants.<participant>.parameters.admin-workflow.auto-load-dar is enabled (the default). This setting
also controls the other admin-workflow DARs. To manage these DARs manually, disable it and upload and vet the
traffic credit DAR and the other required admin-workflow DARs. If the traffic credit DAR is missing while automatic
loading is disabled, the participant logs a warning.
A PublishCredit exercise whose arguments or acting parties do not match what TEA expects is not credited and is
reported with the error code TRAFFIC_TOP_UP_NOT_CREDITED, which carries the update_id and offset of the credit.
Remote read of a party’s ACS (alpha)
These endpoints are part of Hybrid Party Replication (HyPR), which is in alpha. The new endpointPartyManagementService.GetRemoteAcs (console: parties.get_remote_acs) lets a participant that
is authorized to host a party read that party’s ACS from another participant through a sequencer channel. For now,
exactly one party must be given. The new endpoint PartyManagementService.GetPartyFreezingTime (console:
parties.get_party_freezing_time) returns the timestamp to pass as asOf to get_remote_acs.
Remote read is disabled by default. It requires the alpha-acs-replication-support configuration on the source and
target participants, and the alpha-sequencer-channel-support configuration on at least one sequencer node of the
synchronizer.
Party ACS import for a Freezing participant (alpha)
For HyPR,PartyManagementService.ImportPartyAcs (console: parties.import_party_acs) with a party_id also
accepts the import if the participant is Freezing for the party. The import then requires the contract import mode
Validation. Once connected to the synchronizer again, the participant moves its entry for the party from Freezing
to Onboarding, and then from Onboarding to Active once that is safe, as after an import for an Onboarding
participant.
Breaking changes
Participant node operators
Confirmation threshold check counts only confirming hosts
This change improves safety: it prevents a hosting change that leaves a party unable to confirm requests. A party-to-participant change is rejected withTOPOLOGY_CONFIRMING_THRESHOLD_CANNOT_BE_REACHED if it leaves fewer
hosts with Submission or Confirmation permission than the party’s confirmation threshold, unless the force flag
FORCE_FLAG_ALLOW_CONFIRMING_THRESHOLD_CANNOT_BE_MET is set. Since 3.4.4, the check also counted hosts with
Observation permission, which never confirm. For example, a host could downgrade itself to Observation without the
force flag, and every request that needed the party’s confirmation then timed out until the party lowered its
threshold.
To downgrade a host, lower the threshold first, or in the same change. A party without hosts with Submission or
Confirmation permission, and the removal of a party’s mapping, are not checked.
Party ACS import rejected after the party’s activation
This change improves safety: it prevents an ACS import that would leave the party with a wrong set of active contracts.PartyManagementService.ImportPartyAcs (console: parties.import_party_acs) with a party_id now rejects the
import with PARTY_ACS_IMPORT_AFTER_ACTIVATION once the target participant has processed events past the party’s
activation. This happens if the target participant stays connected while the party authorizes the hosting. Since
the activation, the target participant may have processed archivals or unassignments of contracts in the snapshot.
In earlier versions, the import then failed midway, or made archived contracts active again if their archivals had
been removed.
Disconnect the target participant before the party authorizes the hosting, as the offline party replication steps
require. If it has already processed the activation, restore it from a backup taken before the activation and
import again. The force flag IMPORT_PARTY_ACS_FORCE_FLAG_ALLOW_IMPORT_AFTER_ACTIVATION in the new field
force_flags (console: forceFlags = Set(ImportPartyAcsForceFlag.AllowImportAfterActivation)) skips the check. Set
it only if no contract in the snapshot has been archived or unassigned since the activation.
Synchronizer operators
CantonBFT: P2P endpoint metric label renamed
The labelendpoint is renamed to p2p-endpoint (p2p_endpoint in Prometheus) on the metrics
daml.sequencer.bftordering.p2p.endpoint-status and daml.sequencer.bftordering.security.noncompliant.behavior.
The metric names are unchanged. On Kubernetes, the label endpoint identifies the scrape endpoint of the metrics
collector, so the collector renamed the label of these metrics to exported_endpoint. The CantonBFT dashboards,
which use the label, did not work there. The new label keeps its name on every deployment.
Update dashboards and alerts that filter or group these metrics by endpoint or exported_endpoint. Until all
sequencer nodes are upgraded, the metrics carry the old label on nodes that run an earlier version.
Minor Improvements
- The
Request-Timeoutheader of JSON Ledger API requests now also accepts a time unit, for example15s. Values without a time unit are still interpreted as milliseconds.
Bug Fixes
- Sequencer node: fixed another resource leak that increased CPU and memory usage after a few days of running.
- Party replication: the party ACS import and the onboarding flag clearance now only consider the party’s own
party-to-participant mapping. They no longer read the mapping of another party of the same namespace, such as a
party whose identifier starts with the party’s identifier (e.g.
party-10forparty-1). In earlier versions, the target participant could clear the party’s onboarding flag before all requests in flight at the party’s onboarding were decided, leave the flag set, or clear the other party’s flag too early, and online party replication could check the wrong mapping. If the target knows no onboarding mapping of the imported party itself, the import now fails withPARTY_ACS_IMPORT_MISSING_ONBOARDING_MAPPING. - Offline party replication: the automatic onboarding flag clearance no longer stalls when the first time the
target participant observes is the safe time itself, or when its clearance is rejected because another change of
the party’s hosting took effect first (e.g. with two targets onboarding the party in parallel). In earlier
versions, the flag stayed set until a reconnect, a restart or a manual
clear_party_onboarding_flag. It also no longer logs warnings while it waits for an announced synchronizer upgrade or for its clearance to take effect. clear_party_onboarding_flagno longer leaves a pending onboarding clearance behind when called after the flag is cleared, as the documented polling does. In earlier versions, a later ACS import of the party (e.g. after offboarding it and onboarding it again) failed withINVALID_STATE_PARTY_MANAGEMENT_ERROR(ConflictingPendingOperationError), and each reconnect ran a needless clearance attempt. Records left behind by earlier versions are deleted on the next reconnect, or when the participant stops hosting the party.
Compatibility
The following Canton protocol versions are supported:
Canton has been tested against the following versions of its dependencies: