mirror of
https://github.com/digital-asset/daml.git
synced 2024-09-20 09:17:43 +03:00
Removing treatment of local divulgence blinding info (#4424)
In a committed transaction (i.e. a transaction with only absolute contract ids), local divulgence is a non-concept. Therefore local divulgences don't need to be treated and all code related to it can be removed. This also removes some duplication between InMemoryLedger and SqlLedger. CHANGELOG_BEGIN CHANGELOG_END
This commit is contained in:
parent
8710673e71
commit
19ba231986
@ -50,7 +50,7 @@ class CommandExecutorImpl(engine: Engine, getPackage: PackageId => Future[Option
|
|||||||
.map { submission =>
|
.map { submission =>
|
||||||
(for {
|
(for {
|
||||||
updateTx <- submission
|
updateTx <- submission
|
||||||
blindingInfo <- Blinding
|
_ <- Blinding
|
||||||
.checkAuthorizationAndBlind(updateTx, Set(submitter))
|
.checkAuthorizationAndBlind(updateTx, Set(submitter))
|
||||||
} yield
|
} yield
|
||||||
(
|
(
|
||||||
|
@ -283,11 +283,8 @@ class JdbcIndexer private[indexer] (
|
|||||||
EventIdFormatter.fromTransactionId(transactionId, nodeId) -> parties
|
EventIdFormatter.fromTransactionId(transactionId, nodeId) -> parties
|
||||||
}
|
}
|
||||||
|
|
||||||
val mappedLocalDivulgence = blindingInfo.localDivulgence.map {
|
// local blinding info only contains values on transactions with relative contractIds.
|
||||||
case (nodeId, parties) =>
|
// this does not happen here (see type of transaction: GenTransaction.WithTxValue[NodeId, Value.AbsoluteContractId])
|
||||||
EventIdFormatter.fromTransactionId(transactionId, nodeId) -> parties
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(blindingInfo.localDivulgence.isEmpty)
|
assert(blindingInfo.localDivulgence.isEmpty)
|
||||||
|
|
||||||
val pt = PersistenceEntry.Transaction(
|
val pt = PersistenceEntry.Transaction(
|
||||||
@ -300,11 +297,9 @@ class JdbcIndexer private[indexer] (
|
|||||||
transactionMeta.ledgerEffectiveTime.toInstant,
|
transactionMeta.ledgerEffectiveTime.toInstant,
|
||||||
recordTime.toInstant,
|
recordTime.toInstant,
|
||||||
transaction
|
transaction
|
||||||
.resolveRelCid(EventIdFormatter.makeAbs(transactionId))
|
|
||||||
.mapNodeId(EventIdFormatter.fromTransactionId(transactionId, _)),
|
.mapNodeId(EventIdFormatter.fromTransactionId(transactionId, _)),
|
||||||
mappedDisclosure
|
mappedDisclosure
|
||||||
),
|
),
|
||||||
mappedLocalDivulgence,
|
|
||||||
blindingInfo.globalDivulgence,
|
blindingInfo.globalDivulgence,
|
||||||
divulgedContracts.map(c => c.contractId -> c.contractInst)
|
divulgedContracts.map(c => c.contractId -> c.contractInst)
|
||||||
)
|
)
|
||||||
|
@ -161,7 +161,6 @@ case class InMemoryActiveLedgerState(
|
|||||||
submitter: Option[Party],
|
submitter: Option[Party],
|
||||||
transaction: GenTransaction.WithTxValue[EventId, AbsoluteContractId],
|
transaction: GenTransaction.WithTxValue[EventId, AbsoluteContractId],
|
||||||
disclosure: Relation[EventId, Party],
|
disclosure: Relation[EventId, Party],
|
||||||
localDivulgence: Relation[EventId, Party],
|
|
||||||
globalDivulgence: Relation[AbsoluteContractId, Party],
|
globalDivulgence: Relation[AbsoluteContractId, Party],
|
||||||
referencedContracts: List[(Value.AbsoluteContractId, AbsoluteContractInst)]
|
referencedContracts: List[(Value.AbsoluteContractId, AbsoluteContractInst)]
|
||||||
): Either[Set[SequencingError], InMemoryActiveLedgerState] =
|
): Either[Set[SequencingError], InMemoryActiveLedgerState] =
|
||||||
@ -172,7 +171,6 @@ case class InMemoryActiveLedgerState(
|
|||||||
submitter,
|
submitter,
|
||||||
transaction,
|
transaction,
|
||||||
disclosure,
|
disclosure,
|
||||||
localDivulgence,
|
|
||||||
globalDivulgence,
|
globalDivulgence,
|
||||||
referencedContracts)
|
referencedContracts)
|
||||||
|
|
||||||
|
@ -7,8 +7,16 @@ import java.time.Instant
|
|||||||
|
|
||||||
import com.daml.ledger.participant.state.v1._
|
import com.daml.ledger.participant.state.v1._
|
||||||
import com.digitalasset.daml.lf.data.Ref.Party
|
import com.digitalasset.daml.lf.data.Ref.Party
|
||||||
|
import com.digitalasset.daml.lf.data.Relation.Relation
|
||||||
import com.digitalasset.daml.lf.data.Time.Timestamp
|
import com.digitalasset.daml.lf.data.Time.Timestamp
|
||||||
|
import com.digitalasset.daml.lf.engine.Blinding
|
||||||
|
import com.digitalasset.daml.lf.transaction.GenTransaction
|
||||||
|
import com.digitalasset.daml.lf.transaction.Transaction.NodeId
|
||||||
|
import com.digitalasset.daml.lf.value.Value
|
||||||
|
import com.digitalasset.daml.lf.value.Value.AbsoluteContractId
|
||||||
import com.digitalasset.daml_lf_dev.DamlLf.Archive
|
import com.digitalasset.daml_lf_dev.DamlLf.Archive
|
||||||
|
import com.digitalasset.ledger.EventId
|
||||||
|
import com.digitalasset.platform.events.EventIdFormatter
|
||||||
import com.digitalasset.platform.store.ReadOnlyLedger
|
import com.digitalasset.platform.store.ReadOnlyLedger
|
||||||
|
|
||||||
import scala.concurrent.Future
|
import scala.concurrent.Future
|
||||||
@ -46,3 +54,39 @@ trait Ledger extends ReadOnlyLedger {
|
|||||||
): Future[SubmissionResult]
|
): Future[SubmissionResult]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object Ledger {
|
||||||
|
|
||||||
|
type TransactionForIndex =
|
||||||
|
GenTransaction[EventId, AbsoluteContractId, Value.VersionedValue[AbsoluteContractId]]
|
||||||
|
type DisclosureForIndex = Map[EventId, Set[Party]]
|
||||||
|
type GlobalDivulgence = Relation[AbsoluteContractId, Party]
|
||||||
|
|
||||||
|
def convertToCommittedTransaction(transactionId: TransactionId, transaction: SubmittedTransaction)
|
||||||
|
: (TransactionForIndex, DisclosureForIndex, GlobalDivulgence) = {
|
||||||
|
|
||||||
|
// First we "commit" the transaction by converting all relative contractIds to absolute ones
|
||||||
|
val committedTransaction: GenTransaction.WithTxValue[NodeId, AbsoluteContractId] =
|
||||||
|
transaction.resolveRelCid(EventIdFormatter.makeAbs(transactionId))
|
||||||
|
|
||||||
|
// here we just need to align the type for blinding
|
||||||
|
val blindingInfo = Blinding.blind(committedTransaction)
|
||||||
|
|
||||||
|
// At this point there should be no local-divulgences
|
||||||
|
assert(
|
||||||
|
blindingInfo.localDivulgence.isEmpty,
|
||||||
|
s"Encountered non-empty local divulgence. This is a bug! [transactionId={$transactionId}, blindingInfo={${blindingInfo.localDivulgence}}"
|
||||||
|
)
|
||||||
|
|
||||||
|
// convert LF NodeId to Index EventId
|
||||||
|
val disclosureForIndex: Map[EventId, Set[Party]] = blindingInfo.disclosure.map {
|
||||||
|
case (nodeId, parties) =>
|
||||||
|
EventIdFormatter.fromTransactionId(transactionId, nodeId) -> parties
|
||||||
|
}
|
||||||
|
|
||||||
|
val transactionForIndex: TransactionForIndex =
|
||||||
|
committedTransaction.mapNodeId(EventIdFormatter.fromTransactionId(transactionId, _))
|
||||||
|
|
||||||
|
(transactionForIndex, disclosureForIndex, blindingInfo.globalDivulgence)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -246,7 +246,6 @@ object ScenarioLoader {
|
|||||||
Some(richTransaction.committer),
|
Some(richTransaction.committer),
|
||||||
tx,
|
tx,
|
||||||
mappedExplicitDisclosure,
|
mappedExplicitDisclosure,
|
||||||
mappedLocalImplicitDisclosure,
|
|
||||||
mappedGlobalImplicitDisclosure,
|
mappedGlobalImplicitDisclosure,
|
||||||
List.empty
|
List.empty
|
||||||
) match {
|
) match {
|
||||||
|
@ -18,7 +18,6 @@ import com.daml.ledger.participant.state.v1.{
|
|||||||
import com.digitalasset.api.util.TimeProvider
|
import com.digitalasset.api.util.TimeProvider
|
||||||
import com.digitalasset.daml.lf.data.Ref.{LedgerString, PackageId, Party}
|
import com.digitalasset.daml.lf.data.Ref.{LedgerString, PackageId, Party}
|
||||||
import com.digitalasset.daml.lf.data.{ImmArray, Time}
|
import com.digitalasset.daml.lf.data.{ImmArray, Time}
|
||||||
import com.digitalasset.daml.lf.engine.Blinding
|
|
||||||
import com.digitalasset.daml.lf.language.Ast
|
import com.digitalasset.daml.lf.language.Ast
|
||||||
import com.digitalasset.daml.lf.transaction.Node
|
import com.digitalasset.daml.lf.transaction.Node
|
||||||
import com.digitalasset.daml.lf.value.Value.AbsoluteContractId
|
import com.digitalasset.daml.lf.value.Value.AbsoluteContractId
|
||||||
@ -32,7 +31,6 @@ import com.digitalasset.ledger.api.domain.{
|
|||||||
TransactionId
|
TransactionId
|
||||||
}
|
}
|
||||||
import com.digitalasset.ledger.api.health.{HealthStatus, Healthy}
|
import com.digitalasset.ledger.api.health.{HealthStatus, Healthy}
|
||||||
import com.digitalasset.platform.events.EventIdFormatter
|
|
||||||
import com.digitalasset.platform.packages.InMemoryPackageStore
|
import com.digitalasset.platform.packages.InMemoryPackageStore
|
||||||
import com.digitalasset.platform.participant.util.EventFilter.TemplateAwareFilter
|
import com.digitalasset.platform.participant.util.EventFilter.TemplateAwareFilter
|
||||||
import com.digitalasset.platform.sandbox.stores.InMemoryActiveLedgerState
|
import com.digitalasset.platform.sandbox.stores.InMemoryActiveLedgerState
|
||||||
@ -156,7 +154,7 @@ class InMemoryLedger(
|
|||||||
)
|
)
|
||||||
|
|
||||||
private def handleSuccessfulTx(
|
private def handleSuccessfulTx(
|
||||||
trId: LedgerString,
|
transactionId: LedgerString,
|
||||||
submitterInfo: SubmitterInfo,
|
submitterInfo: SubmitterInfo,
|
||||||
transactionMeta: TransactionMeta,
|
transactionMeta: TransactionMeta,
|
||||||
transaction: SubmittedTransaction): Unit = {
|
transaction: SubmittedTransaction): Unit = {
|
||||||
@ -170,31 +168,18 @@ class InMemoryLedger(
|
|||||||
RejectionReason.TimedOut(
|
RejectionReason.TimedOut(
|
||||||
s"RecordTime $recordTime is after MaxiumRecordTime ${submitterInfo.maxRecordTime}"))
|
s"RecordTime $recordTime is after MaxiumRecordTime ${submitterInfo.maxRecordTime}"))
|
||||||
} else {
|
} else {
|
||||||
|
val (transactionForIndex, disclosureForIndex, globalDivulgence) =
|
||||||
val blindingInfo = Blinding.blind(transaction)
|
Ledger.convertToCommittedTransaction(transactionId, transaction)
|
||||||
val mappedDisclosure = blindingInfo.disclosure.map {
|
|
||||||
case (nodeId, v) => EventIdFormatter.fromTransactionId(trId, nodeId) -> v
|
|
||||||
}
|
|
||||||
val mappedLocalDivulgence = blindingInfo.localDivulgence.map {
|
|
||||||
case (nodeId, v) => EventIdFormatter.fromTransactionId(trId, nodeId) -> v
|
|
||||||
}
|
|
||||||
val mappedGlobalDivulgence = blindingInfo.globalDivulgence
|
|
||||||
|
|
||||||
val mappedTx =
|
|
||||||
transaction
|
|
||||||
.resolveRelCid(EventIdFormatter.makeAbs(trId))
|
|
||||||
.mapNodeId(EventIdFormatter.fromTransactionId(trId, _))
|
|
||||||
// 5b. modify the ActiveContracts, while checking that we do not have double
|
// 5b. modify the ActiveContracts, while checking that we do not have double
|
||||||
// spends or timing issues
|
// spends or timing issues
|
||||||
val acsRes = acs.addTransaction(
|
val acsRes = acs.addTransaction(
|
||||||
transactionMeta.ledgerEffectiveTime.toInstant,
|
transactionMeta.ledgerEffectiveTime.toInstant,
|
||||||
trId,
|
transactionId,
|
||||||
transactionMeta.workflowId,
|
transactionMeta.workflowId,
|
||||||
Some(submitterInfo.submitter),
|
Some(submitterInfo.submitter),
|
||||||
mappedTx,
|
transactionForIndex,
|
||||||
mappedDisclosure,
|
disclosureForIndex,
|
||||||
mappedLocalDivulgence,
|
globalDivulgence,
|
||||||
mappedGlobalDivulgence,
|
|
||||||
List.empty
|
List.empty
|
||||||
)
|
)
|
||||||
acsRes match {
|
acsRes match {
|
||||||
@ -204,22 +189,17 @@ class InMemoryLedger(
|
|||||||
RejectionReason.Inconsistent(s"Reason: ${err.mkString("[", ", ", "]")}"))
|
RejectionReason.Inconsistent(s"Reason: ${err.mkString("[", ", ", "]")}"))
|
||||||
case Right(newAcs) =>
|
case Right(newAcs) =>
|
||||||
acs = newAcs
|
acs = newAcs
|
||||||
val recordBlinding =
|
|
||||||
blindingInfo.disclosure.map {
|
|
||||||
case (nid, parties) =>
|
|
||||||
(EventIdFormatter.fromTransactionId(trId, nid), parties)
|
|
||||||
}
|
|
||||||
val entry = LedgerEntry
|
val entry = LedgerEntry
|
||||||
.Transaction(
|
.Transaction(
|
||||||
Some(submitterInfo.commandId),
|
Some(submitterInfo.commandId),
|
||||||
trId,
|
transactionId,
|
||||||
Some(submitterInfo.applicationId),
|
Some(submitterInfo.applicationId),
|
||||||
Some(submitterInfo.submitter),
|
Some(submitterInfo.submitter),
|
||||||
transactionMeta.workflowId,
|
transactionMeta.workflowId,
|
||||||
transactionMeta.ledgerEffectiveTime.toInstant,
|
transactionMeta.ledgerEffectiveTime.toInstant,
|
||||||
recordTime,
|
recordTime,
|
||||||
mappedTx,
|
transactionForIndex,
|
||||||
recordBlinding
|
disclosureForIndex
|
||||||
)
|
)
|
||||||
entries.publish(InMemoryLedgerEntry(entry))
|
entries.publish(InMemoryLedgerEntry(entry))
|
||||||
()
|
()
|
||||||
|
@ -15,14 +15,11 @@ import com.daml.ledger.participant.state.v1._
|
|||||||
import com.digitalasset.api.util.TimeProvider
|
import com.digitalasset.api.util.TimeProvider
|
||||||
import com.digitalasset.daml.lf.data.Ref.Party
|
import com.digitalasset.daml.lf.data.Ref.Party
|
||||||
import com.digitalasset.daml.lf.data.{ImmArray, Ref, Time}
|
import com.digitalasset.daml.lf.data.{ImmArray, Ref, Time}
|
||||||
import com.digitalasset.daml.lf.engine.Blinding
|
|
||||||
import com.digitalasset.daml.lf.value.Value.{AbsoluteContractId, ContractId}
|
|
||||||
import com.digitalasset.daml_lf_dev.DamlLf.Archive
|
import com.digitalasset.daml_lf_dev.DamlLf.Archive
|
||||||
import com.digitalasset.dec.{DirectExecutionContext => DEC}
|
import com.digitalasset.dec.{DirectExecutionContext => DEC}
|
||||||
import com.digitalasset.ledger.api.domain.{LedgerId, PartyDetails, RejectionReason}
|
import com.digitalasset.ledger.api.domain.{LedgerId, PartyDetails, RejectionReason}
|
||||||
import com.digitalasset.ledger.api.health.HealthStatus
|
import com.digitalasset.ledger.api.health.HealthStatus
|
||||||
import com.digitalasset.logging.{ContextualizedLogger, LoggingContext}
|
import com.digitalasset.logging.{ContextualizedLogger, LoggingContext}
|
||||||
import com.digitalasset.platform.events.EventIdFormatter
|
|
||||||
import com.digitalasset.platform.packages.InMemoryPackageStore
|
import com.digitalasset.platform.packages.InMemoryPackageStore
|
||||||
import com.digitalasset.platform.sandbox.LedgerIdGenerator
|
import com.digitalasset.platform.sandbox.LedgerIdGenerator
|
||||||
import com.digitalasset.platform.sandbox.stores.InMemoryActiveLedgerState
|
import com.digitalasset.platform.sandbox.stores.InMemoryActiveLedgerState
|
||||||
@ -39,6 +36,7 @@ import com.digitalasset.platform.store.entries.{LedgerEntry, PackageLedgerEntry,
|
|||||||
import com.digitalasset.platform.store.{BaseLedger, DbType, FlywayMigrations, PersistenceEntry}
|
import com.digitalasset.platform.store.{BaseLedger, DbType, FlywayMigrations, PersistenceEntry}
|
||||||
import com.digitalasset.resources.ResourceOwner
|
import com.digitalasset.resources.ResourceOwner
|
||||||
import scalaz.syntax.tag._
|
import scalaz.syntax.tag._
|
||||||
|
import akka.stream.scaladsl.GraphDSL.Implicits._
|
||||||
|
|
||||||
import scala.collection.immutable
|
import scala.collection.immutable
|
||||||
import scala.collection.immutable.Queue
|
import scala.collection.immutable.Queue
|
||||||
@ -143,7 +141,6 @@ private final class SqlLedger(
|
|||||||
val mergedSources =
|
val mergedSources =
|
||||||
Source.fromGraph(GraphDSL.create(checkpointQueue, persistenceQueue)(_ -> _) {
|
Source.fromGraph(GraphDSL.create(checkpointQueue, persistenceQueue)(_ -> _) {
|
||||||
implicit b => (checkpointSource, persistenceSource) =>
|
implicit b => (checkpointSource, persistenceSource) =>
|
||||||
import akka.stream.scaladsl.GraphDSL.Implicits._
|
|
||||||
val merge = b.add(MergePreferred[Offsets => Future[Unit]](1))
|
val merge = b.add(MergePreferred[Offsets => Future[Unit]](1))
|
||||||
|
|
||||||
checkpointSource ~> merge.preferred
|
checkpointSource ~> merge.preferred
|
||||||
@ -208,24 +205,9 @@ private final class SqlLedger(
|
|||||||
transaction: SubmittedTransaction): Future[SubmissionResult] =
|
transaction: SubmittedTransaction): Future[SubmissionResult] =
|
||||||
enqueue { offsets =>
|
enqueue { offsets =>
|
||||||
val transactionId = Ref.LedgerString.fromLong(offsets.offset)
|
val transactionId = Ref.LedgerString.fromLong(offsets.offset)
|
||||||
val toAbsCoid: ContractId => AbsoluteContractId =
|
|
||||||
EventIdFormatter.makeAbsCoid(transactionId)
|
|
||||||
|
|
||||||
val mappedTx = transaction
|
val (transactionForIndex, disclosureForIndex, globalDivulgence) =
|
||||||
.resolveRelCid(EventIdFormatter.makeAbs(transactionId))
|
Ledger.convertToCommittedTransaction(transactionId, transaction)
|
||||||
.mapNodeId(EventIdFormatter.fromTransactionId(transactionId, _))
|
|
||||||
|
|
||||||
val blindingInfo = Blinding.blind(transaction)
|
|
||||||
|
|
||||||
val mappedDisclosure = blindingInfo.disclosure
|
|
||||||
.map {
|
|
||||||
case (nodeId, parties) =>
|
|
||||||
EventIdFormatter.fromTransactionId(transactionId, nodeId) -> parties
|
|
||||||
}
|
|
||||||
|
|
||||||
val mappedLocalDivulgence = blindingInfo.localDivulgence.map {
|
|
||||||
case (k, v) => EventIdFormatter.fromTransactionId(transactionId, k) -> v
|
|
||||||
}
|
|
||||||
|
|
||||||
val recordTime = timeProvider.getCurrentTime
|
val recordTime = timeProvider.getCurrentTime
|
||||||
val entry = if (recordTime.isAfter(submitterInfo.maxRecordTime.toInstant)) {
|
val entry = if (recordTime.isAfter(submitterInfo.maxRecordTime.toInstant)) {
|
||||||
@ -252,11 +234,10 @@ private final class SqlLedger(
|
|||||||
transactionMeta.workflowId,
|
transactionMeta.workflowId,
|
||||||
transactionMeta.ledgerEffectiveTime.toInstant,
|
transactionMeta.ledgerEffectiveTime.toInstant,
|
||||||
recordTime,
|
recordTime,
|
||||||
mappedTx,
|
transactionForIndex,
|
||||||
mappedDisclosure
|
disclosureForIndex
|
||||||
),
|
),
|
||||||
mappedLocalDivulgence,
|
globalDivulgence,
|
||||||
blindingInfo.globalDivulgence,
|
|
||||||
List.empty
|
List.empty
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,6 @@ class ActiveLedgerStateManager[ALS <: ActiveLedgerState[ALS]](initialState: => A
|
|||||||
submitter: Option[Party],
|
submitter: Option[Party],
|
||||||
transaction: GenTransaction.WithTxValue[EventId, AbsoluteContractId],
|
transaction: GenTransaction.WithTxValue[EventId, AbsoluteContractId],
|
||||||
disclosure: Relation[EventId, Party],
|
disclosure: Relation[EventId, Party],
|
||||||
localDivulgence: Relation[EventId, Party],
|
|
||||||
globalDivulgence: Relation[AbsoluteContractId, Party],
|
globalDivulgence: Relation[AbsoluteContractId, Party],
|
||||||
divulgedContracts: List[(Value.AbsoluteContractId, AbsoluteContractInst)])
|
divulgedContracts: List[(Value.AbsoluteContractId, AbsoluteContractInst)])
|
||||||
: Either[Set[SequencingError], ALS] = {
|
: Either[Set[SequencingError], ALS] = {
|
||||||
@ -133,12 +132,6 @@ class ActiveLedgerStateManager[ALS <: ActiveLedgerState[ALS]](initialState: => A
|
|||||||
.union(nc.stakeholders)
|
.union(nc.stakeholders)
|
||||||
.union(nc.key.map(_.maintainers).getOrElse(Set.empty))
|
.union(nc.key.map(_.maintainers).getOrElse(Set.empty))
|
||||||
val absCoid = EventIdFormatter.makeAbsCoid(transactionId)(nc.coid)
|
val absCoid = EventIdFormatter.makeAbsCoid(transactionId)(nc.coid)
|
||||||
val withoutStakeHolders = localDivulgence
|
|
||||||
.getOrElse(nodeId, Set.empty) diff nc.stakeholders
|
|
||||||
val withStakeHolders = localDivulgence
|
|
||||||
.getOrElse(nodeId, Set.empty)
|
|
||||||
|
|
||||||
assert(withoutStakeHolders == withStakeHolders)
|
|
||||||
|
|
||||||
val activeContract = ActiveContract(
|
val activeContract = ActiveContract(
|
||||||
id = absCoid,
|
id = absCoid,
|
||||||
@ -148,12 +141,9 @@ class ActiveLedgerStateManager[ALS <: ActiveLedgerState[ALS]](initialState: => A
|
|||||||
workflowId = workflowId,
|
workflowId = workflowId,
|
||||||
contract = nc.coinst.resolveRelCid(EventIdFormatter.makeAbs(transactionId)),
|
contract = nc.coinst.resolveRelCid(EventIdFormatter.makeAbs(transactionId)),
|
||||||
witnesses = disclosure(nodeId),
|
witnesses = disclosure(nodeId),
|
||||||
// we need to `getOrElse` here because the `Nid` might include absolute
|
// The divulgences field used to be filled with data coming from the `localDivulgence` field of the blinding info.
|
||||||
// contract ids, and those are never present in the local disclosure.
|
// But this field is always empty in transactions with only absolute contract ids.
|
||||||
divulgences = (localDivulgence
|
divulgences = Map.empty,
|
||||||
.getOrElse(nodeId, Set.empty) diff nc.stakeholders).toList
|
|
||||||
.map(p => p -> transactionId)
|
|
||||||
.toMap,
|
|
||||||
key =
|
key =
|
||||||
nc.key.map(_.assertNoCid(coid => s"Contract ID $coid found in contract key")),
|
nc.key.map(_.assertNoCid(coid => s"Contract ID $coid found in contract key")),
|
||||||
signatories = nc.signatories,
|
signatories = nc.signatories,
|
||||||
|
@ -7,7 +7,6 @@ import com.daml.ledger.participant.state.v1.AbsoluteContractInst
|
|||||||
import com.digitalasset.daml.lf.data.Ref.Party
|
import com.digitalasset.daml.lf.data.Ref.Party
|
||||||
import com.digitalasset.daml.lf.data.Relation.Relation
|
import com.digitalasset.daml.lf.data.Relation.Relation
|
||||||
import com.digitalasset.daml.lf.value.Value.AbsoluteContractId
|
import com.digitalasset.daml.lf.value.Value.AbsoluteContractId
|
||||||
import com.digitalasset.ledger.EventId
|
|
||||||
import com.digitalasset.platform.store.entries.LedgerEntry
|
import com.digitalasset.platform.store.entries.LedgerEntry
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -24,7 +23,6 @@ object PersistenceEntry {
|
|||||||
|
|
||||||
final case class Transaction(
|
final case class Transaction(
|
||||||
entry: LedgerEntry.Transaction,
|
entry: LedgerEntry.Transaction,
|
||||||
localDivulgence: Relation[EventId, Party],
|
|
||||||
globalDivulgence: Relation[AbsoluteContractId, Party],
|
globalDivulgence: Relation[AbsoluteContractId, Party],
|
||||||
divulgedContracts: List[(AbsoluteContractId, AbsoluteContractInst)]
|
divulgedContracts: List[(AbsoluteContractId, AbsoluteContractInst)]
|
||||||
) extends PersistenceEntry
|
) extends PersistenceEntry
|
||||||
|
@ -617,55 +617,12 @@ private class JdbcLedgerDao(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Part 3: insert divulgences into the 'contract_divulgences' table
|
// Part 3: formerly: insert divulgences into the 'contract_divulgences' table
|
||||||
val hasNonLocalDivulgence =
|
assert(
|
||||||
contracts.exists(c => c.divulgences.exists(d => d._2 != c.transactionId))
|
contracts.forall(_.divulgences.isEmpty),
|
||||||
if (hasNonLocalDivulgence) {
|
"Encountered non-empty local divulgence. This is a bug!")
|
||||||
// There is at least one contract that was divulged to some party after it was commited.
|
// when storing contracts, the `divulgences` field is only used to store local divulgences.
|
||||||
// This happens when writing contracts produced by the scenario loader.
|
// since local divulgences in a committed transaction are non-existent, there is nothing to do here.
|
||||||
// Since we only have the transaction IDs when the contract was divulged, we need to look up the corresponding
|
|
||||||
// ledger offsets.
|
|
||||||
val namedDivulgenceParams = contracts
|
|
||||||
.flatMap(
|
|
||||||
c =>
|
|
||||||
c.divulgences.map(
|
|
||||||
w =>
|
|
||||||
Seq[NamedParameter](
|
|
||||||
"contract_id" -> c.id.coid,
|
|
||||||
"party" -> w._1,
|
|
||||||
"transaction_id" -> w._2
|
|
||||||
))
|
|
||||||
)
|
|
||||||
.toArray
|
|
||||||
|
|
||||||
if (!namedDivulgenceParams.isEmpty) {
|
|
||||||
executeBatchSql(
|
|
||||||
queries.SQL_BATCH_INSERT_DIVULGENCES_FROM_TRANSACTION_ID,
|
|
||||||
namedDivulgenceParams
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
val namedDivulgenceParams = contracts
|
|
||||||
.flatMap(
|
|
||||||
c =>
|
|
||||||
c.divulgences.map(
|
|
||||||
w =>
|
|
||||||
Seq[NamedParameter](
|
|
||||||
"contract_id" -> c.id.coid,
|
|
||||||
"party" -> w._1,
|
|
||||||
"ledger_offset" -> offset,
|
|
||||||
"transaction_id" -> c.transactionId
|
|
||||||
))
|
|
||||||
)
|
|
||||||
.toArray
|
|
||||||
|
|
||||||
if (!namedDivulgenceParams.isEmpty) {
|
|
||||||
executeBatchSql(
|
|
||||||
queries.SQL_BATCH_INSERT_DIVULGENCES,
|
|
||||||
namedDivulgenceParams
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Part 4: insert key maintainers into the 'contract_key_maintainers' table
|
// Part 4: insert key maintainers into the 'contract_key_maintainers' table
|
||||||
val namedKeyMaintainerParams = contracts
|
val namedKeyMaintainerParams = contracts
|
||||||
@ -763,7 +720,6 @@ private class JdbcLedgerDao(
|
|||||||
offset: Long,
|
offset: Long,
|
||||||
submitter: Option[Party],
|
submitter: Option[Party],
|
||||||
tx: Transaction,
|
tx: Transaction,
|
||||||
localDivulgence: Relation[EventId, Party],
|
|
||||||
globalDivulgence: Relation[AbsoluteContractId, Party],
|
globalDivulgence: Relation[AbsoluteContractId, Party],
|
||||||
divulgedContracts: List[(Value.AbsoluteContractId, AbsoluteContractInst)])(
|
divulgedContracts: List[(Value.AbsoluteContractId, AbsoluteContractInst)])(
|
||||||
implicit connection: Connection): Option[RejectionReason] = tx match {
|
implicit connection: Connection): Option[RejectionReason] = tx match {
|
||||||
@ -850,7 +806,6 @@ private class JdbcLedgerDao(
|
|||||||
submitter,
|
submitter,
|
||||||
transaction,
|
transaction,
|
||||||
disclosure,
|
disclosure,
|
||||||
localDivulgence,
|
|
||||||
globalDivulgence,
|
globalDivulgence,
|
||||||
divulgedContracts
|
divulgedContracts
|
||||||
)
|
)
|
||||||
@ -952,11 +907,7 @@ private class JdbcLedgerDao(
|
|||||||
|
|
||||||
def insertEntry(le: PersistenceEntry)(implicit conn: Connection): PersistenceResponse =
|
def insertEntry(le: PersistenceEntry)(implicit conn: Connection): PersistenceResponse =
|
||||||
le match {
|
le match {
|
||||||
case PersistenceEntry.Transaction(
|
case PersistenceEntry.Transaction(tx, globalDivulgence, divulgedContracts) =>
|
||||||
tx,
|
|
||||||
localDivulgence,
|
|
||||||
globalDivulgence,
|
|
||||||
divulgedContracts) =>
|
|
||||||
Try {
|
Try {
|
||||||
storeTransaction(offset, tx, txBytes)
|
storeTransaction(offset, tx, txBytes)
|
||||||
|
|
||||||
@ -967,7 +918,6 @@ private class JdbcLedgerDao(
|
|||||||
offset,
|
offset,
|
||||||
tx.submittingParty,
|
tx.submittingParty,
|
||||||
tx,
|
tx,
|
||||||
localDivulgence,
|
|
||||||
globalDivulgence,
|
globalDivulgence,
|
||||||
divulgedContracts)
|
divulgedContracts)
|
||||||
.flatMap { rejectionReason =>
|
.flatMap { rejectionReason =>
|
||||||
|
@ -22,7 +22,7 @@ import com.digitalasset.daml.lf.value.Value
|
|||||||
import com.digitalasset.daml.lf.value.Value.{AbsoluteContractId, ContractId}
|
import com.digitalasset.daml.lf.value.Value.{AbsoluteContractId, ContractId}
|
||||||
import com.digitalasset.ledger.api.domain.RejectionReason
|
import com.digitalasset.ledger.api.domain.RejectionReason
|
||||||
import com.digitalasset.ledger.api.domain.RejectionReason._
|
import com.digitalasset.ledger.api.domain.RejectionReason._
|
||||||
import com.digitalasset.ledger.{ApplicationId, CommandId, EventId, WorkflowId}
|
import com.digitalasset.ledger.{ApplicationId, CommandId, WorkflowId}
|
||||||
import com.digitalasset.platform.events.EventIdFormatter
|
import com.digitalasset.platform.events.EventIdFormatter
|
||||||
import com.digitalasset.platform.store.Contract.ActiveContract
|
import com.digitalasset.platform.store.Contract.ActiveContract
|
||||||
import com.digitalasset.platform.store.Conversions._
|
import com.digitalasset.platform.store.Conversions._
|
||||||
@ -325,7 +325,6 @@ class V2_1__Rebuild_Acs extends BaseJavaMigration {
|
|||||||
private def updateActiveContractSet(
|
private def updateActiveContractSet(
|
||||||
offset: Long,
|
offset: Long,
|
||||||
tx: LedgerEntry.Transaction,
|
tx: LedgerEntry.Transaction,
|
||||||
localDivulgence: Relation[EventId, Party],
|
|
||||||
globalDivulgence: Relation[AbsoluteContractId, Party])(
|
globalDivulgence: Relation[AbsoluteContractId, Party])(
|
||||||
implicit connection: Connection): Unit = tx match {
|
implicit connection: Connection): Unit = tx match {
|
||||||
case LedgerEntry.Transaction(
|
case LedgerEntry.Transaction(
|
||||||
@ -404,7 +403,6 @@ class V2_1__Rebuild_Acs extends BaseJavaMigration {
|
|||||||
tx.submittingParty,
|
tx.submittingParty,
|
||||||
transaction,
|
transaction,
|
||||||
mappedDisclosure,
|
mappedDisclosure,
|
||||||
localDivulgence,
|
|
||||||
globalDivulgence,
|
globalDivulgence,
|
||||||
List.empty
|
List.empty
|
||||||
)
|
)
|
||||||
@ -704,15 +702,8 @@ class V2_1__Rebuild_Acs extends BaseJavaMigration {
|
|||||||
.mapNodeId(EventIdFormatter.split(_).get.nodeId)
|
.mapNodeId(EventIdFormatter.split(_).get.nodeId)
|
||||||
|
|
||||||
val blindingInfo = Blinding.blind(unmappedTx)
|
val blindingInfo = Blinding.blind(unmappedTx)
|
||||||
val mappedLocalDivulgence = blindingInfo.localDivulgence.map {
|
|
||||||
case (k, v) => EventIdFormatter.fromTransactionId(tx.transactionId, k) -> v
|
|
||||||
}
|
|
||||||
|
|
||||||
updateActiveContractSet(
|
updateActiveContractSet(offset, tx, blindingInfo.globalDivulgence)
|
||||||
offset,
|
|
||||||
tx,
|
|
||||||
mappedLocalDivulgence,
|
|
||||||
blindingInfo.globalDivulgence)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -193,7 +193,6 @@ class JdbcLedgerDaoSpec
|
|||||||
externalOffset,
|
externalOffset,
|
||||||
PersistenceEntry.Transaction(
|
PersistenceEntry.Transaction(
|
||||||
transaction,
|
transaction,
|
||||||
Map.empty,
|
|
||||||
Map(
|
Map(
|
||||||
absCid -> Set(
|
absCid -> Set(
|
||||||
Ref.Party.assertFromString("Alice"),
|
Ref.Party.assertFromString("Alice"),
|
||||||
@ -498,7 +497,7 @@ class JdbcLedgerDaoSpec
|
|||||||
offset,
|
offset,
|
||||||
offset + 1,
|
offset + 1,
|
||||||
None,
|
None,
|
||||||
PersistenceEntry.Transaction(transaction, Map.empty, Map.empty, List.empty))
|
PersistenceEntry.Transaction(transaction, Map.empty, List.empty))
|
||||||
entry <- ledgerDao.lookupLedgerEntry(offset)
|
entry <- ledgerDao.lookupLedgerEntry(offset)
|
||||||
endingOffset <- ledgerDao.lookupLedgerEnd()
|
endingOffset <- ledgerDao.lookupLedgerEnd()
|
||||||
} yield {
|
} yield {
|
||||||
@ -555,7 +554,7 @@ class JdbcLedgerDaoSpec
|
|||||||
offset,
|
offset,
|
||||||
offset + 1,
|
offset + 1,
|
||||||
None,
|
None,
|
||||||
PersistenceEntry.Transaction(transaction, Map.empty, Map.empty, List.empty))
|
PersistenceEntry.Transaction(transaction, Map.empty, List.empty))
|
||||||
entry <- ledgerDao.lookupLedgerEntry(offset)
|
entry <- ledgerDao.lookupLedgerEntry(offset)
|
||||||
endingOffset <- ledgerDao.lookupLedgerEnd()
|
endingOffset <- ledgerDao.lookupLedgerEnd()
|
||||||
} yield {
|
} yield {
|
||||||
@ -644,7 +643,7 @@ class JdbcLedgerDaoSpec
|
|||||||
offset,
|
offset,
|
||||||
offset + 1,
|
offset + 1,
|
||||||
None,
|
None,
|
||||||
PersistenceEntry.Transaction(t, Map.empty, Map.empty, List.empty))
|
PersistenceEntry.Transaction(t, Map.empty, List.empty))
|
||||||
.map(_ => ())
|
.map(_ => ())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -656,7 +655,7 @@ class JdbcLedgerDaoSpec
|
|||||||
offset,
|
offset,
|
||||||
offset + 1,
|
offset + 1,
|
||||||
None,
|
None,
|
||||||
PersistenceEntry.Transaction(t, Map.empty, Map.empty, List.empty))
|
PersistenceEntry.Transaction(t, Map.empty, List.empty))
|
||||||
.map(_ => ())
|
.map(_ => ())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -805,7 +804,6 @@ class JdbcLedgerDaoSpec
|
|||||||
Map((s"event$id": EventId) -> Set(party))
|
Map((s"event$id": EventId) -> Set(party))
|
||||||
),
|
),
|
||||||
Map.empty,
|
Map.empty,
|
||||||
Map.empty,
|
|
||||||
List.empty
|
List.empty
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -848,7 +846,6 @@ class JdbcLedgerDaoSpec
|
|||||||
Map((s"event$id": EventId) -> Set(party))
|
Map((s"event$id": EventId) -> Set(party))
|
||||||
),
|
),
|
||||||
Map.empty,
|
Map.empty,
|
||||||
Map.empty,
|
|
||||||
List.empty
|
List.empty
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -879,7 +876,6 @@ class JdbcLedgerDaoSpec
|
|||||||
Map((s"event$id": EventId) -> Set(party))
|
Map((s"event$id": EventId) -> Set(party))
|
||||||
),
|
),
|
||||||
Map.empty,
|
Map.empty,
|
||||||
Map.empty,
|
|
||||||
List.empty
|
List.empty
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -910,7 +906,6 @@ class JdbcLedgerDaoSpec
|
|||||||
Map((s"event$id": EventId) -> Set(party))
|
Map((s"event$id": EventId) -> Set(party))
|
||||||
),
|
),
|
||||||
Map.empty,
|
Map.empty,
|
||||||
Map.empty,
|
|
||||||
List.empty
|
List.empty
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user