Removed duplicate identity attribute (parties) from DealState. (#820)

All references to 'parties' now refer to the inherited 'participants' attribute from ContractState.

Samples: all duplicate references to `parties` now changed to `participants`.
This commit is contained in:
josecoll 2017-06-09 17:33:04 +01:00 committed by GitHub
parent 48bbcb8a57
commit b5a1cb5109
13 changed files with 23 additions and 49 deletions

View File

@ -275,21 +275,6 @@ interface DealState : LinearState {
/** Human readable well known reference (e.g. trade reference) */ /** Human readable well known reference (e.g. trade reference) */
val ref: String val ref: String
/**
* Exposes the Parties involved in a generic way.
*
* Appears to duplicate [participants] a property of [ContractState]. However [participants] only holds public keys.
* Currently we need to hard code Party objects into [ContractState]s. [Party] objects are a wrapper for public
* keys which also contain some identity information about the public key owner. You can keep track of individual
* parties by adding a property for each one to the state, or you can append parties to the [parties] list if you
* are implementing [DealState]. We need to do this as identity management in Corda is currently incomplete,
* therefore the only way to record identity information is in the [ContractState]s themselves. When identity
* management is completed, parties to a transaction will only record public keys in the [DealState] and through a
* separate process exchange certificates to ascertain identities. Thus decoupling identities from
* [ContractState]s.
* */
val parties: List<AbstractParty>
/** /**
* Generate a partial transaction representing an agreement (command) to this deal, allowing a general * Generate a partial transaction representing an agreement (command) to this deal, allowing a general
* deal/agreement flow to generate the necessary transaction for potential implementations. * deal/agreement flow to generate the necessary transaction for potential implementations.

View File

@ -366,7 +366,7 @@ inline fun <reified T : LinearState> VaultService.linearHeadsOfType() =
// TODO: Remove this from the interface // TODO: Remove this from the interface
// @Deprecated("This function will be removed in a future milestone", ReplaceWith("queryBy(LinearStateQueryCriteria(dealPartyName = listOf(<String>)))")) // @Deprecated("This function will be removed in a future milestone", ReplaceWith("queryBy(LinearStateQueryCriteria(dealPartyName = listOf(<String>)))"))
inline fun <reified T : DealState> VaultService.dealsWith(party: AbstractParty) = linearHeadsOfType<T>().values.filter { inline fun <reified T : DealState> VaultService.dealsWith(party: AbstractParty) = linearHeadsOfType<T>().values.filter {
it.state.data.parties.any { it == party } it.state.data.participants.any { it == party }
} }
class StatesNotAvailableException(override val message: String?, override val cause: Throwable? = null) : FlowException(message, cause) { class StatesNotAvailableException(override val message: String?, override val cause: Throwable? = null) : FlowException(message, cause) {

View File

@ -186,7 +186,7 @@ object TwoPartyDealFlow {
// And add a request for a time-window: it may be that none of the contracts need this! // And add a request for a time-window: it may be that none of the contracts need this!
// But it can't hurt to have one. // But it can't hurt to have one.
ptx.addTimeWindow(serviceHub.clock.instant(), 30.seconds) ptx.addTimeWindow(serviceHub.clock.instant(), 30.seconds)
return Pair(ptx, arrayListOf(deal.parties.single { it == serviceHub.myInfo.legalIdentity as AbstractParty }.owningKey)) return Pair(ptx, arrayListOf(deal.participants.single { it == serviceHub.myInfo.legalIdentity as AbstractParty }.owningKey))
} }
} }
} }

View File

@ -20,8 +20,7 @@ class DummyDealContract : Contract {
override val contract: Contract = DummyDealContract(), override val contract: Contract = DummyDealContract(),
override val participants: List<AbstractParty> = listOf(), override val participants: List<AbstractParty> = listOf(),
override val linearId: UniqueIdentifier = UniqueIdentifier(), override val linearId: UniqueIdentifier = UniqueIdentifier(),
override val ref: String, override val ref: String) : DealState {
override val parties: List<AnonymousParty> = listOf()) : DealState {
override fun isRelevant(ourKeys: Set<PublicKey>): Boolean { override fun isRelevant(ourKeys: Set<PublicKey>): Boolean {
return participants.any { it.owningKey.containsAny(ourKeys) } return participants.any { it.owningKey.containsAny(ourKeys) }
} }

View File

@ -667,15 +667,12 @@ class InterestRateSwap : Contract {
override val ref = common.tradeID override val ref = common.tradeID
override val participants: List<AbstractParty> override val participants: List<AbstractParty>
get() = parties get() = listOf(fixedLeg.fixedRatePayer, floatingLeg.floatingRatePayer)
override fun isRelevant(ourKeys: Set<PublicKey>): Boolean { override fun isRelevant(ourKeys: Set<PublicKey>): Boolean {
return fixedLeg.fixedRatePayer.owningKey.containsAny(ourKeys) || floatingLeg.floatingRatePayer.owningKey.containsAny(ourKeys) return fixedLeg.fixedRatePayer.owningKey.containsAny(ourKeys) || floatingLeg.floatingRatePayer.owningKey.containsAny(ourKeys)
} }
override val parties: List<AbstractParty>
get() = listOf(fixedLeg.fixedRatePayer, floatingLeg.floatingRatePayer)
override fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity? { override fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity? {
val nextFixingOf = nextFixingOf() ?: return null val nextFixingOf = nextFixingOf() ?: return null

View File

@ -50,7 +50,7 @@ object AutoOfferFlow {
require(serviceHub.networkMapCache.notaryNodes.isNotEmpty()) { "No notary nodes registered" } require(serviceHub.networkMapCache.notaryNodes.isNotEmpty()) { "No notary nodes registered" }
val notary = serviceHub.networkMapCache.notaryNodes.first().notaryIdentity val notary = serviceHub.networkMapCache.notaryNodes.first().notaryIdentity
// need to pick which ever party is not us // need to pick which ever party is not us
val otherParty = notUs(dealToBeOffered.parties).map { serviceHub.identityService.partyFromAnonymous(it) }.requireNoNulls().single() val otherParty = notUs(dealToBeOffered.participants).map { serviceHub.identityService.partyFromAnonymous(it) }.requireNoNulls().single()
progressTracker.currentStep = DEALING progressTracker.currentStep = DEALING
val myKey = serviceHub.legalIdentityKey val myKey = serviceHub.legalIdentityKey
val instigator = Instigator( val instigator = Instigator(

View File

@ -44,7 +44,7 @@ object FixingFlow {
// validate the party that initiated is the one on the deal and that the recipient corresponds with it. // validate the party that initiated is the one on the deal and that the recipient corresponds with it.
// TODO: this is in no way secure and will be replaced by general session initiation logic in the future // TODO: this is in no way secure and will be replaced by general session initiation logic in the future
// Also check we are one of the parties // Also check we are one of the parties
require(deal.parties.count { it.owningKey == serviceHub.myInfo.legalIdentity.owningKey } == 1) require(deal.participants.count { it.owningKey == serviceHub.myInfo.legalIdentity.owningKey } == 1)
return handshake return handshake
} }
@ -55,7 +55,7 @@ object FixingFlow {
val fixOf = deal.nextFixingOf()!! val fixOf = deal.nextFixingOf()!!
// TODO Do we need/want to substitute in new public keys for the Parties? // TODO Do we need/want to substitute in new public keys for the Parties?
val myOldParty = deal.parties.single { it.owningKey == serviceHub.myInfo.legalIdentity.owningKey } val myOldParty = deal.participants.single { it.owningKey == serviceHub.myInfo.legalIdentity.owningKey }
val newDeal = deal val newDeal = deal
@ -107,7 +107,7 @@ object FixingFlow {
} }
override val myKey: PublicKey get() { override val myKey: PublicKey get() {
dealToFix.state.data.parties.single { it.owningKey == serviceHub.myInfo.legalIdentity.owningKey } dealToFix.state.data.participants.single { it.owningKey == serviceHub.myInfo.legalIdentity.owningKey }
return serviceHub.legalIdentityKey return serviceHub.legalIdentityKey
} }
@ -148,7 +148,7 @@ object FixingFlow {
progressTracker.nextStep() progressTracker.nextStep()
val dealToFix = serviceHub.loadState(ref) val dealToFix = serviceHub.loadState(ref)
val fixableDeal = (dealToFix.data as FixableDealState) val fixableDeal = (dealToFix.data as FixableDealState)
val parties = fixableDeal.parties.sortedBy { it.owningKey.toBase58String() } val parties = fixableDeal.participants.sortedBy { it.owningKey.toBase58String() }
val myKey = serviceHub.myInfo.legalIdentity.owningKey val myKey = serviceHub.myInfo.legalIdentity.owningKey
if (parties[0].owningKey == myKey) { if (parties[0].owningKey == myKey) {
val fixing = FixingSession(ref, fixableDeal.oracleType) val fixing = FixingSession(ref, fixableDeal.oracleType)

View File

@ -42,7 +42,7 @@ class PortfolioApi(val rpc: CordaRPCOps) {
private inline fun <reified T : DealState> dealsWith(party: AbstractParty): List<StateAndRef<T>> { private inline fun <reified T : DealState> dealsWith(party: AbstractParty): List<StateAndRef<T>> {
val (vault, vaultUpdates) = rpc.vaultAndUpdates() val (vault, vaultUpdates) = rpc.vaultAndUpdates()
vaultUpdates.notUsed() vaultUpdates.notUsed()
return vault.filterStatesOfType<T>().filter { it.state.data.parties.any { it == party } } return vault.filterStatesOfType<T>().filter { it.state.data.participants.any { it == party } }
} }
/** /**

View File

@ -21,17 +21,14 @@ data class IRSState(val swap: SwapData,
override val contract: OGTrade, override val contract: OGTrade,
override val linearId: UniqueIdentifier = UniqueIdentifier(swap.id.first + swap.id.second)) : DealState { override val linearId: UniqueIdentifier = UniqueIdentifier(swap.id.first + swap.id.second)) : DealState {
override val ref: String = linearId.externalId!! // Same as the constructor for UniqueIdentified override val ref: String = linearId.externalId!! // Same as the constructor for UniqueIdentified
override val parties: List<AbstractParty> get() = listOf(buyer, seller) override val participants: List<AbstractParty> get() = listOf(buyer, seller)
override fun isRelevant(ourKeys: Set<PublicKey>): Boolean { override fun isRelevant(ourKeys: Set<PublicKey>): Boolean {
return parties.flatMap { it.owningKey.keys }.intersect(ourKeys).isNotEmpty() return participants.flatMap { it.owningKey.keys }.intersect(ourKeys).isNotEmpty()
} }
override fun generateAgreement(notary: Party): TransactionBuilder { override fun generateAgreement(notary: Party): TransactionBuilder {
val state = IRSState(swap, buyer, seller, OGTrade()) val state = IRSState(swap, buyer, seller, OGTrade())
return TransactionType.General.Builder(notary).withItems(state, Command(OGTrade.Commands.Agree(), parties.map { it.owningKey })) return TransactionType.General.Builder(notary).withItems(state, Command(OGTrade.Commands.Agree(), participants.map { it.owningKey }))
} }
override val participants: List<AbstractParty>
get() = parties
} }

View File

@ -45,8 +45,8 @@ data class OGTrade(override val legalContractReference: SecureHash = SecureHash.
require(inputs.size == 0) { "Inputs must be empty" } require(inputs.size == 0) { "Inputs must be empty" }
require(outputs.size == 1) { "" } require(outputs.size == 1) { "" }
require(outputs[0].buyer != outputs[0].seller) require(outputs[0].buyer != outputs[0].seller)
require(outputs[0].parties.containsAll(outputs[0].participants)) require(outputs[0].participants.containsAll(outputs[0].participants))
require(outputs[0].parties.containsAll(listOf(outputs[0].buyer, outputs[0].seller))) require(outputs[0].participants.containsAll(listOf(outputs[0].buyer, outputs[0].seller)))
require(outputs[0].swap.startDate.isBefore(outputs[0].swap.endDate)) require(outputs[0].swap.startDate.isBefore(outputs[0].swap.endDate))
require(outputs[0].swap.notional > BigDecimal(0)) require(outputs[0].swap.notional > BigDecimal(0))
require(outputs[0].swap.tradeDate.isBefore(outputs[0].swap.endDate)) require(outputs[0].swap.tradeDate.isBefore(outputs[0].swap.endDate))

View File

@ -27,12 +27,9 @@ data class PortfolioState(val portfolio: List<StateRef>,
@CordaSerializable @CordaSerializable
data class Update(val portfolio: List<StateRef>? = null, val valuation: PortfolioValuation? = null) data class Update(val portfolio: List<StateRef>? = null, val valuation: PortfolioValuation? = null)
override val parties: List<AbstractParty> get() = _parties.toList() override val participants: List<AbstractParty> get() = _parties.toList()
override val ref: String = linearId.toString() override val ref: String = linearId.toString()
val valuer: AbstractParty get() = parties[0] val valuer: AbstractParty get() = participants[0]
override val participants: List<AbstractParty>
get() = parties
override fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity { override fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity {
val flow = flowLogicRefFactory.create(SimmRevaluation.Initiator::class.java, thisStateRef, LocalDate.now()) val flow = flowLogicRefFactory.create(SimmRevaluation.Initiator::class.java, thisStateRef, LocalDate.now())
@ -40,11 +37,11 @@ data class PortfolioState(val portfolio: List<StateRef>,
} }
override fun isRelevant(ourKeys: Set<PublicKey>): Boolean { override fun isRelevant(ourKeys: Set<PublicKey>): Boolean {
return parties.flatMap { it.owningKey.keys }.intersect(ourKeys).isNotEmpty() return participants.flatMap { it.owningKey.keys }.intersect(ourKeys).isNotEmpty()
} }
override fun generateAgreement(notary: Party): TransactionBuilder { override fun generateAgreement(notary: Party): TransactionBuilder {
return TransactionType.General.Builder(notary).withItems(copy(), Command(PortfolioSwap.Commands.Agree(), parties.map { it.owningKey })) return TransactionType.General.Builder(notary).withItems(copy(), Command(PortfolioSwap.Commands.Agree(), participants.map { it.owningKey }))
} }
override fun generateRevision(notary: Party, oldState: StateAndRef<*>, updatedValue: Update): TransactionBuilder { override fun generateRevision(notary: Party, oldState: StateAndRef<*>, updatedValue: Update): TransactionBuilder {
@ -55,7 +52,7 @@ data class PortfolioState(val portfolio: List<StateRef>,
val tx = TransactionType.General.Builder(notary) val tx = TransactionType.General.Builder(notary)
tx.addInputState(oldState) tx.addInputState(oldState)
tx.addOutputState(copy(portfolio = portfolio, valuation = valuation)) tx.addOutputState(copy(portfolio = portfolio, valuation = valuation))
tx.addCommand(PortfolioSwap.Commands.Update(), parties.map { it.owningKey }) tx.addCommand(PortfolioSwap.Commands.Update(), participants.map { it.owningKey })
return tx return tx
} }
} }

View File

@ -70,8 +70,7 @@ data class PortfolioSwap(override val legalContractReference: SecureHash = Secur
requireThat { requireThat {
"there are no inputs" using (inputs.size == 0) "there are no inputs" using (inputs.size == 0)
"there is one output" using (outputs.size == 1) "there is one output" using (outputs.size == 1)
"valuer must be a party" using (outputs[0].parties.contains(outputs[0].valuer)) "valuer must be a party" using (outputs[0].participants.contains(outputs[0].valuer))
"all participants must be parties" using (outputs[0].parties.containsAll(outputs[0].participants))
} }
return setOf(command.value) return setOf(command.value)

View File

@ -22,8 +22,8 @@ object SimmRevaluation {
val stateAndRef = serviceHub.vaultService.linearHeadsOfType<PortfolioState>().values.first { it.ref == curStateRef } val stateAndRef = serviceHub.vaultService.linearHeadsOfType<PortfolioState>().values.first { it.ref == curStateRef }
val curState = stateAndRef.state.data val curState = stateAndRef.state.data
val myIdentity = serviceHub.myInfo.legalIdentity val myIdentity = serviceHub.myInfo.legalIdentity
if (myIdentity == curState.parties[0]) { if (myIdentity == curState.participants[0]) {
val otherParty = serviceHub.identityService.partyFromAnonymous(curState.parties[1]) val otherParty = serviceHub.identityService.partyFromAnonymous(curState.participants[1])
require(otherParty != null) { "Other party must be known by this node" } require(otherParty != null) { "Other party must be known by this node" }
subFlow(SimmFlow.Requester(otherParty!!, valuationDate, stateAndRef)) subFlow(SimmFlow.Requester(otherParty!!, valuationDate, stateAndRef))
} }