Skip to content

Commit 7005ee0

Browse files
Update 2023-08-15.23 (#107)
Reference commit: 6fb7b89ad6 Co-authored-by: Canton <canton@digitalasset.com>
1 parent e296d31 commit 7005ee0

File tree

118 files changed

+2232
-897
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+2232
-897
lines changed

community/app-base/src/main/scala/com/digitalasset/canton/console/ConsoleMacros.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ import com.digitalasset.canton.config.NonNegativeDuration
2828
import com.digitalasset.canton.config.RequireTypes.PositiveInt
2929
import com.digitalasset.canton.console.ConsoleEnvironment.Implicits.*
3030
import com.digitalasset.canton.logging.{LastErrorsAppender, NamedLoggerFactory, NamedLogging}
31-
import com.digitalasset.canton.participant.admin.{RepairService, SyncStateInspection}
31+
import com.digitalasset.canton.participant.admin.RepairService
32+
import com.digitalasset.canton.participant.admin.inspection.SyncStateInspection
3233
import com.digitalasset.canton.participant.config.{AuthServiceConfig, BaseParticipantConfig}
3334
import com.digitalasset.canton.participant.ledger.api.JwtTokenUtilities
3435
import com.digitalasset.canton.protocol.{LfContractId, SerializableContract}

community/app-base/src/main/scala/com/digitalasset/canton/console/commands/ParticipantAdministration.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ import com.digitalasset.canton.health.admin.data.ParticipantStatus
4444
import com.digitalasset.canton.logging.{NamedLoggerFactory, NamedLogging, TracedLogger}
4545
import com.digitalasset.canton.participant.ParticipantNode
4646
import com.digitalasset.canton.participant.admin.grpc.TransferSearchResult
47+
import com.digitalasset.canton.participant.admin.inspection.SyncStateInspection
4748
import com.digitalasset.canton.participant.admin.v0.PruningServiceGrpc
4849
import com.digitalasset.canton.participant.admin.v0.PruningServiceGrpc.PruningServiceStub
49-
import com.digitalasset.canton.participant.admin.{ResourceLimits, SyncStateInspection, v0}
50+
import com.digitalasset.canton.participant.admin.{ResourceLimits, v0}
5051
import com.digitalasset.canton.participant.domain.DomainConnectionConfig
5152
import com.digitalasset.canton.participant.sync.TimestampedEvent
5253
import com.digitalasset.canton.protocol.messages.{

community/app/src/pack/examples/06-messaging/contact/daml.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
sdk-version: 2.8.0-snapshot.20230807.12017.0.v7ba1e675
1+
sdk-version: 2.8.0-snapshot.20230811.12033.0.v2aad9b4e
22
sandbox-options:
33
- --wall-clock-time
44
name: contact

community/app/src/pack/examples/06-messaging/message/daml.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
sdk-version: 2.8.0-snapshot.20230807.12017.0.v7ba1e675
1+
sdk-version: 2.8.0-snapshot.20230811.12033.0.v2aad9b4e
22
sandbox-options:
33
- --wall-clock-time
44
name: message
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright (c) 2023 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
syntax = "proto3";
5+
6+
package com.digitalasset.canton.protocol.v0;
7+
8+
import "google/rpc/status.proto";
9+
import "scalapb/scalapb.proto";
10+
11+
/* DA's wrapper around `google.rpc.Status` for the proper versioning and code-gen
12+
*/
13+
message VersionedStatus {
14+
option (scalapb.message).companion_extends = "com.digitalasset.canton.version.StorageProtoVersion";
15+
16+
google.rpc.Status status = 1;
17+
}

community/base/src/main/protobuf/com/digitalasset/canton/protocol/v1/sequencing.proto

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import "com/digitalasset/canton/protocol/v0/sequencing.proto";
1010
import "google/protobuf/duration.proto";
1111
import "google/protobuf/timestamp.proto";
1212
import "google/protobuf/wrappers.proto";
13+
import "google/rpc/status.proto";
1314
import "scalapb/scalapb.proto";
1415

1516
message StaticDomainParameters {
@@ -72,7 +73,7 @@ message SequencedEvent {
7273
google.protobuf.StringValue message_id = 4; // Optional: Present for DeliverError, present for the sender of a Deliver.
7374
// Changed in v1 from v0.CompressedBatch to v1.CompressedBatch
7475
CompressedBatch batch = 5; // Optional: Present for Deliver, absent for DeliverError
75-
v0.DeliverErrorReason deliver_error_reason = 6; // Optional: Present for DeliverError, absent for other events
76+
google.rpc.Status deliver_error_reason = 6; // Optional: Present for DeliverError, absent for other events
7677
}
7778

7879
message SignedContent {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Copyright (c) 2023 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
syntax = "proto3";
5+
package google.rpc;
6+
7+
import "scalapb/scalapb.proto";
8+
9+
option (scalapb.options) = {
10+
scope: PACKAGE
11+
flat_package: false
12+
};

community/base/src/main/scala/com/digitalasset/canton/data/CommonMetadata.scala

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package com.digitalasset.canton.data
66
import cats.syntax.either.*
77
import com.digitalasset.canton.*
88
import com.digitalasset.canton.crypto.*
9+
import com.digitalasset.canton.data.CommonMetadata.singleMediatorError
910
import com.digitalasset.canton.logging.pretty.Pretty
1011
import com.digitalasset.canton.protocol.{v0, *}
1112
import com.digitalasset.canton.serialization.ProtoConverter.ParsingResult
@@ -49,8 +50,7 @@ final case class CommonMetadata private (
4950

5051
@transient override protected lazy val companionObj: CommonMetadata.type = CommonMetadata
5152

52-
private[CommonMetadata] def toProtoV0: v0.CommonMetadata = {
53-
require(isEquivalentTo(ProtocolVersion.v3))
53+
private def toProtoV0: v0.CommonMetadata = {
5454
mediator match {
5555
case MediatorRef.Single(mediatorId) =>
5656
v0.CommonMetadata(
@@ -61,15 +61,12 @@ final case class CommonMetadata private (
6161
mediatorId = mediatorId.toProtoPrimitive,
6262
)
6363
case _ =>
64-
throw new IllegalStateException(
65-
s"Only single mediator exist in for the representative protocol version $representativeProtocolVersion"
66-
)
64+
throw new IllegalStateException(singleMediatorError(representativeProtocolVersion))
6765
}
6866
}
6967

70-
private[CommonMetadata] def toProtoV1: v1.CommonMetadata = {
68+
private def toProtoV1: v1.CommonMetadata = {
7169
// TODO(#12373) Adapt when releasing BFT
72-
require(isEquivalentTo(ProtocolVersion.dev))
7370
v1.CommonMetadata(
7471
confirmationPolicy = confirmationPolicy.toProtoPrimitive,
7572
domainId = domainId.toProtoPrimitive,
@@ -99,20 +96,53 @@ object CommonMetadata
9996
),
10097
)
10198

102-
def apply(
103-
hashOps: HashOps
99+
private def singleMediatorError(
100+
rpv: RepresentativeProtocolVersion[CommonMetadata.type]
101+
): String = s"Only single mediator exist in for the representative protocol version $rpv"
102+
103+
private[data] def shouldHaveSingleMediator(
104+
rpv: RepresentativeProtocolVersion[CommonMetadata.type]
105+
): Boolean = rpv == protocolVersionRepresentativeFor(ProtocolVersion.v3)
106+
107+
def create(
108+
hashOps: HashOps,
109+
protocolVersion: ProtocolVersion,
104110
)(
105111
confirmationPolicy: ConfirmationPolicy,
106112
domain: DomainId,
107113
mediator: MediatorRef,
108114
salt: Salt,
109115
uuid: UUID,
110-
protocolVersion: ProtocolVersion,
111-
): CommonMetadata = CommonMetadata(confirmationPolicy, domain, mediator, salt, uuid)(
116+
): Either[String, CommonMetadata] = create(
112117
hashOps,
113118
protocolVersionRepresentativeFor(protocolVersion),
114-
None,
115-
)
119+
)(confirmationPolicy, domain, mediator, salt, uuid)
120+
121+
def create(
122+
hashOps: HashOps,
123+
protocolVersion: RepresentativeProtocolVersion[CommonMetadata.type],
124+
)(
125+
confirmationPolicy: ConfirmationPolicy,
126+
domain: DomainId,
127+
mediator: MediatorRef,
128+
salt: Salt,
129+
uuid: UUID,
130+
): Either[String, CommonMetadata] = {
131+
132+
mediator match {
133+
case MediatorRef.Group(_) if shouldHaveSingleMediator(protocolVersion) =>
134+
Left(singleMediatorError(protocolVersion))
135+
136+
case _ =>
137+
Right(
138+
CommonMetadata(confirmationPolicy, domain, mediator, salt, uuid)(
139+
hashOps,
140+
protocolVersion,
141+
None,
142+
)
143+
)
144+
}
145+
}
116146

117147
private def fromProtoV0(hashOps: HashOps, metaDataP: v0.CommonMetadata)(
118148
bytes: ByteString

community/base/src/main/scala/com/digitalasset/canton/error/CantonError.scala

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,14 @@ trait BaseCantonError extends BaseError {
7575
/** The error code, usually passed in as implicit where the error class is defined */
7676
def code: ErrorCode
7777

78+
def rpcStatusWithoutLoggingContext(): com.google.rpc.status.Status = rpcStatus()(NoLogging)
79+
7880
def rpcStatus(
7981
overrideCode: Option[Status.Code] = None
80-
)(implicit loggingContext: ErrorLoggingContext): com.google.rpc.status.Status = {
82+
)(implicit loggingContext: ContextualizedErrorLogger): com.google.rpc.status.Status = {
8183
import scala.jdk.CollectionConverters.*
8284
val status0: com.google.rpc.Status = code.asGrpcStatus(this)
85+
8386
val details: Seq[com.google.protobuf.Any] = status0.getDetailsList.asScala.toSeq
8487
val detailsScalapb = details.map(com.google.protobuf.any.Any.fromJavaProto)
8588

@@ -169,17 +172,24 @@ object BaseCantonError {
169172
)(implicit override val code: ErrorCode)
170173
extends BaseCantonError {}
171174

172-
def isStatusErrorCode(errorCode: ErrorCode, status: com.google.rpc.status.Status): Boolean = {
175+
def isStatusErrorCode(errorCode: ErrorCode, status: com.google.rpc.status.Status): Boolean =
176+
extractStatusErrorCodeMessage(errorCode, status).isDefined
177+
178+
def extractStatusErrorCodeMessage(
179+
errorCode: ErrorCode,
180+
status: com.google.rpc.status.Status,
181+
): Option[String] = {
173182
val code = errorCode.category.grpcCode.getOrElse(
174183
throw new IllegalArgumentException(s"Error code $errorCode does not have a gRPC code")
175184
)
176185
if (status.code == code.value()) {
177-
status.details.exists { any =>
178-
if (any.is(ErrorInfo.messageCompanion)) {
179-
Try(any.unpack(ErrorInfo.messageCompanion)).toOption.exists(_.reason == errorCode.id)
180-
} else false
186+
status.details.collectFirst {
187+
case any
188+
if (any.is(ErrorInfo) && Try(any.unpack(ErrorInfo))
189+
.fold(_ => false, _.reason == errorCode.id)) =>
190+
status.message
181191
}
182-
} else false
192+
} else None
183193
}
184194
}
185195

community/base/src/main/scala/com/digitalasset/canton/protocol/ConfirmationPolicy.scala

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -158,25 +158,7 @@ object ConfirmationPolicy {
158158
override def requiredTrustLevel: TrustLevel = TrustLevel.Ordinary
159159
}
160160

161-
case object Full extends ConfirmationPolicy {
162-
override val name = "Full"
163-
protected override val index: Int = 2
164-
165-
override def informeesAndThreshold(node: LfActionNode, topologySnapshot: TopologySnapshot)(
166-
implicit ec: ExecutionContext
167-
): Future[(Set[Informee], NonNegativeInt)] = {
168-
val informees = node.informeesOfNode
169-
require(
170-
informees.nonEmpty,
171-
"There must be at least one informee as every node must have at least one signatory.",
172-
)
173-
Future.successful(toInformeesAndThreshold(informees, Set.empty, TrustLevel.Ordinary))
174-
}
175-
176-
override def requiredTrustLevel: TrustLevel = TrustLevel.Ordinary
177-
}
178-
179-
val values: Seq[ConfirmationPolicy] = Seq[ConfirmationPolicy](Vip, Signatory, Full)
161+
val values: Seq[ConfirmationPolicy] = Seq[ConfirmationPolicy](Vip, Signatory)
180162

181163
require(
182164
values.zipWithIndex.forall { case (policy, index) => policy.index == index },
@@ -190,7 +172,6 @@ object ConfirmationPolicy {
190172
/** Chooses appropriate confirmation policies for a transaction.
191173
* It chooses [[Vip]] if every node has at least one VIP who knows the state
192174
* It chooses [[Signatory]] if every node has a Participant that can confirm.
193-
* It never chooses [[Full]].
194175
*/
195176
def choose(transaction: LfVersionedTransaction, topologySnapshot: TopologySnapshot)(implicit
196177
ec: ExecutionContext
@@ -235,7 +216,7 @@ object ConfirmationPolicy {
235216
DeterministicEncoding.decodeString(encodedName).flatMap {
236217
case (Vip.name, _) => Right(Vip)
237218
case (Signatory.name, _) => Right(Signatory)
238-
case (badName, badBytes) =>
219+
case (badName, _) =>
239220
Left(DefaultDeserializationError(s"Invalid confirmation policy $badName"))
240221
}
241222
}

0 commit comments

Comments
 (0)