diff --git a/contracts/src/main/kotlin/contracts/CommercialPaper.kt b/contracts/src/main/kotlin/contracts/CommercialPaper.kt index af3b99d07f..4b16cb3b3a 100644 --- a/contracts/src/main/kotlin/contracts/CommercialPaper.kt +++ b/contracts/src/main/kotlin/contracts/CommercialPaper.kt @@ -76,7 +76,7 @@ class CommercialPaper : Contract { // Here, we match acceptable timestamp authorities by name. The list of acceptable TSAs (oracles) must be // hard coded into the contract because otherwise we could fail to gain consensus, if nodes disagree about // who or what is a trusted authority. - val timestamp: TimestampCommand? = tx.commands.getTimestampByName("Mock Company 0", "Bank A") + val timestamp: TimestampCommand? = tx.commands.getTimestampByName("Mock Company 0", "Timestamping Service", "Bank A") for (group in groups) { when (command.value) { diff --git a/contracts/src/main/kotlin/contracts/IRS.kt b/contracts/src/main/kotlin/contracts/IRS.kt index 6eea3daeda..f49bcc423a 100644 --- a/contracts/src/main/kotlin/contracts/IRS.kt +++ b/contracts/src/main/kotlin/contracts/IRS.kt @@ -393,7 +393,7 @@ class InterestRateSwap() : Contract { */ override fun verify(tx: TransactionForVerification) { val command = tx.commands.requireSingleCommand() - val time = tx.commands.getTimestampByName("Mock Company 0", "European Timestamping Service", "Bank A")?.midpoint + val time = tx.commands.getTimestampByName("Mock Company 0", "Timestamping Service", "Bank A")?.midpoint if (time == null) throw IllegalArgumentException("must be timestamped") val irs = tx.outStates.filterIsInstance().single() diff --git a/src/main/kotlin/core/node/services/NetworkMapCache.kt b/src/main/kotlin/core/node/services/NetworkMapCache.kt index aa10ce4e67..2fc1fc3bec 100644 --- a/src/main/kotlin/core/node/services/NetworkMapCache.kt +++ b/src/main/kotlin/core/node/services/NetworkMapCache.kt @@ -25,4 +25,3 @@ interface NetworkMapCache { fun nodeForPartyName(name: String): NodeInfo? = partyNodes.singleOrNull { it.identity.name == name } } - diff --git a/src/main/kotlin/core/testing/Simulation.kt b/src/main/kotlin/core/testing/Simulation.kt index 9fbe62f17f..4be4f0d52b 100644 --- a/src/main/kotlin/core/testing/Simulation.kt +++ b/src/main/kotlin/core/testing/Simulation.kt @@ -48,11 +48,7 @@ abstract class Simulation(val runAsync: Boolean, override val exportJMXto: String = "" override val nearestCity: String = city } - val node = SimulatedNode(dir, cfg, network, timestamperAddr) - // TODO: This is obviously bogus: there should be a single network map for the whole simulated network. - (node.services.networkMapCache as MockNetworkMapCache).ratesOracleNodes += ratesOracle.info - (node.services.networkMapCache as MockNetworkMapCache).regulators += regulators.map { it.info } - return node + return SimulatedNode(dir, cfg, network, timestamperAddr) } fun createAll(): List = bankLocations.map { network.createNode(timestamper.info, nodeFactory = this) as SimulatedNode } @@ -83,7 +79,6 @@ abstract class Simulation(val runAsync: Boolean, override fun makeInterestRatesOracleService() { super.makeInterestRatesOracleService() interestRatesService.upload(javaClass.getResourceAsStream("example.rates.txt")) - (services.networkMapCache as MockNetworkMapCache).ratesOracleNodes += info } } return n @@ -109,11 +104,20 @@ abstract class Simulation(val runAsync: Boolean, val network = MockNetwork(false) + val regulators: List = listOf(network.createNode(null, nodeFactory = RegulatorFactory) as SimulatedNode) val timestamper: SimulatedNode = network.createNode(null, nodeFactory = TimestampingNodeFactory) as SimulatedNode val ratesOracle: SimulatedNode = network.createNode(null, nodeFactory = RatesOracleFactory) as SimulatedNode val serviceProviders: List = listOf(timestamper, ratesOracle) val banks: List = bankFactory.createAll() - val regulators: List = listOf(network.createNode(null, nodeFactory = RegulatorFactory) as SimulatedNode) + + init { + // Now wire up the network maps for each node. + // TODO: This is obviously bogus: there should be a single network map for the whole simulated network. + for (node in regulators + serviceProviders + banks) { + (node.services.networkMapCache as MockNetworkMapCache).ratesOracleNodes += ratesOracle.info + (node.services.networkMapCache as MockNetworkMapCache).regulators += regulators.map { it.info } + } + } private val _allProtocolSteps = PublishSubject.create>() private val _doneSteps = PublishSubject.create>() diff --git a/src/main/kotlin/protocols/RatesFixProtocol.kt b/src/main/kotlin/protocols/RatesFixProtocol.kt index b19220e38b..270be3e80c 100644 --- a/src/main/kotlin/protocols/RatesFixProtocol.kt +++ b/src/main/kotlin/protocols/RatesFixProtocol.kt @@ -24,16 +24,17 @@ open class RatesFixProtocol(protected val tx: TransactionBuilder, private val oracle: NodeInfo, private val fixOf: FixOf, private val expectedRate: BigDecimal, - private val rateTolerance: BigDecimal) : ProtocolLogic() { + private val rateTolerance: BigDecimal, + override val progressTracker: ProgressTracker = RatesFixProtocol.tracker(fixOf.name)) : ProtocolLogic() { companion object { val TOPIC = "platform.rates.interest.fix" class QUERYING(val name: String) : ProgressTracker.Step("Querying oracle for $name interest rate") object WORKING : ProgressTracker.Step("Working with data returned by oracle") - object SIGNING : ProgressTracker.Step("Requesting transaction signature from interest rate oracle") - } + object SIGNING : ProgressTracker.Step("Requesting confirmation signature from interest rate oracle") - override val progressTracker = ProgressTracker(QUERYING(fixOf.name), WORKING, SIGNING) + fun tracker(fixName: String) = ProgressTracker(QUERYING(fixName), WORKING, SIGNING) + } class FixOutOfRange(val byAmount: BigDecimal) : Exception() diff --git a/src/main/kotlin/protocols/TwoPartyDealProtocol.kt b/src/main/kotlin/protocols/TwoPartyDealProtocol.kt index dfa826263f..79863aa8f6 100644 --- a/src/main/kotlin/protocols/TwoPartyDealProtocol.kt +++ b/src/main/kotlin/protocols/TwoPartyDealProtocol.kt @@ -59,8 +59,8 @@ object TwoPartyDealProtocol { override val progressTracker: ProgressTracker = Primary.tracker()) : ProtocolLogic() { companion object { - object AWAITING_PROPOSAL : ProgressTracker.Step("Awaiting transaction proposal from other") - object VERIFYING : ProgressTracker.Step("Verifying transaction proposal from other") + object AWAITING_PROPOSAL : ProgressTracker.Step("Handshaking and awaiting transaction proposal") + object VERIFYING : ProgressTracker.Step("Verifying proposed transaction") object SIGNING : ProgressTracker.Step("Signing transaction") object TIMESTAMPING : ProgressTracker.Step("Timestamping transaction") object SENDING_SIGS : ProgressTracker.Step("Sending transaction signatures to other party") @@ -158,7 +158,6 @@ object TwoPartyDealProtocol { @Suspendable private fun timestamp(partialTX: SignedTransaction): DigitalSignature.LegallyIdentifiable { - progressTracker.childrenFor[TIMESTAMPING] = TimestampingProtocol.tracker() progressTracker.currentStep = TIMESTAMPING return subProtocol(TimestampingProtocol(timestampingAuthority, partialTX.txBits, progressTracker.childrenFor[TIMESTAMPING]!!)) } @@ -333,7 +332,14 @@ object TwoPartyDealProtocol { timestampingAuthority: Party, val dealToFix: StateAndRef, sessionID: Long, - override val progressTracker: ProgressTracker = Secondary.tracker()) : Secondary(otherSide, timestampingAuthority, sessionID) { + val replacementProgressTracker: ProgressTracker? = null) : Secondary(otherSide, timestampingAuthority, sessionID) { + private val ratesFixTracker = RatesFixProtocol.tracker(dealToFix.state.nextFixingOf()!!.name) + + override val progressTracker: ProgressTracker = replacementProgressTracker ?: createTracker() + + fun createTracker(): ProgressTracker = Secondary.tracker().apply { + childrenFor[SIGNING] = ratesFixTracker + } @Suspendable override fun validateHandshake(handshake: Handshake): Handshake { @@ -369,7 +375,6 @@ object TwoPartyDealProtocol { val ptx = TransactionBuilder() val addFixing = object : RatesFixProtocol(ptx, serviceHub.networkMapCache.ratesOracleNodes[0], fixOf, BigDecimal.ZERO, BigDecimal.ONE) { - @Suspendable override fun beforeSigning(fix: Fix) { newDeal.generateFix(ptx, oldRef, fix) @@ -378,7 +383,6 @@ object TwoPartyDealProtocol { // to have one. ptx.setTime(serviceHub.clock.instant(), timestampingAuthority, 30.seconds) } - } subProtocol(addFixing)