From 1e023fcf54024ea1f9ac51748e6497a2ae3bd76a Mon Sep 17 00:00:00 2001 From: Katelyn Baker Date: Tue, 29 Aug 2017 15:20:43 +0100 Subject: [PATCH 001/120] Add alt serialise method that returns the schema and the bytes For future testing it would be nice, post serialisation, to have easy access to the serialised objects schema so we can check how it was serialised. Adding a helper function to return a data class that does this in the same way we can for deserialize --- .../serialization/amqp/SerializationOutput.kt | 48 +++++++++++-------- .../serialization/amqp/AMQPTestUtils.kt | 18 +++++++ .../amqp/DeserializeAndReturnEnvelopeTests.kt | 6 +-- .../amqp/SerializeAndReturnSchemaTest.kt | 34 +++++++++++++ 4 files changed, 83 insertions(+), 23 deletions(-) create mode 100644 node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt index 39b96b9679..e012db0b04 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt @@ -8,6 +8,7 @@ import java.nio.ByteBuffer import java.util.* import kotlin.collections.LinkedHashSet + /** * Main entry point for serializing an object to AMQP. * @@ -18,37 +19,46 @@ open class SerializationOutput(internal val serializerFactory: SerializerFactory // TODO: we're not supporting object refs yet private val objectHistory: MutableMap = IdentityHashMap() private val serializerHistory: MutableSet> = LinkedHashSet() - private val schemaHistory: MutableSet = LinkedHashSet() + internal val schemaHistory: MutableSet = LinkedHashSet() + /** * Serialize the given object to AMQP, wrapped in our [Envelope] wrapper which carries an AMQP 1.0 schema, and prefixed * with a header to indicate that this is serialized with AMQP and not [Kryo], and what version of the Corda implementation - * of AMQP serialization contructed the serialized form. + * of AMQP serialization constructed the serialized form. */ @Throws(NotSerializableException::class) fun serialize(obj: T): SerializedBytes { try { - val data = Data.Factory.create() - data.withDescribed(Envelope.DESCRIPTOR_OBJECT) { - withList { - // Our object - writeObject(obj, this) - // The schema - writeSchema(Schema(schemaHistory.toList()), this) - } - } - val bytes = ByteArray(data.encodedSize().toInt() + 8) - val buf = ByteBuffer.wrap(bytes) - buf.put(AmqpHeaderV1_0.bytes) - data.encode(buf) - return SerializedBytes(bytes) + return _serialize(obj) } finally { - objectHistory.clear() - serializerHistory.clear() - schemaHistory.clear() + andFinally() } } + internal fun andFinally() { + objectHistory.clear() + serializerHistory.clear() + schemaHistory.clear() + } + + internal fun _serialize(obj: T): SerializedBytes { + val data = Data.Factory.create() + data.withDescribed(Envelope.DESCRIPTOR_OBJECT) { + withList { + // Our object + writeObject(obj, this) + // The schema + writeSchema(Schema(schemaHistory.toList()), this) + } + } + val bytes = ByteArray(data.encodedSize().toInt() + 8) + val buf = ByteBuffer.wrap(bytes) + buf.put(AmqpHeaderV1_0.bytes) + data.encode(buf) + return SerializedBytes(bytes) + } + internal fun writeObject(obj: Any, data: Data) { writeObject(obj, data, obj.javaClass) } diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt index 5cc7bbc125..02a86cd6e2 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt @@ -1,8 +1,11 @@ package net.corda.nodeapi.internal.serialization.amqp +import net.corda.core.serialization.SerializedBytes import org.apache.qpid.proton.codec.Data import net.corda.nodeapi.internal.serialization.AllWhitelist import net.corda.nodeapi.internal.serialization.EmptyWhitelist +import java.io.NotSerializableException + fun testDefaultFactory() = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) fun testDefaultFactoryWithWhitelist() = SerializerFactory(EmptyWhitelist, ClassLoader.getSystemClassLoader()) @@ -17,3 +20,18 @@ class TestSerializationOutput( super.writeSchema(schema, data) } } + +fun testName(): String = Thread.currentThread().stackTrace[2].methodName + +data class BytesAndSchema(val obj: SerializedBytes, val schema: Schema) + +// Extension for the serialize routine that returns the scheme encoded into the +// bytes as well as the bytes for simple testing +@Throws(NotSerializableException::class) +fun SerializationOutput.serializeRtnSchema(obj: T): BytesAndSchema { + try { + return BytesAndSchema(_serialize(obj), Schema(schemaHistory.toList())) + } finally { + andFinally() + } +} diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeAndReturnEnvelopeTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeAndReturnEnvelopeTests.kt index db59a9c2c8..7b9c7a4e39 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeAndReturnEnvelopeTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeAndReturnEnvelopeTests.kt @@ -7,11 +7,9 @@ import kotlin.test.assertNotEquals import kotlin.test.assertTrue class DeserializeAndReturnEnvelopeTests { - - fun testName(): String = Thread.currentThread().stackTrace[2].methodName - + // the 'this' reference means we can't just move this to the common test utils @Suppress("NOTHING_TO_INLINE") - inline fun classTestName(clazz: String) = "${this.javaClass.name}\$${testName()}\$$clazz" + inline private fun classTestName(clazz: String) = "${this.javaClass.name}\$${testName()}\$$clazz" @Test fun oneType() { diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt new file mode 100644 index 0000000000..2e4c091666 --- /dev/null +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt @@ -0,0 +1,34 @@ +package net.corda.nodeapi.internal.serialization.amqp + +import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertTrue + +class SerializeAndReturnSchemaTest { + // the 'this' reference means we can't just move this to the common test utils + @Suppress("NOTHING_TO_INLINE") + inline private fun classTestName(clazz: String) = "${this.javaClass.name}\$${testName()}\$$clazz" + + val factory = testDefaultFactory() + + // just a simple test to verify the internal test extension for serialize does + // indeed give us the correct schema back. This is more useful in support of other + // tests rather than by itself but for those to be reliable this also needs + // testing + @Test + fun getSchema() { + data class C(val a: Int, val b: Int) + val a = 1 + val b = 2 + + val sc = SerializationOutput(factory).serializeRtnSchema(C(a, b)) + + assertEquals(1, sc.schema.types.size) + assertEquals(classTestName("C"), sc.schema.types.first().name) + assertTrue(sc.schema.types.first() is CompositeType) + assertEquals(2, (sc.schema.types.first() as CompositeType).fields.size) + assertNotNull((sc.schema.types.first() as CompositeType).fields.find { it.name == "a" }) + assertNotNull((sc.schema.types.first() as CompositeType).fields.find { it.name == "b" }) + } +} From bc5aceddbf98d289df3fd30a867eec8bca1f99c8 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Wed, 23 Aug 2017 12:02:35 +0100 Subject: [PATCH 002/120] Enable anonymisation in two party deal/trade flows --- .../corda/finance/flows/TwoPartyDealFlow.kt | 37 ++++++--- .../corda/finance/flows/TwoPartyTradeFlow.kt | 79 ++++++++++++++----- .../node/messaging/TwoPartyTradeFlowTests.kt | 60 +++++++++----- .../kotlin/net/corda/irs/flows/FixingFlow.kt | 4 +- .../net/corda/traderdemo/flow/SellerFlow.kt | 6 +- 5 files changed, 130 insertions(+), 56 deletions(-) diff --git a/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyDealFlow.kt b/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyDealFlow.kt index b408708da4..91174c0a28 100644 --- a/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyDealFlow.kt +++ b/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyDealFlow.kt @@ -4,11 +4,9 @@ import co.paralleluniverse.fibers.Suspendable import net.corda.core.contracts.requireThat import net.corda.core.crypto.SecureHash import net.corda.core.crypto.TransactionSignature -import net.corda.core.flows.CollectSignaturesFlow -import net.corda.core.flows.FinalityFlow -import net.corda.core.flows.FlowLogic -import net.corda.core.flows.SignTransactionFlow +import net.corda.core.flows.* import net.corda.core.identity.AbstractParty +import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party import net.corda.core.node.NodeInfo import net.corda.core.node.services.ServiceType @@ -29,9 +27,14 @@ import java.security.PublicKey // TODO: Also, the term Deal is used here where we might prefer Agreement. // TODO: Make this flow more generic. object TwoPartyDealFlow { - // This object is serialised to the network and is the first flow message the seller sends to the buyer. + /** + * This object is serialised to the network and is the first flow message the seller sends to the buyer. + * + * @param primaryIdentity the (anonymised) identity of the participant that initiates communication/handshake. + * @param secondaryIdentity the (anonymised) identity of the participant that is recipient of initial communication. + */ @CordaSerializable - data class Handshake(val payload: T, val publicKey: PublicKey) + data class Handshake(val payload: T, val primaryIdentity: AnonymousParty, val secondaryIdentity: AnonymousParty) /** * Abstracted bilateral deal flow participant that initiates communication/handshake. @@ -39,19 +42,25 @@ object TwoPartyDealFlow { abstract class Primary(override val progressTracker: ProgressTracker = Primary.tracker()) : FlowLogic() { companion object { + object GENERATING_ID : ProgressTracker.Step("Generating anonymous identities") object SENDING_PROPOSAL : ProgressTracker.Step("Handshaking and awaiting transaction proposal.") - fun tracker() = ProgressTracker(SENDING_PROPOSAL) + fun tracker() = ProgressTracker(GENERATING_ID, SENDING_PROPOSAL) } abstract val payload: Any abstract val notaryNode: NodeInfo abstract val otherParty: Party + // TODO: This is never read from, and should be removed abstract val myKey: PublicKey @Suspendable override fun call(): SignedTransaction { + progressTracker.currentStep = GENERATING_ID + val txIdentities = subFlow(TransactionKeyFlow(otherParty)) + val anonymousMe = txIdentities.get(serviceHub.myInfo.legalIdentity) ?: serviceHub.myInfo.legalIdentity.anonymise() + val anonymousCounterparty = txIdentities.get(otherParty) ?: otherParty.anonymise() progressTracker.currentStep = SENDING_PROPOSAL // Make the first message we'll send to kick off the flow. - val hello = Handshake(payload, serviceHub.myInfo.legalIdentity.owningKey) + val hello = Handshake(payload, anonymousMe, anonymousCounterparty) // Wait for the FinalityFlow to finish on the other side and return the tx when it's available. send(otherParty, hello) @@ -105,7 +114,7 @@ object TwoPartyDealFlow { progressTracker.currentStep = COLLECTING_SIGNATURES // DOCSTART 1 - val stx = subFlow(CollectSignaturesFlow(ptx)) + val stx = subFlow(CollectSignaturesFlow(ptx, additionalSigningPubKeys)) // DOCEND 1 logger.trace { "Got signatures from other party, verifying ... " } @@ -138,7 +147,14 @@ object TwoPartyDealFlow { val handshake = receive>(otherParty) progressTracker.currentStep = VERIFYING - return handshake.unwrap { validateHandshake(it) } + return handshake.unwrap { + // Verify the transaction identities represent the correct parties + val wellKnownOtherParty = serviceHub.identityService.partyFromAnonymous(it.primaryIdentity) + val wellKnownMe = serviceHub.identityService.partyFromAnonymous(it.secondaryIdentity) + require(wellKnownOtherParty == otherParty) + require(wellKnownMe == serviceHub.myInfo.legalIdentity) + validateHandshake(it) + } } @Suspendable protected abstract fun validateHandshake(handshake: Handshake): Handshake @@ -155,7 +171,6 @@ object TwoPartyDealFlow { override val payload: AutoOffer, override val myKey: PublicKey, override val progressTracker: ProgressTracker = Primary.tracker()) : Primary() { - override val notaryNode: NodeInfo get() = serviceHub.networkMapCache.notaryNodes.filter { it.notaryIdentity == payload.notary }.single() diff --git a/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyTradeFlow.kt b/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyTradeFlow.kt index 215946ae9b..bac6013f74 100644 --- a/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyTradeFlow.kt +++ b/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyTradeFlow.kt @@ -5,10 +5,10 @@ import net.corda.core.contracts.Amount import net.corda.core.contracts.OwnableState import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.withoutIssuer +import net.corda.core.contracts.* import net.corda.core.flows.* -import net.corda.core.identity.AbstractParty -import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party +import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.NodeInfo import net.corda.core.serialization.CordaSerializable import net.corda.core.transactions.SignedTransaction @@ -48,18 +48,22 @@ object TwoPartyTradeFlow { override fun toString() = "The submitted asset didn't match the expected type: $expectedTypeName vs $typeName" } - // This object is serialised to the network and is the first flow message the seller sends to the buyer. + /** + * This object is serialised to the network and is the first flow message the seller sends to the buyer. + * + * @param payToIdentity anonymous identity of the seller, for payment to be sent to. + */ @CordaSerializable data class SellerTradeInfo( val price: Amount, - val sellerOwner: AbstractParty + val payToIdentity: PartyAndCertificate ) open class Seller(val otherParty: Party, val notaryNode: NodeInfo, val assetToSell: StateAndRef, val price: Amount, - val me: AbstractParty, + val me: PartyAndCertificate, override val progressTracker: ProgressTracker = Seller.tracker()) : FlowLogic() { companion object { @@ -84,12 +88,26 @@ object TwoPartyTradeFlow { // SendTransactionFlow allows otherParty to access our data to resolve the transaction. subFlow(SendStateAndRefFlow(otherParty, listOf(assetToSell))) send(otherParty, hello) + // Verify and sign the transaction. progressTracker.currentStep = VERIFYING_AND_SIGNING + + // Sync identities to ensure we know all of the identities involved in the transaction we're about to + // be asked to sign + subFlow(IdentitySyncFlow.Receive(otherParty)) + // DOCSTART 5 val signTransactionFlow = object : SignTransactionFlow(otherParty, VERIFYING_AND_SIGNING.childProgressTracker()) { override fun checkTransaction(stx: SignedTransaction) { - if (stx.tx.outputStates.sumCashBy(me).withoutIssuer() != price) + // Verify that we know who all the participants in the transaction are + val states: Iterable = (stx.tx.inputs.map { serviceHub.loadState(it).data } + stx.tx.outputs.map { it.data }) + states.forEach { state -> + state.participants.forEach { anon -> + require(serviceHub.identityService.partyFromAnonymous(anon) != null) { "Transaction state ${state} involves unknown participant ${anon}" } + } + } + + if (stx.tx.outputStates.sumCashBy(me.party).withoutIssuer() != price) throw FlowException("Transaction is not sending us the right amount of cash") } } @@ -114,7 +132,9 @@ object TwoPartyTradeFlow { open class Buyer(val otherParty: Party, val notary: Party, val acceptablePrice: Amount, - val typeToBuy: Class) : FlowLogic() { + val typeToBuy: Class, + val anonymous: Boolean) : FlowLogic() { + constructor(otherParty: Party, notary: Party, acceptablePrice: Amount, typeToBuy: Class): this(otherParty, notary, acceptablePrice, typeToBuy, true) // DOCSTART 2 object RECEIVING : ProgressTracker.Step("Waiting for seller trading info") @@ -139,16 +159,27 @@ object TwoPartyTradeFlow { progressTracker.currentStep = RECEIVING val (assetForSale, tradeRequest) = receiveAndValidateTradeRequest() + // Create the identity we'll be paying to, and send the counterparty proof we own the identity + val buyerAnonymousIdentity = if (anonymous) + serviceHub.keyManagementService.freshKeyAndCert(serviceHub.myInfo.legalIdentityAndCert, false) + else + serviceHub.myInfo.legalIdentityAndCert + // Put together a proposed transaction that performs the trade, and sign it. progressTracker.currentStep = SIGNING - val (ptx, cashSigningPubKeys) = assembleSharedTX(assetForSale, tradeRequest) + val (ptx, cashSigningPubKeys) = assembleSharedTX(assetForSale, tradeRequest, buyerAnonymousIdentity) + // Now sign the transaction with whatever keys we need to move the cash. val partSignedTx = serviceHub.signInitialTransaction(ptx, cashSigningPubKeys) + // Sync up confidential identities in the transaction with our counterparty + subFlow(IdentitySyncFlow.Send(otherParty, ptx.toWireTransaction())) + // Send the signed transaction to the seller, who must then sign it themselves and commit // it to the ledger by sending it to the notary. progressTracker.currentStep = COLLECTING_SIGNATURES - val twiceSignedTx = subFlow(CollectSignaturesFlow(partSignedTx, COLLECTING_SIGNATURES.childProgressTracker())) + val twiceSignedTx = subFlow(CollectSignaturesFlow(partSignedTx, cashSigningPubKeys, COLLECTING_SIGNATURES.childProgressTracker())) + // Notarise and record the transaction. progressTracker.currentStep = RECORDING return subFlow(FinalityFlow(twiceSignedTx)).single() @@ -159,33 +190,40 @@ object TwoPartyTradeFlow { val assetForSale = subFlow(ReceiveStateAndRefFlow(otherParty)).single() return assetForSale to receive(otherParty).unwrap { progressTracker.currentStep = VERIFYING + // What is the seller trying to sell us? val asset = assetForSale.state.data val assetTypeName = asset.javaClass.name + + // The asset must either be owned by the well known identity of the counterparty, or we must be able to + // prove the owner is a confidential identity of the counterparty. + val assetForSaleIdentity = serviceHub.identityService.partyFromAnonymous(asset.owner) + require(assetForSaleIdentity == otherParty) + + // Register the identity we're about to send payment to. This shouldn't be the same as the asset owner + // identity, so that anonymity is enforced. + val wellKnownPayToIdentity = serviceHub.identityService.verifyAndRegisterIdentity(it.payToIdentity) + require(wellKnownPayToIdentity?.party == otherParty) { "Well known identity to pay to must match counterparty identity" } + if (it.price > acceptablePrice) throw UnacceptablePriceException(it.price) if (!typeToBuy.isInstance(asset)) throw AssetMismatchException(typeToBuy.name, assetTypeName) + it } } - @Suspendable - private fun assembleSharedTX(assetForSale: StateAndRef, tradeRequest: SellerTradeInfo): Pair> { + private fun assembleSharedTX(assetForSale: StateAndRef, tradeRequest: SellerTradeInfo, buyerAnonymousIdentity: PartyAndCertificate): SharedTx { val ptx = TransactionBuilder(notary) // Add input and output states for the movement of cash, by using the Cash contract to generate the states - val (tx, cashSigningPubKeys) = Cash.generateSpend(serviceHub, ptx, tradeRequest.price, tradeRequest.sellerOwner) + val (tx, cashSigningPubKeys) = Cash.generateSpend(serviceHub, ptx, tradeRequest.price, tradeRequest.payToIdentity.party) // Add inputs/outputs/a command for the movement of the asset. tx.addInputState(assetForSale) - // Just pick some new public key for now. This won't be linked with our identity in any way, which is what - // we want for privacy reasons: the key is here ONLY to manage and control ownership, it is not intended to - // reveal who the owner actually is. The key management service is expected to derive a unique key from some - // initial seed in order to provide privacy protection. - val freshKey = serviceHub.keyManagementService.freshKey() - val (command, state) = assetForSale.state.data.withNewOwner(AnonymousParty(freshKey)) + val (command, state) = assetForSale.state.data.withNewOwner(buyerAnonymousIdentity.party) tx.addOutputState(state, assetForSale.state.notary) tx.addCommand(command, assetForSale.state.data.owner.owningKey) @@ -193,8 +231,11 @@ object TwoPartyTradeFlow { // But it can't hurt to have one. val currentTime = serviceHub.clock.instant() tx.setTimeWindow(currentTime, 30.seconds) - return Pair(tx, cashSigningPubKeys) + + return SharedTx(tx, cashSigningPubKeys) } // DOCEND 1 + + data class SharedTx(val tx: TransactionBuilder, val cashSigningPubKeys: List) } } diff --git a/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt b/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt index 55b1ff406b..f915218555 100644 --- a/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt +++ b/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt @@ -11,6 +11,7 @@ import net.corda.core.flows.StateMachineRunId import net.corda.core.identity.AbstractParty import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party +import net.corda.core.identity.PartyAndCertificate import net.corda.core.internal.FlowStateMachine import net.corda.core.internal.concurrent.map import net.corda.core.internal.rootCause @@ -20,6 +21,7 @@ import net.corda.core.messaging.StateMachineTransactionMapping import net.corda.core.node.NodeInfo import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.Vault +import net.corda.core.serialization.CordaSerializable import net.corda.core.toFuture import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder @@ -145,19 +147,18 @@ class TwoPartyTradeFlowTests { val aliceNode = mockNet.createPartyNode(notaryNode.network.myAddress, ALICE.name) val bobNode = mockNet.createPartyNode(notaryNode.network.myAddress, BOB.name) val bankNode = mockNet.createPartyNode(notaryNode.network.myAddress, BOC.name) - val cashIssuer = bankNode.info.legalIdentity.ref(1) - val cpIssuer = bankNode.info.legalIdentity.ref(1, 2, 3) + val issuer = bankNode.info.legalIdentity.ref(1) aliceNode.disableDBCloseOnStop() bobNode.disableDBCloseOnStop() val cashStates = bobNode.database.transaction { bobNode.services.fillWithSomeTestCash(2000.DOLLARS, bankNode.services, notaryNode.info.notaryIdentity, 3, 3, - issuedBy = cashIssuer) + issuedBy = issuer) } val alicesFakePaper = aliceNode.database.transaction { - fillUpForSeller(false, cpIssuer, aliceNode.info.legalIdentity, + fillUpForSeller(false, issuer, aliceNode.info.legalIdentity, 1200.DOLLARS `issued by` bankNode.info.legalIdentity.ref(0), null, notaryNode.info.notaryIdentity).second } @@ -199,8 +200,13 @@ class TwoPartyTradeFlowTests { val aliceNode = mockNet.createPartyNode(notaryNode.network.myAddress, ALICE.name) var bobNode = mockNet.createPartyNode(notaryNode.network.myAddress, BOB.name) val bankNode = mockNet.createPartyNode(notaryNode.network.myAddress, BOC.name) - val cashIssuer = bankNode.info.legalIdentity.ref(1) - val cpIssuer = bankNode.info.legalIdentity.ref(1, 2, 3) + val issuer = bankNode.info.legalIdentity.ref(1, 2, 3) + + // Let the nodes know about each other - normally the network map would handle this + val allNodes = listOf(notaryNode, aliceNode, bobNode, bankNode) + allNodes.forEach { node -> + allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.registerIdentity(identity) } + } aliceNode.services.identityService.verifyAndRegisterIdentity(bobNode.info.legalIdentityAndCert) bobNode.services.identityService.verifyAndRegisterIdentity(aliceNode.info.legalIdentityAndCert) @@ -214,10 +220,10 @@ class TwoPartyTradeFlowTests { bobNode.database.transaction { bobNode.services.fillWithSomeTestCash(2000.DOLLARS, bankNode.services, outputNotary = notaryNode.info.notaryIdentity, - issuedBy = cashIssuer) + issuedBy = issuer) } val alicesFakePaper = aliceNode.database.transaction { - fillUpForSeller(false, cpIssuer, aliceNode.info.legalIdentity, + fillUpForSeller(false, issuer, aliceNode.info.legalIdentity, 1200.DOLLARS `issued by` bankNode.info.legalIdentity.ref(0), null, notaryNode.info.notaryIdentity).second } insertFakeTransactions(alicesFakePaper, aliceNode, notaryNode, bankNode) @@ -253,6 +259,9 @@ class TwoPartyTradeFlowTests { // She will wait around until Bob comes back. assertThat(aliceNode.pumpReceive()).isNotNull() + // FIXME: Knowledge of confidential identities is lost on node shutdown, so Bob's node now refuses to sign the + // transaction because it has no idea who the parties are. + // ... bring the node back up ... the act of constructing the SMM will re-register the message handlers // that Bob was waiting on before the reboot occurred. bobNode = mockNet.createNode(networkMapAddress, bobAddr.id, object : MockNetwork.Factory { @@ -437,7 +446,6 @@ class TwoPartyTradeFlowTests { } ledger(aliceNode.services, initialiseSerialization = false) { - // Insert a prospectus type attachment into the commercial paper transaction. val stream = ByteArrayOutputStream() JarOutputStream(stream).use { @@ -529,13 +537,11 @@ class TwoPartyTradeFlowTests { private fun runBuyerAndSeller(notaryNode: MockNetwork.MockNode, sellerNode: MockNetwork.MockNode, buyerNode: MockNetwork.MockNode, - assetToSell: StateAndRef): RunResult { - val anonymousSeller = sellerNode.services.let { serviceHub -> - serviceHub.keyManagementService.freshKeyAndCert(serviceHub.myInfo.legalIdentityAndCert, false) - }.party.anonymise() - val buyerFlows: Observable = buyerNode.registerInitiatedFlow(BuyerAcceptor::class.java) + assetToSell: StateAndRef, + anonymous: Boolean = true): RunResult { + val buyerFlows: Observable> = buyerNode.registerInitiatedFlow(BuyerAcceptor::class.java) val firstBuyerFiber = buyerFlows.toFuture().map { it.stateMachine } - val seller = SellerInitiator(buyerNode.info.legalIdentity, notaryNode.info, assetToSell, 1000.DOLLARS, anonymousSeller) + val seller = SellerInitiator(buyerNode.info.legalIdentity, notaryNode.info, assetToSell, 1000.DOLLARS, anonymous) val sellerResult = sellerNode.services.startFlow(seller).resultFuture return RunResult(firstBuyerFiber, sellerResult, seller.stateMachine.id) } @@ -545,10 +551,15 @@ class TwoPartyTradeFlowTests { val notary: NodeInfo, val assetToSell: StateAndRef, val price: Amount, - val me: AnonymousParty) : FlowLogic() { + val anonymous: Boolean) : FlowLogic() { @Suspendable override fun call(): SignedTransaction { - send(buyer, Pair(notary.notaryIdentity, price)) + val me = if (anonymous) { + serviceHub.keyManagementService.freshKeyAndCert(serviceHub.myInfo.legalIdentityAndCert, false) + } else { + serviceHub.myInfo.legalIdentityAndCert + } + send(buyer, TestTx(notary.notaryIdentity, price, anonymous)) return subFlow(Seller( buyer, notary, @@ -562,14 +573,17 @@ class TwoPartyTradeFlowTests { class BuyerAcceptor(val seller: Party) : FlowLogic() { @Suspendable override fun call(): SignedTransaction { - val (notary, price) = receive>>(seller).unwrap { - require(serviceHub.networkMapCache.isNotary(it.first)) { "${it.first} is not a notary" } + val (notary, price, anonymous) = receive(seller).unwrap { + require(serviceHub.networkMapCache.isNotary(it.notaryIdentity)) { "${it.notaryIdentity} is not a notary" } it } - return subFlow(Buyer(seller, notary, price, CommercialPaper.State::class.java)) + return subFlow(Buyer(seller, notary, price, CommercialPaper.State::class.java, anonymous)) } } + @CordaSerializable + data class TestTx(val notaryIdentity: Party, val price: Amount, val anonymous: Boolean) + private fun LedgerDSL.runWithError( bobError: Boolean, aliceError: Boolean, @@ -581,6 +595,12 @@ class TwoPartyTradeFlowTests { val bankNode = mockNet.createPartyNode(notaryNode.network.myAddress, BOC.name) val issuer = bankNode.info.legalIdentity.ref(1, 2, 3) + // Let the nodes know about each other - normally the network map would handle this + val allNodes = listOf(notaryNode, aliceNode, bobNode, bankNode) + allNodes.forEach { node -> + allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.registerIdentity(identity) } + } + val bobsBadCash = bobNode.database.transaction { fillUpForBuyer(bobError, issuer, bobNode.info.legalIdentity, notaryNode.info.notaryIdentity).second diff --git a/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt b/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt index 65b6bb6ad7..877ae7dd67 100644 --- a/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt +++ b/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt @@ -8,6 +8,7 @@ import net.corda.core.flows.FlowLogic import net.corda.core.flows.InitiatedBy import net.corda.core.flows.InitiatingFlow import net.corda.core.flows.SchedulableFlow +import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.node.NodeInfo import net.corda.core.node.services.ServiceType @@ -110,8 +111,7 @@ object FixingFlow { } override val myKey: PublicKey get() { - dealToFix.state.data.participants.single { it.owningKey == serviceHub.myInfo.legalIdentity.owningKey } - return serviceHub.legalIdentityKey + return serviceHub.keyManagementService.filterMyKeys(dealToFix.state.data.participants.map(AbstractParty::owningKey)).single() } override val notaryNode: NodeInfo get() { diff --git a/samples/trader-demo/src/main/kotlin/net/corda/traderdemo/flow/SellerFlow.kt b/samples/trader-demo/src/main/kotlin/net/corda/traderdemo/flow/SellerFlow.kt index a249b87339..9656d93227 100644 --- a/samples/trader-demo/src/main/kotlin/net/corda/traderdemo/flow/SellerFlow.kt +++ b/samples/trader-demo/src/main/kotlin/net/corda/traderdemo/flow/SellerFlow.kt @@ -6,7 +6,6 @@ import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowLogic import net.corda.core.flows.InitiatingFlow import net.corda.core.flows.StartableByRPC -import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party import net.corda.core.node.NodeInfo import net.corda.core.transactions.SignedTransaction @@ -42,10 +41,9 @@ class SellerFlow(val otherParty: Party, progressTracker.currentStep = SELF_ISSUING val notary: NodeInfo = serviceHub.networkMapCache.notaryNodes[0] - val cpOwnerKey = serviceHub.keyManagementService.freshKey() + val cpOwner = serviceHub.keyManagementService.freshKeyAndCert(serviceHub.myInfo.legalIdentityAndCert, false) val commercialPaper = serviceHub.vaultQueryService.queryBy(CommercialPaper.State::class.java).states.first() - progressTracker.currentStep = TRADING // Send the offered amount. @@ -55,7 +53,7 @@ class SellerFlow(val otherParty: Party, notary, commercialPaper, amount, - AnonymousParty(cpOwnerKey), + cpOwner, progressTracker.getChildProgressTracker(TRADING)!!) return subFlow(seller) } From 3b9c1ec0ffc34bf4258067bbe09d2618a24eca4a Mon Sep 17 00:00:00 2001 From: Patrick Kuo Date: Fri, 11 Aug 2017 17:02:17 +0100 Subject: [PATCH 003/120] Use identity service to resolve anonymised identities in explorer --- .../client/jfx/model/NetworkIdentityModel.kt | 18 ++++++---- .../net/corda/explorer/views/GuiUtilities.kt | 6 ++-- .../net/corda/explorer/views/Network.kt | 12 +++---- .../corda/explorer/views/TransactionViewer.kt | 35 ++++++++++--------- .../views/cordapps/cash/CashViewer.kt | 2 +- 5 files changed, 39 insertions(+), 34 deletions(-) diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NetworkIdentityModel.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NetworkIdentityModel.kt index ee47ed9947..923465b2b9 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NetworkIdentityModel.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NetworkIdentityModel.kt @@ -1,13 +1,14 @@ package net.corda.client.jfx.model +import com.google.common.cache.CacheBuilder +import com.google.common.cache.CacheLoader import javafx.beans.value.ObservableValue import javafx.collections.FXCollections import javafx.collections.ObservableList -import net.corda.client.jfx.utils.firstOrDefault -import net.corda.client.jfx.utils.firstOrNullObservable import net.corda.client.jfx.utils.fold import net.corda.client.jfx.utils.map -import net.corda.core.crypto.keys +import net.corda.core.identity.AbstractParty +import net.corda.core.identity.AnonymousParty import net.corda.core.node.NodeInfo import net.corda.core.node.services.NetworkMapCache.MapChange import java.security.PublicKey @@ -29,6 +30,12 @@ class NetworkIdentityModel { private val rpcProxy by observableValue(NodeMonitorModel::proxyObservable) + private val identityCache = CacheBuilder.newBuilder() + .build>(CacheLoader.from { + publicKey -> + publicKey?.let { rpcProxy.map { it?.nodeIdentityFromParty(AnonymousParty(publicKey)) } } + }) + val parties: ObservableList = networkIdentities.filtered { !it.isCordaService() } val notaries: ObservableList = networkIdentities.filtered { it.advertisedServices.any { it.info.type.isNotary() } } val myIdentity = rpcProxy.map { it?.nodeIdentity() } @@ -38,8 +45,5 @@ class NetworkIdentityModel { return advertisedServices.any { it.info.type.isNetworkMap() || it.info.type.isNotary() } } - // TODO: Use Identity Service in service hub instead? - fun lookup(publicKey: PublicKey): ObservableValue = parties.firstOrDefault(notaries.firstOrNullObservable { it.notaryIdentity.owningKey.keys.any { it == publicKey } }) { - it.legalIdentity.owningKey.keys.any { it == publicKey } - } + fun partyFromPublicKey(publicKey: PublicKey): ObservableValue = identityCache[publicKey] } diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/GuiUtilities.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/GuiUtilities.kt index 1ea8ac1d5c..1dd067df54 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/GuiUtilities.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/GuiUtilities.kt @@ -14,10 +14,10 @@ import net.corda.client.jfx.model.Models import net.corda.client.jfx.model.NetworkIdentityModel import net.corda.client.jfx.utils.map import net.corda.core.contracts.StateAndRef -import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.finance.contracts.asset.Cash import tornadofx.* +import java.security.PublicKey /** * Helper method to reduce boiler plate code @@ -89,6 +89,6 @@ inline fun UIComponent.getModel(): M = Models.get(M::class, th fun Collection.cross(other: Collection) = this.flatMap { a -> other.map { b -> a to b } } // TODO: This is a temporary fix for the UI to show the correct issuer identity, this will break when we start randomizing keys. More work is needed here when the identity work is done. -fun StateAndRef.resolveIssuer(): ObservableValue = state.data.amount.token.issuer.party.resolveIssuer() +fun StateAndRef.resolveIssuer(): ObservableValue = state.data.amount.token.issuer.party.owningKey.toKnownParty() -fun AbstractParty.resolveIssuer(): ObservableValue = Models.get(NetworkIdentityModel::class, javaClass.kotlin).lookup(owningKey).map { it?.legalIdentity } +fun PublicKey.toKnownParty() = Models.get(NetworkIdentityModel::class, javaClass.kotlin).partyFromPublicKey(this).map { it?.legalIdentity } diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt index 9df6973b25..23dcb222cf 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt @@ -79,7 +79,7 @@ class Network : CordaView() { .filterNotNull() .map { it.stateAndRef.state.data }.getParties() val outputParties = it.transaction.tx.outputStates.observable().getParties() - val signingParties = it.transaction.sigs.map { getModel().lookup(it.by) } + val signingParties = it.transaction.sigs.map { it.by.toKnownParty() } // Input parties fire a bullets to all output parties, and to the signing parties. !! This is a rough guess of how the message moves in the network. // TODO : Expose artemis queue to get real message information. inputParties.cross(outputParties) + inputParties.cross(signingParties) @@ -170,10 +170,10 @@ class Network : CordaView() { zoomOutButton.setOnAction { zoom(0.8) } lastTransactions.addListener { _, _, new -> - new?.forEach { - it.first.value?.let { a -> - it.second.value?.let { b -> - fireBulletBetweenNodes(a.legalIdentity, b.legalIdentity, "bank", "bank") + new?.forEach { (partyA, partyB) -> + partyA.value?.let { a -> + partyB.value?.let { b -> + fireBulletBetweenNodes(a, b, "bank", "bank") } } } @@ -209,7 +209,7 @@ class Network : CordaView() { return Point2D(x, y) } - private fun List.getParties() = map { it.participants.map { getModel().lookup(it.owningKey) } }.flatten() + private fun List.getParties() = map { it.participants.map { it.owningKey.toKnownParty() } }.flatten() private fun fireBulletBetweenNodes(senderNode: Party, destNode: Party, startType: String, endType: String) { val senderNodeComp = allComponentMap[senderNode] ?: return diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt index b345c7f09c..846c8649fd 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt @@ -26,6 +26,7 @@ import net.corda.core.crypto.commonName import net.corda.core.crypto.toBase58String import net.corda.core.crypto.toStringShort import net.corda.core.identity.AbstractParty +import net.corda.core.identity.Party import net.corda.core.node.NodeInfo import net.corda.explorer.AmountDiff import net.corda.explorer.formatters.AmountFormatter @@ -70,8 +71,8 @@ class TransactionViewer : CordaView("Transactions") { val id: SecureHash, val inputs: Inputs, val outputs: ObservableList>, - val inputParties: ObservableList>>, - val outputParties: ObservableList>>, + val inputParties: ObservableList>>, + val outputParties: ObservableList>>, val commandTypes: List>, val totalValueEquiv: ObservableValue> ) @@ -135,8 +136,8 @@ class TransactionViewer : CordaView("Transactions") { "Transaction ID" to { tx, s -> "${tx.id}".contains(s, true) }, "Input" to { tx, s -> tx.inputs.resolved.any { it.state.data.contract.javaClass.simpleName.contains(s, true) } }, "Output" to { tx, s -> tx.outputs.any { it.state.data.contract.javaClass.simpleName.contains(s, true) } }, - "Input Party" to { tx, s -> tx.inputParties.any { it.any { it.value?.legalIdentity?.name?.commonName?.contains(s, true) ?: false } } }, - "Output Party" to { tx, s -> tx.outputParties.any { it.any { it.value?.legalIdentity?.name?.commonName?.contains(s, true) ?: false } } }, + "Input Party" to { tx, s -> tx.inputParties.any { it.any { it.value?.name?.commonName?.contains(s, true) ?: false } } }, + "Output Party" to { tx, s -> tx.outputParties.any { it.any { it.value?.name?.commonName?.contains(s, true) ?: false } } }, "Command Type" to { tx, s -> tx.commandTypes.any { it.simpleName.contains(s, true) } } ) root.top = searchField.root @@ -199,13 +200,13 @@ class TransactionViewer : CordaView("Transactions") { }) } - private fun ObservableList>>.formatJoinPartyNames(separator: String = "", formatter: Formatter): String { + private fun ObservableList>>.formatJoinPartyNames(separator: String = ",", formatter: Formatter): String { return flatten().map { - it.value?.legalIdentity?.let { formatter.format(it.name) } + it.value?.let { formatter.format(it.name) } }.filterNotNull().toSet().joinToString(separator) } - private fun ObservableList>.getParties() = map { it.state.data.participants.map { getModel().lookup(it.owningKey) } } + private fun ObservableList>.getParties() = map { it.state.data.participants.map { it.owningKey.toKnownParty() } } private fun ObservableList>.toText() = map { it.contract().javaClass.simpleName }.groupBy { it }.map { "${it.key} (${it.value.size})" }.joinToString() private class TransactionWidget : BorderPane() { @@ -248,8 +249,8 @@ class TransactionViewer : CordaView("Transactions") { outputs.items = transaction.outputs.observable() signatures.children.addAll(signatureData.map { signature -> - val nodeInfo = getModel().lookup(signature) - copyableLabel(nodeInfo.map { "${signature.toStringShort()} (${it?.legalIdentity?.let { PartyNameFormatter.short.format(it.name)} ?: "???"})" }) + val party = signature.toKnownParty() + copyableLabel(party.map { "${signature.toStringShort()} (${it?.let { PartyNameFormatter.short.format(it.name) } ?: "Anonymous"})" }) }) } @@ -276,7 +277,7 @@ class TransactionViewer : CordaView("Transactions") { row { label("Issuer :") { gridpaneConstraints { hAlignment = HPos.RIGHT } } val anonymousIssuer: AbstractParty = data.amount.token.issuer.party - val issuer: AbstractParty = anonymousIssuer.resolveIssuer().value ?: anonymousIssuer + val issuer: AbstractParty = anonymousIssuer.owningKey.toKnownParty().value ?: anonymousIssuer // TODO: Anonymous should probably be italicised or similar label(issuer.nameOrNull()?.let { PartyNameFormatter.short.format(it) } ?: "Anonymous") { tooltip(anonymousIssuer.owningKey.toBase58String()) @@ -284,9 +285,8 @@ class TransactionViewer : CordaView("Transactions") { } row { label("Owner :") { gridpaneConstraints { hAlignment = HPos.RIGHT } } - val owner = data.owner - val nodeInfo = getModel().lookup(owner.owningKey) - label(nodeInfo.map { it?.legalIdentity?.let { PartyNameFormatter.short.format(it.name) } ?: "???" }) { + val owner = data.owner.owningKey.toKnownParty() + label(owner.map { it?.let { PartyNameFormatter.short.format(it.name) } ?: "Anonymous" }) { tooltip(data.owner.owningKey.toBase58String()) } } @@ -300,27 +300,28 @@ class TransactionViewer : CordaView("Transactions") { } private fun StateAndRef.contract() = this.state.data.contract + } /** * We calculate the total value by subtracting relevant input states and adding relevant output states, as long as they're cash */ -private fun calculateTotalEquiv(identity: NodeInfo?, +private fun calculateTotalEquiv(myIdentity: NodeInfo?, reportingCurrencyExchange: Pair) -> Amount>, inputs: List, outputs: List): AmountDiff { val (reportingCurrency, exchange) = reportingCurrencyExchange - val legalIdentity = identity?.legalIdentity + val myLegalIdentity = myIdentity?.legalIdentity fun List.sum() = this.map { it as? Cash.State } .filterNotNull() - .filter { legalIdentity == it.owner } + .filter { it.owner.owningKey.toKnownParty().value == myLegalIdentity } .map { exchange(it.amount.withoutIssuer()).quantity } .sum() // For issuing cash, if I am the issuer and not the owner (e.g. issuing cash to other party), count it as negative. val issuedAmount = if (inputs.isEmpty()) outputs.map { it as? Cash.State } .filterNotNull() - .filter { legalIdentity == it.amount.token.issuer.party && legalIdentity != it.owner } + .filter { it.amount.token.issuer.party.owningKey.toKnownParty().value == myLegalIdentity && it.owner.owningKey.toKnownParty().value != myLegalIdentity } .map { exchange(it.amount.withoutIssuer()).quantity } .sum() else 0 diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt index 48a2b188ea..ec18b895c4 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt @@ -205,7 +205,7 @@ class CashViewer : CordaView("Cash") { /** * Assemble the Issuer node. */ - val treeItem = TreeItem(ViewerNode.IssuerNode(issuer.resolveIssuer().value ?: issuer, equivSumAmount, memberStates)) + val treeItem = TreeItem(ViewerNode.IssuerNode(issuer.owningKey.toKnownParty().value ?: issuer, equivSumAmount, memberStates)) /** * Bind the children in the TreeTable structure. From 414f2b4b40c42311df100e9a96d1fca96e833d35 Mon Sep 17 00:00:00 2001 From: Katelyn Baker Date: Tue, 29 Aug 2017 16:23:10 +0100 Subject: [PATCH 004/120] Review Comments - give test methods a better name --- .../corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt | 2 +- .../internal/serialization/amqp/SerializeAndReturnSchemaTest.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt index 02a86cd6e2..0494497138 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt @@ -28,7 +28,7 @@ data class BytesAndSchema(val obj: SerializedBytes, val schema: Sche // Extension for the serialize routine that returns the scheme encoded into the // bytes as well as the bytes for simple testing @Throws(NotSerializableException::class) -fun SerializationOutput.serializeRtnSchema(obj: T): BytesAndSchema { +fun SerializationOutput.serializeAndReturnSchema(obj: T): BytesAndSchema { try { return BytesAndSchema(_serialize(obj), Schema(schemaHistory.toList())) } finally { diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt index 2e4c091666..86b769a14f 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt @@ -22,7 +22,7 @@ class SerializeAndReturnSchemaTest { val a = 1 val b = 2 - val sc = SerializationOutput(factory).serializeRtnSchema(C(a, b)) + val sc = SerializationOutput(factory).serializeAndReturnSchema(C(a, b)) assertEquals(1, sc.schema.types.size) assertEquals(classTestName("C"), sc.schema.types.first().name) From 605d1427385096b866fdd8c20e78f065527a6839 Mon Sep 17 00:00:00 2001 From: Andras Slemmer Date: Tue, 29 Aug 2017 16:50:46 +0100 Subject: [PATCH 005/120] Add quasar exclude pattern to the agent --- node/capsule/build.gradle | 6 ++---- .../src/main/kotlin/net/corda/testing/driver/Driver.kt | 7 ++----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/node/capsule/build.gradle b/node/capsule/build.gradle index ca5d578407..9d69e6f5c9 100644 --- a/node/capsule/build.gradle +++ b/node/capsule/build.gradle @@ -36,10 +36,8 @@ task buildCordaJAR(type: FatCapsule, dependsOn: project(':node').compileJava) { capsuleManifest { applicationVersion = corda_release_version appClassPath = ["jolokia-agent-war-${project.rootProject.ext.jolokia_version}.war"] - // TODO add this once we upgrade quasar to 0.7.8 - // def quasarExcludeExpression = "x(rx**;io**;kotlin**;jdk**;reflectasm**;groovyjarjarasm**;groovy**;joptsimple**;groovyjarjarantlr**;javassist**;com.fasterxml**;com.typesafe**;com.google**;com.zaxxer**;com.jcabi**;com.codahale**;com.esotericsoftware**;de.javakaffee**;org.objectweb**;org.slf4j**;org.w3c**;org.codehaus**;org.h2**;org.crsh**;org.fusesource**;org.hibernate**;org.dom4j**;org.bouncycastle**;org.apache**;org.objenesis**;org.jboss**;org.xml**;org.jcp**;org.jetbrains**;org.yaml**;co.paralleluniverse**;net.i2p**)" - // javaAgents = ["quasar-core-${quasar_version}-jdk8.jar=${quasarExcludeExpression}"] - javaAgents = ["quasar-core-${quasar_version}-jdk8.jar"] + def quasarExcludeExpression = "x(rx**;io**;antlr**;kotlin**;jdk**;reflectasm**;groovyjarjarasm**;groovy**;joptsimple**;groovyjarjarantlr**;com.fasterxml**;com.typesafe**;com.google**;com.zaxxer**;com.jcabi**;com.codahale**;com.esotericsoftware**;de.javakaffee**;org.objectweb**;org.slf4j**;org.w3c**;org.codehaus**;org.crsh**;org.fusesource**;org.h2**;org.hibernate**;org.dom4j**;org.bouncycastle**;org.apache**;org.objenesis**;org.jboss**;org.jcp**;org.xml**;co.paralleluniverse**;net.i2p**)" + javaAgents = ["quasar-core-${quasar_version}-jdk8.jar=${quasarExcludeExpression}"] systemProperties['visualvm.display.name'] = 'Corda' minJavaVersion = '1.8.0' minUpdateVersion['1.8'] = java8_minUpdateVersion diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt index ab849e220f..cc33d1e77b 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -801,12 +801,9 @@ class DriverDSL( "net.corda.node.cordapp.scan.package" to callerPackage, "java.io.tmpdir" to System.getProperty("java.io.tmpdir") // Inherit from parent process ) - // TODO Add this once we upgrade to quasar 0.7.8, this causes startup time to halve. - // val excludePattern = x(rx**;io**;kotlin**;jdk**;reflectasm**;groovyjarjarasm**;groovy**;joptsimple**;groovyjarjarantlr**;javassist**;com.fasterxml**;com.typesafe**;com.google**;com.zaxxer**;com.jcabi**;com.codahale**;com.esotericsoftware**;de.javakaffee**;org.objectweb**;org.slf4j**;org.w3c**;org.codehaus**;org.h2**;org.crsh**;org.fusesource**;org.hibernate**;org.dom4j**;org.bouncycastle**;org.apache**;org.objenesis**;org.jboss**;org.xml**;org.jcp**;org.jetbrains**;org.yaml**;co.paralleluniverse**;net.i2p**)" - // val extraJvmArguments = systemProperties.map { "-D${it.key}=${it.value}" } + - // "-javaagent:$quasarJarPath=$excludePattern" + val excludePattern = "x(rx**;io**;antlr**;kotlin**;jdk**;reflectasm**;groovyjarjarasm**;groovy**;joptsimple**;groovyjarjarantlr**;com.fasterxml**;com.typesafe**;com.google**;com.zaxxer**;com.jcabi**;com.codahale**;com.esotericsoftware**;de.javakaffee**;org.objectweb**;org.slf4j**;org.w3c**;org.codehaus**;org.crsh**;org.fusesource**;org.h2**;org.hibernate**;org.dom4j**;org.bouncycastle**;org.apache**;org.objenesis**;org.jboss**;org.jcp**;org.xml**;co.paralleluniverse**;net.i2p**)" val extraJvmArguments = systemProperties.map { "-D${it.key}=${it.value}" } + - "-javaagent:$quasarJarPath" + "-javaagent:$quasarJarPath=$excludePattern" val loggingLevel = if (debugPort == null) "INFO" else "DEBUG" ProcessUtilities.startCordaProcess( From a2a3f51689c68c15e1343f0757e34ba4f37c0470 Mon Sep 17 00:00:00 2001 From: josecoll Date: Tue, 29 Aug 2017 16:51:42 +0100 Subject: [PATCH 006/120] Updated vault query api documentation. (#1338) * Updated vault query api documentation. * Readability improvement following PR review feedback. --- docs/source/api-persistence.rst | 2 + docs/source/api-vault-query.rst | 97 +++---------------- .../database/HibernateConfigurationTest.kt | 2 +- .../services/events/ScheduledFlowTests.kt | 2 + 4 files changed, 20 insertions(+), 83 deletions(-) diff --git a/docs/source/api-persistence.rst b/docs/source/api-persistence.rst index 24db09fcaa..8844f80b4a 100644 --- a/docs/source/api-persistence.rst +++ b/docs/source/api-persistence.rst @@ -100,6 +100,8 @@ processed to ensure only the ``X500Name`` of the identity is persisted where an value is stored in the associated column. To preserve privacy, identity keys are never persisted. Developers should use the ``IdentityService`` to resolve keys from well know X500 identity names. +.. _jdbc_session_ref: + JDBC session ------------ Apps may also interact directly with the underlying Node's database by using a standard diff --git a/docs/source/api-vault-query.rst b/docs/source/api-vault-query.rst index c3b747c1ec..32626ecb0a 100644 --- a/docs/source/api-vault-query.rst +++ b/docs/source/api-vault-query.rst @@ -6,6 +6,7 @@ Corda has been architected from the ground up to encourage usage of industry sta Corda provides a number of flexible query mechanisms for accessing the Vault: - Vault Query API +- using a JDBC session (as described in :ref:`Persistence `) - custom JPA_/JPQL_ queries - custom 3rd party Data Access frameworks such as `Spring Data `_ @@ -62,7 +63,7 @@ There are four implementations of this interface which can be chained together t .. note:: All contract states that extend the ``FungibleAsset`` now automatically persist that interfaces common state attributes to the **vault_fungible_states** table. -3. ``LinearStateQueryCriteria`` provides filterable criteria on attributes defined in the Corda Core ``LinearState`` and ``DealState`` contract state interfaces, used to represent entities that continuously supercede themselves, all of which share the same *linearId* (eg. trade entity states such as the ``IRSState`` defined in the SIMM valuation demo). Filterable attributes include: participant(s), linearId(s), dealRef(s). +3. ``LinearStateQueryCriteria`` provides filterable criteria on attributes defined in the Corda Core ``LinearState`` and ``DealState`` contract state interfaces, used to represent entities that continuously supercede themselves, all of which share the same *linearId* (eg. trade entity states such as the ``IRSState`` defined in the SIMM valuation demo). Filterable attributes include: participant(s), linearId(s), uuid(s), and externalId(s). .. note:: All contract states that extend ``LinearState`` or ``DealState`` now automatically persist those interfaces common state attributes to the **vault_linear_states** table. @@ -70,14 +71,14 @@ There are four implementations of this interface which can be chained together t .. note:: It is a requirement to register any custom contract schemas to be used in Vault Custom queries in the associated `CordaPluginRegistry` configuration for the respective CorDapp using the ``requiredSchemas`` configuration field (which specifies a set of `MappedSchema`) -All ``QueryCriteria`` implementations are composable using ``and`` and ``or`` operators, as also illustrated above. +All ``QueryCriteria`` implementations are composable using ``and`` and ``or`` operators. All ``QueryCriteria`` implementations provide an explicitly specifiable set of common attributes: 1. State status attribute (``Vault.StateStatus``), which defaults to filtering on UNCONSUMED states. When chaining several criterias using AND / OR, the last value of this attribute will override any previous. -2. Contract state types (``>``), which will contain at minimum one type (by default this will be ``ContractState`` which resolves to all types). - When chaining several criteria using AND / OR, all specified contract state types are combined into a single set. +2. Contract state types (``>``), which will contain at minimum one type (by default this will be ``ContractState`` which resolves to all state types). + When chaining several criteria using ``and`` and ``or`` operators, all specified contract state types are combined into a single set. An example of a custom query is illustrated here: @@ -107,7 +108,7 @@ An example of a custom query in Java is illustrated here: :start-after: DOCSTART VaultJavaQueryExample3 :end-before: DOCEND VaultJavaQueryExample3 -.. note:: Current queries by ``Party`` specify the ``AbstractParty`` which may be concrete or anonymous. In the later case, where an anonymous party does not have an associated X500Name, then no query results will ever be produced. For performance reasons, queries do not use PublicKey as search criteria. Ongoing design work on identity manangement is likely to enhance identity based queries (including composite key criteria selection). +.. note:: Queries by ``Party`` specify the ``AbstractParty`` which may be concrete or anonymous. In the later case, where an anonymous party does not resolve to an X500Name via the IdentityService, no query results will ever be produced. For performance reasons, queries do not use PublicKey as search criteria. Pagination ---------- @@ -154,8 +155,6 @@ Query for unconsumed states for a given notary: :start-after: DOCSTART VaultQueryExample4 :end-before: DOCEND VaultQueryExample4 -.. note:: We are using the notaries X500Name as our search identifier. - Query for unconsumed states for a given set of participants: .. literalinclude:: ../../node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt @@ -170,7 +169,7 @@ Query for unconsumed states recorded between two time intervals: :start-after: DOCSTART VaultQueryExample6 :end-before: DOCEND VaultQueryExample6 -.. note:: This example illustrates usage of a Between ColumnPredicate. +.. note:: This example illustrates usage of a ``Between`` ``ColumnPredicate``. Query for all states with pagination specification (10 results per page): @@ -179,7 +178,14 @@ Query for all states with pagination specification (10 results per page): :start-after: DOCSTART VaultQueryExample7 :end-before: DOCEND VaultQueryExample7 -.. note:: The result set metadata field `totalStatesAvailable` allows you to further paginate accordingly. +.. note:: The result set metadata field `totalStatesAvailable` allows you to further paginate accordingly as demonstrated in the following example. + +Query for all states using pagination specification and iterate using `totalStatesAvailable` field until no further pages available: + +.. literalinclude:: ../../node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt + :language: kotlin + :start-after: DOCSTART VaultQueryExamplePaging + :end-before: DOCEND VaultQueryExamplePaging **LinearState and DealState queries using** ``LinearStateQueryCriteria`` @@ -389,77 +395,4 @@ The Corda Tutorials provide examples satisfying these additional Use Cases: .. _JPQL: http://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#hql .. _JPA: https://docs.spring.io/spring-data/jpa/docs/current/reference/html -Upgrading from previous releases ---------------------------------- - -Here follows a selection of the most common upgrade scenarios: - -1. ServiceHub usage to obtain Unconsumed states for a given contract state type - - Previously: - -.. container:: codeset - - .. sourcecode:: kotlin - - val yoStates = b.vault.unconsumedStates() - -This query returned an ``Iterable>`` - - Now: - -.. container:: codeset - - .. sourcecode:: kotlin - - val yoStates = b.vault.queryBy().states - -The query returns a ``Vault.Page`` result containing: - - - states as a ``List>`` up to a maximum of ``DEFAULT_PAGE_SIZE`` (200) where no ``PageSpecification`` provided, otherwise returns results according to the parameters ``pageNumber`` and ``pageSize`` specified in the supplied ``PageSpecification``. - - states metadata as a ``List`` containing Vault State metadata held in the Vault states table. - - a ``total`` number of results available if ``PageSpecification`` provided (otherwise returns -1). For pagination, this value can be used to issue subsequent queries with appropriately specified ``PageSpecification`` parameters (according to your paging needs and/or maximum memory capacity for holding large data sets). Note it is your responsibility to manage page numbers and sizes. - - status types used in this query: UNCONSUMED, CONSUMED, ALL - - other results as a [List] of any type (eg. aggregate function results with/without group by) - -2. ServiceHub usage obtaining linear heads for a given contract state type - - Previously: - -.. container:: codeset - - .. sourcecode:: kotlin - - val iouStates = serviceHub.vaultService.linearHeadsOfType() - val iouToSettle = iouStates[linearId] ?: throw Exception("IOUState with linearId $linearId not found.") - - Now: - -.. container:: codeset - - .. sourcecode:: kotlin - - val criteria = QueryCriteria.LinearStateQueryCriteria(linearId = listOf(linearId)) - val iouStates = serviceHub.vaultService.queryBy(criteria).states - - val iouToSettle = iouStates.singleOrNull() ?: throw Exception("IOUState with linearId $linearId not found.") - -3. RPC usage was limited to using the ``vaultAndUpdates`` RPC method, which returned a snapshot and streaming updates as an Observable. - In many cases, queries were not interested in the streaming updates. - - Previously: - -.. container:: codeset - - .. sourcecode:: kotlin - - val iouStates = services.vaultAndUpdates().first.filter { it.state.data is IOUState } - - Now: - -.. container:: codeset - - .. sourcecode:: kotlin - - val iouStates = services.vaultQueryBy() diff --git a/node/src/test/kotlin/net/corda/node/services/database/HibernateConfigurationTest.kt b/node/src/test/kotlin/net/corda/node/services/database/HibernateConfigurationTest.kt index 6cbad996e3..9f5b7767b0 100644 --- a/node/src/test/kotlin/net/corda/node/services/database/HibernateConfigurationTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/database/HibernateConfigurationTest.kt @@ -870,7 +870,7 @@ class HibernateConfigurationTest : TestDependencyInjectionBase() { val nativeQuery = "SELECT v.transaction_id, v.output_index FROM vault_states v WHERE v.state_status = 0" database.transaction { - val jdbcSession = database.createSession() + val jdbcSession = services.jdbcSession() val prepStatement = jdbcSession.prepareStatement(nativeQuery) val rs = prepStatement.executeQuery() // DOCEND JdbcSession diff --git a/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt b/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt index b57af97ed6..5988b575db 100644 --- a/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt @@ -182,6 +182,7 @@ class ScheduledFlowTests { * @return states ordered by the transaction ID. */ private fun queryStatesWithPaging(vaultQueryService: VaultQueryService): List> { + // DOCSTART VaultQueryExamplePaging var pageNumber = DEFAULT_PAGE_NUM val states = mutableListOf>() do { @@ -190,6 +191,7 @@ class ScheduledFlowTests { states.addAll(results.states) pageNumber++ } while ((pageSpec.pageSize * (pageNumber)) <= results.totalStatesAvailable) + // DOCEND VaultQueryExamplePaging return states.toList() } } From 2facab3be3dac24faaca5d3fd334c9966ef47379 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Tue, 29 Aug 2017 16:57:29 +0100 Subject: [PATCH 007/120] Split ClockUtils to improve Java compatibility Split `ClockUtils` into `MutableClock`, and move the extension functions into `NodeSchedulerService` which is the only thing that uses them. --- .../net/corda/node/internal/MutableClock.kt | 45 +++++++ .../services/events/NodeSchedulerService.kt | 90 ++++++++++++-- .../net/corda/node/utilities/ClockUtils.kt | 115 ------------------ .../net/corda/node/utilities/TestClock.kt | 1 + .../events/NodeSchedulerServiceTest.kt | 8 +- .../corda/node/utilities/ClockUtilsTest.kt | 27 ++-- .../net/corda/testing/node/TestClock.kt | 3 +- 7 files changed, 143 insertions(+), 146 deletions(-) create mode 100644 node/src/main/kotlin/net/corda/node/internal/MutableClock.kt delete mode 100644 node/src/main/kotlin/net/corda/node/utilities/ClockUtils.kt diff --git a/node/src/main/kotlin/net/corda/node/internal/MutableClock.kt b/node/src/main/kotlin/net/corda/node/internal/MutableClock.kt new file mode 100644 index 0000000000..3a52cf377c --- /dev/null +++ b/node/src/main/kotlin/net/corda/node/internal/MutableClock.kt @@ -0,0 +1,45 @@ +package net.corda.node.internal + +import rx.Observable +import rx.Subscriber +import rx.subscriptions.Subscriptions +import java.time.Clock +import java.util.concurrent.CopyOnWriteArraySet +import java.util.concurrent.atomic.AtomicLong + +/** + * An abstract class with helper methods for a type of Clock that might have it's concept of "now" + * adjusted externally. + * + * e.g. for testing (so unit tests do not have to wait for timeouts in realtime) or for demos and simulations. + */ +abstract class MutableClock : Clock() { + private val _version = AtomicLong(0L) + + /** + * This is an observer on the mutation count of this [Clock], which reflects the occurence of mutations. + */ + val mutations: Observable by lazy { + Observable.create({ subscriber: Subscriber -> + if (!subscriber.isUnsubscribed) { + mutationObservers.add(subscriber) + // This is not very intuitive, but subscribing to a subscriber observes unsubscribes. + subscriber.add(Subscriptions.create { mutationObservers.remove(subscriber) }) + } + }) + } + + private val mutationObservers = CopyOnWriteArraySet>() + + /** + * Must be called by subclasses when they mutate (but not just with the passage of time as per the "wall clock"). + */ + protected fun notifyMutationObservers() { + val version = _version.incrementAndGet() + for (observer in mutationObservers) { + if (!observer.isUnsubscribed) { + observer.onNext(version) + } + } + } +} \ No newline at end of file diff --git a/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt b/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt index 908c20c399..e7d9ac38ef 100644 --- a/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt +++ b/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt @@ -1,26 +1,39 @@ package net.corda.node.services.events -import com.google.common.util.concurrent.SettableFuture -import net.corda.core.contracts.* -import net.corda.core.internal.ThreadBox +import co.paralleluniverse.fibers.Suspendable +import co.paralleluniverse.strands.SettableFuture as QuasarSettableFuture +import com.google.common.util.concurrent.ListenableFuture +import com.google.common.util.concurrent.SettableFuture as GuavaSettableFuture +import net.corda.core.contracts.SchedulableState +import net.corda.core.contracts.ScheduledActivity +import net.corda.core.contracts.ScheduledStateRef +import net.corda.core.contracts.StateRef import net.corda.core.crypto.SecureHash import net.corda.core.flows.FlowInitiator import net.corda.core.flows.FlowLogic +import net.corda.core.internal.ThreadBox +import net.corda.core.internal.VisibleForTesting +import net.corda.core.internal.until import net.corda.core.schemas.PersistentStateRef import net.corda.core.serialization.SingletonSerializeAsToken import net.corda.core.utilities.loggerFor import net.corda.core.utilities.trace +import net.corda.node.internal.MutableClock import net.corda.node.services.api.SchedulerService import net.corda.node.services.api.ServiceHubInternal import net.corda.node.services.statemachine.FlowLogicRefFactoryImpl -import net.corda.node.utilities.* +import net.corda.node.utilities.AffinityExecutor +import net.corda.node.utilities.NODE_DATABASE_PREFIX +import net.corda.node.utilities.PersistentMap import org.apache.activemq.artemis.utils.ReusableLatch +import java.time.Clock import java.time.Instant import java.util.* -import java.util.concurrent.Executor -import java.util.concurrent.Executors +import java.util.concurrent.* import javax.annotation.concurrent.ThreadSafe -import javax.persistence.* +import javax.persistence.Column +import javax.persistence.EmbeddedId +import javax.persistence.Entity /** * A first pass of a simple [SchedulerService] that works with [MutableClock]s for testing, demonstrations and simulations @@ -48,6 +61,48 @@ class NodeSchedulerService(private val services: ServiceHubInternal, companion object { private val log = loggerFor() + /** + * Wait until the given [Future] is complete or the deadline is reached, with support for [MutableClock] implementations + * used in demos or testing. This will substitute a Fiber compatible Future so the current + * [co.paralleluniverse.strands.Strand] is not blocked. + * + * @return true if the [Future] is complete, false if the deadline was reached. + */ + // We should try to make the Clock used in our code injectable (for tests etc) and to use the extension below + // to wait in our code, rather than Thread.sleep() or other time-based pauses. + @Suspendable + @VisibleForTesting + // We specify full classpath on SettableFuture to differentiate it from the Quasar class of the same name + fun awaitWithDeadline(clock: Clock, deadline: Instant, future: Future<*> = GuavaSettableFuture.create()): Boolean { + var nanos: Long + do { + val originalFutureCompleted = makeStrandFriendlySettableFuture(future) + val subscription = if (clock is MutableClock) { + clock.mutations.first().subscribe { + originalFutureCompleted.set(false) + } + } else { + null + } + nanos = (clock.instant() until deadline).toNanos() + if (nanos > 0) { + try { + // This will return when it times out, or when the clock mutates or when when the original future completes. + originalFutureCompleted.get(nanos, TimeUnit.NANOSECONDS) + } catch(e: ExecutionException) { + // No need to take action as will fall out of the loop due to future.isDone + } catch(e: CancellationException) { + // No need to take action as will fall out of the loop due to future.isDone + } catch(e: TimeoutException) { + // No need to take action as will fall out of the loop due to future.isDone + } + } + subscription?.unsubscribe() + originalFutureCompleted.cancel(false) + } while (nanos > 0 && !future.isDone) + return future.isDone + } + fun createMap(): PersistentMap { return PersistentMap( toPersistentEntityKey = { PersistentStateRef(it.txhash.toString(), it.index) }, @@ -67,6 +122,21 @@ class NodeSchedulerService(private val services: ServiceHubInternal, persistentEntityClass = PersistentScheduledState::class.java ) } + + /** + * Convert a Guava [ListenableFuture] or JDK8 [CompletableFuture] to Quasar implementation and set to true when a result + * or [Throwable] is available in the original. + * + * We need this so that we do not block the actual thread when calling get(), but instead allow a Quasar context + * switch. There's no need to checkpoint our [Fiber]s as there's no external effect of waiting. + */ + private fun makeStrandFriendlySettableFuture(future: Future) = QuasarSettableFuture().also { g -> + when (future) { + is ListenableFuture -> future.addListener(Runnable { g.set(true) }, Executor { it.run() }) + is CompletionStage<*> -> future.whenComplete { _, _ -> g.set(true) } + else -> throw IllegalArgumentException("Cannot make future $future Strand friendly.") + } + } } @Entity @@ -84,7 +154,7 @@ class NodeSchedulerService(private val services: ServiceHubInternal, var scheduledStatesQueue: PriorityQueue = PriorityQueue( { a, b -> a.scheduledAt.compareTo(b.scheduledAt) } ) - var rescheduled: SettableFuture? = null + var rescheduled: GuavaSettableFuture? = null } private val mutex = ThreadBox(InnerState()) @@ -145,7 +215,7 @@ class NodeSchedulerService(private val services: ServiceHubInternal, // Note, we already have the mutex but we need the scope again here val (scheduledState, ourRescheduledFuture) = mutex.alreadyLocked { rescheduled?.cancel(false) - rescheduled = SettableFuture.create() + rescheduled = GuavaSettableFuture.create() Pair(scheduledStatesQueue.peek(), rescheduled!!) } if (scheduledState != null) { @@ -153,7 +223,7 @@ class NodeSchedulerService(private val services: ServiceHubInternal, log.trace { "Scheduling as next $scheduledState" } // This will block the scheduler single thread until the scheduled time (returns false) OR // the Future is cancelled due to rescheduling (returns true). - if (!services.clock.awaitWithDeadline(scheduledState.scheduledAt, ourRescheduledFuture)) { + if (!awaitWithDeadline(services.clock, scheduledState.scheduledAt, ourRescheduledFuture)) { log.trace { "Invoking as next $scheduledState" } onTimeReached(scheduledState) } else { diff --git a/node/src/main/kotlin/net/corda/node/utilities/ClockUtils.kt b/node/src/main/kotlin/net/corda/node/utilities/ClockUtils.kt deleted file mode 100644 index 44f3d0ec2c..0000000000 --- a/node/src/main/kotlin/net/corda/node/utilities/ClockUtils.kt +++ /dev/null @@ -1,115 +0,0 @@ -package net.corda.node.utilities - -import co.paralleluniverse.fibers.Suspendable -import co.paralleluniverse.strands.SettableFuture -import com.google.common.util.concurrent.ListenableFuture -import net.corda.core.internal.until -import rx.Observable -import rx.Subscriber -import rx.subscriptions.Subscriptions -import java.time.Clock -import java.time.Instant -import java.util.concurrent.* -import java.util.concurrent.atomic.AtomicLong -import com.google.common.util.concurrent.SettableFuture as GuavaSettableFuture - -/** - * The classes and methods in this file allow the use of custom Clocks in demos, simulations and testing - * that might not follow "real time" or "wall clock time". i.e. they allow time to be fast forwarded. - * - * We should try to make the Clock used in our code injectable (for tests etc) and to use the extensions below - * to wait in our code, rather than Thread.sleep() or Object.wait() etc. - */ - -/** - * An abstract class with helper methods for a type of Clock that might have it's concept of "now" - * adjusted externally. - * - * e.g. for testing (so unit tests do not have to wait for timeouts in realtime) or for demos and simulations. - */ -abstract class MutableClock : Clock() { - - private val _version = AtomicLong(0L) - - /** - * This is an observer on the mutation count of this [Clock], which reflects the occurence of mutations. - */ - val mutations: Observable by lazy { - Observable.create({ subscriber: Subscriber -> - if (!subscriber.isUnsubscribed) { - mutationObservers.add(subscriber) - // This is not very intuitive, but subscribing to a subscriber observes unsubscribes. - subscriber.add(Subscriptions.create { mutationObservers.remove(subscriber) }) - } - }) - } - - private val mutationObservers = CopyOnWriteArraySet>() - - /** - * Must be called by subclasses when they mutate (but not just with the passage of time as per the "wall clock"). - */ - protected fun notifyMutationObservers() { - val version = _version.incrementAndGet() - for (observer in mutationObservers) { - if (!observer.isUnsubscribed) { - observer.onNext(version) - } - } - } -} - -/** - * Wait until the given [Future] is complete or the deadline is reached, with support for [MutableClock] implementations - * used in demos or testing. This will substitute a Fiber compatible Future so the current - * [co.paralleluniverse.strands.Strand] is not blocked. - * - * @return true if the [Future] is complete, false if the deadline was reached. - */ -@Suspendable -fun Clock.awaitWithDeadline(deadline: Instant, future: Future<*> = GuavaSettableFuture.create()): Boolean { - var nanos: Long - do { - val originalFutureCompleted = makeStrandFriendlySettableFuture(future) - val subscription = if (this is MutableClock) { - mutations.first().subscribe { - originalFutureCompleted.set(false) - } - } else { - null - } - nanos = (instant() until deadline).toNanos() - if (nanos > 0) { - try { - // This will return when it times out, or when the clock mutates or when when the original future completes. - originalFutureCompleted.get(nanos, TimeUnit.NANOSECONDS) - } catch(e: ExecutionException) { - // No need to take action as will fall out of the loop due to future.isDone - } catch(e: CancellationException) { - // No need to take action as will fall out of the loop due to future.isDone - } catch(e: TimeoutException) { - // No need to take action as will fall out of the loop due to future.isDone - } - } - subscription?.unsubscribe() - originalFutureCompleted.cancel(false) - } while (nanos > 0 && !future.isDone) - return future.isDone -} - -/** - * Convert a Guava [ListenableFuture] or JDK8 [CompletableFuture] to Quasar implementation and set to true when a result - * or [Throwable] is available in the original. - * - * We need this so that we do not block the actual thread when calling get(), but instead allow a Quasar context - * switch. There's no need to checkpoint our Fibers as there's no external effect of waiting. - */ -private fun makeStrandFriendlySettableFuture(future: Future) = SettableFuture().also { g -> - when (future) { - is ListenableFuture -> future.addListener(Runnable { g.set(true) }, Executor { it.run() }) - is CompletionStage<*> -> future.whenComplete { _, _ -> g.set(true) } - else -> throw IllegalArgumentException("Cannot make future $future Fiber friendly.") - } -} - - diff --git a/node/src/main/kotlin/net/corda/node/utilities/TestClock.kt b/node/src/main/kotlin/net/corda/node/utilities/TestClock.kt index 3d1c57d312..e582f45147 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/TestClock.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/TestClock.kt @@ -4,6 +4,7 @@ import net.corda.core.internal.until import net.corda.core.serialization.SerializeAsToken import net.corda.core.serialization.SerializeAsTokenContext import net.corda.core.serialization.SingletonSerializationToken.Companion.singletonSerializationToken +import net.corda.node.internal.MutableClock import java.time.Clock import java.time.Instant import java.time.LocalDate diff --git a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt index df17f414c2..a920256da3 100644 --- a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt @@ -1,7 +1,6 @@ package net.corda.node.services.events import net.corda.core.contracts.* -import net.corda.core.utilities.days import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowLogicRef import net.corda.core.flows.FlowLogicRefFactory @@ -10,11 +9,10 @@ import net.corda.core.node.ServiceHub import net.corda.core.node.services.VaultService import net.corda.core.serialization.SingletonSerializeAsToken import net.corda.core.transactions.TransactionBuilder +import net.corda.core.utilities.days import net.corda.node.services.MockServiceHubInternal -import net.corda.node.services.database.HibernateConfiguration import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.services.persistence.DBCheckpointStorage -import net.corda.node.services.schema.NodeSchemaService import net.corda.node.services.statemachine.FlowLogicRefFactoryImpl import net.corda.node.services.statemachine.StateMachineManager import net.corda.node.services.vault.NodeVaultService @@ -22,10 +20,8 @@ import net.corda.node.utilities.AffinityExecutor import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase import net.corda.testing.* -import net.corda.testing.node.InMemoryMessagingNetwork -import net.corda.testing.node.MockKeyManagementService import net.corda.testing.node.* -import net.corda.testing.node.TestClock +import net.corda.testing.node.InMemoryMessagingNetwork import org.assertj.core.api.Assertions.assertThat import org.bouncycastle.asn1.x500.X500Name import org.junit.After diff --git a/node/src/test/kotlin/net/corda/node/utilities/ClockUtilsTest.kt b/node/src/test/kotlin/net/corda/node/utilities/ClockUtilsTest.kt index 23723f70f2..783564a664 100644 --- a/node/src/test/kotlin/net/corda/node/utilities/ClockUtilsTest.kt +++ b/node/src/test/kotlin/net/corda/node/utilities/ClockUtilsTest.kt @@ -8,6 +8,7 @@ import com.google.common.util.concurrent.SettableFuture import net.corda.core.utilities.getOrThrow import net.corda.core.utilities.hours import net.corda.core.utilities.minutes +import net.corda.node.services.events.NodeSchedulerService import net.corda.testing.node.TestClock import org.junit.After import org.junit.Before @@ -41,24 +42,24 @@ class ClockUtilsTest { @Test fun `test waiting no time for a deadline`() { - assertFalse(stoppedClock.awaitWithDeadline(stoppedClock.instant()), "Should have reached deadline") + assertFalse(NodeSchedulerService.awaitWithDeadline(stoppedClock, stoppedClock.instant()), "Should have reached deadline") } @Test fun `test waiting negative time for a deadline`() { - assertFalse(stoppedClock.awaitWithDeadline(stoppedClock.instant().minus(1.hours)), "Should have reached deadline") + assertFalse(NodeSchedulerService.awaitWithDeadline(stoppedClock, stoppedClock.instant().minus(1.hours)), "Should have reached deadline") } @Test fun `test waiting no time for a deadline with incomplete future`() { val future = SettableFuture.create() - assertFalse(stoppedClock.awaitWithDeadline(stoppedClock.instant(), future), "Should have reached deadline") + assertFalse(NodeSchedulerService.awaitWithDeadline(stoppedClock, stoppedClock.instant(), future), "Should have reached deadline") } @Test fun `test waiting negative time for a deadline with incomplete future`() { val future = SettableFuture.create() - assertFalse(stoppedClock.awaitWithDeadline(stoppedClock.instant().minus(1.hours), future), "Should have reached deadline") + assertFalse(NodeSchedulerService.awaitWithDeadline(stoppedClock, stoppedClock.instant().minus(1.hours), future), "Should have reached deadline") } @@ -67,7 +68,7 @@ class ClockUtilsTest { val advancedClock = Clock.offset(stoppedClock, 1.hours) val future = SettableFuture.create() completeNow(future) - assertTrue(stoppedClock.awaitWithDeadline(advancedClock.instant(), future), "Should not have reached deadline") + assertTrue(NodeSchedulerService.awaitWithDeadline(stoppedClock, advancedClock.instant(), future), "Should not have reached deadline") } @Test @@ -75,7 +76,7 @@ class ClockUtilsTest { val advancedClock = Clock.offset(stoppedClock, 1.hours) val future = SettableFuture.create() completeAfterWaiting(future) - assertTrue(stoppedClock.awaitWithDeadline(advancedClock.instant(), future), "Should not have reached deadline") + assertTrue(NodeSchedulerService.awaitWithDeadline(stoppedClock, advancedClock.instant(), future), "Should not have reached deadline") } @Test @@ -83,7 +84,7 @@ class ClockUtilsTest { val advancedClock = Clock.offset(stoppedClock, 1.hours) val testClock = TestClock(stoppedClock) advanceClockAfterWait(testClock, 1.hours) - assertFalse(testClock.awaitWithDeadline(advancedClock.instant()), "Should have reached deadline") + assertFalse(NodeSchedulerService.awaitWithDeadline(testClock, advancedClock.instant()), "Should have reached deadline") } @Test @@ -92,7 +93,7 @@ class ClockUtilsTest { val testClock = TestClock(stoppedClock) val future = SettableFuture.create() advanceClockAfterWait(testClock, 1.hours) - assertFalse(testClock.awaitWithDeadline(advancedClock.instant(), future), "Should have reached deadline") + assertFalse(NodeSchedulerService.awaitWithDeadline(testClock, advancedClock.instant(), future), "Should have reached deadline") } @Test @@ -102,7 +103,7 @@ class ClockUtilsTest { val future = SettableFuture.create() advanceClockAfterWait(testClock, 1.hours) completeAfterWaiting(future) - assertTrue(testClock.awaitWithDeadline(advancedClock.instant(), future), "Should not have reached deadline") + assertTrue(NodeSchedulerService.awaitWithDeadline(testClock, advancedClock.instant(), future), "Should not have reached deadline") } @Test @@ -113,7 +114,7 @@ class ClockUtilsTest { for (advance in 1..6) { advanceClockAfterWait(testClock, 10.minutes) } - assertFalse(testClock.awaitWithDeadline(advancedClock.instant(), future), "Should have reached deadline") + assertFalse(NodeSchedulerService.awaitWithDeadline(testClock, advancedClock.instant(), future), "Should have reached deadline") } @Test @@ -131,7 +132,7 @@ class ClockUtilsTest { val advancedClock = Clock.offset(stoppedClock, 10.hours) try { - testClock.awaitWithDeadline(advancedClock.instant(), SettableFuture.create()) + NodeSchedulerService.awaitWithDeadline(testClock, advancedClock.instant(), SettableFuture.create()) fail("Expected InterruptedException") } catch (exception: InterruptedException) { } @@ -145,7 +146,7 @@ class ClockUtilsTest { val future = CompletableFuture() val scheduler = FiberExecutorScheduler("test", executor) val fiber = scheduler.newFiber(@Suspendable { - future.complete(testClock.awaitWithDeadline(advancedClock.instant(), future)) + future.complete(NodeSchedulerService.awaitWithDeadline(testClock, advancedClock.instant(), future)) }).start() for (advance in 1..6) { scheduler.newFiber(@Suspendable { @@ -167,7 +168,7 @@ class ClockUtilsTest { val future = SettableFuture.create() val scheduler = FiberExecutorScheduler("test", executor) val fiber = scheduler.newFiber(@Suspendable { - future.set(testClock.awaitWithDeadline(advancedClock.instant(), future)) + future.set(NodeSchedulerService.awaitWithDeadline(testClock, advancedClock.instant(), future)) }).start() for (advance in 1..6) { scheduler.newFiber(@Suspendable { diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/TestClock.kt b/test-utils/src/main/kotlin/net/corda/testing/node/TestClock.kt index d0303085d8..690f765c3d 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/TestClock.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/TestClock.kt @@ -4,8 +4,7 @@ import net.corda.core.internal.until import net.corda.core.serialization.SerializeAsToken import net.corda.core.serialization.SerializeAsTokenContext import net.corda.core.serialization.SingletonSerializationToken.Companion.singletonSerializationToken -import net.corda.core.internal.until -import net.corda.node.utilities.MutableClock +import net.corda.node.internal.MutableClock import java.time.Clock import java.time.Duration import java.time.Instant From f5776d6bd7699bdb3ae0a599b21c8ae35d81a3cd Mon Sep 17 00:00:00 2001 From: Andrius Dagys Date: Mon, 7 Aug 2017 12:26:48 +0100 Subject: [PATCH 008/120] Enforce transaction validity rules --- .../kotlin/net/corda/core/transactions/BaseTransaction.kt | 4 ++-- .../kotlin/net/corda/core/transactions/WireTransaction.kt | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/transactions/BaseTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/BaseTransaction.kt index 276415b041..da0d98dbe7 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/BaseTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/BaseTransaction.kt @@ -27,8 +27,8 @@ abstract class BaseTransaction : NamedByHash { } private fun checkNotarySetIfInputsPresent() { - if (notary == null) { - check(inputs.isEmpty()) { "The notary must be specified explicitly for any transaction that has inputs" } + if (inputs.isNotEmpty()) { + check(notary != null) { "The notary must be specified explicitly for any transaction that has inputs" } } } diff --git a/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt index c3492655f1..7d2e382f2d 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt @@ -33,8 +33,9 @@ data class WireTransaction( ) : CoreTransaction(), TraversableTransaction { init { checkBaseInvariants() + check(inputs.isNotEmpty() || outputs.isNotEmpty()) { "A transaction must contain at least one input or output state" } + check(commands.isNotEmpty()) { "A transaction must contain at least one command" } if (timeWindow != null) check(notary != null) { "Transactions with time-windows must be notarised" } - check(availableComponents.isNotEmpty()) { "A WireTransaction cannot be empty" } } /** The transaction id is represented by the root hash of Merkle tree over the transaction components. */ From 73664c3383f84ff00852809bb982809201d1562c Mon Sep 17 00:00:00 2001 From: Andrius Dagys Date: Wed, 9 Aug 2017 16:17:26 +0100 Subject: [PATCH 009/120] Test DSL: update tests to handle new transaction constraints --- .../net/corda/core/contracts/Structures.kt | 2 +- .../net/corda/finance/contracts/universal/Cap.kt | 2 -- .../corda/finance/contracts/universal/Caplet.kt | 2 -- .../contracts/universal/FXFwdTimeOption.kt | 2 -- .../corda/finance/contracts/universal/FXSwap.kt | 2 -- .../net/corda/finance/contracts/universal/IRS.kt | 2 -- .../finance/contracts/universal/RollOutTests.kt | 2 -- .../finance/contracts/universal/Swaption.kt | 2 -- .../contracts/universal/ZeroCouponBond.kt | 3 --- .../finance/contracts/asset/CashTestsJava.java | 6 ++++-- .../corda/finance/contracts/asset/CashTests.kt | 14 +++++++++++--- .../src/main/kotlin/net/corda/testing/TestDSL.kt | 16 ++++++++++++++++ .../corda/testing/TransactionDSLInterpreter.kt | 3 --- 13 files changed, 32 insertions(+), 26 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/contracts/Structures.kt b/core/src/main/kotlin/net/corda/core/contracts/Structures.kt index a877e98b9f..c54a779595 100644 --- a/core/src/main/kotlin/net/corda/core/contracts/Structures.kt +++ b/core/src/main/kotlin/net/corda/core/contracts/Structures.kt @@ -289,7 +289,7 @@ abstract class TypeOnlyCommandData : CommandData { data class Command(val value: T, val signers: List) { // TODO Introduce NonEmptyList? init { - require(signers.isNotEmpty()) + require(signers.isNotEmpty()) { "The list of signers cannot be empty" } } constructor(data: T, key: PublicKey) : this(data, listOf(key)) diff --git a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Cap.kt b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Cap.kt index e4fa27ae78..91740eb915 100644 --- a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Cap.kt +++ b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Cap.kt @@ -169,8 +169,6 @@ class Cap { output { stateInitial } timeWindow(TEST_TX_TIME_1) - this `fails with` "transaction has a single command" - tweak { command(acmeCorp.owningKey) { UniversalContract.Commands.Issue() } this `fails with` "the transaction is signed by all liable parties" diff --git a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Caplet.kt b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Caplet.kt index 99d75414f9..908ef49061 100644 --- a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Caplet.kt +++ b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Caplet.kt @@ -56,8 +56,6 @@ class Caplet { output { stateStart } timeWindow(TEST_TX_TIME_1) - this `fails with` "transaction has a single command" - tweak { command(acmeCorp.owningKey) { UniversalContract.Commands.Issue() } this `fails with` "the transaction is signed by all liable parties" diff --git a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/FXFwdTimeOption.kt b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/FXFwdTimeOption.kt index df72fddfa5..4e76908c77 100644 --- a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/FXFwdTimeOption.kt +++ b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/FXFwdTimeOption.kt @@ -53,8 +53,6 @@ class FXFwdTimeOption output { inState } timeWindow(TEST_TX_TIME_1) - this `fails with` "transaction has a single command" - tweak { command(acmeCorp.owningKey) { UniversalContract.Commands.Issue() } this `fails with` "the transaction is signed by all liable parties" diff --git a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/FXSwap.kt b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/FXSwap.kt index ae9a4b822e..a34239017e 100644 --- a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/FXSwap.kt +++ b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/FXSwap.kt @@ -45,8 +45,6 @@ class FXSwap { output { inState } timeWindow(TEST_TX_TIME_1) - this `fails with` "transaction has a single command" - tweak { command(acmeCorp.owningKey) { UniversalContract.Commands.Issue() } this `fails with` "the transaction is signed by all liable parties" diff --git a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/IRS.kt b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/IRS.kt index e64850cf99..9427a9f087 100644 --- a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/IRS.kt +++ b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/IRS.kt @@ -136,8 +136,6 @@ class IRS { output { stateInitial } timeWindow(TEST_TX_TIME_1) - this `fails with` "transaction has a single command" - tweak { command(acmeCorp.owningKey) { UniversalContract.Commands.Issue() } this `fails with` "the transaction is signed by all liable parties" diff --git a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/RollOutTests.kt b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/RollOutTests.kt index 4db190640d..31d18cd810 100644 --- a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/RollOutTests.kt +++ b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/RollOutTests.kt @@ -145,8 +145,6 @@ class RollOutTests { output { stateStart } timeWindow(TEST_TX_TIME_1) - this `fails with` "transaction has a single command" - tweak { command(acmeCorp.owningKey) { UniversalContract.Commands.Issue() } this `fails with` "the transaction is signed by all liable parties" diff --git a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Swaption.kt b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Swaption.kt index 5a29086fae..270e807f84 100644 --- a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Swaption.kt +++ b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/Swaption.kt @@ -62,8 +62,6 @@ class Swaption { output { stateInitial } timeWindow(TEST_TX_TIME_1) - this `fails with` "transaction has a single command" - tweak { command(acmeCorp.owningKey) { UniversalContract.Commands.Issue() } this `fails with` "the transaction is signed by all liable parties" diff --git a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/ZeroCouponBond.kt b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/ZeroCouponBond.kt index 7590505327..c208128996 100644 --- a/experimental/src/test/kotlin/net/corda/finance/contracts/universal/ZeroCouponBond.kt +++ b/experimental/src/test/kotlin/net/corda/finance/contracts/universal/ZeroCouponBond.kt @@ -48,12 +48,9 @@ class ZeroCouponBond { @Test fun `issue - signature`() { - transaction { output { inState } - this `fails with` "transaction has a single command" - tweak { command(acmeCorp.owningKey) { UniversalContract.Commands.Issue() } this `fails with` "the transaction is signed by all liable parties" diff --git a/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java b/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java index e1f8d92f9c..7349aa11e7 100644 --- a/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java +++ b/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java @@ -4,6 +4,7 @@ import kotlin.Unit; import net.corda.core.contracts.PartyAndReference; import net.corda.core.identity.AnonymousParty; import net.corda.core.utilities.OpaqueBytes; +import net.corda.testing.DummyCommandData; import org.junit.Test; import static net.corda.finance.CurrencyUtils.DOLLARS; @@ -24,16 +25,17 @@ public class CashTestsJava { ledger(lg -> { lg.transaction(tx -> { tx.input(inState); - tx.failsWith("the amounts balance"); tx.tweak(tw -> { tw.output(new Cash.State(issuedBy(DOLLARS(2000), defaultIssuer), new AnonymousParty(getMINI_CORP_PUBKEY()))); + tw.command(getMEGA_CORP_PUBKEY(), new Cash.Commands.Move()); return tw.failsWith("the amounts balance"); }); tx.tweak(tw -> { tw.output(outState); - // No command arguments + tw.command(getMEGA_CORP_PUBKEY(), DummyCommandData.INSTANCE); + // Invalid command return tw.failsWith("required net.corda.finance.contracts.asset.Cash.Commands.Move command"); }); tx.tweak(tw -> { diff --git a/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt b/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt index 2f4227472c..fc8b14791c 100644 --- a/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt +++ b/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt @@ -85,15 +85,16 @@ class CashTests : TestDependencyInjectionBase() { fun trivial() { transaction { input { inState } - this `fails with` "the amounts balance" tweak { output { outState.copy(amount = 2000.DOLLARS `issued by` defaultIssuer) } + command(ALICE_PUBKEY) { Cash.Commands.Move() } this `fails with` "the amounts balance" } tweak { output { outState } - // No command arguments + command(ALICE_PUBKEY) { DummyCommandData } + // Invalid command this `fails with` "required net.corda.finance.contracts.asset.Cash.Commands.Move command" } tweak { @@ -279,12 +280,14 @@ class CashTests : TestDependencyInjectionBase() { transaction { input { inState } input { inState.copy(amount = 0.DOLLARS `issued by` defaultIssuer) } + command(ALICE_PUBKEY) { Cash.Commands.Move() } this `fails with` "zero sized inputs" } transaction { input { inState } output { inState } output { inState.copy(amount = 0.DOLLARS `issued by` defaultIssuer) } + command(ALICE_PUBKEY) { Cash.Commands.Move() } this `fails with` "zero sized outputs" } } @@ -295,6 +298,7 @@ class CashTests : TestDependencyInjectionBase() { transaction { input { inState } output { outState `issued by` MINI_CORP } + command(ALICE_PUBKEY) { Cash.Commands.Move() } this `fails with` "the amounts balance" } // Can't change deposit reference when splitting. @@ -302,6 +306,7 @@ class CashTests : TestDependencyInjectionBase() { val splits2 = inState.amount.splitEvenly(2) input { inState } for (i in 0..1) output { outState.copy(amount = splits2[i]).editDepositRef(i.toByte()) } + command(ALICE_PUBKEY) { Cash.Commands.Move() } this `fails with` "the amounts balance" } // Can't mix currencies. @@ -309,6 +314,7 @@ class CashTests : TestDependencyInjectionBase() { input { inState } output { outState.copy(amount = 800.DOLLARS `issued by` defaultIssuer) } output { outState.copy(amount = 200.POUNDS `issued by` defaultIssuer) } + command(ALICE_PUBKEY) { Cash.Commands.Move() } this `fails with` "the amounts balance" } transaction { @@ -320,6 +326,7 @@ class CashTests : TestDependencyInjectionBase() { ) } output { outState.copy(amount = 1150.DOLLARS `issued by` defaultIssuer) } + command(ALICE_PUBKEY) { Cash.Commands.Move() } this `fails with` "the amounts balance" } // Can't have superfluous input states from different issuers. @@ -335,6 +342,7 @@ class CashTests : TestDependencyInjectionBase() { input { inState } input { inState.editDepositRef(3) } output { outState.copy(amount = inState.amount * 2).editDepositRef(3) } + command(ALICE_PUBKEY) { Cash.Commands.Move() } this `fails with` "for reference [01]" } } @@ -404,6 +412,7 @@ class CashTests : TestDependencyInjectionBase() { // Gather 2000 dollars from two different issuers. input { inState } input { inState `issued by` MINI_CORP } + command(ALICE_PUBKEY) { Cash.Commands.Move() } // Can't merge them together. tweak { @@ -420,7 +429,6 @@ class CashTests : TestDependencyInjectionBase() { // This works. output { inState.copy(owner = AnonymousParty(BOB_PUBKEY)) } output { inState.copy(owner = AnonymousParty(BOB_PUBKEY)) `issued by` MINI_CORP } - command(ALICE_PUBKEY) { Cash.Commands.Move() } this.verifies() } } diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt b/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt index d3dd0e6bfb..55ac446238 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt @@ -9,6 +9,7 @@ import net.corda.core.node.ServiceHub import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder import net.corda.core.transactions.WireTransaction +import net.corda.testing.contracts.DummyContract import java.io.InputStream import java.security.KeyPair import java.security.PublicKey @@ -247,6 +248,7 @@ data class TestLedgerDSLInterpreter private constructor( ): WireTransaction { val transactionLocation = getCallerLocation() val transactionInterpreter = interpretTransactionDsl(transactionBuilder, dsl) + makeTxValid(transactionBuilder) // Create the WireTransaction val wireTransaction = transactionInterpreter.toWireTransaction() // Record the output states @@ -262,6 +264,20 @@ data class TestLedgerDSLInterpreter private constructor( return wireTransaction } + /** + * This method fills the transaction builder with dummy components to satisfy the base transaction validity rules. + * + * A common pattern in our tests is using a base transaction and expressing the test cases using [tweak]s. + * The base transaction may not be valid, but it still gets recorded to the ledger. This causes a test failure, + * even though is not being used for anything afterwards. + */ + private fun makeTxValid(transactionBuilder: TransactionBuilder) { + if (transactionBuilder.commands().isEmpty()) transactionBuilder.addCommand(dummyCommand()) + if (transactionBuilder.inputStates().isEmpty() && transactionBuilder.outputStates().isEmpty()) { + transactionBuilder.addOutputState(DummyContract.SingleOwnerState(owner = ALICE)) + } + } + override fun _transaction( transactionLabel: String?, transactionBuilder: TransactionBuilder, diff --git a/test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt b/test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt index 92b9604350..544d050f54 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt @@ -78,9 +78,6 @@ class TransactionDSL(val interpreter: T) : Tr fun input(state: ContractState) { val transaction = ledgerInterpreter._unverifiedTransaction(null, TransactionBuilder(notary = DUMMY_NOTARY)) { output { state } - // Add a dummy randomised output so that the transaction id differs when issuing the same state multiple times - val nonceState = DummyContract.SingleOwnerState(Random().nextInt(), DUMMY_NOTARY) - output { nonceState } } input(transaction.outRef(0).ref) } From 65a59f680b919856b35738693507f75560e840b3 Mon Sep 17 00:00:00 2001 From: Andrius Dagys Date: Wed, 16 Aug 2017 12:19:36 +0100 Subject: [PATCH 010/120] Update integration tests to handle new transaction constraints --- .../node/services/BFTNotaryServiceTests.kt | 25 +++++++++++-------- .../node/services/RaftNotaryServiceTests.kt | 14 +++++++---- .../statemachine/LargeTransactionsTest.kt | 6 ++--- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt index bba066f2be..33d33d4740 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt @@ -3,14 +3,14 @@ package net.corda.node.services import com.nhaarman.mockito_kotlin.whenever import net.corda.core.contracts.ContractState import net.corda.core.contracts.StateRef -import net.corda.core.crypto.SecureHash import net.corda.core.crypto.composite.CompositeKey -import net.corda.core.internal.div import net.corda.core.flows.NotaryError import net.corda.core.flows.NotaryException import net.corda.core.flows.NotaryFlow import net.corda.core.identity.Party +import net.corda.core.internal.div import net.corda.core.node.services.ServiceInfo +import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.Try @@ -23,6 +23,7 @@ import net.corda.node.services.transactions.minClusterSize import net.corda.node.services.transactions.minCorrectReplicas import net.corda.node.utilities.ServiceIdentityGenerator import net.corda.testing.contracts.DummyContract +import net.corda.testing.dummyCommand import net.corda.testing.node.MockNetwork import org.bouncycastle.asn1.x500.X500Name import org.junit.After @@ -70,7 +71,9 @@ class BFTNotaryServiceTests { fun `all replicas start even if there is a new consensus during startup`() { val notary = bftNotaryCluster(minClusterSize(1), true) // This true adds a sleep to expose the race. val f = node.run { - val trivialTx = signInitialTransaction(notary) {} + val trivialTx = signInitialTransaction(notary) { + addOutputState(DummyContract.SingleOwnerState(owner = info.legalIdentity)) + } // Create a new consensus while the redundant replica is sleeping: services.startFlow(NotaryFlow.Client(trivialTx)).resultFuture } @@ -99,7 +102,7 @@ class BFTNotaryServiceTests { services.recordTransactions(issueTx) } val spendTxs = (1..10).map { - signInitialTransaction(notary, true) { + signInitialTransaction(notary) { addInputState(issueTx.tx.outRef(0)) } } @@ -137,11 +140,11 @@ class BFTNotaryServiceTests { private fun AbstractNode.signInitialTransaction( notary: Party, - makeUnique: Boolean = false, block: TransactionBuilder.() -> Any? -) = services.signInitialTransaction(TransactionBuilder(notary).apply { - block() - if (makeUnique) { - addAttachment(SecureHash.randomSHA256()) - } -}) +): SignedTransaction { + return services.signInitialTransaction( + TransactionBuilder(notary).apply { + addCommand(dummyCommand(services.legalIdentityKey)) + block() + }) +} diff --git a/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt index b999da66d2..a91edb17aa 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt @@ -2,17 +2,18 @@ package net.corda.node.services import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.StateRef -import net.corda.testing.contracts.DummyContract -import net.corda.core.identity.Party -import net.corda.testing.DUMMY_BANK_A import net.corda.core.flows.NotaryError import net.corda.core.flows.NotaryException import net.corda.core.flows.NotaryFlow +import net.corda.core.identity.Party import net.corda.core.internal.concurrent.map import net.corda.core.internal.concurrent.transpose -import net.corda.core.utilities.getOrThrow import net.corda.core.transactions.TransactionBuilder +import net.corda.core.utilities.getOrThrow import net.corda.node.internal.AbstractNode +import net.corda.testing.DUMMY_BANK_A +import net.corda.testing.contracts.DummyContract +import net.corda.testing.dummyCommand import net.corda.testing.node.NodeBasedTest import org.bouncycastle.asn1.x500.X500Name import org.junit.Test @@ -34,7 +35,9 @@ class RaftNotaryServiceTests : NodeBasedTest() { val inputState = issueState(bankA, notaryParty) - val firstTxBuilder = TransactionBuilder(notaryParty).withItems(inputState) + val firstTxBuilder = TransactionBuilder(notaryParty) + .addInputState(inputState) + .addCommand(dummyCommand(bankA.services.legalIdentityKey)) val firstSpendTx = bankA.services.signInitialTransaction(firstTxBuilder) val firstSpend = bankA.services.startFlow(NotaryFlow.Client(firstSpendTx)) @@ -43,6 +46,7 @@ class RaftNotaryServiceTests : NodeBasedTest() { val secondSpendBuilder = TransactionBuilder(notaryParty).withItems(inputState).run { val dummyState = DummyContract.SingleOwnerState(0, bankA.info.legalIdentity) addOutputState(dummyState) + addCommand(dummyCommand(bankA.services.legalIdentityKey)) this } val secondSpendTx = bankA.services.signInitialTransaction(secondSpendBuilder) diff --git a/node/src/integration-test/kotlin/net/corda/node/services/statemachine/LargeTransactionsTest.kt b/node/src/integration-test/kotlin/net/corda/node/services/statemachine/LargeTransactionsTest.kt index caf80073d6..cf0e136b88 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/statemachine/LargeTransactionsTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/statemachine/LargeTransactionsTest.kt @@ -1,19 +1,18 @@ package net.corda.node.services.statemachine import co.paralleluniverse.fibers.Suspendable -import net.corda.core.internal.InputStreamAndHash import net.corda.core.crypto.SecureHash import net.corda.core.flows.* import net.corda.core.identity.Party +import net.corda.core.internal.InputStreamAndHash import net.corda.core.messaging.startFlow -import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder -import net.corda.core.utilities.unwrap import net.corda.testing.BOB import net.corda.testing.DUMMY_NOTARY import net.corda.testing.aliceBobAndNotary import net.corda.testing.contracts.DummyState import net.corda.testing.driver.driver +import net.corda.testing.dummyCommand import org.junit.Test import kotlin.test.assertEquals @@ -28,6 +27,7 @@ class LargeTransactionsTest { override fun call() { val tx = TransactionBuilder(notary = DUMMY_NOTARY) .addOutputState(DummyState()) + .addCommand(dummyCommand(serviceHub.legalIdentityKey)) .addAttachment(hash1) .addAttachment(hash2) .addAttachment(hash3) From 210cb4658a4a410e746c449ed9167fe5aee17067 Mon Sep 17 00:00:00 2001 From: Andrius Dagys Date: Fri, 25 Aug 2017 11:03:44 +0100 Subject: [PATCH 011/120] Test DSL: only "unverified" transactions get filled with dummy data to make them valid WireTransactions. Recording is removed for a ledger with a single transaction. --- .../contracts/asset/CashTestsJava.java | 70 +++++++++---------- .../kotlin/net/corda/testing/CoreTestUtils.kt | 4 +- .../main/kotlin/net/corda/testing/TestDSL.kt | 10 +-- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java b/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java index 7349aa11e7..9ae136d9dd 100644 --- a/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java +++ b/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java @@ -1,6 +1,5 @@ package net.corda.finance.contracts.asset; -import kotlin.Unit; import net.corda.core.contracts.PartyAndReference; import net.corda.core.identity.AnonymousParty; import net.corda.core.utilities.OpaqueBytes; @@ -22,44 +21,41 @@ public class CashTestsJava { @Test public void trivial() { - ledger(lg -> { - lg.transaction(tx -> { - tx.input(inState); + transaction(tx -> { + tx.input(inState); - tx.tweak(tw -> { - tw.output(new Cash.State(issuedBy(DOLLARS(2000), defaultIssuer), new AnonymousParty(getMINI_CORP_PUBKEY()))); - tw.command(getMEGA_CORP_PUBKEY(), new Cash.Commands.Move()); - return tw.failsWith("the amounts balance"); - }); - - tx.tweak(tw -> { - tw.output(outState); - tw.command(getMEGA_CORP_PUBKEY(), DummyCommandData.INSTANCE); - // Invalid command - return tw.failsWith("required net.corda.finance.contracts.asset.Cash.Commands.Move command"); - }); - tx.tweak(tw -> { - tw.output(outState); - tw.command(getMINI_CORP_PUBKEY(), new Cash.Commands.Move()); - return tw.failsWith("the owning keys are a subset of the signing keys"); - }); - tx.tweak(tw -> { - tw.output(outState); - // issuedBy() can't be directly imported because it conflicts with other identically named functions - // with different overloads (for some reason). - tw.output(outState.issuedBy(getMINI_CORP())); - tw.command(getMEGA_CORP_PUBKEY(), new Cash.Commands.Move()); - return tw.failsWith("at least one cash input"); - }); - - // Simple reallocation works. - return tx.tweak(tw -> { - tw.output(outState); - tw.command(getMEGA_CORP_PUBKEY(), new Cash.Commands.Move()); - return tw.verifies(); - }); + tx.tweak(tw -> { + tw.output(new Cash.State(issuedBy(DOLLARS(2000), defaultIssuer), new AnonymousParty(getMINI_CORP_PUBKEY()))); + tw.command(getMEGA_CORP_PUBKEY(), new Cash.Commands.Move()); + return tw.failsWith("the amounts balance"); + }); + + tx.tweak(tw -> { + tw.output(outState); + tw.command(getMEGA_CORP_PUBKEY(), DummyCommandData.INSTANCE); + // Invalid command + return tw.failsWith("required net.corda.finance.contracts.asset.Cash.Commands.Move command"); + }); + tx.tweak(tw -> { + tw.output(outState); + tw.command(getMINI_CORP_PUBKEY(), new Cash.Commands.Move()); + return tw.failsWith("the owning keys are a subset of the signing keys"); + }); + tx.tweak(tw -> { + tw.output(outState); + // issuedBy() can't be directly imported because it conflicts with other identically named functions + // with different overloads (for some reason). + tw.output(outState.issuedBy(getMINI_CORP())); + tw.command(getMEGA_CORP_PUBKEY(), new Cash.Commands.Move()); + return tw.failsWith("at least one cash input"); + }); + + // Simple reallocation works. + return tx.tweak(tw -> { + tw.output(outState); + tw.command(getMEGA_CORP_PUBKEY(), new Cash.Commands.Move()); + return tw.verifies(); }); - return Unit.INSTANCE; }); } } diff --git a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt index 127ea3b186..59adf96b04 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt @@ -155,7 +155,9 @@ fun getFreeLocalPorts(hostName: String, numberToAlloc: Int): List.() -> EnforceVerifyOrFail -) = ledger(initialiseSerialization = initialiseSerialization) { this.transaction(transactionLabel, transactionBuilder, dsl) } +) = ledger(initialiseSerialization = initialiseSerialization) { + dsl(TransactionDSL(TestTransactionDSLInterpreter(this.interpreter, transactionBuilder))) +} fun testNodeConfiguration( baseDirectory: Path, diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt b/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt index 55ac446238..6f20725bbb 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt @@ -244,11 +244,13 @@ data class TestLedgerDSLInterpreter private constructor( transactionLabel: String?, transactionBuilder: TransactionBuilder, dsl: TransactionDSL.() -> R, - transactionMap: HashMap = HashMap() + transactionMap: HashMap = HashMap(), + /** If set to true, will add dummy components to [transactionBuilder] to make it valid. */ + fillTransaction: Boolean = false ): WireTransaction { val transactionLocation = getCallerLocation() val transactionInterpreter = interpretTransactionDsl(transactionBuilder, dsl) - makeTxValid(transactionBuilder) + if (fillTransaction) fillTransaction(transactionBuilder) // Create the WireTransaction val wireTransaction = transactionInterpreter.toWireTransaction() // Record the output states @@ -271,7 +273,7 @@ data class TestLedgerDSLInterpreter private constructor( * The base transaction may not be valid, but it still gets recorded to the ledger. This causes a test failure, * even though is not being used for anything afterwards. */ - private fun makeTxValid(transactionBuilder: TransactionBuilder) { + private fun fillTransaction(transactionBuilder: TransactionBuilder) { if (transactionBuilder.commands().isEmpty()) transactionBuilder.addCommand(dummyCommand()) if (transactionBuilder.inputStates().isEmpty() && transactionBuilder.outputStates().isEmpty()) { transactionBuilder.addOutputState(DummyContract.SingleOwnerState(owner = ALICE)) @@ -288,7 +290,7 @@ data class TestLedgerDSLInterpreter private constructor( transactionLabel: String?, transactionBuilder: TransactionBuilder, dsl: TransactionDSL.() -> Unit - ) = recordTransactionWithTransactionMap(transactionLabel, transactionBuilder, dsl, nonVerifiedTransactionWithLocations) + ) = recordTransactionWithTransactionMap(transactionLabel, transactionBuilder, dsl, nonVerifiedTransactionWithLocations, fillTransaction = true) override fun tweak( dsl: LedgerDSL Date: Fri, 25 Aug 2017 14:49:37 +0100 Subject: [PATCH 012/120] AttachmentDemo: Make sure the demo transaction is valid under new constraints --- .../kotlin/net/corda/attachmentdemo/AttachmentDemo.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/AttachmentDemo.kt b/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/AttachmentDemo.kt index adc945e56b..c883411e67 100644 --- a/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/AttachmentDemo.kt +++ b/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/AttachmentDemo.kt @@ -6,6 +6,7 @@ import net.corda.client.rpc.CordaRPCClient import net.corda.core.concurrent.CordaFuture import net.corda.core.contracts.Contract import net.corda.core.contracts.ContractState +import net.corda.core.contracts.TypeOnlyCommandData import net.corda.core.crypto.SecureHash import net.corda.core.flows.FinalityFlow import net.corda.core.flows.FlowLogic @@ -115,8 +116,9 @@ class AttachmentDemoFlow(val otherSide: Party, val notary: Party, val hash: Secu override fun call(): SignedTransaction { // Create a trivial transaction with an output that describes the attachment, and the attachment itself val ptx = TransactionBuilder(notary) - ptx.addOutputState(AttachmentContract.State(hash)) - ptx.addAttachment(hash) + .addOutputState(AttachmentContract.State(hash)) + .addCommand(AttachmentContract.Command, serviceHub.legalIdentityKey) + .addAttachment(hash) progressTracker.currentStep = SIGNING @@ -183,6 +185,8 @@ class AttachmentContract : Contract { require(state.hash == attachment.id) } + object Command : TypeOnlyCommandData() + data class State(val hash: SecureHash.SHA256) : ContractState { override val contract: Contract = AttachmentContract() override val participants: List = emptyList() From 9664954920751d38806fb263a745d7b751f4f5d9 Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Tue, 29 Aug 2017 17:31:18 +0100 Subject: [PATCH 013/120] Stop hibernate logging massive byte arrays (at debug level) and causing OOM. (#1351) --- .../database/HibernateConfiguration.kt | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/node/src/main/kotlin/net/corda/node/services/database/HibernateConfiguration.kt b/node/src/main/kotlin/net/corda/node/services/database/HibernateConfiguration.kt index 03fe0aed2d..ab104657a2 100644 --- a/node/src/main/kotlin/net/corda/node/services/database/HibernateConfiguration.kt +++ b/node/src/main/kotlin/net/corda/node/services/database/HibernateConfiguration.kt @@ -5,17 +5,22 @@ import net.corda.core.node.services.IdentityService import net.corda.core.schemas.MappedSchema import net.corda.core.schemas.converters.AbstractPartyToX500NameAsStringConverter import net.corda.core.utilities.loggerFor +import net.corda.core.utilities.toHexString import net.corda.node.services.api.SchemaService import net.corda.node.utilities.DatabaseTransactionManager import net.corda.node.utilities.parserTransactionIsolationLevel import org.hibernate.SessionFactory import org.hibernate.boot.MetadataSources -import org.hibernate.boot.model.naming.* +import org.hibernate.boot.model.naming.Identifier +import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder import org.hibernate.cfg.Configuration import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment import org.hibernate.service.UnknownUnwrapTypeException +import org.hibernate.type.AbstractSingleColumnStandardBasicType +import org.hibernate.type.descriptor.java.PrimitiveByteArrayTypeDescriptor +import org.hibernate.type.descriptor.sql.BlobTypeDescriptor import java.sql.Connection import java.util.* import java.util.concurrent.ConcurrentHashMap @@ -83,7 +88,9 @@ class HibernateConfiguration(createSchemaService: () -> SchemaService, private v }) // register custom converters applyAttributeConverter(AbstractPartyToX500NameAsStringConverter(createIdentityScervice)) - + // Register a tweaked version of `org.hibernate.type.MaterializedBlobType` that truncates logged messages. + // to avoid OOM when large blobs might get logged. + applyBasicType(CordaMaterializedBlobType, CordaMaterializedBlobType.name) build() } @@ -117,4 +124,26 @@ class HibernateConfiguration(createSchemaService: () -> SchemaService, private v override fun isUnwrappableAs(unwrapType: Class<*>?): Boolean = unwrapType == NodeDatabaseConnectionProvider::class.java } + + // A tweaked version of `org.hibernate.type.MaterializedBlobType` that truncates logged messages. Also logs in hex. + private object CordaMaterializedBlobType : AbstractSingleColumnStandardBasicType(BlobTypeDescriptor.DEFAULT, CordaPrimitiveByteArrayTypeDescriptor) { + override fun getName(): String { + return "materialized_blob" + } + } + + // A tweaked version of `org.hibernate.type.descriptor.java.PrimitiveByteArrayTypeDescriptor` that truncates logged messages. + private object CordaPrimitiveByteArrayTypeDescriptor : PrimitiveByteArrayTypeDescriptor() { + private val LOG_SIZE_LIMIT = 1024 + + override fun extractLoggableRepresentation(value: ByteArray?): String { + return if (value == null) super.extractLoggableRepresentation(value) else { + if (value.size <= LOG_SIZE_LIMIT) { + return "[size=${value.size}, value=${value.toHexString()}]" + } else { + return "[size=${value.size}, value=${value.copyOfRange(0, LOG_SIZE_LIMIT).toHexString()}...truncated...]" + } + } + } + } } \ No newline at end of file From 0176184a86d858a331d1a801586756972b0bd6ce Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko <31008341+vkolomeyko@users.noreply.github.com> Date: Tue, 29 Aug 2017 17:59:03 +0100 Subject: [PATCH 014/120] CORDA-540: Cater for repeated object references found in the AMQP serialization graph (#1326) Also provide unit test that clearly exposes the problem --- .../amqp/DeserializationInput.kt | 50 +++++++++------- .../serialization/amqp/ObjectSerializer.kt | 20 ++++--- .../internal/serialization/amqp/Schema.kt | 57 ++++++++++++++++--- .../serialization/amqp/SerializationHelper.kt | 13 +++++ .../serialization/amqp/SerializationOutput.kt | 20 +++++-- .../amqp/SerializationOutputTests.kt | 47 ++++++++++++--- 6 files changed, 162 insertions(+), 45 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt index 612d196433..5c7c2d7cec 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt @@ -3,15 +3,12 @@ package net.corda.nodeapi.internal.serialization.amqp import net.corda.core.internal.getStackTraceAsString import net.corda.core.serialization.SerializedBytes import net.corda.core.utilities.ByteSequence -import org.apache.qpid.proton.amqp.Binary -import org.apache.qpid.proton.amqp.DescribedType -import org.apache.qpid.proton.amqp.UnsignedByte +import org.apache.qpid.proton.amqp.* import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException import java.lang.reflect.ParameterizedType import java.lang.reflect.Type import java.nio.ByteBuffer -import java.util.* data class ObjectAndEnvelope(val obj: T, val envelope: Envelope) @@ -22,8 +19,7 @@ data class ObjectAndEnvelope(val obj: T, val envelope: Envelope) * instances and threads. */ class DeserializationInput(internal val serializerFactory: SerializerFactory) { - // TODO: we're not supporting object refs yet - private val objectHistory: MutableList = ArrayList() + private val objectHistory: MutableList = mutableListOf() internal companion object { val BYTES_NEEDED_TO_PEEK: Int = 23 @@ -115,20 +111,36 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { return if (obj == null) null else readObject(obj, schema, type) } - internal fun readObject(obj: Any, schema: Schema, type: Type): Any { - if (obj is DescribedType) { - // Look up serializer in factory by descriptor - val serializer = serializerFactory.get(obj.descriptor, schema) - if (serializer.type != type && with(serializer.type) { !isSubClassOf(type) && !materiallyEquivalentTo(type) }) - throw NotSerializableException("Described type with descriptor ${obj.descriptor} was " + - "expected to be of type $type but was ${serializer.type}") - return serializer.readObject(obj.described, schema, this) - } else if (obj is Binary) { - return obj.array - } else { - return obj + internal fun readObject(obj: Any, schema: Schema, type: Type): Any = + if (obj is DescribedType && ReferencedObject.DESCRIPTOR == obj.descriptor) { + // It must be a reference to an instance that has already been read, cheaply and quickly returning it by reference. + val objectIndex = (obj.described as UnsignedInteger).toInt() + if (objectIndex !in 0..objectHistory.size) + throw NotSerializableException("Retrieval of existing reference failed. Requested index $objectIndex " + + "is outside of the bounds for the list of size: ${objectHistory.size}") + + val objectRetrieved = objectHistory[objectIndex] + if (!objectRetrieved::class.java.isSubClassOf(type)) + throw NotSerializableException("Existing reference type mismatch. Expected: '$type', found: '${objectRetrieved::class.java}'") + objectRetrieved + } + else { + val objectRead = when (obj) { + is DescribedType -> { + // Look up serializer in factory by descriptor + val serializer = serializerFactory.get(obj.descriptor, schema) + if (serializer.type != type && with(serializer.type) { !isSubClassOf(type) && !materiallyEquivalentTo(type) }) + throw NotSerializableException("Described type with descriptor ${obj.descriptor} was " + + "expected to be of type $type but was ${serializer.type}") + serializer.readObject(obj.described, schema, this) + } + is Binary -> obj.array + else -> obj // this will be the case for primitive types like [boolean] et al. + } + // Store the reference in case we need it later on. + objectHistory.add(objectRead) + objectRead } - } /** * TODO: Currently performs rather basic checks aimed in particular at [java.util.List>] and diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt index 3b99e84371..7c15998270 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt @@ -1,7 +1,8 @@ package net.corda.nodeapi.internal.serialization.amqp +import net.corda.core.utilities.debug +import net.corda.core.utilities.loggerFor import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.nameForType -import org.apache.qpid.proton.amqp.UnsignedInteger import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException import java.lang.reflect.Type @@ -15,6 +16,8 @@ open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPS open val kotlinConstructor = constructorForDeserialization(clazz) val javaConstructor by lazy { kotlinConstructor?.javaConstructor } + private val logger = loggerFor() + open internal val propertySerializers: Collection by lazy { propertiesForSerialization(kotlinConstructor, clazz, factory) } @@ -50,10 +53,7 @@ open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPS } override fun readObject(obj: Any, schema: Schema, input: DeserializationInput): Any { - if (obj is UnsignedInteger) { - // TODO: Object refs - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } else if (obj is List<*>) { + if (obj is List<*>) { if (obj.size > propertySerializers.size) throw NotSerializableException("Too many properties in described type $typeName") val params = obj.zip(propertySerializers).map { it.second.readProperty(it.first, schema, input) } return construct(params) @@ -66,6 +66,12 @@ open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPS private fun generateProvides(): List = interfaces.map { nameForType(it) } - fun construct(properties: List) = javaConstructor?.newInstance(*properties.toTypedArray()) ?: - throw NotSerializableException("Attempt to deserialize an interface: $clazz. Serialized form is invalid.") + fun construct(properties: List): Any { + + logger.debug { "Calling constructor: '$javaConstructor' with properties '$properties'" } + + return javaConstructor?.newInstance(*properties.toTypedArray()) ?: + throw NotSerializableException("Attempt to deserialize an interface: $clazz. Serialized form is invalid.") + } + } \ No newline at end of file diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt index e82df6443e..734fd325c5 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt @@ -6,6 +6,7 @@ import net.corda.core.crypto.toBase64 import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.loggerFor import org.apache.qpid.proton.amqp.DescribedType +import org.apache.qpid.proton.amqp.UnsignedInteger import org.apache.qpid.proton.amqp.UnsignedLong import org.apache.qpid.proton.codec.Data import org.apache.qpid.proton.codec.DescribedTypeConstructor @@ -24,6 +25,21 @@ val DESCRIPTOR_DOMAIN: String = "net.corda" // "corda" + majorVersionByte + minorVersionMSB + minorVersionLSB val AmqpHeaderV1_0: OpaqueBytes = OpaqueBytes("corda\u0001\u0000\u0000".toByteArray()) +private enum class DescriptorRegistry(val id: Long) { + + ENVELOPE(1), + SCHEMA(2), + OBJECT_DESCRIPTOR(3), + FIELD(4), + COMPOSITE_TYPE(5), + RESTRICTED_TYPE(6), + CHOICE(7), + REFERENCED_OBJECT(8), + ; + + val amqpDescriptor = UnsignedLong(id or DESCRIPTOR_TOP_32BITS) +} + /** * This class wraps all serialized data, so that the schema can be carried along with it. We will provide various internal utilities * to decompose and recompose with/without schema etc so that e.g. we can store objects with a (relationally) normalised out schema to @@ -32,7 +48,7 @@ val AmqpHeaderV1_0: OpaqueBytes = OpaqueBytes("corda\u0001\u0000\u0000".toByteAr // TODO: make the schema parsing lazy since mostly schemas will have been seen before and we only need it if we don't recognise a type descriptor. data class Envelope(val obj: Any?, val schema: Schema) : DescribedType { companion object : DescribedTypeConstructor { - val DESCRIPTOR = UnsignedLong(1L or DESCRIPTOR_TOP_32BITS) + val DESCRIPTOR = DescriptorRegistry.ENVELOPE.amqpDescriptor val DESCRIPTOR_OBJECT = Descriptor(null, DESCRIPTOR) fun get(data: Data): Envelope { @@ -63,7 +79,7 @@ data class Envelope(val obj: Any?, val schema: Schema) : DescribedType { */ data class Schema(val types: List) : DescribedType { companion object : DescribedTypeConstructor { - val DESCRIPTOR = UnsignedLong(2L or DESCRIPTOR_TOP_32BITS) + val DESCRIPTOR = DescriptorRegistry.SCHEMA.amqpDescriptor fun get(obj: Any): Schema { val describedType = obj as DescribedType @@ -92,7 +108,7 @@ data class Schema(val types: List) : DescribedType { data class Descriptor(val name: String?, val code: UnsignedLong? = null) : DescribedType { companion object : DescribedTypeConstructor { - val DESCRIPTOR = UnsignedLong(3L or DESCRIPTOR_TOP_32BITS) + val DESCRIPTOR = DescriptorRegistry.OBJECT_DESCRIPTOR.amqpDescriptor fun get(obj: Any): Descriptor { val describedType = obj as DescribedType @@ -130,7 +146,7 @@ data class Descriptor(val name: String?, val code: UnsignedLong? = null) : Descr data class Field(val name: String, val type: String, val requires: List, val default: String?, val label: String?, val mandatory: Boolean, val multiple: Boolean) : DescribedType { companion object : DescribedTypeConstructor { - val DESCRIPTOR = UnsignedLong(4L or DESCRIPTOR_TOP_32BITS) + val DESCRIPTOR = DescriptorRegistry.FIELD.amqpDescriptor fun get(obj: Any): Field { val describedType = obj as DescribedType @@ -193,7 +209,7 @@ sealed class TypeNotation : DescribedType { data class CompositeType(override val name: String, override val label: String?, override val provides: List, override val descriptor: Descriptor, val fields: List) : TypeNotation() { companion object : DescribedTypeConstructor { - val DESCRIPTOR = UnsignedLong(5L or DESCRIPTOR_TOP_32BITS) + val DESCRIPTOR = DescriptorRegistry.COMPOSITE_TYPE.amqpDescriptor fun get(describedType: DescribedType): CompositeType { if (describedType.descriptor != DESCRIPTOR) { @@ -238,7 +254,7 @@ data class CompositeType(override val name: String, override val label: String?, data class RestrictedType(override val name: String, override val label: String?, override val provides: List, val source: String, override val descriptor: Descriptor, val choices: List) : TypeNotation() { companion object : DescribedTypeConstructor { - val DESCRIPTOR = UnsignedLong(6L or DESCRIPTOR_TOP_32BITS) + val DESCRIPTOR = DescriptorRegistry.RESTRICTED_TYPE.amqpDescriptor fun get(describedType: DescribedType): RestrictedType { if (describedType.descriptor != DESCRIPTOR) { @@ -281,7 +297,7 @@ data class RestrictedType(override val name: String, override val label: String? data class Choice(val name: String, val value: String) : DescribedType { companion object : DescribedTypeConstructor { - val DESCRIPTOR = UnsignedLong(7L or DESCRIPTOR_TOP_32BITS) + val DESCRIPTOR = DescriptorRegistry.CHOICE.amqpDescriptor fun get(obj: Any): Choice { val describedType = obj as DescribedType @@ -308,6 +324,33 @@ data class Choice(val name: String, val value: String) : DescribedType { } } +data class ReferencedObject(private val refCounter: Int) : DescribedType { + companion object : DescribedTypeConstructor { + val DESCRIPTOR = DescriptorRegistry.REFERENCED_OBJECT.amqpDescriptor + + fun get(obj: Any): ReferencedObject { + val describedType = obj as DescribedType + if (describedType.descriptor != DESCRIPTOR) { + throw NotSerializableException("Unexpected descriptor ${describedType.descriptor}.") + } + return newInstance(describedType.described) + } + + override fun getTypeClass(): Class<*> = ReferencedObject::class.java + + override fun newInstance(described: Any?): ReferencedObject { + val unInt = described as? UnsignedInteger ?: throw IllegalStateException("Was expecting an UnsignedInteger") + return ReferencedObject(unInt.toInt()) + } + } + + override fun getDescriptor(): Any = DESCRIPTOR + + override fun getDescribed(): UnsignedInteger = UnsignedInteger(refCounter) + + override fun toString(): String = "" +} + private val ARRAY_HASH: String = "Array = true" private val ALREADY_SEEN_HASH: String = "Already seen = true" private val NULLABLE_HASH: String = "Nullable = true" diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt index f1a356a01d..1d23931e1b 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt @@ -155,6 +155,19 @@ fun Data.withList(block: Data.() -> Unit) { exit() // exit list } +/** + * Extension helper for outputting reference to already observed object + */ +fun Data.writeReferencedObject(refObject: ReferencedObject) { + // Write described + putDescribed() + enter() + // Write descriptor + putObject(refObject.descriptor) + putUnsignedInteger(refObject.described) + exit() // exit described +} + private fun resolveTypeVariables(actualType: Type, contextType: Type?): Type { val resolvedType = if (contextType != null) TypeToken.of(contextType).resolveType(actualType).type else actualType // TODO: surely we check it is concrete at this point with no TypeVariables diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt index e012db0b04..65b9b745ee 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt @@ -16,15 +16,14 @@ import kotlin.collections.LinkedHashSet * instances and threads. */ open class SerializationOutput(internal val serializerFactory: SerializerFactory) { - // TODO: we're not supporting object refs yet + private val objectHistory: MutableMap = IdentityHashMap() private val serializerHistory: MutableSet> = LinkedHashSet() internal val schemaHistory: MutableSet = LinkedHashSet() - /** * Serialize the given object to AMQP, wrapped in our [Envelope] wrapper which carries an AMQP 1.0 schema, and prefixed - * with a header to indicate that this is serialized with AMQP and not [Kryo], and what version of the Corda implementation + * with a header to indicate that this is serialized with AMQP and not Kryo, and what version of the Corda implementation * of AMQP serialization constructed the serialized form. */ @Throws(NotSerializableException::class) @@ -81,7 +80,20 @@ open class SerializationOutput(internal val serializerFactory: SerializerFactory serializerHistory.add(serializer) serializer.writeClassInfo(this) } - serializer.writeObject(obj, data, type, this) + + val retrievedRefCount = objectHistory[obj] + if(retrievedRefCount == null) { + serializer.writeObject(obj, data, type, this) + // Important to do it after serialization such that dependent object will have preceding reference numbers + // assigned to them first as they will be first read from the stream on receiving end. + // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content + if(type is Class<*> && !type.isPrimitive) { + objectHistory.put(obj, objectHistory.size) + } + } + else { + data.writeReferencedObject(ReferencedObject(retrievedRefCount)) + } } open internal fun writeTypeNotations(vararg typeNotation: TypeNotation): Boolean { diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt index 3e83fe6f62..d5754e46d1 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt @@ -22,6 +22,7 @@ import org.apache.qpid.proton.amqp.* import org.apache.qpid.proton.codec.DecoderImpl import org.apache.qpid.proton.codec.EncoderImpl import org.junit.Ignore +import org.junit.Assert.assertSame import org.junit.Test import java.io.IOException import java.io.NotSerializableException @@ -29,9 +30,7 @@ import java.math.BigDecimal import java.nio.ByteBuffer import java.time.* import java.time.temporal.ChronoUnit -import java.time.temporal.TemporalUnit import java.util.* -import java.util.concurrent.TimeUnit import kotlin.test.assertEquals import kotlin.test.assertNotNull import kotlin.test.assertTrue @@ -140,13 +139,13 @@ class SerializationOutputTests { data class PolymorphicProperty(val foo: FooInterface?) - private fun serdes(obj: Any, + private inline fun serdes(obj: T, factory: SerializerFactory = SerializerFactory ( AllWhitelist, ClassLoader.getSystemClassLoader()), freshDeserializationFactory: SerializerFactory = SerializerFactory( AllWhitelist, ClassLoader.getSystemClassLoader()), expectedEqual: Boolean = true, - expectDeserializedEqual: Boolean = true): Any { + expectDeserializedEqual: Boolean = true): T { val ser = SerializationOutput(factory) val bytes = ser.serialize(obj) @@ -158,6 +157,7 @@ class SerializationOutputTests { this.register(CompositeType.DESCRIPTOR, CompositeType.Companion) this.register(Choice.DESCRIPTOR, Choice.Companion) this.register(RestrictedType.DESCRIPTOR, RestrictedType.Companion) + this.register(ReferencedObject.DESCRIPTOR, ReferencedObject.Companion) } EncoderImpl(decoder) decoder.setByteBuffer(ByteBuffer.wrap(bytes.bytes, 8, bytes.size - 8)) @@ -436,7 +436,7 @@ class SerializationOutputTests { throw IllegalStateException("Layer 2", t) } } catch(t: Throwable) { - val desThrowable = serdes(t, factory, factory2, false) as Throwable + val desThrowable = serdes(t, factory, factory2, false) assertSerializedThrowableEquivalent(t, desThrowable) } } @@ -468,7 +468,7 @@ class SerializationOutputTests { throw e } } catch(t: Throwable) { - val desThrowable = serdes(t, factory, factory2, false) as Throwable + val desThrowable = serdes(t, factory, factory2, false) assertSerializedThrowableEquivalent(t, desThrowable) } } @@ -538,7 +538,6 @@ class SerializationOutputTests { AbstractAMQPSerializationScheme.registerCustomSerializers(factory2) val desState = serdes(state, factory, factory2, expectedEqual = false, expectDeserializedEqual = false) - assertTrue(desState is TransactionState<*>) assertTrue((desState as TransactionState<*>).data is FooState) assertTrue(desState.notary == state.notary) assertTrue(desState.encumbrance == state.encumbrance) @@ -763,4 +762,36 @@ class SerializationOutputTests { val obj = StateRef(SecureHash.randomSHA256(), 0) serdes(obj, factory, factory2) } -} + + interface Container + + data class SimpleContainer(val one: String, val another: String) : Container + + data class ParentContainer(val left: SimpleContainer, val right: Container) + + @Test + fun `test object referenced multiple times`() { + val simple = SimpleContainer("Fred", "Ginger") + val parentContainer = ParentContainer(simple, simple) + assertSame(parentContainer.left, parentContainer.right) + + val parentCopy = serdes(parentContainer) + assertSame(parentCopy.left, parentCopy.right) + } + + data class TestNode(val content: String, val children: MutableCollection = ArrayList()) + + @Test + @Ignore("Ignored due to cyclic graphs not currently supported by AMQP serialization") + fun `test serialization of cyclic graph`() { + val nodeA = TestNode("A") + val nodeB = TestNode("B", ArrayList(Arrays.asList(nodeA))) + nodeA.children.add(nodeB) + + // Also blows with StackOverflow error + assertTrue(nodeB.hashCode() > 0) + + val bCopy = serdes(nodeB) + assertEquals("A", bCopy.children.single().content) + } +} \ No newline at end of file From 00513883a27e96b3608335c66b0330d1f3d98801 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Tue, 29 Aug 2017 17:33:20 +0100 Subject: [PATCH 015/120] Move HibernateConfiguration into net.corda.node.services.persistence --- node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt | 2 -- .../{database => persistence}/HibernateConfiguration.kt | 4 ++-- .../net/corda/node/services/schema/HibernateObserver.kt | 2 +- .../net/corda/node/services/vault/HibernateVaultQueryImpl.kt | 4 ++-- .../main/kotlin/net/corda/node/utilities/CordaPersistence.kt | 2 +- .../corda/node/services/database/RequeryConfigurationTest.kt | 0 .../node/services/persistence/DBTransactionStorageTests.kt | 1 - .../{database => persistence}/HibernateConfigurationTest.kt | 2 +- .../src/main/kotlin/net/corda/testing/node/MockServices.kt | 2 +- 9 files changed, 8 insertions(+), 11 deletions(-) rename node/src/main/kotlin/net/corda/node/services/{database => persistence}/HibernateConfiguration.kt (98%) delete mode 100644 node/src/test/kotlin/net/corda/node/services/database/RequeryConfigurationTest.kt rename node/src/test/kotlin/net/corda/node/services/{database => persistence}/HibernateConfigurationTest.kt (99%) diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index f75f050837..146f391689 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -1,7 +1,6 @@ package net.corda.node.internal import com.codahale.metrics.MetricRegistry -import net.corda.core.internal.VisibleForTesting import com.google.common.collect.Lists import com.google.common.collect.MutableClassToInstanceMap import com.google.common.util.concurrent.MoreExecutors @@ -34,7 +33,6 @@ import net.corda.node.services.TransactionKeyHandler import net.corda.node.services.api.* import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.config.configureWithDevSSLCertificate -import net.corda.node.services.database.HibernateConfiguration import net.corda.node.services.events.NodeSchedulerService import net.corda.node.services.events.ScheduledActivityObserver import net.corda.node.services.identity.InMemoryIdentityService diff --git a/node/src/main/kotlin/net/corda/node/services/database/HibernateConfiguration.kt b/node/src/main/kotlin/net/corda/node/services/persistence/HibernateConfiguration.kt similarity index 98% rename from node/src/main/kotlin/net/corda/node/services/database/HibernateConfiguration.kt rename to node/src/main/kotlin/net/corda/node/services/persistence/HibernateConfiguration.kt index ab104657a2..4d194f9f90 100644 --- a/node/src/main/kotlin/net/corda/node/services/database/HibernateConfiguration.kt +++ b/node/src/main/kotlin/net/corda/node/services/persistence/HibernateConfiguration.kt @@ -1,4 +1,4 @@ -package net.corda.node.services.database +package net.corda.node.services.persistence import net.corda.core.internal.castIfPossible import net.corda.core.node.services.IdentityService @@ -62,7 +62,7 @@ class HibernateConfiguration(createSchemaService: () -> SchemaService, private v // We set a connection provider as the auto schema generation requires it. The auto schema generation will not // necessarily remain and would likely be replaced by something like Liquibase. For now it is very convenient though. // TODO: replace auto schema generation as it isn't intended for production use, according to Hibernate docs. - val config = Configuration(metadataSources).setProperty("hibernate.connection.provider_class", HibernateConfiguration.NodeDatabaseConnectionProvider::class.java.name) + val config = Configuration(metadataSources).setProperty("hibernate.connection.provider_class", NodeDatabaseConnectionProvider::class.java.name) .setProperty("hibernate.hbm2ddl.auto", if (databaseProperties.getProperty("initDatabase","true") == "true") "update" else "validate") .setProperty("hibernate.format_sql", "true") .setProperty("hibernate.connection.isolation", transactionIsolationLevel.toString()) diff --git a/node/src/main/kotlin/net/corda/node/services/schema/HibernateObserver.kt b/node/src/main/kotlin/net/corda/node/services/schema/HibernateObserver.kt index 58fbe944a1..9afc740949 100644 --- a/node/src/main/kotlin/net/corda/node/services/schema/HibernateObserver.kt +++ b/node/src/main/kotlin/net/corda/node/services/schema/HibernateObserver.kt @@ -8,7 +8,7 @@ import net.corda.core.schemas.MappedSchema import net.corda.core.schemas.PersistentStateRef import net.corda.core.utilities.debug import net.corda.core.utilities.loggerFor -import net.corda.node.services.database.HibernateConfiguration +import net.corda.node.services.persistence.HibernateConfiguration import net.corda.node.utilities.DatabaseTransactionManager import org.hibernate.FlushMode import rx.Observable diff --git a/node/src/main/kotlin/net/corda/node/services/vault/HibernateVaultQueryImpl.kt b/node/src/main/kotlin/net/corda/node/services/vault/HibernateVaultQueryImpl.kt index b6cfebe4cd..76c4ba0f60 100644 --- a/node/src/main/kotlin/net/corda/node/services/vault/HibernateVaultQueryImpl.kt +++ b/node/src/main/kotlin/net/corda/node/services/vault/HibernateVaultQueryImpl.kt @@ -1,11 +1,11 @@ package net.corda.node.services.vault -import net.corda.core.internal.ThreadBox import net.corda.core.contracts.ContractState import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.StateRef import net.corda.core.contracts.TransactionState import net.corda.core.crypto.SecureHash +import net.corda.core.internal.ThreadBox import net.corda.core.internal.bufferUntilSubscribed import net.corda.core.messaging.DataFeed import net.corda.core.node.services.Vault @@ -20,7 +20,7 @@ import net.corda.core.serialization.deserialize import net.corda.core.utilities.debug import net.corda.core.utilities.loggerFor import net.corda.core.utilities.trace -import net.corda.node.services.database.HibernateConfiguration +import net.corda.node.services.persistence.HibernateConfiguration import net.corda.node.utilities.DatabaseTransactionManager import org.hibernate.Session import rx.Observable diff --git a/node/src/main/kotlin/net/corda/node/utilities/CordaPersistence.kt b/node/src/main/kotlin/net/corda/node/utilities/CordaPersistence.kt index b8add3a202..de78ac1071 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/CordaPersistence.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/CordaPersistence.kt @@ -4,7 +4,7 @@ import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource import net.corda.core.node.services.IdentityService import net.corda.node.services.api.SchemaService -import net.corda.node.services.database.HibernateConfiguration +import net.corda.node.services.persistence.HibernateConfiguration import net.corda.node.services.schema.NodeSchemaService import org.hibernate.SessionFactory diff --git a/node/src/test/kotlin/net/corda/node/services/database/RequeryConfigurationTest.kt b/node/src/test/kotlin/net/corda/node/services/database/RequeryConfigurationTest.kt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt b/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt index 063dbff380..2d48b70257 100644 --- a/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt @@ -13,7 +13,6 @@ import net.corda.core.transactions.WireTransaction import net.corda.finance.schemas.CashSchemaV1 import net.corda.finance.schemas.SampleCashSchemaV2 import net.corda.finance.schemas.SampleCashSchemaV3 -import net.corda.node.services.database.HibernateConfiguration import net.corda.node.services.schema.HibernateObserver import net.corda.node.services.schema.NodeSchemaService import net.corda.node.services.transactions.PersistentUniquenessProvider diff --git a/node/src/test/kotlin/net/corda/node/services/database/HibernateConfigurationTest.kt b/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt similarity index 99% rename from node/src/test/kotlin/net/corda/node/services/database/HibernateConfigurationTest.kt rename to node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt index 9f5b7767b0..580f238e76 100644 --- a/node/src/test/kotlin/net/corda/node/services/database/HibernateConfigurationTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt @@ -1,4 +1,4 @@ -package net.corda.node.services.database +package net.corda.node.services.persistence import net.corda.core.contracts.ContractState import net.corda.core.contracts.StateAndRef diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt index 4ac02a135b..59fac74877 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt @@ -18,10 +18,10 @@ import net.corda.finance.schemas.CommercialPaperSchemaV1 import net.corda.node.VersionInfo import net.corda.node.services.api.StateMachineRecordedTransactionMappingStorage import net.corda.node.services.api.WritableTransactionStorage -import net.corda.node.services.database.HibernateConfiguration import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.services.keys.freshCertificate import net.corda.node.services.keys.getSigner +import net.corda.node.services.persistence.HibernateConfiguration import net.corda.node.services.persistence.InMemoryStateMachineRecordedTransactionMappingStorage import net.corda.node.services.schema.HibernateObserver import net.corda.node.services.schema.NodeSchemaService From ca1d5287b1061fc9bf618fe09c53ed433fea59ec Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Wed, 30 Aug 2017 11:13:07 +0100 Subject: [PATCH 016/120] Upgrade to TornadoFX 1.7.10 (#1288) We can do this now that we've upgraded to Kotlin 1.1.4. --- tools/demobench/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/demobench/build.gradle b/tools/demobench/build.gradle index 5a9345ffd9..6a3452b8c9 100644 --- a/tools/demobench/build.gradle +++ b/tools/demobench/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.tornadofx_version = '1.7.3' + ext.tornadofx_version = '1.7.10' ext.jna_version = '4.1.0' ext.purejavacomm_version = '0.0.18' ext.controlsfx_version = '8.40.12' From d2a2e2c41960b71d57e6651b2cc28fc49b9d5640 Mon Sep 17 00:00:00 2001 From: Joel Dudley Date: Wed, 30 Aug 2017 11:18:28 +0100 Subject: [PATCH 017/120] Update tut-two-party-introduction.rst. --- docs/source/tut-two-party-introduction.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/source/tut-two-party-introduction.rst b/docs/source/tut-two-party-introduction.rst index fb99b07af0..e49de7dd9e 100644 --- a/docs/source/tut-two-party-introduction.rst +++ b/docs/source/tut-two-party-introduction.rst @@ -2,8 +2,9 @@ Introduction ============ .. note:: This tutorial extends the CorDapp built during the :doc:`Hello, World tutorial `. You can - find the final version of the CorDapp produced in that tutorial - `here `_. + download the final version of the CorDapp produced in that tutorial for + `Java `_ or + `Kotlin `_. In the Hello, World tutorial, we built a CorDapp allowing us to model IOUs on ledger. Our CorDapp was made up of three elements: @@ -22,4 +23,4 @@ IOU onto the ledger. We'll need to make two changes: signature (as well as the lender's) to become valid ledger updates * The ``IOUFlow`` will need to be updated to allow for the gathering of the borrower's signature -We'll start by updating the contract. \ No newline at end of file +We'll start by updating the contract. From 4387be0c4bef813fa1134e82523de00df5f5ec05 Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko <31008341+vkolomeyko@users.noreply.github.com> Date: Wed, 30 Aug 2017 11:41:04 +0100 Subject: [PATCH 018/120] CORDA-540: Mark CompositeKeyTests which works with cyclic graphs as Kryo specific (#1354) --- .../kotlin/net/corda/core/crypto/CompositeKeyTests.kt | 3 ++- .../internal/serialization/AMQPSerializationScheme.kt | 2 +- .../net/corda/nodeapi/AttachmentClassLoaderTests.kt | 11 ++--------- .../main/kotlin/net/corda/testing/CoreTestUtils.kt | 8 ++++++++ 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt b/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt index 62169f8c21..40c07f5063 100644 --- a/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt +++ b/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt @@ -10,6 +10,7 @@ import net.corda.core.serialization.serialize import net.corda.core.utilities.OpaqueBytes import net.corda.node.utilities.* import net.corda.testing.TestDependencyInjectionBase +import net.corda.testing.kryoSpecific import org.bouncycastle.asn1.x500.X500Name import org.junit.Rule import org.junit.Test @@ -216,7 +217,7 @@ class CompositeKeyTests : TestDependencyInjectionBase() { } @Test() - fun `composite key validation with graph cycle detection`() { + fun `composite key validation with graph cycle detection`() = kryoSpecific { val key1 = CompositeKey.Builder().addKeys(alicePublicKey, bobPublicKey).build() as CompositeKey val key2 = CompositeKey.Builder().addKeys(alicePublicKey, key1).build() as CompositeKey val key3 = CompositeKey.Builder().addKeys(alicePublicKey, key2).build() as CompositeKey diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt index d4a38efe6a..965755d253 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt @@ -11,7 +11,7 @@ import net.corda.nodeapi.internal.serialization.amqp.SerializationOutput import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory import java.util.concurrent.ConcurrentHashMap -internal val AMQP_ENABLED get() = SerializationDefaults.P2P_CONTEXT.preferredSerializationVersion == AmqpHeaderV1_0 +val AMQP_ENABLED get() = SerializationDefaults.P2P_CONTEXT.preferredSerializationVersion == AmqpHeaderV1_0 abstract class AbstractAMQPSerializationScheme : SerializationScheme { internal companion object { diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt index 3773a0dee6..093479b20b 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt @@ -15,14 +15,13 @@ import net.corda.core.transactions.LedgerTransaction import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.ByteSequence import net.corda.core.utilities.OpaqueBytes -import net.corda.core.utilities.loggerFor -import net.corda.nodeapi.internal.serialization.AMQP_ENABLED import net.corda.nodeapi.internal.serialization.SerializeAsTokenContextImpl import net.corda.nodeapi.internal.serialization.WireTransactionSerializer import net.corda.nodeapi.internal.serialization.withTokenContext import net.corda.testing.DUMMY_NOTARY import net.corda.testing.MEGA_CORP import net.corda.testing.TestDependencyInjectionBase +import net.corda.testing.kryoSpecific import net.corda.testing.node.MockAttachmentStorage import org.apache.commons.io.IOUtils import org.junit.Assert @@ -333,7 +332,7 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { @Test // Kryo verifies/loads attachments on deserialization, whereas AMQP currently does not - fun `test deserialize of WireTransaction where contract cannot be found`() = kryoSpecific { + fun `test deserialize of WireTransaction where contract cannot be found`() = kryoSpecific { val child = ClassLoaderForTests() val contractClass = Class.forName("net.corda.contracts.isolated.AnotherDummyContract", true, child) val contract = contractClass.newInstance() as DummyContractBackdoor @@ -362,10 +361,4 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { } assertEquals(attachmentRef, e.ids.single()) } - - private fun kryoSpecific(function: () -> Unit) = if(!AMQP_ENABLED) { - function() - } else { - loggerFor().info("Ignoring Kryo specific test") - } } \ No newline at end of file diff --git a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt index 59adf96b04..f8416266c3 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt @@ -14,6 +14,7 @@ import net.corda.core.node.services.IdentityService import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.OpaqueBytes +import net.corda.core.utilities.loggerFor import net.corda.finance.contracts.asset.DUMMY_CASH_ISSUER import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.config.VerifierType @@ -22,6 +23,7 @@ import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.utilities.CertificateType import net.corda.node.utilities.X509Utilities import net.corda.nodeapi.config.SSLConfiguration +import net.corda.nodeapi.internal.serialization.AMQP_ENABLED import net.corda.testing.node.MockServices import net.corda.testing.node.makeTestDataSourceProperties import net.corda.testing.node.makeTestDatabaseProperties @@ -220,4 +222,10 @@ fun getTestPartyAndCertificate(party: Party, trustRoot: CertificateAndKeyPair = */ fun getTestPartyAndCertificate(name: X500Name, publicKey: PublicKey, trustRoot: CertificateAndKeyPair = DUMMY_CA): PartyAndCertificate { return getTestPartyAndCertificate(Party(name, publicKey), trustRoot) +} + +inline fun kryoSpecific(function: () -> Unit) = if(!AMQP_ENABLED) { + function() +} else { + loggerFor().info("Ignoring Kryo specific test") } \ No newline at end of file From 2b7ec0542f7a76cde228a9178c729de81e6a78b2 Mon Sep 17 00:00:00 2001 From: mkit Date: Wed, 30 Aug 2017 12:10:42 +0100 Subject: [PATCH 019/120] Refactoring MockServices class - removing Kt Java class (#1350) --- .../finance/contracts/CommercialPaperTests.kt | 2 +- .../finance/contracts/asset/CashTests.kt | 2 +- .../services/vault/VaultQueryJavaTests.java | 4 +- .../config/FullNodeConfigurationTest.kt | 4 +- .../events/NodeSchedulerServiceTest.kt | 6 +- .../messaging/ArtemisMessagingTests.kt | 8 +- .../persistence/DBCheckpointStorageTests.kt | 6 +- .../persistence/DBTransactionStorageTests.kt | 6 +- .../persistence/HibernateConfigurationTest.kt | 6 +- .../persistence/NodeAttachmentStorageTest.kt | 6 +- .../services/schema/HibernateObserverTests.kt | 6 +- .../DistributedImmutableMapTests.kt | 6 +- .../PersistentUniquenessProviderTests.kt | 6 +- .../services/vault/NodeVaultServiceTest.kt | 2 +- .../node/services/vault/VaultQueryTests.kt | 6 +- .../node/services/vault/VaultWithCashTest.kt | 2 +- .../corda/node/utilities/ObservablesTests.kt | 6 +- .../corda/irs/api/NodeInterestRatesTest.kt | 3 + .../kotlin/net/corda/testing/CoreTestUtils.kt | 4 +- .../kotlin/net/corda/testing/driver/Driver.kt | 2 +- .../kotlin/net/corda/testing/node/MockNode.kt | 1 + .../net/corda/testing/node/MockServices.kt | 132 +++++++++++------- .../net/corda/testing/node/NodeBasedTest.kt | 1 + .../net/corda/testing/node/SimpleNode.kt | 1 + 24 files changed, 132 insertions(+), 96 deletions(-) diff --git a/finance/src/test/kotlin/net/corda/finance/contracts/CommercialPaperTests.kt b/finance/src/test/kotlin/net/corda/finance/contracts/CommercialPaperTests.kt index 7953afa693..e72638806f 100644 --- a/finance/src/test/kotlin/net/corda/finance/contracts/CommercialPaperTests.kt +++ b/finance/src/test/kotlin/net/corda/finance/contracts/CommercialPaperTests.kt @@ -15,7 +15,7 @@ import net.corda.finance.contracts.asset.* import net.corda.testing.* import net.corda.testing.contracts.fillWithSomeTestCash import net.corda.testing.node.MockServices -import net.corda.testing.node.makeTestDatabaseAndMockServices +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseAndMockServices import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.Parameterized diff --git a/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt b/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt index fc8b14791c..4d7843f707 100644 --- a/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt +++ b/finance/src/test/kotlin/net/corda/finance/contracts/asset/CashTests.kt @@ -22,7 +22,7 @@ import net.corda.testing.* import net.corda.testing.contracts.DummyState import net.corda.testing.contracts.fillWithSomeTestCash import net.corda.testing.node.MockServices -import net.corda.testing.node.makeTestDatabaseAndMockServices +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseAndMockServices import org.junit.After import org.junit.Before import org.junit.Test diff --git a/node/src/test/java/net/corda/node/services/vault/VaultQueryJavaTests.java b/node/src/test/java/net/corda/node/services/vault/VaultQueryJavaTests.java index 455f22ab3a..32e23b99e5 100644 --- a/node/src/test/java/net/corda/node/services/vault/VaultQueryJavaTests.java +++ b/node/src/test/java/net/corda/node/services/vault/VaultQueryJavaTests.java @@ -49,8 +49,8 @@ import static net.corda.finance.contracts.asset.CashUtilities.getDUMMY_CASH_ISSU import static net.corda.testing.CoreTestUtils.*; import static net.corda.testing.TestConstants.getDUMMY_NOTARY; import static net.corda.testing.TestConstants.getDUMMY_NOTARY_KEY; -import static net.corda.testing.node.MockServicesKt.makeTestDatabaseAndMockServices; -import static net.corda.testing.node.MockServicesKt.makeTestIdentityService; +import static net.corda.testing.node.MockServices.makeTestDatabaseAndMockServices; +import static net.corda.testing.node.MockServices.makeTestIdentityService; import static org.assertj.core.api.Assertions.assertThat; public class VaultQueryJavaTests extends TestDependencyInjectionBase { diff --git a/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt b/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt index 8da05d3899..6aead9af9e 100644 --- a/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt @@ -4,8 +4,8 @@ import net.corda.core.crypto.commonName import net.corda.core.utilities.NetworkHostAndPort import net.corda.testing.ALICE import net.corda.nodeapi.User -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.Test import java.net.URL diff --git a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt index a920256da3..deaf74f15d 100644 --- a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt @@ -20,8 +20,9 @@ import net.corda.node.utilities.AffinityExecutor import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase import net.corda.testing.* -import net.corda.testing.node.* import net.corda.testing.node.InMemoryMessagingNetwork +import net.corda.testing.node.MockKeyManagementService +import net.corda.testing.node.TestClock import org.assertj.core.api.Assertions.assertThat import org.bouncycastle.asn1.x500.X500Name import org.junit.After @@ -35,6 +36,9 @@ import java.util.concurrent.CountDownLatch import java.util.concurrent.Executors import java.util.concurrent.TimeUnit import kotlin.test.assertTrue +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService class NodeSchedulerServiceTest : SingletonSerializeAsToken() { val realClock: Clock = Clock.systemUTC() diff --git a/node/src/test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTests.kt b/node/src/test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTests.kt index 098b7c41de..c095eb86fb 100644 --- a/node/src/test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTests.kt @@ -19,10 +19,10 @@ import net.corda.node.utilities.AffinityExecutor.ServiceAffinityExecutor import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase import net.corda.testing.* -import net.corda.testing.node.MOCK_VERSION_INFO -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties -import net.corda.testing.node.makeTestIdentityService +import net.corda.testing.node.MockServices.Companion.MOCK_VERSION_INFO +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.After diff --git a/node/src/test/kotlin/net/corda/node/services/persistence/DBCheckpointStorageTests.kt b/node/src/test/kotlin/net/corda/node/services/persistence/DBCheckpointStorageTests.kt index 88b0012435..aaa8e49db1 100644 --- a/node/src/test/kotlin/net/corda/node/services/persistence/DBCheckpointStorageTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/persistence/DBCheckpointStorageTests.kt @@ -9,9 +9,9 @@ import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase import net.corda.testing.LogHelper import net.corda.testing.TestDependencyInjectionBase -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties -import net.corda.testing.node.makeTestIdentityService +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import org.assertj.core.api.Assertions.assertThat import org.junit.After import org.junit.Before diff --git a/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt b/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt index 2d48b70257..fa40b2dc05 100644 --- a/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt @@ -22,9 +22,9 @@ import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase import net.corda.testing.* import net.corda.testing.node.MockServices -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties -import net.corda.testing.node.makeTestIdentityService +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import org.assertj.core.api.Assertions.assertThat import org.junit.After import org.junit.Before diff --git a/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt b/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt index 580f238e76..fcf843e776 100644 --- a/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt @@ -34,9 +34,9 @@ import net.corda.testing.contracts.fillWithSomeTestCash import net.corda.testing.contracts.fillWithSomeTestDeals import net.corda.testing.contracts.fillWithSomeTestLinearStates import net.corda.testing.node.MockServices -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties -import net.corda.testing.node.makeTestIdentityService +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import net.corda.testing.schemas.DummyLinearStateSchemaV1 import net.corda.testing.schemas.DummyLinearStateSchemaV2 import org.assertj.core.api.Assertions diff --git a/node/src/test/kotlin/net/corda/node/services/persistence/NodeAttachmentStorageTest.kt b/node/src/test/kotlin/net/corda/node/services/persistence/NodeAttachmentStorageTest.kt index f1c55ca1a7..f979021fce 100644 --- a/node/src/test/kotlin/net/corda/node/services/persistence/NodeAttachmentStorageTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/persistence/NodeAttachmentStorageTest.kt @@ -14,9 +14,9 @@ import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.DatabaseTransactionManager import net.corda.node.utilities.configureDatabase import net.corda.testing.LogHelper -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties -import net.corda.testing.node.makeTestIdentityService +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import org.junit.After import org.junit.Before import org.junit.Test diff --git a/node/src/test/kotlin/net/corda/node/services/schema/HibernateObserverTests.kt b/node/src/test/kotlin/net/corda/node/services/schema/HibernateObserverTests.kt index 66c3d5dad0..bbade152b5 100644 --- a/node/src/test/kotlin/net/corda/node/services/schema/HibernateObserverTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/schema/HibernateObserverTests.kt @@ -12,9 +12,9 @@ import net.corda.node.services.api.SchemaService import net.corda.node.utilities.DatabaseTransactionManager import net.corda.node.utilities.configureDatabase import net.corda.testing.MEGA_CORP -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties -import net.corda.testing.node.makeTestIdentityService +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import org.hibernate.annotations.Cascade import org.hibernate.annotations.CascadeType import org.junit.After diff --git a/node/src/test/kotlin/net/corda/node/services/transactions/DistributedImmutableMapTests.kt b/node/src/test/kotlin/net/corda/node/services/transactions/DistributedImmutableMapTests.kt index f06897bae5..bd4c3358f3 100644 --- a/node/src/test/kotlin/net/corda/node/services/transactions/DistributedImmutableMapTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/transactions/DistributedImmutableMapTests.kt @@ -13,9 +13,9 @@ import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.DatabaseTransaction import net.corda.node.utilities.configureDatabase import net.corda.testing.* -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties -import net.corda.testing.node.makeTestIdentityService +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import org.junit.After import org.junit.Before import org.junit.Test diff --git a/node/src/test/kotlin/net/corda/node/services/transactions/PersistentUniquenessProviderTests.kt b/node/src/test/kotlin/net/corda/node/services/transactions/PersistentUniquenessProviderTests.kt index 289bc695ac..1c1124cb1f 100644 --- a/node/src/test/kotlin/net/corda/node/services/transactions/PersistentUniquenessProviderTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/transactions/PersistentUniquenessProviderTests.kt @@ -5,9 +5,9 @@ import net.corda.core.node.services.UniquenessException import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase import net.corda.testing.* -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties -import net.corda.testing.node.makeTestIdentityService +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import org.junit.After import org.junit.Before import org.junit.Test diff --git a/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt b/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt index 3d481851ae..c7a762117e 100644 --- a/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt @@ -28,7 +28,7 @@ import net.corda.node.utilities.CordaPersistence import net.corda.testing.* import net.corda.testing.contracts.fillWithSomeTestCash import net.corda.testing.node.MockServices -import net.corda.testing.node.makeTestDatabaseAndMockServices +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseAndMockServices import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatExceptionOfType import org.junit.After diff --git a/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt b/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt index 707361794c..10644b508e 100644 --- a/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt @@ -26,9 +26,9 @@ import net.corda.node.utilities.configureDatabase import net.corda.testing.* import net.corda.testing.contracts.* import net.corda.testing.node.MockServices -import net.corda.testing.node.makeTestDatabaseAndMockServices -import net.corda.testing.node.makeTestDatabaseProperties -import net.corda.testing.node.makeTestIdentityService +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseAndMockServices +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import net.corda.testing.schemas.DummyLinearStateSchemaV1 import org.assertj.core.api.Assertions import org.assertj.core.api.Assertions.assertThat diff --git a/node/src/test/kotlin/net/corda/node/services/vault/VaultWithCashTest.kt b/node/src/test/kotlin/net/corda/node/services/vault/VaultWithCashTest.kt index 66bf35ba86..250b4fab5f 100644 --- a/node/src/test/kotlin/net/corda/node/services/vault/VaultWithCashTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/vault/VaultWithCashTest.kt @@ -20,7 +20,7 @@ import net.corda.node.utilities.CordaPersistence import net.corda.testing.* import net.corda.testing.contracts.* import net.corda.testing.node.MockServices -import net.corda.testing.node.makeTestDatabaseAndMockServices +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseAndMockServices import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.After diff --git a/node/src/test/kotlin/net/corda/node/utilities/ObservablesTests.kt b/node/src/test/kotlin/net/corda/node/utilities/ObservablesTests.kt index 900c00e482..ffac359f49 100644 --- a/node/src/test/kotlin/net/corda/node/utilities/ObservablesTests.kt +++ b/node/src/test/kotlin/net/corda/node/utilities/ObservablesTests.kt @@ -3,9 +3,9 @@ package net.corda.node.utilities import com.google.common.util.concurrent.SettableFuture import net.corda.core.internal.bufferUntilSubscribed import net.corda.core.internal.tee -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties -import net.corda.testing.node.makeTestIdentityService +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import org.assertj.core.api.Assertions.assertThat import org.junit.After import org.junit.Test diff --git a/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt b/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt index 2d9e0577ef..1075b81154 100644 --- a/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt +++ b/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt @@ -33,6 +33,9 @@ import java.util.function.Predicate import kotlin.test.assertEquals import kotlin.test.assertFailsWith import kotlin.test.assertFalse +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService class NodeInterestRatesTest : TestDependencyInjectionBase() { val TEST_DATA = NodeInterestRates.parseFile(""" diff --git a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt index f8416266c3..dc98d58f81 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt @@ -25,8 +25,8 @@ import net.corda.node.utilities.X509Utilities import net.corda.nodeapi.config.SSLConfiguration import net.corda.nodeapi.internal.serialization.AMQP_ENABLED import net.corda.testing.node.MockServices -import net.corda.testing.node.makeTestDataSourceProperties -import net.corda.testing.node.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties import org.bouncycastle.asn1.x500.X500Name import org.bouncycastle.asn1.x500.X500NameBuilder import org.bouncycastle.asn1.x500.style.BCStyle diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt index ab849e220f..05b1ce3e03 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -36,7 +36,7 @@ import net.corda.nodeapi.config.SSLConfiguration import net.corda.nodeapi.config.parseAs import net.corda.nodeapi.internal.addShutdownHook import net.corda.testing.* -import net.corda.testing.node.MOCK_VERSION_INFO +import net.corda.testing.node.MockServices.Companion.MOCK_VERSION_INFO import okhttp3.OkHttpClient import okhttp3.Request import org.bouncycastle.asn1.x500.X500Name diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt index 603de51d4c..eae9105499 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt @@ -41,6 +41,7 @@ import java.security.KeyPair import java.security.cert.X509Certificate import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties /** * A mock node brings up a suite of in-memory services in a fast manner suitable for unit testing. diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt index 59fac74877..f68746fc1a 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt @@ -56,6 +56,85 @@ import java.util.jar.JarInputStream */ open class MockServices(vararg val keys: KeyPair) : ServiceHub { + companion object { + + @JvmStatic + val MOCK_VERSION_INFO = VersionInfo(1, "Mock release", "Mock revision", "Mock Vendor") + + /** + * Make properties appropriate for creating a DataSource for unit tests. + * + * @param nodeName Reflects the "instance" of the in-memory database. Defaults to a random string. + */ + // TODO: Can we use an X509 principal generator here? + @JvmStatic + fun makeTestDataSourceProperties(nodeName: String = SecureHash.randomSHA256().toString()): Properties { + val props = Properties() + props.setProperty("dataSourceClassName", "org.h2.jdbcx.JdbcDataSource") + props.setProperty("dataSource.url", "jdbc:h2:mem:${nodeName}_persistence;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE") + props.setProperty("dataSource.user", "sa") + props.setProperty("dataSource.password", "") + return props + } + + /** + * Make properties appropriate for creating a Database for unit tests. + * + * @param key (optional) key of a database property to be set. + * @param value (optional) value of a database property to be set. + */ + @JvmStatic + fun makeTestDatabaseProperties(key: String? = null, value: String? = null): Properties { + val props = Properties() + props.setProperty("transactionIsolationLevel", "repeatableRead") //for other possible values see net.corda.node.utilities.CordaPeristence.parserTransactionIsolationLevel(String) + if (key != null) { props.setProperty(key, value) } + return props + } + + /** + * Creates an instance of [InMemoryIdentityService] with [MOCK_IDENTITIES]. + */ + @JvmStatic + fun makeTestIdentityService() = InMemoryIdentityService(MOCK_IDENTITIES, trustRoot = DUMMY_CA.certificate) + + /** + * Makes database and mock services appropriate for unit tests. + * + * @param customSchemas a set of schemas being used by [NodeSchemaService] + * @param keys a lis of [KeyPair] instances to be used by [MockServices]. Defualts to [MEGA_CORP_KEY] + * @param createIdentityService a lambda function returning an instance of [IdentityService]. Defauts to [InMemoryIdentityService]. + * + * @return a pair where the first element is the instance of [CordaPersistence] and the second is [MockServices]. + */ + @JvmStatic + fun makeTestDatabaseAndMockServices(customSchemas: Set = setOf(CommercialPaperSchemaV1, DummyLinearStateSchemaV1, CashSchemaV1), + keys: List = listOf(MEGA_CORP_KEY), + createIdentityService: () -> IdentityService = { makeTestIdentityService() }): Pair { + val dataSourceProps = makeTestDataSourceProperties() + val databaseProperties = makeTestDatabaseProperties() + val createSchemaService = { NodeSchemaService(customSchemas) } + val database = configureDatabase(dataSourceProps, databaseProperties, createSchemaService, createIdentityService) + val mockService = database.transaction { + object : MockServices(*(keys.toTypedArray())) { + override val vaultService: VaultService = makeVaultService(database.hibernateConfig) + + override fun recordTransactions(notifyVault: Boolean, txs: Iterable) { + for (stx in txs) { + validatedTransactions.addTransaction(stx) + } + // Refactored to use notifyAll() as we have no other unit test for that method with multiple transactions. + vaultService.notifyAll(txs.map { it.tx }) + } + + override val vaultQueryService: VaultQueryService = HibernateVaultQueryImpl(database.hibernateConfig, vaultService) + + override fun jdbcSession(): Connection = database.createSession() + } + } + return Pair(database, mockService) + } + } + constructor() : this(generateKeyPair()) val key: KeyPair get() = keys.first() @@ -193,56 +272,3 @@ open class MockTransactionStorage : WritableTransactionStorage, SingletonSeriali override fun getTransaction(id: SecureHash): SignedTransaction? = txns[id] } - -/** - * Make properties appropriate for creating a DataSource for unit tests. - * - * @param nodeName Reflects the "instance" of the in-memory database. Defaults to a random string. - */ -// TODO: Can we use an X509 principal generator here? -fun makeTestDataSourceProperties(nodeName: String = SecureHash.randomSHA256().toString()): Properties { - val props = Properties() - props.setProperty("dataSourceClassName", "org.h2.jdbcx.JdbcDataSource") - props.setProperty("dataSource.url", "jdbc:h2:mem:${nodeName}_persistence;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE") - props.setProperty("dataSource.user", "sa") - props.setProperty("dataSource.password", "") - return props -} - -fun makeTestDatabaseProperties(key: String? = null, value: String? = null): Properties { - val props = Properties() - props.setProperty("transactionIsolationLevel", "repeatableRead") //for other possible values see net.corda.node.utilities.CordaPeristence.parserTransactionIsolationLevel(String) - if (key != null) { props.setProperty(key, value) } - return props -} - -fun makeTestIdentityService() = InMemoryIdentityService(MOCK_IDENTITIES, trustRoot = DUMMY_CA.certificate) - -fun makeTestDatabaseAndMockServices(customSchemas: Set = setOf(CommercialPaperSchemaV1, DummyLinearStateSchemaV1, CashSchemaV1), - keys: List = listOf(MEGA_CORP_KEY), - createIdentityService: () -> IdentityService = { makeTestIdentityService() }): Pair { - val dataSourceProps = makeTestDataSourceProperties() - val databaseProperties = makeTestDatabaseProperties() - val createSchemaService = { NodeSchemaService(customSchemas) } - val database = configureDatabase(dataSourceProps, databaseProperties, createSchemaService, createIdentityService) - val mockService = database.transaction { - object : MockServices(*(keys.toTypedArray())) { - override val vaultService: VaultService = makeVaultService(database.hibernateConfig) - - override fun recordTransactions(notifyVault: Boolean, txs: Iterable) { - for (stx in txs) { - validatedTransactions.addTransaction(stx) - } - // Refactored to use notifyAll() as we have no other unit test for that method with multiple transactions. - vaultService.notifyAll(txs.map { it.tx }) - } - - override val vaultQueryService: VaultQueryService = HibernateVaultQueryImpl(database.hibernateConfig, vaultService) - - override fun jdbcSession(): Connection = database.createSession() - } - } - return Pair(database, mockService) -} - -val MOCK_VERSION_INFO = VersionInfo(1, "Mock release", "Mock revision", "Mock Vendor") diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt b/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt index 64a871db5f..8bd949ca60 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt @@ -27,6 +27,7 @@ import net.corda.testing.DUMMY_MAP import net.corda.testing.TestDependencyInjectionBase import net.corda.testing.driver.addressMustNotBeBoundFuture import net.corda.testing.getFreeLocalPorts +import net.corda.testing.node.MockServices.Companion.MOCK_VERSION_INFO import org.apache.logging.log4j.Level import org.bouncycastle.asn1.x500.X500Name import org.junit.After diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt b/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt index 4e45f47417..f10d1b12cf 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt @@ -24,6 +24,7 @@ import net.corda.testing.freeLocalHostAndPort import java.security.KeyPair import java.security.cert.X509Certificate import kotlin.concurrent.thread +import net.corda.testing.node.MockServices.Companion.MOCK_VERSION_INFO /** * This is a bare-bones node which can only send and receive messages. It doesn't register with a network map service or From e50052aeb1437cac3088d4119333d8c8fa9565a2 Mon Sep 17 00:00:00 2001 From: Joel Dudley Date: Wed, 30 Aug 2017 13:20:11 +0100 Subject: [PATCH 020/120] Update getting-set-up.rst. --- docs/source/getting-set-up.rst | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/source/getting-set-up.rst b/docs/source/getting-set-up.rst index 9bea246253..8164e4e89a 100644 --- a/docs/source/getting-set-up.rst +++ b/docs/source/getting-set-up.rst @@ -5,14 +5,12 @@ Software requirements --------------------- Corda uses industry-standard tools: -* **Oracle JDK 8 JVM** - supported version **8u131** +* **Oracle JDK 8 JVM** - minimum supported version **8u131** * **IntelliJ IDEA** - supported versions **2017.1**, **2017.2** and **2017.3** -* **Gradle** - supported version **3.4** -* **Kotlin** - supported version **1.1.2** * **Git** -You do not need to install Gradle or Kotlin. A standalone Gradle wrapper is provided, and it will download the correct -version of Kotlin. +We also use Gradle and Kotlin, but you do not need to install them. A standalone Gradle wrapper is provided, and it +will download the correct version of Kotlin. Please note: From 89fa2eb8b615afa3af6c0c2a8c3611aa0ef5c621 Mon Sep 17 00:00:00 2001 From: Katelyn Baker Date: Wed, 30 Aug 2017 14:12:42 +0100 Subject: [PATCH 021/120] M15 Release - move master version number onto 0.16 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fb5d920704..0f96934d8e 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { file("$projectDir/constants.properties").withInputStream { constants.load(it) } // Our version: bump this on release. - ext.corda_release_version = "0.15-SNAPSHOT" + ext.corda_release_version = "0.16-SNAPSHOT" // Increment this on any release that changes public APIs anywhere in the Corda platform // TODO This is going to be difficult until we have a clear separation throughout the code of what is public and what is internal ext.corda_platform_version = 1 From 923fe16392018f0280f0ca4359e2dc20a80b8748 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Wed, 30 Aug 2017 14:53:37 +0100 Subject: [PATCH 022/120] Update Dokka configuration * Switch documentation JDK version to 8 * Add node-api package to Dokka includes * Remove node package from Dokka includes --- docs/build.gradle | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/build.gradle b/docs/build.gradle index b48623ac83..6bb772d729 100644 --- a/docs/build.gradle +++ b/docs/build.gradle @@ -9,7 +9,8 @@ dokka { moduleName = 'corda' outputDirectory = file("${rootProject.rootDir}/docs/build/html/api/kotlin") processConfigurations = ['compile'] - sourceDirs = files('../core/src/main/kotlin', '../client/jfx/src/main/kotlin', '../client/mock/src/main/kotlin', '../client/rpc/src/main/kotlin', '../node/src/main/kotlin', '../finance/src/main/kotlin', '../client/jackson/src/main/kotlin') + sourceDirs = files('../core/src/main/kotlin', '../client/jfx/src/main/kotlin', '../client/mock/src/main/kotlin', '../client/rpc/src/main/kotlin', '../node-api/src/main/kotlin', '../finance/src/main/kotlin', '../client/jackson/src/main/kotlin') + jdkVersion = 8 } task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) { @@ -17,8 +18,9 @@ task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) { outputFormat = "javadoc" outputDirectory = file("${rootProject.rootDir}/docs/build/html/api/javadoc") processConfigurations = ['compile'] - sourceDirs = files('../core/src/main/kotlin', '../client/jfx/src/main/kotlin', '../client/mock/src/main/kotlin', '../client/rpc/src/main/kotlin', '../node/src/main/kotlin', '../finance/src/main/kotlin', '../client/jackson/src/main/kotlin') + sourceDirs = files('../core/src/main/kotlin', '../client/jfx/src/main/kotlin', '../client/mock/src/main/kotlin', '../client/rpc/src/main/kotlin', '../node-api/src/main/kotlin', '../finance/src/main/kotlin', '../client/jackson/src/main/kotlin') includes = ['packages.md'] + jdkVersion = 8 } task buildDocs(dependsOn: ['apidocs', 'makeDocs']) From a9f572c3668982b3d68337c6a1542c8300389098 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Fri, 25 Aug 2017 15:12:45 +0100 Subject: [PATCH 023/120] Move Jackson client support into net.corda.client.jackson package Move Jackson client support into net.corda.client.jackson package to match naming scheme used elsewhere --- .../net/corda/{ => client}/jackson/JacksonSupport.kt | 2 +- .../corda/{ => client}/jackson/StringToMethodCallParser.kt | 6 +++--- .../net/corda/{ => client}/jackson/JacksonSupportTest.kt | 2 +- .../{ => client}/jackson/StringToMethodCallParserTest.kt | 4 ++-- docs/packages.md | 7 ++++++- .../main/java/net/corda/node/shell/RunShellCommand.java | 2 +- .../main/kotlin/net/corda/node/shell/InteractiveShell.kt | 4 ++-- .../src/test/kotlin/net/corda/node/InteractiveShellTest.kt | 4 ++-- .../integration-test/kotlin/net/corda/irs/IRSDemoTest.kt | 2 +- .../kotlin/net/corda/netmap/simulation/IRSSimulation.kt | 2 +- .../kotlin/net/corda/testing/FlowStackSnapshotTest.kt | 2 +- .../src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt | 2 +- .../src/main/kotlin/net/corda/testing/http/HttpApi.kt | 2 +- .../src/main/kotlin/net/corda/testing/http/HttpUtils.kt | 2 +- .../kotlin/net/corda/webserver/internal/NodeWebServer.kt | 2 +- 15 files changed, 25 insertions(+), 20 deletions(-) rename client/jackson/src/main/kotlin/net/corda/{ => client}/jackson/JacksonSupport.kt (99%) rename client/jackson/src/main/kotlin/net/corda/{ => client}/jackson/StringToMethodCallParser.kt (99%) rename client/jackson/src/test/kotlin/net/corda/{ => client}/jackson/JacksonSupportTest.kt (98%) rename client/jackson/src/test/kotlin/net/corda/{ => client}/jackson/StringToMethodCallParserTest.kt (98%) diff --git a/client/jackson/src/main/kotlin/net/corda/jackson/JacksonSupport.kt b/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt similarity index 99% rename from client/jackson/src/main/kotlin/net/corda/jackson/JacksonSupport.kt rename to client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt index cf2ed02f52..0abf4770ab 100644 --- a/client/jackson/src/main/kotlin/net/corda/jackson/JacksonSupport.kt +++ b/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt @@ -1,4 +1,4 @@ -package net.corda.jackson +package net.corda.client.jackson import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonProperty diff --git a/client/jackson/src/main/kotlin/net/corda/jackson/StringToMethodCallParser.kt b/client/jackson/src/main/kotlin/net/corda/client/jackson/StringToMethodCallParser.kt similarity index 99% rename from client/jackson/src/main/kotlin/net/corda/jackson/StringToMethodCallParser.kt rename to client/jackson/src/main/kotlin/net/corda/client/jackson/StringToMethodCallParser.kt index 45454ef1d0..ddbf924c27 100644 --- a/client/jackson/src/main/kotlin/net/corda/jackson/StringToMethodCallParser.kt +++ b/client/jackson/src/main/kotlin/net/corda/client/jackson/StringToMethodCallParser.kt @@ -1,11 +1,11 @@ -package net.corda.jackson +package net.corda.client.jackson import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.dataformat.yaml.YAMLFactory import com.google.common.collect.HashMultimap import com.google.common.collect.Multimap -import net.corda.jackson.StringToMethodCallParser.ParsedMethodCall +import net.corda.client.jackson.StringToMethodCallParser.ParsedMethodCall import org.slf4j.LoggerFactory import java.lang.reflect.Constructor import java.lang.reflect.Method @@ -223,4 +223,4 @@ open class StringToMethodCallParser @JvmOverloads constructor( Pair(name, argStr) }.toMap() } -} \ No newline at end of file +} diff --git a/client/jackson/src/test/kotlin/net/corda/jackson/JacksonSupportTest.kt b/client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt similarity index 98% rename from client/jackson/src/test/kotlin/net/corda/jackson/JacksonSupportTest.kt rename to client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt index 13acd147ab..fec036aeb2 100644 --- a/client/jackson/src/test/kotlin/net/corda/jackson/JacksonSupportTest.kt +++ b/client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt @@ -1,4 +1,4 @@ -package net.corda.jackson +package net.corda.client.jackson import com.fasterxml.jackson.databind.SerializationFeature import net.corda.core.contracts.Amount diff --git a/client/jackson/src/test/kotlin/net/corda/jackson/StringToMethodCallParserTest.kt b/client/jackson/src/test/kotlin/net/corda/client/jackson/StringToMethodCallParserTest.kt similarity index 98% rename from client/jackson/src/test/kotlin/net/corda/jackson/StringToMethodCallParserTest.kt rename to client/jackson/src/test/kotlin/net/corda/client/jackson/StringToMethodCallParserTest.kt index 7610fbf91b..a93052a48e 100644 --- a/client/jackson/src/test/kotlin/net/corda/jackson/StringToMethodCallParserTest.kt +++ b/client/jackson/src/test/kotlin/net/corda/client/jackson/StringToMethodCallParserTest.kt @@ -1,4 +1,4 @@ -package net.corda.jackson +package net.corda.client.jackson import net.corda.core.crypto.SecureHash import org.junit.Assert.assertArrayEquals @@ -65,4 +65,4 @@ class StringToMethodCallParserTest { val args: Array = parser.parseArguments(clazz.name, names.zip(ctor.parameterTypes), "alternativeWord: Foo bar!") assertArrayEquals(args, arrayOf("Foo bar!")) } -} \ No newline at end of file +} diff --git a/docs/packages.md b/docs/packages.md index 6c620dede6..e334a631c0 100644 --- a/docs/packages.md +++ b/docs/packages.md @@ -1,3 +1,8 @@ # Package net.corda.finance.utils -A collection of utilities for summing financial states, for example, summing obligations to get total debts. \ No newline at end of file +A collection of utilities for summing financial states, for example, summing obligations to get total debts. + +# Package net.corda.client.jackson + +Utilities and serialisers for working with JSON representations of basic types. This adds Jackson support for +the java.time API, some core types, and Kotlin data classes. diff --git a/node/src/main/java/net/corda/node/shell/RunShellCommand.java b/node/src/main/java/net/corda/node/shell/RunShellCommand.java index 1b5d0efbb4..c388ccfe5f 100644 --- a/node/src/main/java/net/corda/node/shell/RunShellCommand.java +++ b/node/src/main/java/net/corda/node/shell/RunShellCommand.java @@ -1,7 +1,7 @@ package net.corda.node.shell; import net.corda.core.messaging.*; -import net.corda.jackson.*; +import net.corda.client.jackson.*; import org.crsh.cli.*; import org.crsh.command.*; diff --git a/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt b/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt index 37386f42f0..f764c595b1 100644 --- a/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt +++ b/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt @@ -21,8 +21,8 @@ import net.corda.core.internal.* import net.corda.core.messaging.CordaRPCOps import net.corda.core.messaging.StateMachineUpdate import net.corda.core.utilities.loggerFor -import net.corda.jackson.JacksonSupport -import net.corda.jackson.StringToMethodCallParser +import net.corda.client.jackson.JacksonSupport +import net.corda.client.jackson.StringToMethodCallParser import net.corda.node.internal.Node import net.corda.node.services.messaging.CURRENT_RPC_CONTEXT import net.corda.node.services.messaging.RpcContext diff --git a/node/src/test/kotlin/net/corda/node/InteractiveShellTest.kt b/node/src/test/kotlin/net/corda/node/InteractiveShellTest.kt index 6a70ea30a0..bd2ae43f57 100644 --- a/node/src/test/kotlin/net/corda/node/InteractiveShellTest.kt +++ b/node/src/test/kotlin/net/corda/node/InteractiveShellTest.kt @@ -10,7 +10,7 @@ import net.corda.core.internal.FlowStateMachine import net.corda.core.node.ServiceHub import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.UntrustworthyData -import net.corda.jackson.JacksonSupport +import net.corda.client.jackson.JacksonSupport import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.shell.InteractiveShell import net.corda.testing.DUMMY_CA @@ -94,4 +94,4 @@ class InteractiveShellTest { override fun flowStackSnapshot(flowClass: Class>): FlowStackSnapshot? = null override fun persistFlowStackSnapshot(flowClass: Class>) = Unit } -} \ No newline at end of file +} diff --git a/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt b/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt index 1116623f2a..8c98accf78 100644 --- a/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt +++ b/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt @@ -61,7 +61,7 @@ class IRSDemoTest : IntegrationTestCategory { log.info("All webservers started") val (_, nodeAApi, nodeBApi) = listOf(controller, nodeA, nodeB).zip(listOf(controllerAddr, nodeAAddr, nodeBAddr)).map { - val mapper = net.corda.jackson.JacksonSupport.createDefaultMapper(it.first.rpc) + val mapper = net.corda.client.jackson.JacksonSupport.createDefaultMapper(it.first.rpc) registerFinanceJSONMappers(mapper) HttpApi.fromHostAndPort(it.second, "api/irs", mapper = mapper) } diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt index c18dac37b2..1e2a624d02 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt @@ -20,7 +20,7 @@ import net.corda.finance.flows.TwoPartyDealFlow.Instigator import net.corda.finance.plugin.registerFinanceJSONMappers import net.corda.irs.contract.InterestRateSwap import net.corda.irs.flows.FixingFlow -import net.corda.jackson.JacksonSupport +import net.corda.client.jackson.JacksonSupport import net.corda.node.services.identity.InMemoryIdentityService import net.corda.testing.DUMMY_CA import net.corda.testing.node.InMemoryMessagingNetwork diff --git a/test-utils/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt b/test-utils/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt index b1a1dba4fc..daca04c3c7 100644 --- a/test-utils/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt +++ b/test-utils/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt @@ -1,6 +1,7 @@ package net.corda.testing import co.paralleluniverse.fibers.Suspendable +import net.corda.client.jackson.JacksonSupport import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowStackSnapshot import net.corda.core.flows.StartableByRPC @@ -10,7 +11,6 @@ import net.corda.core.internal.list import net.corda.core.internal.read import net.corda.core.messaging.startFlow import net.corda.core.serialization.CordaSerializable -import net.corda.jackson.JacksonSupport import net.corda.node.services.FlowPermissions.Companion.startFlowPermission import net.corda.nodeapi.User import net.corda.testing.driver.driver diff --git a/test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt b/test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt index 9ee727f418..94eb3a7a12 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt @@ -15,7 +15,7 @@ import net.corda.core.internal.FlowStateMachine import net.corda.core.internal.div import net.corda.core.internal.write import net.corda.core.serialization.SerializeAsToken -import net.corda.jackson.JacksonSupport +import net.corda.client.jackson.JacksonSupport import net.corda.node.services.statemachine.FlowStackSnapshotFactory import java.nio.file.Path import java.time.Instant diff --git a/test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt b/test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt index dbbe571af5..743934e921 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt @@ -30,7 +30,7 @@ class HttpApi(val root: URL, val mapper: ObjectMapper = defaultMapper) { fun fromHostAndPort(hostAndPort: NetworkHostAndPort, base: String, protocol: String = "http", mapper: ObjectMapper = defaultMapper): HttpApi = HttpApi(URL("$protocol://$hostAndPort/$base/"), mapper) private val defaultMapper: ObjectMapper by lazy { - net.corda.jackson.JacksonSupport.createNonRpcMapper() + net.corda.client.jackson.JacksonSupport.createNonRpcMapper() } } } diff --git a/test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt b/test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt index 94eef77537..6a65441726 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt @@ -22,7 +22,7 @@ object HttpUtils { .readTimeout(60, TimeUnit.SECONDS).build() } val defaultMapper: ObjectMapper by lazy { - net.corda.jackson.JacksonSupport.createNonRpcMapper() + net.corda.client.jackson.JacksonSupport.createNonRpcMapper() } fun putJson(url: URL, data: String): Boolean { diff --git a/webserver/src/main/kotlin/net/corda/webserver/internal/NodeWebServer.kt b/webserver/src/main/kotlin/net/corda/webserver/internal/NodeWebServer.kt index 10fe8410e2..80d337cc39 100644 --- a/webserver/src/main/kotlin/net/corda/webserver/internal/NodeWebServer.kt +++ b/webserver/src/main/kotlin/net/corda/webserver/internal/NodeWebServer.kt @@ -1,10 +1,10 @@ package net.corda.webserver.internal import com.google.common.html.HtmlEscapers.htmlEscaper +import net.corda.client.jackson.JacksonSupport import net.corda.client.rpc.CordaRPCClient import net.corda.core.messaging.CordaRPCOps import net.corda.core.utilities.loggerFor -import net.corda.jackson.JacksonSupport import net.corda.nodeapi.ArtemisMessagingComponent import net.corda.webserver.WebServerConfig import net.corda.webserver.services.WebServerPluginRegistry From 9bd4342039ecf20f24ec4a52808f9dc8204bf769 Mon Sep 17 00:00:00 2001 From: Patrick Kuo Date: Wed, 30 Aug 2017 16:26:34 +0100 Subject: [PATCH 024/120] Removed is relevant from LinearState (#1294) --- .../net/corda/core/contracts/Structures.kt | 5 ----- docs/source/api-vault-query.rst | 2 +- docs/source/changelog.rst | 4 +++- .../docs/WorkflowTransactionBuildTutorial.kt | 6 ----- .../node/services/vault/NodeVaultService.kt | 22 +++++++++---------- .../events/NodeSchedulerServiceTest.kt | 9 ++++---- .../services/events/ScheduledFlowTests.kt | 4 ---- .../services/vault/NodeVaultServiceTest.kt | 9 +++++--- .../main/kotlin/net/corda/irs/contract/IRS.kt | 4 ---- .../net/corda/vega/contracts/IRSState.kt | 4 ---- .../corda/vega/contracts/PortfolioState.kt | 4 ---- .../testing/contracts/DummyDealContract.kt | 4 ---- .../testing/contracts/DummyLinearContract.kt | 4 ---- 13 files changed, 24 insertions(+), 57 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/contracts/Structures.kt b/core/src/main/kotlin/net/corda/core/contracts/Structures.kt index c54a779595..6930c209aa 100644 --- a/core/src/main/kotlin/net/corda/core/contracts/Structures.kt +++ b/core/src/main/kotlin/net/corda/core/contracts/Structures.kt @@ -219,11 +219,6 @@ interface LinearState : ContractState { * except at issuance/termination. */ val linearId: UniqueIdentifier - - /** - * True if this should be tracked by our vault(s). - */ - fun isRelevant(ourKeys: Set): Boolean } // DOCEND 2 diff --git a/docs/source/api-vault-query.rst b/docs/source/api-vault-query.rst index 32626ecb0a..c7fd9948da 100644 --- a/docs/source/api-vault-query.rst +++ b/docs/source/api-vault-query.rst @@ -395,4 +395,4 @@ The Corda Tutorials provide examples satisfying these additional Use Cases: .. _JPQL: http://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#hql .. _JPA: https://docs.spring.io/spring-data/jpa/docs/current/reference/html - + diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index cd88037e0a..2ce4b0db3f 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -34,7 +34,6 @@ UNRELEASED must use ``SendTransactionFlow`` at the correct place. There is also ``ReceiveStateAndRefFlow`` and ``SendStateAndRefFlow`` for dealing with ``StateAndRef``s. - * Vault query soft locking enhancements and deprecations * removed original ``VaultService`` ``softLockedStates` query mechanism. * introduced improved ``SoftLockingCondition`` filterable attribute in ``VaultQueryCriteria`` to enable specification @@ -68,6 +67,9 @@ UNRELEASED * Moved ``:finance`` gradle project files into a ``net.corda.finance`` package namespace. This may require adjusting imports of Cash flow references and also of ``StartFlow`` permission in ``gradle.build`` files. +* Removed the concept of relevancy from ``LinearState``. The ``ContractState``'s relevancy to the vault can be determined + by the flow context, the vault will process any transaction from a flow which is not derived from transaction resolution verification. + Milestone 14 ------------ diff --git a/docs/source/example-code/src/main/kotlin/net/corda/docs/WorkflowTransactionBuildTutorial.kt b/docs/source/example-code/src/main/kotlin/net/corda/docs/WorkflowTransactionBuildTutorial.kt index daa6d6e149..1a95f67464 100644 --- a/docs/source/example-code/src/main/kotlin/net/corda/docs/WorkflowTransactionBuildTutorial.kt +++ b/docs/source/example-code/src/main/kotlin/net/corda/docs/WorkflowTransactionBuildTutorial.kt @@ -3,7 +3,6 @@ package net.corda.docs import co.paralleluniverse.fibers.Suspendable import net.corda.core.contracts.* import net.corda.core.crypto.TransactionSignature -import net.corda.core.crypto.containsAny import net.corda.core.flows.FinalityFlow import net.corda.core.flows.FlowLogic import net.corda.core.flows.InitiatedBy @@ -18,7 +17,6 @@ import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.seconds import net.corda.core.utilities.unwrap -import java.security.PublicKey // Minimal state model of a manual approval process @CordaSerializable @@ -51,10 +49,6 @@ data class TradeApprovalContract(private val blank: Void? = null) : Contract { val parties: List get() = listOf(source, counterparty) override val participants: List get() = parties - - override fun isRelevant(ourKeys: Set): Boolean { - return participants.any { it.owningKey.containsAny(ourKeys) } - } } /** diff --git a/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt b/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt index 64fb9c81fa..023e87a1f7 100644 --- a/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt +++ b/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt @@ -4,7 +4,6 @@ import co.paralleluniverse.fibers.Suspendable import co.paralleluniverse.strands.Strand import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash -import net.corda.core.crypto.containsAny import net.corda.core.internal.ThreadBox import net.corda.core.internal.VisibleForTesting import net.corda.core.internal.tee @@ -144,10 +143,10 @@ class NodeVaultService(private val services: ServiceHub) : SingletonSerializeAsT } private fun notifyRegular(txns: Iterable) { - val ourKeys = services.keyManagementService.keys fun makeUpdate(tx: WireTransaction): Vault.Update { + val myKeys = services.keyManagementService.filterMyKeys(tx.outputs.flatMap { it.data.participants.map { it.owningKey } }) val ourNewStates = tx.outputs. - filter { isRelevant(it.data, ourKeys) }. + filter { isRelevant(it.data, myKeys.toSet()) }. map { tx.outRef(it.data) } // Retrieve all unconsumed states for this transaction's inputs @@ -173,13 +172,10 @@ class NodeVaultService(private val services: ServiceHub) : SingletonSerializeAsT // We also can't do filtering beforehand, since output encumbrance pointers get recalculated based on // input positions val ltx = tx.resolve(services, emptyList()) - + val myKeys = services.keyManagementService.filterMyKeys(ltx.outputs.flatMap { it.data.participants.map { it.owningKey } }) val (consumedStateAndRefs, producedStates) = ltx.inputs. zip(ltx.outputs). - filter { - (_, output) -> - isRelevant(output.data, ourKeys) - }. + filter { (_, output) -> isRelevant(output.data, myKeys.toSet()) }. unzip() val producedStateAndRefs = producedStates.map { ltx.outRef(it.data) } @@ -391,9 +387,11 @@ class NodeVaultService(private val services: ServiceHub) : SingletonSerializeAsT } @VisibleForTesting - internal fun isRelevant(state: ContractState, ourKeys: Set) = when (state) { - is OwnableState -> state.owner.owningKey.containsAny(ourKeys) - is LinearState -> state.isRelevant(ourKeys) - else -> ourKeys.intersect(state.participants.map { it.owningKey }).isNotEmpty() + internal fun isRelevant(state: ContractState, myKeys: Set): Boolean { + val keysToCheck = when (state) { + is OwnableState -> listOf(state.owner.owningKey) + else -> state.participants.map { it.owningKey } + } + return keysToCheck.any { it in myKeys } } } diff --git a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt index deaf74f15d..0280afd686 100644 --- a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt @@ -5,6 +5,7 @@ import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowLogicRef import net.corda.core.flows.FlowLogicRefFactory import net.corda.core.identity.AbstractParty +import net.corda.core.identity.Party import net.corda.core.node.ServiceHub import net.corda.core.node.services.VaultService import net.corda.core.serialization.SingletonSerializeAsToken @@ -120,14 +121,12 @@ class NodeSchedulerServiceTest : SingletonSerializeAsToken() { resetTestSerialization() } - class TestState(val flowLogicRef: FlowLogicRef, val instant: Instant) : LinearState, SchedulableState { + class TestState(val flowLogicRef: FlowLogicRef, val instant: Instant, private val myIdentity: Party) : LinearState, SchedulableState { override val participants: List - get() = throw UnsupportedOperationException() + get() = listOf(myIdentity) override val linearId = UniqueIdentifier() - override fun isRelevant(ourKeys: Set): Boolean = true - override fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity? { return ScheduledActivity(flowLogicRef, instant) } @@ -279,7 +278,7 @@ class NodeSchedulerServiceTest : SingletonSerializeAsToken() { database.transaction { apply { val freshKey = services.keyManagementService.freshKey() - val state = TestState(FlowLogicRefFactoryImpl.createForRPC(TestFlowLogic::class.java, increment), instant) + val state = TestState(FlowLogicRefFactoryImpl.createForRPC(TestFlowLogic::class.java, increment), instant, services.myInfo.legalIdentity) val builder = TransactionBuilder(null).apply { addOutputState(state, DUMMY_NOTARY) addCommand(Command(), freshKey) diff --git a/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt b/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt index 5988b575db..6b1035adf1 100644 --- a/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt @@ -58,10 +58,6 @@ class ScheduledFlowTests { } override val participants: List = listOf(source, destination) - - override fun isRelevant(ourKeys: Set): Boolean { - return participants.any { it.owningKey.containsAny(ourKeys) } - } } class InsertInitialStateFlow(val destination: Party) : FlowLogic() { diff --git a/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt b/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt index c7a762117e..cc839addf4 100644 --- a/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt @@ -476,15 +476,18 @@ class NodeVaultServiceTest : TestDependencyInjectionBase() { val service = (services.vaultService as NodeVaultService) val amount = Amount(1000, Issued(BOC.ref(1), GBP)) val wellKnownCash = Cash.State(amount, services.myInfo.legalIdentity) - assertTrue { service.isRelevant(wellKnownCash, services.keyManagementService.keys) } + val myKeys = services.keyManagementService.filterMyKeys(listOf(wellKnownCash.owner.owningKey)) + assertTrue { service.isRelevant(wellKnownCash, myKeys.toSet()) } val anonymousIdentity = services.keyManagementService.freshKeyAndCert(services.myInfo.legalIdentityAndCert, false) val anonymousCash = Cash.State(amount, anonymousIdentity.party) - assertTrue { service.isRelevant(anonymousCash, services.keyManagementService.keys) } + val anonymousKeys = services.keyManagementService.filterMyKeys(listOf(anonymousCash.owner.owningKey)) + assertTrue { service.isRelevant(anonymousCash, anonymousKeys.toSet()) } val thirdPartyIdentity = AnonymousParty(generateKeyPair().public) val thirdPartyCash = Cash.State(amount, thirdPartyIdentity) - assertFalse { service.isRelevant(thirdPartyCash, services.keyManagementService.keys) } + val thirdPartyKeys = services.keyManagementService.filterMyKeys(listOf(thirdPartyCash.owner.owningKey)) + assertFalse { service.isRelevant(thirdPartyCash, thirdPartyKeys.toSet()) } } // TODO: Unit test linear state relevancy checks diff --git a/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt b/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt index aa901cfe6b..e7053be51f 100644 --- a/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt +++ b/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt @@ -618,10 +618,6 @@ class InterestRateSwap : Contract { override val participants: List get() = listOf(fixedLeg.fixedRatePayer, floatingLeg.floatingRatePayer) - override fun isRelevant(ourKeys: Set): Boolean { - return fixedLeg.fixedRatePayer.owningKey.containsAny(ourKeys) || floatingLeg.floatingRatePayer.owningKey.containsAny(ourKeys) - } - override fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity? { val nextFixingOf = nextFixingOf() ?: return null diff --git a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/IRSState.kt b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/IRSState.kt index a7b02c55a0..db1eff6755 100644 --- a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/IRSState.kt +++ b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/IRSState.kt @@ -22,10 +22,6 @@ data class IRSState(val swap: SwapData, val ref: String get() = linearId.externalId!! // Same as the constructor for UniqueIdentified override val participants: List get() = listOf(buyer, seller) - override fun isRelevant(ourKeys: Set): Boolean { - return participants.flatMap { it.owningKey.keys }.intersect(ourKeys).isNotEmpty() - } - override fun generateAgreement(notary: Party): TransactionBuilder { val state = IRSState(swap, buyer, seller, OGTrade()) return TransactionBuilder(notary).withItems(state, Command(OGTrade.Commands.Agree(), participants.map { it.owningKey })) diff --git a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/PortfolioState.kt b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/PortfolioState.kt index ee351737c5..02b1367d14 100644 --- a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/PortfolioState.kt +++ b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/PortfolioState.kt @@ -37,10 +37,6 @@ data class PortfolioState(val portfolio: List, return ScheduledActivity(flow, LocalDate.now().plus(1, ChronoUnit.DAYS).atStartOfDay().toInstant(ZoneOffset.UTC)) } - override fun isRelevant(ourKeys: Set): Boolean { - return participants.flatMap { it.owningKey.keys }.intersect(ourKeys).isNotEmpty() - } - override fun generateAgreement(notary: Party): TransactionBuilder { return TransactionBuilder(notary).withItems(copy(), Command(PortfolioSwap.Commands.Agree(), participants.map { it.owningKey })) } diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt b/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt index 1ac197efb7..bd0e41b08f 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt @@ -26,10 +26,6 @@ class DummyDealContract : Contract { participants: List = listOf(), ref: String) : this(contract, participants, UniqueIdentifier(ref)) - override fun isRelevant(ourKeys: Set): Boolean { - return participants.any { it.owningKey.containsAny(ourKeys) } - } - override fun generateAgreement(notary: Party): TransactionBuilder { throw UnsupportedOperationException("not implemented") } diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt b/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt index c2bb95fd09..408fefffd3 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt @@ -39,10 +39,6 @@ class DummyLinearContract : Contract { val linearBoolean: Boolean = true, val nonce: SecureHash = SecureHash.randomSHA256()) : LinearState, QueryableState { - override fun isRelevant(ourKeys: Set): Boolean { - return participants.any { it.owningKey.containsAny(ourKeys) } - } - override fun supportedSchemas(): Iterable = listOf(DummyLinearStateSchemaV1, DummyLinearStateSchemaV2) override fun generateMappedObject(schema: MappedSchema): PersistentState { From e9f3b92e97d26cb1a6f07273e1d175a95c78e830 Mon Sep 17 00:00:00 2001 From: Andras Slemmer Date: Wed, 30 Aug 2017 17:13:25 +0100 Subject: [PATCH 025/120] Add alwaysExcluded flag to quasar-hook, run config for generating exclude pattern --- ...check_output_at_the_bottom_of_console_.xml | 25 ++++++++++++++++ experimental/quasar-hook/README.md | 29 ++++++++++++++----- .../quasarhook/QuasarInstrumentationHook.kt | 29 +++++++++++-------- node/capsule/build.gradle | 3 +- .../kotlin/net/corda/testing/driver/Driver.kt | 3 +- 5 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 .idea/runConfigurations/Quasar_exclude_pattern_extraction_from_node_tests__need_not_pass__check_output_at_the_bottom_of_console_.xml diff --git a/.idea/runConfigurations/Quasar_exclude_pattern_extraction_from_node_tests__need_not_pass__check_output_at_the_bottom_of_console_.xml b/.idea/runConfigurations/Quasar_exclude_pattern_extraction_from_node_tests__need_not_pass__check_output_at_the_bottom_of_console_.xml new file mode 100644 index 0000000000..8c8a89624b --- /dev/null +++ b/.idea/runConfigurations/Quasar_exclude_pattern_extraction_from_node_tests__need_not_pass__check_output_at_the_bottom_of_console_.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/experimental/quasar-hook/README.md b/experimental/quasar-hook/README.md index 43a253a5af..b0b1de0c99 100644 --- a/experimental/quasar-hook/README.md +++ b/experimental/quasar-hook/README.md @@ -5,17 +5,30 @@ This is a javaagent that may be used while running applications using quasar. It methods are scanned, instrumented and used at runtime, and generates an exclude pattern that may be passed in to quasar to stop it from scanning classes unnecessarily. -Example usage -============= +Arguments +=== + +`expand`, `alwaysExcluded` and `truncate` tweak the output exclude pattern. `expand` is a list of packages to always expand (for example +instead of generating `com.*` generate `com.google.*,com.typesafe.*` etc.), `alwaysExcluded` is a list of packages under +which all classes are considered excluded irregardless of instrumentation, `truncate` is a list of packages that should +not be included in the exclude pattern. Truncating `net.corda` means nothing should be excluded from instrumentation in +Corda. + +How to generate an exclude pattern for Corda +==== + +In order to generate a good exclude pattern we need to exercise the Corda code so that most classes get loaded and +inspected by quasar and quasar-hook. For this we can run tests using the 'Quasar exclude pattern extraction (...)' +intellij run configuration, which includes the hook. In addition we should run the tool on a bare corda.jar, as some +additional classes are used when the jar is invoked directly. To do this we'll use a node in samples: ``` ./gradlew experimental:quasar-hook:jar -java -javaagent:experimental/quasar-hook/build/libs/quasar-hook.jar="expand=com,de,org,co;truncate=net.corda" -jar path/to/corda.jar +./gradlew samples:irs-demo:deployNodes +cd samples/irs-demo/build/nodes/NotaryService +java -javaagent:../../../../../experimental/quasar-hook/build/libs/quasar-hook.jar=expand=com,de,org,co,io;truncate=net.corda;alwaysExcluded=com.opengamma,io.atomix -jar corda.jar ``` -The above will run corda.jar and on exit will print information about what classes were scanned/instrumented. +Once the node is started just exit the node. -`expand` and `truncate` tweak the output exclude pattern. `expand` is a list of packages to always expand (for example -instead of generating `com.*` generate `com.google.*,com.typesafe.*` etc.), `truncate` is a list of packages that should -not be included in the exclude pattern. Truncating `net.corda` means nothing should be excluded from instrumentation in -Corda. \ No newline at end of file +We can take the union of the two generated exclude patterns to get a final one. \ No newline at end of file diff --git a/experimental/quasar-hook/src/main/kotlin/net/corda/quasarhook/QuasarInstrumentationHook.kt b/experimental/quasar-hook/src/main/kotlin/net/corda/quasarhook/QuasarInstrumentationHook.kt index 960688379b..c32328ba4a 100644 --- a/experimental/quasar-hook/src/main/kotlin/net/corda/quasarhook/QuasarInstrumentationHook.kt +++ b/experimental/quasar-hook/src/main/kotlin/net/corda/quasarhook/QuasarInstrumentationHook.kt @@ -7,14 +7,15 @@ import java.lang.instrument.ClassFileTransformer import java.lang.instrument.Instrumentation import java.security.ProtectionDomain import java.util.* +import java.util.concurrent.ConcurrentHashMap /** * Used to collect classes through instrumentation. */ class ClassRecorder { - val usedInstrumentedClasses = HashSet() - val instrumentedClasses = HashSet() - val scannedClasses = HashSet() + val usedInstrumentedClasses = ConcurrentHashMap() + val instrumentedClasses = ConcurrentHashMap() + val scannedClasses = ConcurrentHashMap() } /** @@ -39,13 +40,12 @@ fun recordUsedInstrumentedCallStack() { index++ } index++ - while (true) { - require (index < throwable.stackTrace.size) { "Can't find Fiber call" } + while (index < throwable.stackTrace.size) { val stackElement = throwable.stackTrace[index] if (stackElement.className.startsWith("co.paralleluniverse")) { break } - classRecorder.usedInstrumentedClasses.add(stackElement.className) + classRecorder.usedInstrumentedClasses[stackElement.className] = Unit index++ } } @@ -55,7 +55,7 @@ fun recordUsedInstrumentedCallStack() { * instrumentation will happen. */ fun recordInstrumentedClass(className: String) { - classRecorder.instrumentedClasses.add(className) + classRecorder.instrumentedClasses[className] = Unit } /** @@ -63,7 +63,7 @@ fun recordInstrumentedClass(className: String) { */ fun recordScannedClass(className: String?) { if (className != null) { - classRecorder.scannedClasses.add(className) + classRecorder.scannedClasses[className] = Unit } } @@ -74,11 +74,13 @@ fun recordScannedClass(className: String?) { * @param expand A comma-separated list of packages to expand in the glob output. This is useful for certain top-level * domains that we don't want to completely exclude, because later on classes may be loaded from those namespaces * that require instrumentation. + * @param alwaysExcluded A comma-separated list of packages under which all touched classes will be excluded. * @param separator The package part separator character used in the above lists. */ data class Arguments( val truncate: List? = null, val expand: List? = null, + val alwaysExcluded: List? = null, val separator: Char = '.' ) @@ -98,6 +100,7 @@ class QuasarInstrumentationHookAgent { when (key) { "truncate" -> arguments = arguments.copy(truncate = value.split(",")) "expand" -> arguments = arguments.copy(expand = value.split(",")) + "alwaysExcluded" -> arguments = arguments.copy(alwaysExcluded = value.split(",")) "separator" -> arguments = arguments.copy(separator = value.toCharArray()[0]) } } @@ -113,19 +116,21 @@ class QuasarInstrumentationHookAgent { println(" $it") } println("Scanned classes: ${classRecorder.scannedClasses.size}") - classRecorder.scannedClasses.take(20).forEach { + classRecorder.scannedClasses.keys.take(20).forEach { println(" $it") } println(" (...)") - val scannedTree = PackageTree.fromStrings(classRecorder.scannedClasses.toList(), '/') - val instrumentedTree = PackageTree.fromStrings(classRecorder.instrumentedClasses.toList(), '/') + val scannedTree = PackageTree.fromStrings(classRecorder.scannedClasses.keys.toList(), '/') + val instrumentedTree = PackageTree.fromStrings(classRecorder.instrumentedClasses.keys.toList(), '/') + val alwaysExclude = arguments.alwaysExcluded?.let { PackageTree.fromStrings(it, arguments.separator) } + val alwaysExcludedTree = alwaysExclude?.let { instrumentedTree.truncate(it) } ?: instrumentedTree println("Suggested exclude globs:") val truncate = arguments.truncate?.let { PackageTree.fromStrings(it, arguments.separator) } // The separator append is a hack, it causes a package with an empty name to be added to the exclude tree, // which practically causes that level of the tree to be always expanded in the output globs. val expand = arguments.expand?.let { PackageTree.fromStrings(it.map { "$it${arguments.separator}" }, arguments.separator) } val truncatedTree = truncate?.let { scannedTree.truncate(it)} ?: scannedTree - val expandedTree = expand?.let { instrumentedTree.merge(it) } ?: instrumentedTree + val expandedTree = expand?.let { alwaysExcludedTree.merge(it) } ?: alwaysExcludedTree val globs = truncatedTree.toGlobs(expandedTree) globs.forEach { println(" $it") diff --git a/node/capsule/build.gradle b/node/capsule/build.gradle index 9d69e6f5c9..1898e4453c 100644 --- a/node/capsule/build.gradle +++ b/node/capsule/build.gradle @@ -36,7 +36,8 @@ task buildCordaJAR(type: FatCapsule, dependsOn: project(':node').compileJava) { capsuleManifest { applicationVersion = corda_release_version appClassPath = ["jolokia-agent-war-${project.rootProject.ext.jolokia_version}.war"] - def quasarExcludeExpression = "x(rx**;io**;antlr**;kotlin**;jdk**;reflectasm**;groovyjarjarasm**;groovy**;joptsimple**;groovyjarjarantlr**;com.fasterxml**;com.typesafe**;com.google**;com.zaxxer**;com.jcabi**;com.codahale**;com.esotericsoftware**;de.javakaffee**;org.objectweb**;org.slf4j**;org.w3c**;org.codehaus**;org.crsh**;org.fusesource**;org.h2**;org.hibernate**;org.dom4j**;org.bouncycastle**;org.apache**;org.objenesis**;org.jboss**;org.jcp**;org.xml**;co.paralleluniverse**;net.i2p**)" + // See experimental/quasar-hook/README.md for how to generate. + def quasarExcludeExpression = "x(antlr**;bftsmart**;ch**;co.paralleluniverse**;com.codahale**;com.esotericsoftware**;com.fasterxml**;com.google**;com.ibm**;com.intellij**;com.jcabi**;com.nhaarman**;com.opengamma**;com.typesafe**;com.zaxxer**;de.javakaffee**;groovy**;groovyjarjarantlr**;groovyjarjarasm**;io.atomix**;io.github**;io.netty**;jdk**;joptsimple**;junit**;kotlin**;net.bytebuddy**;net.i2p**;org.apache**;org.assertj**;org.bouncycastle**;org.codehaus**;org.crsh**;org.dom4j**;org.fusesource**;org.h2**;org.hamcrest**;org.hibernate**;org.jboss**;org.jcp**;org.joda**;org.junit**;org.mockito**;org.objectweb**;org.objenesis**;org.slf4j**;org.w3c**;org.xml**;org.yaml**;reflectasm**;rx**)" javaAgents = ["quasar-core-${quasar_version}-jdk8.jar=${quasarExcludeExpression}"] systemProperties['visualvm.display.name'] = 'Corda' minJavaVersion = '1.8.0' diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt index cc33d1e77b..f89eb04bd8 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -801,7 +801,8 @@ class DriverDSL( "net.corda.node.cordapp.scan.package" to callerPackage, "java.io.tmpdir" to System.getProperty("java.io.tmpdir") // Inherit from parent process ) - val excludePattern = "x(rx**;io**;antlr**;kotlin**;jdk**;reflectasm**;groovyjarjarasm**;groovy**;joptsimple**;groovyjarjarantlr**;com.fasterxml**;com.typesafe**;com.google**;com.zaxxer**;com.jcabi**;com.codahale**;com.esotericsoftware**;de.javakaffee**;org.objectweb**;org.slf4j**;org.w3c**;org.codehaus**;org.crsh**;org.fusesource**;org.h2**;org.hibernate**;org.dom4j**;org.bouncycastle**;org.apache**;org.objenesis**;org.jboss**;org.jcp**;org.xml**;co.paralleluniverse**;net.i2p**)" + // See experimental/quasar-hook/README.md for how to generate. + val excludePattern = "x(antlr**;bftsmart**;ch**;co.paralleluniverse**;com.codahale**;com.esotericsoftware**;com.fasterxml**;com.google**;com.ibm**;com.intellij**;com.jcabi**;com.nhaarman**;com.opengamma**;com.typesafe**;com.zaxxer**;de.javakaffee**;groovy**;groovyjarjarantlr**;groovyjarjarasm**;io.atomix**;io.github**;io.netty**;jdk**;joptsimple**;junit**;kotlin**;net.bytebuddy**;net.i2p**;org.apache**;org.assertj**;org.bouncycastle**;org.codehaus**;org.crsh**;org.dom4j**;org.fusesource**;org.h2**;org.hamcrest**;org.hibernate**;org.jboss**;org.jcp**;org.joda**;org.junit**;org.mockito**;org.objectweb**;org.objenesis**;org.slf4j**;org.w3c**;org.xml**;org.yaml**;reflectasm**;rx**)" val extraJvmArguments = systemProperties.map { "-D${it.key}=${it.value}" } + "-javaagent:$quasarJarPath=$excludePattern" val loggingLevel = if (debugPort == null) "INFO" else "DEBUG" From 3e5fa9ee6a1075debaeb9d489817084b80726765 Mon Sep 17 00:00:00 2001 From: Joel Dudley Date: Thu, 31 Aug 2017 10:09:31 +0100 Subject: [PATCH 026/120] Update api-flows.rst. --- docs/source/api-flows.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/source/api-flows.rst b/docs/source/api-flows.rst index 57d46f6362..4c1ef7fd2b 100644 --- a/docs/source/api-flows.rst +++ b/docs/source/api-flows.rst @@ -196,8 +196,13 @@ updates. This section details the API for common tasks. Transaction building ^^^^^^^^^^^^^^^^^^^^ -The majority of the work performed during a flow will be to build, verify and sign a transaction. We cover this in -:doc:`api-transactions`. +The majority of the work performed during a flow will be to build, verify and sign a transaction. This is covered +in :doc:`api-transactions`. + +Extracting states from the vault +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +When building a transaction, you'll often need to extract the states you wish to consume from the vault. This is +covered in :doc:`api-vault-query`. Retrieving information about other nodes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -592,4 +597,4 @@ We then update the progress tracker's current step as we progress through the fl :language: java :start-after: DOCSTART 18 :end-before: DOCEND 18 - :dedent: 12 \ No newline at end of file + :dedent: 12 From 472ecc65c633bb40ebe5650b69af2e7a3b90bc6a Mon Sep 17 00:00:00 2001 From: Katarzyna Streich Date: Thu, 31 Aug 2017 11:00:11 +0100 Subject: [PATCH 027/120] NetworkMapCache database backed (#1135) Work on database backed NetworkMapCache Make NodeInfo JPA entity. Enable node startup with it's database network map cache. Fix schema. Make node not wait for finishing network map service registration if it successfully loaded data from database. Add tests for startup without NetworkMapService. * Rename networkMapRegistrationFuture Change networkMapRegistrationFuture to nodeReadyFuture, it no longer indicates the NetworkMapService registration, because we are able to run network without map service configured. * Partially integrate database into NetworkMapCache Full integrtion will come with service removal. Move MockServiceHubInternal to net.corda.node.testing * Add workaround to transaction scope race Temporary workaround to force isolated transaction (otherwise it causes race conditions when processing network map registration on network map node). * Remove WorldMapLocation from NodeInfo Infer the node's location based on X500 name Add serial number on NodeInfo For tests of running without NetworkMap, start nodes with nonexistent NetworkMap address Make clearNetworkMapCache callable via RPC. --- .../net/corda/core/messaging/CordaRPCOps.kt | 7 +- .../kotlin/net/corda/core/node/NodeInfo.kt | 20 +- .../core/node/services/NetworkMapCache.kt | 13 +- .../net/corda/core/schemas/NodeInfoSchema.kt | 142 ++++++++ docs/source/api-persistence.rst | 6 +- .../corda/docs/IntegrationTestingTutorial.kt | 4 +- .../services/messaging/P2PMessagingTest.kt | 2 +- .../services/messaging/P2PSecurityTest.kt | 2 +- .../net/corda/node/internal/AbstractNode.kt | 51 ++- .../corda/node/internal/CordaRPCOpsImpl.kt | 6 +- .../kotlin/net/corda/node/internal/Node.kt | 12 +- .../net/corda/node/internal/NodeStartup.kt | 2 +- .../node/services/api/ServiceHubInternal.kt | 3 + .../messaging/ArtemisMessagingServer.kt | 1 + .../network/InMemoryNetworkMapCache.kt | 185 ---------- .../network/PersistentNetworkMapCache.kt | 339 ++++++++++++++++++ .../node/services/schema/NodeSchemaService.kt | 2 + .../statemachine/StateMachineManager.kt | 3 +- .../events/NodeSchedulerServiceTest.kt | 2 +- .../messaging/ArtemisMessagingTests.kt | 7 +- ...MapCacheTest.kt => NetworkMapCacheTest.kt} | 23 +- .../network/PersistentNetworkMapCacheTest.kt | 194 ++++++++++ .../statemachine/FlowFrameworkTests.kt | 1 + .../net/corda/netmap/VisualiserViewModel.kt | 2 +- .../net/corda/netmap/simulation/Simulation.kt | 2 +- .../net/corda/testing/driver/DriverTests.kt | 1 - .../node/testing}/MockServiceHubInternal.kt | 4 +- .../kotlin/net/corda/testing/driver/Driver.kt | 12 +- .../corda/testing/node/MockNetworkMapCache.kt | 10 +- .../kotlin/net/corda/testing/node/MockNode.kt | 4 +- .../net/corda/testing/node/MockServices.kt | 2 +- .../net/corda/testing/node/NodeBasedTest.kt | 55 ++- .../net/corda/testing/node/SimpleNode.kt | 5 +- .../corda/demobench/model/InstallFactory.kt | 8 +- .../net/corda/demobench/model/NodeConfig.kt | 2 +- .../corda/demobench/model/NodeController.kt | 9 +- .../net/corda/demobench/views/NodeTabView.kt | 2 +- .../corda/demobench/model/NodeConfigTest.kt | 16 +- .../demobench/model/NodeControllerTest.kt | 2 +- .../net/corda/explorer/views/Network.kt | 7 +- .../kotlin/net/corda/loadtest/LoadTest.kt | 2 +- 41 files changed, 885 insertions(+), 287 deletions(-) create mode 100644 core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt delete mode 100644 node/src/main/kotlin/net/corda/node/services/network/InMemoryNetworkMapCache.kt create mode 100644 node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt rename node/src/test/kotlin/net/corda/node/services/network/{InMemoryNetworkMapCacheTest.kt => NetworkMapCacheTest.kt} (73%) create mode 100644 node/src/test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt rename {node/src/test/kotlin/net/corda/node/services => test-utils/src/main/kotlin/net/corda/node/testing}/MockServiceHubInternal.kt (96%) diff --git a/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt b/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt index 3133e1c3b0..e7734161f4 100644 --- a/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt +++ b/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt @@ -257,7 +257,7 @@ interface CordaRPCOps : RPCOps { * complete with an exception if it is unable to. */ @RPCReturnsObservables - fun waitUntilRegisteredWithNetworkMap(): CordaFuture + fun waitUntilNetworkReady(): CordaFuture // TODO These need rethinking. Instead of these direct calls we should have a way of replicating a subset of // the node's state locally and query that directly. @@ -299,6 +299,11 @@ interface CordaRPCOps : RPCOps { * @return the node info if available. */ fun nodeIdentityFromParty(party: AbstractParty): NodeInfo? + + /** + * Clear all network map data from local node cache. + */ + fun clearNetworkMapCache() } inline fun CordaRPCOps.vaultQueryBy(criteria: QueryCriteria = QueryCriteria.VaultQueryCriteria(), diff --git a/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt b/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt index d7f30a4f50..c802831d0f 100644 --- a/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt +++ b/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt @@ -1,12 +1,16 @@ package net.corda.core.node +import net.corda.core.crypto.locationOrNull import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.ServiceType +import net.corda.core.schemas.MappedSchema +import net.corda.core.schemas.NodeInfoSchemaV1 import net.corda.core.serialization.CordaSerializable import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.NonEmptySet +import net.corda.core.serialization.serialize /** * Information for an advertised service including the service specific identity information. @@ -21,11 +25,13 @@ data class ServiceEntry(val info: ServiceInfo, val identity: PartyAndCertificate // TODO We currently don't support multi-IP/multi-identity nodes, we only left slots in the data structures. @CordaSerializable data class NodeInfo(val addresses: List, - val legalIdentityAndCert: PartyAndCertificate, //TODO This field will be removed in future PR which gets rid of services. - val legalIdentitiesAndCerts: NonEmptySet, + // TODO After removing of services these two fields will be merged together and made NonEmptySet. + val legalIdentityAndCert: PartyAndCertificate, + val legalIdentitiesAndCerts: Set, val platformVersion: Int, val advertisedServices: List = emptyList(), - val worldMapLocation: WorldMapLocation? = null) { + val serial: Long +) { init { require(advertisedServices.none { it.identity == legalIdentityAndCert }) { "Service identities must be different from node legal identity" @@ -37,4 +43,12 @@ data class NodeInfo(val addresses: List, fun serviceIdentities(type: ServiceType): List { return advertisedServices.mapNotNull { if (it.info.type.isSubTypeOf(type)) it.identity.party else null } } + + /** + * Uses node's owner X500 name to infer the node's location. Used in Explorer in map view. + */ + fun getWorldMapLocation(): WorldMapLocation? { + val nodeOwnerLocation = legalIdentity.name.locationOrNull + return nodeOwnerLocation?.let { CityDatabase[it] } + } } diff --git a/core/src/main/kotlin/net/corda/core/node/services/NetworkMapCache.kt b/core/src/main/kotlin/net/corda/core/node/services/NetworkMapCache.kt index 33fbd1f10e..3f854a44fc 100644 --- a/core/src/main/kotlin/net/corda/core/node/services/NetworkMapCache.kt +++ b/core/src/main/kotlin/net/corda/core/node/services/NetworkMapCache.kt @@ -8,6 +8,7 @@ import net.corda.core.internal.randomOrNull import net.corda.core.messaging.DataFeed import net.corda.core.node.NodeInfo import net.corda.core.serialization.CordaSerializable +import net.corda.core.utilities.NetworkHostAndPort import org.bouncycastle.asn1.x500.X500Name import rx.Observable import java.security.PublicKey @@ -44,7 +45,7 @@ interface NetworkMapCache { /** Tracks changes to the network map cache */ val changed: Observable /** Future to track completion of the NetworkMapService registration. */ - val mapServiceRegistered: CordaFuture + val nodeReady: CordaFuture /** * Atomically get the current party nodes and a stream of updates. Note that the Observable buffers updates until the @@ -76,7 +77,10 @@ interface NetworkMapCache { fun getNodeByLegalIdentity(party: AbstractParty): NodeInfo? /** Look up the node info for a legal name. */ - fun getNodeByLegalName(principal: X500Name): NodeInfo? = partyNodes.singleOrNull { it.legalIdentity.name == principal } + fun getNodeByLegalName(principal: X500Name): NodeInfo? + + /** Look up the node info for a host and port. */ + fun getNodeByAddress(address: NetworkHostAndPort): NodeInfo? /** * In general, nodes can advertise multiple identities: a legal identity, and separate identities for each of @@ -144,4 +148,9 @@ interface NetworkMapCache { "Your options are: ${notaryNodes.map { "\"${it.notaryIdentity.name}\"" }.joinToString()}.") return notary.advertisedServices.any { it.info.type.isValidatingNotary() } } + + /** + * Clear all network map data from local node cache. + */ + fun clearNetworkMapCache() } diff --git a/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt b/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt new file mode 100644 index 0000000000..f0d21aeaf3 --- /dev/null +++ b/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt @@ -0,0 +1,142 @@ +package net.corda.core.schemas + +import net.corda.core.crypto.toBase58String +import net.corda.core.identity.PartyAndCertificate +import net.corda.core.node.NodeInfo +import net.corda.core.node.ServiceEntry +import net.corda.core.serialization.deserialize +import net.corda.core.serialization.serialize +import net.corda.core.utilities.NetworkHostAndPort +import java.io.Serializable +import java.security.cert.CertPath +import javax.persistence.CascadeType +import javax.persistence.Column +import javax.persistence.ElementCollection +import javax.persistence.Embeddable +import javax.persistence.EmbeddedId +import javax.persistence.Entity +import javax.persistence.GeneratedValue +import javax.persistence.Id +import javax.persistence.JoinColumn +import javax.persistence.JoinTable +import javax.persistence.Lob +import javax.persistence.ManyToMany +import javax.persistence.OneToMany +import javax.persistence.Table + +object NodeInfoSchema + +object NodeInfoSchemaV1 : MappedSchema( + schemaFamily = NodeInfoSchema.javaClass, + version = 1, + mappedTypes = listOf(PersistentNodeInfo::class.java, DBPartyAndCertificate::class.java, DBHostAndPort::class.java) +) { + @Entity + @Table(name = "node_infos") + class PersistentNodeInfo( + @Id + @GeneratedValue + @Column(name = "node_info_id") + var id: Int, + + @Column(name = "addresses") + @OneToMany(cascade = arrayOf(CascadeType.ALL), orphanRemoval = true) + val addresses: List, + + @Column(name = "legal_identities_certs") + @ManyToMany(cascade = arrayOf(CascadeType.ALL)) + @JoinTable(name = "link_nodeinfo_party", + joinColumns = arrayOf(JoinColumn(name="node_info_id")), + inverseJoinColumns = arrayOf(JoinColumn(name="party_name"))) + val legalIdentitiesAndCerts: Set, + + @Column(name = "platform_version") + val platformVersion: Int, + + @Column(name = "advertised_services") + @ElementCollection + var advertisedServices: List = emptyList(), + + /** + * serial is an increasing value which represents the version of [NodeInfo]. + * Not expected to be sequential, but later versions of the registration must have higher values + * Similar to the serial number on DNS records. + */ + @Column(name = "serial") + val serial: Long + ) { + fun toNodeInfo(): NodeInfo { + return NodeInfo( + this.addresses.map { it.toHostAndPort() }, + this.legalIdentitiesAndCerts.filter { it.isMain }.single().toLegalIdentityAndCert(), // TODO Workaround, it will be changed after PR with services removal. + this.legalIdentitiesAndCerts.filter { !it.isMain }.map { it.toLegalIdentityAndCert() }.toSet(), + this.platformVersion, + this.advertisedServices.map { + it.serviceEntry?.deserialize() ?: throw IllegalStateException("Service entry shouldn't be null") + }, + this.serial + ) + } + } + + @Embeddable + data class PKHostAndPort( + val host: String? = null, + val port: Int? = null + ) : Serializable + + @Entity + data class DBHostAndPort( + @EmbeddedId + private val pk: PKHostAndPort + ) { + companion object { + fun fromHostAndPort(hostAndPort: NetworkHostAndPort) = DBHostAndPort( + PKHostAndPort(hostAndPort.host, hostAndPort.port) + ) + } + fun toHostAndPort(): NetworkHostAndPort { + return NetworkHostAndPort(this.pk.host!!, this.pk.port!!) + } + } + + @Embeddable // TODO To be removed with services. + data class DBServiceEntry( + @Column(length = 65535) + val serviceEntry: ByteArray? = null + ) + + /** + * PartyAndCertificate entity (to be replaced by referencing final Identity Schema). + */ + @Entity + @Table(name = "node_info_party_cert") + data class DBPartyAndCertificate( + @Id + @Column(name = "owning_key", length = 65535, nullable = false) + val owningKey: String, + + //@Id // TODO Do we assume that names are unique? Note: We can't have it as Id, because our toString on X500 is inconsistent. + @Column(name = "party_name", nullable = false) + val name: String, + + @Column(name = "certificate") + @Lob + val certificate: ByteArray, + + @Column(name = "certificate_path") + @Lob + val certPath: ByteArray, + + val isMain: Boolean, + + @ManyToMany(mappedBy = "legalIdentitiesAndCerts", cascade = arrayOf(CascadeType.ALL)) // ManyToMany because of distributed services. + private val persistentNodeInfos: Set = emptySet() + ) { + constructor(partyAndCert: PartyAndCertificate, isMain: Boolean = false) + : this(partyAndCert.party.owningKey.toBase58String(), partyAndCert.party.name.toString(), partyAndCert.certificate.serialize().bytes, partyAndCert.certPath.serialize().bytes, isMain) + fun toLegalIdentityAndCert(): PartyAndCertificate { + return PartyAndCertificate(certPath.deserialize()) + } + } +} diff --git a/docs/source/api-persistence.rst b/docs/source/api-persistence.rst index 8844f80b4a..fbfb0c5d98 100644 --- a/docs/source/api-persistence.rst +++ b/docs/source/api-persistence.rst @@ -17,9 +17,9 @@ The ORM mapping is specified using the `Java Persistence API (dummyTopic, sessionId).getOrThrow(5.seconds) - assertThat(requestsReceived.get()).isGreaterThanOrEqualTo(2) assertThat(response).isEqualTo(responseMessage) } diff --git a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt index 0e32802348..788d76ae00 100644 --- a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt +++ b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt @@ -67,7 +67,7 @@ class P2PSecurityTest : NodeBasedTest() { private fun SimpleNode.registerWithNetworkMap(registrationName: X500Name): CordaFuture { val legalIdentity = getTestPartyAndCertificate(registrationName, identity.public) - val nodeInfo = NodeInfo(listOf(MOCK_HOST_AND_PORT), legalIdentity, NonEmptySet.of(legalIdentity), 1) + val nodeInfo = NodeInfo(listOf(MOCK_HOST_AND_PORT), legalIdentity, NonEmptySet.of(legalIdentity), 1, serial = 1) val registration = NodeRegistration(nodeInfo, System.currentTimeMillis(), AddOrRemove.ADD, Instant.MAX) val request = RegistrationRequest(registration.toWire(keyService, identity.public), network.myAddress) return network.sendRequest(NetworkMapService.REGISTER_TOPIC, request, networkMapNode.network.myAddress) diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index 146f391689..c21f7bd800 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -12,6 +12,7 @@ import net.corda.core.flows.* import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate import net.corda.core.internal.* +import net.corda.core.internal.concurrent.doneFuture import net.corda.core.internal.concurrent.flatMap import net.corda.core.internal.concurrent.openFuture import net.corda.core.messaging.CordaRPCOps @@ -39,7 +40,7 @@ import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.services.keys.PersistentKeyManagementService import net.corda.node.services.messaging.MessagingService import net.corda.node.services.messaging.sendRequest -import net.corda.node.services.network.InMemoryNetworkMapCache +import net.corda.node.services.network.PersistentNetworkMapCache import net.corda.node.services.network.NetworkMapService import net.corda.node.services.network.NetworkMapService.RegistrationRequest import net.corda.node.services.network.NetworkMapService.RegistrationResponse @@ -138,10 +139,11 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, var isPreviousCheckpointsPresent = false private set - protected val _networkMapRegistrationFuture = openFuture() - /** Completes once the node has successfully registered with the network map service */ - val networkMapRegistrationFuture: CordaFuture - get() = _networkMapRegistrationFuture + protected val _nodeReadyFuture = openFuture() + /** Completes once the node has successfully registered with the network map service + * or has loaded network map data from local database */ + val nodeReadyFuture: CordaFuture + get() = _nodeReadyFuture /** Fetch CordaPluginRegistry classes registered in META-INF/services/net.corda.core.node.CordaPluginRegistry files that exist in the classpath */ open val pluginRegistries: List by lazy { @@ -155,10 +157,6 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, /** The implementation of the [CordaRPCOps] interface used by this node. */ open val rpcOps: CordaRPCOps by lazy { CordaRPCOpsImpl(services, smm, database) } // Lazy to avoid init ordering issue with the SMM. - open fun findMyLocation(): WorldMapLocation? { - return configuration.myLegalName.locationOrNull?.let { CityDatabase[it] } - } - open fun start() { require(!started) { "Node has already been started" } @@ -208,7 +206,10 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, } runOnStop += network::stop - _networkMapRegistrationFuture.captureLater(registerWithNetworkMapIfConfigured()) + } + // If we successfully loaded network data from database, we set this future to Unit. + _nodeReadyFuture.captureLater(registerWithNetworkMapIfConfigured()) + database.transaction { smm.start() // Shut down the SMM so no Fibers are scheduled. runOnStop += { smm.stop(acceptableLiveFiberCountOnStop()) } @@ -483,9 +484,9 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, private fun makeInfo(legalIdentity: PartyAndCertificate): NodeInfo { val advertisedServiceEntries = makeServiceEntries() - val allIdentities = (advertisedServiceEntries.map { it.identity } + legalIdentity).toNonEmptySet() + val allIdentities = advertisedServiceEntries.map { it.identity }.toSet() // TODO Add node's legalIdentity (after services removal). val addresses = myAddresses() // TODO There is no support for multiple IP addresses yet. - return NodeInfo(addresses, legalIdentity, allIdentities, platformVersion, advertisedServiceEntries, findMyLocation()) + return NodeInfo(addresses, legalIdentity, allIdentities, platformVersion, advertisedServiceEntries, platformClock.instant().toEpochMilli()) } /** @@ -580,7 +581,15 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, services.networkMapCache.runWithoutMapService() noNetworkMapConfigured() // TODO This method isn't needed as runWithoutMapService sets the Future in the cache } else { - registerWithNetworkMap() + val netMapRegistration = registerWithNetworkMap() + // We may want to start node immediately with database data and not wait for network map registration (but send it either way). + // So we are ready to go. + if (services.networkMapCache.loadDBSuccess) { + log.info("Node successfully loaded network map data from the database.") + doneFuture(Unit) + } else { + netMapRegistration + } } } @@ -606,7 +615,7 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, // Register this node against the network val instant = platformClock.instant() val expires = instant + NetworkMapService.DEFAULT_EXPIRATION_PERIOD - val reg = NodeRegistration(info, instant.toEpochMilli(), ADD, expires) + val reg = NodeRegistration(info, info.serial, ADD, expires) val request = RegistrationRequest(reg.toWire(services.keyManagementService, info.legalIdentityAndCert.owningKey), network.myAddress) return network.sendRequest(NetworkMapService.REGISTER_TOPIC, request, networkMapAddress) } @@ -616,9 +625,13 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, /** This is overriden by the mock node implementation to enable operation without any network map service */ protected open fun noNetworkMapConfigured(): CordaFuture { - // TODO: There should be a consistent approach to configuration error exceptions. - throw IllegalStateException("Configuration error: this node isn't being asked to act as the network map, nor " + - "has any other map node been configured.") + if (services.networkMapCache.loadDBSuccess) { + return doneFuture(Unit) + } else { + // TODO: There should be a consistent approach to configuration error exceptions. + throw IllegalStateException("Configuration error: this node isn't being asked to act as the network map, nor " + + "has any other map node been configured.") + } } protected open fun makeKeyManagementService(identityService: IdentityService): KeyManagementService { @@ -754,7 +767,8 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, override val monitoringService = MonitoringService(MetricRegistry()) override val validatedTransactions = makeTransactionStorage() override val transactionVerifierService by lazy { makeTransactionVerifierService() } - override val networkMapCache by lazy { InMemoryNetworkMapCache(this) } + override val schemaService by lazy { NodeSchemaService(pluginRegistries.flatMap { it.requiredSchemas }.toSet()) } + override val networkMapCache by lazy { PersistentNetworkMapCache(this) } override val vaultService by lazy { NodeVaultService(this) } override val vaultQueryService by lazy { HibernateVaultQueryImpl(database.hibernateConfig, vaultService) @@ -776,7 +790,6 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, override val networkService: MessagingService get() = network override val clock: Clock get() = platformClock override val myInfo: NodeInfo get() = info - override val schemaService by lazy { NodeSchemaService(pluginRegistries.flatMap { it.requiredSchemas }.toSet()) } override val database: CordaPersistence get() = this@AbstractNode.database override val configuration: NodeConfiguration get() = this@AbstractNode.configuration diff --git a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt index 79ca9d2f22..e87359f0a6 100644 --- a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt +++ b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt @@ -173,7 +173,7 @@ class CordaRPCOpsImpl( override fun authoriseContractUpgrade(state: StateAndRef<*>, upgradedContractClass: Class>) = services.vaultService.authoriseContractUpgrade(state, upgradedContractClass) override fun deauthoriseContractUpgrade(state: StateAndRef<*>) = services.vaultService.deauthoriseContractUpgrade(state) override fun currentNodeTime(): Instant = Instant.now(services.clock) - override fun waitUntilRegisteredWithNetworkMap() = services.networkMapCache.mapServiceRegistered + override fun waitUntilNetworkReady() = services.networkMapCache.nodeReady override fun partyFromAnonymous(party: AbstractParty): Party? = services.identityService.partyFromAnonymous(party) override fun partyFromKey(key: PublicKey) = services.identityService.partyFromKey(key) override fun partyFromX500Name(x500Name: X500Name) = services.identityService.partyFromX500Name(x500Name) @@ -182,6 +182,10 @@ class CordaRPCOpsImpl( override fun registeredFlows(): List = services.rpcFlows.map { it.name }.sorted() + override fun clearNetworkMapCache() { + services.networkMapCache.clearNetworkMapCache() + } + companion object { private fun stateMachineInfoFromFlowLogic(flowLogic: FlowLogic<*>): StateMachineInfo { return StateMachineInfo(flowLogic.runId, flowLogic.javaClass.name, flowLogic.stateMachine.flowInitiator, flowLogic.track()) diff --git a/node/src/main/kotlin/net/corda/node/internal/Node.kt b/node/src/main/kotlin/net/corda/node/internal/Node.kt index b30478e237..27016f1617 100644 --- a/node/src/main/kotlin/net/corda/node/internal/Node.kt +++ b/node/src/main/kotlin/net/corda/node/internal/Node.kt @@ -155,7 +155,7 @@ open class Node(override val configuration: FullNodeConfiguration, myIdentityOrNullIfNetworkMapService, serverThread, database, - networkMapRegistrationFuture, + nodeReadyFuture, services.monitoringService, advertisedAddress) } @@ -210,15 +210,17 @@ open class Node(override val configuration: FullNodeConfiguration, log.trace { "Trying to detect public hostname through the Network Map Service at $serverAddress" } val tcpTransport = ArtemisTcpTransport.tcpTransport(ConnectionDirection.Outbound(), serverAddress, configuration) val locator = ActiveMQClient.createServerLocatorWithoutHA(tcpTransport).apply { - initialConnectAttempts = 5 - retryInterval = 5.seconds.toMillis() + initialConnectAttempts = 2 // TODO Public host discovery needs rewriting, as we may start nodes without network map, and we don't want to wait that long on startup. + retryInterval = 2.seconds.toMillis() retryIntervalMultiplier = 1.5 maxRetryInterval = 3.minutes.toMillis() } val clientFactory = try { locator.createSessionFactory() } catch (e: ActiveMQNotConnectedException) { - throw IOException("Unable to connect to the Network Map Service at $serverAddress for IP address discovery", e) + log.warn("Unable to connect to the Network Map Service at $serverAddress for IP address discovery. " + + "Using the provided \"${configuration.p2pAddress.host}\" as the advertised address.") + return null } val session = clientFactory.createSession(PEER_USER, PEER_USER, false, true, true, locator.isPreAcknowledge, ActiveMQClient.DEFAULT_ACK_BATCH_SIZE) @@ -306,7 +308,7 @@ open class Node(override val configuration: FullNodeConfiguration, } super.start() - networkMapRegistrationFuture.thenMatch({ + nodeReadyFuture.thenMatch({ serverThread.execute { // Begin exporting our own metrics via JMX. These can be monitored using any agent, e.g. Jolokia: // diff --git a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt index 5641cb8953..2d55019454 100644 --- a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt +++ b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt @@ -102,7 +102,7 @@ open class NodeStartup(val args: Array) { node.start() printPluginsAndServices(node) - node.networkMapRegistrationFuture.thenMatch({ + node.nodeReadyFuture.thenMatch({ val elapsed = (System.currentTimeMillis() - startTime) / 10 / 100.0 // TODO: Replace this with a standard function to get an unambiguous rendering of the X.500 name. val name = node.info.legalIdentity.name.orgName ?: node.info.legalIdentity.name.commonName diff --git a/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt b/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt index 69e010892b..4d2bbfccbf 100644 --- a/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt +++ b/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt @@ -53,6 +53,9 @@ interface NetworkMapCacheInternal : NetworkMapCache { /** For testing where the network map cache is manipulated marks the service as immediately ready. */ @VisibleForTesting fun runWithoutMapService() + + /** Indicates if loading network map data from database was successful. */ + val loadDBSuccess: Boolean } @CordaSerializable diff --git a/node/src/main/kotlin/net/corda/node/services/messaging/ArtemisMessagingServer.kt b/node/src/main/kotlin/net/corda/node/services/messaging/ArtemisMessagingServer.kt index 829c36bfbf..49ff18c942 100644 --- a/node/src/main/kotlin/net/corda/node/services/messaging/ArtemisMessagingServer.kt +++ b/node/src/main/kotlin/net/corda/node/services/messaging/ArtemisMessagingServer.kt @@ -338,6 +338,7 @@ class ArtemisMessagingServer(override val config: NodeConfiguration, * TODO : Create the bridge directly from the list of queues on start up when we have a persisted network map service. */ private fun updateBridgesOnNetworkChange(change: MapChange) { + log.debug { "Updating bridges on network map change: ${change.node}" } fun gatherAddresses(node: NodeInfo): Sequence { val peerAddress = getArtemisPeerAddress(node) val addresses = mutableListOf(peerAddress) diff --git a/node/src/main/kotlin/net/corda/node/services/network/InMemoryNetworkMapCache.kt b/node/src/main/kotlin/net/corda/node/services/network/InMemoryNetworkMapCache.kt deleted file mode 100644 index 774e93f499..0000000000 --- a/node/src/main/kotlin/net/corda/node/services/network/InMemoryNetworkMapCache.kt +++ /dev/null @@ -1,185 +0,0 @@ -package net.corda.node.services.network - -import net.corda.core.concurrent.CordaFuture -import net.corda.core.identity.AbstractParty -import net.corda.core.identity.Party -import net.corda.core.internal.VisibleForTesting -import net.corda.core.internal.bufferUntilSubscribed -import net.corda.core.internal.concurrent.map -import net.corda.core.internal.concurrent.openFuture -import net.corda.core.messaging.DataFeed -import net.corda.core.messaging.SingleMessageRecipient -import net.corda.core.node.NodeInfo -import net.corda.core.node.ServiceHub -import net.corda.core.node.services.NetworkMapCache.MapChange -import net.corda.core.node.services.PartyInfo -import net.corda.core.serialization.SingletonSerializeAsToken -import net.corda.core.serialization.deserialize -import net.corda.core.serialization.serialize -import net.corda.core.utilities.loggerFor -import net.corda.node.services.api.NetworkCacheError -import net.corda.node.services.api.NetworkMapCacheInternal -import net.corda.node.services.messaging.MessagingService -import net.corda.node.services.messaging.createMessage -import net.corda.node.services.messaging.sendRequest -import net.corda.node.services.network.NetworkMapService.FetchMapResponse -import net.corda.node.services.network.NetworkMapService.SubscribeResponse -import net.corda.node.utilities.AddOrRemove -import net.corda.node.utilities.bufferUntilDatabaseCommit -import net.corda.node.utilities.wrapWithDatabaseTransaction -import rx.Observable -import rx.subjects.PublishSubject -import java.security.PublicKey -import java.security.SignatureException -import java.util.* -import javax.annotation.concurrent.ThreadSafe - -/** - * Extremely simple in-memory cache of the network map. - * - * @param serviceHub an optional service hub from which we'll take the identity service. We take a service hub rather - * than the identity service directly, as this avoids problems with service start sequence (network map cache - * and identity services depend on each other). Should always be provided except for unit test cases. - */ -@ThreadSafe -open class InMemoryNetworkMapCache(private val serviceHub: ServiceHub?) : SingletonSerializeAsToken(), NetworkMapCacheInternal { - companion object { - val logger = loggerFor() - } - - override val partyNodes: List get() = registeredNodes.map { it.value } - override val networkMapNodes: List get() = getNodesWithService(NetworkMapService.type) - private val _changed = PublishSubject.create() - // We use assignment here so that multiple subscribers share the same wrapped Observable. - override val changed: Observable = _changed.wrapWithDatabaseTransaction() - private val changePublisher: rx.Observer get() = _changed.bufferUntilDatabaseCommit() - - private val _registrationFuture = openFuture() - override val mapServiceRegistered: CordaFuture get() = _registrationFuture - - private var registeredForPush = false - protected var registeredNodes: MutableMap = Collections.synchronizedMap(HashMap()) - - override fun getPartyInfo(party: Party): PartyInfo? { - val node = registeredNodes[party.owningKey] - if (node != null) { - return PartyInfo.Node(node) - } - for ((_, value) in registeredNodes) { - for (service in value.advertisedServices) { - if (service.identity.party == party) { - return PartyInfo.Service(service) - } - } - } - return null - } - - override fun getNodeByLegalIdentityKey(identityKey: PublicKey): NodeInfo? = registeredNodes[identityKey] - override fun getNodeByLegalIdentity(party: AbstractParty): NodeInfo? { - val wellKnownParty = if (serviceHub != null) { - serviceHub.identityService.partyFromAnonymous(party) - } else { - party - } - - return wellKnownParty?.let { - getNodeByLegalIdentityKey(it.owningKey) - } - } - - override fun track(): DataFeed, MapChange> { - synchronized(_changed) { - return DataFeed(partyNodes, _changed.bufferUntilSubscribed().wrapWithDatabaseTransaction()) - } - } - - override fun addMapService(network: MessagingService, networkMapAddress: SingleMessageRecipient, subscribe: Boolean, - ifChangedSinceVer: Int?): CordaFuture { - if (subscribe && !registeredForPush) { - // Add handler to the network, for updates received from the remote network map service. - network.addMessageHandler(NetworkMapService.PUSH_TOPIC) { message, _ -> - try { - val req = message.data.deserialize() - val ackMessage = network.createMessage(NetworkMapService.PUSH_ACK_TOPIC, - data = NetworkMapService.UpdateAcknowledge(req.mapVersion, network.myAddress).serialize().bytes) - network.send(ackMessage, req.replyTo) - processUpdatePush(req) - } catch(e: NodeMapError) { - logger.warn("Failure during node map update due to bad update: ${e.javaClass.name}") - } catch(e: Exception) { - logger.error("Exception processing update from network map service", e) - } - } - registeredForPush = true - } - - // Fetch the network map and register for updates at the same time - val req = NetworkMapService.FetchMapRequest(subscribe, ifChangedSinceVer, network.myAddress) - val future = network.sendRequest(NetworkMapService.FETCH_TOPIC, req, networkMapAddress).map { (nodes) -> - // We may not receive any nodes back, if the map hasn't changed since the version specified - nodes?.forEach { processRegistration(it) } - Unit - } - _registrationFuture.captureLater(future.map { null }) - - return future - } - - override fun addNode(node: NodeInfo) { - synchronized(_changed) { - val previousNode = registeredNodes.put(node.legalIdentity.owningKey, node) - if (previousNode == null) { - changePublisher.onNext(MapChange.Added(node)) - } else if (previousNode != node) { - changePublisher.onNext(MapChange.Modified(node, previousNode)) - } - } - } - - override fun removeNode(node: NodeInfo) { - synchronized(_changed) { - registeredNodes.remove(node.legalIdentity.owningKey) - changePublisher.onNext(MapChange.Removed(node)) - } - } - - /** - * Unsubscribes from updates from the given map service. - * @param service the network map service to listen to updates from. - */ - override fun deregisterForUpdates(network: MessagingService, service: NodeInfo): CordaFuture { - // Fetch the network map and register for updates at the same time - val req = NetworkMapService.SubscribeRequest(false, network.myAddress) - // `network.getAddressOfParty(partyInfo)` is a work-around for MockNetwork and InMemoryMessaging to get rid of SingleMessageRecipient in NodeInfo. - val address = network.getAddressOfParty(PartyInfo.Node(service)) - val future = network.sendRequest(NetworkMapService.SUBSCRIPTION_TOPIC, req, address).map { - if (it.confirmed) Unit else throw NetworkCacheError.DeregistrationFailed() - } - _registrationFuture.captureLater(future.map { null }) - return future - } - - fun processUpdatePush(req: NetworkMapService.Update) { - try { - val reg = req.wireReg.verified() - processRegistration(reg) - } catch (e: SignatureException) { - throw NodeMapError.InvalidSignature() - } - } - - private fun processRegistration(reg: NodeRegistration) { - // TODO: Implement filtering by sequence number, so we only accept changes that are - // more recent than the latest change we've processed. - when (reg.type) { - AddOrRemove.ADD -> addNode(reg.node) - AddOrRemove.REMOVE -> removeNode(reg.node) - } - } - - @VisibleForTesting - override fun runWithoutMapService() { - _registrationFuture.set(null) - } -} diff --git a/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt b/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt new file mode 100644 index 0000000000..74a437817b --- /dev/null +++ b/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt @@ -0,0 +1,339 @@ +package net.corda.node.services.network + +import net.corda.core.concurrent.CordaFuture +import net.corda.core.internal.bufferUntilSubscribed +import net.corda.core.crypto.parsePublicKeyBase58 +import net.corda.core.crypto.toBase58String +import net.corda.core.identity.AbstractParty +import net.corda.core.identity.Party +import net.corda.core.internal.VisibleForTesting +import net.corda.core.internal.concurrent.map +import net.corda.core.internal.concurrent.openFuture +import net.corda.core.messaging.DataFeed +import net.corda.core.messaging.SingleMessageRecipient +import net.corda.core.node.NodeInfo +import net.corda.core.node.services.NetworkMapCache.MapChange +import net.corda.core.node.services.PartyInfo +import net.corda.core.schemas.NodeInfoSchemaV1 +import net.corda.core.serialization.SingletonSerializeAsToken +import net.corda.core.serialization.deserialize +import net.corda.core.serialization.serialize +import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.loggerFor +import net.corda.node.services.api.NetworkCacheError +import net.corda.node.services.api.NetworkMapCacheInternal +import net.corda.node.services.api.ServiceHubInternal +import net.corda.node.services.messaging.MessagingService +import net.corda.node.services.messaging.createMessage +import net.corda.node.services.messaging.sendRequest +import net.corda.node.services.network.NetworkMapService.FetchMapResponse +import net.corda.node.services.network.NetworkMapService.SubscribeResponse +import net.corda.node.utilities.AddOrRemove +import net.corda.node.utilities.DatabaseTransactionManager +import net.corda.node.utilities.bufferUntilDatabaseCommit +import net.corda.node.utilities.wrapWithDatabaseTransaction +import org.bouncycastle.asn1.x500.X500Name +import org.hibernate.Session +import rx.Observable +import rx.subjects.PublishSubject +import java.security.PublicKey +import java.security.SignatureException +import java.util.* +import javax.annotation.concurrent.ThreadSafe + +/** + * Extremely simple in-memory cache of the network map. + * + * @param serviceHub an optional service hub from which we'll take the identity service. We take a service hub rather + * than the identity service directly, as this avoids problems with service start sequence (network map cache + * and identity services depend on each other). Should always be provided except for unit test cases. + */ +@ThreadSafe +open class PersistentNetworkMapCache(private val serviceHub: ServiceHubInternal) : SingletonSerializeAsToken(), NetworkMapCacheInternal { + companion object { + val logger = loggerFor() + } + + private var registeredForPush = false + // TODO Small explanation, partyNodes and registeredNodes is left in memory as it was before, because it will be removed in + // next PR that gets rid of services. These maps are used only for queries by service. + override val partyNodes: List get() = registeredNodes.map { it.value } + override val networkMapNodes: List get() = getNodesWithService(NetworkMapService.type) + private val _changed = PublishSubject.create() + // We use assignment here so that multiple subscribers share the same wrapped Observable. + override val changed: Observable = _changed.wrapWithDatabaseTransaction() + private val changePublisher: rx.Observer get() = _changed.bufferUntilDatabaseCommit() + + private val _registrationFuture = openFuture() + override val nodeReady: CordaFuture get() = _registrationFuture + protected val registeredNodes: MutableMap = Collections.synchronizedMap(HashMap()) + private var _loadDBSuccess: Boolean = false + override val loadDBSuccess get() = _loadDBSuccess + + init { + serviceHub.database.transaction { loadFromDB() } + } + + override fun getPartyInfo(party: Party): PartyInfo? { + val nodes = serviceHub.database.transaction { queryByIdentityKey(party.owningKey) } + if (nodes.size == 1 && nodes[0].legalIdentity == party) { + return PartyInfo.Node(nodes[0]) + } + for (node in nodes) { + for (service in node.advertisedServices) { + if (service.identity.party == party) { + return PartyInfo.Service(service) + } + } + } + return null + } + + // TODO See comment to queryByLegalName why it's left like that. + override fun getNodeByLegalName(principal: X500Name): NodeInfo? = partyNodes.singleOrNull { it.legalIdentity.name == principal } + //serviceHub!!.database.transaction { queryByLegalName(principal).firstOrNull() } + override fun getNodeByLegalIdentityKey(identityKey: PublicKey): NodeInfo? = + serviceHub.database.transaction { queryByIdentityKey(identityKey).firstOrNull() } + override fun getNodeByLegalIdentity(party: AbstractParty): NodeInfo? { + val wellKnownParty = serviceHub.identityService.partyFromAnonymous(party) + return wellKnownParty?.let { + getNodeByLegalIdentityKey(it.owningKey) + } + } + + override fun getNodeByAddress(address: NetworkHostAndPort): NodeInfo? = serviceHub.database.transaction { queryByAddress(address) } + + override fun track(): DataFeed, MapChange> { + synchronized(_changed) { + return DataFeed(partyNodes, _changed.bufferUntilSubscribed().wrapWithDatabaseTransaction()) + } + } + + override fun addMapService(network: MessagingService, networkMapAddress: SingleMessageRecipient, subscribe: Boolean, + ifChangedSinceVer: Int?): CordaFuture { + if (subscribe && !registeredForPush) { + // Add handler to the network, for updates received from the remote network map service. + network.addMessageHandler(NetworkMapService.PUSH_TOPIC) { message, _ -> + try { + val req = message.data.deserialize() + val ackMessage = network.createMessage(NetworkMapService.PUSH_ACK_TOPIC, + data = NetworkMapService.UpdateAcknowledge(req.mapVersion, network.myAddress).serialize().bytes) + network.send(ackMessage, req.replyTo) + processUpdatePush(req) + } catch(e: NodeMapError) { + logger.warn("Failure during node map update due to bad update: ${e.javaClass.name}") + } catch(e: Exception) { + logger.error("Exception processing update from network map service", e) + } + } + registeredForPush = true + } + + // Fetch the network map and register for updates at the same time + val req = NetworkMapService.FetchMapRequest(subscribe, ifChangedSinceVer, network.myAddress) + val future = network.sendRequest(NetworkMapService.FETCH_TOPIC, req, networkMapAddress).map { (nodes) -> + // We may not receive any nodes back, if the map hasn't changed since the version specified + nodes?.forEach { processRegistration(it) } + Unit + } + _registrationFuture.captureLater(future.map { null }) + + return future + } + + override fun addNode(node: NodeInfo) { + synchronized(_changed) { + val previousNode = registeredNodes.put(node.legalIdentity.owningKey, node) + if (previousNode == null) { + serviceHub.database.transaction { + updateInfoDB(node) + changePublisher.onNext(MapChange.Added(node)) + } + } else if (previousNode != node) { + serviceHub.database.transaction { + updateInfoDB(node) + changePublisher.onNext(MapChange.Modified(node, previousNode)) + } + } + } + } + + override fun removeNode(node: NodeInfo) { + synchronized(_changed) { + registeredNodes.remove(node.legalIdentity.owningKey) + serviceHub.database.transaction { + removeInfoDB(node) + changePublisher.onNext(MapChange.Removed(node)) + } + } + } + + /** + * Unsubscribes from updates from the given map service. + * @param service the network map service to listen to updates from. + */ + override fun deregisterForUpdates(network: MessagingService, service: NodeInfo): CordaFuture { + // Fetch the network map and register for updates at the same time + val req = NetworkMapService.SubscribeRequest(false, network.myAddress) + // `network.getAddressOfParty(partyInfo)` is a work-around for MockNetwork and InMemoryMessaging to get rid of SingleMessageRecipient in NodeInfo. + val address = network.getAddressOfParty(PartyInfo.Node(service)) + val future = network.sendRequest(NetworkMapService.SUBSCRIPTION_TOPIC, req, address).map { + if (it.confirmed) Unit else throw NetworkCacheError.DeregistrationFailed() + } + _registrationFuture.captureLater(future.map { null }) + return future + } + + fun processUpdatePush(req: NetworkMapService.Update) { + try { + val reg = req.wireReg.verified() + processRegistration(reg) + } catch (e: SignatureException) { + throw NodeMapError.InvalidSignature() + } + } + + private fun processRegistration(reg: NodeRegistration) { + // TODO: Implement filtering by sequence number, so we only accept changes that are + // more recent than the latest change we've processed. + when (reg.type) { + AddOrRemove.ADD -> addNode(reg.node) + AddOrRemove.REMOVE -> removeNode(reg.node) + } + } + + @VisibleForTesting + override fun runWithoutMapService() { + _registrationFuture.set(null) + } + + // Changes related to NetworkMap redesign + // TODO It will be properly merged into network map cache after services removal. + + private inline fun createSession(block: (Session) -> T): T { + return DatabaseTransactionManager.current().session.let { block(it) } + } + + private fun getAllInfos(session: Session): List { + val criteria = session.criteriaBuilder.createQuery(NodeInfoSchemaV1.PersistentNodeInfo::class.java) + criteria.select(criteria.from(NodeInfoSchemaV1.PersistentNodeInfo::class.java)) + return session.createQuery(criteria).resultList + } + + /** + * Load NetworkMap data from the database if present. Node can start without having NetworkMapService configured. + */ + private fun loadFromDB() { + logger.info("Loading network map from database...") + createSession { + val result = getAllInfos(it) + for (nodeInfo in result) { + try { + logger.info("Loaded node info: $nodeInfo") + val publicKey = parsePublicKeyBase58(nodeInfo.legalIdentitiesAndCerts.single { it.isMain }.owningKey) + val node = nodeInfo.toNodeInfo() + registeredNodes.put(publicKey, node) + changePublisher.onNext(MapChange.Added(node)) // Redeploy bridges after reading from DB on startup. + _loadDBSuccess = true // This is used in AbstractNode to indicate that node is ready. + } catch (e: Exception) { + logger.warn("Exception parsing network map from the database.", e) + } + } + if (loadDBSuccess) { + _registrationFuture.set(null) // Useful only if we don't have NetworkMapService configured so StateMachineManager can start. + } + } + } + + private fun updateInfoDB(nodeInfo: NodeInfo) { + // TODO Temporary workaround to force isolated transaction (otherwise it causes race conditions when processing + // network map registration on network map node) + val session = serviceHub.database.entityManagerFactory.withOptions().connection(serviceHub.database.dataSource.connection + .apply { + transactionIsolation = 1 + }).openSession() + + val tx = session.beginTransaction() + // TODO For now the main legal identity is left in NodeInfo, this should be set comparision/come up with index for NodeInfo? + val info = findByIdentityKey(session, nodeInfo.legalIdentity.owningKey) + val nodeInfoEntry = generateMappedObject(nodeInfo) + if (info.isNotEmpty()) { + nodeInfoEntry.id = info[0].id + } + session.merge(nodeInfoEntry) + tx.commit() + session.close() + } + + private fun removeInfoDB(nodeInfo: NodeInfo) { + createSession { + val info = findByIdentityKey(it, nodeInfo.legalIdentity.owningKey).single() + it.remove(info) + } + } + + private fun findByIdentityKey(session: Session, identityKey: PublicKey): List { + val query = session.createQuery( + "SELECT n FROM ${NodeInfoSchemaV1.PersistentNodeInfo::class.java.name} n JOIN n.legalIdentitiesAndCerts l WHERE l.owningKey = :owningKey", + NodeInfoSchemaV1.PersistentNodeInfo::class.java) + query.setParameter("owningKey", identityKey.toBase58String()) + return query.resultList + } + + private fun queryByIdentityKey(identityKey: PublicKey): List { + createSession { + val result = findByIdentityKey(it, identityKey) + return result.map { it.toNodeInfo() } + } + } + + // TODO It's useless for now, because toString on X500 names is inconsistent and we have: + // C=ES,L=Madrid,O=Alice Corp,CN=Alice Corp + // CN=Alice Corp,O=Alice Corp,L=Madrid,C=ES + private fun queryByLegalName(name: X500Name): List { + createSession { + val query = it.createQuery( + "SELECT n FROM ${NodeInfoSchemaV1.PersistentNodeInfo::class.java.name} n JOIN n.legalIdentitiesAndCerts l WHERE l.name = :name", + NodeInfoSchemaV1.PersistentNodeInfo::class.java) + query.setParameter("name", name.toString()) + val result = query.resultList + return result.map { it.toNodeInfo() } + } + } + + private fun queryByAddress(hostAndPort: NetworkHostAndPort): NodeInfo? { + createSession { + val query = it.createQuery( + "SELECT n FROM ${NodeInfoSchemaV1.PersistentNodeInfo::class.java.name} n JOIN n.addresses a WHERE a.pk.host = :host AND a.pk.port = :port", + NodeInfoSchemaV1.PersistentNodeInfo::class.java) + query.setParameter("host", hostAndPort.host) + query.setParameter("port", hostAndPort.port) + val result = query.resultList + return if (result.isEmpty()) null + else result.map { it.toNodeInfo() }.singleOrNull() ?: throw IllegalStateException("More than one node with the same host and port") + } + } + + /** Object Relational Mapping support. */ + private fun generateMappedObject(nodeInfo: NodeInfo): NodeInfoSchemaV1.PersistentNodeInfo { + return NodeInfoSchemaV1.PersistentNodeInfo( + id = 0, + addresses = nodeInfo.addresses.map { NodeInfoSchemaV1.DBHostAndPort.fromHostAndPort(it) }, + legalIdentitiesAndCerts = nodeInfo.legalIdentitiesAndCerts.map { NodeInfoSchemaV1.DBPartyAndCertificate(it) }.toSet() + // TODO It's workaround to keep the main identity, will be removed in future PR getting rid of services. + + NodeInfoSchemaV1.DBPartyAndCertificate(nodeInfo.legalIdentityAndCert, isMain = true), + platformVersion = nodeInfo.platformVersion, + advertisedServices = nodeInfo.advertisedServices.map { NodeInfoSchemaV1.DBServiceEntry(it.serialize().bytes) }, + serial = nodeInfo.serial + ) + } + + override fun clearNetworkMapCache() { + serviceHub.database.transaction { + createSession { + val result = getAllInfos(it) + for (nodeInfo in result) it.remove(nodeInfo) + } + } + } +} diff --git a/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt b/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt index 331ef4461d..0b53876af9 100644 --- a/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt +++ b/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt @@ -5,6 +5,7 @@ import net.corda.core.contracts.FungibleAsset import net.corda.core.contracts.LinearState import net.corda.core.schemas.CommonSchemaV1 import net.corda.core.schemas.MappedSchema +import net.corda.core.schemas.NodeInfoSchemaV1 import net.corda.core.schemas.PersistentState import net.corda.core.schemas.QueryableState import net.corda.core.serialization.SingletonSerializeAsToken @@ -58,6 +59,7 @@ class NodeSchemaService(customSchemas: Set = emptySet()) : SchemaS val requiredSchemas: Map = mapOf(Pair(CommonSchemaV1, SchemaService.SchemaOptions()), Pair(VaultSchemaV1, SchemaService.SchemaOptions()), + Pair(NodeInfoSchemaV1, SchemaService.SchemaOptions()), Pair(NodeServicesV1, SchemaService.SchemaOptions())) override val schemaOptions: Map = requiredSchemas.plus(customSchemas.map { diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManager.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManager.kt index 4c2e3b0368..a20c6aaca3 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManager.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManager.kt @@ -39,6 +39,7 @@ import net.corda.node.utilities.wrapWithDatabaseTransaction import net.corda.nodeapi.internal.serialization.SerializeAsTokenContextImpl import net.corda.nodeapi.internal.serialization.withTokenContext import org.apache.activemq.artemis.utils.ReusableLatch +import org.bouncycastle.asn1.x500.X500Name import org.slf4j.Logger import rx.Observable import rx.subjects.PublishSubject @@ -170,7 +171,7 @@ class StateMachineManager(val serviceHub: ServiceHubInternal, checkQuasarJavaAgentPresence() restoreFibersFromCheckpoints() listenToLedgerTransactions() - serviceHub.networkMapCache.mapServiceRegistered.then { executor.execute(this::resumeRestoredFibers) } + serviceHub.networkMapCache.nodeReady.then { executor.execute(this::resumeRestoredFibers) } } private fun checkQuasarJavaAgentPresence() { diff --git a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt index 0280afd686..c8bdfb9287 100644 --- a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt @@ -11,12 +11,12 @@ import net.corda.core.node.services.VaultService import net.corda.core.serialization.SingletonSerializeAsToken import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.days -import net.corda.node.services.MockServiceHubInternal import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.services.persistence.DBCheckpointStorage import net.corda.node.services.statemachine.FlowLogicRefFactoryImpl import net.corda.node.services.statemachine.StateMachineManager import net.corda.node.services.vault.NodeVaultService +import net.corda.node.testing.MockServiceHubInternal import net.corda.node.utilities.AffinityExecutor import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase diff --git a/node/src/test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTests.kt b/node/src/test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTests.kt index c095eb86fb..3d1942c01c 100644 --- a/node/src/test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTests.kt @@ -12,9 +12,10 @@ import net.corda.node.services.RPCUserServiceImpl import net.corda.node.services.api.MonitoringService import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.config.configureWithDevSSLCertificate -import net.corda.node.services.network.InMemoryNetworkMapCache +import net.corda.node.services.network.PersistentNetworkMapCache import net.corda.node.services.network.NetworkMapService import net.corda.node.services.transactions.PersistentUniquenessProvider +import net.corda.node.testing.MockServiceHubInternal import net.corda.node.utilities.AffinityExecutor.ServiceAffinityExecutor import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase @@ -54,8 +55,7 @@ class ArtemisMessagingTests : TestDependencyInjectionBase() { var messagingClient: NodeMessagingClient? = null var messagingServer: ArtemisMessagingServer? = null - // TODO: We should have a dummy service hub rather than change behaviour in tests - val networkMapCache = InMemoryNetworkMapCache(serviceHub = null) + lateinit var networkMapCache: PersistentNetworkMapCache val rpcOps = object : RPCOps { override val protocolVersion: Int get() = throw UnsupportedOperationException() @@ -71,6 +71,7 @@ class ArtemisMessagingTests : TestDependencyInjectionBase() { LogHelper.setLevel(PersistentUniquenessProvider::class) database = configureDatabase(makeTestDataSourceProperties(), makeTestDatabaseProperties(), createIdentityService = ::makeTestIdentityService) networkMapRegistrationFuture = doneFuture(Unit) + networkMapCache = PersistentNetworkMapCache(serviceHub = object : MockServiceHubInternal(database, config) {}) } @After diff --git a/node/src/test/kotlin/net/corda/node/services/network/InMemoryNetworkMapCacheTest.kt b/node/src/test/kotlin/net/corda/node/services/network/NetworkMapCacheTest.kt similarity index 73% rename from node/src/test/kotlin/net/corda/node/services/network/InMemoryNetworkMapCacheTest.kt rename to node/src/test/kotlin/net/corda/node/services/network/NetworkMapCacheTest.kt index 0b4cdb9a72..ff370836c0 100644 --- a/node/src/test/kotlin/net/corda/node/services/network/InMemoryNetworkMapCacheTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/network/NetworkMapCacheTest.kt @@ -6,13 +6,14 @@ import net.corda.core.utilities.getOrThrow import net.corda.testing.ALICE import net.corda.testing.BOB import net.corda.testing.node.MockNetwork +import org.assertj.core.api.Assertions.assertThat import org.junit.After import org.junit.Before import org.junit.Test import java.math.BigInteger import kotlin.test.assertEquals -class InMemoryNetworkMapCacheTest { +class NetworkMapCacheTest { lateinit var mockNet: MockNetwork @Before @@ -47,9 +48,7 @@ class InMemoryNetworkMapCacheTest { // Node A currently knows only about itself, so this returns node A assertEquals(nodeA.services.networkMapCache.getNodeByLegalIdentityKey(nodeA.info.legalIdentity.owningKey), nodeA.info) - nodeA.database.transaction { - nodeA.services.networkMapCache.addNode(nodeB.info) - } + nodeA.services.networkMapCache.addNode(nodeB.info) // The details of node B write over those for node A assertEquals(nodeA.services.networkMapCache.getNodeByLegalIdentityKey(nodeA.info.legalIdentity.owningKey), nodeB.info) } @@ -68,4 +67,20 @@ class InMemoryNetworkMapCacheTest { // TODO: Should have a test case with anonymous lookup } + + @Test + fun `remove node from cache`() { + val nodes = mockNet.createSomeNodes(1) + val n0 = nodes.mapNode + val n1 = nodes.partyNodes[0] + val node0Cache = n0.services.networkMapCache as PersistentNetworkMapCache + mockNet.runNetwork() + n0.database.transaction { + assertThat(node0Cache.getNodeByLegalIdentity(n1.info.legalIdentity) != null) + node0Cache.removeNode(n1.info) + assertThat(node0Cache.getNodeByLegalIdentity(n1.info.legalIdentity) == null) + assertThat(node0Cache.getNodeByLegalIdentity(n0.info.legalIdentity) != null) + assertThat(node0Cache.getNodeByLegalName(n1.info.legalIdentity.name) == null) + } + } } diff --git a/node/src/test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt b/node/src/test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt new file mode 100644 index 0000000000..b5dae10615 --- /dev/null +++ b/node/src/test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt @@ -0,0 +1,194 @@ +package net.corda.node.services.network + +import co.paralleluniverse.fibers.Suspendable +import net.corda.core.crypto.toBase58String +import net.corda.core.flows.FlowLogic +import net.corda.core.flows.InitiatedBy +import net.corda.core.flows.InitiatingFlow +import net.corda.core.identity.Party +import net.corda.core.node.NodeInfo +import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.seconds +import net.corda.core.utilities.unwrap +import net.corda.node.internal.Node +import net.corda.testing.ALICE +import net.corda.testing.BOB +import net.corda.testing.CHARLIE +import net.corda.testing.DUMMY_NOTARY +import net.corda.testing.node.NodeBasedTest +import org.assertj.core.api.Assertions.assertThat +import org.bouncycastle.asn1.x500.X500Name +import org.junit.Before +import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertFails + +class PersistentNetworkMapCacheTest : NodeBasedTest() { + val partiesList = listOf(DUMMY_NOTARY, ALICE, BOB) + val addressesMap: HashMap = HashMap() + val infos: MutableSet = HashSet() + + @Before + fun start() { + val nodes = startNodesWithPort(partiesList) + nodes.forEach { it.nodeReadyFuture.get() } // Need to wait for network map registration, as these tests are ran without waiting. + nodes.forEach { + infos.add(it.info) + addressesMap[it.info.legalIdentity.name] = it.info.addresses[0] + it.stop() // We want them to communicate with NetworkMapService to save data to cache. + } + } + + @Test + fun `get nodes by owning key and by name, no network map service`() { + val alice = startNodesWithPort(listOf(ALICE), noNetworkMap = true)[0] + val netCache = alice.services.networkMapCache as PersistentNetworkMapCache + alice.database.transaction { + val res = netCache.getNodeByLegalIdentity(alice.info.legalIdentity) + assertEquals(alice.info, res) + val res2 = netCache.getNodeByLegalName(DUMMY_NOTARY.name) + assertEquals(infos.filter { it.legalIdentity.name == DUMMY_NOTARY.name }.singleOrNull(), res2) + } + } + + @Test + fun `get nodes by address no network map service`() { + val alice = startNodesWithPort(listOf(ALICE), noNetworkMap = true)[0] + val netCache = alice.services.networkMapCache as PersistentNetworkMapCache + alice.database.transaction { + val res = netCache.getNodeByAddress(alice.info.addresses[0]) + assertEquals(alice.info, res) + } + } + + @Test + fun `restart node with DB map cache and no network map`() { + val alice = startNodesWithPort(listOf(ALICE), noNetworkMap = true)[0] + val partyNodes = alice.services.networkMapCache.partyNodes + assert(NetworkMapService.type !in alice.info.advertisedServices.map { it.info.type }) + assertEquals(null, alice.inNodeNetworkMapService) + assertEquals(infos.size, partyNodes.size) + assertEquals(infos.map { it.legalIdentity }.toSet(), partyNodes.map { it.legalIdentity }.toSet()) + } + + @Test + fun `start 2 nodes without pointing at NetworkMapService and communicate with each other`() { + val parties = partiesList.subList(1, partiesList.size) + val nodes = startNodesWithPort(parties, noNetworkMap = true) + assert(nodes.all { it.inNodeNetworkMapService == null }) + assert(nodes.all { NetworkMapService.type !in it.info.advertisedServices.map { it.info.type } }) + nodes.forEach { + val partyNodes = it.services.networkMapCache.partyNodes + assertEquals(infos.size, partyNodes.size) + assertEquals(infos.map { it.legalIdentity }.toSet(), partyNodes.map { it.legalIdentity }.toSet()) + } + checkConnectivity(nodes) + } + + @Test + fun `start 2 nodes pointing at NetworkMapService but don't start network map node`() { + val parties = partiesList.subList(1, partiesList.size) + val nodes = startNodesWithPort(parties, noNetworkMap = false) + assert(nodes.all { it.inNodeNetworkMapService == null }) + assert(nodes.all { NetworkMapService.type !in it.info.advertisedServices.map { it.info.type } }) + nodes.forEach { + val partyNodes = it.services.networkMapCache.partyNodes + assertEquals(infos.size, partyNodes.size) + assertEquals(infos.map { it.legalIdentity }.toSet(), partyNodes.map { it.legalIdentity }.toSet()) + } + checkConnectivity(nodes) + } + + @Test + fun `start node and network map communicate`() { + val parties = partiesList.subList(0, 2) + val nodes = startNodesWithPort(parties, noNetworkMap = false) + checkConnectivity(nodes) + } + + @Test + fun `start node without networkMapService and no database - fail`() { + assertFails { startNode(CHARLIE.name, noNetworkMap = true).getOrThrow(2.seconds) } + } + + @Test + fun `new node joins network without network map started`() { + val parties = partiesList.subList(1, partiesList.size) + // Start 2 nodes pointing at network map, but don't start network map service. + val otherNodes = startNodesWithPort(parties, noNetworkMap = false) + otherNodes.forEach { node -> + assert(infos.any { it.legalIdentity == node.info.legalIdentity }) + } + // Start node that is not in databases of other nodes. Point to NMS. Which has't started yet. + val charlie = startNodesWithPort(listOf(CHARLIE), noNetworkMap = false)[0] + otherNodes.forEach { + assert(charlie.info.legalIdentity !in it.services.networkMapCache.partyNodes.map { it.legalIdentity }) + } + // Start Network Map and see that charlie node appears in caches. + val nms = startNodesWithPort(listOf(DUMMY_NOTARY), noNetworkMap = false)[0] + nms.startupComplete.get() + assert(nms.inNodeNetworkMapService != null) + assert(infos.any {it.legalIdentity == nms.info.legalIdentity}) + otherNodes.forEach { + assert(nms.info.legalIdentity in it.services.networkMapCache.partyNodes.map { it.legalIdentity }) + } + charlie.nodeReadyFuture.get() // Finish registration. + checkConnectivity(listOf(otherNodes[0], nms)) // Checks connectivity from A to NMS. + val cacheA = otherNodes[0].services.networkMapCache.partyNodes + val cacheB = otherNodes[1].services.networkMapCache.partyNodes + val cacheC = charlie.services.networkMapCache.partyNodes + assertEquals(4, cacheC.size) // Charlie fetched data from NetworkMap + assert(charlie.info.legalIdentity in cacheB.map { it.legalIdentity }) // Other nodes also fetched data from Network Map with node C. + assertEquals(cacheA.toSet(), cacheB.toSet()) + assertEquals(cacheA.toSet(), cacheC.toSet()) + } + + // HELPERS + // Helper function to restart nodes with the same host and port. + private fun startNodesWithPort(nodesToStart: List, noNetworkMap: Boolean = false): List { + return nodesToStart.map { party -> + val configOverrides = addressesMap[party.name]?.let { mapOf("p2pAddress" to it.toString()) } ?: emptyMap() + if (party == DUMMY_NOTARY) { + startNetworkMapNode(party.name, configOverrides = configOverrides) + } + else { + startNode(party.name, + configOverrides = configOverrides, + noNetworkMap = noNetworkMap, + waitForConnection = false).getOrThrow() + } + } + } + + // Check that nodes are functional, communicate each with each. + private fun checkConnectivity(nodes: List) { + nodes.forEach { node1 -> + nodes.forEach { node2 -> + node2.registerInitiatedFlow(SendBackFlow::class.java) + val resultFuture = node1.services.startFlow(SendFlow(node2.info.legalIdentity)).resultFuture + assertThat(resultFuture.getOrThrow()).isEqualTo("Hello!") + } + } + } + + @InitiatingFlow + private class SendFlow(val otherParty: Party) : FlowLogic() { + @Suspendable + override fun call(): String { + println("SEND FLOW to $otherParty") + println("Party key ${otherParty.owningKey.toBase58String()}") + return sendAndReceive(otherParty, "Hi!").unwrap { it } + } + } + + @InitiatedBy(SendFlow::class) + private class SendBackFlow(val otherParty: Party) : FlowLogic() { + @Suspendable + override fun call() { + println("SEND BACK FLOW to $otherParty") + println("Party key ${otherParty.owningKey.toBase58String()}") + send(otherParty, "Hello!") + } + } +} diff --git a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt index 64d21ded83..a5084a5f42 100644 --- a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt @@ -220,6 +220,7 @@ class FlowFrameworkTests { node2.stop() node2.database.transaction { assertEquals(1, node2.checkpointStorage.checkpoints().size) // confirm checkpoint + node2.services.networkMapCache.clearNetworkMapCache() } val node2b = mockNet.createNode(node1.network.myAddress, node2.id, advertisedServices = *node2.advertisedServices.toTypedArray()) node2.manuallyCloseDB() diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt index 547d29be7b..d726b836d1 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt @@ -85,7 +85,7 @@ class VisualiserViewModel { // bottom left: -23.2031,29.8406 // top right: 33.0469,64.3209 try { - return node.place.coordinate.project(view.mapImage.fitWidth, view.mapImage.fitHeight, 64.3209, 29.8406, -23.2031, 33.0469) + return node.place.coordinate!!.project(view.mapImage.fitWidth, view.mapImage.fitHeight, 64.3209, 29.8406, -23.2031, 33.0469) } catch(e: Exception) { throw Exception("Cannot project ${node.info.legalIdentity}", e) } diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt index c70c383102..b8fcc78b5b 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt @@ -261,7 +261,7 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean, } } - val networkInitialisationFinished = mockNet.nodes.map { it.networkMapRegistrationFuture }.transpose() + val networkInitialisationFinished = mockNet.nodes.map { it.nodeReadyFuture }.transpose() fun start(): CordaFuture { mockNet.startNodes() diff --git a/test-utils/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt b/test-utils/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt index acec6efcb2..11f099dc5b 100644 --- a/test-utils/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt +++ b/test-utils/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt @@ -78,5 +78,4 @@ class DriverTests { assertThat(debugLinesPresent).isTrue() } } - } diff --git a/node/src/test/kotlin/net/corda/node/services/MockServiceHubInternal.kt b/test-utils/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt similarity index 96% rename from node/src/test/kotlin/net/corda/node/services/MockServiceHubInternal.kt rename to test-utils/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt index 1994ed04c8..ff70a21606 100644 --- a/node/src/test/kotlin/net/corda/node/services/MockServiceHubInternal.kt +++ b/test-utils/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt @@ -1,4 +1,4 @@ -package net.corda.node.services +package net.corda.node.testing import com.codahale.metrics.MetricRegistry import net.corda.core.flows.FlowInitiator @@ -63,7 +63,7 @@ open class MockServiceHubInternal( override val clock: Clock get() = overrideClock ?: throw UnsupportedOperationException() override val myInfo: NodeInfo - get() = NodeInfo(listOf(MOCK_HOST_AND_PORT), DUMMY_IDENTITY_1, NonEmptySet.of(DUMMY_IDENTITY_1), 1) // Required to get a dummy platformVersion when required for tests. + get() = NodeInfo(listOf(MOCK_HOST_AND_PORT), DUMMY_IDENTITY_1, NonEmptySet.of(DUMMY_IDENTITY_1), 1, serial = 1L) // Required to get a dummy platformVersion when required for tests. override val monitoringService: MonitoringService = MonitoringService(MetricRegistry()) override val rpcFlows: List>> get() = throw UnsupportedOperationException() diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt index de7c78d5cc..c22b5fb32d 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -223,7 +223,8 @@ sealed class PortAllocation { * } * * Note that [DriverDSL.startNode] does not wait for the node to start up synchronously, but rather returns a [CordaFuture] - * of the [NodeInfo] that may be waited on, which completes when the new node registered with the network map service. + * of the [NodeInfo] that may be waited on, which completes when the new node registered with the network map service or + * loaded node data from database. * * The driver implicitly bootstraps a [NetworkMapService]. * @@ -698,7 +699,8 @@ class DriverDSL( // node port numbers to be shifted, so all demos and docs need to be updated accordingly. "webAddress" to webAddress.toString(), "p2pAddress" to dedicatedNetworkMapAddress.toString(), - "useTestClock" to useTestClock + "useTestClock" to useTestClock, + "extraAdvertisedServiceIds" to listOf(ServiceInfo(NetworkMapService.type).toString()) ) ) return startNodeInternal(config, webAddress, startInProcess) @@ -716,7 +718,7 @@ class DriverDSL( ) return nodeAndThreadFuture.flatMap { (node, thread) -> establishRpc(nodeConfiguration.p2pAddress, nodeConfiguration, openFuture()).flatMap { rpc -> - rpc.waitUntilRegisteredWithNetworkMap().map { + rpc.waitUntilNetworkReady().map { NodeHandle.InProcess(rpc.nodeIdentity(), rpc, nodeConfiguration, webAddress, node, thread) } } @@ -731,9 +733,9 @@ class DriverDSL( } // We continue to use SSL enabled port for RPC when its for node user. establishRpc(nodeConfiguration.p2pAddress, nodeConfiguration, processDeathFuture).flatMap { rpc -> - // Call waitUntilRegisteredWithNetworkMap in background in case RPC is failing over: + // Call waitUntilNetworkReady in background in case RPC is failing over: val networkMapFuture = executorService.fork { - rpc.waitUntilRegisteredWithNetworkMap() + rpc.waitUntilNetworkReady() }.flatMap { it } firstOf(processDeathFuture, networkMapFuture) { if (it == processDeathFuture) { diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt index ae80cc56da..75cdade8e0 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt @@ -4,11 +4,11 @@ import co.paralleluniverse.common.util.VisibleForTesting import net.corda.core.crypto.entropyToKeyPair import net.corda.core.identity.Party import net.corda.core.node.NodeInfo -import net.corda.core.node.ServiceHub import net.corda.core.node.services.NetworkMapCache import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.NonEmptySet -import net.corda.node.services.network.InMemoryNetworkMapCache +import net.corda.node.services.api.ServiceHubInternal +import net.corda.node.services.network.PersistentNetworkMapCache import net.corda.testing.getTestPartyAndCertificate import net.corda.testing.getTestX509Name import rx.Observable @@ -18,7 +18,7 @@ import java.math.BigInteger /** * Network map cache with no backing map service. */ -class MockNetworkMapCache(serviceHub: ServiceHub) : InMemoryNetworkMapCache(serviceHub) { +class MockNetworkMapCache(serviceHub: ServiceHubInternal) : PersistentNetworkMapCache(serviceHub) { private companion object { val BANK_C = getTestPartyAndCertificate(getTestX509Name("Bank C"), entropyToKeyPair(BigInteger.valueOf(1000)).public) val BANK_D = getTestPartyAndCertificate(getTestX509Name("Bank D"), entropyToKeyPair(BigInteger.valueOf(2000)).public) @@ -29,8 +29,8 @@ class MockNetworkMapCache(serviceHub: ServiceHub) : InMemoryNetworkMapCache(serv override val changed: Observable = PublishSubject.create() init { - val mockNodeA = NodeInfo(listOf(BANK_C_ADDR), BANK_C, NonEmptySet.of(BANK_C), 1) - val mockNodeB = NodeInfo(listOf(BANK_D_ADDR), BANK_D, NonEmptySet.of(BANK_D), 1) + val mockNodeA = NodeInfo(listOf(BANK_C_ADDR), BANK_C, NonEmptySet.of(BANK_C), 1, serial = 1L) + val mockNodeB = NodeInfo(listOf(BANK_D_ADDR), BANK_D, NonEmptySet.of(BANK_D), 1, serial = 1L) registeredNodes[mockNodeA.legalIdentity.owningKey] = mockNodeA registeredNodes[mockNodeB.legalIdentity.owningKey] = mockNodeB runWithoutMapService() diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt index eae9105499..f014135766 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt @@ -212,7 +212,7 @@ class MockNetwork(private val networkSendManuallyPumped: Boolean = false, override fun noNetworkMapConfigured() = doneFuture(Unit) // There is no need to slow down the unit tests by initialising CityDatabase - override fun findMyLocation(): WorldMapLocation? = null + open fun findMyLocation(): WorldMapLocation? = null // It's left only for NetworkVisualiserSimulation override fun makeTransactionVerifierService() = InMemoryTransactionVerifierService(1) @@ -302,7 +302,7 @@ class MockNetwork(private val networkSendManuallyPumped: Boolean = false, return nodeFactory.create(config, this, networkMapAddress, advertisedServices.toSet(), id, overrideServices, entropyRoot).apply { if (start) { start() - if (threadPerNode && networkMapAddress != null) networkMapRegistrationFuture.getOrThrow() // XXX: What about manually-started nodes? + if (threadPerNode && networkMapAddress != null) nodeReadyFuture.getOrThrow() // XXX: What about manually-started nodes? } _nodes.add(this) } diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt index f68746fc1a..ab496c749a 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt @@ -160,7 +160,7 @@ open class MockServices(vararg val keys: KeyPair) : ServiceHub { override val clock: Clock get() = Clock.systemUTC() override val myInfo: NodeInfo get() { val identity = getTestPartyAndCertificate(MEGA_CORP.name, key.public) - return NodeInfo(emptyList(), identity, NonEmptySet.of(identity), 1) + return NodeInfo(emptyList(), identity, NonEmptySet.of(identity), 1, serial = 1L) } override val transactionVerifierService: TransactionVerifierService get() = InMemoryTransactionVerifierService(2) diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt b/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt index 8bd949ca60..6f5f55a365 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt @@ -4,6 +4,7 @@ import net.corda.core.concurrent.CordaFuture import net.corda.core.crypto.appendToCommonName import net.corda.core.crypto.commonName import net.corda.core.crypto.getX509Name +import net.corda.core.internal.concurrent.doneFuture import net.corda.core.internal.concurrent.flatMap import net.corda.core.internal.concurrent.fork import net.corda.core.internal.concurrent.map @@ -19,6 +20,8 @@ import net.corda.node.services.config.ConfigHelper import net.corda.node.services.config.FullNodeConfiguration import net.corda.node.services.config.configOf import net.corda.node.services.config.plus +import net.corda.node.services.network.NetworkMapService +import net.corda.node.services.network.PersistentNetworkMapCache import net.corda.node.services.transactions.RaftValidatingNotaryService import net.corda.node.utilities.ServiceIdentityGenerator import net.corda.nodeapi.User @@ -76,6 +79,13 @@ abstract class NodeBasedTest : TestDependencyInjectionBase() { portNotBoundChecks.transpose().getOrThrow() } + /** + * Clear network map data from nodes' databases. + */ + fun clearAllNodeInfoDb() { + nodes.forEach { it.services.networkMapCache.clearNetworkMapCache() } + } + /** * You can use this method to start the network map node in a more customised manner. Otherwise it * will automatically be started with the default parameters. @@ -85,30 +95,44 @@ abstract class NodeBasedTest : TestDependencyInjectionBase() { advertisedServices: Set = emptySet(), rpcUsers: List = emptyList(), configOverrides: Map = emptyMap()): Node { - check(_networkMapNode == null) - return startNodeInternal(legalName, platformVersion, advertisedServices, rpcUsers, configOverrides).apply { + check(_networkMapNode == null || _networkMapNode!!.info.legalIdentity.name == legalName) + return startNodeInternal(legalName, platformVersion, advertisedServices + ServiceInfo(NetworkMapService.type), rpcUsers, configOverrides).apply { _networkMapNode = this } } + @JvmOverloads fun startNode(legalName: X500Name, platformVersion: Int = 1, advertisedServices: Set = emptySet(), rpcUsers: List = emptyList(), - configOverrides: Map = emptyMap()): CordaFuture { + configOverrides: Map = emptyMap(), + noNetworkMap: Boolean = false, + waitForConnection: Boolean = true): CordaFuture { + val networkMapConf = if (noNetworkMap) { + // Nonexistent network map service address. + mapOf( + "networkMapService" to mapOf( + "address" to "localhost:10000", + "legalName" to networkMapNode.info.legalIdentity.name.toString() + ) + ) + } else { + mapOf( + "networkMapService" to mapOf( + "address" to networkMapNode.configuration.p2pAddress.toString(), + "legalName" to networkMapNode.info.legalIdentity.name.toString() + ) + ) + } val node = startNodeInternal( legalName, platformVersion, advertisedServices, rpcUsers, - mapOf( - "networkMapService" to mapOf( - "address" to networkMapNode.configuration.p2pAddress.toString(), - "legalName" to networkMapNode.info.legalIdentity.name.toString() - ) - ) + configOverrides - ) - return node.networkMapRegistrationFuture.map { node } + networkMapConf + configOverrides, + noNetworkMap) + return if (waitForConnection) node.nodeReadyFuture.map { node } else doneFuture(node) } fun startNotaryCluster(notaryName: X500Name, @@ -149,18 +173,21 @@ abstract class NodeBasedTest : TestDependencyInjectionBase() { platformVersion: Int, advertisedServices: Set, rpcUsers: List, - configOverrides: Map): Node { + configOverrides: Map, + noNetworkMap: Boolean = false): Node { val baseDirectory = baseDirectory(legalName).createDirectories() val localPort = getFreeLocalPorts("localhost", 2) + val p2pAddress = configOverrides["p2pAddress"] ?: localPort[0].toString() val config = ConfigHelper.loadConfig( baseDirectory = baseDirectory, allowMissingConfig = true, configOverrides = configOf( "myLegalName" to legalName.toString(), - "p2pAddress" to localPort[0].toString(), + "p2pAddress" to p2pAddress, "rpcAddress" to localPort[1].toString(), "extraAdvertisedServiceIds" to advertisedServices.map { it.toString() }, - "rpcUsers" to rpcUsers.map { it.toMap() } + "rpcUsers" to rpcUsers.map { it.toMap() }, + "noNetworkMap" to noNetworkMap ) + configOverrides ) diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt b/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt index f10d1b12cf..a3de30fef1 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt @@ -15,8 +15,8 @@ import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.services.keys.E2ETestKeyManagementService import net.corda.node.services.messaging.ArtemisMessagingServer import net.corda.node.services.messaging.NodeMessagingClient -import net.corda.node.services.network.InMemoryNetworkMapCache import net.corda.node.services.schema.NodeSchemaService +import net.corda.node.testing.MockServiceHubInternal import net.corda.node.utilities.AffinityExecutor.ServiceAffinityExecutor import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase @@ -42,7 +42,8 @@ class SimpleNode(val config: NodeConfiguration, val address: NetworkHostAndPort val keyService: KeyManagementService = E2ETestKeyManagementService(identityService, setOf(identity)) val executor = ServiceAffinityExecutor(config.myLegalName.commonName, 1) // TODO: We should have a dummy service hub rather than change behaviour in tests - val broker = ArtemisMessagingServer(config, address.port, rpcAddress.port, InMemoryNetworkMapCache(serviceHub = null), userService) + val broker = ArtemisMessagingServer(config, address.port, rpcAddress.port, + MockNetworkMapCache(serviceHub = object : MockServiceHubInternal(database = database, configuration = config) {}), userService) val networkMapRegistrationFuture = openFuture() val network = database.transaction { NodeMessagingClient( diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/InstallFactory.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/InstallFactory.kt index cfec8b3757..1bf02e2a52 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/InstallFactory.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/InstallFactory.kt @@ -1,6 +1,8 @@ package net.corda.demobench.model import com.typesafe.config.Config +import net.corda.core.node.services.ServiceInfo +import net.corda.core.node.services.ServiceType import net.corda.core.utilities.parseNetworkHostAndPort import org.bouncycastle.asn1.x500.X500Name import tornadofx.* @@ -51,14 +53,14 @@ class InstallFactory : Controller() { return port } - private fun Config.parseExtraServices(path: String): List { - val services = serviceController.services.toSortedSet() + private fun Config.parseExtraServices(path: String): MutableList { + val services = serviceController.services.toSortedSet() + ServiceInfo(ServiceType.networkMap).toString() return this.getStringList(path) .filter { !it.isNullOrEmpty() } .map { svc -> require(svc in services, { "Unknown service '$svc'." }) svc - }.toList() + }.toMutableList() } } diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt index 64406da824..fc13438570 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt @@ -16,7 +16,7 @@ class NodeConfig( val rpcPort: Int, val webPort: Int, val h2Port: Int, - val extraServices: List, + val extraServices: MutableList = mutableListOf(), val users: List = listOf(defaultUser), var networkMap: NetworkMapConfig? = null ) : NetworkMapConfig(legalName, p2pPort), HasPlugins { diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt index 0b484aacda..18750dd4ae 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt @@ -1,6 +1,8 @@ package net.corda.demobench.model import net.corda.core.crypto.getX509Name +import net.corda.core.node.services.ServiceInfo +import net.corda.core.node.services.ServiceType import net.corda.demobench.plugin.PluginController import net.corda.demobench.pty.R3Pty import tornadofx.* @@ -54,15 +56,15 @@ class NodeController(check: atRuntime = ::checkExists) : Controller() { baseDir, getX509Name( myLegalName = nodeData.legalName.value.trim(), - email = "corda@city.${location.countryCode.toLowerCase()}.example", - nearestCity = location.description, + email = "corda@city.${location.countryCode!!.toLowerCase()}.example", + nearestCity = location.description!!, country = location.countryCode ), nodeData.p2pPort.value, nodeData.rpcPort.value, nodeData.webPort.value, nodeData.h2Port.value, - nodeData.extraServices.value + nodeData.extraServices.toMutableList() ) if (nodes.putIfAbsent(config.key, config) != null) { @@ -98,6 +100,7 @@ class NodeController(check: atRuntime = ::checkExists) : Controller() { if (hasNetworkMap()) { config.networkMap = networkMapConfig } else { + config.extraServices.add(ServiceInfo(ServiceType.networkMap).toString()) networkMapConfig = config log.info("Network map provided by: ${config.legalName}") } diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt index cf9822f969..71566e98a4 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt @@ -220,7 +220,7 @@ class NodeTabView : Fragment() { imageview { image = flags.get()[it.countryCode] } - label(it.description) + label(it.description!!) alignment = Pos.CENTER_LEFT } } diff --git a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt index 6fee64384a..e73cbef9c7 100644 --- a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt +++ b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt @@ -82,7 +82,7 @@ class NodeConfigTest { @Test fun `test services`() { - val config = createConfig(services = listOf("my.service")) + val config = createConfig(services = mutableListOf("my.service")) assertEquals(listOf("my.service"), config.extraServices) } @@ -107,13 +107,13 @@ class NodeConfigTest { @Test fun `test cash issuer`() { - val config = createConfig(services = listOf("corda.issuer.GBP")) + val config = createConfig(services = mutableListOf("corda.issuer.GBP")) assertTrue(config.isCashIssuer) } @Test fun `test not cash issuer`() { - val config = createConfig(services = listOf("corda.issuerubbish")) + val config = createConfig(services = mutableListOf("corda.issuerubbish")) assertFalse(config.isCashIssuer) } @@ -138,7 +138,7 @@ class NodeConfigTest { rpcPort = 40002, webPort = 20001, h2Port = 30001, - services = listOf("my.service"), + services = mutableListOf("my.service"), users = listOf(user("jenny")) ) assertEquals(prettyPrint("{" @@ -164,7 +164,7 @@ class NodeConfigTest { rpcPort = 40002, webPort = 20001, h2Port = 30001, - services = listOf("my.service"), + services = mutableListOf("my.service"), users = listOf(user("jenny")) ) config.networkMap = NetworkMapConfig(DUMMY_NOTARY.name, 12345) @@ -193,7 +193,7 @@ class NodeConfigTest { rpcPort = 40002, webPort = 20001, h2Port = 30001, - services = listOf("my.service"), + services = mutableListOf("my.service"), users = listOf(user("jenny")) ) config.networkMap = NetworkMapConfig(DUMMY_NOTARY.name, 12345) @@ -223,7 +223,7 @@ class NodeConfigTest { rpcPort = 40002, webPort = 20001, h2Port = 30001, - services = listOf("my.service"), + services = mutableListOf("my.service"), users = listOf(user("jenny")) ) config.networkMap = NetworkMapConfig(DUMMY_NOTARY.name, 12345) @@ -257,7 +257,7 @@ class NodeConfigTest { rpcPort: Int = -1, webPort: Int = -1, h2Port: Int = -1, - services: List = listOf("extra.service"), + services: MutableList = mutableListOf("extra.service"), users: List = listOf(user("guest")) ) = NodeConfig( baseDir, diff --git a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt index d476ccc93a..40cee11f4a 100644 --- a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt +++ b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt @@ -170,7 +170,7 @@ class NodeControllerTest { rpcPort: Int = -1, webPort: Int = -1, h2Port: Int = -1, - services: List = listOf("extra.service"), + services: MutableList = mutableListOf("extra.service"), users: List = listOf(user("guest")) ) = NodeConfig( baseDir, diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt index 23dcb222cf..2c33129de9 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt @@ -27,10 +27,13 @@ import javafx.util.Duration import net.corda.client.jfx.model.* import net.corda.client.jfx.utils.* import net.corda.core.contracts.ContractState +import net.corda.core.crypto.locationOrNull import net.corda.core.crypto.toBase58String import net.corda.core.identity.Party +import net.corda.core.node.CityDatabase import net.corda.core.node.NodeInfo import net.corda.core.node.ScreenCoordinate +import net.corda.core.node.WorldMapLocation import net.corda.explorer.formatters.PartyNameFormatter import net.corda.explorer.model.CordaView import tornadofx.* @@ -99,7 +102,7 @@ class Network : CordaView() { copyableLabel(SimpleObjectProperty(node.legalIdentity.owningKey.toBase58String())).apply { minWidth = 400.0 } } row("Services :") { label(node.advertisedServices.map { it.info }.joinToString(", ")) } - node.worldMapLocation?.apply { row("Location :") { label(this@apply.description) } } + node.getWorldMapLocation()?.apply { row("Location :") { label(this@apply.description!!) } } } } setOnMouseClicked { @@ -123,7 +126,7 @@ class Network : CordaView() { contentDisplay = ContentDisplay.TOP val coordinate = Bindings.createObjectBinding({ // These coordinates are obtained when we generate the map using TileMill. - node.worldMapLocation?.coordinate?.project(mapPane.width, mapPane.height, 85.0511, -85.0511, -180.0, 180.0) ?: ScreenCoordinate(0.0, 0.0) + node.getWorldMapLocation()?.coordinate?.project(mapPane.width, mapPane.height, 85.0511, -85.0511, -180.0, 180.0) ?: ScreenCoordinate(0.0, 0.0) }, arrayOf(mapPane.widthProperty(), mapPane.heightProperty())) // Center point of the label. layoutXProperty().bind(coordinate.map { it.screenX - width / 2 }) diff --git a/tools/loadtest/src/main/kotlin/net/corda/loadtest/LoadTest.kt b/tools/loadtest/src/main/kotlin/net/corda/loadtest/LoadTest.kt index 254b8aacb2..7e70be42b0 100644 --- a/tools/loadtest/src/main/kotlin/net/corda/loadtest/LoadTest.kt +++ b/tools/loadtest/src/main/kotlin/net/corda/loadtest/LoadTest.kt @@ -185,7 +185,7 @@ fun runLoadTests(configuration: LoadTestConfiguration, tests: List Date: Wed, 30 Aug 2017 17:39:32 +0100 Subject: [PATCH 028/120] Remove CompositeSignaturesWithKeys Remove CompositeSignaturesWithKeys class, as other refactors mean it is now superfluous. Instead serialization of the TransactionSignature can be used directly. --- .../core/crypto/composite/CompositeSignature.kt | 9 ++++++--- .../composite/CompositeSignaturesWithKeys.kt | 15 --------------- .../net/corda/core/crypto/CompositeKeyTests.kt | 17 ++++++++--------- 3 files changed, 14 insertions(+), 27 deletions(-) delete mode 100644 core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignaturesWithKeys.kt diff --git a/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignature.kt b/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignature.kt index eb231cb7eb..36d160bb1b 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignature.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignature.kt @@ -1,6 +1,7 @@ package net.corda.core.crypto.composite import net.corda.core.crypto.SecureHash +import net.corda.core.crypto.TransactionSignature import net.corda.core.serialization.deserialize import java.io.ByteArrayOutputStream import java.security.* @@ -27,6 +28,7 @@ class CompositeSignature : Signature(SIGNATURE_ALGORITHM) { return signatureState!! } + @Deprecated("Deprecated in inherited API") @Throws(InvalidAlgorithmParameterException::class) override fun engineGetParameter(param: String?): Any { throw InvalidAlgorithmParameterException("Composite signatures do not support any parameters") @@ -46,6 +48,7 @@ class CompositeSignature : Signature(SIGNATURE_ALGORITHM) { } } + @Deprecated("Deprecated in inherited API") @Throws(InvalidAlgorithmParameterException::class) override fun engineSetParameter(param: String?, value: Any?) { throw InvalidAlgorithmParameterException("Composite signatures do not support any parameters") @@ -74,10 +77,10 @@ class CompositeSignature : Signature(SIGNATURE_ALGORITHM) { data class State(val buffer: ByteArrayOutputStream, val verifyKey: CompositeKey) { fun engineVerify(sigBytes: ByteArray): Boolean { - val sig = sigBytes.deserialize() - return if (verifyKey.isFulfilledBy(sig.sigs.map { it.by })) { + val sigs = sigBytes.deserialize>() + return if (verifyKey.isFulfilledBy(sigs.map { it.by })) { val clearData = SecureHash.SHA256(buffer.toByteArray()) - sig.sigs.all { it.isValid(clearData) } + sigs.all { it.isValid(clearData) } } else { false } diff --git a/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignaturesWithKeys.kt b/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignaturesWithKeys.kt deleted file mode 100644 index f9c8da8ab3..0000000000 --- a/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignaturesWithKeys.kt +++ /dev/null @@ -1,15 +0,0 @@ -package net.corda.core.crypto.composite - -import net.corda.core.crypto.TransactionSignature -import net.corda.core.serialization.CordaSerializable - -/** - * Custom class for holding signature data. This exists for later extension work to provide a standardised cross-platform - * serialization format. - */ -@CordaSerializable -data class CompositeSignaturesWithKeys(val sigs: List) { - companion object { - val EMPTY = CompositeSignaturesWithKeys(emptyList()) - } -} diff --git a/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt b/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt index 40c07f5063..3d8c3f5954 100644 --- a/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt +++ b/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt @@ -3,7 +3,6 @@ package net.corda.core.crypto import net.corda.core.crypto.composite.CompositeKey import net.corda.core.crypto.composite.CompositeKey.NodeAndWeight import net.corda.core.crypto.composite.CompositeSignature -import net.corda.core.crypto.composite.CompositeSignaturesWithKeys import net.corda.core.internal.declaredField import net.corda.core.internal.div import net.corda.core.serialization.serialize @@ -161,17 +160,17 @@ class CompositeKeyTests : TestDependencyInjectionBase() { engine.initVerify(twoOfThree) engine.update(secureHash.bytes) - assertFalse { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature)).serialize().bytes) } - assertFalse { engine.verify(CompositeSignaturesWithKeys(listOf(bobSignature)).serialize().bytes) } - assertFalse { engine.verify(CompositeSignaturesWithKeys(listOf(charlieSignature)).serialize().bytes) } - assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, bobSignature)).serialize().bytes) } - assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, charlieSignature)).serialize().bytes) } - assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(bobSignature, charlieSignature)).serialize().bytes) } - assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, bobSignature, charlieSignature)).serialize().bytes) } + assertFalse { engine.verify(listOf(aliceSignature).serialize().bytes) } + assertFalse { engine.verify(listOf(bobSignature).serialize().bytes) } + assertFalse { engine.verify(listOf(charlieSignature).serialize().bytes) } + assertTrue { engine.verify(listOf(aliceSignature, bobSignature).serialize().bytes) } + assertTrue { engine.verify(listOf(aliceSignature, charlieSignature).serialize().bytes) } + assertTrue { engine.verify(listOf(bobSignature, charlieSignature).serialize().bytes) } + assertTrue { engine.verify(listOf(aliceSignature, bobSignature, charlieSignature).serialize().bytes) } // Check the underlying signature is validated val brokenBobSignature = TransactionSignature(aliceSignature.bytes, bobSignature.by, SignatureMetadata(1, Crypto.findSignatureScheme(bobSignature.by).schemeNumberID)) - assertFalse { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, brokenBobSignature)).serialize().bytes) } + assertFalse { engine.verify(listOf(aliceSignature, brokenBobSignature).serialize().bytes) } } @Test() From 35dec9abdca1aad60f6c66acdabd4c073cc67bc5 Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Thu, 31 Aug 2017 13:24:45 +0100 Subject: [PATCH 029/120] Make addToWhitelist vararg for compactness. (#1361) --- .../SerializationCustomization.kt | 2 +- docs/source/changelog.rst | 2 + .../serialization/CordaClassResolver.kt | 11 ++- .../serialization/DefaultWhitelist.kt | 91 +++++++++---------- .../KryoSerializationCustomization.kt | 4 +- .../corda/vega/plugin/SimmPluginRegistry.kt | 24 ++--- 6 files changed, 70 insertions(+), 64 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/serialization/SerializationCustomization.kt b/core/src/main/kotlin/net/corda/core/serialization/SerializationCustomization.kt index e051f732c3..91c5dea265 100644 --- a/core/src/main/kotlin/net/corda/core/serialization/SerializationCustomization.kt +++ b/core/src/main/kotlin/net/corda/core/serialization/SerializationCustomization.kt @@ -1,6 +1,6 @@ package net.corda.core.serialization interface SerializationCustomization { - fun addToWhitelist(type: Class<*>) + fun addToWhitelist(vararg types: Class<*>) } diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 2ce4b0db3f..7b9c8cbb72 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -70,6 +70,8 @@ UNRELEASED * Removed the concept of relevancy from ``LinearState``. The ``ContractState``'s relevancy to the vault can be determined by the flow context, the vault will process any transaction from a flow which is not derived from transaction resolution verification. +* ``SerializationCustomization.addToWhitelist()` now accepts multiple classes via varargs. + Milestone 14 ------------ diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt index de21b06ac0..7d54a85007 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt @@ -6,7 +6,10 @@ import com.esotericsoftware.kryo.io.Output import com.esotericsoftware.kryo.serializers.FieldSerializer import com.esotericsoftware.kryo.util.DefaultClassResolver import com.esotericsoftware.kryo.util.Util -import net.corda.core.serialization.* +import net.corda.core.serialization.AttachmentsClassLoader +import net.corda.core.serialization.ClassWhitelist +import net.corda.core.serialization.CordaSerializable +import net.corda.core.serialization.SerializationContext import net.corda.core.utilities.loggerFor import java.io.PrintWriter import java.lang.reflect.Modifier.isAbstract @@ -16,8 +19,10 @@ import java.nio.file.Paths import java.nio.file.StandardOpenOption import java.util.* -fun Kryo.addToWhitelist(type: Class<*>) { - ((classResolver as? CordaClassResolver)?.whitelist as? MutableClassWhitelist)?.add(type) +fun Kryo.addToWhitelist(vararg types: Class<*>) { + for (type in types) { + ((classResolver as? CordaClassResolver)?.whitelist as? MutableClassWhitelist)?.add(type) + } } /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt index ae10b24d4b..d44c063c43 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt @@ -18,54 +18,53 @@ import java.util.* class DefaultWhitelist : CordaPluginRegistry() { override fun customizeSerialization(custom: SerializationCustomization): Boolean { custom.apply { - // TODO: Turn this into an array and use map {} - addToWhitelist(Array(0, {}).javaClass) - addToWhitelist(Notification::class.java) - addToWhitelist(Notification.Kind::class.java) - addToWhitelist(ArrayList::class.java) - addToWhitelist(listOf().javaClass) // EmptyList - addToWhitelist(Pair::class.java) - addToWhitelist(ByteArray::class.java) - addToWhitelist(UUID::class.java) - addToWhitelist(LinkedHashSet::class.java) - addToWhitelist(setOf().javaClass) // EmptySet - addToWhitelist(Currency::class.java) - addToWhitelist(listOf(Unit).javaClass) // SingletonList - addToWhitelist(setOf(Unit).javaClass) // SingletonSet - addToWhitelist(mapOf(Unit to Unit).javaClass) // SingletonSet - addToWhitelist(NetworkHostAndPort::class.java) - addToWhitelist(SimpleString::class.java) - addToWhitelist(KryoException::class.java) - addToWhitelist(StringBuffer::class.java) - addToWhitelist(Unit::class.java) - addToWhitelist(java.io.ByteArrayInputStream::class.java) - addToWhitelist(java.lang.Class::class.java) - addToWhitelist(java.math.BigDecimal::class.java) - addToWhitelist(java.security.KeyPair::class.java) + addToWhitelist(Array(0, {}).javaClass, + Notification::class.java, + Notification.Kind::class.java, + ArrayList::class.java, + listOf().javaClass, // EmptyList + Pair::class.java, + ByteArray::class.java, + UUID::class.java, + LinkedHashSet::class.java, + setOf().javaClass, // EmptySet + Currency::class.java, + listOf(Unit).javaClass, // SingletonList + setOf(Unit).javaClass, // SingletonSet + mapOf(Unit to Unit).javaClass, // SingletonSet + NetworkHostAndPort::class.java, + SimpleString::class.java, + KryoException::class.java, + StringBuffer::class.java, + Unit::class.java, + java.io.ByteArrayInputStream::class.java, + java.lang.Class::class.java, + java.math.BigDecimal::class.java, + java.security.KeyPair::class.java, - // Matches the list in TimeSerializers.addDefaultSerializers: - addToWhitelist(java.time.Duration::class.java) - addToWhitelist(java.time.Instant::class.java) - addToWhitelist(java.time.LocalDate::class.java) - addToWhitelist(java.time.LocalDateTime::class.java) - addToWhitelist(java.time.ZoneOffset::class.java) - addToWhitelist(java.time.ZoneId::class.java) - addToWhitelist(java.time.OffsetTime::class.java) - addToWhitelist(java.time.OffsetDateTime::class.java) - addToWhitelist(java.time.ZonedDateTime::class.java) - addToWhitelist(java.time.Year::class.java) - addToWhitelist(java.time.YearMonth::class.java) - addToWhitelist(java.time.MonthDay::class.java) - addToWhitelist(java.time.Period::class.java) - addToWhitelist(java.time.DayOfWeek::class.java) // No custom serialiser but it's an enum. + // Matches the list in TimeSerializers.addDefaultSerializers: + java.time.Duration::class.java, + java.time.Instant::class.java, + java.time.LocalDate::class.java, + java.time.LocalDateTime::class.java, + java.time.ZoneOffset::class.java, + java.time.ZoneId::class.java, + java.time.OffsetTime::class.java, + java.time.OffsetDateTime::class.java, + java.time.ZonedDateTime::class.java, + java.time.Year::class.java, + java.time.YearMonth::class.java, + java.time.MonthDay::class.java, + java.time.Period::class.java, + java.time.DayOfWeek::class.java, // No custom serialiser but it's an enum. - addToWhitelist(java.util.Collections.singletonMap("A", "B").javaClass) - addToWhitelist(java.util.LinkedHashMap::class.java) - addToWhitelist(BigDecimal::class.java) - addToWhitelist(LocalDate::class.java) - addToWhitelist(Period::class.java) - addToWhitelist(BitSet::class.java) - addToWhitelist(OnErrorNotImplementedException::class.java) + java.util.Collections.singletonMap("A", "B").javaClass, + java.util.LinkedHashMap::class.java, + BigDecimal::class.java, + LocalDate::class.java, + Period::class.java, + BitSet::class.java, + OnErrorNotImplementedException::class.java) } return true } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/KryoSerializationCustomization.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/KryoSerializationCustomization.kt index 6b1ab209b8..1ae01e271e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/KryoSerializationCustomization.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/KryoSerializationCustomization.kt @@ -4,7 +4,7 @@ import com.esotericsoftware.kryo.Kryo import net.corda.core.serialization.SerializationCustomization class KryoSerializationCustomization(val kryo: Kryo) : SerializationCustomization { - override fun addToWhitelist(type: Class<*>) { - kryo.addToWhitelist(type) + override fun addToWhitelist(vararg types: Class<*>) { + kryo.addToWhitelist(*types) } } \ No newline at end of file diff --git a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/plugin/SimmPluginRegistry.kt b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/plugin/SimmPluginRegistry.kt index b965550b9a..2cbd235203 100644 --- a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/plugin/SimmPluginRegistry.kt +++ b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/plugin/SimmPluginRegistry.kt @@ -26,18 +26,18 @@ class SimmPluginRegistry : CordaPluginRegistry() { override fun customizeSerialization(custom: SerializationCustomization): Boolean { custom.apply { // OpenGamma classes. - addToWhitelist(MultiCurrencyAmount::class.java) - addToWhitelist(Ordering.natural>().javaClass) - addToWhitelist(CurrencyAmount::class.java) - addToWhitelist(Currency::class.java) - addToWhitelist(InitialMarginTriple::class.java) - addToWhitelist(CordaMarketData::class.java) - addToWhitelist(CurrencyParameterSensitivities::class.java) - addToWhitelist(CurrencyParameterSensitivity::class.java) - addToWhitelist(DoubleArray::class.java) - addToWhitelist(CurveName::class.java) - addToWhitelist(TenorDateParameterMetadata::class.java) - addToWhitelist(Tenor::class.java) + addToWhitelist(MultiCurrencyAmount::class.java, + Ordering.natural>().javaClass, + CurrencyAmount::class.java, + Currency::class.java, + InitialMarginTriple::class.java, + CordaMarketData::class.java, + CurrencyParameterSensitivities::class.java, + CurrencyParameterSensitivity::class.java, + DoubleArray::class.java, + CurveName::class.java, + TenorDateParameterMetadata::class.java, + Tenor::class.java) } return true } From bbebea234d02e0dc2ee38f0d7c81aae9a0422bf3 Mon Sep 17 00:00:00 2001 From: szymonsztuka Date: Thu, 31 Aug 2017 13:42:08 +0100 Subject: [PATCH 030/120] remove reference to repository with JetBrains/Exposed library --- build.gradle | 4 ---- docs/source/example-code/build.gradle | 3 --- experimental/build.gradle | 3 --- tools/explorer/build.gradle | 3 --- tools/explorer/capsule/build.gradle | 3 --- 5 files changed, 16 deletions(-) diff --git a/build.gradle b/build.gradle index 0f96934d8e..5fd2cd863e 100644 --- a/build.gradle +++ b/build.gradle @@ -143,10 +143,6 @@ allprojects { mavenLocal() mavenCentral() jcenter() - // TODO: remove this once we eliminate Exposed - maven { - url 'https://dl.bintray.com/kotlin/exposed' - } maven { url 'https://jitpack.io' } } diff --git a/docs/source/example-code/build.gradle b/docs/source/example-code/build.gradle index 9866eda06e..7b5ee5b8dd 100644 --- a/docs/source/example-code/build.gradle +++ b/docs/source/example-code/build.gradle @@ -10,9 +10,6 @@ repositories { maven { url 'http://oss.sonatype.org/content/repositories/snapshots' } - maven { - url 'https://dl.bintray.com/kotlin/exposed' - } } configurations { diff --git a/experimental/build.gradle b/experimental/build.gradle index 42acd2995d..212b5e7f5b 100644 --- a/experimental/build.gradle +++ b/experimental/build.gradle @@ -10,9 +10,6 @@ repositories { url 'http://oss.sonatype.org/content/repositories/snapshots' } jcenter() - maven { - url 'https://dl.bintray.com/kotlin/exposed' - } } compileKotlin { diff --git a/tools/explorer/build.gradle b/tools/explorer/build.gradle index db26ec9f42..9e05041c1f 100644 --- a/tools/explorer/build.gradle +++ b/tools/explorer/build.gradle @@ -1,8 +1,5 @@ repositories { mavenCentral() - maven { - url 'https://dl.bintray.com/kotlin/exposed' - } } apply plugin: 'java' diff --git a/tools/explorer/capsule/build.gradle b/tools/explorer/capsule/build.gradle index 09a4005c6d..e872daf3b9 100644 --- a/tools/explorer/capsule/build.gradle +++ b/tools/explorer/capsule/build.gradle @@ -12,9 +12,6 @@ repositories { url 'http://oss.sonatype.org/content/repositories/snapshots' } jcenter() - maven { - url 'https://dl.bintray.com/kotlin/exposed' - } } // Force the Caplet to target Java 6. This ensures that running 'java -jar explorer.jar' on any Java 6 VM upwards From b63df0ea390ad2b187959703577c3da72e030fee Mon Sep 17 00:00:00 2001 From: josecoll Date: Thu, 31 Aug 2017 14:01:10 +0100 Subject: [PATCH 031/120] Vault Service API final clean-up (#1348) * Remove notify/notifyAll from public Vault Service API. * 1st pass - remove ContractUpgrade public API calls from VaultService into self contained ContractUpgradeService. * Fix compile error caused by cut'n'paste refactoring. --- ...check_output_at_the_bottom_of_console_.xml | 25 ---------------- .../kotlin/net/corda/core/node/ServiceHub.kt | 1 + .../node/services/ContractUpgradeService.kt | 30 +++++++++++++++++++ .../corda/core/node/services/VaultService.kt | 29 ------------------ .../core/flows/ContractUpgradeFlowTest.kt | 2 +- .../net/corda/node/internal/AbstractNode.kt | 2 ++ .../corda/node/internal/CordaRPCOpsImpl.kt | 4 +-- .../corda/node/services/CoreFlowHandlers.kt | 2 +- .../node/services/api/ServiceHubInternal.kt | 3 +- .../upgrade/ContractUpgradeServiceImpl.kt | 26 ++++++++++++++++ .../node/services/vault/NodeVaultService.kt | 20 +++---------- .../persistence/DBTransactionStorageTests.kt | 2 +- .../persistence/HibernateConfigurationTest.kt | 3 +- .../services/vault/NodeVaultServiceTest.kt | 2 +- .../node/testing/MockServiceHubInternal.kt | 3 ++ .../net/corda/testing/node/MockServices.kt | 4 ++- 16 files changed, 79 insertions(+), 79 deletions(-) delete mode 100644 .idea/runConfigurations/Quasar_exclude_pattern_extraction_from_node_tests__need_not_pass__check_output_at_the_bottom_of_console_.xml create mode 100644 core/src/main/kotlin/net/corda/core/node/services/ContractUpgradeService.kt create mode 100644 node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt diff --git a/.idea/runConfigurations/Quasar_exclude_pattern_extraction_from_node_tests__need_not_pass__check_output_at_the_bottom_of_console_.xml b/.idea/runConfigurations/Quasar_exclude_pattern_extraction_from_node_tests__need_not_pass__check_output_at_the_bottom_of_console_.xml deleted file mode 100644 index 8c8a89624b..0000000000 --- a/.idea/runConfigurations/Quasar_exclude_pattern_extraction_from_node_tests__need_not_pass__check_output_at_the_bottom_of_console_.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/core/src/main/kotlin/net/corda/core/node/ServiceHub.kt b/core/src/main/kotlin/net/corda/core/node/ServiceHub.kt index fb882eb4ad..def8fb0424 100644 --- a/core/src/main/kotlin/net/corda/core/node/ServiceHub.kt +++ b/core/src/main/kotlin/net/corda/core/node/ServiceHub.kt @@ -46,6 +46,7 @@ interface ServiceHub : ServicesForResolution { val vaultService: VaultService val vaultQueryService: VaultQueryService val keyManagementService: KeyManagementService + val contractUpgradeService: ContractUpgradeService /** * A map of hash->tx where tx has been signature/contract validated and the states are known to be correct. diff --git a/core/src/main/kotlin/net/corda/core/node/services/ContractUpgradeService.kt b/core/src/main/kotlin/net/corda/core/node/services/ContractUpgradeService.kt new file mode 100644 index 0000000000..c29702077c --- /dev/null +++ b/core/src/main/kotlin/net/corda/core/node/services/ContractUpgradeService.kt @@ -0,0 +1,30 @@ +package net.corda.core.node.services + +import net.corda.core.contracts.StateAndRef +import net.corda.core.contracts.StateRef +import net.corda.core.contracts.UpgradedContract + +/** + * The [ContractUpgradeService] is responsible for securely upgrading contract state objects according to + * a specified and mutually agreed (amongst participants) contract version. + * See also [ContractUpgradeFlow] to understand the workflow associated with contract upgrades. + */ +interface ContractUpgradeService { + + /** Get contracts we would be willing to upgrade the suggested contract to. */ + fun getAuthorisedContractUpgrade(ref: StateRef): Class>? + + /** + * Authorise a contract state upgrade. + * This will store the upgrade authorisation in the vault, and will be queried by [ContractUpgradeFlow.Acceptor] during contract upgrade process. + * Invoking this method indicate the node is willing to upgrade the [state] using the [upgradedContractClass]. + * This method will NOT initiate the upgrade process. To start the upgrade process, see [ContractUpgradeFlow.Instigator]. + */ + fun authoriseContractUpgrade(stateAndRef: StateAndRef<*>, upgradedContractClass: Class>) + + /** + * Authorise a contract state upgrade. + * This will remove the upgrade authorisation from the vault. + */ + fun deauthoriseContractUpgrade(stateAndRef: StateAndRef<*>) +} diff --git a/core/src/main/kotlin/net/corda/core/node/services/VaultService.kt b/core/src/main/kotlin/net/corda/core/node/services/VaultService.kt index ebd70ae93d..0b7aeb862f 100644 --- a/core/src/main/kotlin/net/corda/core/node/services/VaultService.kt +++ b/core/src/main/kotlin/net/corda/core/node/services/VaultService.kt @@ -173,17 +173,6 @@ interface VaultService { */ val updatesPublisher: PublishSubject> - /** - * Possibly update the vault by marking as spent states that these transactions consume, and adding any relevant - * new states that they create. You should only insert transactions that have been successfully verified here! - * - * TODO: Consider if there's a good way to enforce the must-be-verified requirement in the type system. - */ - fun notifyAll(txns: Iterable) - - /** Same as notifyAll but with a single transaction. */ - fun notify(tx: CoreTransaction) = notifyAll(listOf(tx)) - /** * Provide a [CordaFuture] for when a [StateRef] is consumed, which can be very useful in building tests. */ @@ -191,24 +180,6 @@ interface VaultService { return updates.filter { it.consumed.any { it.ref == ref } }.toFuture() } - /** Get contracts we would be willing to upgrade the suggested contract to. */ - // TODO: We need a better place to put business logic functions - fun getAuthorisedContractUpgrade(ref: StateRef): Class>? - - /** - * Authorise a contract state upgrade. - * This will store the upgrade authorisation in the vault, and will be queried by [ContractUpgradeFlow.Acceptor] during contract upgrade process. - * Invoking this method indicate the node is willing to upgrade the [state] using the [upgradedContractClass]. - * This method will NOT initiate the upgrade process. To start the upgrade process, see [ContractUpgradeFlow.Instigator]. - */ - fun authoriseContractUpgrade(stateAndRef: StateAndRef<*>, upgradedContractClass: Class>) - - /** - * Authorise a contract state upgrade. - * This will remove the upgrade authorisation from the vault. - */ - fun deauthoriseContractUpgrade(stateAndRef: StateAndRef<*>) - /** * Add a note to an existing [LedgerTransaction] given by its unique [SecureHash] id * Multiple notes may be attached to the same [LedgerTransaction]. diff --git a/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt b/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt index 951f28b9e3..a8e93ea575 100644 --- a/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt +++ b/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt @@ -79,7 +79,7 @@ class ContractUpgradeFlowTest { assertFailsWith(UnexpectedFlowEndException::class) { rejectedFuture.getOrThrow() } // Party B authorise the contract state upgrade. - b.services.vaultService.authoriseContractUpgrade(btx!!.tx.outRef(0), DummyContractV2::class.java) + b.services.contractUpgradeService.authoriseContractUpgrade(btx!!.tx.outRef(0), DummyContractV2::class.java) // Party A initiates contract upgrade flow, expected to succeed this time. val resultFuture = a.services.startFlow(ContractUpgradeFlow(atx.tx.outRef(0), DummyContractV2::class.java)).resultFuture diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index c21f7bd800..ec864c606c 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -56,6 +56,7 @@ import net.corda.node.services.statemachine.FlowStateMachineImpl import net.corda.node.services.statemachine.StateMachineManager import net.corda.node.services.statemachine.flowVersionAndInitiatingClass import net.corda.node.services.transactions.* +import net.corda.node.services.upgrade.ContractUpgradeServiceImpl import net.corda.node.services.vault.HibernateVaultQueryImpl import net.corda.node.services.vault.NodeVaultService import net.corda.node.services.vault.VaultSoftLockManager @@ -770,6 +771,7 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, override val schemaService by lazy { NodeSchemaService(pluginRegistries.flatMap { it.requiredSchemas }.toSet()) } override val networkMapCache by lazy { PersistentNetworkMapCache(this) } override val vaultService by lazy { NodeVaultService(this) } + override val contractUpgradeService by lazy { ContractUpgradeServiceImpl() } override val vaultQueryService by lazy { HibernateVaultQueryImpl(database.hibernateConfig, vaultService) } diff --git a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt index e87359f0a6..d4f51ee21f 100644 --- a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt +++ b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt @@ -170,8 +170,8 @@ class CordaRPCOpsImpl( } } - override fun authoriseContractUpgrade(state: StateAndRef<*>, upgradedContractClass: Class>) = services.vaultService.authoriseContractUpgrade(state, upgradedContractClass) - override fun deauthoriseContractUpgrade(state: StateAndRef<*>) = services.vaultService.deauthoriseContractUpgrade(state) + override fun authoriseContractUpgrade(state: StateAndRef<*>, upgradedContractClass: Class>) = services.contractUpgradeService.authoriseContractUpgrade(state, upgradedContractClass) + override fun deauthoriseContractUpgrade(state: StateAndRef<*>) = services.contractUpgradeService.deauthoriseContractUpgrade(state) override fun currentNodeTime(): Instant = Instant.now(services.clock) override fun waitUntilNetworkReady() = services.networkMapCache.nodeReady override fun partyFromAnonymous(party: AbstractParty): Party? = services.identityService.partyFromAnonymous(party) diff --git a/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt b/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt index bbded81fa8..d311ea4fd2 100644 --- a/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt +++ b/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt @@ -58,7 +58,7 @@ class ContractUpgradeHandler(otherSide: Party) : AbstractStateReplacementFlow.Ac val ourSTX = serviceHub.validatedTransactions.getTransaction(proposal.stateRef.txhash) requireNotNull(ourSTX) { "We don't have a copy of the referenced state" } val oldStateAndRef = ourSTX!!.tx.outRef(proposal.stateRef.index) - val authorisedUpgrade = serviceHub.vaultService.getAuthorisedContractUpgrade(oldStateAndRef.ref) ?: + val authorisedUpgrade = serviceHub.contractUpgradeService.getAuthorisedContractUpgrade(oldStateAndRef.ref) ?: throw IllegalStateException("Contract state upgrade is unauthorised. State hash : ${oldStateAndRef.ref}") val proposedTx = stx.tx val expectedTx = ContractUpgradeFlow.assembleBareTx(oldStateAndRef, proposal.modification, proposedTx.privacySalt).toWireTransaction() diff --git a/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt b/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt index 4d2bbfccbf..260e930ce8 100644 --- a/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt +++ b/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt @@ -22,6 +22,7 @@ import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.messaging.MessagingService import net.corda.node.services.statemachine.FlowLogicRefFactoryImpl import net.corda.node.services.statemachine.FlowStateMachineImpl +import net.corda.node.services.vault.NodeVaultService import net.corda.node.utilities.CordaPersistence interface NetworkMapCacheInternal : NetworkMapCache { @@ -100,7 +101,7 @@ interface ServiceHubInternal : PluginServiceHub { if (notifyVault) { val toNotify = recordedTransactions.map { if (it.isNotaryChangeTransaction()) it.notaryChangeTx else it.tx } - vaultService.notifyAll(toNotify) + (vaultService as NodeVaultService).notifyAll(toNotify) } } diff --git a/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt b/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt new file mode 100644 index 0000000000..c93a8d55da --- /dev/null +++ b/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt @@ -0,0 +1,26 @@ +package net.corda.node.services.upgrade + +import net.corda.core.contracts.StateAndRef +import net.corda.core.contracts.StateRef +import net.corda.core.contracts.UpgradedContract +import net.corda.core.node.services.ContractUpgradeService + +class ContractUpgradeServiceImpl : ContractUpgradeService { + + // TODO : Persist this in DB. + private val authorisedUpgrade = mutableMapOf>>() + + override fun getAuthorisedContractUpgrade(ref: StateRef) = authorisedUpgrade[ref] + + override fun authoriseContractUpgrade(stateAndRef: StateAndRef<*>, upgradedContractClass: Class>) { + val upgrade = upgradedContractClass.newInstance() + if (upgrade.legacyContract != stateAndRef.state.data.contract.javaClass) { + throw IllegalArgumentException("The contract state cannot be upgraded using provided UpgradedContract.") + } + authorisedUpgrade.put(stateAndRef.ref, upgradedContractClass) + } + + override fun deauthoriseContractUpgrade(stateAndRef: StateAndRef<*>) { + authorisedUpgrade.remove(stateAndRef.ref) + } +} \ No newline at end of file diff --git a/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt b/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt index 023e87a1f7..9bb3249da8 100644 --- a/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt +++ b/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt @@ -114,7 +114,7 @@ class NodeVaultService(private val services: ServiceHub) : SingletonSerializeAsT * indicate whether an update consists entirely of regular or notary change transactions, which may require * different processing logic. */ - override fun notifyAll(txns: Iterable) { + fun notifyAll(txns: Iterable) { // It'd be easier to just group by type, but then we'd lose ordering. val regularTxns = mutableListOf() val notaryChangeTxns = mutableListOf() @@ -142,6 +142,9 @@ class NodeVaultService(private val services: ServiceHub) : SingletonSerializeAsT if (notaryChangeTxns.isNotEmpty()) notifyNotaryChange(notaryChangeTxns.toList()) } + /** Same as notifyAll but with a single transaction. */ + fun notify(tx: CoreTransaction) = notifyAll(listOf(tx)) + private fun notifyRegular(txns: Iterable) { fun makeUpdate(tx: WireTransaction): Vault.Update { val myKeys = services.keyManagementService.filterMyKeys(tx.outputs.flatMap { it.data.participants.map { it.owningKey } }) @@ -369,22 +372,7 @@ class NodeVaultService(private val services: ServiceHub) : SingletonSerializeAsT return claimedStates } - // TODO : Persists this in DB. - private val authorisedUpgrade = mutableMapOf>>() - override fun getAuthorisedContractUpgrade(ref: StateRef) = authorisedUpgrade[ref] - - override fun authoriseContractUpgrade(stateAndRef: StateAndRef<*>, upgradedContractClass: Class>) { - val upgrade = upgradedContractClass.newInstance() - if (upgrade.legacyContract != stateAndRef.state.data.contract.javaClass) { - throw IllegalArgumentException("The contract state cannot be upgraded using provided UpgradedContract.") - } - authorisedUpgrade.put(stateAndRef.ref, upgradedContractClass) - } - - override fun deauthoriseContractUpgrade(stateAndRef: StateAndRef<*>) { - authorisedUpgrade.remove(stateAndRef.ref) - } @VisibleForTesting internal fun isRelevant(state: ContractState, myKeys: Set): Boolean { diff --git a/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt b/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt index fa40b2dc05..6fbbf5e534 100644 --- a/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/persistence/DBTransactionStorageTests.kt @@ -64,7 +64,7 @@ class DBTransactionStorageTests : TestDependencyInjectionBase() { validatedTransactions.addTransaction(stx) } // Refactored to use notifyAll() as we have no other unit test for that method with multiple transactions. - vaultService.notifyAll(txs.map { it.tx }) + (vaultService as NodeVaultService).notifyAll(txs.map { it.tx }) } } } diff --git a/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt b/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt index fcf843e776..f1fd90b136 100644 --- a/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt @@ -25,6 +25,7 @@ import net.corda.finance.schemas.SampleCashSchemaV3 import net.corda.finance.utils.sumCash import net.corda.node.services.schema.HibernateObserver import net.corda.node.services.schema.NodeSchemaService +import net.corda.node.services.vault.NodeVaultService import net.corda.node.services.vault.VaultSchemaV1 import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase @@ -88,7 +89,7 @@ class HibernateConfigurationTest : TestDependencyInjectionBase() { validatedTransactions.addTransaction(stx) } // Refactored to use notifyAll() as we have no other unit test for that method with multiple transactions. - vaultService.notifyAll(txs.map { it.tx }) + (vaultService as NodeVaultService).notifyAll(txs.map { it.tx }) } override fun jdbcSession() = database.createSession() } diff --git a/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt b/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt index cc839addf4..cdf6d06fc5 100644 --- a/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/vault/NodeVaultServiceTest.kt @@ -96,7 +96,7 @@ class NodeVaultServiceTest : TestDependencyInjectionBase() { val originalVault = vaultSvc val originalVaultQuery = vaultQuery val services2 = object : MockServices() { - override val vaultService: VaultService get() = originalVault + override val vaultService: NodeVaultService get() = originalVault as NodeVaultService override fun recordTransactions(notifyVault: Boolean, txs: Iterable) { for (stx in txs) { validatedTransactions.addTransaction(stx) diff --git a/test-utils/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt b/test-utils/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt index ff70a21606..d8ce9c23f7 100644 --- a/test-utils/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt +++ b/test-utils/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt @@ -42,6 +42,7 @@ open class MockServiceHubInternal( val scheduler: SchedulerService? = null, val overrideClock: Clock? = NodeClock(), val schemas: SchemaService? = NodeSchemaService(), + val customContractUpgradeService: ContractUpgradeService? = null, val customTransactionVerifierService: TransactionVerifierService? = InMemoryTransactionVerifierService(2) ) : ServiceHubInternal { override val vaultQueryService: VaultQueryService @@ -50,6 +51,8 @@ open class MockServiceHubInternal( get() = customTransactionVerifierService ?: throw UnsupportedOperationException() override val vaultService: VaultService get() = customVault ?: throw UnsupportedOperationException() + override val contractUpgradeService: ContractUpgradeService + get() = customContractUpgradeService ?: throw UnsupportedOperationException() override val keyManagementService: KeyManagementService get() = keyManagement ?: throw UnsupportedOperationException() override val identityService: IdentityService diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt index ab496c749a..3f0bdc17f5 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt @@ -26,6 +26,7 @@ import net.corda.node.services.persistence.InMemoryStateMachineRecordedTransacti import net.corda.node.services.schema.HibernateObserver import net.corda.node.services.schema.NodeSchemaService import net.corda.node.services.transactions.InMemoryTransactionVerifierService +import net.corda.node.services.upgrade.ContractUpgradeServiceImpl import net.corda.node.services.vault.HibernateVaultQueryImpl import net.corda.node.services.vault.NodeVaultService import net.corda.node.utilities.CordaPersistence @@ -123,7 +124,7 @@ open class MockServices(vararg val keys: KeyPair) : ServiceHub { validatedTransactions.addTransaction(stx) } // Refactored to use notifyAll() as we have no other unit test for that method with multiple transactions. - vaultService.notifyAll(txs.map { it.tx }) + (vaultService as NodeVaultService).notifyAll(txs.map { it.tx }) } override val vaultQueryService: VaultQueryService = HibernateVaultQueryImpl(database.hibernateConfig, vaultService) @@ -155,6 +156,7 @@ open class MockServices(vararg val keys: KeyPair) : ServiceHub { override val keyManagementService: KeyManagementService = MockKeyManagementService(identityService, *keys) override val vaultService: VaultService get() = throw UnsupportedOperationException() + override val contractUpgradeService: ContractUpgradeService = ContractUpgradeServiceImpl() override val vaultQueryService: VaultQueryService get() = throw UnsupportedOperationException() override val networkMapCache: NetworkMapCache get() = throw UnsupportedOperationException() override val clock: Clock get() = Clock.systemUTC() From 1139c1abf5670b98221f7dfa4a6f060fe59c2f76 Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Wed, 30 Aug 2017 15:48:36 +0200 Subject: [PATCH 032/120] Throw a diagnostic exception if your FlowLogic.call method is not marked as @Suspendable. This catches a bunch of unit tests where it's missing and also resolves an issue I saw Roger hit the other day. --- .../services/events/NodeSchedulerService.kt | 18 ++++++++++++------ .../statemachine/StateMachineManager.kt | 15 +++++++++++++++ .../events/NodeSchedulerServiceTest.kt | 2 ++ .../statemachine/FlowFrameworkTests.kt | 1 + .../corda/irs/flows/UpdateBusinessDayFlow.kt | 1 + 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt b/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt index e7d9ac38ef..1d0b5e3d54 100644 --- a/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt +++ b/node/src/main/kotlin/net/corda/node/services/events/NodeSchedulerService.kt @@ -235,14 +235,20 @@ class NodeSchedulerService(private val services: ServiceHubInternal, private fun onTimeReached(scheduledState: ScheduledStateRef) { serverThread.execute { - services.database.transaction { - val scheduledFlow = getScheduledFlow(scheduledState) - if (scheduledFlow != null) { - val future = services.startFlow(scheduledFlow, FlowInitiator.Scheduled(scheduledState)).resultFuture - future.then { - unfinishedSchedules.countDown() + var flowName: String? = "(unknown)" + try { + services.database.transaction { + val scheduledFlow = getScheduledFlow(scheduledState) + if (scheduledFlow != null) { + flowName = scheduledFlow.javaClass.name + val future = services.startFlow(scheduledFlow, FlowInitiator.Scheduled(scheduledState)).resultFuture + future.then { + unfinishedSchedules.countDown() + } } } + } catch (e: Exception) { + log.error("Failed to start scheduled flow $flowName for $scheduledState due to an internal error", e) } } } diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManager.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManager.kt index a20c6aaca3..f9d561a43e 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManager.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManager.kt @@ -2,6 +2,7 @@ package net.corda.node.services.statemachine import co.paralleluniverse.fibers.Fiber import co.paralleluniverse.fibers.FiberExecutorScheduler +import co.paralleluniverse.fibers.Suspendable import co.paralleluniverse.fibers.instrument.SuspendableHelper import co.paralleluniverse.strands.Strand import com.codahale.metrics.Gauge @@ -427,6 +428,7 @@ class StateMachineManager(val serviceHub: ServiceHubInternal, } private fun initFiber(fiber: FlowStateMachineImpl<*>) { + verifyFlowLogicIsSuspendable(fiber.logic) fiber.database = database fiber.serviceHub = serviceHub fiber.actionOnSuspend = { ioRequest -> @@ -458,6 +460,19 @@ class StateMachineManager(val serviceHub: ServiceHubInternal, } } + private fun verifyFlowLogicIsSuspendable(logic: FlowLogic) { + // Quasar requires (in Java 8) that at least the call method be annotated suspendable. Unfortunately, it's + // easy to forget to add this when creating a new flow, so we check here to give the user a better error. + // + // The Kotlin compiler can sometimes generate a synthetic bridge method from a single call declaration, which + // forwards to the void method and then returns Unit. However annotations do not get copied across to this + // bridge, so we have to do a more complex scan here. + val call = logic.javaClass.methods.first { !it.isSynthetic && it.name == "call" && it.parameterCount == 0 } + if (call.getAnnotation(Suspendable::class.java) == null) { + throw FlowException("${logic.javaClass.name}.call() is not annotated as @Suspendable. Please fix this.") + } + } + private fun endAllFiberSessions(fiber: FlowStateMachineImpl<*>, result: Try<*>, propagated: Boolean) { openSessions.values.removeIf { session -> if (session.fiber == fiber) { diff --git a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt index c8bdfb9287..144c7a76d4 100644 --- a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt @@ -1,5 +1,6 @@ package net.corda.node.services.events +import co.paralleluniverse.fibers.Suspendable import net.corda.core.contracts.* import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowLogicRef @@ -136,6 +137,7 @@ class NodeSchedulerServiceTest : SingletonSerializeAsToken() { } class TestFlowLogic(val increment: Int = 1) : FlowLogic() { + @Suspendable override fun call() { (serviceHub as TestReference).testReference.calls += increment (serviceHub as TestReference).testReference.countDown.countDown() diff --git a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt index a5084a5f42..44190ca538 100644 --- a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt @@ -913,6 +913,7 @@ class FlowFrameworkTests { override val progressTracker: ProgressTracker = ProgressTracker(START_STEP) lateinit var exceptionThrown: E + @Suspendable override fun call(): Nothing { progressTracker.currentStep = START_STEP exceptionThrown = exception() diff --git a/samples/irs-demo/src/test/kotlin/net/corda/irs/flows/UpdateBusinessDayFlow.kt b/samples/irs-demo/src/test/kotlin/net/corda/irs/flows/UpdateBusinessDayFlow.kt index d15c86bcec..03195cc5e6 100644 --- a/samples/irs-demo/src/test/kotlin/net/corda/irs/flows/UpdateBusinessDayFlow.kt +++ b/samples/irs-demo/src/test/kotlin/net/corda/irs/flows/UpdateBusinessDayFlow.kt @@ -23,6 +23,7 @@ object UpdateBusinessDayFlow { @InitiatedBy(Broadcast::class) private class UpdateBusinessDayHandler(val otherParty: Party) : FlowLogic() { + @Suspendable override fun call() { val message = receive(otherParty).unwrap { it } (serviceHub.clock as TestClock).updateDate(message.date) From 03ddaaac119f5f880b8ed6b4b8b1a3bc0a99e4c0 Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Thu, 31 Aug 2017 14:40:32 +0100 Subject: [PATCH 033/120] Remove the copy of Guava from within the finance module. (#1362) --- experimental/build.gradle | 2 ++ finance/build.gradle | 2 -- .../contracts/JavaCommercialPaper.java | 22 +++++++++++++------ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/experimental/build.gradle b/experimental/build.gradle index 212b5e7f5b..2c9257d2d6 100644 --- a/experimental/build.gradle +++ b/experimental/build.gradle @@ -26,6 +26,8 @@ dependencies { // ObjectWeb Asm: a library for synthesising and working with JVM bytecode. compile "org.ow2.asm:asm:5.0.4" + compile "com.google.guava:guava:$guava_version" + testCompile "junit:junit:$junit_version" testCompile project(':test-utils') } diff --git a/finance/build.gradle b/finance/build.gradle index f4d43eeff7..e67a674738 100644 --- a/finance/build.gradle +++ b/finance/build.gradle @@ -15,8 +15,6 @@ dependencies { // and CorDapps using :finance features should use 'cordapp' not 'compile' linkage. cordaCompile project(':core') - compile "com.google.guava:guava:$guava_version" - testCompile project(':test-utils') testCompile project(path: ':core', configuration: 'testArtifacts') testCompile "junit:junit:$junit_version" diff --git a/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java b/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java index 2182999e56..adbf96754c 100644 --- a/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java +++ b/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java @@ -1,8 +1,6 @@ package net.corda.finance.contracts; import co.paralleluniverse.fibers.Suspendable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import kotlin.Unit; import net.corda.core.contracts.*; import net.corda.core.crypto.testing.NullPublicKey; @@ -20,6 +18,7 @@ import org.jetbrains.annotations.Nullable; import java.time.Instant; import java.util.Collections; import java.util.Currency; +import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; @@ -128,7 +127,7 @@ public class JavaCommercialPaper implements Contract { @NotNull @Override public List getParticipants() { - return ImmutableList.of(this.owner); + return Collections.singletonList(this.owner); } } @@ -175,7 +174,7 @@ public class JavaCommercialPaper implements Contract { final List> commands = tx.getCommands().stream().filter( it -> it.getValue() instanceof Commands ).collect(Collectors.toList()); - final AuthenticatedObject command = Iterables.getOnlyElement(commands); + final AuthenticatedObject command = onlyElementOf(commands); final TimeWindow timeWindow = tx.getTimeWindow(); for (final LedgerTransaction.InOutGroup group : groups) { @@ -184,7 +183,7 @@ public class JavaCommercialPaper implements Contract { if (command.getValue() instanceof Commands.Move) { final AuthenticatedObject cmd = requireSingleCommand(tx.getCommands(), Commands.Move.class); // There should be only a single input due to aggregation above - final State input = Iterables.getOnlyElement(inputs); + final State input = onlyElementOf(inputs); if (!cmd.getSigners().contains(input.getOwner().getOwningKey())) throw new IllegalStateException("Failed requirement: the transaction is signed by the owner of the CP"); @@ -197,7 +196,7 @@ public class JavaCommercialPaper implements Contract { final AuthenticatedObject cmd = requireSingleCommand(tx.getCommands(), Commands.Redeem.class); // There should be only a single input due to aggregation above - final State input = Iterables.getOnlyElement(inputs); + final State input = onlyElementOf(inputs); if (!cmd.getSigners().contains(input.getOwner().getOwningKey())) throw new IllegalStateException("Failed requirement: the transaction is signed by the owner of the CP"); @@ -218,7 +217,7 @@ public class JavaCommercialPaper implements Contract { }); } else if (command.getValue() instanceof Commands.Issue) { final AuthenticatedObject cmd = requireSingleCommand(tx.getCommands(), Commands.Issue.class); - final State output = Iterables.getOnlyElement(outputs); + final State output = onlyElementOf(outputs); final Instant time = null == timeWindow ? null : timeWindow.getUntilTime(); @@ -257,4 +256,13 @@ public class JavaCommercialPaper implements Contract { tx.addOutputState(new TransactionState<>(new State(paper.getState().getData().getIssuance(), newOwner, paper.getState().getData().getFaceValue(), paper.getState().getData().getMaturityDate()), paper.getState().getNotary(), paper.getState().getEncumbrance())); tx.addCommand(new Command<>(new Commands.Move(), paper.getState().getData().getOwner().getOwningKey())); } + + private static T onlyElementOf(Iterable iterable) { + Iterator iter = iterable.iterator(); + T item = iter.next(); + if (iter.hasNext()) { + throw new IllegalArgumentException("Iterable has more than one element!"); + } + return item; + } } From 4e9b367d984db91d0d515d1f839fc3d042c083db Mon Sep 17 00:00:00 2001 From: Matthew Nesbit Date: Thu, 31 Aug 2017 15:40:56 +0100 Subject: [PATCH 034/120] Notary demo broken, due to incorrect usage of soft-locking, plus general API movement. Reverted to a simple custom state version. --- .../notarydemo/flows/DummyIssueAndMove.kt | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/flows/DummyIssueAndMove.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/flows/DummyIssueAndMove.kt index dd7731e872..82e62ba997 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/flows/DummyIssueAndMove.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/flows/DummyIssueAndMove.kt @@ -1,10 +1,9 @@ package net.corda.notarydemo.flows import co.paralleluniverse.fibers.Suspendable -import net.corda.core.contracts.Amount +import net.corda.core.contracts.CommandData import net.corda.core.contracts.Contract import net.corda.core.contracts.ContractState -import net.corda.core.contracts.Issued import net.corda.core.flows.FlowLogic import net.corda.core.flows.StartableByRPC import net.corda.core.identity.AbstractParty @@ -12,8 +11,6 @@ import net.corda.core.identity.Party import net.corda.core.transactions.LedgerTransaction import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder -import net.corda.finance.GBP -import net.corda.finance.contracts.asset.Cash @StartableByRPC class DummyIssueAndMove(private val notary: Party, private val counterpartyNode: Party, private val discriminator: Int) : FlowLogic() { @@ -21,23 +18,27 @@ class DummyIssueAndMove(private val notary: Party, private val counterpartyNode: override fun verify(tx: LedgerTransaction) {} } + data class DummyCommand(val dummy: Int = 0): CommandData + data class State(override val participants: List, private val discriminator: Int) : ContractState { override val contract = DoNothingContract } @Suspendable - override fun call() = serviceHub.run { + override fun call(): SignedTransaction { // Self issue an asset - val amount = Amount(1000000, Issued(myInfo.legalIdentity.ref(0), GBP)) - val issueTxBuilder = TransactionBuilder(notary = notary) - val signers = Cash().generateIssue(issueTxBuilder, amount, serviceHub.myInfo.legalIdentity, notary) - val issueTx = serviceHub.signInitialTransaction(issueTxBuilder, signers) + val state = State(listOf(serviceHub.myInfo.legalIdentity), discriminator) + val issueTx = serviceHub.signInitialTransaction(TransactionBuilder(notary).apply { + addOutputState(state) + addCommand(DummyCommand(),listOf(serviceHub.myInfo.legalIdentity.owningKey)) + }) serviceHub.recordTransactions(issueTx) // Move ownership of the asset to the counterparty - val moveTxBuilder = TransactionBuilder(notary = notary) - - val (_, keys) = Cash.generateSpend(serviceHub, moveTxBuilder, Amount(amount.quantity, GBP), counterpartyNode) // We don't check signatures because we know that the notary's signature is missing - signInitialTransaction(moveTxBuilder, keys) + return serviceHub.signInitialTransaction(TransactionBuilder(notary).apply { + addInputState(issueTx.tx.outRef(0)) + addOutputState(state.copy(participants = listOf(counterpartyNode))) + addCommand(DummyCommand(),listOf(serviceHub.myInfo.legalIdentity.owningKey)) + }) } } From d485441c27246a188cc0f888ab376a72783cbfc7 Mon Sep 17 00:00:00 2001 From: Joel Dudley Date: Thu, 31 Aug 2017 15:57:18 +0100 Subject: [PATCH 035/120] Adds JVMStatic annotation to getServiceType. --- core/src/main/kotlin/net/corda/core/node/services/ServiceType.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/kotlin/net/corda/core/node/services/ServiceType.kt b/core/src/main/kotlin/net/corda/core/node/services/ServiceType.kt index 80111a3cdb..97d2888e88 100644 --- a/core/src/main/kotlin/net/corda/core/node/services/ServiceType.kt +++ b/core/src/main/kotlin/net/corda/core/node/services/ServiceType.kt @@ -30,6 +30,7 @@ class ServiceType private constructor(val id: String) { val regulator: ServiceType = corda.getSubType("regulator") val networkMap: ServiceType = corda.getSubType("network_map") + @JvmStatic fun getServiceType(namespace: String, typeId: String): ServiceType { require(!namespace.startsWith("corda")) { "Corda namespace is protected" } return baseWithSubType(namespace, typeId) From e1943e2b519a7a7ed7d94eb6dbaffba59e2cc06e Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Thu, 31 Aug 2017 16:55:40 +0100 Subject: [PATCH 036/120] Move ContentSignerBuilder into net.corda.node.utilities Move `ContentSignerBuilder` into `net.corda.node.utilities` so it's not part of the API visible to CorDapp developers, when it's only needed inside the node itself. --- node/src/main/kotlin/net/corda/node/services/keys/KMSUtils.kt | 2 +- .../kotlin/net/corda/node/utilities}/ContentSignerBuilder.kt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) rename {core/src/main/kotlin/net/corda/core/crypto => node/src/main/kotlin/net/corda/node/utilities}/ContentSignerBuilder.kt (95%) diff --git a/node/src/main/kotlin/net/corda/node/services/keys/KMSUtils.kt b/node/src/main/kotlin/net/corda/node/services/keys/KMSUtils.kt index 36a2c4f34d..367f79eb3e 100644 --- a/node/src/main/kotlin/net/corda/node/services/keys/KMSUtils.kt +++ b/node/src/main/kotlin/net/corda/node/services/keys/KMSUtils.kt @@ -1,12 +1,12 @@ package net.corda.node.services.keys -import net.corda.core.crypto.ContentSignerBuilder import net.corda.core.crypto.Crypto import net.corda.core.crypto.cert import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.services.IdentityService import net.corda.core.utilities.days import net.corda.node.utilities.CertificateType +import net.corda.node.utilities.ContentSignerBuilder import net.corda.node.utilities.X509Utilities import org.bouncycastle.operator.ContentSigner import java.security.KeyPair diff --git a/core/src/main/kotlin/net/corda/core/crypto/ContentSignerBuilder.kt b/node/src/main/kotlin/net/corda/node/utilities/ContentSignerBuilder.kt similarity index 95% rename from core/src/main/kotlin/net/corda/core/crypto/ContentSignerBuilder.kt rename to node/src/main/kotlin/net/corda/node/utilities/ContentSignerBuilder.kt index 8a62f308c4..f2a365bf89 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/ContentSignerBuilder.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/ContentSignerBuilder.kt @@ -1,5 +1,6 @@ -package net.corda.core.crypto +package net.corda.node.utilities +import net.corda.core.crypto.SignatureScheme import org.bouncycastle.asn1.x509.AlgorithmIdentifier import org.bouncycastle.operator.ContentSigner import java.io.OutputStream From 8d29c78073ff72bedc5aaa3c54cebd2ebb867290 Mon Sep 17 00:00:00 2001 From: Konstantinos Chalkias Date: Thu, 31 Aug 2017 16:56:24 +0100 Subject: [PATCH 037/120] changelog additions, mainly for crypto and finance related tasks --- docs/source/changelog.rst | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 7b9c8cbb72..1710075431 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -70,6 +70,44 @@ UNRELEASED * Removed the concept of relevancy from ``LinearState``. The ``ContractState``'s relevancy to the vault can be determined by the flow context, the vault will process any transaction from a flow which is not derived from transaction resolution verification. +* Removed the tolerance attribute from ``TimeWindowChecker`` and thus, there is no extra tolerance on the notary side anymore. + +* The ``FungibleAsset`` interface has been made simpler. The ``Commands`` grouping interface + that included the ``Move``, ``Issue`` and ``Exit`` interfaces have all been removed, while the ``move`` function has + been renamed to ``withNewOwnerAndAmount`` to be consistent with the ``withNewOwner`` function of the ``OwnableState``. + +* The ``IssueCommand`` interface has been removed from ``Structures``, because, due to the introduction of nonces per + transaction component, the issue command does not need a nonce anymore and it does not require any other attributes. + +* As a consequence of the above and the simpler ``FungibleAsset`` format, fungible assets like ``Cash`` now use + ``class Issue : TypeOnlyCommandData()``, because it's only its presence (``Issue``) that matters. + +* A new `PrivacySalt` transaction component is introduced, which is now an attribute in ``TraversableTransaction`` and + inherently in ``WireTransaction``. + +* A new ``nonces: List`` feature has been added to ``FilteredLeaves``. + +* Due to the ``nonces`` and ``PrivacySalt`` introduction, new functions have been added to ``MerkleTransaction``: + ``fun serializedHash(x: T, privacySalt: PrivacySalt?, index: Int): SecureHash`` + ``fun serializedHash(x: T, nonce: SecureHash): SecureHash`` + ``fun computeNonce(privacySalt: PrivacySalt, index: Int)``. + +* A new ``SignatureMetadata`` data class is introduced with two attributes, ``platformVersion: Int`` and + ``schemeNumberID: Int`` (the signature scheme used). + +* As part of the metadata support in signatures, a new ``data class SignableData(val txId: SecureHash, val signatureMetadata: SignatureMetadata)`` + is introduced, which represents the object actually signed. + +* The unused ``MetaData`` and ``SignatureType`` in ``crypto`` package have been removed. + +* The ``class TransactionSignature(bytes: ByteArray, val by: PublicKey, val signatureMetadata: SignatureMetadata): DigitalSignature(bytes)`` + class is now utilised Vs the old ``DigitalSignature.WithKey`` for Corda transaction signatures. Practically, it takes + the ``signatureMetadata`` as an extra input, in order to support signing both the transaction and the extra metadata. + +* To reflect changes in the signing process, the ``Crypto`` object is now equipped with the: + ``fun doSign(keyPair: KeyPair, signableData: SignableData): TransactionSignature`` and + ``fun doVerify(txId: SecureHash, transactionSignature: TransactionSignature): Boolean`` functions. + * ``SerializationCustomization.addToWhitelist()` now accepts multiple classes via varargs. Milestone 14 From 574c476709de22d5bc46bb14f831e73ac8b44bae Mon Sep 17 00:00:00 2001 From: Joel Dudley Date: Thu, 31 Aug 2017 17:11:44 +0100 Subject: [PATCH 038/120] Moves filterFun and indexOffsets into MerkleTransaction. --- .../core/transactions/MerkleTransaction.kt | 65 ++++++++++++++++++- .../core/transactions/WireTransaction.kt | 63 ------------------ 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt index 38b418e877..7c781a8097 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt @@ -159,11 +159,74 @@ class FilteredTransaction private constructor( fun buildMerkleTransaction(wtx: WireTransaction, filtering: Predicate ): FilteredTransaction { - val filteredLeaves = wtx.filterWithFun(filtering) + val filteredLeaves = filterWithFun(wtx, filtering) val merkleTree = wtx.merkleTree val pmt = PartialMerkleTree.build(merkleTree, filteredLeaves.availableComponentHashes) return FilteredTransaction(merkleTree.hash, filteredLeaves, pmt) } + + /** + * Construction of partial transaction from WireTransaction based on filtering. + * Note that list of nonces to be sent is updated on the fly, based on the index of the filtered tx component. + * @param filtering filtering over the whole WireTransaction + * @returns FilteredLeaves used in PartialMerkleTree calculation and verification. + */ + private fun filterWithFun(wtx: WireTransaction, filtering: Predicate): FilteredLeaves { + val nonces: MutableList = mutableListOf() + val offsets = indexOffsets(wtx) + fun notNullFalseAndNoncesUpdate(elem: Any?, index: Int): Any? { + return if (elem == null || !filtering.test(elem)) { + null + } else { + nonces.add(computeNonce(wtx.privacySalt, index)) + elem + } + } + + fun filterAndNoncesUpdate(t: T, index: Int): Boolean { + return if (filtering.test(t)) { + nonces.add(computeNonce(wtx.privacySalt, index)) + true + } else { + false + } + } + + // TODO: We should have a warning (require) if all leaves (excluding salt) are visible after filtering. + // Consider the above after refactoring FilteredTransaction to implement TraversableTransaction, + // so that a WireTransaction can be used when required to send a full tx (e.g. RatesFixFlow in Oracles). + return FilteredLeaves( + wtx.inputs.filterIndexed { index, it -> filterAndNoncesUpdate(it, index) }, + wtx.attachments.filterIndexed { index, it -> filterAndNoncesUpdate(it, index + offsets[0]) }, + wtx.outputs.filterIndexed { index, it -> filterAndNoncesUpdate(it, index + offsets[1]) }, + wtx.commands.filterIndexed { index, it -> filterAndNoncesUpdate(it, index + offsets[2]) }, + notNullFalseAndNoncesUpdate(wtx.notary, offsets[3]) as Party?, + notNullFalseAndNoncesUpdate(wtx.timeWindow, offsets[4]) as TimeWindow?, + nonces + ) + } + + // We use index offsets, to get the actual leaf-index per transaction component required for nonce computation. + private fun indexOffsets(wtx: WireTransaction): List { + // There is no need to add an index offset for inputs, because they are the first components in the + // transaction format and it is always zero. Thus, offsets[0] corresponds to attachments, + // offsets[1] to outputs, offsets[2] to commands and so on. + val offsets = mutableListOf(wtx.inputs.size, wtx.inputs.size + wtx.attachments.size) + offsets.add(offsets.last() + wtx.outputs.size) + offsets.add(offsets.last() + wtx.commands.size) + if (wtx.notary != null) { + offsets.add(offsets.last() + 1) + } else { + offsets.add(offsets.last()) + } + if (wtx.timeWindow != null) { + offsets.add(offsets.last() + 1) + } else { + offsets.add(offsets.last()) + } + // No need to add offset for privacySalt as it doesn't require a nonce. + return offsets + } } /** diff --git a/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt index 7d2e382f2d..62877b4b30 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt @@ -106,69 +106,6 @@ data class WireTransaction( */ val merkleTree: MerkleTree by lazy { MerkleTree.getMerkleTree(availableComponentHashes) } - /** - * Construction of partial transaction from WireTransaction based on filtering. - * Note that list of nonces to be sent is updated on the fly, based on the index of the filtered tx component. - * @param filtering filtering over the whole WireTransaction - * @returns FilteredLeaves used in PartialMerkleTree calculation and verification. - */ - fun filterWithFun(filtering: Predicate): FilteredLeaves { - val nonces: MutableList = mutableListOf() - val offsets = indexOffsets() - fun notNullFalseAndNoncesUpdate(elem: Any?, index: Int): Any? { - return if (elem == null || !filtering.test(elem)) { - null - } else { - nonces.add(computeNonce(privacySalt, index)) - elem - } - } - - fun filterAndNoncesUpdate(t: T, index: Int): Boolean { - return if (filtering.test(t)) { - nonces.add(computeNonce(privacySalt, index)) - true - } else { - false - } - } - - // TODO: We should have a warning (require) if all leaves (excluding salt) are visible after filtering. - // Consider the above after refactoring FilteredTransaction to implement TraversableTransaction, - // so that a WireTransaction can be used when required to send a full tx (e.g. RatesFixFlow in Oracles). - return FilteredLeaves( - inputs.filterIndexed { index, it -> filterAndNoncesUpdate(it, index) }, - attachments.filterIndexed { index, it -> filterAndNoncesUpdate(it, index + offsets[0]) }, - outputs.filterIndexed { index, it -> filterAndNoncesUpdate(it, index + offsets[1]) }, - commands.filterIndexed { index, it -> filterAndNoncesUpdate(it, index + offsets[2]) }, - notNullFalseAndNoncesUpdate(notary, offsets[3]) as Party?, - notNullFalseAndNoncesUpdate(timeWindow, offsets[4]) as TimeWindow?, - nonces - ) - } - - // We use index offsets, to get the actual leaf-index per transaction component required for nonce computation. - private fun indexOffsets(): List { - // There is no need to add an index offset for inputs, because they are the first components in the - // transaction format and it is always zero. Thus, offsets[0] corresponds to attachments, - // offsets[1] to outputs, offsets[2] to commands and so on. - val offsets = mutableListOf(inputs.size, inputs.size + attachments.size) - offsets.add(offsets.last() + outputs.size) - offsets.add(offsets.last() + commands.size) - if (notary != null) { - offsets.add(offsets.last() + 1) - } else { - offsets.add(offsets.last()) - } - if (timeWindow != null) { - offsets.add(offsets.last() + 1) - } else { - offsets.add(offsets.last()) - } - // No need to add offset for privacySalt as it doesn't require a nonce. - return offsets - } - /** * Checks that the given signature matches one of the commands and that it is a correct signature over the tx. * From b1df11acfabbc2b81408c1e0567ae471fd6c2cef Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Thu, 31 Aug 2017 17:29:58 +0100 Subject: [PATCH 039/120] Rewrite ExchangeRate to use BigDecimal Rewrite ExchangeRate to use BigDecimal for the quantity multiplication, to ensure that there is no loss of precision during the conversion process. The previous version using double-precision floating point maths inherently means that the precision is not fixed, but is floating. Change ExchangeRate to an abstract class rather than an interface, so the functions on it can be implemented directly rather than being extension functions, to improve Java compatibility. --- .../client/jfx/model/ExchangeRateModel.kt | 33 +++++++++++-------- .../corda/client/jfx/utils/AmountBindings.kt | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/ExchangeRateModel.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/ExchangeRateModel.kt index 243d87843e..636603d1ab 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/ExchangeRateModel.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/ExchangeRateModel.kt @@ -3,25 +3,30 @@ package net.corda.client.jfx.model import javafx.beans.property.SimpleObjectProperty import javafx.beans.value.ObservableValue import net.corda.core.contracts.Amount +import java.math.BigDecimal +import java.math.RoundingMode import java.util.* - -interface ExchangeRate { - fun rate(from: Currency, to: Currency): Double -} - -fun ExchangeRate.exchangeAmount(amount: Amount, to: Currency) = - Amount(exchangeDouble(amount, to).toLong(), to) - -fun ExchangeRate.exchangeDouble(amount: Amount, to: Currency) = - rate(amount.token, to) * amount.quantity - /** * This model provides an exchange rate from arbitrary currency to arbitrary currency. - * TODO hook up an actual oracle */ +abstract class ExchangeRate { + /** + * Convert the given amount of a currency into the target currency. + * + * @return the original amount converted to an amount in the target currency. + */ + fun exchangeAmount(amount: Amount, to: Currency) = Amount.fromDecimal(amount.toDecimal().multiply(rate(amount.token, to)), to) + + abstract fun rate(from: Currency, to: Currency): BigDecimal +} + +/** + * Default implementation of an exchange rate model, which uses a fixed exchange rate. + */ +// TODO hook up an actual oracle class ExchangeRateModel { - val exchangeRate: ObservableValue = SimpleObjectProperty(object : ExchangeRate { - override fun rate(from: Currency, to: Currency) = 1.0 + val exchangeRate: ObservableValue = SimpleObjectProperty(object : ExchangeRate() { + override fun rate(from: Currency, to: Currency) = BigDecimal.ONE }) } diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AmountBindings.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AmountBindings.kt index 26387c1663..49e76e227a 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AmountBindings.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/utils/AmountBindings.kt @@ -29,7 +29,7 @@ object AmountBindings { return EasyBind.combine(observableCurrency, observableExchangeRate) { currency, exchangeRate -> Pair) -> Long>( currency, - { (quantity, _, token) -> (exchangeRate.rate(token, currency) * quantity).toLong() } + { amount -> exchangeRate.exchangeAmount(amount, currency).quantity } ) } } From 9a8e7294e7c49029d4fe9d9c1a0c958a57655696 Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Thu, 31 Aug 2017 18:15:56 +0100 Subject: [PATCH 040/120] =?UTF-8?q?Fix=20AMQP=20object=20graph=20alignment?= =?UTF-8?q?=20bug=20and=20an=20issue=20with=20private=20constru=E2=80=A6?= =?UTF-8?q?=20(#1376)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix AMQP object graph alignment bug and an issue with private constructors. --- .../amqp/DeserializationInput.kt | 10 +++-- .../serialization/amqp/ObjectSerializer.kt | 2 +- .../serialization/amqp/SerializationOutput.kt | 4 +- .../amqp/SerializationOutputTests.kt | 44 ++++++++++++++++++- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt index 5c7c2d7cec..12d71a0f17 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt @@ -3,7 +3,10 @@ package net.corda.nodeapi.internal.serialization.amqp import net.corda.core.internal.getStackTraceAsString import net.corda.core.serialization.SerializedBytes import net.corda.core.utilities.ByteSequence -import org.apache.qpid.proton.amqp.* +import org.apache.qpid.proton.amqp.Binary +import org.apache.qpid.proton.amqp.DescribedType +import org.apache.qpid.proton.amqp.UnsignedByte +import org.apache.qpid.proton.amqp.UnsignedInteger import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException import java.lang.reflect.ParameterizedType @@ -120,7 +123,7 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { "is outside of the bounds for the list of size: ${objectHistory.size}") val objectRetrieved = objectHistory[objectIndex] - if (!objectRetrieved::class.java.isSubClassOf(type)) + if (!objectRetrieved::class.java.isSubClassOf(type.asClass()!!)) throw NotSerializableException("Existing reference type mismatch. Expected: '$type', found: '${objectRetrieved::class.java}'") objectRetrieved } @@ -138,7 +141,8 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { else -> obj // this will be the case for primitive types like [boolean] et al. } // Store the reference in case we need it later on. - objectHistory.add(objectRead) + // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content + if (type.asClass()?.isPrimitive != true) objectHistory.add(objectRead) objectRead } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt index 7c15998270..da04f8fbd0 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt @@ -14,7 +14,7 @@ import kotlin.reflect.jvm.javaConstructor open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPSerializer { override val type: Type get() = clazz open val kotlinConstructor = constructorForDeserialization(clazz) - val javaConstructor by lazy { kotlinConstructor?.javaConstructor } + val javaConstructor by lazy { kotlinConstructor?.javaConstructor?.apply { isAccessible = true } } private val logger = loggerFor() diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt index 65b9b745ee..0274739a0c 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt @@ -87,9 +87,7 @@ open class SerializationOutput(internal val serializerFactory: SerializerFactory // Important to do it after serialization such that dependent object will have preceding reference numbers // assigned to them first as they will be first read from the stream on receiving end. // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content - if(type is Class<*> && !type.isPrimitive) { - objectHistory.put(obj, objectHistory.size) - } + if (type.asClass()?.isPrimitive != true) objectHistory.put(obj, objectHistory.size) } else { data.writeReferencedObject(ReferencedObject(retrievedRefCount)) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt index d5754e46d1..f5954305ca 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt @@ -12,17 +12,17 @@ import net.corda.core.serialization.CordaSerializable import net.corda.core.transactions.LedgerTransaction import net.corda.nodeapi.RPCException import net.corda.nodeapi.internal.serialization.AbstractAMQPSerializationScheme +import net.corda.nodeapi.internal.serialization.AllWhitelist import net.corda.nodeapi.internal.serialization.EmptyWhitelist import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.isPrimitive -import net.corda.nodeapi.internal.serialization.AllWhitelist import net.corda.testing.BOB_IDENTITY import net.corda.testing.MEGA_CORP import net.corda.testing.MEGA_CORP_PUBKEY import org.apache.qpid.proton.amqp.* import org.apache.qpid.proton.codec.DecoderImpl import org.apache.qpid.proton.codec.EncoderImpl -import org.junit.Ignore import org.junit.Assert.assertSame +import org.junit.Ignore import org.junit.Test import java.io.IOException import java.io.NotSerializableException @@ -794,4 +794,44 @@ class SerializationOutputTests { val bCopy = serdes(nodeB) assertEquals("A", bCopy.children.single().content) } + + data class Bob(val byteArrays: List) + + @Ignore("Causes DeserializedParameterizedType.make() to fail") + @Test + fun `test list of byte arrays`() { + val a = ByteArray(1) + val b = ByteArray(2) + val obj = Bob(listOf(a, b, a)) + + val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + serdes(obj, factory, factory2) + } + + data class Vic(val a: List, val b: List) + + @Test + fun `test generics ignored from graph logic`() { + val a = listOf("a", "b") + val obj = Vic(a, a) + + val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + val objCopy = serdes(obj, factory, factory2) + assertSame(objCopy.a, objCopy.b) + } + + data class Spike private constructor(val a: String) { + constructor() : this("a") + } + + @Test + fun `test private constructor`() { + val obj = Spike() + + val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + serdes(obj, factory, factory2) + } } \ No newline at end of file From 485c2feb8362e1db294793c1f293982360a4c9b8 Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko <31008341+vkolomeyko@users.noreply.github.com> Date: Thu, 31 Aug 2017 18:38:29 +0100 Subject: [PATCH 041/120] CORDA-540: Ensure that registration of a test node was a success prior to performing further testing with it (#1379) Registration may fail due to low level serialization problems especially when running in AMQP mode Also some minor improvements for exceptions reporting and test coverage --- .../java/net/corda/core/flows/FlowsInJavaTest.java | 5 ++++- .../kotlin/net/corda/core/flows/AttachmentTests.kt | 14 ++++++++++++++ .../corda/core/flows/CollectSignaturesFlowTests.kt | 1 + .../corda/core/flows/ContractUpgradeFlowTest.kt | 5 +++++ .../net/corda/core/flows/FinalityFlowTests.kt | 1 + .../corda/core/flows/ManualFinalityFlowTests.kt | 1 + .../internal/concurrent/CordaFutureImplTest.kt | 12 ++++++++++++ .../serialization/AttachmentSerializationTest.kt | 5 +++-- .../kotlin/net/corda/node/internal/AbstractNode.kt | 4 ++-- .../main/kotlin/net/corda/node/internal/Node.kt | 4 +++- .../kotlin/net/corda/node/internal/NodeStartup.kt | 5 ++++- .../node/services/network/NetworkMapService.kt | 5 +++++ .../main/kotlin/net/corda/testing/node/MockNode.kt | 9 +++++++++ 13 files changed, 64 insertions(+), 7 deletions(-) diff --git a/core/src/test/java/net/corda/core/flows/FlowsInJavaTest.java b/core/src/test/java/net/corda/core/flows/FlowsInJavaTest.java index 831d27549e..5c6308c2d5 100644 --- a/core/src/test/java/net/corda/core/flows/FlowsInJavaTest.java +++ b/core/src/test/java/net/corda/core/flows/FlowsInJavaTest.java @@ -7,6 +7,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @@ -18,11 +19,13 @@ public class FlowsInJavaTest { private MockNetwork.MockNode node2; @Before - public void setUp() { + public void setUp() throws Exception { MockNetwork.BasketOfNodes someNodes = mockNet.createSomeNodes(2); node1 = someNodes.getPartyNodes().get(0); node2 = someNodes.getPartyNodes().get(1); mockNet.runNetwork(); + // Ensure registration was successful + node1.getNodeReadyFuture().get(); } @After diff --git a/core/src/test/kotlin/net/corda/core/flows/AttachmentTests.kt b/core/src/test/kotlin/net/corda/core/flows/AttachmentTests.kt index b8b2900d98..378ed0b0f1 100644 --- a/core/src/test/kotlin/net/corda/core/flows/AttachmentTests.kt +++ b/core/src/test/kotlin/net/corda/core/flows/AttachmentTests.kt @@ -56,6 +56,11 @@ class AttachmentTests { val nodes = mockNet.createSomeNodes(2) val n0 = nodes.partyNodes[0] val n1 = nodes.partyNodes[1] + + // Ensure that registration was successful before progressing any further + mockNet.runNetwork() + n0.ensureRegistered() + n0.registerInitiatedFlow(FetchAttachmentsResponse::class.java) n1.registerInitiatedFlow(FetchAttachmentsResponse::class.java) @@ -89,6 +94,11 @@ class AttachmentTests { val nodes = mockNet.createSomeNodes(2) val n0 = nodes.partyNodes[0] val n1 = nodes.partyNodes[1] + + // Ensure that registration was successful before progressing any further + mockNet.runNetwork() + n0.ensureRegistered() + n0.registerInitiatedFlow(FetchAttachmentsResponse::class.java) n1.registerInitiatedFlow(FetchAttachmentsResponse::class.java) @@ -119,6 +129,10 @@ class AttachmentTests { }, advertisedServices = *arrayOf(ServiceInfo(NetworkMapService.type), ServiceInfo(SimpleNotaryService.type))) val n1 = mockNet.createNode(n0.network.myAddress) + // Ensure that registration was successful before progressing any further + mockNet.runNetwork() + n0.ensureRegistered() + n0.registerInitiatedFlow(FetchAttachmentsResponse::class.java) n1.registerInitiatedFlow(FetchAttachmentsResponse::class.java) diff --git a/core/src/test/kotlin/net/corda/core/flows/CollectSignaturesFlowTests.kt b/core/src/test/kotlin/net/corda/core/flows/CollectSignaturesFlowTests.kt index 09a9ae33a3..b4f5bd1833 100644 --- a/core/src/test/kotlin/net/corda/core/flows/CollectSignaturesFlowTests.kt +++ b/core/src/test/kotlin/net/corda/core/flows/CollectSignaturesFlowTests.kt @@ -36,6 +36,7 @@ class CollectSignaturesFlowTests { c = nodes.partyNodes[2] notary = nodes.notaryNode.info.notaryIdentity mockNet.runNetwork() + a.ensureRegistered() } @After diff --git a/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt b/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt index a8e93ea575..3eb15aae84 100644 --- a/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt +++ b/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt @@ -46,6 +46,11 @@ class ContractUpgradeFlowTest { val nodes = mockNet.createSomeNodes(notaryKeyPair = null) // prevent generation of notary override a = nodes.partyNodes[0] b = nodes.partyNodes[1] + + // Process registration + mockNet.runNetwork() + a.ensureRegistered() + notary = nodes.notaryNode.info.notaryIdentity val nodeIdentity = nodes.notaryNode.info.legalIdentitiesAndCerts.single { it.party == nodes.notaryNode.info.notaryIdentity } diff --git a/core/src/test/kotlin/net/corda/core/flows/FinalityFlowTests.kt b/core/src/test/kotlin/net/corda/core/flows/FinalityFlowTests.kt index d4f96ab44a..add1d8e3ca 100644 --- a/core/src/test/kotlin/net/corda/core/flows/FinalityFlowTests.kt +++ b/core/src/test/kotlin/net/corda/core/flows/FinalityFlowTests.kt @@ -29,6 +29,7 @@ class FinalityFlowTests { nodeB = nodes.partyNodes[1] notary = nodes.notaryNode.info.notaryIdentity mockNet.runNetwork() + nodeA.ensureRegistered() } @After diff --git a/core/src/test/kotlin/net/corda/core/flows/ManualFinalityFlowTests.kt b/core/src/test/kotlin/net/corda/core/flows/ManualFinalityFlowTests.kt index 2e4cc2429f..f872cecb8b 100644 --- a/core/src/test/kotlin/net/corda/core/flows/ManualFinalityFlowTests.kt +++ b/core/src/test/kotlin/net/corda/core/flows/ManualFinalityFlowTests.kt @@ -32,6 +32,7 @@ class ManualFinalityFlowTests { nodeC = nodes.partyNodes[2] notary = nodes.notaryNode.info.notaryIdentity mockNet.runNetwork() + nodeA.ensureRegistered() } @After diff --git a/core/src/test/kotlin/net/corda/core/internal/concurrent/CordaFutureImplTest.kt b/core/src/test/kotlin/net/corda/core/internal/concurrent/CordaFutureImplTest.kt index c176372a39..8b9efe991a 100644 --- a/core/src/test/kotlin/net/corda/core/internal/concurrent/CordaFutureImplTest.kt +++ b/core/src/test/kotlin/net/corda/core/internal/concurrent/CordaFutureImplTest.kt @@ -112,6 +112,18 @@ class CordaFutureTest { } verify(log).error(any(), same(throwable)) } + + @Test + fun `captureLater works`() { + val failingFuture = CordaFutureImpl() + val anotherFailingFuture = CordaFutureImpl() + anotherFailingFuture.captureLater(failingFuture) + + val exception = Exception() + failingFuture.setException(exception) + + Assertions.assertThatThrownBy { anotherFailingFuture.getOrThrow() }.isSameAs(exception) + } } class TransposeTest { diff --git a/core/src/test/kotlin/net/corda/core/serialization/AttachmentSerializationTest.kt b/core/src/test/kotlin/net/corda/core/serialization/AttachmentSerializationTest.kt index ed687c252a..64e703dfec 100644 --- a/core/src/test/kotlin/net/corda/core/serialization/AttachmentSerializationTest.kt +++ b/core/src/test/kotlin/net/corda/core/serialization/AttachmentSerializationTest.kt @@ -46,13 +46,13 @@ private fun MockNetwork.MockNode.saveAttachment(content: String) = database.tran attachments.importAttachment(createAttachmentData(content).inputStream()) } private fun MockNetwork.MockNode.hackAttachment(attachmentId: SecureHash, content: String) = database.transaction { - attachments.updateAttachment(attachmentId, createAttachmentData(content)) + updateAttachment(attachmentId, createAttachmentData(content)) } /** * @see NodeAttachmentService.importAttachment */ -private fun NodeAttachmentService.updateAttachment(attachmentId: SecureHash, data: ByteArray) { +private fun updateAttachment(attachmentId: SecureHash, data: ByteArray) { val session = DatabaseTransactionManager.current().session val attachment = session.get(NodeAttachmentService.DBAttachment::class.java, attachmentId.toString()) attachment?.let { @@ -73,6 +73,7 @@ class AttachmentSerializationTest { client = mockNet.createNode(server.network.myAddress) client.disableDBCloseOnStop() // Otherwise the in-memory database may disappear (taking the checkpoint with it) while we reboot the client. mockNet.runNetwork() + server.ensureRegistered() } @After diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index ec864c606c..ac23a25dff 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -605,8 +605,8 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, val address: SingleMessageRecipient = networkMapAddress ?: network.getAddressOfParty(PartyInfo.Node(info)) as SingleMessageRecipient // Register for updates, even if we're the one running the network map. - return sendNetworkMapRegistration(address).flatMap { (error) -> - check(error == null) { "Unable to register with the network map service: $error" } + return sendNetworkMapRegistration(address).flatMap { response: RegistrationResponse -> + check(response.error == null) { "Unable to register with the network map service: ${response.error}" } // The future returned addMapService will complete on the same executor as sendNetworkMapRegistration, namely the one used by net services.networkMapCache.addMapService(network, address, true, null) } diff --git a/node/src/main/kotlin/net/corda/node/internal/Node.kt b/node/src/main/kotlin/net/corda/node/internal/Node.kt index 27016f1617..27e67ec30d 100644 --- a/node/src/main/kotlin/net/corda/node/internal/Node.kt +++ b/node/src/main/kotlin/net/corda/node/internal/Node.kt @@ -330,7 +330,9 @@ open class Node(override val configuration: FullNodeConfiguration, _startupComplete.set(Unit) } - }, {}) + }, + { th -> logger.error("Unexpected exception", th)} + ) shutdownHook = addShutdownHook { stop() } diff --git a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt index 2d55019454..d1ca8d751e 100644 --- a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt +++ b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt @@ -117,7 +117,10 @@ open class NodeStartup(val args: Array) { logger.error("Shell failed to start", e) } } - }, {}) + }, + { + th -> logger.error("Unexpected exception during registration", th) + }) node.run() } diff --git a/node/src/main/kotlin/net/corda/node/services/network/NetworkMapService.kt b/node/src/main/kotlin/net/corda/node/services/network/NetworkMapService.kt index 21b728e6ff..18352367fe 100644 --- a/node/src/main/kotlin/net/corda/node/services/network/NetworkMapService.kt +++ b/node/src/main/kotlin/net/corda/node/services/network/NetworkMapService.kt @@ -35,6 +35,7 @@ import net.corda.node.services.network.NetworkMapService.Companion.SUBSCRIPTION_ import net.corda.node.utilities.AddOrRemove import net.corda.node.utilities.AddOrRemove.ADD import net.corda.node.utilities.AddOrRemove.REMOVE +import java.io.IOException import java.security.PublicKey import java.security.SignatureException import java.time.Instant @@ -243,6 +244,10 @@ abstract class AbstractNetworkMapService(services: ServiceHubInternal, request.wireReg.verified() } catch (e: SignatureException) { return RegistrationResponse("Invalid signature on request") + } catch (e: IOException) { + val msg = "Unexpected IO exception: ${e.message}" + logger.error(msg, e) + return RegistrationResponse(msg) } val node = change.node diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt index f014135766..2f16808e73 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt @@ -268,6 +268,15 @@ class MockNetwork(private val networkSendManuallyPumped: Boolean = false, } }) } + + /** + * Makes sure that the [MockNode] is correctly registered on the [MockNetwork] + * Please note that [MockNetwork.runNetwork] should be invoked to ensure that all the pending registration requests + * were duly processed + */ + fun ensureRegistered() { + _nodeReadyFuture.getOrThrow() + } } /** From ebbca94d67970a617f316e7da0e43bab3022abef Mon Sep 17 00:00:00 2001 From: joeldudleyr3 Date: Thu, 31 Aug 2017 22:38:33 +0100 Subject: [PATCH 042/120] Show error msg rather than fail silently when running a flow with no progress tracker from the shell. --- node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt b/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt index f764c595b1..5c07570419 100644 --- a/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt +++ b/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt @@ -293,6 +293,10 @@ object InteractiveShell { continue } val flow = ctor.newInstance(*args) as FlowLogic<*> + if (flow.progressTracker == null) { + errors.add("You must override the flow's progress tracker to run it from the shell") + continue + } return invoke(flow) } catch(e: StringToMethodCallParser.UnparseableCallException.MissingParameter) { errors.add("${getPrototype()}: missing parameter ${e.paramName}") From 75cd76b09baf98cb72845d15bff3248113d988bb Mon Sep 17 00:00:00 2001 From: Andras Slemmer Date: Wed, 30 Aug 2017 11:57:03 +0100 Subject: [PATCH 043/120] Fix flaky distributed retry test --- .../services/messaging/P2PMessagingTest.kt | 58 ++++++++++++------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt index f3ae4556ae..887419c2cb 100644 --- a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt +++ b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt @@ -26,7 +26,6 @@ import org.junit.Test import java.util.* import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger class P2PMessagingTest : NodeBasedTest() { @@ -105,17 +104,23 @@ class P2PMessagingTest : NodeBasedTest() { val dummyTopic = "dummy.topic" val responseMessage = "response" - simulateCrashingNode(distributedServiceNodes, dummyTopic, responseMessage) + val crashingNodes = simulateCrashingNodes(distributedServiceNodes, dummyTopic, responseMessage) // Send a single request with retry - val response = with(alice.network) { + val responseFuture = with(alice.network) { val request = TestRequest(replyTo = myAddress) val responseFuture = onNext(dummyTopic, request.sessionID) val msg = createMessage(TopicSession(dummyTopic), data = request.serialize().bytes) send(msg, serviceAddress, retryId = request.sessionID) responseFuture - }.getOrThrow(10.seconds) + } + crashingNodes.firstRequestReceived.await() + // The request wasn't successful. + assertThat(responseFuture.isDone).isFalse() + crashingNodes.ignoreRequests = false + // The retry should be successful. + val response = responseFuture.getOrThrow(10.seconds) assertThat(response).isEqualTo(responseMessage) } @@ -130,7 +135,7 @@ class P2PMessagingTest : NodeBasedTest() { val dummyTopic = "dummy.topic" val responseMessage = "response" - val (firstRequestReceived, requestsReceived) = simulateCrashingNode(distributedServiceNodes, dummyTopic, responseMessage) + val crashingNodes = simulateCrashingNodes(distributedServiceNodes, dummyTopic, responseMessage) val sessionId = random63BitValue() @@ -142,37 +147,48 @@ class P2PMessagingTest : NodeBasedTest() { } // Wait until the first request is received - firstRequestReceived.await(5, TimeUnit.SECONDS) + crashingNodes.firstRequestReceived.await(5, TimeUnit.SECONDS) // Stop alice's node before the request is redelivered – the first request is ignored alice.stop() - assertThat(requestsReceived.get()).isEqualTo(1) + val numberOfRequestsReceived = crashingNodes.requestsReceived.get() + assertThat(numberOfRequestsReceived).isGreaterThanOrEqualTo(1) + + crashingNodes.ignoreRequests = false // Restart the node and expect a response val aliceRestarted = startNode(ALICE.name, configOverrides = mapOf("messageRedeliveryDelaySeconds" to 1)).getOrThrow() val response = aliceRestarted.network.onNext(dummyTopic, sessionId).getOrThrow(5.seconds) - assertThat(requestsReceived.get()).isGreaterThanOrEqualTo(2) + + assertThat(crashingNodes.requestsReceived.get()).isGreaterThanOrEqualTo(numberOfRequestsReceived + 1) assertThat(response).isEqualTo(responseMessage) } + data class CrashingNodes( + val firstRequestReceived: CountDownLatch, + val requestsReceived: AtomicInteger, + var ignoreRequests: Boolean + ) + /** - * Sets up the [distributedServiceNodes] to respond to [dummyTopic] requests. The first node in the service to - * receive a request will ignore it and all subsequent requests. This simulates the scenario where a node receives - * a request message, but crashes before sending back a response. The other nodes will respond to _all_ requests. + * Sets up the [distributedServiceNodes] to respond to [dummyTopic] requests. All nodes will receive requests and + * either ignore them or respond, depending on the value of [CrashingNodes.ignoreRequests], initially set to true. + * This may be used to simulate scenarios where nodes receive request messages but crash before sending back a response. */ - private fun simulateCrashingNode(distributedServiceNodes: List, dummyTopic: String, responseMessage: String): Pair { - val firstToReceive = AtomicBoolean(true) - val requestsReceived = AtomicInteger(0) - val firstRequestReceived = CountDownLatch(1) + private fun simulateCrashingNodes(distributedServiceNodes: List, dummyTopic: String, responseMessage: String): CrashingNodes { + val crashingNodes = CrashingNodes( + requestsReceived = AtomicInteger(0), + firstRequestReceived = CountDownLatch(1), + ignoreRequests = true + ) + distributedServiceNodes.forEach { val nodeName = it.info.legalIdentity.name - var ignoreRequests = false it.network.addMessageHandler(dummyTopic) { netMessage, _ -> - requestsReceived.incrementAndGet() - firstRequestReceived.countDown() + crashingNodes.requestsReceived.incrementAndGet() + crashingNodes.firstRequestReceived.countDown() // The node which receives the first request will ignore all requests - if (firstToReceive.getAndSet(false)) ignoreRequests = true print("$nodeName: Received request - ") - if (ignoreRequests) { + if (crashingNodes.ignoreRequests) { println("ignoring") // Requests are ignored to simulate a service node crashing before sending back a response. // A retry by the client will result in the message being redelivered to another node in the service cluster. @@ -184,7 +200,7 @@ class P2PMessagingTest : NodeBasedTest() { } } } - return Pair(firstRequestReceived, requestsReceived) + return crashingNodes } private fun assertAllNodesAreUsed(participatingServiceNodes: List, serviceName: X500Name, originatingNode: Node) { From 9891fb58b0680eeae95201de3849d172588c8402 Mon Sep 17 00:00:00 2001 From: Andras Slemmer Date: Wed, 30 Aug 2017 17:51:19 +0100 Subject: [PATCH 044/120] Address comments --- .../kotlin/net/corda/services/messaging/P2PMessagingTest.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt index 887419c2cb..e3af49da13 100644 --- a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt +++ b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt @@ -114,7 +114,7 @@ class P2PMessagingTest : NodeBasedTest() { send(msg, serviceAddress, retryId = request.sessionID) responseFuture } - crashingNodes.firstRequestReceived.await() + crashingNodes.firstRequestReceived.await(5, TimeUnit.SECONDS) // The request wasn't successful. assertThat(responseFuture.isDone).isFalse() crashingNodes.ignoreRequests = false @@ -148,7 +148,7 @@ class P2PMessagingTest : NodeBasedTest() { // Wait until the first request is received crashingNodes.firstRequestReceived.await(5, TimeUnit.SECONDS) - // Stop alice's node before the request is redelivered – the first request is ignored + // Stop alice's node after we ensured that the first request was delivered and ignored. alice.stop() val numberOfRequestsReceived = crashingNodes.requestsReceived.get() assertThat(numberOfRequestsReceived).isGreaterThanOrEqualTo(1) @@ -159,7 +159,7 @@ class P2PMessagingTest : NodeBasedTest() { val aliceRestarted = startNode(ALICE.name, configOverrides = mapOf("messageRedeliveryDelaySeconds" to 1)).getOrThrow() val response = aliceRestarted.network.onNext(dummyTopic, sessionId).getOrThrow(5.seconds) - assertThat(crashingNodes.requestsReceived.get()).isGreaterThanOrEqualTo(numberOfRequestsReceived + 1) + assertThat(crashingNodes.requestsReceived.get()).isGreaterThan(numberOfRequestsReceived) assertThat(response).isEqualTo(responseMessage) } From 54e302608f257fa8ecb74b5b17eafa0862bb878e Mon Sep 17 00:00:00 2001 From: joeldudleyr3 Date: Fri, 1 Sep 2017 10:07:34 +0100 Subject: [PATCH 045/120] Updates the error message. --- node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt b/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt index 5c07570419..cc863b3193 100644 --- a/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt +++ b/node/src/main/kotlin/net/corda/node/shell/InteractiveShell.kt @@ -294,7 +294,7 @@ object InteractiveShell { } val flow = ctor.newInstance(*args) as FlowLogic<*> if (flow.progressTracker == null) { - errors.add("You must override the flow's progress tracker to run it from the shell") + errors.add("A flow must override the progress tracker in order to be run from the shell") continue } return invoke(flow) From 62c64ace23414cb0f0ed10ba34bb30fe5dd46586 Mon Sep 17 00:00:00 2001 From: Konstantinos Chalkias Date: Fri, 1 Sep 2017 10:45:01 +0100 Subject: [PATCH 046/120] Adding createSignature(filteredTransaction) to serviceHub (#1380) --- .../kotlin/net/corda/core/node/ServiceHub.kt | 45 ++++++++++++++++--- .../core/transactions/MerkleTransaction.kt | 8 ++-- docs/source/changelog.rst | 4 ++ docs/source/tutorial-tear-offs.rst | 2 +- .../BFTNonValidatingNotaryService.kt | 9 ++-- .../node/services/transactions/BFTSMaRt.kt | 4 +- .../transactions/NonValidatingNotaryFlow.kt | 2 +- .../net/corda/irs/api/NodeInterestRates.kt | 4 +- 8 files changed, 56 insertions(+), 22 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/node/ServiceHub.kt b/core/src/main/kotlin/net/corda/core/node/ServiceHub.kt index def8fb0424..695e32a0a4 100644 --- a/core/src/main/kotlin/net/corda/core/node/ServiceHub.kt +++ b/core/src/main/kotlin/net/corda/core/node/ServiceHub.kt @@ -7,6 +7,7 @@ import net.corda.core.crypto.SignatureMetadata import net.corda.core.crypto.TransactionSignature import net.corda.core.node.services.* import net.corda.core.serialization.SerializeAsToken +import net.corda.core.transactions.FilteredTransaction import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder import java.security.PublicKey @@ -171,7 +172,7 @@ interface ServiceHub : ServicesForResolution { /** * Helper method to construct an initial partially signed transaction from a TransactionBuilder - * using the default identity key contained in the node. The legal Indentity key is used to sign. + * using the default identity key contained in the node. The legal identity key is used to sign. * @param builder The TransactionBuilder to seal with the node's signature. * Any existing signatures on the builder will be preserved. * @return Returns a SignedTransaction with the new node signature attached. @@ -203,7 +204,9 @@ interface ServiceHub : ServicesForResolution { } /** - * Helper method to create an additional signature for an existing (partially) [SignedTransaction]. + * Helper method to create an additional signature for an existing (partially) [SignedTransaction]. Additional + * [SignatureMetadata], including the + * platform version used during signing and the cryptographic signature scheme use, is added to the signature. * @param signedTransaction The [SignedTransaction] to which the signature will apply. * @param publicKey The [PublicKey] matching to a signing [java.security.PrivateKey] hosted in the node. * If the [PublicKey] is actually a [net.corda.core.crypto.CompositeKey] the first leaf key found locally will be used @@ -214,10 +217,12 @@ interface ServiceHub : ServicesForResolution { createSignature(signedTransaction, publicKey, SignatureMetadata(myInfo.platformVersion, Crypto.findSignatureScheme(publicKey).schemeNumberID)) /** - * Helper method to create an additional signature for an existing (partially) [SignedTransaction] - * using the default identity signing key of the node. The legal identity key is used to sign. + * Helper method to create a signature for an existing (partially) [SignedTransaction] + * using the default identity signing key of the node. The legal identity key is used to sign. Additional + * [SignatureMetadata], including the + * platform version used during signing and the cryptographic signature scheme use, is added to the signature. * @param signedTransaction The SignedTransaction to which the signature will apply. - * @return The DigitalSignature.WithKey generated by signing with the internally held identity PrivateKey. + * @return the TransactionSignature generated by signing with the internally held identity PrivateKey. */ fun createSignature(signedTransaction: SignedTransaction): TransactionSignature { return createSignature(signedTransaction, legalIdentityKey) @@ -243,6 +248,36 @@ interface ServiceHub : ServicesForResolution { */ fun addSignature(signedTransaction: SignedTransaction): SignedTransaction = addSignature(signedTransaction, legalIdentityKey) + // Helper method to create a signature for a FilteredTransaction. + private fun createSignature(filteredTransaction: FilteredTransaction, publicKey: PublicKey, signatureMetadata: SignatureMetadata): TransactionSignature { + val signableData = SignableData(filteredTransaction.id, signatureMetadata) + return keyManagementService.sign(signableData, publicKey) + } + + /** + * Helper method to create a signature for a FilteredTransaction. Additional [SignatureMetadata], including the + * platform version used during signing and the cryptographic signature scheme use, is added to the signature. + * @param filteredTransaction the [FilteredTransaction] to which the signature will apply. + * @param publicKey The [PublicKey] matching to a signing [java.security.PrivateKey] hosted in the node. + * If the [PublicKey] is actually a [net.corda.core.crypto.CompositeKey] the first leaf key found locally will be used + * for signing. + * @return The [TransactionSignature] generated by signing with the internally held [java.security.PrivateKey]. + */ + fun createSignature(filteredTransaction: FilteredTransaction, publicKey: PublicKey) = + createSignature(filteredTransaction, publicKey, SignatureMetadata(myInfo.platformVersion, Crypto.findSignatureScheme(publicKey).schemeNumberID)) + + /** + * Helper method to create a signature for a FilteredTransaction + * using the default identity signing key of the node. The legal identity key is used to sign. Additional + * [SignatureMetadata], including the platform version used during signing and the cryptographic signature scheme use, + * is added to the signature. + * @param filteredTransaction the FilteredTransaction to which the signature will apply. + * @return the [TransactionSignature] generated by signing with the internally held identity [java.security.PrivateKey]. + */ + fun createSignature(filteredTransaction: FilteredTransaction): TransactionSignature { + return createSignature(filteredTransaction, legalIdentityKey) + } + /** * Exposes a JDBC connection (session) object using the currently configured database. * Applications can use this to execute arbitrary SQL queries (native, direct, prepared, callable) diff --git a/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt index 7c781a8097..7793b709e6 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt @@ -139,13 +139,13 @@ class FilteredLeaves( /** * Class representing merkleized filtered transaction. - * @param rootHash Merkle tree root hash. + * @param id Merkle tree root hash. * @param filteredLeaves Leaves included in a filtered transaction. * @param partialMerkleTree Merkle branch needed to verify filteredLeaves. */ @CordaSerializable class FilteredTransaction private constructor( - val rootHash: SecureHash, + val id: SecureHash, val filteredLeaves: FilteredLeaves, val partialMerkleTree: PartialMerkleTree ) { @@ -230,13 +230,13 @@ class FilteredTransaction private constructor( } /** - * Runs verification of Partial Merkle Branch against [rootHash]. + * Runs verification of Partial Merkle Branch against [id]. */ @Throws(MerkleTreeException::class) fun verify(): Boolean { val hashes: List = filteredLeaves.availableComponentHashes if (hashes.isEmpty()) throw MerkleTreeException("Transaction without included leaves.") - return partialMerkleTree.verify(rootHash, hashes) + return partialMerkleTree.verify(id, hashes) } } diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 1710075431..21d7082abe 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -110,6 +110,10 @@ UNRELEASED * ``SerializationCustomization.addToWhitelist()` now accepts multiple classes via varargs. +* Two functions to easily sign a ``FilteredTransaction`` have been added to ``ServiceHub``: + ``createSignature(filteredTransaction: FilteredTransaction, publicKey: PublicKey)`` and + ``createSignature(filteredTransaction: FilteredTransaction)`` to sign with the legal identity key. + Milestone 14 ------------ diff --git a/docs/source/tutorial-tear-offs.rst b/docs/source/tutorial-tear-offs.rst index 4e247f733d..5187aaac42 100644 --- a/docs/source/tutorial-tear-offs.rst +++ b/docs/source/tutorial-tear-offs.rst @@ -45,7 +45,7 @@ In the Oracle example this step takes place in ``RatesFixFlow`` by overriding `` // Direct accsess to included commands, inputs, outputs, attachments etc. val cmds: List = ftx.filteredLeaves.commands val ins: List = ftx.filteredLeaves.inputs - val timestamp: Timestamp? = ftx.filteredLeaves.timestamp + val timeWindow: TimeWindow? = ftx.filteredLeaves.timeWindow ... .. literalinclude:: ../../samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt b/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt index feb4e83e55..7917753403 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt @@ -85,7 +85,7 @@ class BFTNonValidatingNotaryService(override val services: ServiceHubInternal, c when (response) { is BFTSMaRt.ClusterResponse.Error -> throw NotaryException(response.error) is BFTSMaRt.ClusterResponse.Signatures -> { - log.debug("All input states of transaction ${stx.rootHash} have been committed") + log.debug("All input states of transaction ${stx.id} have been committed") return response.txSignatures } } @@ -139,16 +139,13 @@ class BFTNonValidatingNotaryService(override val services: ServiceHubInternal, c fun verifyAndCommitTx(ftx: FilteredTransaction, callerIdentity: Party): BFTSMaRt.ReplicaResponse { return try { - val id = ftx.rootHash + val id = ftx.id val inputs = ftx.filteredLeaves.inputs validateTimeWindow(ftx.filteredLeaves.timeWindow) commitInputStates(inputs, id, callerIdentity) - log.debug { "Inputs committed successfully, signing $id" } - val signableData = SignableData(id, SignatureMetadata(services.myInfo.platformVersion, Crypto.findSignatureScheme(services.notaryIdentityKey).schemeNumberID)) - val sig = sign(signableData) - BFTSMaRt.ReplicaResponse.Signature(sig) + BFTSMaRt.ReplicaResponse.Signature(sign(ftx)) } catch (e: NotaryException) { log.debug { "Error processing transaction: ${e.error}" } BFTSMaRt.ReplicaResponse.Error(e.error) diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/BFTSMaRt.kt b/node/src/main/kotlin/net/corda/node/services/transactions/BFTSMaRt.kt index ba39a29689..072a07bd04 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/BFTSMaRt.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/BFTSMaRt.kt @@ -251,8 +251,8 @@ object BFTSMaRt { return services.database.transaction { services.keyManagementService.sign(bytes, services.notaryIdentityKey) } } - protected fun sign(signableData: SignableData): TransactionSignature { - return services.database.transaction { services.keyManagementService.sign(signableData, services.notaryIdentityKey) } + protected fun sign(filteredTransaction: FilteredTransaction): TransactionSignature { + return services.database.transaction { services.createSignature(filteredTransaction, services.notaryIdentityKey) } } // TODO: diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/NonValidatingNotaryFlow.kt b/node/src/main/kotlin/net/corda/node/services/transactions/NonValidatingNotaryFlow.kt index 97bedc4c46..2546d44afc 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/NonValidatingNotaryFlow.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/NonValidatingNotaryFlow.kt @@ -24,7 +24,7 @@ class NonValidatingNotaryFlow(otherSide: Party, service: TrustedAuthorityNotaryS when (it) { is FilteredTransaction -> { it.verify() - TransactionParts(it.rootHash, it.filteredLeaves.inputs, it.filteredLeaves.timeWindow) + TransactionParts(it.id, it.filteredLeaves.inputs, it.filteredLeaves.timeWindow) } is NotaryChangeWireTransaction -> TransactionParts(it.id, it.inputs, null) else -> { diff --git a/samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt b/samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt index f9ec94b819..695ab9d2e3 100644 --- a/samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt +++ b/samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt @@ -175,9 +175,7 @@ object NodeInterestRates { // Note that we will happily sign an invalid transaction, as we are only being presented with a filtered // version so we can't resolve or check it ourselves. However, that doesn't matter much, as if we sign // an invalid transaction the signature is worthless. - val signableData = SignableData(ftx.rootHash, SignatureMetadata(services.myInfo.platformVersion, Crypto.findSignatureScheme(signingKey).schemeNumberID)) - val signature = services.keyManagementService.sign(signableData, signingKey) - return TransactionSignature(signature.bytes, signingKey, signableData.signatureMetadata) + return services.createSignature(ftx, signingKey) } // DOCEND 1 From 83dc1d020d03519307a4630861bdc16289df57cf Mon Sep 17 00:00:00 2001 From: joeldudleyr3 Date: Fri, 1 Sep 2017 10:50:13 +0100 Subject: [PATCH 047/120] Fixes tests. --- node/src/test/kotlin/net/corda/node/InteractiveShellTest.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/node/src/test/kotlin/net/corda/node/InteractiveShellTest.kt b/node/src/test/kotlin/net/corda/node/InteractiveShellTest.kt index bd2ae43f57..a7cdbe34d7 100644 --- a/node/src/test/kotlin/net/corda/node/InteractiveShellTest.kt +++ b/node/src/test/kotlin/net/corda/node/InteractiveShellTest.kt @@ -11,6 +11,7 @@ import net.corda.core.node.ServiceHub import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.UntrustworthyData import net.corda.client.jackson.JacksonSupport +import net.corda.core.utilities.ProgressTracker import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.shell.InteractiveShell import net.corda.testing.DUMMY_CA @@ -30,6 +31,7 @@ class InteractiveShellTest { constructor(pair: Pair, SecureHash.SHA256>) : this(pair.toString()) constructor(party: Party) : this(party.name.toString()) + override val progressTracker = ProgressTracker() override fun call() = a } From 7e3dd4c12c3642351bc43cdad0d483fe07d5de2f Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Fri, 1 Sep 2017 10:55:58 +0100 Subject: [PATCH 048/120] Restructure net.corda.core.crypto package * Rename KeyFactory to CompositeKeyFactory * Move expandedCompositeKeys into TestDSL as the only place that uses it * Move NullKeys out of their own package * Move remaining crypto classes into superpackage * Move utility classes out of crypto and into utilities package --- .../corda/client/jackson/JacksonSupport.kt | 4 +++- .../kotlin/net/corda/core/contracts/Amount.kt | 2 +- .../crypto/{composite => }/CompositeKey.kt | 18 +++------------ .../KeyFactory.kt => CompositeKeyFactory.kt} | 7 ++++-- .../{composite => }/CompositeSignature.kt | 4 +--- .../{provider => }/CordaSecurityProvider.kt | 8 +++---- .../kotlin/net/corda/core/crypto/Crypto.kt | 4 ---- .../net/corda/core/crypto/CryptoUtils.kt | 3 ++- .../kotlin/net/corda/core/crypto/NullKeys.kt | 22 +++++++++++++++++++ .../net/corda/core/crypto/testing/NullKeys.kt | 21 ------------------ .../corda/core/flows/CollectSignaturesFlow.kt | 2 +- .../kotlin/net/corda/core/identity/Party.kt | 2 +- .../kotlin/net/corda/core/node/NodeInfo.kt | 6 +---- .../net/corda/core/schemas/CommonSchema.kt | 1 - .../net/corda/core/schemas/NodeInfoSchema.kt | 17 ++------------ .../transactions/NotaryChangeTransactions.kt | 2 +- .../{crypto => utilities}/EncodingUtils.kt | 4 +++- .../core/utilities/LegalNameValidator.kt | 1 - .../{crypto => utilities}/X500NameUtils.kt | 2 +- .../corda/core/contracts/TransactionTests.kt | 2 +- .../corda/core/crypto/CompositeKeyTests.kt | 8 +++---- .../core/crypto/X509NameConstraintsTest.kt | 7 +++--- .../EncodingUtilsTest.kt | 3 ++- .../contracts/universal/PrettyPrint.kt | 2 +- .../contracts/JavaCommercialPaper.java | 2 +- .../finance/contracts/CommercialPaper.kt | 4 ++-- .../net/corda/finance/contracts/asset/Cash.kt | 4 ++-- .../cash/selection/CashSelectionH2Impl.kt | 2 +- .../contracts/asset/DummyFungibleContract.kt | 2 +- .../contracts/asset/ObligationTests.kt | 2 +- .../nodeapi/ArtemisMessagingComponent.kt | 2 +- .../serialization/DefaultKryoCustomizer.kt | 2 +- .../nodeapi/internal/serialization/Kryo.kt | 2 +- .../internal/serialization/amqp/Schema.kt | 2 +- .../node/services/BFTNotaryServiceTests.kt | 2 +- .../services/messaging/MQSecurityTest.kt | 2 +- .../services/messaging/P2PSecurityTest.kt | 2 +- .../net/corda/node/internal/AbstractNode.kt | 4 +--- .../net/corda/node/internal/NodeStartup.kt | 6 ++--- .../identity/InMemoryIdentityService.kt | 2 +- .../net/corda/node/services/keys/KMSUtils.kt | 2 +- .../keys/PersistentKeyManagementService.kt | 2 ++ .../messaging/ArtemisMessagingServer.kt | 2 +- .../network/PersistentNetworkMapCache.kt | 6 ++--- .../network/PersistentNetworkMapService.kt | 2 +- .../BFTNonValidatingNotaryService.kt | 5 +---- .../PersistentUniquenessProvider.kt | 4 ++-- .../node/shell/FlowWatchPrintingSubscriber.kt | 2 +- .../corda/node/utilities/KeyStoreUtilities.kt | 4 ++-- .../utilities/ServiceIdentityGenerator.kt | 2 +- .../net/corda/node/utilities/X509Utilities.kt | 1 + .../registration/NetworkRegistrationHelper.kt | 2 +- .../services/vault/VaultQueryJavaTests.java | 2 +- .../config/FullNodeConfigurationTest.kt | 2 +- .../network/InMemoryIdentityServiceTests.kt | 4 ++-- .../network/PersistentNetworkMapCacheTest.kt | 2 +- .../persistence/HibernateConfigurationTest.kt | 2 +- .../node/services/vault/VaultQueryTests.kt | 2 +- .../corda/node/utilities/X509UtilitiesTest.kt | 6 ++--- .../NetworkisRegistrationHelperTest.kt | 4 ++-- .../kotlin/net/corda/irs/flows/FixingFlow.kt | 2 +- .../net/corda/netmap/NetworkMapVisualiser.kt | 2 +- .../net/corda/netmap/VisualiserViewModel.kt | 2 +- .../net/corda/netmap/simulation/Simulation.kt | 2 +- .../corda/notarydemo/RaftNotaryCordform.kt | 2 +- .../kotlin/net/corda/vega/api/PortfolioApi.kt | 4 ++-- .../net/corda/vega/api/PortfolioApiUtils.kt | 4 ++-- .../net/corda/vega/contracts/SwapData.kt | 2 +- .../net/corda/smoketesting/NodeConfig.kt | 2 +- .../kotlin/net/corda/testing/CoreTestUtils.kt | 4 +--- .../kotlin/net/corda/testing/TestConstants.kt | 2 +- .../main/kotlin/net/corda/testing/TestDSL.kt | 12 ++++++++-- .../kotlin/net/corda/testing/driver/Driver.kt | 6 ++--- .../testing/node/InMemoryMessagingNetwork.kt | 2 +- .../kotlin/net/corda/testing/node/MockNode.kt | 4 ++-- .../net/corda/testing/node/NodeBasedTest.kt | 13 ++--------- .../net/corda/testing/node/SimpleNode.kt | 2 +- .../corda/demobench/model/NetworkMapConfig.kt | 2 +- .../net/corda/demobench/model/NodeConfig.kt | 2 +- .../corda/demobench/model/NodeController.kt | 2 +- .../kotlin/net/corda/demobench/pty/R3Pty.kt | 2 +- .../net/corda/demobench/views/NodeTabView.kt | 2 +- .../corda/demobench/views/NodeTerminalView.kt | 2 +- .../demobench/model/NodeControllerTest.kt | 10 ++++----- .../explorer/formatters/PartyNameFormatter.kt | 2 +- .../net/corda/explorer/views/Network.kt | 5 +---- .../corda/explorer/views/TransactionViewer.kt | 4 ++-- .../views/cordapps/cash/CashViewer.kt | 2 +- .../kotlin/net/corda/loadtest/LoadTest.kt | 2 +- .../net/corda/verifier/VerifierDriver.kt | 2 +- 90 files changed, 160 insertions(+), 198 deletions(-) rename core/src/main/kotlin/net/corda/core/crypto/{composite => }/CompositeKey.kt (95%) rename core/src/main/kotlin/net/corda/core/crypto/{composite/KeyFactory.kt => CompositeKeyFactory.kt} (85%) rename core/src/main/kotlin/net/corda/core/crypto/{composite => }/CompositeSignature.kt (96%) rename core/src/main/kotlin/net/corda/core/crypto/{provider => }/CordaSecurityProvider.kt (84%) create mode 100644 core/src/main/kotlin/net/corda/core/crypto/NullKeys.kt delete mode 100644 core/src/main/kotlin/net/corda/core/crypto/testing/NullKeys.kt rename core/src/main/kotlin/net/corda/core/{crypto => utilities}/EncodingUtils.kt (96%) rename core/src/main/kotlin/net/corda/core/{crypto => utilities}/X500NameUtils.kt (98%) rename core/src/test/kotlin/net/corda/core/{crypto => utilities}/EncodingUtilsTest.kt (97%) diff --git a/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt b/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt index 0abf4770ab..a8418809da 100644 --- a/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt +++ b/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt @@ -12,7 +12,7 @@ import net.corda.core.contracts.Amount import net.corda.core.contracts.ContractState import net.corda.core.contracts.StateRef import net.corda.core.crypto.* -import net.corda.core.crypto.composite.CompositeKey +import net.corda.core.crypto.CompositeKey import net.corda.core.identity.AbstractParty import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party @@ -27,6 +27,8 @@ import net.corda.core.transactions.NotaryChangeWireTransaction import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.WireTransaction import net.corda.core.utilities.OpaqueBytes +import net.corda.core.utilities.parsePublicKeyBase58 +import net.corda.core.utilities.toBase58String import net.i2p.crypto.eddsa.EdDSAPublicKey import org.bouncycastle.asn1.x500.X500Name import java.math.BigDecimal diff --git a/core/src/main/kotlin/net/corda/core/contracts/Amount.kt b/core/src/main/kotlin/net/corda/core/contracts/Amount.kt index 6de842ff63..43101b2a3e 100644 --- a/core/src/main/kotlin/net/corda/core/contracts/Amount.kt +++ b/core/src/main/kotlin/net/corda/core/contracts/Amount.kt @@ -1,6 +1,6 @@ package net.corda.core.contracts -import net.corda.core.crypto.composite.CompositeKey +import net.corda.core.crypto.CompositeKey import net.corda.core.identity.Party import net.corda.core.serialization.CordaSerializable import net.corda.core.utilities.exactAdd diff --git a/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeKey.kt b/core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt similarity index 95% rename from core/src/main/kotlin/net/corda/core/crypto/composite/CompositeKey.kt rename to core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt index a1e31e2f01..80e5ac9d64 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeKey.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt @@ -1,12 +1,8 @@ -package net.corda.core.crypto.composite +package net.corda.core.crypto -import net.corda.core.crypto.Crypto -import net.corda.core.crypto.composite.CompositeKey.NodeAndWeight -import net.corda.core.crypto.keys -import net.corda.core.crypto.provider.CordaObjectIdentifier -import net.corda.core.crypto.toStringShort -import net.corda.core.utilities.exactAdd +import net.corda.core.crypto.CompositeKey.NodeAndWeight import net.corda.core.serialization.CordaSerializable +import net.corda.core.utilities.exactAdd import net.corda.core.utilities.sequence import org.bouncycastle.asn1.* import org.bouncycastle.asn1.x509.AlgorithmIdentifier @@ -269,11 +265,3 @@ class CompositeKey private constructor(val threshold: Int, children: List.expandedCompositeKeys: Set - get() = flatMap { it.keys }.toSet() \ No newline at end of file diff --git a/core/src/main/kotlin/net/corda/core/crypto/composite/KeyFactory.kt b/core/src/main/kotlin/net/corda/core/crypto/CompositeKeyFactory.kt similarity index 85% rename from core/src/main/kotlin/net/corda/core/crypto/composite/KeyFactory.kt rename to core/src/main/kotlin/net/corda/core/crypto/CompositeKeyFactory.kt index b933188d88..62d81c4147 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/composite/KeyFactory.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CompositeKeyFactory.kt @@ -1,11 +1,14 @@ -package net.corda.core.crypto.composite +package net.corda.core.crypto import java.security.* import java.security.spec.InvalidKeySpecException import java.security.spec.KeySpec import java.security.spec.X509EncodedKeySpec -class KeyFactory : KeyFactorySpi() { +/** + * Factory for generating composite keys from ASN.1 format key specifications. This is used by [CordaSecurityProvider]. + */ +class CompositeKeyFactory : KeyFactorySpi() { @Throws(InvalidKeySpecException::class) override fun engineGeneratePrivate(keySpec: KeySpec): PrivateKey { diff --git a/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignature.kt b/core/src/main/kotlin/net/corda/core/crypto/CompositeSignature.kt similarity index 96% rename from core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignature.kt rename to core/src/main/kotlin/net/corda/core/crypto/CompositeSignature.kt index 36d160bb1b..2e84d467b4 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignature.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CompositeSignature.kt @@ -1,7 +1,5 @@ -package net.corda.core.crypto.composite +package net.corda.core.crypto -import net.corda.core.crypto.SecureHash -import net.corda.core.crypto.TransactionSignature import net.corda.core.serialization.deserialize import java.io.ByteArrayOutputStream import java.security.* diff --git a/core/src/main/kotlin/net/corda/core/crypto/provider/CordaSecurityProvider.kt b/core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt similarity index 84% rename from core/src/main/kotlin/net/corda/core/crypto/provider/CordaSecurityProvider.kt rename to core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt index 63f3abcf31..2b490cfce1 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/provider/CordaSecurityProvider.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt @@ -1,7 +1,5 @@ -package net.corda.core.crypto.provider +package net.corda.core.crypto -import net.corda.core.crypto.composite.CompositeKey -import net.corda.core.crypto.composite.CompositeSignature import org.bouncycastle.asn1.ASN1ObjectIdentifier import java.security.AccessController import java.security.PrivilegedAction @@ -17,8 +15,8 @@ class CordaSecurityProvider : Provider(PROVIDER_NAME, 0.1, "$PROVIDER_NAME secur } private fun setup() { - put("KeyFactory.${CompositeKey.KEY_ALGORITHM}", "net.corda.core.crypto.composite.KeyFactory") - put("Signature.${CompositeSignature.SIGNATURE_ALGORITHM}", "net.corda.core.crypto.composite.CompositeSignature") + put("KeyFactory.${CompositeKey.KEY_ALGORITHM}", "net.corda.core.crypto.CompositeKeyFactory") + put("Signature.${CompositeSignature.SIGNATURE_ALGORITHM}", "net.corda.core.crypto.CompositeSignature") val compositeKeyOID = CordaObjectIdentifier.COMPOSITE_KEY.id put("Alg.Alias.KeyFactory.$compositeKeyOID", CompositeKey.KEY_ALGORITHM) diff --git a/core/src/main/kotlin/net/corda/core/crypto/Crypto.kt b/core/src/main/kotlin/net/corda/core/crypto/Crypto.kt index 8b1d9fb542..5195840780 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/Crypto.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/Crypto.kt @@ -1,9 +1,5 @@ package net.corda.core.crypto -import net.corda.core.crypto.composite.CompositeKey -import net.corda.core.crypto.composite.CompositeSignature -import net.corda.core.crypto.provider.CordaObjectIdentifier -import net.corda.core.crypto.provider.CordaSecurityProvider import net.corda.core.serialization.serialize import net.i2p.crypto.eddsa.EdDSAEngine import net.i2p.crypto.eddsa.EdDSAPrivateKey diff --git a/core/src/main/kotlin/net/corda/core/crypto/CryptoUtils.kt b/core/src/main/kotlin/net/corda/core/crypto/CryptoUtils.kt index b0fd5e3725..023b2d20c1 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/CryptoUtils.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CryptoUtils.kt @@ -2,8 +2,9 @@ package net.corda.core.crypto -import net.corda.core.crypto.composite.CompositeKey import net.corda.core.utilities.OpaqueBytes +import net.corda.core.utilities.toBase58 +import net.corda.core.utilities.toSHA256Bytes import java.math.BigInteger import java.security.* diff --git a/core/src/main/kotlin/net/corda/core/crypto/NullKeys.kt b/core/src/main/kotlin/net/corda/core/crypto/NullKeys.kt new file mode 100644 index 0000000000..e5533895e5 --- /dev/null +++ b/core/src/main/kotlin/net/corda/core/crypto/NullKeys.kt @@ -0,0 +1,22 @@ +package net.corda.core.crypto + +import net.corda.core.identity.AnonymousParty +import net.corda.core.serialization.CordaSerializable +import java.security.PublicKey + +object NullKeys { + @CordaSerializable + object NullPublicKey : PublicKey, Comparable { + override fun getAlgorithm() = "NULL" + override fun getEncoded() = byteArrayOf(0) + override fun getFormat() = "NULL" + override fun compareTo(other: PublicKey): Int = if (other == NullPublicKey) 0 else -1 + override fun toString() = "NULL_KEY" + } + + val NULL_PARTY = AnonymousParty(NullPublicKey) + + /** A signature with a key and value of zero. Useful when you want a signature object that you know won't ever be used. */ + val NULL_SIGNATURE = TransactionSignature(ByteArray(32), NullPublicKey, SignatureMetadata(1, -1)) + +} \ No newline at end of file diff --git a/core/src/main/kotlin/net/corda/core/crypto/testing/NullKeys.kt b/core/src/main/kotlin/net/corda/core/crypto/testing/NullKeys.kt deleted file mode 100644 index de2bc3ee42..0000000000 --- a/core/src/main/kotlin/net/corda/core/crypto/testing/NullKeys.kt +++ /dev/null @@ -1,21 +0,0 @@ -package net.corda.core.crypto.testing - -import net.corda.core.crypto.SignatureMetadata -import net.corda.core.crypto.TransactionSignature -import net.corda.core.identity.AnonymousParty -import net.corda.core.serialization.CordaSerializable -import java.security.PublicKey - -@CordaSerializable -object NullPublicKey : PublicKey, Comparable { - override fun getAlgorithm() = "NULL" - override fun getEncoded() = byteArrayOf(0) - override fun getFormat() = "NULL" - override fun compareTo(other: PublicKey): Int = if (other == NullPublicKey) 0 else -1 - override fun toString() = "NULL_KEY" -} - -val NULL_PARTY = AnonymousParty(NullPublicKey) - -/** A signature with a key and value of zero. Useful when you want a signature object that you know won't ever be used. */ -val NULL_SIGNATURE = TransactionSignature(ByteArray(32), NullPublicKey, SignatureMetadata(1, -1)) \ No newline at end of file diff --git a/core/src/main/kotlin/net/corda/core/flows/CollectSignaturesFlow.kt b/core/src/main/kotlin/net/corda/core/flows/CollectSignaturesFlow.kt index 9f95d897a5..723a585cae 100644 --- a/core/src/main/kotlin/net/corda/core/flows/CollectSignaturesFlow.kt +++ b/core/src/main/kotlin/net/corda/core/flows/CollectSignaturesFlow.kt @@ -3,7 +3,7 @@ package net.corda.core.flows import co.paralleluniverse.fibers.Suspendable import net.corda.core.crypto.TransactionSignature import net.corda.core.crypto.isFulfilledBy -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party import net.corda.core.node.ServiceHub diff --git a/core/src/main/kotlin/net/corda/core/identity/Party.kt b/core/src/main/kotlin/net/corda/core/identity/Party.kt index 5652fc2688..f25d6446d1 100644 --- a/core/src/main/kotlin/net/corda/core/identity/Party.kt +++ b/core/src/main/kotlin/net/corda/core/identity/Party.kt @@ -2,7 +2,7 @@ package net.corda.core.identity import net.corda.core.contracts.PartyAndReference import net.corda.core.crypto.Crypto -import net.corda.core.crypto.composite.CompositeKey +import net.corda.core.crypto.CompositeKey import net.corda.core.utilities.OpaqueBytes import org.bouncycastle.asn1.x500.X500Name import org.bouncycastle.cert.X509CertificateHolder diff --git a/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt b/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt index c802831d0f..32a8a20a21 100644 --- a/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt +++ b/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt @@ -1,16 +1,12 @@ package net.corda.core.node -import net.corda.core.crypto.locationOrNull import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.ServiceType -import net.corda.core.schemas.MappedSchema -import net.corda.core.schemas.NodeInfoSchemaV1 import net.corda.core.serialization.CordaSerializable import net.corda.core.utilities.NetworkHostAndPort -import net.corda.core.utilities.NonEmptySet -import net.corda.core.serialization.serialize +import net.corda.core.utilities.locationOrNull /** * Information for an advertised service including the service specific identity information. diff --git a/core/src/main/kotlin/net/corda/core/schemas/CommonSchema.kt b/core/src/main/kotlin/net/corda/core/schemas/CommonSchema.kt index 5a55d9cc92..0f9d985791 100644 --- a/core/src/main/kotlin/net/corda/core/schemas/CommonSchema.kt +++ b/core/src/main/kotlin/net/corda/core/schemas/CommonSchema.kt @@ -4,7 +4,6 @@ import net.corda.core.contracts.ContractState import net.corda.core.contracts.FungibleAsset import net.corda.core.contracts.OwnableState import net.corda.core.contracts.UniqueIdentifier -import net.corda.core.crypto.toBase58String import net.corda.core.identity.AbstractParty import java.util.* import javax.persistence.* diff --git a/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt b/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt index f0d21aeaf3..1c7e6ffa31 100644 --- a/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt +++ b/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt @@ -1,28 +1,15 @@ package net.corda.core.schemas -import net.corda.core.crypto.toBase58String import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.NodeInfo import net.corda.core.node.ServiceEntry import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.toBase58String import java.io.Serializable import java.security.cert.CertPath -import javax.persistence.CascadeType -import javax.persistence.Column -import javax.persistence.ElementCollection -import javax.persistence.Embeddable -import javax.persistence.EmbeddedId -import javax.persistence.Entity -import javax.persistence.GeneratedValue -import javax.persistence.Id -import javax.persistence.JoinColumn -import javax.persistence.JoinTable -import javax.persistence.Lob -import javax.persistence.ManyToMany -import javax.persistence.OneToMany -import javax.persistence.Table +import javax.persistence.* object NodeInfoSchema diff --git a/core/src/main/kotlin/net/corda/core/transactions/NotaryChangeTransactions.kt b/core/src/main/kotlin/net/corda/core/transactions/NotaryChangeTransactions.kt index 705e5553ca..0148421383 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/NotaryChangeTransactions.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/NotaryChangeTransactions.kt @@ -3,7 +3,7 @@ package net.corda.core.transactions import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash import net.corda.core.crypto.TransactionSignature -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.identity.Party import net.corda.core.node.ServiceHub import java.security.PublicKey diff --git a/core/src/main/kotlin/net/corda/core/crypto/EncodingUtils.kt b/core/src/main/kotlin/net/corda/core/utilities/EncodingUtils.kt similarity index 96% rename from core/src/main/kotlin/net/corda/core/crypto/EncodingUtils.kt rename to core/src/main/kotlin/net/corda/core/utilities/EncodingUtils.kt index 0219142656..1cc4e53807 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/EncodingUtils.kt +++ b/core/src/main/kotlin/net/corda/core/utilities/EncodingUtils.kt @@ -1,7 +1,9 @@ @file:JvmName("EncodingUtils") -package net.corda.core.crypto +package net.corda.core.utilities +import net.corda.core.crypto.Base58 +import net.corda.core.crypto.sha256 import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import java.nio.charset.Charset diff --git a/core/src/main/kotlin/net/corda/core/utilities/LegalNameValidator.kt b/core/src/main/kotlin/net/corda/core/utilities/LegalNameValidator.kt index bea9a6241d..f03ff70048 100644 --- a/core/src/main/kotlin/net/corda/core/utilities/LegalNameValidator.kt +++ b/core/src/main/kotlin/net/corda/core/utilities/LegalNameValidator.kt @@ -2,7 +2,6 @@ package net.corda.core.utilities -import net.corda.core.crypto.commonName import org.bouncycastle.asn1.x500.X500Name import java.lang.Character.UnicodeScript.* import java.text.Normalizer diff --git a/core/src/main/kotlin/net/corda/core/crypto/X500NameUtils.kt b/core/src/main/kotlin/net/corda/core/utilities/X500NameUtils.kt similarity index 98% rename from core/src/main/kotlin/net/corda/core/crypto/X500NameUtils.kt rename to core/src/main/kotlin/net/corda/core/utilities/X500NameUtils.kt index 6edd82ca93..74a08ce4fa 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/X500NameUtils.kt +++ b/core/src/main/kotlin/net/corda/core/utilities/X500NameUtils.kt @@ -1,5 +1,5 @@ @file:JvmName("X500NameUtils") -package net.corda.core.crypto +package net.corda.core.utilities import net.corda.core.internal.toX509CertHolder import org.bouncycastle.asn1.ASN1Encodable diff --git a/core/src/test/kotlin/net/corda/core/contracts/TransactionTests.kt b/core/src/test/kotlin/net/corda/core/contracts/TransactionTests.kt index c6c508b988..c307dc99d0 100644 --- a/core/src/test/kotlin/net/corda/core/contracts/TransactionTests.kt +++ b/core/src/test/kotlin/net/corda/core/contracts/TransactionTests.kt @@ -1,7 +1,7 @@ package net.corda.core.contracts import net.corda.core.crypto.* -import net.corda.core.crypto.composite.CompositeKey +import net.corda.core.crypto.CompositeKey import net.corda.core.identity.Party import net.corda.core.transactions.LedgerTransaction import net.corda.core.transactions.SignedTransaction diff --git a/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt b/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt index 3d8c3f5954..38b75bd2f0 100644 --- a/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt +++ b/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt @@ -1,12 +1,12 @@ package net.corda.core.crypto -import net.corda.core.crypto.composite.CompositeKey -import net.corda.core.crypto.composite.CompositeKey.NodeAndWeight -import net.corda.core.crypto.composite.CompositeSignature +import net.corda.core.crypto.CompositeKey.NodeAndWeight import net.corda.core.internal.declaredField import net.corda.core.internal.div import net.corda.core.serialization.serialize import net.corda.core.utilities.OpaqueBytes +import net.corda.core.utilities.cert +import net.corda.core.utilities.toBase58String import net.corda.node.utilities.* import net.corda.testing.TestDependencyInjectionBase import net.corda.testing.kryoSpecific @@ -88,7 +88,7 @@ class CompositeKeyTests : TestDependencyInjectionBase() { val aliceAndBobOrCharlie = CompositeKey.Builder().addKeys(aliceAndBob, charliePublicKey).build(threshold = 1) val encoded = aliceAndBobOrCharlie.toBase58String() - val decoded = parsePublicKeyBase58(encoded) + val decoded = net.corda.core.utilities.parsePublicKeyBase58(encoded) assertEquals(decoded, aliceAndBobOrCharlie) } diff --git a/core/src/test/kotlin/net/corda/core/crypto/X509NameConstraintsTest.kt b/core/src/test/kotlin/net/corda/core/crypto/X509NameConstraintsTest.kt index 8d2589119c..82bf9edacd 100644 --- a/core/src/test/kotlin/net/corda/core/crypto/X509NameConstraintsTest.kt +++ b/core/src/test/kotlin/net/corda/core/crypto/X509NameConstraintsTest.kt @@ -1,6 +1,7 @@ package net.corda.core.crypto import net.corda.core.internal.toTypedArray +import net.corda.core.utilities.cert import net.corda.node.utilities.* import org.bouncycastle.asn1.x500.X500Name import org.bouncycastle.asn1.x509.GeneralName @@ -18,13 +19,13 @@ class X509NameConstraintsTest { private fun makeKeyStores(subjectName: X500Name, nameConstraints: NameConstraints): Pair { val rootKeys = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val rootCACert = X509Utilities.createSelfSignedCACertificate(getX509Name("Corda Root CA", "London", "demo@r3.com", null), rootKeys) + val rootCACert = X509Utilities.createSelfSignedCACertificate(net.corda.core.utilities.getX509Name("Corda Root CA", "London", "demo@r3.com", null), rootKeys) val intermediateCAKeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val intermediateCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, rootCACert, rootKeys, getX509Name("Corda Intermediate CA", "London", "demo@r3.com", null), intermediateCAKeyPair.public) + val intermediateCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, rootCACert, rootKeys, net.corda.core.utilities.getX509Name("Corda Intermediate CA", "London", "demo@r3.com", null), intermediateCAKeyPair.public) val clientCAKeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val clientCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, intermediateCACert, intermediateCAKeyPair, getX509Name("Corda Client CA", "London", "demo@r3.com", null), clientCAKeyPair.public, nameConstraints = nameConstraints) + val clientCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, intermediateCACert, intermediateCAKeyPair, net.corda.core.utilities.getX509Name("Corda Client CA", "London", "demo@r3.com", null), clientCAKeyPair.public, nameConstraints = nameConstraints) val keyPass = "password" val trustStore = KeyStore.getInstance(KEYSTORE_TYPE) diff --git a/core/src/test/kotlin/net/corda/core/crypto/EncodingUtilsTest.kt b/core/src/test/kotlin/net/corda/core/utilities/EncodingUtilsTest.kt similarity index 97% rename from core/src/test/kotlin/net/corda/core/crypto/EncodingUtilsTest.kt rename to core/src/test/kotlin/net/corda/core/utilities/EncodingUtilsTest.kt index ae76f6e825..e3a6d0abaf 100644 --- a/core/src/test/kotlin/net/corda/core/crypto/EncodingUtilsTest.kt +++ b/core/src/test/kotlin/net/corda/core/utilities/EncodingUtilsTest.kt @@ -1,5 +1,6 @@ -package net.corda.core.crypto +package net.corda.core.utilities +import net.corda.core.crypto.AddressFormatException import org.junit.Test import kotlin.test.assertEquals import kotlin.test.fail diff --git a/experimental/src/main/kotlin/net/corda/finance/contracts/universal/PrettyPrint.kt b/experimental/src/main/kotlin/net/corda/finance/contracts/universal/PrettyPrint.kt index 615316a6bb..2ab265e3e2 100644 --- a/experimental/src/main/kotlin/net/corda/finance/contracts/universal/PrettyPrint.kt +++ b/experimental/src/main/kotlin/net/corda/finance/contracts/universal/PrettyPrint.kt @@ -1,6 +1,6 @@ package net.corda.finance.contracts.universal -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.crypto.toStringShort import net.corda.core.identity.Party import java.math.BigDecimal diff --git a/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java b/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java index adbf96754c..b782eb7bd9 100644 --- a/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java +++ b/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java @@ -3,7 +3,7 @@ package net.corda.finance.contracts; import co.paralleluniverse.fibers.Suspendable; import kotlin.Unit; import net.corda.core.contracts.*; -import net.corda.core.crypto.testing.NullPublicKey; +import net.corda.core.crypto.NullKeys.NullPublicKey; import net.corda.core.identity.AbstractParty; import net.corda.core.identity.AnonymousParty; import net.corda.core.identity.Party; diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/CommercialPaper.kt b/finance/src/main/kotlin/net/corda/finance/contracts/CommercialPaper.kt index c05cc175a6..1cc8139b9c 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/CommercialPaper.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/CommercialPaper.kt @@ -2,8 +2,8 @@ package net.corda.finance.contracts import co.paralleluniverse.fibers.Suspendable import net.corda.core.contracts.* -import net.corda.core.crypto.testing.NULL_PARTY -import net.corda.core.crypto.toBase58String +import net.corda.core.crypto.NullKeys.NULL_PARTY +import net.corda.core.utilities.toBase58String import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.internal.Emoji diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt index 792e8e6fdb..411c9e4e08 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt @@ -6,8 +6,8 @@ import net.corda.finance.contracts.asset.cash.selection.CashSelectionH2Impl import net.corda.core.contracts.* import net.corda.core.contracts.Amount.Companion.sumOrThrow import net.corda.core.crypto.entropyToKeyPair -import net.corda.core.crypto.testing.NULL_PARTY -import net.corda.core.crypto.toBase58String +import net.corda.core.crypto.NullKeys.NULL_PARTY +import net.corda.core.utilities.toBase58String import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.internal.Emoji diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2Impl.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2Impl.kt index 0ef6053ec2..5687027c3a 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2Impl.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2Impl.kt @@ -7,7 +7,7 @@ import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.StateRef import net.corda.core.contracts.TransactionState import net.corda.core.crypto.SecureHash -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.node.ServiceHub diff --git a/finance/src/test/kotlin/net/corda/finance/contracts/asset/DummyFungibleContract.kt b/finance/src/test/kotlin/net/corda/finance/contracts/asset/DummyFungibleContract.kt index 9817e20a70..330c5ee4e9 100644 --- a/finance/src/test/kotlin/net/corda/finance/contracts/asset/DummyFungibleContract.kt +++ b/finance/src/test/kotlin/net/corda/finance/contracts/asset/DummyFungibleContract.kt @@ -1,7 +1,7 @@ package net.corda.finance.contracts.asset import net.corda.core.contracts.* -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.identity.AbstractParty import net.corda.core.internal.Emoji import net.corda.core.schemas.MappedSchema diff --git a/finance/src/test/kotlin/net/corda/finance/contracts/asset/ObligationTests.kt b/finance/src/test/kotlin/net/corda/finance/contracts/asset/ObligationTests.kt index de7d0e68d5..7bd7fbe4e6 100644 --- a/finance/src/test/kotlin/net/corda/finance/contracts/asset/ObligationTests.kt +++ b/finance/src/test/kotlin/net/corda/finance/contracts/asset/ObligationTests.kt @@ -3,7 +3,7 @@ package net.corda.finance.contracts.asset import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash import net.corda.core.crypto.sha256 -import net.corda.core.crypto.testing.NULL_PARTY +import net.corda.core.crypto.NullKeys.NULL_PARTY import net.corda.core.identity.AbstractParty import net.corda.core.identity.AnonymousParty import net.corda.core.transactions.TransactionBuilder diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/ArtemisMessagingComponent.kt b/node-api/src/main/kotlin/net/corda/nodeapi/ArtemisMessagingComponent.kt index f1ad6582a1..7c87c19cbb 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/ArtemisMessagingComponent.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/ArtemisMessagingComponent.kt @@ -1,6 +1,6 @@ package net.corda.nodeapi -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.messaging.MessageRecipientGroup import net.corda.core.messaging.MessageRecipients import net.corda.core.messaging.SingleMessageRecipient diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultKryoCustomizer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultKryoCustomizer.kt index 9cb3b8ea57..13d0d08f5b 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultKryoCustomizer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultKryoCustomizer.kt @@ -11,7 +11,7 @@ import de.javakaffee.kryoserializers.BitSetSerializer import de.javakaffee.kryoserializers.UnmodifiableCollectionsSerializer import de.javakaffee.kryoserializers.guava.* import net.corda.core.contracts.PrivacySalt -import net.corda.core.crypto.composite.CompositeKey +import net.corda.core.crypto.CompositeKey import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.CordaPluginRegistry import net.corda.core.serialization.SerializeAsToken diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/Kryo.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/Kryo.kt index 02c242447b..562c321053 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/Kryo.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/Kryo.kt @@ -11,7 +11,7 @@ import net.corda.core.contracts.* import net.corda.core.crypto.Crypto import net.corda.core.crypto.SecureHash import net.corda.core.crypto.TransactionSignature -import net.corda.core.crypto.composite.CompositeKey +import net.corda.core.crypto.CompositeKey import net.corda.core.identity.Party import net.corda.core.internal.VisibleForTesting import net.corda.core.serialization.AttachmentsClassLoader diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt index 734fd325c5..6a506685c6 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt @@ -2,7 +2,7 @@ package net.corda.nodeapi.internal.serialization.amqp import com.google.common.hash.Hasher import com.google.common.hash.Hashing -import net.corda.core.crypto.toBase64 +import net.corda.core.utilities.toBase64 import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.loggerFor import org.apache.qpid.proton.amqp.DescribedType diff --git a/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt index 33d33d4740..72c3f7d9f9 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt @@ -3,7 +3,7 @@ package net.corda.node.services import com.nhaarman.mockito_kotlin.whenever import net.corda.core.contracts.ContractState import net.corda.core.contracts.StateRef -import net.corda.core.crypto.composite.CompositeKey +import net.corda.core.crypto.CompositeKey import net.corda.core.flows.NotaryError import net.corda.core.flows.NotaryException import net.corda.core.flows.NotaryFlow diff --git a/node/src/integration-test/kotlin/net/corda/services/messaging/MQSecurityTest.kt b/node/src/integration-test/kotlin/net/corda/services/messaging/MQSecurityTest.kt index b16f87f806..af40eb7adf 100644 --- a/node/src/integration-test/kotlin/net/corda/services/messaging/MQSecurityTest.kt +++ b/node/src/integration-test/kotlin/net/corda/services/messaging/MQSecurityTest.kt @@ -3,7 +3,7 @@ package net.corda.services.messaging import co.paralleluniverse.fibers.Suspendable import net.corda.client.rpc.CordaRPCClient import net.corda.core.crypto.generateKeyPair -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.flows.FlowLogic import net.corda.core.flows.InitiatedBy import net.corda.core.flows.InitiatingFlow diff --git a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt index 788d76ae00..245df87f74 100644 --- a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt +++ b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt @@ -2,7 +2,7 @@ package net.corda.services.messaging import com.nhaarman.mockito_kotlin.whenever import net.corda.core.concurrent.CordaFuture -import net.corda.core.crypto.cert +import net.corda.core.utilities.cert import net.corda.core.crypto.random63BitValue import net.corda.core.node.NodeInfo import net.corda.core.utilities.seconds diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index ac23a25dff..eccca6e7fb 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -24,9 +24,7 @@ import net.corda.core.node.services.NetworkMapCache.MapChange import net.corda.core.serialization.SerializeAsToken import net.corda.core.serialization.SingletonSerializeAsToken import net.corda.core.transactions.SignedTransaction -import net.corda.core.utilities.NetworkHostAndPort -import net.corda.core.utilities.debug -import net.corda.core.utilities.toNonEmptySet +import net.corda.core.utilities.* import net.corda.node.services.ContractUpgradeHandler import net.corda.node.services.NotaryChangeHandler import net.corda.node.services.NotifyTransactionHandler diff --git a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt index d1ca8d751e..294c57562e 100644 --- a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt +++ b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt @@ -3,8 +3,8 @@ package net.corda.node.internal import com.jcabi.manifests.Manifests import com.typesafe.config.ConfigException import joptsimple.OptionException -import net.corda.core.crypto.commonName -import net.corda.core.crypto.orgName +import net.corda.core.utilities.commonName +import net.corda.core.utilities.orgName import net.corda.core.internal.concurrent.thenMatch import net.corda.core.internal.createDirectories import net.corda.core.internal.div @@ -12,11 +12,9 @@ import net.corda.core.internal.* import net.corda.core.node.services.ServiceInfo import net.corda.core.utilities.loggerFor import net.corda.node.* -import net.corda.node.serialization.NodeClock import net.corda.node.services.config.FullNodeConfiguration import net.corda.node.services.transactions.bftSMaRtSerialFilter import net.corda.node.shell.InteractiveShell -import net.corda.node.utilities.TestClock import net.corda.node.utilities.registration.HTTPNetworkRegistrationService import net.corda.node.utilities.registration.NetworkRegistrationHelper import net.corda.nodeapi.internal.addShutdownHook diff --git a/node/src/main/kotlin/net/corda/node/services/identity/InMemoryIdentityService.kt b/node/src/main/kotlin/net/corda/node/services/identity/InMemoryIdentityService.kt index 80812edd1e..3be29e3d2f 100644 --- a/node/src/main/kotlin/net/corda/node/services/identity/InMemoryIdentityService.kt +++ b/node/src/main/kotlin/net/corda/node/services/identity/InMemoryIdentityService.kt @@ -1,7 +1,7 @@ package net.corda.node.services.identity import net.corda.core.contracts.PartyAndReference -import net.corda.core.crypto.cert +import net.corda.core.utilities.cert import net.corda.core.crypto.toStringShort import net.corda.core.identity.AbstractParty import net.corda.core.identity.AnonymousParty diff --git a/node/src/main/kotlin/net/corda/node/services/keys/KMSUtils.kt b/node/src/main/kotlin/net/corda/node/services/keys/KMSUtils.kt index 367f79eb3e..00b293c539 100644 --- a/node/src/main/kotlin/net/corda/node/services/keys/KMSUtils.kt +++ b/node/src/main/kotlin/net/corda/node/services/keys/KMSUtils.kt @@ -1,7 +1,7 @@ package net.corda.node.services.keys import net.corda.core.crypto.Crypto -import net.corda.core.crypto.cert +import net.corda.core.utilities.cert import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.services.IdentityService import net.corda.core.utilities.days diff --git a/node/src/main/kotlin/net/corda/node/services/keys/PersistentKeyManagementService.kt b/node/src/main/kotlin/net/corda/node/services/keys/PersistentKeyManagementService.kt index 95c4e0083e..5117edd8c1 100644 --- a/node/src/main/kotlin/net/corda/node/services/keys/PersistentKeyManagementService.kt +++ b/node/src/main/kotlin/net/corda/node/services/keys/PersistentKeyManagementService.kt @@ -8,6 +8,8 @@ import net.corda.core.serialization.SerializationDefaults import net.corda.core.serialization.SingletonSerializeAsToken import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize +import net.corda.core.utilities.parsePublicKeyBase58 +import net.corda.core.utilities.toBase58String import net.corda.node.utilities.AppendOnlyPersistentMap import net.corda.node.utilities.NODE_DATABASE_PREFIX import org.bouncycastle.operator.ContentSigner diff --git a/node/src/main/kotlin/net/corda/node/services/messaging/ArtemisMessagingServer.kt b/node/src/main/kotlin/net/corda/node/services/messaging/ArtemisMessagingServer.kt index 49ff18c942..2e375d78f9 100644 --- a/node/src/main/kotlin/net/corda/node/services/messaging/ArtemisMessagingServer.kt +++ b/node/src/main/kotlin/net/corda/node/services/messaging/ArtemisMessagingServer.kt @@ -5,7 +5,7 @@ import io.netty.handler.ssl.SslHandler import net.corda.core.concurrent.CordaFuture import net.corda.core.crypto.AddressFormatException import net.corda.core.crypto.newSecureRandom -import net.corda.core.crypto.parsePublicKeyBase58 +import net.corda.core.utilities.parsePublicKeyBase58 import net.corda.core.crypto.random63BitValue import net.corda.core.internal.ThreadBox import net.corda.core.internal.concurrent.openFuture diff --git a/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt b/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt index 74a437817b..fe94236791 100644 --- a/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt +++ b/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt @@ -1,12 +1,10 @@ package net.corda.node.services.network import net.corda.core.concurrent.CordaFuture -import net.corda.core.internal.bufferUntilSubscribed -import net.corda.core.crypto.parsePublicKeyBase58 -import net.corda.core.crypto.toBase58String import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.internal.VisibleForTesting +import net.corda.core.internal.bufferUntilSubscribed import net.corda.core.internal.concurrent.map import net.corda.core.internal.concurrent.openFuture import net.corda.core.messaging.DataFeed @@ -20,6 +18,8 @@ import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.loggerFor +import net.corda.core.utilities.parsePublicKeyBase58 +import net.corda.core.utilities.toBase58String import net.corda.node.services.api.NetworkCacheError import net.corda.node.services.api.NetworkMapCacheInternal import net.corda.node.services.api.ServiceHubInternal diff --git a/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapService.kt b/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapService.kt index 2409d8a178..f62748dcba 100644 --- a/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapService.kt +++ b/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapService.kt @@ -1,6 +1,6 @@ package net.corda.node.services.network -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.identity.PartyAndCertificate import net.corda.core.internal.ThreadBox import net.corda.core.messaging.SingleMessageRecipient diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt b/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt index 7917753403..70c7cde877 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/BFTNonValidatingNotaryService.kt @@ -14,10 +14,7 @@ import net.corda.core.schemas.PersistentStateRef import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import net.corda.core.transactions.FilteredTransaction -import net.corda.core.utilities.debug -import net.corda.core.utilities.getOrThrow -import net.corda.core.utilities.loggerFor -import net.corda.core.utilities.unwrap +import net.corda.core.utilities.* import net.corda.node.services.api.ServiceHubInternal import net.corda.node.utilities.AppendOnlyPersistentMap import net.corda.node.utilities.NODE_DATABASE_PREFIX diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/PersistentUniquenessProvider.kt b/node/src/main/kotlin/net/corda/node/services/transactions/PersistentUniquenessProvider.kt index 8c4d0f18e1..507b3d65e2 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/PersistentUniquenessProvider.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/PersistentUniquenessProvider.kt @@ -2,8 +2,8 @@ package net.corda.node.services.transactions import net.corda.core.contracts.StateRef import net.corda.core.crypto.SecureHash -import net.corda.core.crypto.parsePublicKeyBase58 -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.parsePublicKeyBase58 +import net.corda.core.utilities.toBase58String import net.corda.core.identity.Party import net.corda.core.internal.ThreadBox import net.corda.core.node.services.UniquenessException diff --git a/node/src/main/kotlin/net/corda/node/shell/FlowWatchPrintingSubscriber.kt b/node/src/main/kotlin/net/corda/node/shell/FlowWatchPrintingSubscriber.kt index 7211d06d9b..fc03f127e4 100644 --- a/node/src/main/kotlin/net/corda/node/shell/FlowWatchPrintingSubscriber.kt +++ b/node/src/main/kotlin/net/corda/node/shell/FlowWatchPrintingSubscriber.kt @@ -1,6 +1,6 @@ package net.corda.node.shell -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.flows.FlowInitiator import net.corda.core.flows.StateMachineRunId import net.corda.core.internal.concurrent.openFuture diff --git a/node/src/main/kotlin/net/corda/node/utilities/KeyStoreUtilities.kt b/node/src/main/kotlin/net/corda/node/utilities/KeyStoreUtilities.kt index fbe2947a70..cfd2381b60 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/KeyStoreUtilities.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/KeyStoreUtilities.kt @@ -1,8 +1,8 @@ package net.corda.node.utilities -import net.corda.core.crypto.CertificateAndKeyPair +import net.corda.core.utilities.CertificateAndKeyPair import net.corda.core.crypto.Crypto -import net.corda.core.crypto.cert +import net.corda.core.utilities.cert import net.corda.core.internal.exists import net.corda.core.internal.read import net.corda.core.internal.toX509CertHolder diff --git a/node/src/main/kotlin/net/corda/node/utilities/ServiceIdentityGenerator.kt b/node/src/main/kotlin/net/corda/node/utilities/ServiceIdentityGenerator.kt index fc87226b3d..81d10b45b6 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/ServiceIdentityGenerator.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/ServiceIdentityGenerator.kt @@ -1,6 +1,6 @@ package net.corda.node.utilities -import net.corda.core.crypto.composite.CompositeKey +import net.corda.core.crypto.CompositeKey import net.corda.core.crypto.generateKeyPair import net.corda.core.identity.Party import net.corda.core.utilities.loggerFor diff --git a/node/src/main/kotlin/net/corda/node/utilities/X509Utilities.kt b/node/src/main/kotlin/net/corda/node/utilities/X509Utilities.kt index f10261826f..50fc141b80 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/X509Utilities.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/X509Utilities.kt @@ -1,6 +1,7 @@ package net.corda.node.utilities import net.corda.core.crypto.* +import net.corda.core.utilities.cert import net.corda.core.utilities.days import net.corda.core.utilities.millis import org.bouncycastle.asn1.ASN1EncodableVector diff --git a/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt b/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt index 268b89fa53..02ef6fb12c 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt @@ -1,7 +1,7 @@ package net.corda.node.utilities.registration import net.corda.core.crypto.Crypto -import net.corda.core.crypto.cert +import net.corda.core.utilities.cert import net.corda.core.internal.* import net.corda.core.utilities.seconds import net.corda.core.utilities.validateX500Name diff --git a/node/src/test/java/net/corda/node/services/vault/VaultQueryJavaTests.java b/node/src/test/java/net/corda/node/services/vault/VaultQueryJavaTests.java index 32e23b99e5..e14acce986 100644 --- a/node/src/test/java/net/corda/node/services/vault/VaultQueryJavaTests.java +++ b/node/src/test/java/net/corda/node/services/vault/VaultQueryJavaTests.java @@ -4,7 +4,6 @@ import com.google.common.collect.ImmutableSet; import kotlin.Pair; import kotlin.Triple; import net.corda.core.contracts.*; -import net.corda.core.crypto.EncodingUtils; import net.corda.core.identity.AbstractParty; import net.corda.core.messaging.DataFeed; import net.corda.core.node.services.IdentityService; @@ -16,6 +15,7 @@ import net.corda.core.node.services.vault.QueryCriteria.LinearStateQueryCriteria import net.corda.core.node.services.vault.QueryCriteria.VaultCustomQueryCriteria; import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria; import net.corda.core.schemas.MappedSchema; +import net.corda.core.utilities.EncodingUtils; import net.corda.core.utilities.OpaqueBytes; import net.corda.finance.contracts.DealState; import net.corda.finance.contracts.asset.Cash; diff --git a/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt b/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt index 6aead9af9e..58be899e35 100644 --- a/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt @@ -1,6 +1,6 @@ package net.corda.node.services.config -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.utilities.NetworkHostAndPort import net.corda.testing.ALICE import net.corda.nodeapi.User diff --git a/node/src/test/kotlin/net/corda/node/services/network/InMemoryIdentityServiceTests.kt b/node/src/test/kotlin/net/corda/node/services/network/InMemoryIdentityServiceTests.kt index c7809739fb..ba1993cbd4 100644 --- a/node/src/test/kotlin/net/corda/node/services/network/InMemoryIdentityServiceTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/network/InMemoryIdentityServiceTests.kt @@ -1,8 +1,8 @@ package net.corda.node.services.network -import net.corda.core.crypto.CertificateAndKeyPair +import net.corda.core.utilities.CertificateAndKeyPair import net.corda.core.crypto.Crypto -import net.corda.core.crypto.cert +import net.corda.core.utilities.cert import net.corda.core.crypto.generateKeyPair import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party diff --git a/node/src/test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt b/node/src/test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt index b5dae10615..06d4f37a54 100644 --- a/node/src/test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/network/PersistentNetworkMapCacheTest.kt @@ -1,7 +1,6 @@ package net.corda.node.services.network import co.paralleluniverse.fibers.Suspendable -import net.corda.core.crypto.toBase58String import net.corda.core.flows.FlowLogic import net.corda.core.flows.InitiatedBy import net.corda.core.flows.InitiatingFlow @@ -10,6 +9,7 @@ import net.corda.core.node.NodeInfo import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.getOrThrow import net.corda.core.utilities.seconds +import net.corda.core.utilities.toBase58String import net.corda.core.utilities.unwrap import net.corda.node.internal.Node import net.corda.testing.ALICE diff --git a/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt b/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt index f1fd90b136..a11454dc13 100644 --- a/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/persistence/HibernateConfigurationTest.kt @@ -5,7 +5,7 @@ import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.StateRef import net.corda.core.contracts.TransactionState import net.corda.core.crypto.SecureHash -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.node.services.Vault import net.corda.core.node.services.VaultService import net.corda.core.schemas.CommonSchemaV1 diff --git a/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt b/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt index 10644b508e..b1516a14ea 100644 --- a/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt @@ -3,7 +3,7 @@ package net.corda.node.services.vault import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash import net.corda.core.crypto.entropyToKeyPair -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.services.* diff --git a/node/src/test/kotlin/net/corda/node/utilities/X509UtilitiesTest.kt b/node/src/test/kotlin/net/corda/node/utilities/X509UtilitiesTest.kt index 2c528cbfd5..a3ca17f2c5 100644 --- a/node/src/test/kotlin/net/corda/node/utilities/X509UtilitiesTest.kt +++ b/node/src/test/kotlin/net/corda/node/utilities/X509UtilitiesTest.kt @@ -3,9 +3,9 @@ package net.corda.node.utilities import net.corda.core.crypto.Crypto import net.corda.core.crypto.Crypto.EDDSA_ED25519_SHA512 import net.corda.core.crypto.Crypto.generateKeyPair -import net.corda.core.crypto.cert -import net.corda.core.crypto.commonName -import net.corda.core.crypto.getX509Name +import net.corda.core.utilities.cert +import net.corda.core.utilities.commonName +import net.corda.core.utilities.getX509Name import net.corda.core.internal.div import net.corda.core.internal.toTypedArray import net.corda.core.serialization.SerializationContext diff --git a/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkisRegistrationHelperTest.kt b/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkisRegistrationHelperTest.kt index da5569e280..eca0695b11 100644 --- a/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkisRegistrationHelperTest.kt +++ b/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkisRegistrationHelperTest.kt @@ -5,8 +5,8 @@ import com.nhaarman.mockito_kotlin.eq import com.nhaarman.mockito_kotlin.mock import net.corda.core.crypto.Crypto import net.corda.core.crypto.SecureHash -import net.corda.core.crypto.cert -import net.corda.core.crypto.commonName +import net.corda.core.utilities.cert +import net.corda.core.utilities.commonName import net.corda.core.internal.exists import net.corda.core.internal.toTypedArray import net.corda.core.internal.toX509CertHolder diff --git a/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt b/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt index 877ae7dd67..7ca5de5d61 100644 --- a/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt +++ b/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt @@ -3,7 +3,7 @@ package net.corda.irs.flows import co.paralleluniverse.fibers.Suspendable import net.corda.core.contracts.* import net.corda.core.crypto.TransactionSignature -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.flows.FlowLogic import net.corda.core.flows.InitiatedBy import net.corda.core.flows.InitiatingFlow diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt index 93fa4b4e95..9836dd1a09 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt @@ -11,7 +11,7 @@ import javafx.scene.input.KeyCodeCombination import javafx.scene.layout.VBox import javafx.stage.Stage import javafx.util.Duration -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.serialization.deserialize import net.corda.core.utilities.ProgressTracker import net.corda.netmap.VisualiserViewModel.Style diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt index d726b836d1..954359b89e 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt @@ -7,7 +7,7 @@ import javafx.scene.layout.StackPane import javafx.scene.shape.Circle import javafx.scene.shape.Line import javafx.util.Duration -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.node.ScreenCoordinate import net.corda.core.utilities.ProgressTracker import net.corda.netmap.simulation.IRSSimulation diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt index b8fcc78b5b..e5e635dc93 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt @@ -1,7 +1,7 @@ package net.corda.netmap.simulation import net.corda.core.concurrent.CordaFuture -import net.corda.core.crypto.locationOrNull +import net.corda.core.utilities.locationOrNull import net.corda.core.flows.FlowLogic import net.corda.core.messaging.SingleMessageRecipient import net.corda.core.node.CityDatabase diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt index f0f5279def..276bb07baf 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt @@ -1,6 +1,6 @@ package net.corda.notarydemo -import net.corda.core.crypto.appendToCommonName +import net.corda.core.utilities.appendToCommonName import net.corda.core.internal.div import net.corda.core.node.services.ServiceInfo import net.corda.testing.ALICE diff --git a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApi.kt b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApi.kt index 66dd387c22..a5bd412d7a 100644 --- a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApi.kt +++ b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApi.kt @@ -2,8 +2,8 @@ package net.corda.vega.api import com.opengamma.strata.basics.currency.MultiCurrencyAmount import net.corda.core.contracts.StateAndRef -import net.corda.core.crypto.parsePublicKeyBase58 -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.parsePublicKeyBase58 +import net.corda.core.utilities.toBase58String import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.messaging.CordaRPCOps diff --git a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApiUtils.kt b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApiUtils.kt index fb13e86d76..80201333b0 100644 --- a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApiUtils.kt +++ b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApiUtils.kt @@ -5,10 +5,10 @@ import com.opengamma.strata.product.swap.IborRateCalculation import com.opengamma.strata.product.swap.RateCalculationSwapLeg import com.opengamma.strata.product.swap.SwapLegType import net.corda.core.contracts.hash -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.messaging.CordaRPCOps import net.corda.vega.contracts.IRSState import net.corda.vega.contracts.PortfolioState diff --git a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/SwapData.kt b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/SwapData.kt index 09e5d9cbf4..c27a6d4ef0 100644 --- a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/SwapData.kt +++ b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/contracts/SwapData.kt @@ -10,7 +10,7 @@ import com.opengamma.strata.product.swap.SwapTrade import com.opengamma.strata.product.swap.type.FixedIborSwapConvention import com.opengamma.strata.product.swap.type.FixedIborSwapConventions import net.corda.core.identity.AbstractParty -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.core.serialization.CordaSerializable import java.math.BigDecimal import java.security.PublicKey diff --git a/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt b/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt index 0df543cd5c..a5de6c5344 100644 --- a/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt +++ b/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt @@ -5,7 +5,7 @@ import com.typesafe.config.ConfigFactory.empty import com.typesafe.config.ConfigRenderOptions import com.typesafe.config.ConfigValue import com.typesafe.config.ConfigValueFactory -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.nodeapi.User import org.bouncycastle.asn1.x500.X500Name diff --git a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt index dc98d58f81..fc921d0acd 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt @@ -12,9 +12,7 @@ import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.ServiceHub import net.corda.core.node.services.IdentityService import net.corda.core.transactions.TransactionBuilder -import net.corda.core.utilities.NetworkHostAndPort -import net.corda.core.utilities.OpaqueBytes -import net.corda.core.utilities.loggerFor +import net.corda.core.utilities.* import net.corda.finance.contracts.asset.DUMMY_CASH_ISSUER import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.config.VerifierType diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt b/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt index 319dba7157..77f65fa25d 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt @@ -4,7 +4,7 @@ package net.corda.testing import net.corda.core.contracts.Command import net.corda.core.contracts.TypeOnlyCommandData -import net.corda.core.crypto.CertificateAndKeyPair +import net.corda.core.utilities.CertificateAndKeyPair import net.corda.core.crypto.entropyToKeyPair import net.corda.core.crypto.generateKeyPair import net.corda.core.identity.Party diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt b/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt index 6f20725bbb..c641c69b67 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt @@ -2,8 +2,8 @@ package net.corda.testing import net.corda.core.contracts.* import net.corda.core.crypto.* -import net.corda.core.crypto.composite.expandedCompositeKeys -import net.corda.core.crypto.testing.NULL_SIGNATURE +import net.corda.core.crypto.NullKeys.NULL_SIGNATURE +import net.corda.core.crypto.CompositeKey import net.corda.core.identity.Party import net.corda.core.node.ServiceHub import net.corda.core.transactions.SignedTransaction @@ -342,6 +342,14 @@ data class TestLedgerDSLInterpreter private constructor( val transactionsUnverified: List get() = nonVerifiedTransactionWithLocations.values.map { it.transaction } } +/** + * Expands all [CompositeKey]s present in PublicKey iterable to set of single [PublicKey]s. + * If an element of the set is a single PublicKey it gives just that key, if it is a [CompositeKey] it returns all leaf + * keys for that composite element. + */ +val Iterable.expandedCompositeKeys: Set + get() = flatMap { it.keys }.toSet() + /** * Signs all transactions passed in. * @param transactionsToSign Transactions to be signed. diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt index c22b5fb32d..58e333413d 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -11,9 +11,9 @@ import net.corda.cordform.CordformNode import net.corda.cordform.NodeDefinition import net.corda.core.concurrent.CordaFuture import net.corda.core.concurrent.firstOf -import net.corda.core.crypto.appendToCommonName -import net.corda.core.crypto.commonName -import net.corda.core.crypto.getX509Name +import net.corda.core.utilities.appendToCommonName +import net.corda.core.utilities.commonName +import net.corda.core.utilities.getX509Name import net.corda.core.identity.Party import net.corda.core.internal.ThreadBox import net.corda.core.internal.concurrent.* diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt b/test-utils/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt index 3e9816910c..8568adddbc 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt @@ -3,7 +3,7 @@ package net.corda.testing.node import com.google.common.util.concurrent.Futures import com.google.common.util.concurrent.ListenableFuture import com.google.common.util.concurrent.SettableFuture -import net.corda.core.crypto.getX509Name +import net.corda.core.utilities.getX509Name import net.corda.core.internal.ThreadBox import net.corda.core.messaging.AllPossibleRecipients import net.corda.core.messaging.MessageRecipientGroup diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt index 2f16808e73..75590b6784 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt @@ -3,8 +3,8 @@ package net.corda.testing.node import com.google.common.jimfs.Configuration.unix import com.google.common.jimfs.Jimfs import com.nhaarman.mockito_kotlin.whenever -import net.corda.core.crypto.CertificateAndKeyPair -import net.corda.core.crypto.cert +import net.corda.core.utilities.CertificateAndKeyPair +import net.corda.core.utilities.cert import net.corda.core.crypto.entropyToKeyPair import net.corda.core.crypto.random63BitValue import net.corda.core.identity.PartyAndCertificate diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt b/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt index 6f5f55a365..b33113e03f 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt @@ -1,27 +1,18 @@ package net.corda.testing.node import net.corda.core.concurrent.CordaFuture -import net.corda.core.crypto.appendToCommonName -import net.corda.core.crypto.commonName -import net.corda.core.crypto.getX509Name -import net.corda.core.internal.concurrent.doneFuture -import net.corda.core.internal.concurrent.flatMap -import net.corda.core.internal.concurrent.fork -import net.corda.core.internal.concurrent.map -import net.corda.core.internal.concurrent.transpose +import net.corda.core.internal.concurrent.* import net.corda.core.internal.createDirectories import net.corda.core.internal.div import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.ServiceType -import net.corda.core.utilities.WHITESPACE -import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.* import net.corda.node.internal.Node import net.corda.node.services.config.ConfigHelper import net.corda.node.services.config.FullNodeConfiguration import net.corda.node.services.config.configOf import net.corda.node.services.config.plus import net.corda.node.services.network.NetworkMapService -import net.corda.node.services.network.PersistentNetworkMapCache import net.corda.node.services.transactions.RaftValidatingNotaryService import net.corda.node.utilities.ServiceIdentityGenerator import net.corda.nodeapi.User diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt b/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt index a3de30fef1..cc0ab2c972 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt @@ -1,7 +1,7 @@ package net.corda.testing.node import com.codahale.metrics.MetricRegistry -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.crypto.generateKeyPair import net.corda.core.internal.concurrent.openFuture import net.corda.core.messaging.RPCOps diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NetworkMapConfig.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NetworkMapConfig.kt index 9aef0146f8..9967f034aa 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NetworkMapConfig.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NetworkMapConfig.kt @@ -1,6 +1,6 @@ package net.corda.demobench.model -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.utilities.WHITESPACE import org.bouncycastle.asn1.x500.X500Name diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt index fc13438570..ea109a68b3 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt @@ -1,7 +1,7 @@ package net.corda.demobench.model import com.typesafe.config.* -import net.corda.core.crypto.locationOrNull +import net.corda.core.utilities.locationOrNull import net.corda.nodeapi.User import org.bouncycastle.asn1.x500.X500Name import java.io.File diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt index 18750dd4ae..e4d0b0ef5e 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt @@ -1,8 +1,8 @@ package net.corda.demobench.model -import net.corda.core.crypto.getX509Name import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.ServiceType +import net.corda.core.utilities.getX509Name import net.corda.demobench.plugin.PluginController import net.corda.demobench.pty.R3Pty import tornadofx.* diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt index 64961f747a..913ab862fe 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt @@ -4,7 +4,7 @@ import com.jediterm.terminal.ui.JediTermWidget import com.jediterm.terminal.ui.UIUtil import com.jediterm.terminal.ui.settings.SettingsProvider import com.pty4j.PtyProcess -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.utilities.loggerFor import org.bouncycastle.asn1.x500.X500Name import java.awt.Dimension diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt index 71566e98a4..7f1f8d44c0 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt @@ -14,7 +14,7 @@ import javafx.scene.layout.Pane import javafx.scene.layout.Priority import javafx.stage.FileChooser import javafx.util.StringConverter -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.internal.div import net.corda.core.internal.exists import net.corda.core.node.CityDatabase diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt index 5c30ae9e2c..51905c0b6f 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt @@ -15,7 +15,7 @@ import javafx.scene.layout.VBox import javafx.util.Duration import net.corda.core.concurrent.match import net.corda.core.contracts.ContractState -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.messaging.CordaRPCOps import net.corda.core.messaging.vaultTrackBy import net.corda.core.node.services.vault.PageSpecification diff --git a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt index 40cee11f4a..c80bf2e1ed 100644 --- a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt +++ b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt @@ -1,6 +1,6 @@ package net.corda.demobench.model -import net.corda.core.crypto.getX509Name +import net.corda.core.utilities.getX509Name import net.corda.nodeapi.User import net.corda.testing.DUMMY_NOTARY import org.junit.Test @@ -175,10 +175,10 @@ class NodeControllerTest { ) = NodeConfig( baseDir, legalName = getX509Name( - myLegalName = commonName, - nearestCity = "New York", - country = "US", - email = "corda@city.us.example" + myLegalName = commonName, + nearestCity = "New York", + country = "US", + email = "corda@city.us.example" ), p2pPort = p2pPort, rpcPort = rpcPort, diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/formatters/PartyNameFormatter.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/formatters/PartyNameFormatter.kt index 0347e9924f..8cdec83233 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/formatters/PartyNameFormatter.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/formatters/PartyNameFormatter.kt @@ -1,6 +1,6 @@ package net.corda.explorer.formatters -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import org.bouncycastle.asn1.x500.X500Name object PartyNameFormatter { diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt index 2c33129de9..f75f3aa1f7 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt @@ -27,13 +27,10 @@ import javafx.util.Duration import net.corda.client.jfx.model.* import net.corda.client.jfx.utils.* import net.corda.core.contracts.ContractState -import net.corda.core.crypto.locationOrNull -import net.corda.core.crypto.toBase58String import net.corda.core.identity.Party -import net.corda.core.node.CityDatabase import net.corda.core.node.NodeInfo import net.corda.core.node.ScreenCoordinate -import net.corda.core.node.WorldMapLocation +import net.corda.core.utilities.toBase58String import net.corda.explorer.formatters.PartyNameFormatter import net.corda.explorer.model.CordaView import tornadofx.* diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt index 846c8649fd..cbbc9d1d72 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt @@ -22,8 +22,8 @@ import net.corda.client.jfx.utils.map import net.corda.client.jfx.utils.sequence import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash -import net.corda.core.crypto.commonName -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.commonName +import net.corda.core.utilities.toBase58String import net.corda.core.crypto.toStringShort import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt index ec18b895c4..e332157467 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt @@ -22,7 +22,7 @@ import net.corda.client.jfx.utils.* import net.corda.core.contracts.Amount import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.withoutIssuer -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.identity.AbstractParty import net.corda.explorer.formatters.AmountFormatter import net.corda.explorer.formatters.PartyNameFormatter diff --git a/tools/loadtest/src/main/kotlin/net/corda/loadtest/LoadTest.kt b/tools/loadtest/src/main/kotlin/net/corda/loadtest/LoadTest.kt index 7e70be42b0..bff6f4fd9b 100644 --- a/tools/loadtest/src/main/kotlin/net/corda/loadtest/LoadTest.kt +++ b/tools/loadtest/src/main/kotlin/net/corda/loadtest/LoadTest.kt @@ -2,7 +2,7 @@ package net.corda.loadtest import com.google.common.util.concurrent.RateLimiter import net.corda.client.mock.Generator -import net.corda.core.crypto.toBase58String +import net.corda.core.utilities.toBase58String import net.corda.node.services.network.NetworkMapService import net.corda.testing.driver.PortAllocation import org.slf4j.LoggerFactory diff --git a/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierDriver.kt b/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierDriver.kt index b97f5845dc..6a53ab73cf 100644 --- a/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierDriver.kt +++ b/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierDriver.kt @@ -3,7 +3,7 @@ package net.corda.verifier import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import net.corda.core.concurrent.CordaFuture -import net.corda.core.crypto.commonName +import net.corda.core.utilities.commonName import net.corda.core.crypto.random63BitValue import net.corda.core.internal.concurrent.* import net.corda.core.internal.div From 2a794d9523bd563b33e32c830c233dd4b2947275 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Fri, 1 Sep 2017 11:10:59 +0100 Subject: [PATCH 049/120] Eliminate generated `Kt` classes * Move CP_PROGRAM_ID into companion object * Move COMMODITY_PROGRAM_ID into companion object * Remove unused convenience function from FinanceTypes before we end up committing to maintaining it indefinitely. * Move calculateDaysBetween into BusinessCalendar to eliminate FinanceTypesKt --- .../finance/contracts/CommercialPaper.kt | 5 ++- .../corda/finance/contracts/FinanceTypes.kt | 40 ++++++++++--------- .../contracts/asset/CommodityContract.kt | 8 ++-- .../main/kotlin/net/corda/irs/contract/IRS.kt | 4 +- 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/CommercialPaper.kt b/finance/src/main/kotlin/net/corda/finance/contracts/CommercialPaper.kt index 1cc8139b9c..8626da9034 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/CommercialPaper.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/CommercialPaper.kt @@ -40,10 +40,11 @@ import java.util.* * which may need to be tracked. That, in turn, requires validation logic (there is a bean validator that knows how * to do this in the Apache BVal project). */ -val CP_PROGRAM_ID = CommercialPaper() - // TODO: Generalise the notion of an owned instrument into a superclass/supercontract. Consider composition vs inheritance. class CommercialPaper : Contract { + companion object { + val CP_PROGRAM_ID = CommercialPaper() + } data class State( val issuance: PartyAndReference, override val owner: AbstractParty, diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/FinanceTypes.kt b/finance/src/main/kotlin/net/corda/finance/contracts/FinanceTypes.kt index a2d4538aa7..f35b374f0f 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/FinanceTypes.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/FinanceTypes.kt @@ -83,7 +83,7 @@ data class Tenor(val name: String) { } // Move date to the closest business day when it falls on a weekend/holiday val adjustedMaturityDate = calendar.applyRollConvention(maturityDate, DateRollConvention.ModifiedFollowing) - val daysToMaturity = calculateDaysBetween(startDate, adjustedMaturityDate, DayCountBasisYear.Y360, DayCountBasisDay.DActual) + val daysToMaturity = BusinessCalendar.calculateDaysBetween(startDate, adjustedMaturityDate, DayCountBasisYear.Y360, DayCountBasisDay.DActual) return daysToMaturity } @@ -190,10 +190,6 @@ enum class Frequency(val annualCompoundCount: Int, val offset: LocalDate.(Long) Daily(365, { plusDays(1 * it) }); } - -@Suppress("unused") // This utility may be useful in future. TODO: Review before API stability guarantees in place. -fun LocalDate.isWorkingDay(accordingToCalendar: BusinessCalendar): Boolean = accordingToCalendar.isWorkingDay(this) - // TODO: Make Calendar data come from an oracle /** @@ -213,10 +209,26 @@ open class BusinessCalendar (val holidayDates: List) { it to BusinessCalendar::class.java.getResourceAsStream("${it}HolidayCalendar.txt").bufferedReader().readText() }.toMap() + @JvmStatic + fun calculateDaysBetween(startDate: LocalDate, + endDate: LocalDate, + dcbYear: DayCountBasisYear, + dcbDay: DayCountBasisDay): Int { + // Right now we are only considering Actual/360 and 30/360 .. We'll do the rest later. + // TODO: The rest. + return when { + dcbDay == DayCountBasisDay.DActual -> (endDate.toEpochDay() - startDate.toEpochDay()).toInt() + dcbDay == DayCountBasisDay.D30 && dcbYear == DayCountBasisYear.Y360 -> ((endDate.year - startDate.year) * 360.0 + (endDate.monthValue - startDate.monthValue) * 30.0 + endDate.dayOfMonth - startDate.dayOfMonth).toInt() + else -> TODO("Can't calculate days using convention $dcbDay / $dcbYear") + } + } + /** Parses a date of the form YYYY-MM-DD, like 2016-01-10 for 10th Jan. */ + @JvmStatic fun parseDateFromString(it: String): LocalDate = LocalDate.parse(it, DateTimeFormatter.ISO_LOCAL_DATE) /** Returns a business calendar that combines all the named holiday calendars into one list of holiday dates. */ + @JvmStatic fun getInstance(vararg calname: String) = BusinessCalendar( calname.flatMap { (TEST_CALENDAR_DATA[it] ?: throw UnknownCalendar(it)).split(",") }. toSet(). @@ -225,6 +237,7 @@ open class BusinessCalendar (val holidayDates: List) { ) /** Calculates an event schedule that moves events around to ensure they fall on working days. */ + @JvmStatic fun createGenericSchedule(startDate: LocalDate, period: Frequency, calendar: BusinessCalendar = getInstance(), @@ -248,9 +261,11 @@ open class BusinessCalendar (val holidayDates: List) { return ret } - /** Calculates the date from @startDate moving forward @steps of time size @period. Does not apply calendar + /** + * Calculates the date from @startDate moving forward 'steps' of time size 'period'. Does not apply calendar * logic / roll conventions. */ + @JvmStatic fun getOffsetDate(startDate: LocalDate, period: Frequency, steps: Int = 1): LocalDate { if (steps == 0) return startDate return period.offset(startDate, steps.toLong()) @@ -316,19 +331,6 @@ open class BusinessCalendar (val holidayDates: List) { } } -fun calculateDaysBetween(startDate: LocalDate, - endDate: LocalDate, - dcbYear: DayCountBasisYear, - dcbDay: DayCountBasisDay): Int { - // Right now we are only considering Actual/360 and 30/360 .. We'll do the rest later. - // TODO: The rest. - return when { - dcbDay == DayCountBasisDay.DActual -> (endDate.toEpochDay() - startDate.toEpochDay()).toInt() - dcbDay == DayCountBasisDay.D30 && dcbYear == DayCountBasisYear.Y360 -> ((endDate.year - startDate.year) * 360.0 + (endDate.monthValue - startDate.monthValue) * 30.0 + endDate.dayOfMonth - startDate.dayOfMonth).toInt() - else -> TODO("Can't calculate days using convention $dcbDay / $dcbYear") - } -} - /** A common netting command for contracts whose states can be netted. */ interface NetCommand : CommandData { /** The type of netting to apply, see [NetType] for options. */ diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/CommodityContract.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/CommodityContract.kt index 2ce6cc0855..995b56a6fc 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/CommodityContract.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/CommodityContract.kt @@ -19,9 +19,6 @@ import java.util.* // Commodity // -// Just a fake program identifier for now. In a real system it could be, for instance, the hash of the program bytecode. -val COMMODITY_PROGRAM_ID = CommodityContract() - /** * A commodity contract represents an amount of some commodity, tracked on a distributed ledger. The design of this * contract is intentionally similar to the [Cash] contract, and the same commands (issue, move, exit) apply, the @@ -34,6 +31,11 @@ val COMMODITY_PROGRAM_ID = CommodityContract() */ // TODO: Need to think about expiry of commodities, how to require payment of storage costs, etc. class CommodityContract : OnLedgerAsset() { + companion object { + // Just a fake program identifier for now. In a real system it could be, for instance, the hash of the program bytecode. + val COMMODITY_PROGRAM_ID = CommodityContract() + } + /** A state representing a commodity claim against some party */ data class State( override val amount: Amount>, diff --git a/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt b/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt index e7053be51f..431bf0c1c0 100644 --- a/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt +++ b/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt @@ -2,7 +2,6 @@ package net.corda.irs.contract import com.fasterxml.jackson.annotation.JsonIgnoreProperties import net.corda.core.contracts.* -import net.corda.core.crypto.containsAny import net.corda.core.flows.FlowLogicRefFactory import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party @@ -18,7 +17,6 @@ import org.apache.commons.jexl3.JexlBuilder import org.apache.commons.jexl3.MapContext import java.math.BigDecimal import java.math.RoundingMode -import java.security.PublicKey import java.time.LocalDate import java.util.* @@ -76,7 +74,7 @@ abstract class RatePaymentEvent(date: LocalDate, abstract val flow: Amount - val days: Int get() = calculateDaysBetween(accrualStartDate, accrualEndDate, dayCountBasisYear, dayCountBasisDay) + val days: Int get() = BusinessCalendar.calculateDaysBetween(accrualStartDate, accrualEndDate, dayCountBasisYear, dayCountBasisDay) // TODO : Fix below (use daycount convention for division, not hardcoded 360 etc) val dayCountFactor: BigDecimal get() = (BigDecimal(days).divide(BigDecimal(360.0), 8, RoundingMode.HALF_UP)).setScale(4, RoundingMode.HALF_UP) From 66c35bbffae2ad6c22438ac9105609d8e436c9e9 Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Fri, 1 Sep 2017 11:12:04 +0100 Subject: [PATCH 050/120] Demote quasar-core to a runtime dependency, and capsule to "compileOnly". (#1381) --- constants.properties | 4 ++-- core/build.gradle | 3 +++ .../src/main/groovy/net/corda/plugins/QuasarPlugin.groovy | 2 +- .../corda/node/services/statemachine/FlowVersioningTest.kt | 4 +++- samples/network-visualiser/build.gradle | 2 +- verifier/build.gradle | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/constants.properties b/constants.properties index f8c76f96a6..002037fd86 100644 --- a/constants.properties +++ b/constants.properties @@ -1,5 +1,5 @@ -gradlePluginsVersion=0.15.1 +gradlePluginsVersion=0.15.2 kotlinVersion=1.1.4 guavaVersion=21.0 bouncycastleVersion=1.57 -typesafeConfigVersion=1.3.1 \ No newline at end of file +typesafeConfigVersion=1.3.1 diff --git a/core/build.gradle b/core/build.gradle index ca33b3b725..d18595dbba 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -28,6 +28,9 @@ dependencies { compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" + // Quasar, for suspendable fibres. + compileOnly "co.paralleluniverse:quasar-core:$quasar_version:jdk8" + // Thread safety annotations compile "com.google.code.findbugs:jsr305:3.0.1" diff --git a/gradle-plugins/quasar-utils/src/main/groovy/net/corda/plugins/QuasarPlugin.groovy b/gradle-plugins/quasar-utils/src/main/groovy/net/corda/plugins/QuasarPlugin.groovy index 5083554337..6a4ffaf25a 100644 --- a/gradle-plugins/quasar-utils/src/main/groovy/net/corda/plugins/QuasarPlugin.groovy +++ b/gradle-plugins/quasar-utils/src/main/groovy/net/corda/plugins/QuasarPlugin.groovy @@ -14,7 +14,7 @@ class QuasarPlugin implements Plugin { // To add a local .jar dependency: // project.dependencies.add("quasar", project.files("${project.rootProject.projectDir}/lib/quasar.jar")) project.dependencies.add("quasar", "co.paralleluniverse:quasar-core:${project.rootProject.ext.quasar_version}:jdk8@jar") - project.dependencies.add("compile", project.configurations.getByName("quasar")) + project.dependencies.add("runtime", project.configurations.getByName("quasar")) project.tasks.withType(Test) { jvmArgs "-javaagent:${project.configurations.quasar.singleFile}" diff --git a/node/src/integration-test/kotlin/net/corda/node/services/statemachine/FlowVersioningTest.kt b/node/src/integration-test/kotlin/net/corda/node/services/statemachine/FlowVersioningTest.kt index 9ea00ba466..2dafbab440 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/statemachine/FlowVersioningTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/statemachine/FlowVersioningTest.kt @@ -30,8 +30,10 @@ class FlowVersioningTest : NodeBasedTest() { private class PretendInitiatingCoreFlow(val initiatedParty: Party) : FlowLogic>() { @Suspendable override fun call(): Pair { + // Execute receive() outside of the Pair constructor to avoid Kotlin/Quasar instrumentation bug. + val alicePlatformVersionAccordingToBob = receive(initiatedParty).unwrap { it } return Pair( - receive(initiatedParty).unwrap { it }, + alicePlatformVersionAccordingToBob, getFlowContext(initiatedParty).flowVersion ) } diff --git a/samples/network-visualiser/build.gradle b/samples/network-visualiser/build.gradle index 7450bcd816..d925345afe 100644 --- a/samples/network-visualiser/build.gradle +++ b/samples/network-visualiser/build.gradle @@ -20,7 +20,7 @@ dependencies { // Cordapp dependencies // GraphStream: For visualisation - compile 'co.paralleluniverse:capsule:1.0.3' + compileOnly "co.paralleluniverse:capsule:$capsule_version" compile "org.graphstream:gs-core:1.3" compile "org.graphstream:gs-ui:1.3" } diff --git a/verifier/build.gradle b/verifier/build.gradle index d07a611ec0..2e61f06ce2 100644 --- a/verifier/build.gradle +++ b/verifier/build.gradle @@ -51,7 +51,7 @@ dependencies { task standaloneJar(type: Jar) { // Create a fat jar by packing all deps into the output from { - configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } + configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } } with jar exclude("META-INF/*.DSA") From b92306b82b4078d87ca04e3354dd5355eefa1d1c Mon Sep 17 00:00:00 2001 From: Andras Slemmer Date: Fri, 1 Sep 2017 12:21:35 +0100 Subject: [PATCH 051/120] Add a Java-style builder for Driver parameters --- .../kotlin/net/corda/testing/driver/Driver.kt | 81 +++++++++++++------ 1 file changed, 58 insertions(+), 23 deletions(-) diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt index 58e333413d..f208e272df 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -244,32 +244,67 @@ sealed class PortAllocation { */ @JvmOverloads fun driver( - isDebug: Boolean = false, - driverDirectory: Path = Paths.get("build", getTimestampAsDirectoryName()), - portAllocation: PortAllocation = PortAllocation.Incremental(10000), - debugPortAllocation: PortAllocation = PortAllocation.Incremental(5005), - systemProperties: Map = emptyMap(), - useTestClock: Boolean = false, - initialiseSerialization: Boolean = true, - networkMapStartStrategy: NetworkMapStartStrategy = NetworkMapStartStrategy.Dedicated(startAutomatically = true), - startNodesInProcess: Boolean = false, + defaultParameters: DriverParameters = DriverParameters(), + isDebug: Boolean = defaultParameters.isDebug, + driverDirectory: Path = defaultParameters.driverDirectory, + portAllocation: PortAllocation = defaultParameters.portAllocation, + debugPortAllocation: PortAllocation = defaultParameters.debugPortAllocation, + systemProperties: Map = defaultParameters.systemProperties, + useTestClock: Boolean = defaultParameters.useTestClock, + initialiseSerialization: Boolean = defaultParameters.initialiseSerialization, + networkMapStartStrategy: NetworkMapStartStrategy = defaultParameters.networkMapStartStrategy, + startNodesInProcess: Boolean = defaultParameters.startNodesInProcess, dsl: DriverDSLExposedInterface.() -> A -) = genericDriver( - driverDsl = DriverDSL( - portAllocation = portAllocation, - debugPortAllocation = debugPortAllocation, - systemProperties = systemProperties, - driverDirectory = driverDirectory.toAbsolutePath(), - useTestClock = useTestClock, - networkMapStartStrategy = networkMapStartStrategy, - startNodesInProcess = startNodesInProcess, - isDebug = isDebug - ), - coerce = { it }, - dsl = dsl, - initialiseSerialization = initialiseSerialization +): A { + return genericDriver( + driverDsl = DriverDSL( + portAllocation = portAllocation, + debugPortAllocation = debugPortAllocation, + systemProperties = systemProperties, + driverDirectory = driverDirectory.toAbsolutePath(), + useTestClock = useTestClock, + networkMapStartStrategy = networkMapStartStrategy, + startNodesInProcess = startNodesInProcess, + isDebug = isDebug + ), + coerce = { it }, + dsl = dsl, + initialiseSerialization = initialiseSerialization + ) +} + +fun driver( + builder: DriverBuilder, + dsl: DriverDSLExposedInterface.() -> A +): A { + return driver(defaultParameters = builder.parameters, dsl = dsl) +} + +data class DriverParameters( + val isDebug: Boolean = false, + val driverDirectory: Path = Paths.get("build", getTimestampAsDirectoryName()), + val portAllocation: PortAllocation = PortAllocation.Incremental(10000), + val debugPortAllocation: PortAllocation = PortAllocation.Incremental(5005), + val systemProperties: Map = emptyMap(), + val useTestClock: Boolean = false, + val initialiseSerialization: Boolean = true, + val networkMapStartStrategy: NetworkMapStartStrategy = NetworkMapStartStrategy.Dedicated(startAutomatically = true), + val startNodesInProcess: Boolean = false ) +class DriverBuilder(val parameters: DriverParameters) { + constructor() : this(DriverParameters()) + fun setIsDebug(newValue: Boolean) = DriverBuilder(parameters.copy(isDebug = newValue)) + fun setDriverDirectory(newValue: Path) = DriverBuilder(parameters.copy(driverDirectory = newValue)) + fun setPortAllocation(newValue: PortAllocation) = DriverBuilder(parameters.copy(portAllocation = newValue)) + fun setDebugPortAllocation(newValue: PortAllocation) = DriverBuilder(parameters.copy(debugPortAllocation = newValue)) + fun setSystemProperties(newValue: Map) = DriverBuilder(parameters.copy(systemProperties = newValue)) + fun setUseTestClock(newValue: Boolean) = DriverBuilder(parameters.copy(useTestClock = newValue)) + fun setInitialiseSerialization(newValue: Boolean) = DriverBuilder(parameters.copy(initialiseSerialization = newValue)) + fun setNetworkMapStartStrategy(newValue: NetworkMapStartStrategy) = DriverBuilder(parameters.copy(networkMapStartStrategy = newValue)) + fun setStartNodesInProcess(newValue: Boolean) = DriverBuilder(parameters.copy(startNodesInProcess = newValue)) +} + /** * This is a helper method to allow extending of the DSL, along the lines of * interface SomeOtherExposedDSLInterface : DriverDSLExposedInterface From 6bc44b96f1912f0da27ac654819ba2644717d051 Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko <31008341+vkolomeyko@users.noreply.github.com> Date: Fri, 1 Sep 2017 13:14:39 +0100 Subject: [PATCH 052/120] CORDA-540: Stop breaking PartyAndCertificate when persisting it in binary form (#1384) Breaking on multiple parts causes a problem in AMQP mode when X509 Certificate path cannot be serialized on its own --- .../net/corda/core/schemas/NodeInfoSchema.kt | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt b/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt index 1c7e6ffa31..df8016115a 100644 --- a/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt +++ b/core/src/main/kotlin/net/corda/core/schemas/NodeInfoSchema.kt @@ -8,7 +8,6 @@ import net.corda.core.serialization.serialize import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.toBase58String import java.io.Serializable -import java.security.cert.CertPath import javax.persistence.* object NodeInfoSchema @@ -107,13 +106,9 @@ object NodeInfoSchemaV1 : MappedSchema( @Column(name = "party_name", nullable = false) val name: String, - @Column(name = "certificate") + @Column(name = "party_cert_binary") @Lob - val certificate: ByteArray, - - @Column(name = "certificate_path") - @Lob - val certPath: ByteArray, + val partyCertBinary: ByteArray, val isMain: Boolean, @@ -121,9 +116,10 @@ object NodeInfoSchemaV1 : MappedSchema( private val persistentNodeInfos: Set = emptySet() ) { constructor(partyAndCert: PartyAndCertificate, isMain: Boolean = false) - : this(partyAndCert.party.owningKey.toBase58String(), partyAndCert.party.name.toString(), partyAndCert.certificate.serialize().bytes, partyAndCert.certPath.serialize().bytes, isMain) + : this(partyAndCert.party.owningKey.toBase58String(), partyAndCert.party.name.toString(), partyAndCert.serialize().bytes, isMain) + fun toLegalIdentityAndCert(): PartyAndCertificate { - return PartyAndCertificate(certPath.deserialize()) + return partyCertBinary.deserialize() } } } From e3ddf84cf83974a50446a7bc8b1d2ceed59b009a Mon Sep 17 00:00:00 2001 From: joeldudleyr3 Date: Fri, 1 Sep 2017 13:51:12 +0100 Subject: [PATCH 053/120] Combines Parameters with Builder. --- .../kotlin/net/corda/testing/driver/Driver.kt | 89 +++++++++++-------- 1 file changed, 52 insertions(+), 37 deletions(-) diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt index f208e272df..44933024c0 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -146,6 +146,7 @@ interface DriverDSLExposedInterface : CordformContext { * @return A future that completes with the non-null value [check] has returned. */ fun pollUntilNonNull(pollName: String, pollInterval: Duration = 500.millis, warnCount: Int = 120, check: () -> A?): CordaFuture + /** * Polls the given function until it returns true. * @see pollUntilNonNull @@ -242,11 +243,10 @@ sealed class PortAllocation { * @param dsl The dsl itself. * @return The value returned in the [dsl] closure. */ -@JvmOverloads fun driver( - defaultParameters: DriverParameters = DriverParameters(), isDebug: Boolean = defaultParameters.isDebug, - driverDirectory: Path = defaultParameters.driverDirectory, + // The directory must be different for each call to `driver`. + driverDirectory: Path = Paths.get("build", getTimestampAsDirectoryName()), portAllocation: PortAllocation = defaultParameters.portAllocation, debugPortAllocation: PortAllocation = defaultParameters.debugPortAllocation, systemProperties: Map = defaultParameters.systemProperties, @@ -274,10 +274,21 @@ fun driver( } fun driver( - builder: DriverBuilder, + parameters: DriverParameters, dsl: DriverDSLExposedInterface.() -> A ): A { - return driver(defaultParameters = builder.parameters, dsl = dsl) + return driver( + isDebug = parameters.isDebug, + driverDirectory = parameters.driverDirectory, + portAllocation = parameters.portAllocation, + debugPortAllocation = parameters.debugPortAllocation, + systemProperties = parameters.systemProperties, + useTestClock = parameters.useTestClock, + initialiseSerialization = parameters.initialiseSerialization, + networkMapStartStrategy = parameters.networkMapStartStrategy, + startNodesInProcess = parameters.startNodesInProcess, + dsl = dsl + ) } data class DriverParameters( @@ -290,21 +301,20 @@ data class DriverParameters( val initialiseSerialization: Boolean = true, val networkMapStartStrategy: NetworkMapStartStrategy = NetworkMapStartStrategy.Dedicated(startAutomatically = true), val startNodesInProcess: Boolean = false -) - -class DriverBuilder(val parameters: DriverParameters) { - constructor() : this(DriverParameters()) - fun setIsDebug(newValue: Boolean) = DriverBuilder(parameters.copy(isDebug = newValue)) - fun setDriverDirectory(newValue: Path) = DriverBuilder(parameters.copy(driverDirectory = newValue)) - fun setPortAllocation(newValue: PortAllocation) = DriverBuilder(parameters.copy(portAllocation = newValue)) - fun setDebugPortAllocation(newValue: PortAllocation) = DriverBuilder(parameters.copy(debugPortAllocation = newValue)) - fun setSystemProperties(newValue: Map) = DriverBuilder(parameters.copy(systemProperties = newValue)) - fun setUseTestClock(newValue: Boolean) = DriverBuilder(parameters.copy(useTestClock = newValue)) - fun setInitialiseSerialization(newValue: Boolean) = DriverBuilder(parameters.copy(initialiseSerialization = newValue)) - fun setNetworkMapStartStrategy(newValue: NetworkMapStartStrategy) = DriverBuilder(parameters.copy(networkMapStartStrategy = newValue)) - fun setStartNodesInProcess(newValue: Boolean) = DriverBuilder(parameters.copy(startNodesInProcess = newValue)) +) { + fun setIsDebug(isDebug: Boolean) = copy(isDebug = isDebug) + fun setDriverDirectory(driverDirectory: Path) = copy(driverDirectory = driverDirectory) + fun setPortAllocation(portAllocation: PortAllocation) = copy(portAllocation = portAllocation) + fun setDebugPortAllocation(debugPortAllocation: PortAllocation) = copy(debugPortAllocation = debugPortAllocation) + fun setSystemProperties(systemProperties: Map) = copy(systemProperties = systemProperties) + fun setUseTestClock(useTestClock: Boolean) = copy(useTestClock = useTestClock) + fun setInitialiseSerialization(initialiseSerialization: Boolean) = copy(initialiseSerialization = initialiseSerialization) + fun setNetworkMapStartStrategy(networkMapStartStrategy: NetworkMapStartStrategy) = copy(networkMapStartStrategy = networkMapStartStrategy) + fun setStartNodesInProcess(startNodesInProcess: Boolean) = copy(startNodesInProcess = startNodesInProcess) } +private val defaultParameters = DriverParameters() + /** * This is a helper method to allow extending of the DSL, along the lines of * interface SomeOtherExposedDSLInterface : DriverDSLExposedInterface @@ -438,15 +448,17 @@ class ShutdownManager(private val executorService: ExecutorService) { } } val shutdowns = shutdownActionFutures.map { Try.on { it.getOrThrow(1.seconds) } } - shutdowns.reversed().forEach { when (it) { - is Try.Success -> - try { - it.value() - } catch (t: Throwable) { - log.warn("Exception while shutting down", t) - } - is Try.Failure -> log.warn("Exception while getting shutdown method, disregarding", it.exception) - } } + shutdowns.reversed().forEach { + when (it) { + is Try.Success -> + try { + it.value() + } catch (t: Throwable) { + log.warn("Exception while shutting down", t) + } + is Try.Failure -> log.warn("Exception while getting shutdown method, disregarding", it.exception) + } + } } fun registerShutdown(shutdown: CordaFuture<() -> Unit>) { @@ -455,6 +467,7 @@ class ShutdownManager(private val executorService: ExecutorService) { registeredShutdowns.add(shutdown) } } + fun registerShutdown(shutdown: () -> Unit) = registerShutdown(doneFuture(shutdown)) fun registerProcessShutdown(processFuture: CordaFuture) { @@ -667,7 +680,7 @@ class DriverDSL( rpcUsers = rpcUsers, verifierType = verifierType, customOverrides = mapOf("notaryNodeAddress" to notaryClusterAddress.toString(), - "database.serverNameTablePrefix" to if (nodeNames.isNotEmpty()) nodeNames.first().toString().replace(Regex("[^0-9A-Za-z]+"),"") else ""), + "database.serverNameTablePrefix" to if (nodeNames.isNotEmpty()) nodeNames.first().toString().replace(Regex("[^0-9A-Za-z]+"), "") else ""), startInSameProcess = startInSameProcess ) // All other nodes will join the cluster @@ -696,7 +709,7 @@ class DriverDSL( if (response.isSuccessful && (response.body().string() == "started")) { return WebserverHandle(handle.webAddress, process) } - } catch(e: ConnectException) { + } catch (e: ConnectException) { log.debug("Retrying webserver info at ${handle.webAddress}") } @@ -746,10 +759,12 @@ class DriverDSL( if (startInProcess ?: startNodesInProcess) { val nodeAndThreadFuture = startInProcessNode(executorService, nodeConfiguration, config) shutdownManager.registerShutdown( - nodeAndThreadFuture.map { (node, thread) -> { - node.stop() - thread.interrupt() - } } + nodeAndThreadFuture.map { (node, thread) -> + { + node.stop() + thread.interrupt() + } + } ) return nodeAndThreadFuture.flatMap { (node, thread) -> establishRpc(nodeConfiguration.p2pAddress, nodeConfiguration, openFuture()).flatMap { rpc -> @@ -857,8 +872,8 @@ class DriverDSL( workingDirectory = nodeConf.baseDirectory ) } - return processFuture.flatMap { - process -> addressMustBeBoundFuture(executorService, nodeConf.p2pAddress, process).map { process } + return processFuture.flatMap { process -> + addressMustBeBoundFuture(executorService, nodeConf.p2pAddress, process).map { process } } } @@ -874,8 +889,8 @@ class DriverDSL( arguments = listOf("--base-directory", handle.configuration.baseDirectory.toString()), jdwpPort = debugPort, extraJvmArguments = listOf( - "-Dname=node-${handle.configuration.p2pAddress}-webserver", - "-Djava.io.tmpdir=${System.getProperty("java.io.tmpdir")}" // Inherit from parent process + "-Dname=node-${handle.configuration.p2pAddress}-webserver", + "-Djava.io.tmpdir=${System.getProperty("java.io.tmpdir")}" // Inherit from parent process ), errorLogPath = Paths.get("error.$className.log") ) From d1ee84044d3e354fa60023fe4256682828371bb4 Mon Sep 17 00:00:00 2001 From: joeldudleyr3 Date: Fri, 1 Sep 2017 14:10:35 +0100 Subject: [PATCH 054/120] Renames AuthenticatedObject to CommandWithParties for clarity. --- .../net/corda/core/contracts/ContractsDSL.kt | 16 ++++++++-------- .../net/corda/core/contracts/Structures.kt | 4 ++-- .../corda/core/transactions/LedgerTransaction.kt | 4 ++-- .../corda/core/transactions/WireTransaction.kt | 2 +- .../net/corda/core/contracts/TransactionTests.kt | 4 ++-- docs/source/api-contracts.rst | 10 +++++----- docs/source/api-core-types.rst | 6 +++--- docs/source/clauses.rst | 4 ++-- docs/source/hello-world-contract.rst | 4 ++-- docs/source/tutorial-contract-clauses.rst | 6 +++--- docs/source/tutorial-contract.rst | 2 +- .../finance/contracts/JavaCommercialPaper.java | 16 ++++++++-------- .../net/corda/finance/contracts/asset/Cash.kt | 4 ++-- .../finance/contracts/asset/CommodityContract.kt | 4 ++-- .../corda/finance/contracts/asset/Obligation.kt | 8 ++++---- .../finance/contracts/asset/OnLedgerAsset.kt | 2 +- .../contracts/asset/DummyFungibleContract.kt | 4 ++-- .../main/kotlin/net/corda/irs/contract/IRS.kt | 2 +- 18 files changed, 51 insertions(+), 51 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/contracts/ContractsDSL.kt b/core/src/main/kotlin/net/corda/core/contracts/ContractsDSL.kt index c1d43020f3..51036f8dfe 100644 --- a/core/src/main/kotlin/net/corda/core/contracts/ContractsDSL.kt +++ b/core/src/main/kotlin/net/corda/core/contracts/ContractsDSL.kt @@ -32,33 +32,33 @@ inline fun requireThat(body: Requirements.() -> R) = Requirements.body() // TODO: Provide a version of select that interops with Java /** Filters the command list by type, party and public key all at once. */ -inline fun Collection>.select(signer: PublicKey? = null, +inline fun Collection>.select(signer: PublicKey? = null, party: AbstractParty? = null) = filter { it.value is T }. filter { if (signer == null) true else signer in it.signers }. filter { if (party == null) true else party in it.signingParties }. - map { AuthenticatedObject(it.signers, it.signingParties, it.value as T) } + map { CommandWithParties(it.signers, it.signingParties, it.value as T) } // TODO: Provide a version of select that interops with Java /** Filters the command list by type, parties and public keys all at once. */ -inline fun Collection>.select(signers: Collection?, +inline fun Collection>.select(signers: Collection?, parties: Collection?) = filter { it.value is T }. filter { if (signers == null) true else it.signers.containsAll(signers) }. filter { if (parties == null) true else it.signingParties.containsAll(parties) }. - map { AuthenticatedObject(it.signers, it.signingParties, it.value as T) } + map { CommandWithParties(it.signers, it.signingParties, it.value as T) } /** Ensures that a transaction has only one command that is of the given type, otherwise throws an exception. */ -inline fun Collection>.requireSingleCommand() = try { +inline fun Collection>.requireSingleCommand() = try { select().single() } catch (e: NoSuchElementException) { throw IllegalStateException("Required ${T::class.qualifiedName} command") // Better error message. } /** Ensures that a transaction has only one command that is of the given type, otherwise throws an exception. */ -fun Collection>.requireSingleCommand(klass: Class) = - mapNotNull { @Suppress("UNCHECKED_CAST") if (klass.isInstance(it.value)) it as AuthenticatedObject else null }.single() +fun Collection>.requireSingleCommand(klass: Class) = + mapNotNull { @Suppress("UNCHECKED_CAST") if (klass.isInstance(it.value)) it as CommandWithParties else null }.single() /** * Simple functionality for verifying a move command. Verifies that each input has a signature from its owning key. @@ -67,7 +67,7 @@ fun Collection>.requireSingle */ @Throws(IllegalArgumentException::class) inline fun verifyMoveCommand(inputs: List, - commands: List>) + commands: List>) : MoveCommand { // Now check the digital signatures on the move command. Every input has an owning public key, and we must // see a signature from each of those keys. The actual signatures have been verified against the transaction diff --git a/core/src/main/kotlin/net/corda/core/contracts/Structures.kt b/core/src/main/kotlin/net/corda/core/contracts/Structures.kt index 6930c209aa..f3e501bd5a 100644 --- a/core/src/main/kotlin/net/corda/core/contracts/Structures.kt +++ b/core/src/main/kotlin/net/corda/core/contracts/Structures.kt @@ -307,9 +307,9 @@ interface MoveCommand : CommandData { data class UpgradeCommand(val upgradedContractClass: Class>) : CommandData // DOCSTART 6 -/** Wraps an object that was signed by a public key, which may be a well known/recognised institutional key. */ +/** A [Command] where the signing parties have been looked up if they have a well known/recognised institutional key. */ @CordaSerializable -data class AuthenticatedObject( +data class CommandWithParties( val signers: List, /** If any public keys were recognised, the looked up institutions are available here */ val signingParties: List, diff --git a/core/src/main/kotlin/net/corda/core/transactions/LedgerTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/LedgerTransaction.kt index 59d3e8515d..5c4eb7fa2b 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/LedgerTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/LedgerTransaction.kt @@ -14,7 +14,7 @@ import java.util.function.Predicate * - Downloading and locally storing all the dependencies of the transaction. * - Resolving the input states and loading them into memory. * - Doing some basic key lookups on the [Command]s to see if any keys are from a recognised party, thus converting the - * [Command] objects into [AuthenticatedObject]. + * [Command] objects into [CommandWithParties]. * - Deserialising the output states. * * All the above refer to inputs using a (txhash, output index) pair. @@ -28,7 +28,7 @@ data class LedgerTransaction( override val inputs: List>, override val outputs: List>, /** Arbitrary data passed to the program of each input state. */ - val commands: List>, + val commands: List>, /** A list of [Attachment] objects identified by the transaction that are needed for this transaction to verify. */ val attachments: List, /** The hash of the original serialised WireTransaction. */ diff --git a/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt index 62877b4b30..44a3797f75 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt @@ -84,7 +84,7 @@ data class WireTransaction( // Look up public keys to authenticated identities. This is just a stub placeholder and will all change in future. val authenticatedArgs = commands.map { val parties = it.signers.mapNotNull { pk -> resolveIdentity(pk) } - AuthenticatedObject(it.signers, parties, it.value) + CommandWithParties(it.signers, parties, it.value) } // Open attachments specified in this transaction. If we haven't downloaded them, we fail. val attachments = attachments.map { resolveAttachment(it) ?: throw AttachmentResolutionException(it) } diff --git a/core/src/test/kotlin/net/corda/core/contracts/TransactionTests.kt b/core/src/test/kotlin/net/corda/core/contracts/TransactionTests.kt index c307dc99d0..169677b3d6 100644 --- a/core/src/test/kotlin/net/corda/core/contracts/TransactionTests.kt +++ b/core/src/test/kotlin/net/corda/core/contracts/TransactionTests.kt @@ -96,7 +96,7 @@ class TransactionTests : TestDependencyInjectionBase() { val baseOutState = TransactionState(DummyContract.SingleOwnerState(0, ALICE), DUMMY_NOTARY) val inputs = emptyList>() val outputs = listOf(baseOutState, baseOutState.copy(notary = ALICE), baseOutState.copy(notary = BOB)) - val commands = emptyList>() + val commands = emptyList>() val attachments = emptyList() val id = SecureHash.randomSHA256() val timeWindow: TimeWindow? = null @@ -137,7 +137,7 @@ class TransactionTests : TestDependencyInjectionBase() { val outState = inState.copy(notary = ALICE) val inputs = listOf(StateAndRef(inState, StateRef(SecureHash.randomSHA256(), 0))) val outputs = listOf(outState) - val commands = emptyList>() + val commands = emptyList>() val attachments = emptyList() val id = SecureHash.randomSHA256() val timeWindow: TimeWindow? = null diff --git a/docs/source/api-contracts.rst b/docs/source/api-contracts.rst index 6da93efeb3..ea057bbce9 100644 --- a/docs/source/api-contracts.rst +++ b/docs/source/api-contracts.rst @@ -132,9 +132,9 @@ exception will cause the transaction to be rejected. Commands ^^^^^^^^ -``LedgerTransaction`` contains the commands as a list of ``AuthenticatedObject`` instances. -``AuthenticatedObject`` pairs an object with a list of signers. In this case, ``AuthenticatedObject`` pairs a command -with a list of the entities that are required to sign a transaction where this command is present: +``LedgerTransaction`` contains the commands as a list of ``CommandWithParties`` instances. +``CommandWithParties`` pairs a command with a list of the entities that are required to sign a transaction +where this command is present: .. container:: codeset @@ -153,7 +153,7 @@ Extracting commands ~~~~~~~~~~~~~~~~~~~ You can use the ``requireSingleCommand()`` helper method to extract commands. -`` Collection>.requireSingleCommand(klass: Class)`` asserts that +`` Collection>.requireSingleCommand(klass: Class)`` asserts that the transaction contains exactly one command of type ``T``, and returns it. If there is not exactly one command of this type in the transaction, an exception is thrown, rejecting the transaction. @@ -197,7 +197,7 @@ execution of ``verify()``: @Override public void verify(LedgerTransaction tx) { - final AuthenticatedObject command = requireSingleCommand(tx.getCommands(), Commands.class); + final CommandWithParties command = requireSingleCommand(tx.getCommands(), Commands.class); if (command.getValue() instanceof Commands.Issue) { // Issuance verification logic. diff --git a/docs/source/api-core-types.rst b/docs/source/api-core-types.rst index 2505068675..faf4c32ccb 100644 --- a/docs/source/api-core-types.rst +++ b/docs/source/api-core-types.rst @@ -40,9 +40,9 @@ anonymous parties to full parties. .. note:: These types are provisional and will change significantly in future as the identity framework becomes more fleshed out. -AuthenticatedObject -------------------- -An ``AuthenticatedObject`` represents an object (like a command) and the list of associated signers. +CommandWithParties +------------------ +A ``CommandWithParties`` represents a command and the list of associated signers. Multi-signature support ----------------------- diff --git a/docs/source/clauses.rst b/docs/source/clauses.rst index d19552987c..93b6b097ad 100644 --- a/docs/source/clauses.rst +++ b/docs/source/clauses.rst @@ -21,7 +21,7 @@ Let's take a look at a simplified structure of the ``Clause`` class: abstract fun verify(tx: LedgerTransaction, inputs: List, outputs: List, - commands: List>, + commands: List>, groupingKey: K?): Set ... } @@ -235,7 +235,7 @@ Example from ``CommercialPaper.kt``: override fun verify(tx: LedgerTransaction, inputs: List, outputs: List, - commands: List>, + commands: List>, groupingKey: Issued?): Set { val consumedCommands = super.verify(tx, inputs, outputs, commands, groupingKey) ... diff --git a/docs/source/hello-world-contract.rst b/docs/source/hello-world-contract.rst index c54e5cf6da..d5e4de152f 100644 --- a/docs/source/hello-world-contract.rst +++ b/docs/source/hello-world-contract.rst @@ -114,7 +114,7 @@ Let's write a contract that enforces these constraints. We'll do this by modifyi package com.template.contract; import com.template.state.IOUState; - import net.corda.core.contracts.AuthenticatedObject; + import net.corda.core.contracts.CommandWithParties; import net.corda.core.contracts.CommandData; import net.corda.core.contracts.Contract; import net.corda.core.transactions.LedgerTransaction; @@ -130,7 +130,7 @@ Let's write a contract that enforces these constraints. We'll do this by modifyi @Override public void verify(LedgerTransaction tx) { - final AuthenticatedObject command = requireSingleCommand(tx.getCommands(), Create.class); + final CommandWithParties command = requireSingleCommand(tx.getCommands(), Create.class); requireThat(check -> { // Constraints on the shape of the transaction. diff --git a/docs/source/tutorial-contract-clauses.rst b/docs/source/tutorial-contract-clauses.rst index 97ad1ba675..6ddb5035af 100644 --- a/docs/source/tutorial-contract-clauses.rst +++ b/docs/source/tutorial-contract-clauses.rst @@ -124,7 +124,7 @@ and is included in the ``CommercialPaper.kt`` code. override fun verify(tx: LedgerTransaction, inputs: List, outputs: List, - commands: List>, + commands: List>, groupingKey: Issued?): Set { val command = commands.requireSingleCommand() val input = inputs.single() @@ -154,9 +154,9 @@ and is included in the ``CommercialPaper.kt`` code. public Set verify(@NotNull LedgerTransaction tx, @NotNull List inputs, @NotNull List outputs, - @NotNull List> commands, + @NotNull List> commands, @NotNull State groupingKey) { - AuthenticatedObject cmd = requireSingleCommand(tx.getCommands(), Commands.Move.class); + CommandWithParties cmd = requireSingleCommand(tx.getCommands(), Commands.Move.class); // There should be only a single input due to aggregation above State input = single(inputs); diff --git a/docs/source/tutorial-contract.rst b/docs/source/tutorial-contract.rst index 1cffea1982..3768c34fc9 100644 --- a/docs/source/tutorial-contract.rst +++ b/docs/source/tutorial-contract.rst @@ -303,7 +303,7 @@ run two contracts one time each: Cash and CommercialPaper. @Override public void verify(LedgerTransaction tx) { List> groups = tx.groupStates(State.class, State::withoutOwner); - AuthenticatedObject cmd = requireSingleCommand(tx.getCommands(), Commands.class); + CommandWithParties cmd = requireSingleCommand(tx.getCommands(), Commands.class); We start by using the ``groupStates`` method, which takes a type and a function. State grouping is a way of ensuring your contract can handle multiple unrelated states of the same type in the same transaction, which is needed for diff --git a/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java b/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java index b782eb7bd9..c5e669f345 100644 --- a/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java +++ b/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java @@ -155,11 +155,11 @@ public class JavaCommercialPaper implements Contract { } @NotNull - private List> extractCommands(@NotNull LedgerTransaction tx) { + private List> extractCommands(@NotNull LedgerTransaction tx) { return tx.getCommands() .stream() - .filter((AuthenticatedObject command) -> command.getValue() instanceof Commands) - .map((AuthenticatedObject command) -> new AuthenticatedObject<>(command.getSigners(), command.getSigningParties(), (Commands) command.getValue())) + .filter((CommandWithParties command) -> command.getValue() instanceof Commands) + .map((CommandWithParties command) -> new CommandWithParties<>(command.getSigners(), command.getSigningParties(), (Commands) command.getValue())) .collect(Collectors.toList()); } @@ -171,17 +171,17 @@ public class JavaCommercialPaper implements Contract { // There are two possible things that can be done with this CP. The first is trading it. The second is redeeming // it for cash on or after the maturity date. - final List> commands = tx.getCommands().stream().filter( + final List> commands = tx.getCommands().stream().filter( it -> it.getValue() instanceof Commands ).collect(Collectors.toList()); - final AuthenticatedObject command = onlyElementOf(commands); + final CommandWithParties command = onlyElementOf(commands); final TimeWindow timeWindow = tx.getTimeWindow(); for (final LedgerTransaction.InOutGroup group : groups) { final List inputs = group.getInputs(); final List outputs = group.getOutputs(); if (command.getValue() instanceof Commands.Move) { - final AuthenticatedObject cmd = requireSingleCommand(tx.getCommands(), Commands.Move.class); + final CommandWithParties cmd = requireSingleCommand(tx.getCommands(), Commands.Move.class); // There should be only a single input due to aggregation above final State input = onlyElementOf(inputs); @@ -193,7 +193,7 @@ public class JavaCommercialPaper implements Contract { throw new IllegalStateException("the state is propagated"); } } else if (command.getValue() instanceof Commands.Redeem) { - final AuthenticatedObject cmd = requireSingleCommand(tx.getCommands(), Commands.Redeem.class); + final CommandWithParties cmd = requireSingleCommand(tx.getCommands(), Commands.Redeem.class); // There should be only a single input due to aggregation above final State input = onlyElementOf(inputs); @@ -216,7 +216,7 @@ public class JavaCommercialPaper implements Contract { return Unit.INSTANCE; }); } else if (command.getValue() instanceof Commands.Issue) { - final AuthenticatedObject cmd = requireSingleCommand(tx.getCommands(), Commands.Issue.class); + final CommandWithParties cmd = requireSingleCommand(tx.getCommands(), Commands.Issue.class); final State output = onlyElementOf(outputs); final Instant time = null == timeWindow ? null diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt index 411c9e4e08..e6344db586 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt @@ -106,7 +106,7 @@ interface CashSelection { * vaults can ignore the issuer/depositRefs and just examine the amount fields. */ class Cash : OnLedgerAsset() { - override fun extractCommands(commands: Collection>): List> + override fun extractCommands(commands: Collection>): List> = commands.select() // DOCSTART 1 @@ -238,7 +238,7 @@ class Cash : OnLedgerAsset() { private fun verifyIssueCommand(inputs: List, outputs: List, tx: LedgerTransaction, - issueCommand: AuthenticatedObject, + issueCommand: CommandWithParties, currency: Currency, issuer: PartyAndReference) { // If we have an issue command, perform special processing: the group is allowed to have no inputs, diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/CommodityContract.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/CommodityContract.kt index 995b56a6fc..dac289882d 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/CommodityContract.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/CommodityContract.kt @@ -123,7 +123,7 @@ class CommodityContract : OnLedgerAsset, outputs: List, tx: LedgerTransaction, - issueCommand: AuthenticatedObject, + issueCommand: CommandWithParties, commodity: Commodity, issuer: PartyAndReference) { // If we have an issue command, perform special processing: the group is allowed to have no inputs, @@ -147,7 +147,7 @@ class CommodityContract : OnLedgerAsset>): List> + override fun extractCommands(commands: Collection>): List> = commands.select() /** diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/Obligation.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/Obligation.kt index e41b8c6389..ff72af7503 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/Obligation.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/Obligation.kt @@ -283,7 +283,7 @@ class Obligation

: Contract { private fun verifyIssueCommand(tx: LedgerTransaction, inputs: List>>, outputs: List>>, - issueCommand: AuthenticatedObject, + issueCommand: CommandWithParties, key: Issued>) { // If we have an issue command, perform special processing: the group is allowed to have no inputs, // and the output states must have a deposit reference owned by the signer. @@ -311,7 +311,7 @@ class Obligation

: Contract { private fun verifySettleCommand(tx: LedgerTransaction, inputs: List>>, outputs: List>>, - command: AuthenticatedObject>, + command: CommandWithParties>, groupingKey: Issued>) { val obligor = groupingKey.issuer.party val template = groupingKey.product @@ -394,7 +394,7 @@ class Obligation

: Contract { } } - private fun verifyNetCommand(tx: LedgerTransaction, command: AuthenticatedObject) { + private fun verifyNetCommand(tx: LedgerTransaction, command: CommandWithParties) { val groups = when (command.value.type) { NetType.CLOSE_OUT -> tx.groupStates { it: Obligation.State

-> it.bilateralNetState } NetType.PAYMENT -> tx.groupStates { it: Obligation.State

-> it.multilateralNetState } @@ -434,7 +434,7 @@ class Obligation

: Contract { private fun verifySetLifecycleCommand(inputs: List>>, outputs: List>>, tx: LedgerTransaction, - setLifecycleCommand: AuthenticatedObject) { + setLifecycleCommand: CommandWithParties) { // Default must not change anything except lifecycle, so number of inputs and outputs must match // exactly. require(inputs.size == outputs.size) { "Number of inputs and outputs must match" } diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/OnLedgerAsset.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/OnLedgerAsset.kt index 7205ce5366..a1b5a7a1d9 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/OnLedgerAsset.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/OnLedgerAsset.kt @@ -282,7 +282,7 @@ abstract class OnLedgerAsset> : C } } - abstract fun extractCommands(commands: Collection>): Collection> + abstract fun extractCommands(commands: Collection>): Collection> /** * Generate an transaction exiting assets from the ledger. diff --git a/finance/src/test/kotlin/net/corda/finance/contracts/asset/DummyFungibleContract.kt b/finance/src/test/kotlin/net/corda/finance/contracts/asset/DummyFungibleContract.kt index 330c5ee4e9..be5ff9a189 100644 --- a/finance/src/test/kotlin/net/corda/finance/contracts/asset/DummyFungibleContract.kt +++ b/finance/src/test/kotlin/net/corda/finance/contracts/asset/DummyFungibleContract.kt @@ -18,7 +18,7 @@ import java.security.PublicKey import java.util.* class DummyFungibleContract : OnLedgerAsset() { - override fun extractCommands(commands: Collection>): List> + override fun extractCommands(commands: Collection>): List> = commands.select() data class State( @@ -127,7 +127,7 @@ class DummyFungibleContract : OnLedgerAsset, outputs: List, tx: LedgerTransaction, - issueCommand: AuthenticatedObject, + issueCommand: CommandWithParties, currency: Currency, issuer: PartyAndReference) { // If we have an issue command, perform special processing: the group is allowed to have no inputs, diff --git a/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt b/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt index 431bf0c1c0..8a3d074e24 100644 --- a/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt +++ b/samples/irs-demo/src/main/kotlin/net/corda/irs/contract/IRS.kt @@ -511,7 +511,7 @@ class InterestRateSwap : Contract { checkLegDates(listOf(irs.fixedLeg, irs.floatingLeg)) } - private fun verifyFixCommand(inputs: List, outputs: List, command: AuthenticatedObject) { + private fun verifyFixCommand(inputs: List, outputs: List, command: CommandWithParties) { val irs = outputs.filterIsInstance().single() val prevIrs = inputs.filterIsInstance().single() val paymentDifferences = getFloatingLegPaymentsDifferences(prevIrs.calculation.floatingLegPaymentSchedule, irs.calculation.floatingLegPaymentSchedule) From 954ed69102baffd60474f294dc3115b14473613a Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko <31008341+vkolomeyko@users.noreply.github.com> Date: Fri, 1 Sep 2017 14:45:14 +0100 Subject: [PATCH 055/120] CORDA-540: Introduce mandatory reason for "kryoSpecific" (#1386) * CORDA-540: Introduce mandatory reason for "kryoSpecific" ... before we forget why they are ignored in such a way * CORDA-540: Write a test that exposes list serialization problem in AMQP mode * Revert "Remove CompositeSignaturesWithKeys" This reverts commit 9b3cad3 --- .../corda/core/crypto/CompositeSignature.kt | 7 ++--- .../composite/CompositeSignaturesWithKeys.kt | 15 +++++++++++ .../corda/core/crypto/CompositeKeyTests.kt | 19 +++++++------- .../nodeapi/AttachmentClassLoaderTests.kt | 3 +-- .../serialization/ListsSerializationTest.kt | 26 +++++++++++++++++++ .../kotlin/net/corda/testing/CoreTestUtils.kt | 4 +-- 6 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignaturesWithKeys.kt create mode 100644 node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt diff --git a/core/src/main/kotlin/net/corda/core/crypto/CompositeSignature.kt b/core/src/main/kotlin/net/corda/core/crypto/CompositeSignature.kt index 2e84d467b4..0438a630ae 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/CompositeSignature.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CompositeSignature.kt @@ -1,5 +1,6 @@ package net.corda.core.crypto +import net.corda.core.crypto.composite.CompositeSignaturesWithKeys import net.corda.core.serialization.deserialize import java.io.ByteArrayOutputStream import java.security.* @@ -75,10 +76,10 @@ class CompositeSignature : Signature(SIGNATURE_ALGORITHM) { data class State(val buffer: ByteArrayOutputStream, val verifyKey: CompositeKey) { fun engineVerify(sigBytes: ByteArray): Boolean { - val sigs = sigBytes.deserialize>() - return if (verifyKey.isFulfilledBy(sigs.map { it.by })) { + val sig = sigBytes.deserialize() + return if (verifyKey.isFulfilledBy(sig.sigs.map { it.by })) { val clearData = SecureHash.SHA256(buffer.toByteArray()) - sigs.all { it.isValid(clearData) } + sig.sigs.all { it.isValid(clearData) } } else { false } diff --git a/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignaturesWithKeys.kt b/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignaturesWithKeys.kt new file mode 100644 index 0000000000..f9c8da8ab3 --- /dev/null +++ b/core/src/main/kotlin/net/corda/core/crypto/composite/CompositeSignaturesWithKeys.kt @@ -0,0 +1,15 @@ +package net.corda.core.crypto.composite + +import net.corda.core.crypto.TransactionSignature +import net.corda.core.serialization.CordaSerializable + +/** + * Custom class for holding signature data. This exists for later extension work to provide a standardised cross-platform + * serialization format. + */ +@CordaSerializable +data class CompositeSignaturesWithKeys(val sigs: List) { + companion object { + val EMPTY = CompositeSignaturesWithKeys(emptyList()) + } +} diff --git a/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt b/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt index 38b75bd2f0..0b9ede1d80 100644 --- a/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt +++ b/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt @@ -1,6 +1,7 @@ package net.corda.core.crypto import net.corda.core.crypto.CompositeKey.NodeAndWeight +import net.corda.core.crypto.composite.CompositeSignaturesWithKeys import net.corda.core.internal.declaredField import net.corda.core.internal.div import net.corda.core.serialization.serialize @@ -160,17 +161,17 @@ class CompositeKeyTests : TestDependencyInjectionBase() { engine.initVerify(twoOfThree) engine.update(secureHash.bytes) - assertFalse { engine.verify(listOf(aliceSignature).serialize().bytes) } - assertFalse { engine.verify(listOf(bobSignature).serialize().bytes) } - assertFalse { engine.verify(listOf(charlieSignature).serialize().bytes) } - assertTrue { engine.verify(listOf(aliceSignature, bobSignature).serialize().bytes) } - assertTrue { engine.verify(listOf(aliceSignature, charlieSignature).serialize().bytes) } - assertTrue { engine.verify(listOf(bobSignature, charlieSignature).serialize().bytes) } - assertTrue { engine.verify(listOf(aliceSignature, bobSignature, charlieSignature).serialize().bytes) } + assertFalse { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature)).serialize().bytes) } + assertFalse { engine.verify(CompositeSignaturesWithKeys(listOf(bobSignature)).serialize().bytes) } + assertFalse { engine.verify(CompositeSignaturesWithKeys(listOf(charlieSignature)).serialize().bytes) } + assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, bobSignature)).serialize().bytes) } + assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, charlieSignature)).serialize().bytes) } + assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(bobSignature, charlieSignature)).serialize().bytes) } + assertTrue { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, bobSignature, charlieSignature)).serialize().bytes) } // Check the underlying signature is validated val brokenBobSignature = TransactionSignature(aliceSignature.bytes, bobSignature.by, SignatureMetadata(1, Crypto.findSignatureScheme(bobSignature.by).schemeNumberID)) - assertFalse { engine.verify(listOf(aliceSignature, brokenBobSignature).serialize().bytes) } + assertFalse { engine.verify(CompositeSignaturesWithKeys(listOf(aliceSignature, brokenBobSignature)).serialize().bytes) } } @Test() @@ -216,7 +217,7 @@ class CompositeKeyTests : TestDependencyInjectionBase() { } @Test() - fun `composite key validation with graph cycle detection`() = kryoSpecific { + fun `composite key validation with graph cycle detection`() = kryoSpecific("Cycle exists in the object graph which is not currently supported in AMQP mode") { val key1 = CompositeKey.Builder().addKeys(alicePublicKey, bobPublicKey).build() as CompositeKey val key2 = CompositeKey.Builder().addKeys(alicePublicKey, key1).build() as CompositeKey val key3 = CompositeKey.Builder().addKeys(alicePublicKey, key2).build() as CompositeKey diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt index 093479b20b..e566f957dc 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt @@ -331,8 +331,7 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { } @Test - // Kryo verifies/loads attachments on deserialization, whereas AMQP currently does not - fun `test deserialize of WireTransaction where contract cannot be found`() = kryoSpecific { + fun `test deserialize of WireTransaction where contract cannot be found`() = kryoSpecific("Kryo verifies/loads attachments on deserialization, whereas AMQP currently does not") { val child = ClassLoaderForTests() val contractClass = Class.forName("net.corda.contracts.isolated.AnotherDummyContract", true, child) val contract = contractClass.newInstance() as DummyContractBackdoor diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt new file mode 100644 index 0000000000..09941c8afc --- /dev/null +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt @@ -0,0 +1,26 @@ +package net.corda.nodeapi.internal.serialization + +import net.corda.core.serialization.SerializedBytes +import net.corda.core.serialization.deserialize +import net.corda.core.serialization.serialize +import net.corda.testing.TestDependencyInjectionBase +import net.corda.testing.kryoSpecific +import org.junit.Test +import kotlin.test.assertEquals + +class ListsSerializationTest : TestDependencyInjectionBase() { + + @Test + fun `check list can be serialized as root of serialization graph`() = kryoSpecific("AMQP doesn't support lists as the root of serialization graph"){ + assertEqualAfterRoundTripSerialization(listOf(1)) + assertEqualAfterRoundTripSerialization(listOf(1, 2)) + } + + private inline fun assertEqualAfterRoundTripSerialization(obj: T) { + + val serializedForm: SerializedBytes = obj.serialize() + val deserializedInstance = serializedForm.deserialize() + + assertEquals(obj, deserializedInstance) + } +} \ No newline at end of file diff --git a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt index fc921d0acd..9ebc941fad 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt @@ -222,8 +222,8 @@ fun getTestPartyAndCertificate(name: X500Name, publicKey: PublicKey, trustRoot: return getTestPartyAndCertificate(Party(name, publicKey), trustRoot) } -inline fun kryoSpecific(function: () -> Unit) = if(!AMQP_ENABLED) { +inline fun kryoSpecific(reason: String, function: () -> Unit) = if(!AMQP_ENABLED) { function() } else { - loggerFor().info("Ignoring Kryo specific test") + loggerFor().info("Ignoring Kryo specific test, reason: $reason" ) } \ No newline at end of file From 76b46e4e4e20c2c56743bc143b34dfb633197496 Mon Sep 17 00:00:00 2001 From: joeldudleyr3 Date: Fri, 1 Sep 2017 14:50:29 +0100 Subject: [PATCH 056/120] Addresses review feedback. --- docs/source/api-core-types.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/api-core-types.rst b/docs/source/api-core-types.rst index faf4c32ccb..31593f990a 100644 --- a/docs/source/api-core-types.rst +++ b/docs/source/api-core-types.rst @@ -42,7 +42,7 @@ fleshed out. CommandWithParties ------------------ -A ``CommandWithParties`` represents a command and the list of associated signers. +A ``CommandWithParties`` represents a command and the list of associated signers' identities. Multi-signature support ----------------------- From c43dd079e4966f8ca1886e6de6ecbcaa20f0f1c9 Mon Sep 17 00:00:00 2001 From: joeldudleyr3 Date: Fri, 1 Sep 2017 15:34:57 +0100 Subject: [PATCH 057/120] Addresses review feedback. --- .../kotlin/net/corda/testing/driver/Driver.kt | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt index 44933024c0..e2c2539f10 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -229,6 +229,8 @@ sealed class PortAllocation { * * The driver implicitly bootstraps a [NetworkMapService]. * + * @param defaultParameters The default parameters for the driver. Allows the driver to be configured in builder style + * when called from Java code. * @param isDebug Indicates whether the spawned nodes should start in jdwt debug mode and have debug level logging. * @param driverDirectory The base directory node directories go into, defaults to "build//". The node * directories themselves are "//", where legalName defaults to "-" @@ -244,9 +246,9 @@ sealed class PortAllocation { * @return The value returned in the [dsl] closure. */ fun driver( + defaultParameters: DriverParameters = DriverParameters(), isDebug: Boolean = defaultParameters.isDebug, - // The directory must be different for each call to `driver`. - driverDirectory: Path = Paths.get("build", getTimestampAsDirectoryName()), + driverDirectory: Path = defaultParameters.driverDirectory, portAllocation: PortAllocation = defaultParameters.portAllocation, debugPortAllocation: PortAllocation = defaultParameters.debugPortAllocation, systemProperties: Map = defaultParameters.systemProperties, @@ -273,24 +275,23 @@ fun driver( ) } +/** + * Helper function for starting a [driver] with custom parameters from Java. + * + * @param defaultParameters The default parameters for the driver. + * @param dsl The dsl itself. + * @return The value returned in the [dsl] closure. + */ fun driver( parameters: DriverParameters, dsl: DriverDSLExposedInterface.() -> A ): A { - return driver( - isDebug = parameters.isDebug, - driverDirectory = parameters.driverDirectory, - portAllocation = parameters.portAllocation, - debugPortAllocation = parameters.debugPortAllocation, - systemProperties = parameters.systemProperties, - useTestClock = parameters.useTestClock, - initialiseSerialization = parameters.initialiseSerialization, - networkMapStartStrategy = parameters.networkMapStartStrategy, - startNodesInProcess = parameters.startNodesInProcess, - dsl = dsl - ) + return driver(defaultParameters = parameters, dsl = dsl) } +/** + * Helper builder for configuring a [driver] from Java. + */ data class DriverParameters( val isDebug: Boolean = false, val driverDirectory: Path = Paths.get("build", getTimestampAsDirectoryName()), @@ -313,8 +314,6 @@ data class DriverParameters( fun setStartNodesInProcess(startNodesInProcess: Boolean) = copy(startNodesInProcess = startNodesInProcess) } -private val defaultParameters = DriverParameters() - /** * This is a helper method to allow extending of the DSL, along the lines of * interface SomeOtherExposedDSLInterface : DriverDSLExposedInterface From a286f7553b12c856eb4561c969a6cefd5b612bb6 Mon Sep 17 00:00:00 2001 From: josecoll Date: Fri, 1 Sep 2017 15:44:53 +0100 Subject: [PATCH 058/120] Enable RPC start of Flows that return nothing (eg. Void). (#1374) * Enable RPC start of Flows that return nothing (eg. Void). * Fix blocking test (caused by not running mockNetwork). Improve execution times by moving redundant setup() initialisation to only tests that use it. --- .../net/corda/core/messaging/CordaRPCOps.kt | 32 ++++++++--------- .../corda/node/internal/CordaRPCOpsImpl.kt | 6 ++-- .../node/services/api/ServiceHubInternal.kt | 2 +- .../net/corda/node/CordaRPCOpsImplTest.kt | 35 +++++++++++++++---- 4 files changed, 49 insertions(+), 26 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt b/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt index e7734161f4..a0aa250f88 100644 --- a/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt +++ b/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt @@ -194,14 +194,14 @@ interface CordaRPCOps : RPCOps { * Start the given flow with the given arguments. [logicType] must be annotated with [net.corda.core.flows.StartableByRPC]. */ @RPCReturnsObservables - fun startFlowDynamic(logicType: Class>, vararg args: Any?): FlowHandle + fun startFlowDynamic(logicType: Class>, vararg args: Any?): FlowHandle /** * Start the given flow with the given arguments, returning an [Observable] with a single observation of the * result of running the flow. [logicType] must be annotated with [net.corda.core.flows.StartableByRPC]. */ @RPCReturnsObservables - fun startTrackedFlowDynamic(logicType: Class>, vararg args: Any?): FlowProgressHandle + fun startTrackedFlowDynamic(logicType: Class>, vararg args: Any?): FlowProgressHandle /** * Returns Node's identity, assuming this will not change while the node is running. @@ -327,25 +327,25 @@ inline fun CordaRPCOps.vaultTrackBy(criteria: QueryC * Note that the passed in constructor function is only used for unification of other type parameters and reification of * the Class instance of the flow. This could be changed to use the constructor function directly. */ -inline fun > CordaRPCOps.startFlow( +inline fun > CordaRPCOps.startFlow( @Suppress("UNUSED_PARAMETER") flowConstructor: () -> R ): FlowHandle = startFlowDynamic(R::class.java) -inline fun > CordaRPCOps.startFlow( +inline fun > CordaRPCOps.startFlow( @Suppress("UNUSED_PARAMETER") flowConstructor: (A) -> R, arg0: A ): FlowHandle = startFlowDynamic(R::class.java, arg0) -inline fun > CordaRPCOps.startFlow( +inline fun > CordaRPCOps.startFlow( @Suppress("UNUSED_PARAMETER") flowConstructor: (A, B) -> R, arg0: A, arg1: B ): FlowHandle = startFlowDynamic(R::class.java, arg0, arg1) -inline fun > CordaRPCOps.startFlow( +inline fun > CordaRPCOps.startFlow( @Suppress("UNUSED_PARAMETER") flowConstructor: (A, B, C) -> R, arg0: A, @@ -353,7 +353,7 @@ inline fun > CordaRPCOps.startFlow( arg2: C ): FlowHandle = startFlowDynamic(R::class.java, arg0, arg1, arg2) -inline fun > CordaRPCOps.startFlow( +inline fun > CordaRPCOps.startFlow( @Suppress("UNUSED_PARAMETER") flowConstructor: (A, B, C, D) -> R, arg0: A, @@ -362,7 +362,7 @@ inline fun > CordaRPCOps.startFlow arg3: D ): FlowHandle = startFlowDynamic(R::class.java, arg0, arg1, arg2, arg3) -inline fun > CordaRPCOps.startFlow( +inline fun > CordaRPCOps.startFlow( @Suppress("UNUSED_PARAMETER") flowConstructor: (A, B, C, D, E) -> R, arg0: A, @@ -372,7 +372,7 @@ inline fun > CordaRPCOps.startF arg4: E ): FlowHandle = startFlowDynamic(R::class.java, arg0, arg1, arg2, arg3, arg4) -inline fun > CordaRPCOps.startFlow( +inline fun > CordaRPCOps.startFlow( @Suppress("UNUSED_PARAMETER") flowConstructor: (A, B, C, D, E, F) -> R, arg0: A, @@ -387,20 +387,20 @@ inline fun > CordaRPCOps.sta * Same again, except this time with progress-tracking enabled. */ @Suppress("unused") -inline fun > CordaRPCOps.startTrackedFlow( +inline fun > CordaRPCOps.startTrackedFlow( @Suppress("unused_parameter") flowConstructor: () -> R ): FlowProgressHandle = startTrackedFlowDynamic(R::class.java) @Suppress("unused") -inline fun > CordaRPCOps.startTrackedFlow( +inline fun > CordaRPCOps.startTrackedFlow( @Suppress("unused_parameter") flowConstructor: (A) -> R, arg0: A ): FlowProgressHandle = startTrackedFlowDynamic(R::class.java, arg0) @Suppress("unused") -inline fun > CordaRPCOps.startTrackedFlow( +inline fun > CordaRPCOps.startTrackedFlow( @Suppress("unused_parameter") flowConstructor: (A, B) -> R, arg0: A, @@ -408,7 +408,7 @@ inline fun > CordaRPCOps.startTrackedFlo ): FlowProgressHandle = startTrackedFlowDynamic(R::class.java, arg0, arg1) @Suppress("unused") -inline fun > CordaRPCOps.startTrackedFlow( +inline fun > CordaRPCOps.startTrackedFlow( @Suppress("unused_parameter") flowConstructor: (A, B, C) -> R, arg0: A, @@ -417,7 +417,7 @@ inline fun > CordaRPCOps.startTracked ): FlowProgressHandle = startTrackedFlowDynamic(R::class.java, arg0, arg1, arg2) @Suppress("unused") -inline fun > CordaRPCOps.startTrackedFlow( +inline fun > CordaRPCOps.startTrackedFlow( @Suppress("unused_parameter") flowConstructor: (A, B, C, D) -> R, arg0: A, @@ -427,7 +427,7 @@ inline fun > CordaRPCOps.startTrac ): FlowProgressHandle = startTrackedFlowDynamic(R::class.java, arg0, arg1, arg2, arg3) @Suppress("unused") -inline fun > CordaRPCOps.startTrackedFlow( +inline fun > CordaRPCOps.startTrackedFlow( @Suppress("unused_parameter") flowConstructor: (A, B, C, D, E) -> R, arg0: A, @@ -438,7 +438,7 @@ inline fun > CordaRPCOps.startT ): FlowProgressHandle = startTrackedFlowDynamic(R::class.java, arg0, arg1, arg2, arg3, arg4) @Suppress("unused") -inline fun > CordaRPCOps.startTrackedFlow( +inline fun > CordaRPCOps.startTrackedFlow( @Suppress("unused_parameter") flowConstructor: (A, B, C, D, E, F) -> R, arg0: A, diff --git a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt index d4f51ee21f..0e76592081 100644 --- a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt +++ b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt @@ -127,7 +127,7 @@ class CordaRPCOpsImpl( } } - override fun startTrackedFlowDynamic(logicType: Class>, vararg args: Any?): FlowProgressHandle { + override fun startTrackedFlowDynamic(logicType: Class>, vararg args: Any?): FlowProgressHandle { val stateMachine = startFlow(logicType, args) return FlowProgressHandleImpl( id = stateMachine.id, @@ -136,12 +136,12 @@ class CordaRPCOpsImpl( ) } - override fun startFlowDynamic(logicType: Class>, vararg args: Any?): FlowHandle { + override fun startFlowDynamic(logicType: Class>, vararg args: Any?): FlowHandle { val stateMachine = startFlow(logicType, args) return FlowHandleImpl(id = stateMachine.id, returnValue = stateMachine.resultFuture) } - private fun startFlow(logicType: Class>, args: Array): FlowStateMachineImpl { + private fun startFlow(logicType: Class>, args: Array): FlowStateMachineImpl { require(logicType.isAnnotationPresent(StartableByRPC::class.java)) { "${logicType.name} was not designed for RPC" } val rpcContext = getRpcContext() rpcContext.requirePermission(startFlowPermission(logicType)) diff --git a/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt b/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt index 260e930ce8..5aee5ca7b9 100644 --- a/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt +++ b/node/src/main/kotlin/net/corda/node/services/api/ServiceHubInternal.kt @@ -126,7 +126,7 @@ interface ServiceHubInternal : PluginServiceHub { * @throws net.corda.core.flows.IllegalFlowLogicException or IllegalArgumentException if there are problems with the * [logicType] or [args]. */ - fun invokeFlowAsync( + fun invokeFlowAsync( logicType: Class>, flowInitiator: FlowInitiator, vararg args: Any?): FlowStateMachineImpl { diff --git a/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt b/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt index 158a8ce8b3..d252d5a048 100644 --- a/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt +++ b/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt @@ -7,6 +7,7 @@ import net.corda.core.contracts.Issued import net.corda.core.crypto.isFulfilledBy import net.corda.core.crypto.keys import net.corda.core.flows.FlowLogic +import net.corda.core.flows.StartableByRPC import net.corda.core.flows.StateMachineRunId import net.corda.core.messaging.* import net.corda.core.node.services.ServiceInfo @@ -44,6 +45,7 @@ import rx.Observable import java.io.ByteArrayOutputStream import kotlin.test.assertEquals import kotlin.test.assertFalse +import kotlin.test.assertNull import kotlin.test.assertTrue class CordaRPCOpsImplTest { @@ -71,12 +73,6 @@ class CordaRPCOpsImplTest { startFlowPermission(), startFlowPermission() )))) - - aliceNode.database.transaction { - stateMachineUpdates = rpc.stateMachinesFeed().updates - transactions = rpc.verifiedTransactionsFeed().updates - vaultTrackCash = rpc.vaultTrackBy().updates - } } @After @@ -86,6 +82,11 @@ class CordaRPCOpsImplTest { @Test fun `cash issue accepted`() { + aliceNode.database.transaction { + stateMachineUpdates = rpc.stateMachinesFeed().updates + vaultTrackCash = rpc.vaultTrackBy().updates + } + val quantity = 1000L val ref = OpaqueBytes(ByteArray(1) { 1 }) @@ -131,6 +132,12 @@ class CordaRPCOpsImplTest { @Test fun `issue and move`() { + aliceNode.database.transaction { + stateMachineUpdates = rpc.stateMachinesFeed().updates + transactions = rpc.verifiedTransactionsFeed().updates + vaultTrackCash = rpc.vaultTrackBy().updates + } + val anonymous = false val result = rpc.startFlow(::CashIssueFlow, 100.DOLLARS, @@ -248,4 +255,20 @@ class CordaRPCOpsImplTest { @Suspendable override fun call() = Unit } + + @Test + fun `attempt to start RPC flow with void return`() { + CURRENT_RPC_CONTEXT.set(RpcContext(User("user", "pwd", permissions = setOf( + startFlowPermission() + )))) + val result = rpc.startFlow(::VoidRPCFlow) + mockNet.runNetwork() + assertNull(result.returnValue.getOrThrow()) + } + + @StartableByRPC + class VoidRPCFlow : FlowLogic() { + @Suspendable + override fun call() : Void? = null + } } From fef8a997f26eabdfe528b16bc699c836387bfa3c Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Fri, 1 Sep 2017 16:07:30 +0100 Subject: [PATCH 059/120] =?UTF-8?q?Fix=20the=20ToStringSerializer=20so=20i?= =?UTF-8?q?t=20interacts=20with=20reference=20counting=20co=E2=80=A6=20(#1?= =?UTF-8?q?385)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix the ToStringSerializer so it interacts with reference counting correctly, and stop ref counting byte arrays since they are invariable wrapped in an object we do reference count. * Pull out object reference condition into a helper function shared by serialization and deserialization --- .../serialization/amqp/CustomSerializer.kt | 5 ++- .../amqp/DeserializationInput.kt | 2 +- .../serialization/amqp/SerializationHelper.kt | 5 ++- .../serialization/amqp/SerializationOutput.kt | 2 +- .../amqp/SerializationOutputTests.kt | 32 +++++++++++++++++++ 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt index 032c453751..f9a98cf109 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt @@ -1,6 +1,5 @@ package net.corda.nodeapi.internal.serialization.amqp -import net.corda.core.serialization.SerializationDefaults import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.nameForType import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type @@ -160,11 +159,11 @@ abstract class CustomSerializer : AMQPSerializer { descriptor, emptyList()))) override fun writeDescribedObject(obj: T, data: Data, type: Type, output: SerializationOutput) { - data.putObject(unmaker(obj)) + data.putString(unmaker(obj)) } override fun readObject(obj: Any, schema: Schema, input: DeserializationInput): T { - val proxy = input.readObject(obj, schema, String::class.java) as String + val proxy = obj as String return maker(proxy) } } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt index 12d71a0f17..a8d3a94d2f 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt @@ -142,7 +142,7 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { } // Store the reference in case we need it later on. // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content - if (type.asClass()?.isPrimitive != true) objectHistory.add(objectRead) + if (suitableForObjectReference(type)) objectHistory.add(objectRead) objectRead } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt index 1d23931e1b..2a5fe70f2c 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt @@ -219,4 +219,7 @@ internal fun Type.asParameterizedType(): ParameterizedType { internal fun Type.isSubClassOf(type: Type): Boolean { return TypeToken.of(this).isSubtypeOf(type) -} \ No newline at end of file +} + +internal fun suitableForObjectReference(type: Type) = + type != ByteArray::class.java && type.asClass()?.isPrimitive != true \ No newline at end of file diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt index 0274739a0c..7246b4fb34 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt @@ -87,7 +87,7 @@ open class SerializationOutput(internal val serializerFactory: SerializerFactory // Important to do it after serialization such that dependent object will have preceding reference numbers // assigned to them first as they will be first read from the stream on receiving end. // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content - if (type.asClass()?.isPrimitive != true) objectHistory.put(obj, objectHistory.size) + if (suitableForObjectReference(type)) objectHistory.put(obj, objectHistory.size) } else { data.writeReferencedObject(ReferencedObject(retrievedRefCount)) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt index f5954305ca..f2798fcdfd 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt @@ -21,6 +21,7 @@ import net.corda.testing.MEGA_CORP_PUBKEY import org.apache.qpid.proton.amqp.* import org.apache.qpid.proton.codec.DecoderImpl import org.apache.qpid.proton.codec.EncoderImpl +import org.junit.Assert.assertNotSame import org.junit.Assert.assertSame import org.junit.Ignore import org.junit.Test @@ -834,4 +835,35 @@ class SerializationOutputTests { val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) serdes(obj, factory, factory2) } + + data class BigDecimals(val a: BigDecimal, val b: BigDecimal) + + @Test + fun `test toString custom serializer`() { + val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + + val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + + val obj = BigDecimals(BigDecimal.TEN, BigDecimal.TEN) + val objCopy = serdes(obj, factory, factory2) + assertEquals(objCopy.a, objCopy.b) + } + + data class ByteArrays(val a: ByteArray, val b: ByteArray) + + @Test + fun `test byte arrays not reference counted`() { + val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + + val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + + val bytes = ByteArray(1) + val obj = ByteArrays(bytes, bytes) + val objCopy = serdes(obj, factory, factory2, false, false) + assertNotSame(objCopy.a, objCopy.b) + } } \ No newline at end of file From 83d0095142d1dc2caeb0485cd814a3f1fbf79f02 Mon Sep 17 00:00:00 2001 From: joeldudleyr3 Date: Fri, 1 Sep 2017 16:45:00 +0100 Subject: [PATCH 060/120] Adds a builder for configuring nodes in the driver for Java interop. --- .../corda/client/jfx/NodeMonitorModelTest.kt | 8 +-- .../corda/docs/IntegrationTestingTutorial.kt | 6 +-- .../net/corda/docs/ClientRpcTutorial.kt | 4 +- .../kotlin/net/corda/node/BootTests.kt | 6 +-- .../corda/node/CordappScanningDriverTest.kt | 4 +- .../node/services/DistributedServiceTests.kt | 2 +- .../attachmentdemo/AttachmentDemoTest.kt | 6 +-- .../kotlin/net/corda/attachmentdemo/Main.kt | 6 +-- .../net/corda/bank/BankOfCordaHttpAPITest.kt | 4 +- .../corda/bank/BankOfCordaRPCClientTest.kt | 6 ++- .../net/corda/bank/BankOfCordaDriver.kt | 7 +-- .../kotlin/net/corda/irs/IRSDemoTest.kt | 6 +-- .../src/test/kotlin/net/corda/irs/Main.kt | 6 +-- .../net/corda/vega/SimmValuationTest.kt | 4 +- .../src/test/kotlin/net/corda/vega/Main.kt | 8 +-- .../test/kotlin/net/corda/traderdemo/Main.kt | 8 +-- .../net/corda/testing/driver/DriverTests.kt | 10 ++-- .../kotlin/net/corda/testing/TestConstants.kt | 2 +- .../kotlin/net/corda/testing/driver/Driver.kt | 53 +++++++++++++++---- .../net/corda/explorer/ExplorerSimulation.kt | 10 ++-- .../net/corda/verifier/VerifierTests.kt | 4 +- .../corda/webserver/WebserverDriverTests.kt | 2 +- 22 files changed, 105 insertions(+), 67 deletions(-) diff --git a/client/jfx/src/integration-test/kotlin/net/corda/client/jfx/NodeMonitorModelTest.kt b/client/jfx/src/integration-test/kotlin/net/corda/client/jfx/NodeMonitorModelTest.kt index 83453feddd..20e9c8dda5 100644 --- a/client/jfx/src/integration-test/kotlin/net/corda/client/jfx/NodeMonitorModelTest.kt +++ b/client/jfx/src/integration-test/kotlin/net/corda/client/jfx/NodeMonitorModelTest.kt @@ -58,13 +58,13 @@ class NodeMonitorModelTest : DriverBasedTest() { startFlowPermission(), startFlowPermission()) ) - val aliceNodeFuture = startNode(ALICE.name, rpcUsers = listOf(cashUser)) - val notaryNodeFuture = startNode(DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) + val aliceNodeFuture = startNode(providedName = ALICE.name, rpcUsers = listOf(cashUser)) + val notaryNodeFuture = startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) val aliceNodeHandle = aliceNodeFuture.getOrThrow() val notaryNodeHandle = notaryNodeFuture.getOrThrow() aliceNode = aliceNodeHandle.nodeInfo notaryNode = notaryNodeHandle.nodeInfo - newNode = { nodeName -> startNode(nodeName).getOrThrow().nodeInfo } + newNode = { nodeName -> startNode(providedName = nodeName).getOrThrow().nodeInfo } val monitor = NodeMonitorModel() stateMachineTransactionMapping = monitor.stateMachineTransactionMapping.bufferUntilSubscribed() stateMachineUpdates = monitor.stateMachineUpdates.bufferUntilSubscribed() @@ -76,7 +76,7 @@ class NodeMonitorModelTest : DriverBasedTest() { monitor.register(aliceNodeHandle.configuration.rpcAddress!!, cashUser.username, cashUser.password, initialiseSerialization = false) rpc = monitor.proxyObservable.value!! - val bobNodeHandle = startNode(BOB.name, rpcUsers = listOf(cashUser)).getOrThrow() + val bobNodeHandle = startNode(providedName = BOB.name, rpcUsers = listOf(cashUser)).getOrThrow() bobNode = bobNodeHandle.nodeInfo val monitorBob = NodeMonitorModel() stateMachineUpdatesBob = monitorBob.stateMachineUpdates.bufferUntilSubscribed() diff --git a/docs/source/example-code/src/integration-test/kotlin/net/corda/docs/IntegrationTestingTutorial.kt b/docs/source/example-code/src/integration-test/kotlin/net/corda/docs/IntegrationTestingTutorial.kt index e0ad68a957..e14a4e4bbb 100644 --- a/docs/source/example-code/src/integration-test/kotlin/net/corda/docs/IntegrationTestingTutorial.kt +++ b/docs/source/example-code/src/integration-test/kotlin/net/corda/docs/IntegrationTestingTutorial.kt @@ -32,9 +32,9 @@ class IntegrationTestingTutorial { startFlowPermission() )) val (alice, bob, notary) = listOf( - startNode(ALICE.name, rpcUsers = listOf(aliceUser)), - startNode(BOB.name, rpcUsers = listOf(bobUser)), - startNode(DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(ValidatingNotaryService.type))) + startNode(providedName = ALICE.name, rpcUsers = listOf(aliceUser)), + startNode(providedName = BOB.name, rpcUsers = listOf(bobUser)), + startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(ValidatingNotaryService.type))) ).transpose().getOrThrow() // END 1 diff --git a/docs/source/example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt b/docs/source/example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt index 6f6c080322..64992a788f 100644 --- a/docs/source/example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt +++ b/docs/source/example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt @@ -49,8 +49,8 @@ fun main(args: Array) { startFlowPermission())) driver(driverDirectory = baseDirectory) { - startNode(DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(ValidatingNotaryService.type))) - val node = startNode(ALICE.name, rpcUsers = listOf(user)).get() + startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(ValidatingNotaryService.type))) + val node = startNode(providedName = ALICE.name, rpcUsers = listOf(user)).get() // END 1 // START 2 diff --git a/node/src/integration-test/kotlin/net/corda/node/BootTests.kt b/node/src/integration-test/kotlin/net/corda/node/BootTests.kt index f1bb21c2d0..67cf30d78c 100644 --- a/node/src/integration-test/kotlin/net/corda/node/BootTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/BootTests.kt @@ -41,12 +41,12 @@ class BootTests { val logConfigFile = projectRootDir / "config" / "dev" / "log4j2.xml" assertThat(logConfigFile).isRegularFile() driver(isDebug = true, systemProperties = mapOf("log4j.configurationFile" to logConfigFile.toString())) { - val alice = startNode(ALICE.name).get() + val alice = startNode(providedName = ALICE.name).get() val logFolder = alice.configuration.baseDirectory / NodeStartup.LOGS_DIRECTORY_NAME val logFile = logFolder.toFile().listFiles { _, name -> name.endsWith(".log") }.single() // Start second Alice, should fail assertThatThrownBy { - startNode(ALICE.name).getOrThrow() + startNode(providedName = ALICE.name).getOrThrow() } // We count the number of nodes that wrote into the logfile by counting "Logs can be found in" val numberOfNodesThatLogged = Files.lines(logFile.toPath()).filter { NodeStartup.LOGS_CAN_BE_FOUND_IN_STRING in it }.count() @@ -58,7 +58,7 @@ class BootTests { fun `node quits on failure to register with network map`() { val tooManyAdvertisedServices = (1..100).map { ServiceInfo(ServiceType.regulator.getSubType("$it")) }.toSet() driver(networkMapStartStrategy = NetworkMapStartStrategy.Nominated(ALICE.name)) { - val future = startNode(ALICE.name, advertisedServices = tooManyAdvertisedServices) + val future = startNode(providedName = ALICE.name, advertisedServices = tooManyAdvertisedServices) assertFailsWith(ListenProcessDeathException::class) { future.getOrThrow() } } } diff --git a/node/src/integration-test/kotlin/net/corda/node/CordappScanningDriverTest.kt b/node/src/integration-test/kotlin/net/corda/node/CordappScanningDriverTest.kt index 2417f1d329..926dfb1baa 100644 --- a/node/src/integration-test/kotlin/net/corda/node/CordappScanningDriverTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/CordappScanningDriverTest.kt @@ -25,8 +25,8 @@ class CordappScanningDriverTest { // The driver will automatically pick up the annotated flows below driver { val (alice, bob) = listOf( - startNode(ALICE.name, rpcUsers = listOf(user)), - startNode(BOB.name)).transpose().getOrThrow() + startNode(providedName = ALICE.name, rpcUsers = listOf(user)), + startNode(providedName = BOB.name)).transpose().getOrThrow() val initiatedFlowClass = alice.rpcClientToNode() .start(user.username, user.password) .proxy diff --git a/node/src/integration-test/kotlin/net/corda/node/services/DistributedServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/DistributedServiceTests.kt index 26442c108c..1e6daa63e6 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/DistributedServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/DistributedServiceTests.kt @@ -38,7 +38,7 @@ class DistributedServiceTests : DriverBasedTest() { startFlowPermission(), startFlowPermission()) ) - val aliceFuture = startNode(ALICE.name, rpcUsers = listOf(testUser)) + val aliceFuture = startNode(providedName = ALICE.name, rpcUsers = listOf(testUser)) val notariesFuture = startNotaryCluster( DUMMY_NOTARY.name, rpcUsers = listOf(testUser), diff --git a/samples/attachment-demo/src/integration-test/kotlin/net/corda/attachmentdemo/AttachmentDemoTest.kt b/samples/attachment-demo/src/integration-test/kotlin/net/corda/attachmentdemo/AttachmentDemoTest.kt index a8e2787c3a..34ce666450 100644 --- a/samples/attachment-demo/src/integration-test/kotlin/net/corda/attachmentdemo/AttachmentDemoTest.kt +++ b/samples/attachment-demo/src/integration-test/kotlin/net/corda/attachmentdemo/AttachmentDemoTest.kt @@ -20,9 +20,9 @@ class AttachmentDemoTest { driver(dsl = { val demoUser = listOf(User("demo", "demo", setOf(startFlowPermission()))) val (nodeA, nodeB) = listOf( - startNode(DUMMY_BANK_A.name, rpcUsers = demoUser), - startNode(DUMMY_BANK_B.name, rpcUsers = demoUser), - startNode(DUMMY_NOTARY.name, setOf(ServiceInfo(SimpleNotaryService.type))) + startNode(providedName = DUMMY_BANK_A.name, rpcUsers = demoUser), + startNode(providedName = DUMMY_BANK_B.name, rpcUsers = demoUser), + startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) ).transpose().getOrThrow() val senderThread = CompletableFuture.supplyAsync { diff --git a/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/Main.kt b/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/Main.kt index bd586c7542..9f9c269e13 100644 --- a/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/Main.kt +++ b/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/Main.kt @@ -16,9 +16,9 @@ import net.corda.testing.driver.driver fun main(args: Array) { val demoUser = listOf(User("demo", "demo", setOf("StartFlow.net.corda.flows.FinalityFlow"))) driver(isDebug = true, driverDirectory = "build" / "attachment-demo-nodes") { - startNode(DUMMY_NOTARY.name, setOf(ServiceInfo(SimpleNotaryService.type))) - startNode(DUMMY_BANK_A.name, rpcUsers = demoUser) - startNode(DUMMY_BANK_B.name, rpcUsers = demoUser) + startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) + startNode(providedName = DUMMY_BANK_A.name, rpcUsers = demoUser) + startNode(providedName = DUMMY_BANK_B.name, rpcUsers = demoUser) waitForAllNodesToFinish() } } diff --git a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaHttpAPITest.kt b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaHttpAPITest.kt index d6d24385bf..394ed0bf7f 100644 --- a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaHttpAPITest.kt +++ b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaHttpAPITest.kt @@ -16,8 +16,8 @@ class BankOfCordaHttpAPITest { fun `issuer flow via Http`() { driver(dsl = { val (nodeBankOfCorda) = listOf( - startNode(BOC.name, setOf(ServiceInfo(SimpleNotaryService.type))), - startNode(BIGCORP_LEGAL_NAME) + startNode(providedName = BOC.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))), + startNode(providedName = BIGCORP_LEGAL_NAME) ).transpose().getOrThrow() val anonymous = false val nodeBankOfCordaApiAddr = startWebserver(nodeBankOfCorda).getOrThrow().listenAddress diff --git a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt index 4df2768692..31481cf3d4 100644 --- a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt +++ b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt @@ -24,8 +24,10 @@ class BankOfCordaRPCClientTest { startFlowPermission())) val bigCorpCFO = User("bigCorpCFO", "password2", permissions = emptySet()) val (nodeBankOfCorda, nodeBigCorporation) = listOf( - startNode(BOC.name, setOf(ServiceInfo(SimpleNotaryService.type)), listOf(bocManager)), - startNode(BIGCORP_LEGAL_NAME, rpcUsers = listOf(bigCorpCFO)) + startNode(providedName = BOC.name, + advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type)), + rpcUsers = listOf(bocManager)), + startNode(providedName = BIGCORP_LEGAL_NAME, rpcUsers = listOf(bigCorpCFO)) ).transpose().getOrThrow() // Bank of Corda RPC Client diff --git a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaDriver.kt b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaDriver.kt index 0f61b602e0..d1f93ff00c 100644 --- a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaDriver.kt +++ b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaDriver.kt @@ -71,12 +71,13 @@ private class BankOfCordaDriver { val bigCorpUser = User(BIGCORP_USERNAME, "test", permissions = setOf( startFlowPermission())) - startNode(DUMMY_NOTARY.name, setOf(ServiceInfo(SimpleNotaryService.type))) + startNode(providedName = DUMMY_NOTARY.name, + advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) val bankOfCorda = startNode( - BOC.name, + providedName = BOC.name, rpcUsers = listOf(bankUser), advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("issuer.USD")))) - startNode(BIGCORP_LEGAL_NAME, rpcUsers = listOf(bigCorpUser)) + startNode(providedName = BIGCORP_LEGAL_NAME, rpcUsers = listOf(bigCorpUser)) startWebserver(bankOfCorda.get()) waitForAllNodesToFinish() }, isDebug = true) diff --git a/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt b/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt index 8c98accf78..fbea2e1a83 100644 --- a/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt +++ b/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt @@ -45,9 +45,9 @@ class IRSDemoTest : IntegrationTestCategory { fun `runs IRS demo`() { driver(useTestClock = true, isDebug = true) { val (controller, nodeA, nodeB) = listOf( - startNode(DUMMY_NOTARY.name, setOf(ServiceInfo(SimpleNotaryService.type), ServiceInfo(NodeInterestRates.Oracle.type))), - startNode(DUMMY_BANK_A.name, rpcUsers = listOf(rpcUser)), - startNode(DUMMY_BANK_B.name) + startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type), ServiceInfo(NodeInterestRates.Oracle.type))), + startNode(providedName = DUMMY_BANK_A.name, rpcUsers = listOf(rpcUser)), + startNode(providedName = DUMMY_BANK_B.name) ).transpose().getOrThrow() log.info("All nodes started") diff --git a/samples/irs-demo/src/test/kotlin/net/corda/irs/Main.kt b/samples/irs-demo/src/test/kotlin/net/corda/irs/Main.kt index f66fbe7a96..4f9117ed44 100644 --- a/samples/irs-demo/src/test/kotlin/net/corda/irs/Main.kt +++ b/samples/irs-demo/src/test/kotlin/net/corda/irs/Main.kt @@ -17,9 +17,9 @@ import net.corda.testing.driver.driver fun main(args: Array) { driver(dsl = { val (controller, nodeA, nodeB) = listOf( - startNode(DUMMY_NOTARY.name, setOf(ServiceInfo(SimpleNotaryService.type), ServiceInfo(NodeInterestRates.Oracle.type))), - startNode(DUMMY_BANK_A.name), - startNode(DUMMY_BANK_B.name) + startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type), ServiceInfo(NodeInterestRates.Oracle.type))), + startNode(providedName = DUMMY_BANK_A.name), + startNode(providedName = DUMMY_BANK_B.name) ).transpose().getOrThrow() startWebserver(controller) diff --git a/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt b/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt index b10b1ea541..ed78ffd6aa 100644 --- a/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt +++ b/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt @@ -33,8 +33,8 @@ class SimmValuationTest : IntegrationTestCategory { @Test fun `runs SIMM valuation demo`() { driver(isDebug = true) { - startNode(DUMMY_NOTARY.name, setOf(ServiceInfo(SimpleNotaryService.type))).getOrThrow() - val (nodeA, nodeB) = listOf(startNode(nodeALegalName), startNode(nodeBLegalName)).transpose().getOrThrow() + startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))).getOrThrow() + val (nodeA, nodeB) = listOf(startNode(providedName = nodeALegalName), startNode(providedName = nodeBLegalName)).transpose().getOrThrow() val (nodeAApi, nodeBApi) = listOf(startWebserver(nodeA), startWebserver(nodeB)).transpose() .getOrThrow() .map { HttpApi.fromHostAndPort(it.listenAddress, "api/simmvaluationdemo") } diff --git a/samples/simm-valuation-demo/src/test/kotlin/net/corda/vega/Main.kt b/samples/simm-valuation-demo/src/test/kotlin/net/corda/vega/Main.kt index 2ad314e6c6..81b13ae98c 100644 --- a/samples/simm-valuation-demo/src/test/kotlin/net/corda/vega/Main.kt +++ b/samples/simm-valuation-demo/src/test/kotlin/net/corda/vega/Main.kt @@ -17,11 +17,11 @@ import net.corda.testing.driver.driver */ fun main(args: Array) { driver(dsl = { - startNode(DUMMY_NOTARY.name, setOf(ServiceInfo(SimpleNotaryService.type))) + startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) val (nodeA, nodeB, nodeC) = listOf( - startNode(DUMMY_BANK_A.name), - startNode(DUMMY_BANK_B.name), - startNode(DUMMY_BANK_C.name) + startNode(providedName = DUMMY_BANK_A.name), + startNode(providedName = DUMMY_BANK_B.name), + startNode(providedName = DUMMY_BANK_C.name) ).transpose().getOrThrow() startWebserver(nodeA) diff --git a/samples/trader-demo/src/test/kotlin/net/corda/traderdemo/Main.kt b/samples/trader-demo/src/test/kotlin/net/corda/traderdemo/Main.kt index 1661b70ad7..7ed7f689cd 100644 --- a/samples/trader-demo/src/test/kotlin/net/corda/traderdemo/Main.kt +++ b/samples/trader-demo/src/test/kotlin/net/corda/traderdemo/Main.kt @@ -27,10 +27,10 @@ fun main(args: Array) { val user = User("user1", "test", permissions = setOf(startFlowPermission(), startFlowPermission(), startFlowPermission())) - startNode(DUMMY_NOTARY.name, setOf(ServiceInfo(SimpleNotaryService.type))) - startNode(DUMMY_BANK_A.name, rpcUsers = demoUser) - startNode(DUMMY_BANK_B.name, rpcUsers = demoUser) - startNode(BOC.name, rpcUsers = listOf(user)) + startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) + startNode(providedName = DUMMY_BANK_A.name, rpcUsers = demoUser) + startNode(providedName = DUMMY_BANK_B.name, rpcUsers = demoUser) + startNode(providedName = BOC.name, rpcUsers = listOf(user)) waitForAllNodesToFinish() } } diff --git a/test-utils/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt b/test-utils/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt index 11f099dc5b..2ebcea15d2 100644 --- a/test-utils/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt +++ b/test-utils/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt @@ -41,8 +41,8 @@ class DriverTests { @Test fun `simple node startup and shutdown`() { val handles = driver { - val notary = startNode(DUMMY_NOTARY.name, setOf(ServiceInfo(SimpleNotaryService.type))) - val regulator = startNode(DUMMY_REGULATOR.name, setOf(ServiceInfo(RegulatorService.type))) + val notary = startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) + val regulator = startNode(providedName = DUMMY_REGULATOR.name, advertisedServices = setOf(ServiceInfo(RegulatorService.type))) listOf(nodeMustBeUp(notary), nodeMustBeUp(regulator)) } handles.map { nodeMustBeDown(it) } @@ -51,7 +51,7 @@ class DriverTests { @Test fun `starting node with no services`() { val noService = driver { - val noService = startNode(DUMMY_BANK_A.name) + val noService = startNode(providedName = DUMMY_BANK_A.name) nodeMustBeUp(noService) } nodeMustBeDown(noService) @@ -60,7 +60,7 @@ class DriverTests { @Test fun `random free port allocation`() { val nodeHandle = driver(portAllocation = PortAllocation.RandomFree) { - val nodeInfo = startNode(DUMMY_BANK_A.name) + val nodeInfo = startNode(providedName = DUMMY_BANK_A.name) nodeMustBeUp(nodeInfo) } nodeMustBeDown(nodeHandle) @@ -72,7 +72,7 @@ class DriverTests { val logConfigFile = projectRootDir / "config" / "dev" / "log4j2.xml" assertThat(logConfigFile).isRegularFile() driver(isDebug = true, systemProperties = mapOf("log4j.configurationFile" to logConfigFile.toString())) { - val baseDirectory = startNode(DUMMY_BANK_A.name).getOrThrow().configuration.baseDirectory + val baseDirectory = startNode(providedName = DUMMY_BANK_A.name).getOrThrow().configuration.baseDirectory val logFile = (baseDirectory / NodeStartup.LOGS_DIRECTORY_NAME).list { it.sorted().findFirst().get() } val debugLinesPresent = logFile.readLines { lines -> lines.anyMatch { line -> line.startsWith("[DEBUG]") } } assertThat(debugLinesPresent).isTrue() diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt b/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt index 77f65fa25d..3a8669e7cb 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt @@ -93,7 +93,7 @@ val DUMMY_PARTY: Party get() = Party(X500Name("CN=Dummy,O=Dummy,L=Madrid,C=ES"), */ class PredefinedTestNode internal constructor(party: Party, driver: DriverDSLExposedInterface, services: Set) { val rpcUsers = listOf(User("admin", "admin", setOf("ALL"))) // TODO: Randomize? - val nodeFuture by lazy { driver.startNode(party.name, rpcUsers = rpcUsers, advertisedServices = services) } + val nodeFuture by lazy { driver.startNode(providedName = party.name, rpcUsers = rpcUsers, advertisedServices = services) } val node by lazy { nodeFuture.get()!! } val rpc by lazy { node.rpcClientToNode() } diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt index e2c2539f10..620f27a79a 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -78,6 +78,8 @@ interface DriverDSLExposedInterface : CordformContext { /** * Starts a [net.corda.node.internal.Node] in a separate process. * + * @param defaultParameters The default parameters for the node. Allows the node to be configured in builder style + * when called from Java code. * @param providedName Optional name of the node, which will be its legal name in [Party]. Defaults to something * random. Note that this must be unique as the driver uses it as a primary key! * @param advertisedServices The set of services to be advertised by the node. Defaults to empty set. @@ -87,12 +89,25 @@ interface DriverDSLExposedInterface : CordformContext { * in. If null the Driver-level value will be used. * @return The [NodeInfo] of the started up node retrieved from the network map service. */ - fun startNode(providedName: X500Name? = null, - advertisedServices: Set = emptySet(), - rpcUsers: List = emptyList(), - verifierType: VerifierType = VerifierType.InMemory, - customOverrides: Map = emptyMap(), - startInSameProcess: Boolean? = null): CordaFuture + fun startNode( + defaultParameters: NodeParameters = NodeParameters(), + providedName: X500Name? = defaultParameters.providedName, + advertisedServices: Set = defaultParameters.advertisedServices, + rpcUsers: List = defaultParameters.rpcUsers, + verifierType: VerifierType = defaultParameters.verifierType, + customOverrides: Map = defaultParameters.customOverrides, + startInSameProcess: Boolean? = defaultParameters.startInSameProcess): CordaFuture + + /** + * Helper function for starting a [node] with custom parameters from Java. + * + * @param defaultParameters The default parameters for the driver. + * @param dsl The dsl itself. + * @return The value returned in the [dsl] closure. + */ + fun startNode(parameters: NodeParameters): CordaFuture { + return startNode(defaultParameters = parameters) + } fun startNodes( nodes: List, @@ -214,11 +229,30 @@ sealed class PortAllocation { } } +/** + * Helper builder for configuring a [node] from Java. + */ +data class NodeParameters( + val providedName: X500Name? = null, + val advertisedServices: Set = emptySet(), + val rpcUsers: List = emptyList(), + val verifierType: VerifierType = VerifierType.InMemory, + val customOverrides: Map = emptyMap(), + val startInSameProcess: Boolean? = null +) { + fun setProvidedName(providedName: X500Name?) = copy(providedName = providedName) + fun setAdvertisedServices(advertisedServices: Set) = copy(advertisedServices = advertisedServices) + fun setRpcUsers(rpcUsers: List) = copy(rpcUsers = rpcUsers) + fun setVerifierType(verifierType: VerifierType) = copy(verifierType = verifierType) + fun setCustomerOverrides(customOverrides: Map) = copy(customOverrides = customOverrides) + fun setStartInSameProcess(startInSameProcess: Boolean?) = copy(startInSameProcess = startInSameProcess) +} + /** * [driver] allows one to start up nodes like this: * driver { - * val noService = startNode(DUMMY_BANK_A.name) - * val notary = startNode(DUMMY_NOTARY.name) + * val noService = startNode(providedName = DUMMY_BANK_A.name) + * val notary = startNode(providedName = DUMMY_NOTARY.name) * * (...) * } @@ -603,6 +637,7 @@ class DriverDSL( } override fun startNode( + defaultParameters: NodeParameters, providedName: X500Name?, advertisedServices: Set, rpcUsers: List, @@ -687,7 +722,7 @@ class DriverDSL( val nodeAddress = portAllocation.nextHostAndPort() val configOverride = mapOf("notaryNodeAddress" to nodeAddress.toString(), "notaryClusterAddresses" to listOf(notaryClusterAddress.toString()), "database.serverNameTablePrefix" to it.toString().replace(Regex("[^0-9A-Za-z]+"), "")) - startNode(it, advertisedServices, rpcUsers, verifierType, configOverride) + startNode(providedName = it, advertisedServices = advertisedServices, rpcUsers = rpcUsers, verifierType = verifierType, customOverrides = configOverride) } return firstNotaryFuture.flatMap { firstNotary -> diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/ExplorerSimulation.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/ExplorerSimulation.kt index 3eda29511e..9983ede708 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/ExplorerSimulation.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/ExplorerSimulation.kt @@ -71,20 +71,20 @@ class ExplorerSimulation(val options: OptionSet) { val portAllocation = PortAllocation.Incremental(20000) driver(portAllocation = portAllocation) { // TODO : Supported flow should be exposed somehow from the node instead of set of ServiceInfo. - val notary = startNode(DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type)), + val notary = startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type)), customOverrides = mapOf("nearestCity" to "Zurich")) - val alice = startNode(ALICE.name, rpcUsers = arrayListOf(user), + val alice = startNode(providedName = ALICE.name, rpcUsers = arrayListOf(user), advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("cash"))), customOverrides = mapOf("nearestCity" to "Milan")) - val bob = startNode(BOB.name, rpcUsers = arrayListOf(user), + val bob = startNode(providedName = BOB.name, rpcUsers = arrayListOf(user), advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("cash"))), customOverrides = mapOf("nearestCity" to "Madrid")) val ukBankName = X500Name("CN=UK Bank Plc,O=UK Bank Plc,L=London,C=GB") val usaBankName = X500Name("CN=USA Bank Corp,O=USA Bank Corp,L=New York,C=USA") - val issuerGBP = startNode(ukBankName, rpcUsers = arrayListOf(manager), + val issuerGBP = startNode(providedName = ukBankName, rpcUsers = arrayListOf(manager), advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("issuer.GBP"))), customOverrides = mapOf("nearestCity" to "London")) - val issuerUSD = startNode(usaBankName, rpcUsers = arrayListOf(manager), + val issuerUSD = startNode(providedName = usaBankName, rpcUsers = arrayListOf(manager), advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("issuer.USD"))), customOverrides = mapOf("nearestCity" to "New York")) diff --git a/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierTests.kt b/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierTests.kt index 3698019574..6fa26cf776 100644 --- a/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierTests.kt +++ b/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierTests.kt @@ -113,8 +113,8 @@ class VerifierTests { @Test fun `single verifier works with a node`() { verifierDriver(networkMapStartStrategy = NetworkMapStartStrategy.Dedicated(startAutomatically = true)) { - val aliceFuture = startNode(ALICE.name) - val notaryFuture = startNode(DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(ValidatingNotaryService.type)), verifierType = VerifierType.OutOfProcess) + val aliceFuture = startNode(providedName = ALICE.name) + val notaryFuture = startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(ValidatingNotaryService.type)), verifierType = VerifierType.OutOfProcess) val alice = aliceFuture.get() val notary = notaryFuture.get() startVerifier(notary) diff --git a/webserver/src/integration-test/kotlin/net/corda/webserver/WebserverDriverTests.kt b/webserver/src/integration-test/kotlin/net/corda/webserver/WebserverDriverTests.kt index bac83b0eab..cd4f35577d 100644 --- a/webserver/src/integration-test/kotlin/net/corda/webserver/WebserverDriverTests.kt +++ b/webserver/src/integration-test/kotlin/net/corda/webserver/WebserverDriverTests.kt @@ -27,7 +27,7 @@ class DriverTests { @Test fun `starting a node and independent web server works`() { val addr = driver { - val node = startNode(DUMMY_BANK_A.name).getOrThrow() + val node = startNode(providedName = DUMMY_BANK_A.name).getOrThrow() val webserverHandle = startWebserver(node).getOrThrow() webserverMustBeUp(webserverHandle) webserverHandle.listenAddress From 39e44382be9c73530214dba56fe5a8d235185198 Mon Sep 17 00:00:00 2001 From: Konstantinos Chalkias Date: Fri, 1 Sep 2017 19:26:00 +0100 Subject: [PATCH 061/120] Helper SignedTransaction.buildFilteredTransaction(filtering) (#1394) --- .../main/kotlin/net/corda/core/flows/NotaryFlow.kt | 2 +- .../net/corda/core/transactions/SignedTransaction.kt | 11 +++++++++-- docs/source/changelog.rst | 4 ++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/flows/NotaryFlow.kt b/core/src/main/kotlin/net/corda/core/flows/NotaryFlow.kt index 584692bd3d..74d6b2562c 100644 --- a/core/src/main/kotlin/net/corda/core/flows/NotaryFlow.kt +++ b/core/src/main/kotlin/net/corda/core/flows/NotaryFlow.kt @@ -72,7 +72,7 @@ object NotaryFlow { val tx: Any = if (stx.isNotaryChangeTransaction()) { stx.notaryChangeTx } else { - stx.tx.buildFilteredTransaction(Predicate { it is StateRef || it is TimeWindow }) + stx.buildFilteredTransaction(Predicate { it is StateRef || it is TimeWindow }) } sendAndReceiveWithRetry(notaryParty, tx) } diff --git a/core/src/main/kotlin/net/corda/core/transactions/SignedTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/SignedTransaction.kt index c2afc3f2ec..1d25d5e4fb 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/SignedTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/SignedTransaction.kt @@ -14,6 +14,7 @@ import java.security.KeyPair import java.security.PublicKey import java.security.SignatureException import java.util.* +import java.util.function.Predicate /** * SignedTransaction wraps a serialized WireTransaction. It contains one or more signatures, each one for @@ -50,12 +51,18 @@ data class SignedTransaction(val txBits: SerializedBytes, /** The id of the contained [WireTransaction]. */ override val id: SecureHash get() = transaction.id - /** Returns the contained [WireTransaction], or throws if this is a notary change transaction */ + /** Returns the contained [WireTransaction], or throws if this is a notary change transaction. */ val tx: WireTransaction get() = transaction as WireTransaction - /** Returns the contained [NotaryChangeWireTransaction], or throws if this is a normal transaction */ + /** Returns the contained [NotaryChangeWireTransaction], or throws if this is a normal transaction. */ val notaryChangeTx: NotaryChangeWireTransaction get() = transaction as NotaryChangeWireTransaction + /** + * Helper function to directly build a [FilteredTransaction] using provided filtering functions, + * without first accessing the [WireTransaction] [tx]. + */ + fun buildFilteredTransaction(filtering: Predicate) = tx.buildFilteredTransaction(filtering) + /** Helper to access the inputs of the contained transaction */ val inputs: List get() = transaction.inputs /** Helper to access the notary of the contained transaction */ diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 21d7082abe..4504cc20cf 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -114,6 +114,10 @@ UNRELEASED ``createSignature(filteredTransaction: FilteredTransaction, publicKey: PublicKey)`` and ``createSignature(filteredTransaction: FilteredTransaction)`` to sign with the legal identity key. +* A new helper method ``buildFilteredTransaction(filtering: Predicate)`` is added to ``SignedTransaction`` to + directly build a ``FilteredTransaction`` using provided filtering functions, without first accessing the + ``tx: WireTransaction``. + Milestone 14 ------------ From e1363c91cc077e9dc3d37e1e988f36a18f1663dd Mon Sep 17 00:00:00 2001 From: Katarzyna Streich Date: Mon, 4 Sep 2017 09:41:00 +0100 Subject: [PATCH 062/120] PersistentNetworkMapCache close database connection (#1398) --- .../network/PersistentNetworkMapCache.kt | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt b/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt index fe94236791..fa57922e1e 100644 --- a/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt +++ b/node/src/main/kotlin/net/corda/node/services/network/PersistentNetworkMapCache.kt @@ -248,21 +248,22 @@ open class PersistentNetworkMapCache(private val serviceHub: ServiceHubInternal) private fun updateInfoDB(nodeInfo: NodeInfo) { // TODO Temporary workaround to force isolated transaction (otherwise it causes race conditions when processing // network map registration on network map node) - val session = serviceHub.database.entityManagerFactory.withOptions().connection(serviceHub.database.dataSource.connection - .apply { - transactionIsolation = 1 - }).openSession() - - val tx = session.beginTransaction() - // TODO For now the main legal identity is left in NodeInfo, this should be set comparision/come up with index for NodeInfo? - val info = findByIdentityKey(session, nodeInfo.legalIdentity.owningKey) - val nodeInfoEntry = generateMappedObject(nodeInfo) - if (info.isNotEmpty()) { - nodeInfoEntry.id = info[0].id + serviceHub.database.dataSource.connection.use { + val session = serviceHub.database.entityManagerFactory.withOptions().connection(it.apply { + transactionIsolation = 1 + }).openSession() + session.use { + val tx = session.beginTransaction() + // TODO For now the main legal identity is left in NodeInfo, this should be set comparision/come up with index for NodeInfo? + val info = findByIdentityKey(session, nodeInfo.legalIdentity.owningKey) + val nodeInfoEntry = generateMappedObject(nodeInfo) + if (info.isNotEmpty()) { + nodeInfoEntry.id = info[0].id + } + session.merge(nodeInfoEntry) + tx.commit() + } } - session.merge(nodeInfoEntry) - tx.commit() - session.close() } private fun removeInfoDB(nodeInfo: NodeInfo) { From 0bbee4a92b47acdbed632d5c9e5d02fcf69d05bb Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko <31008341+vkolomeyko@users.noreply.github.com> Date: Mon, 4 Sep 2017 10:41:01 +0100 Subject: [PATCH 063/120] CORDA-540: Prevent "node" unit tests hanging in AMQP mode (#1402) --- .../test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt | 3 +++ .../net/corda/node/messaging/TwoPartyTradeFlowTests.kt | 9 +++++++++ .../kotlin/net/corda/node/services/NotaryChangeTests.kt | 1 + .../net/corda/node/services/events/ScheduledFlowTests.kt | 3 +++ .../node/services/statemachine/FlowFrameworkTests.kt | 4 ++++ .../node/services/transactions/NotaryServiceTests.kt | 1 + .../transactions/ValidatingNotaryServiceTests.kt | 1 + 7 files changed, 22 insertions(+) diff --git a/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt b/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt index d252d5a048..bf7e9a375d 100644 --- a/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt +++ b/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt @@ -73,6 +73,9 @@ class CordaRPCOpsImplTest { startFlowPermission(), startFlowPermission() )))) + + mockNet.runNetwork() + networkMap.ensureRegistered() } @After diff --git a/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt b/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt index f915218555..f7ba7dac6b 100644 --- a/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt +++ b/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt @@ -334,6 +334,9 @@ class TwoPartyTradeFlowTests { val bankNode = makeNodeWithTracking(notaryNode.network.myAddress, BOC.name) val issuer = bankNode.info.legalIdentity.ref(1, 2, 3) + mockNet.runNetwork() + notaryNode.ensureRegistered() + val allNodes = listOf(notaryNode, aliceNode, bobNode, bankNode) allNodes.forEach { node -> allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.verifyAndRegisterIdentity(identity) } @@ -440,6 +443,9 @@ class TwoPartyTradeFlowTests { val bankNode = makeNodeWithTracking(notaryNode.network.myAddress, BOC.name) val issuer = bankNode.info.legalIdentity.ref(1, 2, 3) + mockNet.runNetwork() + notaryNode.ensureRegistered() + val allNodes = listOf(notaryNode, aliceNode, bobNode, bankNode) allNodes.forEach { node -> allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.verifyAndRegisterIdentity(identity) } @@ -595,6 +601,9 @@ class TwoPartyTradeFlowTests { val bankNode = mockNet.createPartyNode(notaryNode.network.myAddress, BOC.name) val issuer = bankNode.info.legalIdentity.ref(1, 2, 3) + mockNet.runNetwork() + notaryNode.ensureRegistered() + // Let the nodes know about each other - normally the network map would handle this val allNodes = listOf(notaryNode, aliceNode, bobNode, bankNode) allNodes.forEach { node -> diff --git a/node/src/test/kotlin/net/corda/node/services/NotaryChangeTests.kt b/node/src/test/kotlin/net/corda/node/services/NotaryChangeTests.kt index 3ffcee67e6..bf5f9a4f12 100644 --- a/node/src/test/kotlin/net/corda/node/services/NotaryChangeTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/NotaryChangeTests.kt @@ -46,6 +46,7 @@ class NotaryChangeTests { newNotaryNode = mockNet.createNode(networkMapAddress = oldNotaryNode.network.myAddress, advertisedServices = ServiceInfo(SimpleNotaryService.type)) mockNet.runNetwork() // Clear network map registration messages + oldNotaryNode.ensureRegistered() } @After diff --git a/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt b/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt index 6b1035adf1..a567ce1464 100644 --- a/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/events/ScheduledFlowTests.kt @@ -105,6 +105,9 @@ class ScheduledFlowTests { advertisedServices = *arrayOf(ServiceInfo(NetworkMapService.type), ServiceInfo(ValidatingNotaryService.type))) nodeA = mockNet.createNode(notaryNode.network.myAddress, start = false) nodeB = mockNet.createNode(notaryNode.network.myAddress, start = false) + + notaryNode.ensureRegistered() + mockNet.startNodes() } diff --git a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt index 44190ca538..757cf2cd91 100644 --- a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt @@ -73,6 +73,10 @@ class FlowFrameworkTests { fun start() { node1 = mockNet.createNode(advertisedServices = ServiceInfo(NetworkMapService.type)) node2 = mockNet.createNode(networkMapAddress = node1.network.myAddress) + + mockNet.runNetwork() + node1.ensureRegistered() + // We intentionally create our own notary and ignore the one provided by the network val notaryKeyPair = generateKeyPair() val notaryService = ServiceInfo(ValidatingNotaryService.type, getTestX509Name("notary-service-2000")) diff --git a/node/src/test/kotlin/net/corda/node/services/transactions/NotaryServiceTests.kt b/node/src/test/kotlin/net/corda/node/services/transactions/NotaryServiceTests.kt index 4eb85f9f01..45a8bb66dd 100644 --- a/node/src/test/kotlin/net/corda/node/services/transactions/NotaryServiceTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/transactions/NotaryServiceTests.kt @@ -40,6 +40,7 @@ class NotaryServiceTests { advertisedServices = *arrayOf(ServiceInfo(NetworkMapService.type), ServiceInfo(SimpleNotaryService.type))) clientNode = mockNet.createNode(notaryNode.network.myAddress) mockNet.runNetwork() // Clear network map registration messages + notaryNode.ensureRegistered() } @After diff --git a/node/src/test/kotlin/net/corda/node/services/transactions/ValidatingNotaryServiceTests.kt b/node/src/test/kotlin/net/corda/node/services/transactions/ValidatingNotaryServiceTests.kt index dadecbc5f7..f65a9f2ef9 100644 --- a/node/src/test/kotlin/net/corda/node/services/transactions/ValidatingNotaryServiceTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/transactions/ValidatingNotaryServiceTests.kt @@ -42,6 +42,7 @@ class ValidatingNotaryServiceTests { ) clientNode = mockNet.createNode(notaryNode.network.myAddress) mockNet.runNetwork() // Clear network map registration messages + notaryNode.ensureRegistered() } @After From 7ec5bd789e647e9a9c25e6558c1b453a2531da80 Mon Sep 17 00:00:00 2001 From: Konstantinos Chalkias Date: Mon, 4 Sep 2017 10:44:22 +0100 Subject: [PATCH 064/120] Composite Signature OID fix and crypto comments clean up (#1393) --- .../net/corda/core/crypto/CompositeKey.kt | 6 ++-- .../corda/core/crypto/CompositeKeyFactory.kt | 2 +- .../core/crypto/CordaSecurityProvider.kt | 8 +++-- .../kotlin/net/corda/core/crypto/Crypto.kt | 2 +- .../net/corda/core/crypto/CryptoUtils.kt | 33 +++++++------------ .../net/corda/core/crypto/DigitalSignature.kt | 4 +-- .../net/corda/core/crypto/MerkleTree.kt | 4 +-- .../net/corda/core/crypto/SecureHash.kt | 2 +- .../net/corda/core/crypto/SignableData.kt | 1 - .../net/corda/core/crypto/SignatureScheme.kt | 3 +- .../core/transactions/MerkleTransaction.kt | 2 +- 11 files changed, 29 insertions(+), 38 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt b/core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt index 80e5ac9d64..ae86b3f198 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt @@ -12,7 +12,7 @@ import java.util.* /** * A tree data structure that enables the representation of composite public keys. - * Notice that with that implementation CompositeKey extends PublicKey. Leaves are represented by single public keys. + * Notice that with that implementation CompositeKey extends [PublicKey]. Leaves are represented by single public keys. * * For complex scenarios, such as *"Both Alice and Bob need to sign to consume a state S"*, we can represent * the requirement by creating a tree with a root [CompositeKey], and Alice and Bob as children. @@ -159,7 +159,7 @@ class CompositeKey private constructor(val threshold: Int, children: List get() = children.flatMap { it.node.keys }.toSet() // Uses PublicKey.keys extension. diff --git a/core/src/main/kotlin/net/corda/core/crypto/CompositeKeyFactory.kt b/core/src/main/kotlin/net/corda/core/crypto/CompositeKeyFactory.kt index 62d81c4147..df7fc7c433 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/CompositeKeyFactory.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CompositeKeyFactory.kt @@ -26,7 +26,7 @@ class CompositeKeyFactory : KeyFactorySpi() { @Throws(InvalidKeySpecException::class) override fun engineGetKeySpec(key: Key, keySpec: Class): T { - // Only support [X509EncodedKeySpec]. + // Only support X509EncodedKeySpec. throw InvalidKeySpecException("Not implemented yet $key $keySpec") } diff --git a/core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt b/core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt index 2b490cfce1..eaae5e2ffb 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CordaSecurityProvider.kt @@ -21,14 +21,16 @@ class CordaSecurityProvider : Provider(PROVIDER_NAME, 0.1, "$PROVIDER_NAME secur val compositeKeyOID = CordaObjectIdentifier.COMPOSITE_KEY.id put("Alg.Alias.KeyFactory.$compositeKeyOID", CompositeKey.KEY_ALGORITHM) put("Alg.Alias.KeyFactory.OID.$compositeKeyOID", CompositeKey.KEY_ALGORITHM) - put("Alg.Alias.Signature.$compositeKeyOID", CompositeSignature.SIGNATURE_ALGORITHM) - put("Alg.Alias.Signature.OID.$compositeKeyOID", CompositeSignature.SIGNATURE_ALGORITHM) + + val compositeSignatureOID = CordaObjectIdentifier.COMPOSITE_SIGNATURE.id + put("Alg.Alias.Signature.$compositeSignatureOID", CompositeSignature.SIGNATURE_ALGORITHM) + put("Alg.Alias.Signature.OID.$compositeSignatureOID", CompositeSignature.SIGNATURE_ALGORITHM) } } object CordaObjectIdentifier { // UUID-based OID - // TODO: Register for an OID space and issue our own shorter OID + // TODO: Register for an OID space and issue our own shorter OID. @JvmField val COMPOSITE_KEY = ASN1ObjectIdentifier("2.25.30086077608615255153862931087626791002") @JvmField val COMPOSITE_SIGNATURE = ASN1ObjectIdentifier("2.25.30086077608615255153862931087626791003") } diff --git a/core/src/main/kotlin/net/corda/core/crypto/Crypto.kt b/core/src/main/kotlin/net/corda/core/crypto/Crypto.kt index 5195840780..c5f6b16256 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/Crypto.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/Crypto.kt @@ -197,7 +197,7 @@ object Crypto { private val providerMap: Map = mapOf( BouncyCastleProvider.PROVIDER_NAME to getBouncyCastleProvider(), CordaSecurityProvider.PROVIDER_NAME to CordaSecurityProvider(), - "BCPQC" to BouncyCastlePQCProvider()) // unfortunately, provider's name is not final in BouncyCastlePQCProvider, so we explicitly set it. + "BCPQC" to BouncyCastlePQCProvider()) // Unfortunately, provider's name is not final in BouncyCastlePQCProvider, so we explicitly set it. private fun getBouncyCastleProvider() = BouncyCastleProvider().apply { putAll(EdDSASecurityProvider()) diff --git a/core/src/main/kotlin/net/corda/core/crypto/CryptoUtils.kt b/core/src/main/kotlin/net/corda/core/crypto/CryptoUtils.kt index 023b2d20c1..922359ca58 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/CryptoUtils.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CryptoUtils.kt @@ -17,13 +17,9 @@ import java.security.* * @throws SignatureException if signing is not possible due to malformed data or private key. */ @Throws(IllegalArgumentException::class, InvalidKeyException::class, SignatureException::class) -fun PrivateKey.sign(bytesToSign: ByteArray): DigitalSignature { - return DigitalSignature(Crypto.doSign(this, bytesToSign)) -} +fun PrivateKey.sign(bytesToSign: ByteArray): DigitalSignature = DigitalSignature(Crypto.doSign(this, bytesToSign)) -fun PrivateKey.sign(bytesToSign: ByteArray, publicKey: PublicKey): DigitalSignature.WithKey { - return DigitalSignature.WithKey(publicKey, this.sign(bytesToSign).bytes) -} +fun PrivateKey.sign(bytesToSign: ByteArray, publicKey: PublicKey) = DigitalSignature.WithKey(publicKey, this.sign(bytesToSign).bytes) /** * Helper function to sign with a key pair. @@ -81,32 +77,27 @@ fun PublicKey.isValid(content: ByteArray, signature: DigitalSignature) : Boolean /** Render a public key to its hash (in Base58) of its serialised form using the DL prefix. */ fun PublicKey.toStringShort(): String = "DL" + this.toSHA256Bytes().toBase58() -val PublicKey.keys: Set get() { - return if (this is CompositeKey) this.leafKeys - else setOf(this) -} +val PublicKey.keys: Set get() = (this as? CompositeKey)?.leafKeys ?: setOf(this) fun PublicKey.isFulfilledBy(otherKey: PublicKey): Boolean = isFulfilledBy(setOf(otherKey)) -fun PublicKey.isFulfilledBy(otherKeys: Iterable): Boolean { - return if (this is CompositeKey) this.isFulfilledBy(otherKeys) - else this in otherKeys -} +fun PublicKey.isFulfilledBy(otherKeys: Iterable): Boolean = (this as? CompositeKey)?.isFulfilledBy(otherKeys) ?: (this in otherKeys) -/** Checks whether any of the given [keys] matches a leaf on the CompositeKey tree or a single PublicKey */ +/** Checks whether any of the given [keys] matches a leaf on the [CompositeKey] tree or a single [PublicKey]. */ fun PublicKey.containsAny(otherKeys: Iterable): Boolean { return if (this is CompositeKey) keys.intersect(otherKeys).isNotEmpty() else this in otherKeys } -/** Returns the set of all [PublicKey]s of the signatures */ +/** Returns the set of all [PublicKey]s of the signatures. */ fun Iterable.byKeys() = map { it.by }.toSet() -// Allow Kotlin destructuring: val (private, public) = keyPair +// Allow Kotlin destructuring: +// val (private, public) = keyPair operator fun KeyPair.component1(): PrivateKey = this.private operator fun KeyPair.component2(): PublicKey = this.public -/** A simple wrapper that will make it easier to swap out the EC algorithm we use in future */ +/** A simple wrapper that will make it easier to swap out the EC algorithm we use in future. */ fun generateKeyPair(): KeyPair = Crypto.generateKeyPair() /** @@ -147,13 +138,11 @@ fun KeyPair.verify(signatureData: ByteArray, clearData: ByteArray): Boolean = Cr * @param numOfBytes how many random bytes to output. * @return a random [ByteArray]. * @throws NoSuchAlgorithmException thrown if "NativePRNGNonBlocking" is not supported on the JVM - * or if no strong SecureRandom implementations are available or if Security.getProperty("securerandom.strongAlgorithms") is null or empty, + * or if no strong [SecureRandom] implementations are available or if Security.getProperty("securerandom.strongAlgorithms") is null or empty, * which should never happen and suggests an unusual JVM or non-standard Java library. */ @Throws(NoSuchAlgorithmException::class) -fun secureRandomBytes(numOfBytes: Int): ByteArray { - return newSecureRandom().generateSeed(numOfBytes) -} +fun secureRandomBytes(numOfBytes: Int): ByteArray = newSecureRandom().generateSeed(numOfBytes) /** * Get an instance of [SecureRandom] to avoid blocking, due to waiting for additional entropy, when possible. diff --git a/core/src/main/kotlin/net/corda/core/crypto/DigitalSignature.kt b/core/src/main/kotlin/net/corda/core/crypto/DigitalSignature.kt index 0e0f36c606..9e28be8a3a 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/DigitalSignature.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/DigitalSignature.kt @@ -6,8 +6,8 @@ import java.security.InvalidKeyException import java.security.PublicKey import java.security.SignatureException -// TODO: Is there a use-case for bare [DigitalSignature], or is everything a [DigitalSignature.WithKey]? If there's no -// actual use-case, we should merge the with key version into the parent class. In that case [CompositeSignatureWithKeys] +// TODO: Is there a use-case for bare DigitalSignature, or is everything a DigitalSignature.WithKey? If there's no +// actual use-case, we should merge the with key version into the parent class. In that case CompositeSignatureWithKeys // should be renamed to match. /** A wrapper around a digital signature. */ @CordaSerializable diff --git a/core/src/main/kotlin/net/corda/core/crypto/MerkleTree.kt b/core/src/main/kotlin/net/corda/core/crypto/MerkleTree.kt index 831e20758e..1555ed70fc 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/MerkleTree.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/MerkleTree.kt @@ -3,7 +3,7 @@ package net.corda.core.crypto import java.util.* /** - * Creation and verification of a Merkle Tree for a Wire Transaction. + * Creation and verification of a Merkle tree for a [WireTransaction]. * * See: https://en.wikipedia.org/wiki/Merkle_tree * @@ -49,7 +49,7 @@ sealed class MerkleTree { */ private tailrec fun buildMerkleTree(lastNodesList: List): MerkleTree { if (lastNodesList.size == 1) { - return lastNodesList[0] //Root reached. + return lastNodesList[0] // Root reached. } else { val newLevelHashes: MutableList = ArrayList() val n = lastNodesList.size diff --git a/core/src/main/kotlin/net/corda/core/crypto/SecureHash.kt b/core/src/main/kotlin/net/corda/core/crypto/SecureHash.kt index af2114ab6d..837f27faea 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/SecureHash.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/SecureHash.kt @@ -12,7 +12,7 @@ import java.security.MessageDigest */ @CordaSerializable sealed class SecureHash(bytes: ByteArray) : OpaqueBytes(bytes) { - /** SHA-256 is part of the SHA-2 hash function family. Generated hash is fixed size, 256-bits (32-bytes) */ + /** SHA-256 is part of the SHA-2 hash function family. Generated hash is fixed size, 256-bits (32-bytes). */ class SHA256(bytes: ByteArray) : SecureHash(bytes) { init { require(bytes.size == 32) diff --git a/core/src/main/kotlin/net/corda/core/crypto/SignableData.kt b/core/src/main/kotlin/net/corda/core/crypto/SignableData.kt index a893381f7b..5027247980 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/SignableData.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/SignableData.kt @@ -11,4 +11,3 @@ import net.corda.core.serialization.CordaSerializable */ @CordaSerializable data class SignableData(val txId: SecureHash, val signatureMetadata: SignatureMetadata) - diff --git a/core/src/main/kotlin/net/corda/core/crypto/SignatureScheme.kt b/core/src/main/kotlin/net/corda/core/crypto/SignatureScheme.kt index 9ec9d26863..0176397c2f 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/SignatureScheme.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/SignatureScheme.kt @@ -29,4 +29,5 @@ data class SignatureScheme( val signatureName: String, val algSpec: AlgorithmParameterSpec?, val keySize: Int?, - val desc: String) + val desc: String +) diff --git a/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt index 7793b709e6..3675b20dc8 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt @@ -230,7 +230,7 @@ class FilteredTransaction private constructor( } /** - * Runs verification of Partial Merkle Branch against [id]. + * Runs verification of partial Merkle branch against [id]. */ @Throws(MerkleTreeException::class) fun verify(): Boolean { From 314a88e13a6d3511e0c26fbfe6ee784a032e201b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Sj=C3=B8rup?= Date: Mon, 4 Sep 2017 11:52:20 +0200 Subject: [PATCH 065/120] Update using-a-notary.rst --- docs/source/using-a-notary.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/using-a-notary.rst b/docs/source/using-a-notary.rst index 2c9f5c2fef..4c109de85f 100644 --- a/docs/source/using-a-notary.rst +++ b/docs/source/using-a-notary.rst @@ -86,7 +86,7 @@ we just use a helper that handles it for us. We also assume that we already have .. sourcecode:: kotlin - val inputState = StateAndRef(sate, stateRef) + val inputState = StateAndRef(state, stateRef) val moveTransactionBuilder = DummyContract.withNewOwnerAndAmount(inputState, newOwner = aliceParty.owningKey) The ``DummyContract.withNewOwnerAndAmount()`` method will a new transaction builder with our old state as the input, a new state From f0b2b0a566aff2f1ed30097f702c1c522a1ca0b7 Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Mon, 4 Sep 2017 11:23:13 +0100 Subject: [PATCH 066/120] Change the condition for what is stored in AMQP object history for object reference logic (#1404) --- .../internal/serialization/amqp/DeserializationInput.kt | 2 +- .../internal/serialization/amqp/SerializationHelper.kt | 8 ++++++-- .../internal/serialization/amqp/SerializationOutput.kt | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt index a8d3a94d2f..d5668cc494 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt @@ -142,7 +142,7 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { } // Store the reference in case we need it later on. // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content - if (suitableForObjectReference(type)) objectHistory.add(objectRead) + if (suitableForObjectReference(objectRead.javaClass)) objectHistory.add(objectRead) objectRead } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt index 2a5fe70f2c..53a8ddf18e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt @@ -1,5 +1,6 @@ package net.corda.nodeapi.internal.serialization.amqp +import com.google.common.primitives.Primitives import com.google.common.reflect.TypeToken import org.apache.qpid.proton.codec.Data import java.beans.IndexedPropertyDescriptor @@ -221,5 +222,8 @@ internal fun Type.isSubClassOf(type: Type): Boolean { return TypeToken.of(this).isSubtypeOf(type) } -internal fun suitableForObjectReference(type: Type) = - type != ByteArray::class.java && type.asClass()?.isPrimitive != true \ No newline at end of file +// ByteArrays, primtives and boxed primitives are not stored in the object history +internal fun suitableForObjectReference(type: Type): Boolean { + val clazz = type.asClass() + return type != ByteArray::class.java && (clazz != null && !clazz.isPrimitive && !Primitives.unwrap(clazz).isPrimitive) +} \ No newline at end of file diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt index 7246b4fb34..5379b5ab84 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt @@ -87,7 +87,7 @@ open class SerializationOutput(internal val serializerFactory: SerializerFactory // Important to do it after serialization such that dependent object will have preceding reference numbers // assigned to them first as they will be first read from the stream on receiving end. // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content - if (suitableForObjectReference(type)) objectHistory.put(obj, objectHistory.size) + if (suitableForObjectReference(obj.javaClass)) objectHistory.put(obj, objectHistory.size) } else { data.writeReferencedObject(ReferencedObject(retrievedRefCount)) From ed2b2b02ca8c2b33eb0b1ca56341db08984c46f8 Mon Sep 17 00:00:00 2001 From: Katelyn Baker Date: Thu, 24 Aug 2017 13:48:07 +0100 Subject: [PATCH 067/120] Add support for serialising enum types - Part 1 Part 2 will address the carpenting of enum classes --- .../amqp/DeserializationInput.kt | 79 ++++---- .../amqp/DeserializedParameterizedType.kt | 3 +- .../serialization/amqp/EnumSerializer.kt | 47 +++++ .../serialization/amqp/MapSerializer.kt | 2 +- .../internal/serialization/amqp/Schema.kt | 25 ++- .../serialization/amqp/SerializerFactory.kt | 28 +-- .../amqp/JavaSerialiseEnumTests.java | 36 ++++ .../amqp/JavaSerializationOutputTests.java | 12 +- .../serialization/amqp/AMQPTestUtils.kt | 1 - .../internal/serialization/amqp/EnumTests.kt | 191 ++++++++++++++++++ .../serialization/amqp/EnumTests.changedEnum1 | Bin 0 -> 611 bytes .../serialization/amqp/EnumTests.changedEnum2 | Bin 0 -> 616 bytes 12 files changed, 353 insertions(+), 71 deletions(-) create mode 100644 node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt create mode 100644 node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerialiseEnumTests.java create mode 100644 node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt create mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumTests.changedEnum1 create mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumTests.changedEnum2 diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt index d5668cc494..7f6a938bb5 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt @@ -25,7 +25,7 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { private val objectHistory: MutableList = mutableListOf() internal companion object { - val BYTES_NEEDED_TO_PEEK: Int = 23 + private val BYTES_NEEDED_TO_PEEK: Int = 23 fun peekSize(bytes: ByteArray): Int { // There's an 8 byte header, and then a 0 byte plus descriptor followed by constructor @@ -57,7 +57,6 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { inline internal fun deserializeAndReturnEnvelope(bytes: SerializedBytes): ObjectAndEnvelope = deserializeAndReturnEnvelope(bytes, T::class.java) - @Throws(NotSerializableException::class) private fun getEnvelope(bytes: ByteSequence): Envelope { // Check that the lead bytes match expected header @@ -94,20 +93,16 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { * be deserialized and a schema describing the types of the objects. */ @Throws(NotSerializableException::class) - fun deserialize(bytes: ByteSequence, clazz: Class): T { - return des { - val envelope = getEnvelope(bytes) - clazz.cast(readObjectOrNull(envelope.obj, envelope.schema, clazz)) - } + fun deserialize(bytes: ByteSequence, clazz: Class): T = des { + val envelope = getEnvelope(bytes) + clazz.cast(readObjectOrNull(envelope.obj, envelope.schema, clazz)) } @Throws(NotSerializableException::class) - internal fun deserializeAndReturnEnvelope(bytes: SerializedBytes, clazz: Class): ObjectAndEnvelope { - return des { - val envelope = getEnvelope(bytes) - // Now pick out the obj and schema from the envelope. - ObjectAndEnvelope(clazz.cast(readObjectOrNull(envelope.obj, envelope.schema, clazz)), envelope) - } + fun deserializeAndReturnEnvelope(bytes: SerializedBytes, clazz: Class): ObjectAndEnvelope = des { + val envelope = getEnvelope(bytes) + // Now pick out the obj and schema from the envelope. + ObjectAndEnvelope(clazz.cast(readObjectOrNull(envelope.obj, envelope.schema, clazz)), envelope) } internal fun readObjectOrNull(obj: Any?, schema: Schema, type: Type): Any? { @@ -115,36 +110,36 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { } internal fun readObject(obj: Any, schema: Schema, type: Type): Any = - if (obj is DescribedType && ReferencedObject.DESCRIPTOR == obj.descriptor) { - // It must be a reference to an instance that has already been read, cheaply and quickly returning it by reference. - val objectIndex = (obj.described as UnsignedInteger).toInt() - if (objectIndex !in 0..objectHistory.size) - throw NotSerializableException("Retrieval of existing reference failed. Requested index $objectIndex " + - "is outside of the bounds for the list of size: ${objectHistory.size}") + if (obj is DescribedType && ReferencedObject.DESCRIPTOR == obj.descriptor) { + // It must be a reference to an instance that has already been read, cheaply and quickly returning it by reference. + val objectIndex = (obj.described as UnsignedInteger).toInt() + if (objectIndex !in 0..objectHistory.size) + throw NotSerializableException("Retrieval of existing reference failed. Requested index $objectIndex " + + "is outside of the bounds for the list of size: ${objectHistory.size}") - val objectRetrieved = objectHistory[objectIndex] - if (!objectRetrieved::class.java.isSubClassOf(type.asClass()!!)) - throw NotSerializableException("Existing reference type mismatch. Expected: '$type', found: '${objectRetrieved::class.java}'") - objectRetrieved - } - else { - val objectRead = when (obj) { - is DescribedType -> { - // Look up serializer in factory by descriptor - val serializer = serializerFactory.get(obj.descriptor, schema) - if (serializer.type != type && with(serializer.type) { !isSubClassOf(type) && !materiallyEquivalentTo(type) }) - throw NotSerializableException("Described type with descriptor ${obj.descriptor} was " + - "expected to be of type $type but was ${serializer.type}") - serializer.readObject(obj.described, schema, this) + val objectRetrieved = objectHistory[objectIndex] + if (!objectRetrieved::class.java.isSubClassOf(type)) + throw NotSerializableException("Existing reference type mismatch. Expected: '$type', found: '${objectRetrieved::class.java}'") + objectRetrieved + } else { + val objectRead = when (obj) { + is DescribedType -> { + // Look up serializer in factory by descriptor + val serializer = serializerFactory.get(obj.descriptor, schema) + if (serializer.type != type && with(serializer.type) { !isSubClassOf(type) && !materiallyEquivalentTo(type) }) + throw NotSerializableException("Described type with descriptor ${obj.descriptor} was " + + "expected to be of type $type but was ${serializer.type}") + serializer.readObject(obj.described, schema, this) + } + is Binary -> obj.array + else -> obj // this will be the case for primitive types like [boolean] et al. } - is Binary -> obj.array - else -> obj // this will be the case for primitive types like [boolean] et al. + + // Store the reference in case we need it later on. + // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content + if (type.asClass()?.isPrimitive != true) objectHistory.add(objectRead) + objectRead } - // Store the reference in case we need it later on. - // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content - if (suitableForObjectReference(objectRead.javaClass)) objectHistory.add(objectRead) - objectRead - } /** * TODO: Currently performs rather basic checks aimed in particular at [java.util.List>] and @@ -152,5 +147,5 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { * In the future tighter control might be needed */ private fun Type.materiallyEquivalentTo(that: Type): Boolean = - asClass() == that.asClass() && that is ParameterizedType -} \ No newline at end of file + asClass() == that.asClass() && that is ParameterizedType +} diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedParameterizedType.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedParameterizedType.kt index 3209866821..96b2d729d4 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedParameterizedType.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedParameterizedType.kt @@ -53,6 +53,7 @@ class DeserializedParameterizedType(private val rawType: Class<*>, private val p var typeStart = 0 var needAType = true var skippingWhitespace = false + while (pos < params.length) { if (params[pos] == '<') { val typeEnd = pos++ @@ -102,7 +103,7 @@ class DeserializedParameterizedType(private val rawType: Class<*>, private val p } else if (!skippingWhitespace && (params[pos] == '.' || params[pos].isJavaIdentifierPart())) { pos++ } else { - throw NotSerializableException("Invalid character in middle of type: ${params[pos]}") + throw NotSerializableException("Invalid character ${params[pos]} in middle of type $params at idx $pos") } } } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt new file mode 100644 index 0000000000..ce648b7eeb --- /dev/null +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt @@ -0,0 +1,47 @@ +package net.corda.nodeapi.internal.serialization.amqp + +import org.apache.qpid.proton.codec.Data +import java.lang.reflect.Type +import java.io.NotSerializableException + +class EnumSerializer(declaredType: Type, declaredClass: Class<*>, factory: SerializerFactory) : AMQPSerializer { + override val type: Type = declaredType + override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" + private val typeNotation: TypeNotation + + init { + typeNotation = RestrictedType( + SerializerFactory.nameForType(declaredType), + null, emptyList(), "enum", Descriptor(typeDescriptor, null), + declaredClass.enumConstants.zip(IntRange(0, declaredClass.enumConstants.size)).map { + Choice(it.first.toString(), it.second.toString()) + }) + } + + override fun writeClassInfo(output: SerializationOutput) { + output.writeTypeNotations(typeNotation) + } + + override fun readObject(obj: Any, schema: Schema, input: DeserializationInput): Any { + val enumName = (obj as List<*>)[0] as String + val enumOrd = obj[1] as Int + val fromOrd = type.asClass()!!.enumConstants[enumOrd] + + if (enumName != fromOrd?.toString()) { + throw NotSerializableException("Deserializing obj as enum $type with value $enumName.$enumOrd but " + + "ordinality has changed") + } + return fromOrd + } + + override fun writeObject(obj: Any, data: Data, type: Type, output: SerializationOutput) { + if (obj !is Enum<*>) throw NotSerializableException("Serializing $obj as enum when it isn't") + + data.withDescribed(typeNotation.descriptor) { + withList { + data.putString(obj.name) + data.putInt(obj.ordinal) + } + } + } +} \ No newline at end of file diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt index 8b74459fe5..314c9b6aa9 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt @@ -13,7 +13,7 @@ import kotlin.collections.map /** * Serialization / deserialization of certain supported [Map] types. */ -class MapSerializer(val declaredType: ParameterizedType, factory: SerializerFactory) : AMQPSerializer { +class MapSerializer(private val declaredType: ParameterizedType, factory: SerializerFactory) : AMQPSerializer { override val type: Type = declaredType as? DeserializedParameterizedType ?: DeserializedParameterizedType.make(declaredType.toString()) override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt index 6a506685c6..7b2aaa41d4 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt @@ -252,7 +252,12 @@ data class CompositeType(override val name: String, override val label: String?, } } -data class RestrictedType(override val name: String, override val label: String?, override val provides: List, val source: String, override val descriptor: Descriptor, val choices: List) : TypeNotation() { +data class RestrictedType(override val name: String, + override val label: String?, + override val provides: List, + val source: String, + override val descriptor: Descriptor, + val choices: List) : TypeNotation() { companion object : DescribedTypeConstructor { val DESCRIPTOR = DescriptorRegistry.RESTRICTED_TYPE.amqpDescriptor @@ -290,6 +295,9 @@ data class RestrictedType(override val name: String, override val label: String? } sb.append(">\n") sb.append(" $descriptor\n") + choices.forEach { + sb.append(" $it\n") + } sb.append("") return sb.toString() } @@ -403,14 +411,13 @@ private fun fingerprintForType(type: Type, contextType: Type?, alreadySeen: Muta if (type is SerializerFactory.AnyType) { hasher.putUnencodedChars(ANY_TYPE_HASH) } else if (type is Class<*>) { - if (type.isArray) { - fingerprintForType(type.componentType, contextType, alreadySeen, hasher, factory).putUnencodedChars(ARRAY_HASH) - } else if (SerializerFactory.isPrimitive(type)) { - hasher.putUnencodedChars(type.name) - } else if (isCollectionOrMap(type)) { - hasher.putUnencodedChars(type.name) - } else { - hasher.fingerprintWithCustomSerializerOrElse(factory, type, type) { + when { + type.isArray -> fingerprintForType(type.componentType, contextType, alreadySeen, hasher, factory).putUnencodedChars(ARRAY_HASH) + SerializerFactory.isPrimitive(type) || + isCollectionOrMap(type) || + type.isEnum -> hasher.putUnencodedChars(type.name) + else -> + hasher.fingerprintWithCustomSerializerOrElse(factory, type, type) { if (type.kotlin.objectInstance != null) { // TODO: name collision is too likely for kotlin objects, we need to introduce some reference // to the CorDapp but maybe reference to the JAR in the short term. diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt index c0b8b19c3f..4538711459 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt @@ -21,7 +21,6 @@ data class schemaAndDescriptor (val schema: Schema, val typeDescriptor: Any) /** * Factory of serializers designed to be shared across threads and invocations. */ -// TODO: enums // TODO: object references - need better fingerprinting? // TODO: class references? (e.g. cheat with repeated descriptors using a long encoding, like object ref proposal) // TODO: Inner classes etc. Should we allow? Currently not considered. @@ -66,18 +65,20 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { val actualType: Type = inferTypeVariables(actualClass, declaredClass, declaredType) ?: declaredType - val serializer = if (Collection::class.java.isAssignableFrom(declaredClass)) { - serializersByType.computeIfAbsent(declaredType) { - CollectionSerializer(declaredType as? ParameterizedType ?: DeserializedParameterizedType( - declaredClass, arrayOf(AnyType), null), this) + val serializer = when { + (Collection::class.java.isAssignableFrom(declaredClass)) -> { serializersByType.computeIfAbsent(declaredType) { + CollectionSerializer(declaredType as? ParameterizedType ?: DeserializedParameterizedType( + declaredClass, arrayOf(AnyType), null), this) + } } - } else if (Map::class.java.isAssignableFrom(declaredClass)) { - serializersByType.computeIfAbsent(declaredClass) { + Map::class.java.isAssignableFrom(declaredClass) -> serializersByType.computeIfAbsent(declaredClass) { makeMapSerializer(declaredType as? ParameterizedType ?: DeserializedParameterizedType( declaredClass, arrayOf(AnyType, AnyType), null)) } - } else { - makeClassSerializer(actualClass ?: declaredClass, actualType, declaredType) + Enum::class.java.isAssignableFrom(declaredClass) -> serializersByType.computeIfAbsent(declaredClass) { + EnumSerializer(actualType, actualClass ?: declaredClass, this) + } + else -> makeClassSerializer(actualClass ?: declaredClass, actualType, declaredType) } serializersByDescriptor.putIfAbsent(serializer.typeDescriptor, serializer) @@ -248,8 +249,9 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { } internal fun findCustomSerializer(clazz: Class<*>, declaredType: Type): AMQPSerializer? { - // e.g. Imagine if we provided a Map serializer this way, then it won't work if the declared type is AbstractMap, only Map. - // Otherwise it needs to inject additional schema for a RestrictedType source of the super type. Could be done, but do we need it? + // e.g. Imagine if we provided a Map serializer this way, then it won't work if the declared type is + // AbstractMap, only Map. Otherwise it needs to inject additional schema for a RestrictedType source of the + // super type. Could be done, but do we need it? for (customSerializer in customSerializers) { if (customSerializer.isSerializerFor(clazz)) { val declaredSuperClass = declaredType.asClass()?.superclass @@ -258,7 +260,7 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { } else { // Make a subclass serializer for the subclass and return that... @Suppress("UNCHECKED_CAST") - return CustomSerializer.SubClass(clazz, customSerializer as CustomSerializer) + return CustomSerializer.SubClass(clazz, customSerializer as CustomSerializer) } } } @@ -277,7 +279,7 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { (!whitelist.hasListed(clazz) && !hasAnnotationInHierarchy(clazz)) // Recursively check the class, interfaces and superclasses for our annotation. - internal fun hasAnnotationInHierarchy(type: Class<*>): Boolean { + private fun hasAnnotationInHierarchy(type: Class<*>): Boolean { return type.isAnnotationPresent(CordaSerializable::class.java) || type.interfaces.any { hasAnnotationInHierarchy(it) } || (type.superclass != null && hasAnnotationInHierarchy(type.superclass)) diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerialiseEnumTests.java b/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerialiseEnumTests.java new file mode 100644 index 0000000000..e0b65ad27c --- /dev/null +++ b/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerialiseEnumTests.java @@ -0,0 +1,36 @@ +package net.corda.nodeapi.internal.serialization.amqp; + +import org.junit.Test; + +import net.corda.nodeapi.internal.serialization.AllWhitelist; +import net.corda.core.serialization.SerializedBytes; + +import java.io.NotSerializableException; + +public class JavaSerialiseEnumTests { + + public enum Bras { + TSHIRT, UNDERWIRE, PUSHUP, BRALETTE, STRAPLESS, SPORTS, BACKLESS, PADDED + } + + private static class Bra { + private final Bras bra; + + private Bra(Bras bra) { + this.bra = bra; + } + + public Bras getBra() { + return this.bra; + } + } + + @Test + public void testJavaConstructorAnnotations() throws NotSerializableException { + Bra bra = new Bra(Bras.UNDERWIRE); + + SerializerFactory factory1 = new SerializerFactory(AllWhitelist.INSTANCE, ClassLoader.getSystemClassLoader()); + SerializationOutput ser = new SerializationOutput(factory1); + SerializedBytes bytes = ser.serialize(bra); + } +} diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerializationOutputTests.java b/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerializationOutputTests.java index 171b9cbe72..34ca1abaa6 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerializationOutputTests.java +++ b/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerializationOutputTests.java @@ -25,15 +25,17 @@ public class JavaSerializationOutputTests { } @ConstructorForDeserialization - public Foo(String fred, int count) { + private Foo(String fred, int count) { this.bob = fred; this.count = count; } + @SuppressWarnings("unused") public String getFred() { return bob; } + @SuppressWarnings("unused") public int getCount() { return count; } @@ -61,15 +63,17 @@ public class JavaSerializationOutputTests { private final String bob; private final int count; - public UnAnnotatedFoo(String fred, int count) { + private UnAnnotatedFoo(String fred, int count) { this.bob = fred; this.count = count; } + @SuppressWarnings("unused") public String getFred() { return bob; } + @SuppressWarnings("unused") public int getCount() { return count; } @@ -97,7 +101,7 @@ public class JavaSerializationOutputTests { private final String fred; private final Integer count; - public BoxedFoo(String fred, Integer count) { + private BoxedFoo(String fred, Integer count) { this.fred = fred; this.count = count; } @@ -134,7 +138,7 @@ public class JavaSerializationOutputTests { private final String fred; private final Integer count; - public BoxedFooNotNull(String fred, Integer count) { + private BoxedFooNotNull(String fred, Integer count) { this.fred = fred; this.count = count; } diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt index 0494497138..4f9b7b6872 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPTestUtils.kt @@ -6,7 +6,6 @@ import net.corda.nodeapi.internal.serialization.AllWhitelist import net.corda.nodeapi.internal.serialization.EmptyWhitelist import java.io.NotSerializableException - fun testDefaultFactory() = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) fun testDefaultFactoryWithWhitelist() = SerializerFactory(EmptyWhitelist, ClassLoader.getSystemClassLoader()) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt new file mode 100644 index 0000000000..5293f02e21 --- /dev/null +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt @@ -0,0 +1,191 @@ +package net.corda.nodeapi.internal.serialization.amqp + +import org.junit.Test +import java.time.DayOfWeek + +import kotlin.test.assertEquals +import kotlin.test.assertNotNull + +import java.io.File +import java.io.NotSerializableException + +import net.corda.core.serialization.SerializedBytes + +class EnumTests { + enum class Bras { + TSHIRT, UNDERWIRE, PUSHUP, BRALETTE, STRAPLESS, SPORTS, BACKLESS, PADDED + } + + // The state of the OldBras enum when the tests in changedEnum1 were serialised + // - use if the test file needs regenerating + //enum class OldBras { + // TSHIRT, UNDERWIRE, PUSHUP, BRALETTE + //} + + // the new state, SPACER has been added to change the ordinality + enum class OldBras { + SPACER, TSHIRT, UNDERWIRE, PUSHUP, BRALETTE + } + + // The state of the OldBras2 enum when the tests in changedEnum2 were serialised + // - use if the test file needs regenerating + //enum class OldBras2 { + // TSHIRT, UNDERWIRE, PUSHUP, BRALETTE + //} + + // the new state, note in the test we serialised with value UNDERWIRE so the spacer + // occuring after this won't have changed the ordinality of our serialised value + // and thus should still be deserialisable + enum class OldBras2 { + TSHIRT, UNDERWIRE, PUSHUP, SPACER, BRALETTE, SPACER2 + } + + + enum class BrasWithInit (val someList: List) { + TSHIRT(emptyList()), + UNDERWIRE(listOf(1, 2, 3)), + PUSHUP(listOf(100, 200)), + BRALETTE(emptyList()) + } + + private val brasTestName = "${this.javaClass.name}\$Bras" + + companion object { + /** + * If you want to see the schema encoded into the envelope after serialisation change this to true + */ + private const val VERBOSE = false + } + + @Suppress("NOTHING_TO_INLINE") + inline private fun classTestName(clazz: String) = "${this.javaClass.name}\$${testName()}\$$clazz" + + private val sf1 = testDefaultFactory() + + @Test + fun serialiseSimpleTest() { + data class C(val c: Bras) + + val schema = TestSerializationOutput(VERBOSE, sf1).serializeAndReturnSchema(C(Bras.UNDERWIRE)).schema + + assertEquals(2, schema.types.size) + val schema_c = schema.types.find { it.name == classTestName("C") } as CompositeType + val schema_bras = schema.types.find { it.name == brasTestName } as RestrictedType + + assertNotNull(schema_c) + assertNotNull(schema_bras) + + assertEquals(1, schema_c.fields.size) + assertEquals("c", schema_c.fields.first().name) + assertEquals(brasTestName, schema_c.fields.first().type) + + assertEquals(8, schema_bras.choices.size) + Bras.values().forEach { + val bra = it + assertNotNull (schema_bras.choices.find { it.name == bra.name }) + } + } + + @Test + fun deserialiseSimpleTest() { + data class C(val c: Bras) + + val objAndEnvelope = DeserializationInput(sf1).deserializeAndReturnEnvelope( + TestSerializationOutput(VERBOSE, sf1).serialize(C(Bras.UNDERWIRE))) + + val obj = objAndEnvelope.obj + val schema = objAndEnvelope.envelope.schema + + assertEquals(2, schema.types.size) + val schema_c = schema.types.find { it.name == classTestName("C") } as CompositeType + val schema_bras = schema.types.find { it.name == brasTestName } as RestrictedType + + assertEquals(1, schema_c.fields.size) + assertEquals("c", schema_c.fields.first().name) + assertEquals(brasTestName, schema_c.fields.first().type) + + assertEquals(8, schema_bras.choices.size) + Bras.values().forEach { + val bra = it + assertNotNull (schema_bras.choices.find { it.name == bra.name }) + } + + // Test the actual deserialised object + assertEquals(obj.c, Bras.UNDERWIRE) + } + + @Test + fun multiEnum() { + data class Support (val top: Bras, val day : DayOfWeek) + data class WeeklySupport (val tops: List) + + val week = WeeklySupport (listOf( + Support (Bras.PUSHUP, DayOfWeek.MONDAY), + Support (Bras.UNDERWIRE, DayOfWeek.WEDNESDAY), + Support (Bras.PADDED, DayOfWeek.SUNDAY))) + + val obj = DeserializationInput(sf1).deserialize(TestSerializationOutput(VERBOSE, sf1).serialize(week)) + + assertEquals(week.tops[0].top, obj.tops[0].top) + assertEquals(week.tops[0].day, obj.tops[0].day) + assertEquals(week.tops[1].top, obj.tops[1].top) + assertEquals(week.tops[1].day, obj.tops[1].day) + assertEquals(week.tops[2].top, obj.tops[2].top) + assertEquals(week.tops[2].day, obj.tops[2].day) + } + + @Test + fun enumWithInit() { + data class C(val c: BrasWithInit) + + val c = C (BrasWithInit.PUSHUP) + val obj = DeserializationInput(sf1).deserialize(TestSerializationOutput(VERBOSE, sf1).serialize(c)) + + assertEquals(c.c, obj.c) + } + + @Test(expected = NotSerializableException::class) + fun changedEnum1() { + val path = EnumTests::class.java.getResource("EnumTests.changedEnum1") + val f = File(path.toURI()) + + data class C (val a: OldBras) + + // Original version of the class for the serialised version of this class + // + // val a = OldBras.TSHIRT + // val sc = SerializationOutput(sf1).serialize(C(a)) + // f.writeBytes(sc.bytes) + // println(path) + + val sc2 = f.readBytes() + + // we expect this to throw + DeserializationInput(sf1).deserialize(SerializedBytes(sc2)) + } + + @Test + fun changedEnum2() { + val path = EnumTests::class.java.getResource("EnumTests.changedEnum2") + val f = File(path.toURI()) + + data class C (val a: OldBras2) + + // DO NOT CHANGE THIS, it's important we serialise with a value that doesn't + // change position in the upated enum class + val a = OldBras2.UNDERWIRE + + // Original version of the class for the serialised version of this class + // + // val sc = SerializationOutput(sf1).serialize(C(a)) + // f.writeBytes(sc.bytes) + // println(path) + + val sc2 = f.readBytes() + + // we expect this to throw + val obj = DeserializationInput(sf1).deserialize(SerializedBytes(sc2)) + + assertEquals(a, obj.a) + } +} \ No newline at end of file diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumTests.changedEnum1 b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumTests.changedEnum1 new file mode 100644 index 0000000000000000000000000000000000000000..800c35bf17112cdedf65d275b65ee62dfe8ef86c GIT binary patch literal 611 zcmbtR%}&BF9B(Th8jZe#AznxpCvY(#j$sv$2#yjGZw;$Z7#(iY#GQDRzDXa!69+F| zd=NVi6-`Wx9@;d&{(oQjkHg5P5CE{!2dEbSp8-H!{YF3@3YJ*oY~r*$nACc9?W%S; z3#!XBy$u(s9(SqTna@V$%6v8@kLeSw-srhqBnxEFYI}rynjvilU$t50 z3fCX5D}84{@@k!z7bbxvLZ8tkx41}HBxqp8EaEiaDNT4NEV{T~T39?R2#b@rG@ep1 zVSWbKrKW>Tzb$oyepAd*BWOrD)hS9y<=J23^a9_FXp9}F;TqL~dMo@}(!nyvbW5Z9 zz2Hw9anxPTkcw*0>_@`m4g3Jfo#FL4_C{?FOK5L=Wt9GK&>Hq7JlVkak=%B@Mi&#J G8I^a0ZNftU literal 0 HcmV?d00001 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumTests.changedEnum2 b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumTests.changedEnum2 new file mode 100644 index 0000000000000000000000000000000000000000..5f42911837200014df1478b9581254c04a68435d GIT binary patch literal 616 zcmbtR-AcnS7)@%oDTuy<3@^)8hcaQ1RwEsb{d6trWoV;Tx^!#fWWCy}?mhwxh6g_oLqs)@7Ggu#-Kl6hoAjMJ2n*vM!akvPf;j}m5(*a^r_49hJZw%zuFnap`DV<#0Xh->7_2;>i^$~u+XW> zS+4ya@uymlyw=O1hTPUf-J3dn*AuW+!FQ|W3D~ZD6(eJR>iA;;%?hsi-n3n7fISZj Gc<>G~Tf@)* literal 0 HcmV?d00001 From a829dfadaa982dca212196ef01fa12dfecbc2bf2 Mon Sep 17 00:00:00 2001 From: Katelyn Baker Date: Fri, 1 Sep 2017 10:25:08 +0100 Subject: [PATCH 068/120] Bring enum serializer into line with AMQP AMQP doesn't define an enum type itself yet the old implementation listed our snum type as that in the schema despite what we are actually doing which is serialising the enum down as a list of a string and an int accompanied by a list of AMQP choices that represent all of the enum values Review Comments Use fingerprinting of the enum types to catch whenever they're changed, include the enum constants in the fingerprint to avoid any collisions --- .../amqp/DeserializationInput.kt | 2 +- .../serialization/amqp/EnumSerializer.kt | 6 +- .../internal/serialization/amqp/Schema.kt | 95 ++++++++++--------- .../serialization/amqp/SerializerFactory.kt | 59 ++++++------ .../internal/serialization/amqp/EnumTests.kt | 8 +- 5 files changed, 90 insertions(+), 80 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt index 7f6a938bb5..d1ed63327f 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt @@ -118,7 +118,7 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { "is outside of the bounds for the list of size: ${objectHistory.size}") val objectRetrieved = objectHistory[objectIndex] - if (!objectRetrieved::class.java.isSubClassOf(type)) + if (!objectRetrieved::class.java.isSubClassOf(type.asClass()!!)) throw NotSerializableException("Existing reference type mismatch. Expected: '$type', found: '${objectRetrieved::class.java}'") objectRetrieved } else { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt index ce648b7eeb..294a0c3cf0 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt @@ -4,6 +4,10 @@ import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type import java.io.NotSerializableException +/** + * Our definition of an enum with the AMQP spec is a list (of two items, a string and an int) that is + * a restricted type with a number of choices associated with it + */ class EnumSerializer(declaredType: Type, declaredClass: Class<*>, factory: SerializerFactory) : AMQPSerializer { override val type: Type = declaredType override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" @@ -12,7 +16,7 @@ class EnumSerializer(declaredType: Type, declaredClass: Class<*>, factory: Seria init { typeNotation = RestrictedType( SerializerFactory.nameForType(declaredType), - null, emptyList(), "enum", Descriptor(typeDescriptor, null), + null, emptyList(), "list", Descriptor(typeDescriptor, null), declaredClass.enumConstants.zip(IntRange(0, declaredClass.enumConstants.size)).map { Choice(it.first.toString(), it.second.toString()) }) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt index 7b2aaa41d4..2dfe80015a 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt @@ -191,12 +191,10 @@ sealed class TypeNotation : DescribedType { companion object { fun get(obj: Any): TypeNotation { val describedType = obj as DescribedType - if (describedType.descriptor == CompositeType.DESCRIPTOR) { - return CompositeType.get(describedType) - } else if (describedType.descriptor == RestrictedType.DESCRIPTOR) { - return RestrictedType.get(describedType) - } else { - throw NotSerializableException("Unexpected descriptor ${describedType.descriptor}.") + return when (describedType.descriptor) { + CompositeType.DESCRIPTOR -> CompositeType.get(describedType) + RestrictedType.DESCRIPTOR -> RestrictedType.get(describedType) + else -> throw NotSerializableException("Unexpected descriptor ${describedType.descriptor}.") } } } @@ -360,6 +358,7 @@ data class ReferencedObject(private val refCounter: Int) : DescribedType { } private val ARRAY_HASH: String = "Array = true" +private val ENUM_HASH: String = "Enum = true" private val ALREADY_SEEN_HASH: String = "Already seen = true" private val NULLABLE_HASH: String = "Nullable = true" private val NOT_NULLABLE_HASH: String = "Nullable = false" @@ -390,7 +389,7 @@ internal fun fingerprintForDescriptors(vararg typeDescriptors: String): String { return hasher.hash().asBytes().toBase64() } -private fun Hasher.fingerprintWithCustomSerializerOrElse(factory: SerializerFactory, clazz: Class<*>, declaredType: Type, block: () -> Hasher) : Hasher { +private fun Hasher.fingerprintWithCustomSerializerOrElse(factory: SerializerFactory, clazz: Class<*>, declaredType: Type, block: () -> Hasher): Hasher { // Need to check if a custom serializer is applicable val customSerializer = factory.findCustomSerializer(clazz, declaredType) return if (customSerializer != null) { @@ -408,50 +407,58 @@ private fun fingerprintForType(type: Type, contextType: Type?, alreadySeen: Muta } else { alreadySeen += type try { - if (type is SerializerFactory.AnyType) { - hasher.putUnencodedChars(ANY_TYPE_HASH) - } else if (type is Class<*>) { - when { - type.isArray -> fingerprintForType(type.componentType, contextType, alreadySeen, hasher, factory).putUnencodedChars(ARRAY_HASH) - SerializerFactory.isPrimitive(type) || - isCollectionOrMap(type) || - type.isEnum -> hasher.putUnencodedChars(type.name) - else -> + when (type) { + is SerializerFactory.AnyType -> hasher.putUnencodedChars(ANY_TYPE_HASH) + is Class<*> -> { + if (type.isArray) { + fingerprintForType(type.componentType, contextType, alreadySeen, hasher, factory).putUnencodedChars(ARRAY_HASH) + } else if (SerializerFactory.isPrimitive(type)) { + hasher.putUnencodedChars(type.name) + } else if (isCollectionOrMap(type)) { + hasher.putUnencodedChars(type.name) + } else if (type.isEnum) { + // ensures any change to the enum (adding constants) will trigger the need for evolution + hasher.apply { + type.enumConstants.forEach { + putUnencodedChars(it.toString()) + } + }.putUnencodedChars(type.name).putUnencodedChars(ENUM_HASH) + } else { hasher.fingerprintWithCustomSerializerOrElse(factory, type, type) { - if (type.kotlin.objectInstance != null) { - // TODO: name collision is too likely for kotlin objects, we need to introduce some reference - // to the CorDapp but maybe reference to the JAR in the short term. - hasher.putUnencodedChars(type.name) - } else { - fingerprintForObject(type, type, alreadySeen, hasher, factory) + if (type.kotlin.objectInstance != null) { + // TODO: name collision is too likely for kotlin objects, we need to introduce some reference + // to the CorDapp but maybe reference to the JAR in the short term. + hasher.putUnencodedChars(type.name) + } else { + fingerprintForObject(type, type, alreadySeen, hasher, factory) + } } } } - } else if (type is ParameterizedType) { - // Hash the rawType + params - val clazz = type.rawType as Class<*> - val startingHash = if (isCollectionOrMap(clazz)) { - hasher.putUnencodedChars(clazz.name) - } else { - hasher.fingerprintWithCustomSerializerOrElse(factory, clazz, type) { - fingerprintForObject(type, type, alreadySeen, hasher, factory) + is ParameterizedType -> { + // Hash the rawType + params + val clazz = type.rawType as Class<*> + val startingHash = if (isCollectionOrMap(clazz)) { + hasher.putUnencodedChars(clazz.name) + } else { + hasher.fingerprintWithCustomSerializerOrElse(factory, clazz, type) { + fingerprintForObject(type, type, alreadySeen, hasher, factory) + } + } + // ... and concatentate the type data for each parameter type. + type.actualTypeArguments.fold(startingHash) { orig, paramType -> + fingerprintForType(paramType, type, alreadySeen, orig, factory) } } - // ... and concatentate the type data for each parameter type. - type.actualTypeArguments.fold(startingHash) { orig, paramType -> fingerprintForType(paramType, type, alreadySeen, orig, factory) } - } else if (type is GenericArrayType) { - // Hash the element type + some array hash - fingerprintForType(type.genericComponentType, contextType, alreadySeen, hasher, factory).putUnencodedChars(ARRAY_HASH) - } else if (type is TypeVariable<*>) { - // TODO: include bounds - hasher.putUnencodedChars(type.name).putUnencodedChars(TYPE_VARIABLE_HASH) - } else if (type is WildcardType) { - hasher.putUnencodedChars(type.typeName).putUnencodedChars(WILDCARD_TYPE_HASH) + // Hash the element type + some array hash + is GenericArrayType -> fingerprintForType(type.genericComponentType, contextType, alreadySeen, + hasher, factory).putUnencodedChars(ARRAY_HASH) + // TODO: include bounds + is TypeVariable<*> -> hasher.putUnencodedChars(type.name).putUnencodedChars(TYPE_VARIABLE_HASH) + is WildcardType -> hasher.putUnencodedChars(type.typeName).putUnencodedChars(WILDCARD_TYPE_HASH) + else -> throw NotSerializableException("Don't know how to hash") } - else { - throw NotSerializableException("Don't know how to hash") - } - } catch(e: NotSerializableException) { + } catch (e: NotSerializableException) { val msg = "${e.message} -> $type" logger.error(msg, e) throw NotSerializableException(msg) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt index 4538711459..2d240c5329 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt @@ -16,7 +16,7 @@ import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArrayList import javax.annotation.concurrent.ThreadSafe -data class schemaAndDescriptor (val schema: Schema, val typeDescriptor: Any) +data class schemaAndDescriptor(val schema: Schema, val typeDescriptor: Any) /** * Factory of serializers designed to be shared across threads and invocations. @@ -38,17 +38,20 @@ data class schemaAndDescriptor (val schema: Schema, val typeDescriptor: Any) // TODO: need to rethink matching of constructor to properties in relation to implementing interfaces and needing those properties etc. // TODO: need to support super classes as well as interfaces with our current code base... what's involved? If we continue to ban, what is the impact? @ThreadSafe -class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { +class SerializerFactory(val whitelist: ClassWhitelist, cl: ClassLoader) { private val serializersByType = ConcurrentHashMap>() private val serializersByDescriptor = ConcurrentHashMap>() private val customSerializers = CopyOnWriteArrayList>() private val classCarpenter = ClassCarpenter(cl) - val classloader : ClassLoader + val classloader: ClassLoader get() = classCarpenter.classloader - fun getEvolutionSerializer(typeNotation: TypeNotation, newSerializer: ObjectSerializer) : AMQPSerializer { + private fun getEvolutionSerializer(typeNotation: TypeNotation, newSerializer: AMQPSerializer): AMQPSerializer { return serializersByDescriptor.computeIfAbsent(typeNotation.descriptor.name!!) { - EvolutionSerializer.make(typeNotation as CompositeType, newSerializer, this) + when (typeNotation) { + is CompositeType -> EvolutionSerializer.make(typeNotation, newSerializer as ObjectSerializer, this) + is RestrictedType -> throw NotSerializableException("Enum evolution is not currently supported") + } } } @@ -66,7 +69,8 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { val actualType: Type = inferTypeVariables(actualClass, declaredClass, declaredType) ?: declaredType val serializer = when { - (Collection::class.java.isAssignableFrom(declaredClass)) -> { serializersByType.computeIfAbsent(declaredType) { + (Collection::class.java.isAssignableFrom(declaredClass)) -> { + serializersByType.computeIfAbsent(declaredType) { CollectionSerializer(declaredType as? ParameterizedType ?: DeserializedParameterizedType( declaredClass, arrayOf(AnyType), null), this) } @@ -91,17 +95,17 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { * type. */ // TODO: test GenericArrayType - private fun inferTypeVariables(actualClass: Class<*>?, declaredClass: Class<*>, declaredType: Type): Type? { - if (declaredType is ParameterizedType) { - return inferTypeVariables(actualClass, declaredClass, declaredType) - } else if (declaredType is Class<*>) { - // Nothing to infer, otherwise we'd have ParameterizedType - return actualClass - } else if (declaredType is GenericArrayType) { - val declaredComponent = declaredType.genericComponentType - return inferTypeVariables(actualClass?.componentType, declaredComponent.asClass()!!, declaredComponent)?.asArray() - } else return null - } + private fun inferTypeVariables(actualClass: Class<*>?, declaredClass: Class<*>, declaredType: Type): Type? = + when (declaredType) { + is ParameterizedType -> inferTypeVariables(actualClass, declaredClass, declaredType) + // Nothing to infer, otherwise we'd have ParameterizedType + is Class<*> -> actualClass + is GenericArrayType -> { + val declaredComponent = declaredType.genericComponentType + inferTypeVariables(actualClass?.componentType, declaredComponent.asClass()!!, declaredComponent)?.asArray() + } + else -> null + } /** * Try and infer concrete types for any generics type variables for the actual class encountered, based on the declared @@ -118,8 +122,7 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { if (implementationChain != null) { val start = implementationChain.last() val rest = implementationChain.dropLast(1).drop(1) - val resolver = rest.reversed().fold(TypeResolver().where(start, declaredType)) { - resolved, chainEntry -> + val resolver = rest.reversed().fold(TypeResolver().where(start, declaredType)) { resolved, chainEntry -> val newResolved = resolved.resolveType(chainEntry) TypeResolver().where(chainEntry, newResolved) } @@ -195,7 +198,7 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { // doesn't match that of the serialised object then we are dealing with different // instance of the class, as such we need to build an EvolutionSerialiser if (serialiser.typeDescriptor != typeNotation.descriptor.name) { - getEvolutionSerializer(typeNotation, serialiser as ObjectSerializer) + getEvolutionSerializer(typeNotation, serialiser) } } catch (e: ClassNotFoundException) { if (sentinel || (typeNotation !is CompositeType)) throw e @@ -211,16 +214,14 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { } private fun processSchemaEntry(typeNotation: TypeNotation) = when (typeNotation) { - is CompositeType -> processCompositeType(typeNotation) // java.lang.Class (whether a class or interface) - is RestrictedType -> processRestrictedType(typeNotation) // Collection / Map, possibly with generics - } - - private fun processRestrictedType(typeNotation: RestrictedType): AMQPSerializer { - // TODO: class loader logic, and compare the schema. - val type = typeForName(typeNotation.name, classloader) - return get(null, type) + is CompositeType -> processCompositeType(typeNotation) // java.lang.Class (whether a class or interface) + is RestrictedType -> processRestrictedType(typeNotation) // Collection / Map, possibly with generics } + // TODO: class loader logic, and compare the schema. + private fun processRestrictedType(typeNotation: RestrictedType) = get(null, + typeForName(typeNotation.name, classloader)) + private fun processCompositeType(typeNotation: CompositeType): AMQPSerializer { // TODO: class loader logic, and compare the schema. val type = typeForName(typeNotation.name, classloader) @@ -234,7 +235,7 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl : ClassLoader) { findCustomSerializer(clazz, declaredType) ?: run { if (type.isArray()) { // Allow Object[] since this can be quite common (i.e. an untyped array) - if(type.componentType() != Object::class.java) whitelisted(type.componentType()) + if (type.componentType() != Object::class.java) whitelisted(type.componentType()) if (clazz.componentType.isPrimitive) PrimArraySerializer.make(type, this) else ArraySerializer.make(type, this) } else if (clazz.kotlin.objectInstance != null) { diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt index 5293f02e21..d46ec93c5a 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt @@ -164,7 +164,7 @@ class EnumTests { DeserializationInput(sf1).deserialize(SerializedBytes(sc2)) } - @Test + @Test(expected = NotSerializableException::class) fun changedEnum2() { val path = EnumTests::class.java.getResource("EnumTests.changedEnum2") val f = File(path.toURI()) @@ -173,10 +173,10 @@ class EnumTests { // DO NOT CHANGE THIS, it's important we serialise with a value that doesn't // change position in the upated enum class - val a = OldBras2.UNDERWIRE // Original version of the class for the serialised version of this class // + // val a = OldBras2.UNDERWIRE // val sc = SerializationOutput(sf1).serialize(C(a)) // f.writeBytes(sc.bytes) // println(path) @@ -184,8 +184,6 @@ class EnumTests { val sc2 = f.readBytes() // we expect this to throw - val obj = DeserializationInput(sf1).deserialize(SerializedBytes(sc2)) - - assertEquals(a, obj.a) + DeserializationInput(sf1).deserialize(SerializedBytes(sc2)) } } \ No newline at end of file From 40146cdbc052146959b3f73199abbc56029defe7 Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Mon, 4 Sep 2017 15:20:44 +0100 Subject: [PATCH 069/120] Fixed a crash in cordformation when trying to build nodes for a project with a file as a dependency and any other dependencies without a group --- constants.properties | 2 +- .../src/main/groovy/net/corda/plugins/Cordformation.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/constants.properties b/constants.properties index 002037fd86..ded142b810 100644 --- a/constants.properties +++ b/constants.properties @@ -1,4 +1,4 @@ -gradlePluginsVersion=0.15.2 +gradlePluginsVersion=0.16.0 kotlinVersion=1.1.4 guavaVersion=21.0 bouncycastleVersion=1.57 diff --git a/gradle-plugins/cordformation/src/main/groovy/net/corda/plugins/Cordformation.groovy b/gradle-plugins/cordformation/src/main/groovy/net/corda/plugins/Cordformation.groovy index 59b495879e..235570cf74 100644 --- a/gradle-plugins/cordformation/src/main/groovy/net/corda/plugins/Cordformation.groovy +++ b/gradle-plugins/cordformation/src/main/groovy/net/corda/plugins/Cordformation.groovy @@ -71,7 +71,7 @@ class Cordformation implements Plugin { def filteredDeps = directDeps.findAll { excludes.collect { exclude -> (exclude.group == it.group) && (exclude.name == it.name) }.findAll { it }.isEmpty() } filteredDeps.each { // net.corda may be a core dependency which shouldn't be included in this cordapp so give a warning - if(it.group.contains('net.corda.')) { + if(it.group && it.group.contains('net.corda.')) { logger.warn("You appear to have included a Corda platform component ($it) using a 'compile' or 'runtime' dependency." + "This can cause node stability problems. Please use 'corda' instead." + "See http://docs.corda.net/cordapp-build-systems.html") From 4150316367936dcda7e9c6e3fe0857b67d022628 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Mon, 4 Sep 2017 15:40:37 +0100 Subject: [PATCH 070/120] Add package descriptions to Dokka --- .../net/corda/core/crypto/CompositeKey.kt | 19 ++-- docs/packages.md | 104 +++++++++++++++++- 2 files changed, 112 insertions(+), 11 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt b/core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt index ae86b3f198..3d7824751d 100644 --- a/core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt +++ b/core/src/main/kotlin/net/corda/core/crypto/CompositeKey.kt @@ -11,8 +11,10 @@ import java.security.PublicKey import java.util.* /** - * A tree data structure that enables the representation of composite public keys. - * Notice that with that implementation CompositeKey extends [PublicKey]. Leaves are represented by single public keys. + * A tree data structure that enables the representation of composite public keys, which are used to represent + * the signing requirements for multisignature scenarios such as RAFT notary services. A composite key is a list + * of leaf keys and their contributing weight, and each leaf can be a conventional single key or a composite key. + * Keys contribute their weight to the total if they are matched by the signature. * * For complex scenarios, such as *"Both Alice and Bob need to sign to consume a state S"*, we can represent * the requirement by creating a tree with a root [CompositeKey], and Alice and Bob as children. @@ -22,9 +24,7 @@ import java.util.* * Using these constructs we can express e.g. 1 of N (OR) or N of N (AND) signature requirements. By nesting we can * create multi-level requirements such as *"either the CEO or 3 of 5 of his assistants need to sign"*. * - * [CompositeKey] maintains a list of [NodeAndWeight]s which holds child subtree with associated weight carried by child node signatures. - * - * The [threshold] specifies the minimum total weight required (in the simple case – the minimum number of child + * @property threshold specifies the minimum total weight required (in the simple case – the minimum number of child * signatures required) to satisfy the sub-tree rooted at this node. */ @CordaSerializable @@ -249,9 +249,14 @@ class CompositeKey private constructor(val threshold: Int, children: List 0) val n = children.size return if (n > 1) CompositeKey(threshold ?: children.map { (_, weight) -> weight }.sum(), children) @@ -261,7 +266,7 @@ class CompositeKey private constructor(val threshold: Int, children: List Date: Mon, 4 Sep 2017 15:48:38 +0100 Subject: [PATCH 071/120] Adding time limit for Driver address binding. (#1390) * Adding time limit for Driver address binding. Otherwise it just hangs infinietly * Addressing review comments * Addressing review comments --- .../src/main/kotlin/net/corda/testing/driver/Driver.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt index e2c2539f10..47c5a34f41 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -370,8 +370,13 @@ fun addressMustBeBoundFuture(executorService: ScheduledExecutorService, hostAndP } } -fun addressMustNotBeBound(executorService: ScheduledExecutorService, hostAndPort: NetworkHostAndPort) { - addressMustNotBeBoundFuture(executorService, hostAndPort).getOrThrow() +/* + * The default timeout value of 40 seconds have been chosen based on previous node shutdown time estimate. + * It's been observed that nodes can take up to 30 seconds to shut down, so just to stay on the safe side the 40 seconds + * timeout has been chosen. + */ +fun addressMustNotBeBound(executorService: ScheduledExecutorService, hostAndPort: NetworkHostAndPort, timeout: Duration = 40.seconds) { + addressMustNotBeBoundFuture(executorService, hostAndPort).getOrThrow(timeout) } fun addressMustNotBeBoundFuture(executorService: ScheduledExecutorService, hostAndPort: NetworkHostAndPort): CordaFuture { From 3ceee23901a65a6389ee7aa5e390af910e72a245 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Mon, 4 Sep 2017 11:33:21 +0100 Subject: [PATCH 072/120] Add external documentation Add references to Bouncy Castle, Jackson and JavaFX documentation for Dokka to link to. --- docs/build.gradle | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/build.gradle b/docs/build.gradle index 6bb772d729..f4bf3cfa2e 100644 --- a/docs/build.gradle +++ b/docs/build.gradle @@ -11,6 +11,16 @@ dokka { processConfigurations = ['compile'] sourceDirs = files('../core/src/main/kotlin', '../client/jfx/src/main/kotlin', '../client/mock/src/main/kotlin', '../client/rpc/src/main/kotlin', '../node-api/src/main/kotlin', '../finance/src/main/kotlin', '../client/jackson/src/main/kotlin') jdkVersion = 8 + + externalDocumentationLink { + url = new URL("http://fasterxml.github.io/jackson-core/javadoc/2.8/") + } + externalDocumentationLink { + url = new URL("https://docs.oracle.com/javafx/2/api/") + } + externalDocumentationLink { + url = new URL("http://www.bouncycastle.org/docs/docs1.5on/") + } } task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) { @@ -21,6 +31,16 @@ task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) { sourceDirs = files('../core/src/main/kotlin', '../client/jfx/src/main/kotlin', '../client/mock/src/main/kotlin', '../client/rpc/src/main/kotlin', '../node-api/src/main/kotlin', '../finance/src/main/kotlin', '../client/jackson/src/main/kotlin') includes = ['packages.md'] jdkVersion = 8 + + externalDocumentationLink { + url = new URL("http://fasterxml.github.io/jackson-core/javadoc/2.8/") + } + externalDocumentationLink { + url = new URL("https://docs.oracle.com/javafx/2/api/") + } + externalDocumentationLink { + url = new URL("http://www.bouncycastle.org/docs/docs1.5on/") + } } task buildDocs(dependsOn: ['apidocs', 'makeDocs']) From 0e250e9279123731144435f330640077a41b977b Mon Sep 17 00:00:00 2001 From: Andrzej Cichocki Date: Mon, 4 Sep 2017 16:19:12 +0100 Subject: [PATCH 073/120] Add support for signed attachments (#1369) --- .../net/corda/core/contracts/Attachment.kt | 42 +++++++ .../net/corda/core/contracts/Structures.kt | 70 ----------- .../corda/core/internal/AbstractAttachment.kt | 69 +++++++++++ .../net/corda/core/internal/FetchDataFlow.kt | 1 - .../corda/core/contracts/StructuresTests.kt | 1 + .../core/internal/AbstractAttachmentTest.kt | 111 ++++++++++++++++++ .../AttachmentSerializationTest.kt | 1 + .../persistence/NodeAttachmentService.kt | 2 +- .../net/corda/testing/node/MockServices.kt | 7 +- .../net/corda/verifier/GeneratedLedger.kt | 7 +- .../servlets/AttachmentDownloadServlet.kt | 2 +- 11 files changed, 231 insertions(+), 82 deletions(-) create mode 100644 core/src/main/kotlin/net/corda/core/contracts/Attachment.kt create mode 100644 core/src/main/kotlin/net/corda/core/internal/AbstractAttachment.kt create mode 100644 core/src/test/kotlin/net/corda/core/internal/AbstractAttachmentTest.kt diff --git a/core/src/main/kotlin/net/corda/core/contracts/Attachment.kt b/core/src/main/kotlin/net/corda/core/contracts/Attachment.kt new file mode 100644 index 0000000000..b55055e529 --- /dev/null +++ b/core/src/main/kotlin/net/corda/core/contracts/Attachment.kt @@ -0,0 +1,42 @@ +package net.corda.core.contracts + +import net.corda.core.identity.Party +import net.corda.core.internal.extractFile +import java.io.FileNotFoundException +import java.io.InputStream +import java.io.OutputStream +import java.util.jar.JarInputStream + +/** + * An attachment is a ZIP (or an optionally signed JAR) that contains one or more files. Attachments are meant to + * contain public static data which can be referenced from transactions and utilised from contracts. Good examples + * of how attachments are meant to be used include: + * - Calendar data + * - Fixes (e.g. LIBOR) + * - Smart contract code + * - Legal documents + * - Facts generated by oracles which might be reused a lot + */ +interface Attachment : NamedByHash { + fun open(): InputStream + fun openAsJAR(): JarInputStream { + val stream = open() + try { + return JarInputStream(stream) + } catch (t: Throwable) { + stream.use { throw t } + } + } + + /** + * Finds the named file case insensitively and copies it to the output stream. + * @throws FileNotFoundException if the given path doesn't exist in the attachment. + */ + fun extractFile(path: String, outputTo: OutputStream) = openAsJAR().use { it.extractFile(path, outputTo) } + + /** + * The parties that have correctly signed the whole attachment. + * Can be empty, for example non-contract attachments won't be necessarily be signed. + */ + val signers: List +} diff --git a/core/src/main/kotlin/net/corda/core/contracts/Structures.kt b/core/src/main/kotlin/net/corda/core/contracts/Structures.kt index f3e501bd5a..820d87fe6a 100644 --- a/core/src/main/kotlin/net/corda/core/contracts/Structures.kt +++ b/core/src/main/kotlin/net/corda/core/contracts/Structures.kt @@ -9,18 +9,11 @@ import net.corda.core.flows.FlowLogicRefFactory import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.serialization.CordaSerializable -import net.corda.core.serialization.MissingAttachmentsException -import net.corda.core.serialization.SerializeAsTokenContext import net.corda.core.serialization.serialize import net.corda.core.transactions.LedgerTransaction import net.corda.core.utilities.OpaqueBytes -import java.io.FileNotFoundException -import java.io.IOException -import java.io.InputStream -import java.io.OutputStream import java.security.PublicKey import java.time.Instant -import java.util.jar.JarInputStream /** Implemented by anything that can be named by a secure hash value (e.g. transactions, attachments). */ interface NamedByHash { @@ -362,69 +355,6 @@ interface UpgradedContract ByteArray) : Attachment { - companion object { - fun SerializeAsTokenContext.attachmentDataLoader(id: SecureHash): () -> ByteArray { - return { - val a = serviceHub.attachments.openAttachment(id) ?: throw MissingAttachmentsException(listOf(id)) - (a as? AbstractAttachment)?.attachmentData ?: a.open().use { it.readBytes() } - } - } - } - - protected val attachmentData: ByteArray by lazy(dataLoader) - override fun open(): InputStream = attachmentData.inputStream() - override fun equals(other: Any?) = other === this || other is Attachment && other.id == this.id - override fun hashCode() = id.hashCode() - override fun toString() = "${javaClass.simpleName}(id=$id)" -} - -@Throws(IOException::class) -fun JarInputStream.extractFile(path: String, outputTo: OutputStream) { - val p = path.toLowerCase().split('\\', '/') - while (true) { - val e = nextJarEntry ?: break - if (!e.isDirectory && e.name.toLowerCase().split('\\', '/') == p) { - copyTo(outputTo) - return - } - closeEntry() - } - throw FileNotFoundException(path) -} - /** * A privacy salt is required to compute nonces per transaction component in order to ensure that an adversary cannot * use brute force techniques and reveal the content of a Merkle-leaf hashed value. diff --git a/core/src/main/kotlin/net/corda/core/internal/AbstractAttachment.kt b/core/src/main/kotlin/net/corda/core/internal/AbstractAttachment.kt new file mode 100644 index 0000000000..2f402f43e5 --- /dev/null +++ b/core/src/main/kotlin/net/corda/core/internal/AbstractAttachment.kt @@ -0,0 +1,69 @@ +package net.corda.core.internal + +import net.corda.core.contracts.Attachment +import net.corda.core.crypto.SecureHash +import net.corda.core.identity.Party +import net.corda.core.serialization.MissingAttachmentsException +import net.corda.core.serialization.SerializeAsTokenContext +import java.io.FileNotFoundException +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream +import java.security.CodeSigner +import java.util.jar.JarInputStream + +abstract class AbstractAttachment(dataLoader: () -> ByteArray) : Attachment { + companion object { + fun SerializeAsTokenContext.attachmentDataLoader(id: SecureHash): () -> ByteArray { + return { + val a = serviceHub.attachments.openAttachment(id) ?: throw MissingAttachmentsException(listOf(id)) + (a as? AbstractAttachment)?.attachmentData ?: a.open().use { it.readBytes() } + } + } + + /** @see */ + private val unsignableEntryName = "META-INF/(?:.*[.](?:SF|DSA|RSA)|SIG-.*)".toRegex() + private val shredder = ByteArray(1024) + } + + protected val attachmentData: ByteArray by lazy(dataLoader) + override fun open(): InputStream = attachmentData.inputStream() + override val signers by lazy { + // Can't start with empty set if we're doing intersections. Logically the null means "all possible signers": + var attachmentSigners: MutableSet? = null + openAsJAR().use { jar -> + while (true) { + val entry = jar.nextJarEntry ?: break + if (entry.isDirectory || unsignableEntryName.matches(entry.name)) continue + while (jar.read(shredder) != -1) { // Must read entry fully for codeSigners to be valid. + // Do nothing. + } + val entrySigners = entry.codeSigners ?: emptyArray() + attachmentSigners?.retainAll(entrySigners) ?: run { attachmentSigners = entrySigners.toMutableSet() } + if (attachmentSigners!!.isEmpty()) break // Performance short-circuit. + } + } + (attachmentSigners ?: emptySet()).map { + Party(it.signerCertPath.certificates[0].toX509CertHolder()) + }.sortedBy { it.name.toString() } // Determinism. + } + + override fun equals(other: Any?) = other === this || other is Attachment && other.id == this.id + override fun hashCode() = id.hashCode() + override fun toString() = "${javaClass.simpleName}(id=$id)" +} + +@Throws(IOException::class) +fun JarInputStream.extractFile(path: String, outputTo: OutputStream) { + fun String.norm() = toLowerCase().split('\\', '/') // XXX: Should this really be locale-sensitive? + val p = path.norm() + while (true) { + val e = nextJarEntry ?: break + if (!e.isDirectory && e.name.norm() == p) { + copyTo(outputTo) + return + } + closeEntry() + } + throw FileNotFoundException(path) +} diff --git a/core/src/main/kotlin/net/corda/core/internal/FetchDataFlow.kt b/core/src/main/kotlin/net/corda/core/internal/FetchDataFlow.kt index 5006843121..ce95ee9838 100644 --- a/core/src/main/kotlin/net/corda/core/internal/FetchDataFlow.kt +++ b/core/src/main/kotlin/net/corda/core/internal/FetchDataFlow.kt @@ -1,7 +1,6 @@ package net.corda.core.internal import co.paralleluniverse.fibers.Suspendable -import net.corda.core.contracts.AbstractAttachment import net.corda.core.contracts.Attachment import net.corda.core.contracts.NamedByHash import net.corda.core.crypto.SecureHash diff --git a/core/src/test/kotlin/net/corda/core/contracts/StructuresTests.kt b/core/src/test/kotlin/net/corda/core/contracts/StructuresTests.kt index b1d915a745..47f69945dd 100644 --- a/core/src/test/kotlin/net/corda/core/contracts/StructuresTests.kt +++ b/core/src/test/kotlin/net/corda/core/contracts/StructuresTests.kt @@ -30,6 +30,7 @@ class AttachmentTest { val attachment = object : Attachment { override val id get() = throw UnsupportedOperationException() override fun open() = inputStream + override val signers get() = throw UnsupportedOperationException() } try { attachment.openAsJAR() diff --git a/core/src/test/kotlin/net/corda/core/internal/AbstractAttachmentTest.kt b/core/src/test/kotlin/net/corda/core/internal/AbstractAttachmentTest.kt new file mode 100644 index 0000000000..338cbfdb19 --- /dev/null +++ b/core/src/test/kotlin/net/corda/core/internal/AbstractAttachmentTest.kt @@ -0,0 +1,111 @@ +package net.corda.core.internal + +import net.corda.testing.ALICE +import net.corda.testing.BOB +import org.assertj.core.api.Assertions.assertThatThrownBy +import org.junit.After +import org.junit.AfterClass +import org.junit.BeforeClass +import org.junit.Test +import java.nio.file.Files +import java.nio.file.Paths +import kotlin.test.assertEquals + +class AbstractAttachmentTest { + companion object { + private val dir = Files.createTempDirectory(AbstractAttachmentTest::class.simpleName) + private val bin = Paths.get(System.getProperty("java.home")).let { if (it.endsWith("jre")) it.parent else it } / "bin" + fun execute(vararg command: String) { + assertEquals(0, ProcessBuilder().inheritIO().directory(dir.toFile()).command((bin / command[0]).toString(), *command.sliceArray(1 until command.size)).start().waitFor()) + } + + @BeforeClass + @JvmStatic + fun beforeClass() { + execute("keytool", "-genkey", "-keystore", "_teststore", "-storepass", "storepass", "-keyalg", "RSA", "-alias", "alice", "-keypass", "alicepass", "-dname", ALICE.toString()) + execute("keytool", "-genkey", "-keystore", "_teststore", "-storepass", "storepass", "-keyalg", "RSA", "-alias", "bob", "-keypass", "bobpass", "-dname", BOB.toString()) + (dir / "_signable1").writeLines(listOf("signable1")) + (dir / "_signable2").writeLines(listOf("signable2")) + (dir / "_signable3").writeLines(listOf("signable3")) + } + + private fun load(name: String) = object : AbstractAttachment({ (dir / name).readAll() }) { + override val id get() = throw UnsupportedOperationException() + } + + @AfterClass + @JvmStatic + fun afterClass() { + dir.toFile().deleteRecursively() + } + } + + @After + fun tearDown() { + dir.toFile().listFiles().forEach { + if (!it.name.startsWith("_")) it.deleteRecursively() + } + assertEquals(4, dir.toFile().listFiles().size) + } + + @Test + fun `empty jar has no signers`() { + (dir / "META-INF").createDirectory() // At least one arg is required, and jar cvf conveniently ignores this. + execute("jar", "cvf", "attachment.jar", "META-INF") + assertEquals(emptyList(), load("attachment.jar").signers) + execute("jarsigner", "-keystore", "_teststore", "-storepass", "storepass", "-keypass", "alicepass", "attachment.jar", "alice") + assertEquals(emptyList(), load("attachment.jar").signers) // There needs to have been a file for ALICE to sign. + } + + @Test + fun `unsigned jar has no signers`() { + execute("jar", "cvf", "attachment.jar", "_signable1") + assertEquals(emptyList(), load("attachment.jar").signers) + execute("jar", "uvf", "attachment.jar", "_signable2") + assertEquals(emptyList(), load("attachment.jar").signers) + } + + @Test + fun `one signer`() { + execute("jar", "cvf", "attachment.jar", "_signable1", "_signable2") + execute("jarsigner", "-keystore", "_teststore", "-storepass", "storepass", "-keypass", "alicepass", "attachment.jar", "alice") + assertEquals(listOf(ALICE.name), load("attachment.jar").signers.map { it.name }) // We only reused ALICE's distinguished name, so the keys will be different. + (dir / "my-dir").createDirectory() + execute("jar", "uvf", "attachment.jar", "my-dir") + assertEquals(listOf(ALICE.name), load("attachment.jar").signers.map { it.name }) // Unsigned directory is irrelevant. + } + + @Test + fun `two signers`() { + execute("jar", "cvf", "attachment.jar", "_signable1", "_signable2") + execute("jarsigner", "-keystore", "_teststore", "-storepass", "storepass", "-keypass", "alicepass", "attachment.jar", "alice") + execute("jarsigner", "-keystore", "_teststore", "-storepass", "storepass", "-keypass", "bobpass", "attachment.jar", "bob") + assertEquals(listOf(ALICE.name, BOB.name), load("attachment.jar").signers.map { it.name }) + } + + @Test + fun `a party must sign all the files in the attachment to be a signer`() { + execute("jar", "cvf", "attachment.jar", "_signable1") + execute("jarsigner", "-keystore", "_teststore", "-storepass", "storepass", "-keypass", "alicepass", "attachment.jar", "alice") + assertEquals(listOf(ALICE.name), load("attachment.jar").signers.map { it.name }) + execute("jar", "uvf", "attachment.jar", "_signable2") + execute("jarsigner", "-keystore", "_teststore", "-storepass", "storepass", "-keypass", "bobpass", "attachment.jar", "bob") + assertEquals(listOf(BOB.name), load("attachment.jar").signers.map { it.name }) // ALICE hasn't signed the new file. + execute("jar", "uvf", "attachment.jar", "_signable3") + assertEquals(emptyList(), load("attachment.jar").signers) // Neither party has signed the new file. + } + + @Test + fun `bad signature is caught even if the party would not qualify as a signer`() { + (dir / "volatile").writeLines(listOf("volatile")) + execute("jar", "cvf", "attachment.jar", "volatile") + execute("jarsigner", "-keystore", "_teststore", "-storepass", "storepass", "-keypass", "alicepass", "attachment.jar", "alice") + assertEquals(listOf(ALICE.name), load("attachment.jar").signers.map { it.name }) + (dir / "volatile").writeLines(listOf("garbage")) + execute("jar", "uvf", "attachment.jar", "volatile", "_signable1") // ALICE's signature on volatile is now bad. + execute("jarsigner", "-keystore", "_teststore", "-storepass", "storepass", "-keypass", "bobpass", "attachment.jar", "bob") + val a = load("attachment.jar") + // The JDK doesn't care that BOB has correctly signed the whole thing, it won't let us process the entry with ALICE's bad signature: + assertThatThrownBy { a.signers }.isInstanceOf(SecurityException::class.java) + } +} diff --git a/core/src/test/kotlin/net/corda/core/serialization/AttachmentSerializationTest.kt b/core/src/test/kotlin/net/corda/core/serialization/AttachmentSerializationTest.kt index 64e703dfec..ab38c1a545 100644 --- a/core/src/test/kotlin/net/corda/core/serialization/AttachmentSerializationTest.kt +++ b/core/src/test/kotlin/net/corda/core/serialization/AttachmentSerializationTest.kt @@ -113,6 +113,7 @@ class AttachmentSerializationTest { private class CustomAttachment(override val id: SecureHash, internal val customContent: String) : Attachment { override fun open() = throw UnsupportedOperationException("Not implemented.") + override val signers get() = throw UnsupportedOperationException() } private class CustomAttachmentLogic(server: MockNetwork.MockNode, private val attachmentId: SecureHash, private val customContent: String) : ClientLogic(server) { diff --git a/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt b/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt index 28125f40ff..94c00f52ca 100644 --- a/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt +++ b/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt @@ -6,7 +6,7 @@ import com.google.common.hash.HashCode import com.google.common.hash.Hashing import com.google.common.hash.HashingInputStream import com.google.common.io.CountingInputStream -import net.corda.core.contracts.AbstractAttachment +import net.corda.core.internal.AbstractAttachment import net.corda.core.contracts.Attachment import net.corda.core.crypto.SecureHash import net.corda.core.node.services.AttachmentStorage diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt index 3f0bdc17f5..83394c5180 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt @@ -1,5 +1,6 @@ package net.corda.testing.node +import net.corda.core.internal.AbstractAttachment import net.corda.core.contracts.Attachment import net.corda.core.crypto.* import net.corda.core.flows.StateMachineRunId @@ -36,7 +37,6 @@ import net.corda.testing.schemas.DummyLinearStateSchemaV1 import org.bouncycastle.operator.ContentSigner import rx.Observable import rx.subjects.PublishSubject -import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.File import java.io.InputStream @@ -222,9 +222,8 @@ class MockAttachmentStorage : AttachmentStorage, SingletonSerializeAsToken() { override fun openAttachment(id: SecureHash): Attachment? { val f = files[id] ?: return null - return object : Attachment { - override fun open(): InputStream = ByteArrayInputStream(f) - override val id: SecureHash = id + return object : AbstractAttachment({ f }) { + override val id = id } } diff --git a/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt b/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt index a5890f8a9b..ff4dc2d99f 100644 --- a/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt +++ b/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt @@ -8,11 +8,11 @@ import net.corda.core.crypto.sha256 import net.corda.core.identity.AbstractParty import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party +import net.corda.core.internal.AbstractAttachment import net.corda.core.transactions.LedgerTransaction import net.corda.core.transactions.WireTransaction import net.corda.testing.contracts.DummyContract import net.corda.testing.getTestX509Name -import java.io.ByteArrayInputStream import java.math.BigInteger import java.security.PublicKey import java.util.* @@ -184,11 +184,8 @@ data class GeneratedState( override val contract = DummyContract() } -class GeneratedAttachment( - val bytes: ByteArray -) : Attachment { +class GeneratedAttachment(bytes: ByteArray) : AbstractAttachment({ bytes }) { override val id = bytes.sha256() - override fun open() = ByteArrayInputStream(bytes) } class GeneratedCommandData( diff --git a/webserver/src/main/kotlin/net/corda/webserver/servlets/AttachmentDownloadServlet.kt b/webserver/src/main/kotlin/net/corda/webserver/servlets/AttachmentDownloadServlet.kt index 9171e02e60..9750f595ac 100644 --- a/webserver/src/main/kotlin/net/corda/webserver/servlets/AttachmentDownloadServlet.kt +++ b/webserver/src/main/kotlin/net/corda/webserver/servlets/AttachmentDownloadServlet.kt @@ -1,6 +1,6 @@ package net.corda.webserver.servlets -import net.corda.core.contracts.extractFile +import net.corda.core.internal.extractFile import net.corda.core.crypto.SecureHash import net.corda.core.messaging.CordaRPCOps import net.corda.core.utilities.loggerFor From 015483656af4bc5590b97b523f9e800f5832d56c Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Mon, 4 Sep 2017 16:21:58 +0100 Subject: [PATCH 074/120] Fix bad merge bdb87e38ca579e75370df581af8ca76e42b23730 (#1411) --- .../nodeapi/internal/serialization/amqp/DeserializationInput.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt index d1ed63327f..57371c7c9d 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt @@ -137,7 +137,7 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { // Store the reference in case we need it later on. // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content - if (type.asClass()?.isPrimitive != true) objectHistory.add(objectRead) + if (suitableForObjectReference(objectRead.javaClass)) objectHistory.add(objectRead) objectRead } From 0df93e6e50b7587486adbf8a645a4de0ee2663c6 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Mon, 4 Sep 2017 22:29:41 +0100 Subject: [PATCH 075/120] Start cleaning up node API Dokka comments (#1397) * Change RPCApi comments to inline from Dokka, as the existing comments are not API documentation, and render simply as "The RPC protocol:" in several places, which is unhelpful. * Rewrite RPCApi comments to no longer be in semi-Dokka format, but instead better reflect they are functional documentation. * Add Dokka documentation around RPC API * Change JvmStatics to const --- .../main/kotlin/net/corda/nodeapi/RPCApi.kt | 106 ++++++++++-------- .../kotlin/net/corda/nodeapi/RPCStructures.kt | 9 +- 2 files changed, 68 insertions(+), 47 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/RPCApi.kt b/node-api/src/main/kotlin/net/corda/nodeapi/RPCApi.kt index e3376e482c..408276fded 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/RPCApi.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/RPCApi.kt @@ -4,14 +4,6 @@ import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import net.corda.core.utilities.Try -import net.corda.nodeapi.RPCApi.ClientToServer -import net.corda.nodeapi.RPCApi.ObservableId -import net.corda.nodeapi.RPCApi.RPC_CLIENT_BINDING_REMOVALS -import net.corda.nodeapi.RPCApi.RPC_CLIENT_BINDING_REMOVAL_FILTER_EXPRESSION -import net.corda.nodeapi.RPCApi.RPC_CLIENT_QUEUE_NAME_PREFIX -import net.corda.nodeapi.RPCApi.RPC_SERVER_QUEUE_NAME -import net.corda.nodeapi.RPCApi.RpcRequestId -import net.corda.nodeapi.RPCApi.ServerToClient import org.apache.activemq.artemis.api.core.SimpleString import org.apache.activemq.artemis.api.core.client.* import org.apache.activemq.artemis.api.core.management.CoreNotificationType @@ -20,41 +12,43 @@ import org.apache.activemq.artemis.reader.MessageUtil import rx.Notification import java.util.* +// The RPC protocol: +// +// The server consumes the queue "RPC_SERVER_QUEUE_NAME" and receives RPC requests (ClientToServer.RpcRequest) on it. +// When a client starts up it should create a queue for its inbound messages, this should be of the form +// "RPC_CLIENT_QUEUE_NAME_PREFIX.$username.$nonce". Each RPC request contains this address (in +// ClientToServer.RpcRequest.clientAddress), this is where the server will send the reply to the request as well as +// subsequent Observations rooted in the RPC. The requests/replies are muxed using a unique RpcRequestId generated by +// the client for each request. +// +// If an RPC reply's payload (ServerToClient.RpcReply.result) contains observables then the server will generate a +// unique ObservableId for each and serialise them in place of the observables themselves. Subsequently the client +// should be prepared to receive observations (ServerToClient.Observation), muxed by the relevant ObservableId. +// In addition each observation itself may contain further observables, this case should behave the same as before. +// +// Additionally the client may send ClientToServer.ObservablesClosed messages indicating that certain observables +// aren't consumed anymore, which should subsequently stop the stream from the server. Note that some observations may +// already be in flight when this is sent, the client should handle this gracefully. +// +// An example session: +// Client Server +// ----------RpcRequest(RID0)-----------> // Client makes RPC request with ID "RID0" +// <----RpcReply(RID0, Payload(OID0))---- // Server sends reply containing an observable with ID "OID0" +// <---------Observation(OID0)----------- // Server sends observation onto "OID0" +// <---Observation(OID0, Payload(OID1))-- // Server sends another observation, this time containing another observable +// <---------Observation(OID1)----------- // Observation onto new "OID1" +// <---------Observation(OID0)----------- +// -----ObservablesClosed(OID0, OID1)---> // Client indicates it stopped consuming the observables. +// <---------Observation(OID1)----------- // Observation was already in-flight before the previous message was processed +// (FIN) +// +// Note that multiple sessions like the above may interleave in an arbitrary fashion. +// +// Additionally the server may listen on client binding removals for cleanup using RPC_CLIENT_BINDING_REMOVALS. This +// requires the server to create a filter on the Artemis notification address using RPC_CLIENT_BINDING_REMOVAL_FILTER_EXPRESSION + /** - * The RPC protocol: - * - * The server consumes the queue "[RPC_SERVER_QUEUE_NAME]" and receives RPC requests ([ClientToServer.RpcRequest]) on it. - * When a client starts up it should create a queue for its inbound messages, this should be of the form - * "[RPC_CLIENT_QUEUE_NAME_PREFIX].$username.$nonce". Each RPC request contains this address (in - * [ClientToServer.RpcRequest.clientAddress]), this is where the server will send the reply to the request as well as - * subsequent Observations rooted in the RPC. The requests/replies are muxed using a unique [RpcRequestId] generated by - * the client for each request. - * - * If an RPC reply's payload ([ServerToClient.RpcReply.result]) contains [Observable]s then the server will generate a - * unique [ObservableId] for each and serialise them in place of the [Observable]s themselves. Subsequently the client - * should be prepared to receive observations ([ServerToClient.Observation]), muxed by the relevant [ObservableId]. - * In addition each observation itself may contain further [Observable]s, this case should behave the same as before. - * - * Additionally the client may send [ClientToServer.ObservablesClosed] messages indicating that certain observables - * aren't consumed anymore, which should subsequently stop the stream from the server. Note that some observations may - * already be in flight when this is sent, the client should handle this gracefully. - * - * An example session: - * Client Server - * ----------RpcRequest(RID0)-----------> // Client makes RPC request with ID "RID0" - * <----RpcReply(RID0, Payload(OID0))---- // Server sends reply containing an observable with ID "OID0" - * <---------Observation(OID0)----------- // Server sends observation onto "OID0" - * <---Observation(OID0, Payload(OID1))-- // Server sends another observation, this time containing another observable - * <---------Observation(OID1)----------- // Observation onto new "OID1" - * <---------Observation(OID0)----------- - * -----ObservablesClosed(OID0, OID1)---> // Client indicates it stopped consuming the Observables. - * <---------Observation(OID1)----------- // Observation was already in-flight before the previous message was processed - * (FIN) - * - * Note that multiple sessions like the above may interleave in an arbitrary fashion. - * - * Additionally the server may listen on client binding removals for cleanup using [RPC_CLIENT_BINDING_REMOVALS]. This - * requires the server to create a filter on the artemis notification address using [RPC_CLIENT_BINDING_REMOVAL_FILTER_EXPRESSION] + * Constants and data types used by the RPC API. */ object RPCApi { private val TAG_FIELD_NAME = "tag" @@ -62,10 +56,15 @@ object RPCApi { private val OBSERVABLE_ID_FIELD_NAME = "observable-id" private val METHOD_NAME_FIELD_NAME = "method-name" - val RPC_SERVER_QUEUE_NAME = "rpc.server" - val RPC_CLIENT_QUEUE_NAME_PREFIX = "rpc.client" - val RPC_CLIENT_BINDING_REMOVALS = "rpc.clientqueueremovals" - val RPC_CLIENT_BINDING_ADDITIONS = "rpc.clientqueueadditions" + /** Name of the Artemis queue on which the server receives RPC requests (as [ClientToServer.RpcRequest]). */ + const val RPC_SERVER_QUEUE_NAME = "rpc.server" + /** + * Prefix to Artemis queue names used by clients to receive communication back from a server. The full queue name + * should be of the form "rpc.client.<username>.<nonce>". + */ + const val RPC_CLIENT_QUEUE_NAME_PREFIX = "rpc.client" + const val RPC_CLIENT_BINDING_REMOVALS = "rpc.clientqueueremovals" + const val RPC_CLIENT_BINDING_ADDITIONS = "rpc.clientqueueadditions" val RPC_CLIENT_BINDING_REMOVAL_FILTER_EXPRESSION = "${ManagementHelper.HDR_NOTIFICATION_TYPE} = '${CoreNotificationType.BINDING_REMOVED.name}' AND " + @@ -83,12 +82,23 @@ object RPCApi { return ByteArray(bodySize).apply { bodyBuffer.readBytes(this) } } + /** + * Message content types which can be sent from a Corda client to a server. + */ sealed class ClientToServer { private enum class Tag { RPC_REQUEST, OBSERVABLES_CLOSED } + /** + * Request to a server to trigger the specified method with the provided arguments. + * + * @param clientAddress return address to contact the client at. + * @param id a unique ID for the request, which the server will use to identify its response with. + * @param methodName name of the method (procedure) to be called. + * @param arguments arguments to pass to the method, if any. + */ data class RpcRequest( val clientAddress: SimpleString, val id: RpcRequestId, @@ -141,6 +151,9 @@ object RPCApi { } } + /** + * Message content types which can be sent from a Corda server back to a client. + */ sealed class ServerToClient { private enum class Tag { RPC_REPLY, @@ -149,6 +162,7 @@ object RPCApi { abstract fun writeToClientMessage(context: SerializationContext, message: ClientMessage) + /** Reply in response to an [ClientToServer.RpcRequest]. */ data class RpcReply( val id: RpcRequestId, val result: Try diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/RPCStructures.kt b/node-api/src/main/kotlin/net/corda/nodeapi/RPCStructures.kt index d99f17dab7..3911943969 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/RPCStructures.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/RPCStructures.kt @@ -41,10 +41,17 @@ open class RPCException(message: String?, cause: Throwable?) : CordaRuntimeExcep constructor(msg: String) : this(msg, null) } +/** + * Thrown to indicate that the calling user does not have permission for something they have requested (for example + * calling a method). + */ @CordaSerializable class PermissionException(msg: String) : RuntimeException(msg) -// The Kryo used for the RPC wire protocol. Every type in the wire protocol is listed here explicitly. +/** + * The Kryo used for the RPC wire protocol. + */ +// Every type in the wire protocol is listed here explicitly. // This is annoying to write out, but will make it easier to formalise the wire protocol when the time comes, // because we can see everything we're using in one place. class RPCKryo(observableSerializer: Serializer>, serializationContext: SerializationContext) : CordaKryo(CordaClassResolver(serializationContext)) { From 7c9825eab146d85c1ee957502221a2b7108521ab Mon Sep 17 00:00:00 2001 From: mkit Date: Tue, 5 Sep 2017 07:47:22 +0100 Subject: [PATCH 076/120] Removing calls to the internal API - CordaFutureImpl (#1395) * Removing calls to the internal API - CordaFutureImpl * Addressing review comments * Addressing review comments --- .../attachmentdemo/AttachmentDemoTest.kt | 22 ++++---- .../net/corda/bank/BankOfCordaHttpAPITest.kt | 10 ++-- .../corda/bank/BankOfCordaRPCClientTest.kt | 10 ++-- .../kotlin/net/corda/irs/IRSDemoTest.kt | 22 ++++---- .../src/test/kotlin/net/corda/irs/Main.kt | 12 ++--- .../net/corda/netmap/NetworkMapVisualiser.kt | 2 +- .../corda/netmap/simulation/IRSSimulation.kt | 50 ++++++++++++------- .../net/corda/netmap/simulation/Simulation.kt | 17 +++---- .../kotlin/net/corda/notarydemo/Notarise.kt | 14 +++--- .../net/corda/vega/SimmValuationTest.kt | 14 +++--- .../net/corda/vega/analytics/OGUtils.kt | 8 +-- .../src/test/kotlin/net/corda/vega/Main.kt | 12 ++--- .../net/corda/traderdemo/TraderDemoTest.kt | 12 ++--- 13 files changed, 98 insertions(+), 107 deletions(-) diff --git a/samples/attachment-demo/src/integration-test/kotlin/net/corda/attachmentdemo/AttachmentDemoTest.kt b/samples/attachment-demo/src/integration-test/kotlin/net/corda/attachmentdemo/AttachmentDemoTest.kt index 34ce666450..347cb75c78 100644 --- a/samples/attachment-demo/src/integration-test/kotlin/net/corda/attachmentdemo/AttachmentDemoTest.kt +++ b/samples/attachment-demo/src/integration-test/kotlin/net/corda/attachmentdemo/AttachmentDemoTest.kt @@ -1,17 +1,16 @@ package net.corda.attachmentdemo import net.corda.core.node.services.ServiceInfo -import net.corda.core.internal.concurrent.transpose import net.corda.core.utilities.getOrThrow +import net.corda.node.services.FlowPermissions.Companion.startFlowPermission +import net.corda.node.services.transactions.SimpleNotaryService +import net.corda.nodeapi.User import net.corda.testing.DUMMY_BANK_A import net.corda.testing.DUMMY_BANK_B import net.corda.testing.DUMMY_NOTARY import net.corda.testing.driver.driver -import net.corda.node.services.FlowPermissions.Companion.startFlowPermission -import net.corda.node.services.transactions.SimpleNotaryService -import net.corda.nodeapi.User import org.junit.Test -import java.util.concurrent.CompletableFuture +import java.util.concurrent.CompletableFuture.supplyAsync class AttachmentDemoTest { // run with a 10,000,000 bytes in-memory zip file. In practice, a slightly bigger file will be used (~10,002,000 bytes). @@ -19,19 +18,18 @@ class AttachmentDemoTest { val numOfExpectedBytes = 10_000_000 driver(dsl = { val demoUser = listOf(User("demo", "demo", setOf(startFlowPermission()))) - val (nodeA, nodeB) = listOf( - startNode(providedName = DUMMY_BANK_A.name, rpcUsers = demoUser), - startNode(providedName = DUMMY_BANK_B.name, rpcUsers = demoUser), - startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) - ).transpose().getOrThrow() + val notaryFuture = startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) + val nodeAFuture = startNode(providedName = DUMMY_BANK_A.name, rpcUsers = demoUser) + val nodeBFuture = startNode(providedName = DUMMY_BANK_B.name, rpcUsers = demoUser) + val (nodeA, nodeB) = listOf(nodeAFuture, nodeBFuture, notaryFuture).map { it.getOrThrow() } - val senderThread = CompletableFuture.supplyAsync { + val senderThread = supplyAsync { nodeA.rpcClientToNode().start(demoUser[0].username, demoUser[0].password).use { sender(it.proxy, numOfExpectedBytes) } }.exceptionally { it.printStackTrace() } - val recipientThread = CompletableFuture.supplyAsync { + val recipientThread = supplyAsync { nodeB.rpcClientToNode().start(demoUser[0].username, demoUser[0].password).use { recipient(it.proxy) } diff --git a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaHttpAPITest.kt b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaHttpAPITest.kt index 394ed0bf7f..716587966d 100644 --- a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaHttpAPITest.kt +++ b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaHttpAPITest.kt @@ -3,11 +3,10 @@ package net.corda.bank import net.corda.bank.api.BankOfCordaClientApi import net.corda.bank.api.BankOfCordaWebApi.IssueRequestParams import net.corda.core.node.services.ServiceInfo -import net.corda.core.internal.concurrent.transpose import net.corda.core.utilities.getOrThrow -import net.corda.testing.driver.driver import net.corda.node.services.transactions.SimpleNotaryService import net.corda.testing.BOC +import net.corda.testing.driver.driver import org.junit.Test import kotlin.test.assertTrue @@ -15,10 +14,9 @@ class BankOfCordaHttpAPITest { @Test fun `issuer flow via Http`() { driver(dsl = { - val (nodeBankOfCorda) = listOf( - startNode(providedName = BOC.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))), - startNode(providedName = BIGCORP_LEGAL_NAME) - ).transpose().getOrThrow() + val bigCorpNodeFuture = startNode(providedName = BIGCORP_LEGAL_NAME) + val nodeBankOfCordaFuture = startNode(providedName = BOC.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) + val (nodeBankOfCorda) = listOf(nodeBankOfCordaFuture, bigCorpNodeFuture).map { it.getOrThrow() } val anonymous = false val nodeBankOfCordaApiAddr = startWebserver(nodeBankOfCorda).getOrThrow().listenAddress assertTrue(BankOfCordaClientApi(nodeBankOfCordaApiAddr).requestWebIssue(IssueRequestParams(1000, "USD", BIGCORP_LEGAL_NAME, "1", BOC.name, BOC.name, anonymous))) diff --git a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt index 31481cf3d4..4a4bfadacb 100644 --- a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt +++ b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt @@ -1,6 +1,5 @@ package net.corda.bank -import net.corda.core.internal.concurrent.transpose import net.corda.core.messaging.startFlow import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.Vault @@ -23,12 +22,9 @@ class BankOfCordaRPCClientTest { val bocManager = User("bocManager", "password1", permissions = setOf( startFlowPermission())) val bigCorpCFO = User("bigCorpCFO", "password2", permissions = emptySet()) - val (nodeBankOfCorda, nodeBigCorporation) = listOf( - startNode(providedName = BOC.name, - advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type)), - rpcUsers = listOf(bocManager)), - startNode(providedName = BIGCORP_LEGAL_NAME, rpcUsers = listOf(bigCorpCFO)) - ).transpose().getOrThrow() + val nodeBankOfCordaFuture = startNode(providedName = BOC.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type)), rpcUsers = listOf(bocManager)) + val nodeBigCorporationFuture = startNode(providedName = BIGCORP_LEGAL_NAME, rpcUsers = listOf(bigCorpCFO)) + val (nodeBankOfCorda, nodeBigCorporation) = listOf(nodeBankOfCordaFuture, nodeBigCorporationFuture).map { it.getOrThrow() } // Bank of Corda RPC Client val bocClient = nodeBankOfCorda.rpcClientToNode() diff --git a/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt b/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt index fbea2e1a83..a523e5f273 100644 --- a/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt +++ b/samples/irs-demo/src/integration-test/kotlin/net/corda/irs/IRSDemoTest.kt @@ -1,7 +1,6 @@ package net.corda.irs import net.corda.client.rpc.CordaRPCClient -import net.corda.core.internal.concurrent.transpose import net.corda.core.messaging.vaultTrackBy import net.corda.core.node.services.ServiceInfo import net.corda.core.toFuture @@ -44,19 +43,20 @@ class IRSDemoTest : IntegrationTestCategory { @Test fun `runs IRS demo`() { driver(useTestClock = true, isDebug = true) { - val (controller, nodeA, nodeB) = listOf( - startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type), ServiceInfo(NodeInterestRates.Oracle.type))), - startNode(providedName = DUMMY_BANK_A.name, rpcUsers = listOf(rpcUser)), - startNode(providedName = DUMMY_BANK_B.name) - ).transpose().getOrThrow() + val controllerFuture = startNode( + providedName = DUMMY_NOTARY.name, + advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type), ServiceInfo(NodeInterestRates.Oracle.type))) + val nodeAFuture = startNode(providedName = DUMMY_BANK_A.name, rpcUsers = listOf(rpcUser)) + val nodeBFuture = startNode(providedName = DUMMY_BANK_B.name) + val (controller, nodeA, nodeB) = listOf(controllerFuture, nodeAFuture, nodeBFuture).map { it.getOrThrow() } log.info("All nodes started") - val (controllerAddr, nodeAAddr, nodeBAddr) = listOf( - startWebserver(controller), - startWebserver(nodeA), - startWebserver(nodeB) - ).transpose().getOrThrow().map { it.listenAddress } + val controllerAddrFuture = startWebserver(controller) + val nodeAAddrFuture = startWebserver(nodeA) + val nodeBAddrFuture = startWebserver(nodeB) + val (controllerAddr, nodeAAddr, nodeBAddr) = + listOf(controllerAddrFuture, nodeAAddrFuture, nodeBAddrFuture).map { it.getOrThrow().listenAddress } log.info("All webservers started") diff --git a/samples/irs-demo/src/test/kotlin/net/corda/irs/Main.kt b/samples/irs-demo/src/test/kotlin/net/corda/irs/Main.kt index 4f9117ed44..4604da6b3e 100644 --- a/samples/irs-demo/src/test/kotlin/net/corda/irs/Main.kt +++ b/samples/irs-demo/src/test/kotlin/net/corda/irs/Main.kt @@ -1,6 +1,5 @@ package net.corda.irs -import net.corda.core.internal.concurrent.transpose import net.corda.core.node.services.ServiceInfo import net.corda.core.utilities.getOrThrow import net.corda.testing.DUMMY_BANK_A @@ -16,11 +15,12 @@ import net.corda.testing.driver.driver */ fun main(args: Array) { driver(dsl = { - val (controller, nodeA, nodeB) = listOf( - startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type), ServiceInfo(NodeInterestRates.Oracle.type))), - startNode(providedName = DUMMY_BANK_A.name), - startNode(providedName = DUMMY_BANK_B.name) - ).transpose().getOrThrow() + val controllerFuture = startNode( + providedName = DUMMY_NOTARY.name, + advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type), ServiceInfo(NodeInterestRates.Oracle.type))) + val nodeAFuture = startNode(providedName = DUMMY_BANK_A.name) + val nodeBFuture = startNode(providedName = DUMMY_BANK_B.name) + val (controller, nodeA, nodeB) = listOf(controllerFuture, nodeAFuture, nodeBFuture).map { it.getOrThrow() } startWebserver(controller) startWebserver(nodeA) diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt index 9836dd1a09..12f783851c 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt @@ -171,7 +171,7 @@ class NetworkMapVisualiser : Application() { onNextInvoked() } } - viewModel.simulation.networkInitialisationFinished.then { + viewModel.simulation.networkInitialisationFinished.thenAccept { view.simulateInitialisationCheckbox.isVisible = false } view.runPauseButton.setOnAction { diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt index 1e2a624d02..a09fa66682 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt @@ -3,14 +3,12 @@ package net.corda.netmap.simulation import co.paralleluniverse.fibers.Suspendable import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.readValue -import net.corda.core.concurrent.CordaFuture import net.corda.core.contracts.StateAndRef import net.corda.core.flows.FlowLogic import net.corda.core.flows.InitiatedBy import net.corda.core.flows.InitiatingFlow import net.corda.core.identity.Party import net.corda.core.internal.FlowStateMachine -import net.corda.core.internal.concurrent.* import net.corda.core.node.services.queryBy import net.corda.core.toFuture import net.corda.core.transactions.SignedTransaction @@ -28,6 +26,8 @@ import rx.Observable import java.security.PublicKey import java.time.LocalDate import java.util.* +import java.util.concurrent.CompletableFuture +import java.util.concurrent.CompletableFuture.allOf /** @@ -42,46 +42,58 @@ class IRSSimulation(networkSendManuallyPumped: Boolean, runAsync: Boolean, laten private val executeOnNextIteration = Collections.synchronizedList(LinkedList<() -> Unit>()) - override fun startMainSimulation(): CordaFuture { + override fun startMainSimulation(): CompletableFuture { // TODO: Determine why this isn't happening via the network map mockNet.nodes.map { it.services.identityService }.forEach { service -> - mockNet.nodes.forEach { node -> service.registerIdentity(node.info.legalIdentityAndCert) } + mockNet.nodes.forEach { node -> service.verifyAndRegisterIdentity(node.info.legalIdentityAndCert) } } - val future = openFuture() om = JacksonSupport.createInMemoryMapper(InMemoryIdentityService((banks + regulators + networkMap).map { it.info.legalIdentityAndCert }, trustRoot = DUMMY_CA.certificate)) registerFinanceJSONMappers(om) - startIRSDealBetween(0, 1).thenMatch({ + return startIRSDealBetween(0, 1).thenCompose { + val future = CompletableFuture() // Next iteration is a pause. executeOnNextIteration.add {} executeOnNextIteration.add { // Keep fixing until there's no more left to do. val initialFixFuture = doNextFixing(0, 1) fun onFailure(t: Throwable) { - future.setException(t) // Propagate the error. + future.completeExceptionally(t) } - fun onSuccess(result: Unit?) { + fun onSuccess() { // Pause for an iteration. executeOnNextIteration.add {} executeOnNextIteration.add { val f = doNextFixing(0, 1) if (f != null) { - f.thenMatch(::onSuccess, ::onFailure) + f.handle { _, throwable -> + if (throwable == null) { + onSuccess() + } else { + onFailure(throwable) + } + } } else { // All done! - future.set(Unit) + future.complete(Unit) } } } - initialFixFuture!!.thenMatch(::onSuccess, ::onFailure) + initialFixFuture!!.handle { _, throwable -> + if (throwable == null) { + onSuccess() + } else { + onFailure(throwable) + } + } } - }, {}) - return future + future + } } - private fun doNextFixing(i: Int, j: Int): CordaFuture? { + private fun doNextFixing(i: Int, j: Int): CompletableFuture? { println("Doing a fixing between $i and $j") val node1: SimulatedNode = banks[i] val node2: SimulatedNode = banks[j] @@ -107,10 +119,10 @@ class IRSSimulation(networkSendManuallyPumped: Boolean, runAsync: Boolean, laten if (nextFixingDate > currentDateAndTime.toLocalDate()) currentDateAndTime = nextFixingDate.atTime(15, 0) - return listOf(futA, futB).transpose().map { Unit } + return allOf(futA.toCompletableFuture(), futB.toCompletableFuture()) } - private fun startIRSDealBetween(i: Int, j: Int): CordaFuture { + private fun startIRSDealBetween(i: Int, j: Int): CompletableFuture { val node1: SimulatedNode = banks[i] val node2: SimulatedNode = banks[j] @@ -141,8 +153,8 @@ class IRSSimulation(networkSendManuallyPumped: Boolean, runAsync: Boolean, laten val acceptDealFlows: Observable = node2.registerInitiatedFlow(AcceptDealFlow::class.java) @Suppress("UNCHECKED_CAST") - val acceptorTxFuture = acceptDealFlows.toFuture().flatMap { - (it.stateMachine as FlowStateMachine).resultFuture + val acceptorTxFuture = acceptDealFlows.toFuture().toCompletableFuture().thenCompose { + (it.stateMachine as FlowStateMachine).resultFuture.toCompletableFuture() } showProgressFor(listOf(node1, node2)) @@ -154,7 +166,7 @@ class IRSSimulation(networkSendManuallyPumped: Boolean, runAsync: Boolean, laten node1.services.legalIdentityKey) val instigatorTxFuture = node1.services.startFlow(instigator).resultFuture - return listOf(instigatorTxFuture, acceptorTxFuture).transpose().flatMap { instigatorTxFuture } + return allOf(instigatorTxFuture.toCompletableFuture(), acceptorTxFuture).thenCompose { instigatorTxFuture.toCompletableFuture() } } override fun iterate(): InMemoryMessagingNetwork.MessageTransfer? { diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt index e5e635dc93..9a8bae5d4d 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt @@ -1,6 +1,5 @@ package net.corda.netmap.simulation -import net.corda.core.concurrent.CordaFuture import net.corda.core.utilities.locationOrNull import net.corda.core.flows.FlowLogic import net.corda.core.messaging.SingleMessageRecipient @@ -8,9 +7,6 @@ import net.corda.core.node.CityDatabase import net.corda.core.node.WorldMapLocation import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.containsType -import net.corda.core.internal.concurrent.doneFuture -import net.corda.core.internal.concurrent.flatMap -import net.corda.core.internal.concurrent.transpose import net.corda.testing.DUMMY_MAP import net.corda.testing.DUMMY_NOTARY import net.corda.testing.DUMMY_REGULATOR @@ -34,6 +30,9 @@ import java.time.LocalDate import java.time.LocalDateTime import java.time.ZoneOffset import java.util.* +import java.util.concurrent.CompletableFuture +import java.util.concurrent.CompletableFuture.allOf +import java.util.concurrent.Future /** * Base class for network simulations that are based on the unit test / mock environment. @@ -261,21 +260,19 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean, } } - val networkInitialisationFinished = mockNet.nodes.map { it.nodeReadyFuture }.transpose() + val networkInitialisationFinished = allOf(*mockNet.nodes.map { it.nodeReadyFuture.toCompletableFuture() }.toTypedArray()) - fun start(): CordaFuture { + fun start(): Future { mockNet.startNodes() // Wait for all the nodes to have finished registering with the network map service. - return networkInitialisationFinished.flatMap { startMainSimulation() } + return networkInitialisationFinished.thenCompose { startMainSimulation() } } /** * Sub-classes should override this to trigger whatever they want to simulate. This method will be invoked once the * network bringup has been simulated. */ - protected open fun startMainSimulation(): CordaFuture { - return doneFuture(Unit) - } + protected abstract fun startMainSimulation(): CompletableFuture fun stop() { mockNet.stopNodes() diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/Notarise.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/Notarise.kt index d648ce6d71..cd8485ce57 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/Notarise.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/Notarise.kt @@ -1,19 +1,16 @@ package net.corda.notarydemo import net.corda.client.rpc.CordaRPCClient -import net.corda.client.rpc.notUsed -import net.corda.core.concurrent.CordaFuture import net.corda.core.crypto.toStringShort import net.corda.core.messaging.CordaRPCOps import net.corda.core.messaging.startFlow import net.corda.core.transactions.SignedTransaction -import net.corda.core.internal.concurrent.map -import net.corda.core.internal.concurrent.transpose import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.getOrThrow import net.corda.notarydemo.flows.DummyIssueAndMove import net.corda.notarydemo.flows.RPCStartableNotaryFlowClient import net.corda.testing.BOB +import java.util.concurrent.Future import kotlin.streams.asSequence fun main(args: Array) { @@ -53,9 +50,10 @@ private class NotaryDemoClientApi(val rpc: CordaRPCOps) { * as it consumes the original asset and creates a copy with the new owner as its output. */ private fun buildTransactions(count: Int): List { - return (1..count).map { + val flowFutures = (1..count).map { rpc.startFlow(::DummyIssueAndMove, notary, counterpartyNode.legalIdentity, it).returnValue - }.transpose().getOrThrow() + } + return flowFutures.map { it.getOrThrow() } } /** @@ -64,9 +62,9 @@ private class NotaryDemoClientApi(val rpc: CordaRPCOps) { * * @return a list of encoded signer public keys - one for every transaction */ - private fun notariseTransactions(transactions: List): List>> { + private fun notariseTransactions(transactions: List): List>> { return transactions.map { - rpc.startFlow(::RPCStartableNotaryFlowClient, it).returnValue.map { it.map { it.by.toStringShort() } } + rpc.startFlow(::RPCStartableNotaryFlowClient, it).returnValue.toCompletableFuture().thenApply { it.map { it.by.toStringShort() } } } } } diff --git a/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt b/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt index ed78ffd6aa..444e1aa7a8 100644 --- a/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt +++ b/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt @@ -2,7 +2,6 @@ package net.corda.vega import com.opengamma.strata.product.common.BuySell import net.corda.core.node.services.ServiceInfo -import net.corda.core.internal.concurrent.transpose import net.corda.core.utilities.getOrThrow import net.corda.testing.DUMMY_BANK_A import net.corda.testing.DUMMY_BANK_B @@ -34,10 +33,13 @@ class SimmValuationTest : IntegrationTestCategory { fun `runs SIMM valuation demo`() { driver(isDebug = true) { startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))).getOrThrow() - val (nodeA, nodeB) = listOf(startNode(providedName = nodeALegalName), startNode(providedName = nodeBLegalName)).transpose().getOrThrow() - val (nodeAApi, nodeBApi) = listOf(startWebserver(nodeA), startWebserver(nodeB)).transpose() - .getOrThrow() - .map { HttpApi.fromHostAndPort(it.listenAddress, "api/simmvaluationdemo") } + val nodeAFuture = startNode(providedName = nodeALegalName) + val nodeBFuture = startNode(providedName = nodeBLegalName) + val (nodeA, nodeB) = listOf(nodeAFuture, nodeBFuture).map { it.getOrThrow() } + val nodeAWebServerFuture = startWebserver(nodeA) + val nodeBWebServerFuture = startWebserver(nodeB) + val nodeAApi = HttpApi.fromHostAndPort(nodeAWebServerFuture.getOrThrow().listenAddress, "api/simmvaluationdemo") + val nodeBApi = HttpApi.fromHostAndPort(nodeBWebServerFuture.getOrThrow().listenAddress, "api/simmvaluationdemo") val nodeBParty = getPartyWithName(nodeAApi, nodeBLegalName) val nodeAParty = getPartyWithName(nodeBApi, nodeALegalName) @@ -55,7 +57,7 @@ class SimmValuationTest : IntegrationTestCategory { } private fun getAvailablePartiesFor(partyApi: HttpApi): PortfolioApi.AvailableParties { - return partyApi.getJson("whoami") + return partyApi.getJson("whoami") } private fun createTradeBetween(partyApi: HttpApi, counterparty: PortfolioApi.ApiParty, tradeId: String): Boolean { diff --git a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/analytics/OGUtils.kt b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/analytics/OGUtils.kt index ff48322f55..65c28f48d5 100644 --- a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/analytics/OGUtils.kt +++ b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/analytics/OGUtils.kt @@ -1,13 +1,7 @@ package net.corda.vega.analytics fun compareIMTriples(a: InitialMarginTriple, b: InitialMarginTriple): Boolean { - if (a.first is Double && a.second is Double && a.third is Double && - b.first is Double && b.second is Double && b.third is Double) { - if (withinTolerance(a.first, b.first) && withinTolerance(a.second, b.second) && withinTolerance(a.third, b.third)) { - return true - } - } - return false + return withinTolerance(a.first, b.first) && withinTolerance(a.second, b.second) && withinTolerance(a.third, b.third) } // TODO: Do this correctly diff --git a/samples/simm-valuation-demo/src/test/kotlin/net/corda/vega/Main.kt b/samples/simm-valuation-demo/src/test/kotlin/net/corda/vega/Main.kt index 81b13ae98c..c31048985d 100644 --- a/samples/simm-valuation-demo/src/test/kotlin/net/corda/vega/Main.kt +++ b/samples/simm-valuation-demo/src/test/kotlin/net/corda/vega/Main.kt @@ -1,6 +1,5 @@ package net.corda.vega -import net.corda.core.internal.concurrent.transpose import net.corda.core.node.services.ServiceInfo import net.corda.core.utilities.getOrThrow import net.corda.testing.DUMMY_BANK_A @@ -17,12 +16,11 @@ import net.corda.testing.driver.driver */ fun main(args: Array) { driver(dsl = { - startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) - val (nodeA, nodeB, nodeC) = listOf( - startNode(providedName = DUMMY_BANK_A.name), - startNode(providedName = DUMMY_BANK_B.name), - startNode(providedName = DUMMY_BANK_C.name) - ).transpose().getOrThrow() + val notaryFuture = startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) + val nodeAFuture = startNode(providedName = DUMMY_BANK_A.name) + val nodeBFuture = startNode(providedName = DUMMY_BANK_B.name) + val nodeCFuture = startNode(providedName = DUMMY_BANK_C.name) + val (nodeA, nodeB, nodeC) = listOf(nodeAFuture, nodeBFuture, nodeCFuture, notaryFuture).map { it.getOrThrow() } startWebserver(nodeA) startWebserver(nodeB) diff --git a/samples/trader-demo/src/integration-test/kotlin/net/corda/traderdemo/TraderDemoTest.kt b/samples/trader-demo/src/integration-test/kotlin/net/corda/traderdemo/TraderDemoTest.kt index 7db63b4f77..778554688b 100644 --- a/samples/trader-demo/src/integration-test/kotlin/net/corda/traderdemo/TraderDemoTest.kt +++ b/samples/trader-demo/src/integration-test/kotlin/net/corda/traderdemo/TraderDemoTest.kt @@ -1,7 +1,6 @@ package net.corda.traderdemo import net.corda.client.rpc.CordaRPCClient -import net.corda.core.internal.concurrent.transpose import net.corda.core.node.services.ServiceInfo import net.corda.core.utilities.getOrThrow import net.corda.core.utilities.millis @@ -32,12 +31,11 @@ class TraderDemoTest : NodeBasedTest() { startFlowPermission(), startFlowPermission(), startFlowPermission())) - val (nodeA, nodeB, bankNode) = listOf( - startNode(DUMMY_BANK_A.name, rpcUsers = listOf(demoUser)), - startNode(DUMMY_BANK_B.name, rpcUsers = listOf(demoUser)), - startNode(BOC.name, rpcUsers = listOf(bankUser)), - startNode(DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) - ).transpose().getOrThrow() + val notaryFuture = startNode(DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))) + val nodeAFuture = startNode(DUMMY_BANK_A.name, rpcUsers = listOf(demoUser)) + val nodeBFuture = startNode(DUMMY_BANK_B.name, rpcUsers = listOf(demoUser)) + val bankNodeFuture = startNode(BOC.name, rpcUsers = listOf(bankUser)) + val (nodeA, nodeB, bankNode) = listOf(nodeAFuture, nodeBFuture, bankNodeFuture, notaryFuture).map { it.getOrThrow() } nodeA.registerInitiatedFlow(BuyerFlow::class.java) From 30687592c219ad65111c80a60b905923b816530b Mon Sep 17 00:00:00 2001 From: mkit Date: Tue, 5 Sep 2017 07:47:35 +0100 Subject: [PATCH 077/120] Making Quasar Jar to be copied from dependencies after the gradle build (#1388) * Making Quasar Jar to be copied from dependencies after the gradle build * Addressing review comments --- core/build.gradle | 9 +++++++++ lib/quasar.jar | Bin 1242165 -> 0 bytes 2 files changed, 9 insertions(+) delete mode 100644 lib/quasar.jar diff --git a/core/build.gradle b/core/build.gradle index d18595dbba..4594b9233b 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -68,6 +68,15 @@ dependencies { compile "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final" } +// TODO Consider moving it to quasar-utils in the future (introduced with PR-1388) +task copyQuasarJar(type: Copy) { + from configurations.quasar + into "$project.rootProject.projectDir/lib" + rename { filename -> "quasar.jar"} +} + +jar.finalizedBy(copyQuasarJar) + configurations { testArtifacts.extendsFrom testRuntime } diff --git a/lib/quasar.jar b/lib/quasar.jar deleted file mode 100644 index 286f065e430c8c5b64c929b6e797187ffb007021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1242165 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%0AKWwevt^%w&IIj$T|Bmx3-IPSE$6ZS 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≦q%_R6BZf7|Ta) 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

`vob%2V0DZU?MAzdto!jzI?W zyjYLNr2qyLas<4WNEF>DC9bC%UOdh>LFXcWIYTZsEJe2zN?_b?%4aGBU@l8eic0pI z$&!m2aWS+6DwCk~enpn1g8|oyQChHTkYZ6L%{Y>8a3c?MR@aH3u!1_^VXCiV4_j6n zSXjYZ*-%i!MIxA0JuB!`KLt@&+5(D3W`*A&XVFMQo{pfPDIP-FVU3oRA6NC zpY-Iu8i-;FK@r6)RKzP%tkGk>G%Fa(Bs4S#MG6vo4w0KMs?25_H&dT0eM~l{>=ZR@2mPQB zrkKP9*{6NYluE_+LtX^HHs*_)XK0Ii&9|)ruZ~EzEyf9(#lb(vDJ8Pw>=bysH3W-Q ze65uATImQ*FxHm9KB?warIr%Y(t`JKZTzUel8Fv6UB@=Y;xP7XSLg8Kr&pt& z$~{L~v+JR>khIg0!(#pR0LJ#j7Q|6#E{F=CJEARIaB7cz>5x)l3v~q3vqJqmK3R#K zE9g_`pki@h@8zn}l zHNG^>f)ty(oevM3vwtr0bj^w8i3Cv|%c&iZAiVnzoYqw1KCSLzn*mtym%C<&@3xY9}(s{Z~D4DS;ue{UaFwVy#p$$lLyiXdC*`YX@#juYH{LWLou|3uGD;f z(fWiPm8!gGU(w|Ei#m;OKEO8-Y-C<}*57D}JE+3?w3&K%h2dW`8h zD46nK^`AryfZ34A-ij=5=g;!iH&@;jxHx`-?-C`l&Zpsr^g?cSoXg8`s-W8cvjie_ zK3uZqN6Je6TTG4o|Ir_d|BS|}+WgEKkbP}4(@Z4@ip?QlATbH3WfmaIn_orinb8R` zHErfF(xzHHHz<8J*

W2@^RT^^>IhbPf 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

~at($bM`4zY3 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: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 VODv+_>iE{her4>uGpgWE{|6~-Q5*mO From ead4d0901182c1b75df66acdb14592f5abe424ac Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Tue, 5 Sep 2017 08:35:26 +0100 Subject: [PATCH 078/120] Plumb in plugin whitelist additions to AMQP implementation. (#1415) --- .../serialization/AMQPSerializationScheme.kt | 25 ++++++++++++++++--- .../serialization/DefaultWhitelist.kt | 3 ++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt index 965755d253..21566a0b88 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt @@ -1,20 +1,35 @@ package net.corda.nodeapi.internal.serialization -import net.corda.core.serialization.ClassWhitelist -import net.corda.core.serialization.SerializationContext -import net.corda.core.serialization.SerializationDefaults -import net.corda.core.serialization.SerializedBytes +import net.corda.core.node.CordaPluginRegistry +import net.corda.core.serialization.* import net.corda.core.utilities.ByteSequence import net.corda.nodeapi.internal.serialization.amqp.AmqpHeaderV1_0 import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput import net.corda.nodeapi.internal.serialization.amqp.SerializationOutput import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import java.util.* import java.util.concurrent.ConcurrentHashMap val AMQP_ENABLED get() = SerializationDefaults.P2P_CONTEXT.preferredSerializationVersion == AmqpHeaderV1_0 +class AMQPSerializationCustomization(val factory: SerializerFactory) : SerializationCustomization { + override fun addToWhitelist(vararg types: Class<*>) { + factory.addToWhitelist(*types) + } +} + +fun SerializerFactory.addToWhitelist(vararg types: Class<*>) { + for (type in types) { + (this.whitelist as? MutableClassWhitelist)?.add(type) + } +} + abstract class AbstractAMQPSerializationScheme : SerializationScheme { internal companion object { + private val pluginRegistries: List by lazy { + ServiceLoader.load(CordaPluginRegistry::class.java, this.javaClass.classLoader).toList() + } + fun registerCustomSerializers(factory: SerializerFactory) { factory.apply { register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) @@ -40,6 +55,8 @@ abstract class AbstractAMQPSerializationScheme : SerializationScheme { register(net.corda.nodeapi.internal.serialization.amqp.custom.X509CertificateHolderSerializer) register(net.corda.nodeapi.internal.serialization.amqp.custom.PartyAndCertificateSerializer(factory)) } + val customizer = AMQPSerializationCustomization(factory) + pluginRegistries.forEach { it.customizeSerialization(customizer) } } } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt index d44c063c43..f2e3f3835e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt @@ -64,7 +64,8 @@ class DefaultWhitelist : CordaPluginRegistry() { LocalDate::class.java, Period::class.java, BitSet::class.java, - OnErrorNotImplementedException::class.java) + OnErrorNotImplementedException::class.java, + StackTraceElement::class.java) } return true } From 15f741f315e18067aae6522a2a22db932afa3438 Mon Sep 17 00:00:00 2001 From: Andrzej Cichocki Date: Tue, 5 Sep 2017 09:50:51 +0100 Subject: [PATCH 079/120] Spinoff driver into own project with demorun (#1401) --- .idea/compiler.xml | 7 +- build.gradle | 4 +- client/jfx/build.gradle | 1 + client/rpc/build.gradle | 2 +- core/build.gradle | 2 +- docs/source/example-code/build.gradle | 2 +- experimental/build.gradle | 2 +- .../contracts/asset/CashTestsJava.java | 1 + samples/attachment-demo/build.gradle | 2 +- samples/bank-of-corda-demo/build.gradle | 2 +- samples/irs-demo/build.gradle | 2 +- samples/network-visualiser/build.gradle | 2 +- samples/notary-demo/build.gradle | 3 +- samples/simm-valuation-demo/build.gradle | 2 +- settings.gradle | 2 + test-utils/build.gradle | 25 ------- .../kotlin/net/corda/testing/CoreTestUtils.kt | 70 +----------------- .../kotlin/net/corda/testing/TestConstants.kt | 54 -------------- .../testing/node/MockAttachmentStorage.kt | 41 +++++++++++ testing/node-driver/build.gradle | 49 +++++++++++++ .../corda/testing/FlowStackSnapshotTest.kt | 0 .../net/corda/testing/driver/DriverTests.kt | 0 .../kotlin/net/corda/demorun/DemoRunner.kt | 0 .../net/corda/demorun/util/DemoUtils.kt | 0 .../node/testing/MockServiceHubInternal.kt | 0 .../net/corda/testing/DriverConstants.kt | 59 +++++++++++++++ .../kotlin/net/corda/testing/NodeTestUtils.kt | 73 +++++++++++++++++++ .../kotlin/net/corda/testing/RPCDriver.kt | 0 .../kotlin/net/corda/testing/driver/Driver.kt | 0 .../testing/driver/NetworkMapStartStrategy.kt | 0 .../corda/testing/driver/ProcessUtilities.kt | 0 .../net/corda/testing/node/DriverBasedTest.kt | 0 .../testing/node/InMemoryMessagingNetwork.kt | 0 .../corda/testing/node/MockNetworkMapCache.kt | 0 .../kotlin/net/corda/testing/node/MockNode.kt | 0 .../net/corda/testing/node/MockServices.kt | 34 --------- .../net/corda/testing/node/NodeBasedTest.kt | 0 .../net/corda/testing/node/SimpleNode.kt | 0 .../net/corda/testing/node/TestClock.kt | 0 .../corda/testing/performance/Injectors.kt | 0 .../net/corda/testing/performance/Reporter.kt | 0 tools/explorer/build.gradle | 2 +- tools/loadtest/build.gradle | 2 +- verifier/build.gradle | 2 +- webserver/build.gradle | 2 +- 45 files changed, 251 insertions(+), 198 deletions(-) create mode 100644 test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt create mode 100644 testing/node-driver/build.gradle rename {test-utils => testing/node-driver}/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt (100%) rename {test-utils => testing/node-driver}/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt (100%) rename {samples/notary-demo => testing/node-driver}/src/main/kotlin/net/corda/demorun/DemoRunner.kt (100%) rename {samples/notary-demo => testing/node-driver}/src/main/kotlin/net/corda/demorun/util/DemoUtils.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt (100%) create mode 100644 testing/node-driver/src/main/kotlin/net/corda/testing/DriverConstants.kt create mode 100644 testing/node-driver/src/main/kotlin/net/corda/testing/NodeTestUtils.kt rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/RPCDriver.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/driver/Driver.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/driver/NetworkMapStartStrategy.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/driver/ProcessUtilities.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/node/DriverBasedTest.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/node/MockNode.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/node/MockServices.kt (91%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/node/SimpleNode.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/node/TestClock.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/performance/Injectors.kt (100%) rename {test-utils => testing/node-driver}/src/main/kotlin/net/corda/testing/performance/Reporter.kt (100%) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index fa9e72cfc4..7ca71b5aa7 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -28,6 +28,9 @@ + + + @@ -83,9 +86,11 @@ - + + + diff --git a/build.gradle b/build.gradle index 5fd2cd863e..ba78f59ae8 100644 --- a/build.gradle +++ b/build.gradle @@ -251,7 +251,7 @@ bintrayConfig { projectUrl = 'https://github.com/corda/corda' gpgSign = true gpgPassphrase = System.getenv('CORDA_BINTRAY_GPG_PASSPHRASE') - publications = ['corda-jfx', 'corda-mock', 'corda-rpc', 'corda-core', 'corda', 'corda-finance', 'corda-node', 'corda-node-api', 'corda-test-common', 'corda-test-utils', 'corda-jackson', 'corda-verifier', 'corda-webserver-impl', 'corda-webserver'] + publications = ['corda-jfx', 'corda-mock', 'corda-rpc', 'corda-core', 'corda', 'corda-finance', 'corda-node', 'corda-node-api', 'corda-test-common', 'corda-test-utils', 'corda-jackson', 'corda-verifier', 'corda-webserver-impl', 'corda-webserver', 'corda-node-driver'] license { name = 'Apache-2.0' url = 'https://www.apache.org/licenses/LICENSE-2.0' @@ -286,7 +286,7 @@ artifactory { password = System.getenv('CORDA_ARTIFACTORY_PASSWORD') } defaults { - publications('corda-jfx', 'corda-mock', 'corda-rpc', 'corda-core', 'corda', 'cordform-common', 'corda-finance', 'corda-node', 'corda-node-api', 'corda-test-common', 'corda-test-utils', 'corda-jackson', 'corda-verifier', 'corda-webserver-impl', 'corda-webserver') + publications('corda-jfx', 'corda-mock', 'corda-rpc', 'corda-core', 'corda', 'cordform-common', 'corda-finance', 'corda-node', 'corda-node-api', 'corda-test-common', 'corda-test-utils', 'corda-jackson', 'corda-verifier', 'corda-webserver-impl', 'corda-webserver', 'corda-node-driver') } } } diff --git a/client/jfx/build.gradle b/client/jfx/build.gradle index 8b8c677e4b..ef9602e810 100644 --- a/client/jfx/build.gradle +++ b/client/jfx/build.gradle @@ -50,6 +50,7 @@ dependencies { // Integration test helpers integrationTestCompile "junit:junit:$junit_version" + integrationTestCompile project(':node-driver') } task integrationTest(type: Test) { diff --git a/client/rpc/build.gradle b/client/rpc/build.gradle index 70ebc5ed57..2b3c020f49 100644 --- a/client/rpc/build.gradle +++ b/client/rpc/build.gradle @@ -67,7 +67,7 @@ dependencies { testCompile "junit:junit:$junit_version" testCompile "org.assertj:assertj-core:${assertj_version}" - testCompile project(':test-utils') + testCompile project(':node-driver') testCompile project(':client:mock') // Smoke tests do NOT have any Node code on the classpath! diff --git a/core/build.gradle b/core/build.gradle index 4594b9233b..655067d680 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -22,7 +22,7 @@ dependencies { // Bring in the MockNode infrastructure for writing protocol unit tests. testCompile project(":node") - testCompile project(":test-utils") + testCompile project(":node-driver") compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" diff --git a/docs/source/example-code/build.gradle b/docs/source/example-code/build.gradle index 7b5ee5b8dd..e5e7a5a008 100644 --- a/docs/source/example-code/build.gradle +++ b/docs/source/example-code/build.gradle @@ -32,7 +32,7 @@ compileTestJava.dependsOn tasks.getByPath(':node:capsule:buildCordaJAR') dependencies { cordaCompile project(':core') cordaCompile project(':client:jfx') - cordaCompile project(':test-utils') + cordaCompile project(':node-driver') testCompile project(':verifier') compile "org.graphstream:gs-core:1.3" diff --git a/experimental/build.gradle b/experimental/build.gradle index 2c9257d2d6..c5a39773ee 100644 --- a/experimental/build.gradle +++ b/experimental/build.gradle @@ -29,5 +29,5 @@ dependencies { compile "com.google.guava:guava:$guava_version" testCompile "junit:junit:$junit_version" - testCompile project(':test-utils') + testCompile project(':node-driver') } diff --git a/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java b/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java index 9ae136d9dd..fabf51ef34 100644 --- a/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java +++ b/finance/src/test/java/net/corda/finance/contracts/asset/CashTestsJava.java @@ -9,6 +9,7 @@ import org.junit.Test; import static net.corda.finance.CurrencyUtils.DOLLARS; import static net.corda.finance.CurrencyUtils.issuedBy; import static net.corda.testing.CoreTestUtils.*; +import static net.corda.testing.NodeTestUtils.*; /** * This is an incomplete Java replica of CashTests.kt to show how to use the Java test DSL diff --git a/samples/attachment-demo/build.gradle b/samples/attachment-demo/build.gradle index 050eb95246..f5e436df20 100644 --- a/samples/attachment-demo/build.gradle +++ b/samples/attachment-demo/build.gradle @@ -30,7 +30,7 @@ dependencies { cordaCompile project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') cordaCompile project(':core') cordaCompile project(':webserver') - cordaCompile project(':test-utils') + cordaCompile project(':node-driver') } task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { diff --git a/samples/bank-of-corda-demo/build.gradle b/samples/bank-of-corda-demo/build.gradle index f1485103f6..22bdb29b35 100644 --- a/samples/bank-of-corda-demo/build.gradle +++ b/samples/bank-of-corda-demo/build.gradle @@ -34,7 +34,7 @@ dependencies { cordaCompile project(':client:jfx') cordaCompile project(':client:rpc') cordaCompile project(':webserver') - cordaCompile project(':test-utils') + cordaCompile project(':node-driver') // Javax is required for webapis compile "org.glassfish.jersey.core:jersey-server:${jersey_version}" diff --git a/samples/irs-demo/build.gradle b/samples/irs-demo/build.gradle index e9f572b106..66f894dd1a 100644 --- a/samples/irs-demo/build.gradle +++ b/samples/irs-demo/build.gradle @@ -43,7 +43,7 @@ dependencies { // Specify your cordapp's dependencies below, including dependent cordapps compile "com.squareup.okhttp3:okhttp:$okhttp_version" - testCompile project(':test-utils') + testCompile project(':node-driver') testCompile "junit:junit:$junit_version" testCompile "org.assertj:assertj-core:${assertj_version}" } diff --git a/samples/network-visualiser/build.gradle b/samples/network-visualiser/build.gradle index d925345afe..d472b1e5b3 100644 --- a/samples/network-visualiser/build.gradle +++ b/samples/network-visualiser/build.gradle @@ -7,7 +7,7 @@ apply plugin: 'us.kirchmeier.capsule' dependencies { compile project(':samples:irs-demo') - compile project(':test-utils') + compile project(':node-driver') compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" testCompile "junit:junit:$junit_version" diff --git a/samples/notary-demo/build.gradle b/samples/notary-demo/build.gradle index d6b9266937..b2d3f3e341 100644 --- a/samples/notary-demo/build.gradle +++ b/samples/notary-demo/build.gradle @@ -23,8 +23,7 @@ dependencies { cordaCompile project(':core') cordaCompile project(':client:jfx') cordaCompile project(':client:rpc') - cordaCompile project(':test-utils') - cordaCompile project(':cordform-common') + cordaCompile project(':node-driver') } idea { diff --git a/samples/simm-valuation-demo/build.gradle b/samples/simm-valuation-demo/build.gradle index 7c39385cb5..7b4a941edc 100644 --- a/samples/simm-valuation-demo/build.gradle +++ b/samples/simm-valuation-demo/build.gradle @@ -56,7 +56,7 @@ dependencies { compile "com.opengamma.strata:strata-math:${strata_version}" // Test dependencies - testCompile project(':test-utils') + testCompile project(':node-driver') testCompile "junit:junit:$junit_version" testCompile "org.assertj:assertj-core:${assertj_version}" } diff --git a/settings.gradle b/settings.gradle index e61b68e83e..8c4324969c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -21,6 +21,8 @@ include 'verifier' include 'test-common' include 'test-utils' include 'smoke-test-utils' +include 'node-driver' +project(':node-driver').projectDir = new File("$settingsDir/testing/node-driver") include 'tools:explorer' include 'tools:explorer:capsule' include 'tools:demobench' diff --git a/test-utils/build.gradle b/test-utils/build.gradle index e67533db44..350a94d766 100644 --- a/test-utils/build.gradle +++ b/test-utils/build.gradle @@ -10,22 +10,6 @@ description 'Testing utilities for Corda' configurations { // we don't want isolated.jar in classPath, since we want to test jar being dynamically loaded as an attachment runtime.exclude module: 'isolated' - - integrationTestCompile.extendsFrom testCompile - integrationTestRuntime.extendsFrom testRuntime -} - -sourceSets { - integrationTest { - kotlin { - compileClasspath += main.output + test.output - runtimeClasspath += main.output + test.output - srcDir file('src/integration-test/kotlin') - } - resources { - srcDir file('src/integration-test/resources') - } - } } dependencies { @@ -49,15 +33,6 @@ dependencies { // OkHTTP: Simple HTTP library. compile "com.squareup.okhttp3:okhttp:$okhttp_version" - - // Integration test helpers - integrationTestCompile "org.assertj:assertj-core:${assertj_version}" - integrationTestCompile "junit:junit:$junit_version" -} - -task integrationTest(type: Test) { - testClassesDirs = sourceSets.integrationTest.output.classesDirs - classpath = sourceSets.integrationTest.runtimeClasspath } jar { diff --git a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt index 9ebc941fad..87eb8dd992 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt @@ -3,34 +3,26 @@ package net.corda.testing -import com.nhaarman.mockito_kotlin.spy -import com.nhaarman.mockito_kotlin.whenever import net.corda.core.contracts.StateRef import net.corda.core.crypto.* import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate -import net.corda.core.node.ServiceHub import net.corda.core.node.services.IdentityService -import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.* +import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.OpaqueBytes +import net.corda.core.utilities.loggerFor import net.corda.finance.contracts.asset.DUMMY_CASH_ISSUER -import net.corda.node.services.config.NodeConfiguration -import net.corda.node.services.config.VerifierType import net.corda.node.services.config.configureDevKeyAndTrustStores import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.utilities.CertificateType import net.corda.node.utilities.X509Utilities import net.corda.nodeapi.config.SSLConfiguration import net.corda.nodeapi.internal.serialization.AMQP_ENABLED -import net.corda.testing.node.MockServices -import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties -import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties import org.bouncycastle.asn1.x500.X500Name import org.bouncycastle.asn1.x500.X500NameBuilder import org.bouncycastle.asn1.x500.style.BCStyle -import java.net.URL import java.nio.file.Files -import java.nio.file.Path import java.security.KeyPair import java.security.PublicKey import java.security.cert.CertificateFactory @@ -126,62 +118,6 @@ fun getFreeLocalPorts(hostName: String, numberToAlloc: Int): List.() -> Unit -): LedgerDSL { - if (initialiseSerialization) initialiseTestSerialization() - try { - val ledgerDsl = LedgerDSL(TestLedgerDSLInterpreter(services)) - dsl(ledgerDsl) - return ledgerDsl - } finally { - if (initialiseSerialization) resetTestSerialization() - } -} - -/** - * Creates a ledger with a single transaction, built by the passed in dsl. - * - * @see LedgerDSLInterpreter._transaction - */ -@JvmOverloads fun transaction( - transactionLabel: String? = null, - transactionBuilder: TransactionBuilder = TransactionBuilder(notary = DUMMY_NOTARY), - initialiseSerialization: Boolean = true, - dsl: TransactionDSL.() -> EnforceVerifyOrFail -) = ledger(initialiseSerialization = initialiseSerialization) { - dsl(TransactionDSL(TestTransactionDSLInterpreter(this.interpreter, transactionBuilder))) -} - -fun testNodeConfiguration( - baseDirectory: Path, - myLegalName: X500Name): NodeConfiguration { - abstract class MockableNodeConfiguration : NodeConfiguration // Otherwise Mockito is defeated by val getters. - val nc = spy() - whenever(nc.baseDirectory).thenReturn(baseDirectory) - whenever(nc.myLegalName).thenReturn(myLegalName) - whenever(nc.minimumPlatformVersion).thenReturn(1) - whenever(nc.keyStorePassword).thenReturn("cordacadevpass") - whenever(nc.trustStorePassword).thenReturn("trustpass") - whenever(nc.rpcUsers).thenReturn(emptyList()) - whenever(nc.dataSourceProperties).thenReturn(makeTestDataSourceProperties(myLegalName.commonName)) - whenever(nc.database).thenReturn(makeTestDatabaseProperties()) - whenever(nc.emailAddress).thenReturn("") - whenever(nc.exportJMXto).thenReturn("") - whenever(nc.devMode).thenReturn(true) - whenever(nc.certificateSigningService).thenReturn(URL("http://localhost")) - whenever(nc.certificateChainCheckPolicies).thenReturn(emptyList()) - whenever(nc.verifierType).thenReturn(VerifierType.InMemory) - whenever(nc.messageRedeliveryDelaySeconds).thenReturn(5) - return nc -} - @JvmOverloads fun configureTestSSL(legalName: X500Name = MEGA_CORP.name): SSLConfiguration = object : SSLConfiguration { override val certificatesDirectory = Files.createTempDirectory("certs") diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt b/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt index 3a8669e7cb..9cfca24f74 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt @@ -9,13 +9,7 @@ import net.corda.core.crypto.entropyToKeyPair import net.corda.core.crypto.generateKeyPair import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate -import net.corda.core.internal.concurrent.transpose -import net.corda.core.messaging.CordaRPCOps -import net.corda.core.node.services.ServiceInfo -import net.corda.node.services.transactions.ValidatingNotaryService import net.corda.node.utilities.X509Utilities -import net.corda.nodeapi.User -import net.corda.testing.driver.DriverDSLExposedInterface import org.bouncycastle.asn1.x500.X500Name import java.math.BigInteger import java.security.KeyPair @@ -81,51 +75,3 @@ object DummyCommandData : TypeOnlyCommandData() val DUMMY_IDENTITY_1: PartyAndCertificate get() = getTestPartyAndCertificate(DUMMY_PARTY) val DUMMY_PARTY: Party get() = Party(X500Name("CN=Dummy,O=Dummy,L=Madrid,C=ES"), DUMMY_KEY_1.public) - -// -// Extensions to the Driver DSL to auto-manufacture nodes by name. -// - -/** - * A simple wrapper for objects provided by the integration test driver DSL. The fields are lazy so - * node construction won't start until you access the members. You can get one of these from the - * [alice], [bob] and [aliceBobAndNotary] functions. - */ -class PredefinedTestNode internal constructor(party: Party, driver: DriverDSLExposedInterface, services: Set) { - val rpcUsers = listOf(User("admin", "admin", setOf("ALL"))) // TODO: Randomize? - val nodeFuture by lazy { driver.startNode(providedName = party.name, rpcUsers = rpcUsers, advertisedServices = services) } - val node by lazy { nodeFuture.get()!! } - val rpc by lazy { node.rpcClientToNode() } - - fun useRPC(block: (CordaRPCOps) -> R) = rpc.use(rpcUsers[0].username, rpcUsers[0].password) { block(it.proxy) } -} - -// TODO: Probably we should inject the above keys through the driver to make the nodes use it, rather than have the warnings below. - -/** - * Returns a plain, entirely stock node pre-configured with the [ALICE] identity. Note that a random key will be generated - * for it: you won't have [ALICE_KEY]. - */ -fun DriverDSLExposedInterface.alice(): PredefinedTestNode = PredefinedTestNode(ALICE, this, emptySet()) -/** - * Returns a plain, entirely stock node pre-configured with the [BOB] identity. Note that a random key will be generated - * for it: you won't have [BOB_KEY]. - */ -fun DriverDSLExposedInterface.bob(): PredefinedTestNode = PredefinedTestNode(BOB, this, emptySet()) -/** - * Returns a plain single node notary pre-configured with the [DUMMY_NOTARY] identity. Note that a random key will be generated - * for it: you won't have [DUMMY_NOTARY_KEY]. - */ -fun DriverDSLExposedInterface.notary(): PredefinedTestNode = PredefinedTestNode(DUMMY_NOTARY, this, setOf(ServiceInfo(ValidatingNotaryService.type))) - -/** - * Returns plain, entirely stock nodes pre-configured with the [ALICE], [BOB] and [DUMMY_NOTARY] X.500 names in that - * order. They have been started up in parallel and are now ready to use. - */ -fun DriverDSLExposedInterface.aliceBobAndNotary(): List { - val alice = alice() - val bob = bob() - val notary = notary() - listOf(alice.nodeFuture, bob.nodeFuture, notary.nodeFuture).transpose().get() - return listOf(alice, bob, notary) -} \ No newline at end of file diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt b/test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt new file mode 100644 index 0000000000..618060be0e --- /dev/null +++ b/test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt @@ -0,0 +1,41 @@ +package net.corda.testing.node + +import net.corda.core.contracts.Attachment +import net.corda.core.crypto.SecureHash +import net.corda.core.crypto.sha256 +import net.corda.core.internal.AbstractAttachment +import net.corda.core.node.services.AttachmentStorage +import net.corda.core.serialization.SingletonSerializeAsToken +import java.io.ByteArrayOutputStream +import java.io.File +import java.io.InputStream +import java.util.HashMap +import java.util.jar.JarInputStream + +class MockAttachmentStorage : AttachmentStorage, SingletonSerializeAsToken() { + val files = HashMap() + + override fun openAttachment(id: SecureHash): Attachment? { + val f = files[id] ?: return null + return object : AbstractAttachment({ f }) { + override val id = id + } + } + + override fun importAttachment(jar: InputStream): SecureHash { + // JIS makes read()/readBytes() return bytes of the current file, but we want to hash the entire container here. + require(jar !is JarInputStream) + + val bytes = run { + val s = ByteArrayOutputStream() + jar.copyTo(s) + s.close() + s.toByteArray() + } + val sha256 = bytes.sha256() + if (files.containsKey(sha256)) + throw FileAlreadyExistsException(File("!! MOCK FILE NAME")) + files[sha256] = bytes + return sha256 + } +} diff --git a/testing/node-driver/build.gradle b/testing/node-driver/build.gradle new file mode 100644 index 0000000000..2196330ae4 --- /dev/null +++ b/testing/node-driver/build.gradle @@ -0,0 +1,49 @@ +apply plugin: 'kotlin' +apply plugin: 'kotlin-jpa' +apply plugin: 'net.corda.plugins.quasar-utils' +apply plugin: 'net.corda.plugins.publish-utils' +apply plugin: 'com.jfrog.artifactory' + +//noinspection GroovyAssignabilityCheck +configurations { + // we don't want isolated.jar in classPath, since we want to test jar being dynamically loaded as an attachment + runtime.exclude module: 'isolated' + + integrationTestCompile.extendsFrom testCompile + integrationTestRuntime.extendsFrom testRuntime +} + +sourceSets { + integrationTest { + kotlin { + compileClasspath += main.output + test.output + runtimeClasspath += main.output + test.output + srcDir file('src/integration-test/kotlin') + } + resources { + srcDir file('src/integration-test/resources') + } + } +} + +dependencies { + compile project(':test-utils') + compile project(':cordform-common') + + // Integration test helpers + integrationTestCompile "org.assertj:assertj-core:${assertj_version}" + integrationTestCompile "junit:junit:$junit_version" +} + +task integrationTest(type: Test) { + testClassesDirs = sourceSets.integrationTest.output.classesDirs + classpath = sourceSets.integrationTest.runtimeClasspath +} + +jar { + baseName 'corda-node-driver' +} + +publish { + name jar.baseName +} diff --git a/test-utils/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt b/testing/node-driver/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt similarity index 100% rename from test-utils/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt rename to testing/node-driver/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt diff --git a/test-utils/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt b/testing/node-driver/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt similarity index 100% rename from test-utils/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt rename to testing/node-driver/src/integration-test/kotlin/net/corda/testing/driver/DriverTests.kt diff --git a/samples/notary-demo/src/main/kotlin/net/corda/demorun/DemoRunner.kt b/testing/node-driver/src/main/kotlin/net/corda/demorun/DemoRunner.kt similarity index 100% rename from samples/notary-demo/src/main/kotlin/net/corda/demorun/DemoRunner.kt rename to testing/node-driver/src/main/kotlin/net/corda/demorun/DemoRunner.kt diff --git a/samples/notary-demo/src/main/kotlin/net/corda/demorun/util/DemoUtils.kt b/testing/node-driver/src/main/kotlin/net/corda/demorun/util/DemoUtils.kt similarity index 100% rename from samples/notary-demo/src/main/kotlin/net/corda/demorun/util/DemoUtils.kt rename to testing/node-driver/src/main/kotlin/net/corda/demorun/util/DemoUtils.kt diff --git a/test-utils/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt b/testing/node-driver/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt rename to testing/node-driver/src/main/kotlin/net/corda/node/testing/MockServiceHubInternal.kt diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/DriverConstants.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/DriverConstants.kt new file mode 100644 index 0000000000..709f48da8a --- /dev/null +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/DriverConstants.kt @@ -0,0 +1,59 @@ +@file:JvmName("DriverConstants") + +package net.corda.testing + +import net.corda.core.identity.Party +import net.corda.core.internal.concurrent.transpose +import net.corda.core.messaging.CordaRPCOps +import net.corda.core.node.services.ServiceInfo +import net.corda.node.services.transactions.ValidatingNotaryService +import net.corda.nodeapi.User +import net.corda.testing.driver.DriverDSLExposedInterface + +// +// Extensions to the Driver DSL to auto-manufacture nodes by name. +// + +/** + * A simple wrapper for objects provided by the integration test driver DSL. The fields are lazy so + * node construction won't start until you access the members. You can get one of these from the + * [alice], [bob] and [aliceBobAndNotary] functions. + */ +class PredefinedTestNode internal constructor(party: Party, driver: DriverDSLExposedInterface, services: Set) { + val rpcUsers = listOf(User("admin", "admin", setOf("ALL"))) // TODO: Randomize? + val nodeFuture by lazy { driver.startNode(providedName = party.name, rpcUsers = rpcUsers, advertisedServices = services) } + val node by lazy { nodeFuture.get()!! } + val rpc by lazy { node.rpcClientToNode() } + + fun useRPC(block: (CordaRPCOps) -> R) = rpc.use(rpcUsers[0].username, rpcUsers[0].password) { block(it.proxy) } +} + +// TODO: Probably we should inject the above keys through the driver to make the nodes use it, rather than have the warnings below. + +/** + * Returns a plain, entirely stock node pre-configured with the [ALICE] identity. Note that a random key will be generated + * for it: you won't have [ALICE_KEY]. + */ +fun DriverDSLExposedInterface.alice(): PredefinedTestNode = PredefinedTestNode(ALICE, this, emptySet()) +/** + * Returns a plain, entirely stock node pre-configured with the [BOB] identity. Note that a random key will be generated + * for it: you won't have [BOB_KEY]. + */ +fun DriverDSLExposedInterface.bob(): PredefinedTestNode = PredefinedTestNode(BOB, this, emptySet()) +/** + * Returns a plain single node notary pre-configured with the [DUMMY_NOTARY] identity. Note that a random key will be generated + * for it: you won't have [DUMMY_NOTARY_KEY]. + */ +fun DriverDSLExposedInterface.notary(): PredefinedTestNode = PredefinedTestNode(DUMMY_NOTARY, this, setOf(ServiceInfo(ValidatingNotaryService.type))) + +/** + * Returns plain, entirely stock nodes pre-configured with the [ALICE], [BOB] and [DUMMY_NOTARY] X.500 names in that + * order. They have been started up in parallel and are now ready to use. + */ +fun DriverDSLExposedInterface.aliceBobAndNotary(): List { + val alice = alice() + val bob = bob() + val notary = notary() + listOf(alice.nodeFuture, bob.nodeFuture, notary.nodeFuture).transpose().get() + return listOf(alice, bob, notary) +} diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/NodeTestUtils.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/NodeTestUtils.kt new file mode 100644 index 0000000000..3d917e4bde --- /dev/null +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/NodeTestUtils.kt @@ -0,0 +1,73 @@ +@file:JvmName("NodeTestUtils") + +package net.corda.testing + +import com.nhaarman.mockito_kotlin.spy +import com.nhaarman.mockito_kotlin.whenever +import net.corda.core.node.ServiceHub +import net.corda.core.transactions.TransactionBuilder +import net.corda.core.utilities.commonName +import net.corda.node.services.config.NodeConfiguration +import net.corda.node.services.config.VerifierType +import net.corda.testing.node.MockServices +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import org.bouncycastle.asn1.x500.X500Name +import java.net.URL +import java.nio.file.Path + +/** + * Creates and tests a ledger built by the passed in dsl. The provided services can be customised, otherwise a default + * of a freshly built [MockServices] is used. + */ +@JvmOverloads fun ledger( + services: ServiceHub = MockServices(), + initialiseSerialization: Boolean = true, + dsl: LedgerDSL.() -> Unit +): LedgerDSL { + if (initialiseSerialization) initialiseTestSerialization() + try { + val ledgerDsl = LedgerDSL(TestLedgerDSLInterpreter(services)) + dsl(ledgerDsl) + return ledgerDsl + } finally { + if (initialiseSerialization) resetTestSerialization() + } +} + +/** + * Creates a ledger with a single transaction, built by the passed in dsl. + * + * @see LedgerDSLInterpreter._transaction + */ +@JvmOverloads fun transaction( + transactionLabel: String? = null, + transactionBuilder: TransactionBuilder = TransactionBuilder(notary = DUMMY_NOTARY), + initialiseSerialization: Boolean = true, + dsl: TransactionDSL.() -> EnforceVerifyOrFail +) = ledger(initialiseSerialization = initialiseSerialization) { + dsl(TransactionDSL(TestTransactionDSLInterpreter(this.interpreter, transactionBuilder))) +} + +fun testNodeConfiguration( + baseDirectory: Path, + myLegalName: X500Name): NodeConfiguration { + abstract class MockableNodeConfiguration : NodeConfiguration // Otherwise Mockito is defeated by val getters. + val nc = spy() + whenever(nc.baseDirectory).thenReturn(baseDirectory) + whenever(nc.myLegalName).thenReturn(myLegalName) + whenever(nc.minimumPlatformVersion).thenReturn(1) + whenever(nc.keyStorePassword).thenReturn("cordacadevpass") + whenever(nc.trustStorePassword).thenReturn("trustpass") + whenever(nc.rpcUsers).thenReturn(emptyList()) + whenever(nc.dataSourceProperties).thenReturn(makeTestDataSourceProperties(myLegalName.commonName)) + whenever(nc.database).thenReturn(makeTestDatabaseProperties()) + whenever(nc.emailAddress).thenReturn("") + whenever(nc.exportJMXto).thenReturn("") + whenever(nc.devMode).thenReturn(true) + whenever(nc.certificateSigningService).thenReturn(URL("http://localhost")) + whenever(nc.certificateChainCheckPolicies).thenReturn(emptyList()) + whenever(nc.verifierType).thenReturn(VerifierType.InMemory) + whenever(nc.messageRedeliveryDelaySeconds).thenReturn(5) + return nc +} diff --git a/test-utils/src/main/kotlin/net/corda/testing/RPCDriver.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/RPCDriver.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/RPCDriver.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/RPCDriver.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/driver/Driver.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/NetworkMapStartStrategy.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/NetworkMapStartStrategy.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/driver/NetworkMapStartStrategy.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/driver/NetworkMapStartStrategy.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/driver/ProcessUtilities.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/ProcessUtilities.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/driver/ProcessUtilities.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/driver/ProcessUtilities.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/DriverBasedTest.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/DriverBasedTest.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/node/DriverBasedTest.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/node/DriverBasedTest.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/node/MockNode.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt similarity index 91% rename from test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt index 83394c5180..ca9f7e5632 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/node/MockServices.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt @@ -1,7 +1,5 @@ package net.corda.testing.node -import net.corda.core.internal.AbstractAttachment -import net.corda.core.contracts.Attachment import net.corda.core.crypto.* import net.corda.core.flows.StateMachineRunId import net.corda.core.identity.PartyAndCertificate @@ -37,16 +35,12 @@ import net.corda.testing.schemas.DummyLinearStateSchemaV1 import org.bouncycastle.operator.ContentSigner import rx.Observable import rx.subjects.PublishSubject -import java.io.ByteArrayOutputStream -import java.io.File -import java.io.InputStream import java.security.KeyPair import java.security.PrivateKey import java.security.PublicKey import java.sql.Connection import java.time.Clock import java.util.* -import java.util.jar.JarInputStream // TODO: We need a single, rationalised unit testing environment that is usable for everything. Fix this! // That means it probably shouldn't be in the 'core' module, which lacks enough code to create a realistic test env. @@ -217,34 +211,6 @@ class MockKeyManagementService(val identityService: IdentityService, } } -class MockAttachmentStorage : AttachmentStorage, SingletonSerializeAsToken() { - val files = HashMap() - - override fun openAttachment(id: SecureHash): Attachment? { - val f = files[id] ?: return null - return object : AbstractAttachment({ f }) { - override val id = id - } - } - - override fun importAttachment(jar: InputStream): SecureHash { - // JIS makes read()/readBytes() return bytes of the current file, but we want to hash the entire container here. - require(jar !is JarInputStream) - - val bytes = run { - val s = ByteArrayOutputStream() - jar.copyTo(s) - s.close() - s.toByteArray() - } - val sha256 = bytes.sha256() - if (files.containsKey(sha256)) - throw FileAlreadyExistsException(File("!! MOCK FILE NAME")) - files[sha256] = bytes - return sha256 - } -} - class MockStateMachineRecordedTransactionMappingStorage( val storage: StateMachineRecordedTransactionMappingStorage = InMemoryStateMachineRecordedTransactionMappingStorage() ) : StateMachineRecordedTransactionMappingStorage by storage diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/SimpleNode.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/node/SimpleNode.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/node/SimpleNode.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/TestClock.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/TestClock.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/node/TestClock.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/node/TestClock.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/performance/Injectors.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/performance/Injectors.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/performance/Injectors.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/performance/Injectors.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/performance/Reporter.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/performance/Reporter.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/performance/Reporter.kt rename to testing/node-driver/src/main/kotlin/net/corda/testing/performance/Reporter.kt diff --git a/tools/explorer/build.gradle b/tools/explorer/build.gradle index 9e05041c1f..3ffc1e543c 100644 --- a/tools/explorer/build.gradle +++ b/tools/explorer/build.gradle @@ -27,7 +27,7 @@ dependencies { compile project(':core') compile project(':client:jfx') compile project(':client:mock') - compile project(':test-utils') + compile project(':node-driver') compile project(':finance') // Capsule is a library for building independently executable fat JARs. diff --git a/tools/loadtest/build.gradle b/tools/loadtest/build.gradle index 68a5a50774..af7012b2e6 100644 --- a/tools/loadtest/build.gradle +++ b/tools/loadtest/build.gradle @@ -6,7 +6,7 @@ mainClassName = 'net.corda.loadtest.MainKt' dependencies { compile project(':client:mock') compile project(':client:rpc') - compile project(':test-utils') + compile project(':node-driver') // https://mvnrepository.com/artifact/com.jcraft/jsch compile group: 'com.jcraft', name: 'jsch', version: '0.1.54' diff --git a/verifier/build.gradle b/verifier/build.gradle index 2e61f06ce2..33e4869dfd 100644 --- a/verifier/build.gradle +++ b/verifier/build.gradle @@ -39,7 +39,7 @@ dependencies { compile "org.apache.logging.log4j:log4j-slf4j-impl:${log4j_version}" compile "org.apache.logging.log4j:log4j-core:${log4j_version}" - integrationTestCompile project(":test-utils") + integrationTestCompile project(":node-driver") integrationTestCompile project(":client:mock") // Integration test helpers diff --git a/webserver/build.gradle b/webserver/build.gradle index a4f729f54a..15fa109983 100644 --- a/webserver/build.gradle +++ b/webserver/build.gradle @@ -57,7 +57,7 @@ dependencies { // For rendering the index page. compile "org.jetbrains.kotlinx:kotlinx-html-jvm:0.6.3" - testCompile project(':test-utils') + integrationTestCompile project(':node-driver') testCompile "junit:junit:$junit_version" } From cbf89ba98b7e59448c8200d3dc3782f3761f3071 Mon Sep 17 00:00:00 2001 From: mkit Date: Tue, 5 Sep 2017 10:07:55 +0100 Subject: [PATCH 080/120] Deprecating verifiedTransactions from the public API (#1418) --- .../net/corda/client/jfx/model/NodeMonitorModel.kt | 2 +- .../kotlin/net/corda/core/messaging/CordaRPCOps.kt | 14 ++++++++++---- .../kotlin/net/corda/docs/ClientRpcTutorial.kt | 2 +- .../net/corda/node/internal/CordaRPCOpsImpl.kt | 6 +++--- .../kotlin/net/corda/node/CordaRPCOpsImplTest.kt | 2 +- .../net/corda/attachmentdemo/AttachmentDemo.kt | 2 +- .../net/corda/demobench/views/NodeTerminalView.kt | 2 +- 7 files changed, 18 insertions(+), 12 deletions(-) diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt index 33e160c742..7bd9623f52 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt @@ -89,7 +89,7 @@ class NodeMonitorModel { vaultUpdates.startWith(initialVaultUpdate).subscribe(vaultUpdatesSubject) // Transactions - val (transactions, newTransactions) = proxy.verifiedTransactionsFeed() + val (transactions, newTransactions) = proxy.internalVerifiedTransactionsFeed() newTransactions.startWith(transactions).subscribe(transactionsSubject) // SM -> TX mapping diff --git a/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt b/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt index a0aa250f88..fab679795b 100644 --- a/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt +++ b/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt @@ -157,15 +157,21 @@ interface CordaRPCOps : RPCOps { // DOCEND VaultTrackAPIHelpers /** - * Returns a list of all recorded transactions. + * @suppress Returns a list of all recorded transactions. + * + * TODO This method should be removed once SGX work is finalised and the design of the corresponding API using [FilteredTransaction] can be started */ - fun verifiedTransactionsSnapshot(): List + @Deprecated("This method is intended only for internal use and will be removed from the public API soon.") + fun internalVerifiedTransactionsSnapshot(): List /** - * Returns a data feed of all recorded transactions and an observable of future recorded ones. + * @suppress Returns a data feed of all recorded transactions and an observable of future recorded ones. + * + * TODO This method should be removed once SGX work is finalised and the design of the corresponding API using [FilteredTransaction] can be started */ + @Deprecated("This method is intended only for internal use and will be removed from the public API soon.") @RPCReturnsObservables - fun verifiedTransactionsFeed(): DataFeed, SignedTransaction> + fun internalVerifiedTransactionsFeed(): DataFeed, SignedTransaction> /** * Returns a snapshot list of existing state machine id - recorded transaction hash mappings. diff --git a/docs/source/example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt b/docs/source/example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt index 64992a788f..f64503f2c0 100644 --- a/docs/source/example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt +++ b/docs/source/example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt @@ -63,7 +63,7 @@ fun main(args: Array) { // END 2 // START 3 - val (transactions: List, futureTransactions: Observable) = proxy.verifiedTransactionsFeed() + val (transactions: List, futureTransactions: Observable) = proxy.internalVerifiedTransactionsFeed() // END 3 // START 4 diff --git a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt index 0e76592081..64f26c7c51 100644 --- a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt +++ b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt @@ -71,13 +71,13 @@ class CordaRPCOpsImpl( } } - override fun verifiedTransactionsSnapshot(): List { - val (snapshot, updates) = verifiedTransactionsFeed() + override fun internalVerifiedTransactionsSnapshot(): List { + val (snapshot, updates) = internalVerifiedTransactionsFeed() updates.notUsed() return snapshot } - override fun verifiedTransactionsFeed(): DataFeed, SignedTransaction> { + override fun internalVerifiedTransactionsFeed(): DataFeed, SignedTransaction> { return database.transaction { services.validatedTransactions.track() } diff --git a/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt b/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt index bf7e9a375d..ebfd43b407 100644 --- a/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt +++ b/node/src/test/kotlin/net/corda/node/CordaRPCOpsImplTest.kt @@ -137,7 +137,7 @@ class CordaRPCOpsImplTest { fun `issue and move`() { aliceNode.database.transaction { stateMachineUpdates = rpc.stateMachinesFeed().updates - transactions = rpc.verifiedTransactionsFeed().updates + transactions = rpc.internalVerifiedTransactionsFeed().updates vaultTrackCash = rpc.vaultTrackBy().updates } diff --git a/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/AttachmentDemo.kt b/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/AttachmentDemo.kt index c883411e67..1b24d48640 100644 --- a/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/AttachmentDemo.kt +++ b/samples/attachment-demo/src/main/kotlin/net/corda/attachmentdemo/AttachmentDemo.kt @@ -131,7 +131,7 @@ class AttachmentDemoFlow(val otherSide: Party, val notary: Party, val hash: Secu fun recipient(rpc: CordaRPCOps) { println("Waiting to receive transaction ...") - val stx = rpc.verifiedTransactionsFeed().updates.toBlocking().first() + val stx = rpc.internalVerifiedTransactionsFeed().updates.toBlocking().first() val wtx = stx.tx if (wtx.attachments.isNotEmpty()) { if (wtx.outputs.isNotEmpty()) { diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt index 51905c0b6f..b67b4b55d0 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt @@ -187,7 +187,7 @@ class NodeTerminalView : Fragment() { private fun initialise(config: NodeConfig, ops: CordaRPCOps) { try { - val (txInit, txNext) = ops.verifiedTransactionsFeed() + val (txInit, txNext) = ops.internalVerifiedTransactionsFeed() val (stateInit, stateNext) = ops.vaultTrackBy(paging = pageSpecification) txCount = txInit.size From 8076983e2e0ea72b7cbed5de54ad6dd6194dea7c Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Tue, 5 Sep 2017 10:22:34 +0100 Subject: [PATCH 081/120] Add missing finance CorDapp depdendency to example code (#1413) The example code uses cash flows and contracts, but doesn't depend on the finance CorDapp. This happens to work at the moment but should be corrected anyway. --- docs/source/example-code/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/source/example-code/build.gradle b/docs/source/example-code/build.gradle index e5e7a5a008..cca5e9a29e 100644 --- a/docs/source/example-code/build.gradle +++ b/docs/source/example-code/build.gradle @@ -42,6 +42,9 @@ dependencies { cordaCompile project(path: ":node:capsule", configuration: 'runtimeArtifacts') cordaCompile project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') + + // Corda Plugins: dependent flows and services + cordapp project(':finance') } mainClassName = "net.corda.docs.ClientRpcTutorialKt" From 8ef29d4736cab111606c58bbacea7ddc152c96dc Mon Sep 17 00:00:00 2001 From: Matthew Nesbit Date: Fri, 1 Sep 2017 10:58:23 +0100 Subject: [PATCH 082/120] Persistent Identity Fixup tests after rebase Add unit tests of Persistent Identity. Fix bugs in PersistentMap. Wrap identity and network map RPC calls in database transaction Address PR comments --- .../core/flows/CollectSignaturesFlowTests.kt | 10 +- .../core/flows/ContractUpgradeFlowTest.kt | 9 +- .../corda/core/flows/IdentitySyncFlowTests.kt | 22 +- .../core/flows/TransactionKeyFlowTests.kt | 16 +- .../net/corda/node/internal/AbstractNode.kt | 4 +- .../corda/node/internal/CordaRPCOpsImpl.kt | 49 ++- .../identity/PersistentIdentityService.kt | 199 +++++++++++++ .../node/services/schema/NodeSchemaService.kt | 5 +- .../net/corda/node/utilities/PersistentMap.kt | 2 +- .../node/messaging/TwoPartyTradeFlowTests.kt | 27 +- .../services/network/NetworkMapCacheTest.kt | 2 +- .../network/PersistentIdentityServiceTests.kt | 279 ++++++++++++++++++ .../statemachine/FlowFrameworkTests.kt | 8 +- .../corda/netmap/simulation/IRSSimulation.kt | 5 - .../kotlin/net/corda/testing/node/MockNode.kt | 30 +- .../net/corda/testing/node/MockServices.kt | 8 +- 16 files changed, 610 insertions(+), 65 deletions(-) create mode 100644 node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt create mode 100644 node/src/test/kotlin/net/corda/node/services/network/PersistentIdentityServiceTests.kt diff --git a/core/src/test/kotlin/net/corda/core/flows/CollectSignaturesFlowTests.kt b/core/src/test/kotlin/net/corda/core/flows/CollectSignaturesFlowTests.kt index b4f5bd1833..cf278dc307 100644 --- a/core/src/test/kotlin/net/corda/core/flows/CollectSignaturesFlowTests.kt +++ b/core/src/test/kotlin/net/corda/core/flows/CollectSignaturesFlowTests.kt @@ -141,9 +141,13 @@ class CollectSignaturesFlowTests { @Test fun `successfully collects two signatures`() { - val bConfidentialIdentity = b.services.keyManagementService.freshKeyAndCert(b.info.legalIdentityAndCert, false) - // Normally this is handled by TransactionKeyFlow, but here we have to manually let A know about the identity - a.services.identityService.verifyAndRegisterIdentity(bConfidentialIdentity) + val bConfidentialIdentity = b.database.transaction { + b.services.keyManagementService.freshKeyAndCert(b.info.legalIdentityAndCert, false) + } + a.database.transaction { + // Normally this is handled by TransactionKeyFlow, but here we have to manually let A know about the identity + a.services.identityService.verifyAndRegisterIdentity(bConfidentialIdentity) + } registerFlowOnAllNodes(TestFlowTwo.Responder::class) val magicNumber = 1337 val parties = listOf(a.info.legalIdentity, bConfidentialIdentity.party, c.info.legalIdentity) diff --git a/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt b/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt index 3eb15aae84..d5687b45ad 100644 --- a/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt +++ b/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt @@ -54,8 +54,13 @@ class ContractUpgradeFlowTest { notary = nodes.notaryNode.info.notaryIdentity val nodeIdentity = nodes.notaryNode.info.legalIdentitiesAndCerts.single { it.party == nodes.notaryNode.info.notaryIdentity } - a.services.identityService.verifyAndRegisterIdentity(nodeIdentity) - b.services.identityService.verifyAndRegisterIdentity(nodeIdentity) + a.database.transaction { + a.services.identityService.verifyAndRegisterIdentity(nodeIdentity) + } + b.database.transaction { + b.services.identityService.verifyAndRegisterIdentity(nodeIdentity) + } + } @After diff --git a/core/src/test/kotlin/net/corda/core/flows/IdentitySyncFlowTests.kt b/core/src/test/kotlin/net/corda/core/flows/IdentitySyncFlowTests.kt index 5bd4cdb349..048d1822b1 100644 --- a/core/src/test/kotlin/net/corda/core/flows/IdentitySyncFlowTests.kt +++ b/core/src/test/kotlin/net/corda/core/flows/IdentitySyncFlowTests.kt @@ -41,10 +41,14 @@ class IdentitySyncFlowTests { val bobNode = mockNet.createPartyNode(notaryNode.network.myAddress, BOB.name) val alice: Party = aliceNode.services.myInfo.legalIdentity val bob: Party = bobNode.services.myInfo.legalIdentity - aliceNode.services.identityService.verifyAndRegisterIdentity(bobNode.info.legalIdentityAndCert) - aliceNode.services.identityService.verifyAndRegisterIdentity(notaryNode.info.legalIdentityAndCert) - bobNode.services.identityService.verifyAndRegisterIdentity(aliceNode.info.legalIdentityAndCert) - bobNode.services.identityService.verifyAndRegisterIdentity(notaryNode.info.legalIdentityAndCert) + aliceNode.database.transaction { + aliceNode.services.identityService.verifyAndRegisterIdentity(bobNode.info.legalIdentityAndCert) + aliceNode.services.identityService.verifyAndRegisterIdentity(notaryNode.info.legalIdentityAndCert) + } + bobNode.database.transaction { + bobNode.services.identityService.verifyAndRegisterIdentity(aliceNode.info.legalIdentityAndCert) + bobNode.services.identityService.verifyAndRegisterIdentity(notaryNode.info.legalIdentityAndCert) + } bobNode.registerInitiatedFlow(Receive::class.java) // Alice issues then pays some cash to a new confidential identity that Bob doesn't know about @@ -53,12 +57,16 @@ class IdentitySyncFlowTests { val issueFlow = aliceNode.services.startFlow(CashIssueAndPaymentFlow(1000.DOLLARS, ref, alice, anonymous, notaryNode.services.myInfo.notaryIdentity)) val issueTx = issueFlow.resultFuture.getOrThrow().stx val confidentialIdentity = issueTx.tx.outputs.map { it.data }.filterIsInstance().single().owner - assertNull(bobNode.services.identityService.partyFromAnonymous(confidentialIdentity)) + assertNull(bobNode.database.transaction { bobNode.services.identityService.partyFromAnonymous(confidentialIdentity) }) // Run the flow to sync up the identities aliceNode.services.startFlow(Initiator(bob, issueTx.tx)).resultFuture.getOrThrow() - val expected = aliceNode.services.identityService.partyFromAnonymous(confidentialIdentity) - val actual = bobNode.services.identityService.partyFromAnonymous(confidentialIdentity) + val expected = aliceNode.database.transaction { + aliceNode.services.identityService.partyFromAnonymous(confidentialIdentity) + } + val actual = bobNode.database.transaction { + bobNode.services.identityService.partyFromAnonymous(confidentialIdentity) + } assertEquals(expected, actual) } diff --git a/core/src/test/kotlin/net/corda/core/flows/TransactionKeyFlowTests.kt b/core/src/test/kotlin/net/corda/core/flows/TransactionKeyFlowTests.kt index 83defd2fa2..c4042699fb 100644 --- a/core/src/test/kotlin/net/corda/core/flows/TransactionKeyFlowTests.kt +++ b/core/src/test/kotlin/net/corda/core/flows/TransactionKeyFlowTests.kt @@ -26,10 +26,14 @@ class TransactionKeyFlowTests { val bobNode = mockNet.createPartyNode(notaryNode.network.myAddress, BOB.name) val alice: Party = aliceNode.services.myInfo.legalIdentity val bob: Party = bobNode.services.myInfo.legalIdentity - aliceNode.services.identityService.verifyAndRegisterIdentity(bobNode.info.legalIdentityAndCert) - aliceNode.services.identityService.verifyAndRegisterIdentity(notaryNode.info.legalIdentityAndCert) - bobNode.services.identityService.verifyAndRegisterIdentity(aliceNode.info.legalIdentityAndCert) - bobNode.services.identityService.verifyAndRegisterIdentity(notaryNode.info.legalIdentityAndCert) + aliceNode.database.transaction { + aliceNode.services.identityService.verifyAndRegisterIdentity(bobNode.info.legalIdentityAndCert) + aliceNode.services.identityService.verifyAndRegisterIdentity(notaryNode.info.legalIdentityAndCert) + } + bobNode.database.transaction { + bobNode.services.identityService.verifyAndRegisterIdentity(aliceNode.info.legalIdentityAndCert) + bobNode.services.identityService.verifyAndRegisterIdentity(notaryNode.info.legalIdentityAndCert) + } // Run the flows val requesterFlow = aliceNode.services.startFlow(TransactionKeyFlow(bob)) @@ -44,8 +48,8 @@ class TransactionKeyFlowTests { assertNotEquals(bob, bobAnonymousIdentity) // Verify that the anonymous identities look sane - assertEquals(alice.name, aliceNode.services.identityService.partyFromAnonymous(aliceAnonymousIdentity)!!.name) - assertEquals(bob.name, bobNode.services.identityService.partyFromAnonymous(bobAnonymousIdentity)!!.name) + assertEquals(alice.name, aliceNode.database.transaction { aliceNode.services.identityService.partyFromAnonymous(aliceAnonymousIdentity)!!.name }) + assertEquals(bob.name, bobNode.database.transaction { bobNode.services.identityService.partyFromAnonymous(bobAnonymousIdentity)!!.name }) // Verify that the nodes have the right anonymous identities assertTrue { aliceAnonymousIdentity.owningKey in aliceNode.services.keyManagementService.keys } diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index eccca6e7fb..d5f509261b 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -34,7 +34,7 @@ import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.config.configureWithDevSSLCertificate import net.corda.node.services.events.NodeSchedulerService import net.corda.node.services.events.ScheduledActivityObserver -import net.corda.node.services.identity.InMemoryIdentityService +import net.corda.node.services.identity.PersistentIdentityService import net.corda.node.services.keys.PersistentKeyManagementService import net.corda.node.services.messaging.MessagingService import net.corda.node.services.messaging.sendRequest @@ -658,7 +658,7 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, val caCertificates: Array = listOf(legalIdentity.certificate.cert, clientCa?.certificate?.cert) .filterNotNull() .toTypedArray() - val service = InMemoryIdentityService(setOf(info.legalIdentityAndCert), trustRoot = trustRoot, caCertificates = *caCertificates) + val service = PersistentIdentityService(setOf(info.legalIdentityAndCert), trustRoot = trustRoot, caCertificates = *caCertificates) services.networkMapCache.partyNodes.forEach { service.verifyAndRegisterIdentity(it.legalIdentityAndCert) } services.networkMapCache.changed.subscribe { mapChange -> // TODO how should we handle network map removal diff --git a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt index 64f26c7c51..eb84b6e513 100644 --- a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt +++ b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt @@ -1,6 +1,7 @@ package net.corda.node.internal import net.corda.client.rpc.notUsed +import net.corda.core.concurrent.CordaFuture import net.corda.core.contracts.ContractState import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.UpgradedContract @@ -18,10 +19,10 @@ import net.corda.core.node.services.vault.PageSpecification import net.corda.core.node.services.vault.QueryCriteria import net.corda.core.node.services.vault.Sort import net.corda.core.transactions.SignedTransaction +import net.corda.node.services.FlowPermissions.Companion.startFlowPermission import net.corda.node.services.api.ServiceHubInternal import net.corda.node.services.messaging.getRpcContext import net.corda.node.services.messaging.requirePermission -import net.corda.node.services.FlowPermissions.Companion.startFlowPermission import net.corda.node.services.statemachine.FlowStateMachineImpl import net.corda.node.services.statemachine.StateMachineManager import net.corda.node.utilities.CordaPersistence @@ -173,17 +174,49 @@ class CordaRPCOpsImpl( override fun authoriseContractUpgrade(state: StateAndRef<*>, upgradedContractClass: Class>) = services.contractUpgradeService.authoriseContractUpgrade(state, upgradedContractClass) override fun deauthoriseContractUpgrade(state: StateAndRef<*>) = services.contractUpgradeService.deauthoriseContractUpgrade(state) override fun currentNodeTime(): Instant = Instant.now(services.clock) - override fun waitUntilNetworkReady() = services.networkMapCache.nodeReady - override fun partyFromAnonymous(party: AbstractParty): Party? = services.identityService.partyFromAnonymous(party) - override fun partyFromKey(key: PublicKey) = services.identityService.partyFromKey(key) - override fun partyFromX500Name(x500Name: X500Name) = services.identityService.partyFromX500Name(x500Name) - override fun partiesFromName(query: String, exactMatch: Boolean): Set = services.identityService.partiesFromName(query, exactMatch) - override fun nodeIdentityFromParty(party: AbstractParty): NodeInfo? = services.networkMapCache.getNodeByLegalIdentity(party) + + override fun waitUntilNetworkReady(): CordaFuture { + return database.transaction { + services.networkMapCache.nodeReady + } + } + + override fun partyFromAnonymous(party: AbstractParty): Party? { + return database.transaction { + services.identityService.partyFromAnonymous(party) + } + } + + override fun partyFromKey(key: PublicKey): Party? { + return database.transaction { + services.identityService.partyFromKey(key) + } + } + + override fun partyFromX500Name(x500Name: X500Name): Party? { + return database.transaction { + services.identityService.partyFromX500Name(x500Name) + } + } + + override fun partiesFromName(query: String, exactMatch: Boolean): Set { + return database.transaction { + services.identityService.partiesFromName(query, exactMatch) + } + } + + override fun nodeIdentityFromParty(party: AbstractParty): NodeInfo? { + return database.transaction { + services.networkMapCache.getNodeByLegalIdentity(party) + } + } override fun registeredFlows(): List = services.rpcFlows.map { it.name }.sorted() override fun clearNetworkMapCache() { - services.networkMapCache.clearNetworkMapCache() + database.transaction { + services.networkMapCache.clearNetworkMapCache() + } } companion object { diff --git a/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt b/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt new file mode 100644 index 0000000000..b5f931408b --- /dev/null +++ b/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt @@ -0,0 +1,199 @@ +package net.corda.node.services.identity + +import net.corda.core.contracts.PartyAndReference +import net.corda.core.crypto.SecureHash +import net.corda.core.crypto.toStringShort +import net.corda.core.identity.AbstractParty +import net.corda.core.identity.AnonymousParty +import net.corda.core.identity.Party +import net.corda.core.identity.PartyAndCertificate +import net.corda.core.internal.toX509CertHolder +import net.corda.core.node.services.IdentityService +import net.corda.core.node.services.UnknownAnonymousPartyException +import net.corda.core.serialization.SingletonSerializeAsToken +import net.corda.core.utilities.cert +import net.corda.core.utilities.loggerFor +import net.corda.node.utilities.NODE_DATABASE_PREFIX +import net.corda.node.utilities.PersistentMap +import org.bouncycastle.asn1.x500.X500Name +import org.bouncycastle.cert.X509CertificateHolder +import java.io.ByteArrayInputStream +import java.security.InvalidAlgorithmParameterException +import java.security.PublicKey +import java.security.cert.* +import javax.annotation.concurrent.ThreadSafe +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.Id +import javax.persistence.Lob + +@ThreadSafe +class PersistentIdentityService(identities: Iterable = emptySet(), + confidentialIdentities: Iterable = emptySet(), + override val trustRoot: X509Certificate, + vararg caCertificates: X509Certificate) : SingletonSerializeAsToken(), IdentityService { + constructor(wellKnownIdentities: Iterable = emptySet(), + confidentialIdentities: Iterable = emptySet(), + trustRoot: X509CertificateHolder) : this(wellKnownIdentities, confidentialIdentities, trustRoot.cert) + + companion object { + private val log = loggerFor() + private val certFactory: CertificateFactory = CertificateFactory.getInstance("X.509") + + fun createPKMap(): PersistentMap { + return PersistentMap( + toPersistentEntityKey = { it.toString() }, + fromPersistentEntity = { + Pair(SecureHash.parse(it.publicKeyHash), + PartyAndCertificate(ByteArrayInputStream(it.identity).use { + certFactory.generateCertPath(it) + })) + }, + toPersistentEntity = { key: SecureHash, value: PartyAndCertificate -> + PersistentIdentity(key.toString(), value.certPath.encoded) + }, + persistentEntityClass = PersistentIdentity::class.java + ) + } + + fun createX500Map(): PersistentMap { + return PersistentMap( + toPersistentEntityKey = { it.toString() }, + fromPersistentEntity = { Pair(X500Name(it.name), SecureHash.parse(it.publicKeyHash)) }, + toPersistentEntity = { key: X500Name, value: SecureHash -> + PersistentIdentityNames(key.toString(), value.toString()) + }, + persistentEntityClass = PersistentIdentityNames::class.java + ) + } + + private fun mapToKey(owningKey: PublicKey) = SecureHash.sha256(owningKey.encoded) + private fun mapToKey(party: PartyAndCertificate) = mapToKey(party.owningKey) + } + + @Entity + @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}identities") + class PersistentIdentity( + @Id + @Column(name = "pk_hash", length = 64) + var publicKeyHash: String = "", + + @Lob + @Column + var identity: ByteArray = ByteArray(0) + ) + + @Entity + @javax.persistence.Table(name = "${NODE_DATABASE_PREFIX}named_identities") + class PersistentIdentityNames( + @Id + @Column(name = "name", length = 128) + var name: String = "", + + @Column(name = "pk_hash", length = 64) + var publicKeyHash: String = "" + ) + + override val caCertStore: CertStore + override val trustRootHolder = trustRoot.toX509CertHolder() + override val trustAnchor: TrustAnchor = TrustAnchor(trustRoot, null) + + private val keyToParties = createPKMap() + private val principalToParties = createX500Map() + + init { + val caCertificatesWithRoot: Set = caCertificates.toSet() + trustRoot + caCertStore = CertStore.getInstance("Collection", CollectionCertStoreParameters(caCertificatesWithRoot)) + keyToParties.putAll(identities.associateBy { mapToKey(it) }) + principalToParties.putAll(identities.associateBy({ it.name }, { mapToKey(it) })) + confidentialIdentities.forEach { identity -> + principalToParties.computeIfAbsent(identity.name) { mapToKey(identity) } + } + } + + override fun registerIdentity(party: PartyAndCertificate) { + verifyAndRegisterIdentity(party) + } + + // TODO: Check the certificate validation logic + @Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) + override fun verifyAndRegisterIdentity(identity: PartyAndCertificate): PartyAndCertificate? { + // Validate the chain first, before we do anything clever with it + identity.verify(trustAnchor) + + log.info("Registering identity $identity") + keyToParties[mapToKey(identity)] = identity + // Always keep the first party we registered, as that's the well known identity + principalToParties.computeIfAbsent(identity.name) { mapToKey(identity) } + val parentId = mapToKey(identity.certPath.certificates[1].publicKey) + return keyToParties[parentId] + } + + override fun certificateFromKey(owningKey: PublicKey): PartyAndCertificate? = keyToParties[mapToKey(owningKey)] + private fun certificateFromX500Name(name: X500Name): PartyAndCertificate? { + val partyId = principalToParties[name] + return if (partyId != null) { + keyToParties[partyId] + } else null + } + + override fun certificateFromParty(party: Party): PartyAndCertificate = certificateFromX500Name(party.name) ?: throw IllegalArgumentException("Unknown identity ${party.name}") + + // We give the caller a copy of the data set to avoid any locking problems + override fun getAllIdentities(): Iterable = ArrayList(keyToParties.values) + + override fun partyFromKey(key: PublicKey): Party? = certificateFromKey(key)?.party + override fun partyFromX500Name(principal: X500Name): Party? = certificateFromX500Name(principal)?.party + override fun partyFromAnonymous(party: AbstractParty): Party? { + // Expand the anonymous party to a full party (i.e. has a name) if possible + val candidate = party as? Party ?: partyFromKey(party.owningKey) + // TODO: This should be done via the network map cache, which is the authoritative source of well known identities + // Look up the well known identity for that name + return if (candidate != null) { + // If we have a well known identity by that name, use it in preference to the candidate. Otherwise default + // back to the candidate. + val res = partyFromX500Name(candidate.name) ?: candidate + res + } else { + null + } + } + + override fun partyFromAnonymous(partyRef: PartyAndReference) = partyFromAnonymous(partyRef.party) + override fun requirePartyFromAnonymous(party: AbstractParty): Party { + return partyFromAnonymous(party) ?: throw IllegalStateException("Could not deanonymise party ${party.owningKey.toStringShort()}") + } + + override fun partiesFromName(query: String, exactMatch: Boolean): Set { + val results = LinkedHashSet() + for ((x500name, partyId) in principalToParties) { + val party = keyToParties[partyId]!!.party + for (rdn in x500name.rdNs) { + val component = rdn.first.value.toString() + if (exactMatch && component == query) { + results += party + } else if (!exactMatch) { + // We can imagine this being a query over a lucene index in future. + // + // Kostas says: We can easily use the Jaro-Winkler distance metric as it is best suited for short + // strings such as entity/company names, and to detect small typos. We can also apply it for city + // or any keyword related search in lists of records (not raw text - for raw text we need indexing) + // and we can return results in hierarchical order (based on normalised String similarity 0.0-1.0). + if (component.contains(query, ignoreCase = true)) + results += party + } + } + } + return results + } + + @Throws(UnknownAnonymousPartyException::class) + override fun assertOwnership(party: Party, anonymousParty: AnonymousParty) { + val anonymousIdentity = certificateFromKey(anonymousParty.owningKey) ?: + throw UnknownAnonymousPartyException("Unknown $anonymousParty") + val issuingCert = anonymousIdentity.certPath.certificates[1] + require(issuingCert.publicKey == party.owningKey) { + "Issuing certificate's public key must match the party key ${party.owningKey.toStringShort()}." + } + } +} \ No newline at end of file diff --git a/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt b/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt index 0b53876af9..ac64a908ba 100644 --- a/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt +++ b/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt @@ -11,6 +11,7 @@ import net.corda.core.schemas.QueryableState import net.corda.core.serialization.SingletonSerializeAsToken import net.corda.node.services.api.SchemaService import net.corda.node.services.events.NodeSchedulerService +import net.corda.node.services.identity.PersistentIdentityService import net.corda.node.services.keys.PersistentKeyManagementService import net.corda.node.services.messaging.NodeMessagingClient import net.corda.node.services.network.PersistentNetworkMapService @@ -51,7 +52,9 @@ class NodeSchemaService(customSchemas: Set = emptySet()) : SchemaS NodeMessagingClient.RetryMessage::class.java, NodeAttachmentService.DBAttachment::class.java, RaftUniquenessProvider.RaftState::class.java, - BFTNonValidatingNotaryService.PersistedCommittedState::class.java + BFTNonValidatingNotaryService.PersistedCommittedState::class.java, + PersistentIdentityService.PersistentIdentity::class.java, + PersistentIdentityService.PersistentIdentityNames::class.java )) // Required schemas are those used by internal Corda services diff --git a/node/src/main/kotlin/net/corda/node/utilities/PersistentMap.kt b/node/src/main/kotlin/net/corda/node/utilities/PersistentMap.kt index 2d43aae33c..55acb14efc 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/PersistentMap.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/PersistentMap.kt @@ -57,7 +57,7 @@ class PersistentMap ( } fun all(): Sequence> { - return cache.asMap().asSequence().map { Pair(it.key, it.value.get()) } + return cache.asMap().asSequence().filter { it.value.isPresent }.map { Pair(it.key, it.value.get()) } } override val size get() = cache.size().toInt() diff --git a/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt b/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt index f7ba7dac6b..4d0c8c60da 100644 --- a/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt +++ b/node/src/test/kotlin/net/corda/node/messaging/TwoPartyTradeFlowTests.kt @@ -11,7 +11,6 @@ import net.corda.core.flows.StateMachineRunId import net.corda.core.identity.AbstractParty import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party -import net.corda.core.identity.PartyAndCertificate import net.corda.core.internal.FlowStateMachine import net.corda.core.internal.concurrent.map import net.corda.core.internal.rootCause @@ -205,11 +204,17 @@ class TwoPartyTradeFlowTests { // Let the nodes know about each other - normally the network map would handle this val allNodes = listOf(notaryNode, aliceNode, bobNode, bankNode) allNodes.forEach { node -> - allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.registerIdentity(identity) } + node.database.transaction { + allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.registerIdentity(identity) } + } } - aliceNode.services.identityService.verifyAndRegisterIdentity(bobNode.info.legalIdentityAndCert) - bobNode.services.identityService.verifyAndRegisterIdentity(aliceNode.info.legalIdentityAndCert) + aliceNode.database.transaction { + aliceNode.services.identityService.verifyAndRegisterIdentity(bobNode.info.legalIdentityAndCert) + } + bobNode.database.transaction { + bobNode.services.identityService.verifyAndRegisterIdentity(aliceNode.info.legalIdentityAndCert) + } aliceNode.disableDBCloseOnStop() bobNode.disableDBCloseOnStop() @@ -339,7 +344,9 @@ class TwoPartyTradeFlowTests { val allNodes = listOf(notaryNode, aliceNode, bobNode, bankNode) allNodes.forEach { node -> - allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.verifyAndRegisterIdentity(identity) } + node.database.transaction { + allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.verifyAndRegisterIdentity(identity) } + } } ledger(aliceNode.services, initialiseSerialization = false) { @@ -448,7 +455,11 @@ class TwoPartyTradeFlowTests { val allNodes = listOf(notaryNode, aliceNode, bobNode, bankNode) allNodes.forEach { node -> - allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.verifyAndRegisterIdentity(identity) } + node.database.transaction { + allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> + node.services.identityService.verifyAndRegisterIdentity(identity) + } + } } ledger(aliceNode.services, initialiseSerialization = false) { @@ -607,7 +618,9 @@ class TwoPartyTradeFlowTests { // Let the nodes know about each other - normally the network map would handle this val allNodes = listOf(notaryNode, aliceNode, bobNode, bankNode) allNodes.forEach { node -> - allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.registerIdentity(identity) } + node.database.transaction { + allNodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> node.services.identityService.registerIdentity(identity) } + } } val bobsBadCash = bobNode.database.transaction { diff --git a/node/src/test/kotlin/net/corda/node/services/network/NetworkMapCacheTest.kt b/node/src/test/kotlin/net/corda/node/services/network/NetworkMapCacheTest.kt index ff370836c0..706cd10ae8 100644 --- a/node/src/test/kotlin/net/corda/node/services/network/NetworkMapCacheTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/network/NetworkMapCacheTest.kt @@ -62,7 +62,7 @@ class NetworkMapCacheTest { val expected = n1.info mockNet.runNetwork() - val actual = node0Cache.getNodeByLegalIdentity(n1.info.legalIdentity) + val actual = n0.database.transaction { node0Cache.getNodeByLegalIdentity(n1.info.legalIdentity) } assertEquals(expected, actual) // TODO: Should have a test case with anonymous lookup diff --git a/node/src/test/kotlin/net/corda/node/services/network/PersistentIdentityServiceTests.kt b/node/src/test/kotlin/net/corda/node/services/network/PersistentIdentityServiceTests.kt new file mode 100644 index 0000000000..0ba68a7dd9 --- /dev/null +++ b/node/src/test/kotlin/net/corda/node/services/network/PersistentIdentityServiceTests.kt @@ -0,0 +1,279 @@ +package net.corda.node.services.network + +import net.corda.core.crypto.Crypto +import net.corda.core.crypto.generateKeyPair +import net.corda.core.identity.AnonymousParty +import net.corda.core.identity.Party +import net.corda.core.identity.PartyAndCertificate +import net.corda.core.node.services.IdentityService +import net.corda.core.node.services.UnknownAnonymousPartyException +import net.corda.core.utilities.CertificateAndKeyPair +import net.corda.core.utilities.cert +import net.corda.node.services.identity.PersistentIdentityService +import net.corda.node.utilities.CertificateType +import net.corda.node.utilities.CordaPersistence +import net.corda.node.utilities.X509Utilities +import net.corda.testing.* +import net.corda.testing.node.MockServices +import org.bouncycastle.asn1.x500.X500Name +import org.junit.After +import org.junit.Before +import org.junit.Test +import java.security.cert.CertificateFactory +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith +import kotlin.test.assertNull + +/** + * Tests for the in memory identity service. + */ +class PersistentIdentityServiceTests { + + lateinit var database: CordaPersistence + lateinit var services: MockServices + lateinit var identityService: IdentityService + + @Before + fun setup() { + val databaseAndServices = MockServices.makeTestDatabaseAndMockServices(keys = emptyList(), createIdentityService = { PersistentIdentityService(trustRoot = DUMMY_CA.certificate) }) + database = databaseAndServices.first + services = databaseAndServices.second + identityService = services.identityService + } + + @After + fun shutdown() { + database.close() + } + + @Test + fun `get all identities`() { + // Nothing registered, so empty set + database.transaction { + assertNull(identityService.getAllIdentities().firstOrNull()) + } + + database.transaction { + identityService.verifyAndRegisterIdentity(ALICE_IDENTITY) + } + var expected = setOf(ALICE) + var actual = database.transaction { + identityService.getAllIdentities().map { it.party }.toHashSet() + } + assertEquals(expected, actual) + + // Add a second party and check we get both back + database.transaction { + identityService.verifyAndRegisterIdentity(BOB_IDENTITY) + } + expected = setOf(ALICE, BOB) + actual = database.transaction { + identityService.getAllIdentities().map { it.party }.toHashSet() + } + assertEquals(expected, actual) + } + + @Test + fun `get identity by key`() { + database.transaction { + assertNull(identityService.partyFromKey(ALICE_PUBKEY)) + identityService.verifyAndRegisterIdentity(ALICE_IDENTITY) + assertEquals(ALICE, identityService.partyFromKey(ALICE_PUBKEY)) + assertNull(identityService.partyFromKey(BOB_PUBKEY)) + } + } + + @Test + fun `get identity by name with no registered identities`() { + database.transaction { + assertNull(identityService.partyFromX500Name(ALICE.name)) + } + } + + @Test + fun `get identity by substring match`() { + database.transaction { + identityService.verifyAndRegisterIdentity(ALICE_IDENTITY) + identityService.verifyAndRegisterIdentity(BOB_IDENTITY) + } + val alicente = getTestPartyAndCertificate(X500Name("O=Alicente Worldwide,L=London,C=GB"), generateKeyPair().public) + database.transaction { + identityService.verifyAndRegisterIdentity(alicente) + assertEquals(setOf(ALICE, alicente.party), identityService.partiesFromName("Alice", false)) + assertEquals(setOf(ALICE), identityService.partiesFromName("Alice Corp", true)) + assertEquals(setOf(BOB), identityService.partiesFromName("Bob Plc", true)) + } + } + + @Test + fun `get identity by name`() { + val identities = listOf("Node A", "Node B", "Node C") + .map { getTestPartyAndCertificate(X500Name("CN=$it,O=R3,OU=corda,L=London,C=GB"), generateKeyPair().public) } + database.transaction { + assertNull(identityService.partyFromX500Name(identities.first().name)) + } + identities.forEach { + database.transaction { + identityService.verifyAndRegisterIdentity(it) + } + } + identities.forEach { + database.transaction { + assertEquals(it.party, identityService.partyFromX500Name(it.name)) + } + } + } + + /** + * Generate a certificate path from a root CA, down to a transaction key, store and verify the association. + */ + @Test + fun `assert unknown anonymous key is unrecognised`() { + withTestSerialization { + val rootKey = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) + val rootCert = X509Utilities.createSelfSignedCACertificate(ALICE.name, rootKey) + val txKey = Crypto.generateKeyPair(X509Utilities.DEFAULT_IDENTITY_SIGNATURE_SCHEME) + val identity = Party(rootCert) + val txIdentity = AnonymousParty(txKey.public) + + assertFailsWith { + database.transaction { + identityService.assertOwnership(identity, txIdentity) + } + } + } + } + + /** + * Generate a pair of certificate paths from a root CA, down to a transaction key, store and verify the associations. + * Also checks that incorrect associations are rejected. + */ + @Test + fun `get anonymous identity by key`() { + val trustRoot = DUMMY_CA + val (alice, aliceTxIdentity) = createParty(ALICE.name, trustRoot) + val (_, bobTxIdentity) = createParty(ALICE.name, trustRoot) + + // Now we have identities, construct the service and let it know about both + database.transaction { + identityService.verifyAndRegisterIdentity(alice) + identityService.verifyAndRegisterIdentity(aliceTxIdentity) + } + + var actual = database.transaction { + identityService.certificateFromKey(aliceTxIdentity.party.owningKey) + } + assertEquals(aliceTxIdentity, actual!!) + + database.transaction { + assertNull(identityService.certificateFromKey(bobTxIdentity.party.owningKey)) + } + database.transaction { + identityService.verifyAndRegisterIdentity(bobTxIdentity) + } + actual = database.transaction { + identityService.certificateFromKey(bobTxIdentity.party.owningKey) + } + assertEquals(bobTxIdentity, actual!!) + } + + /** + * Generate a pair of certificate paths from a root CA, down to a transaction key, store and verify the associations. + * Also checks that incorrect associations are rejected. + */ + @Test + fun `assert ownership`() { + withTestSerialization { + val trustRoot = DUMMY_CA + val (alice, anonymousAlice) = createParty(ALICE.name, trustRoot) + val (bob, anonymousBob) = createParty(BOB.name, trustRoot) + + database.transaction { + // Now we have identities, construct the service and let it know about both + identityService.verifyAndRegisterIdentity(anonymousAlice) + identityService.verifyAndRegisterIdentity(anonymousBob) + } + + // Verify that paths are verified + database.transaction { + identityService.assertOwnership(alice.party, anonymousAlice.party.anonymise()) + identityService.assertOwnership(bob.party, anonymousBob.party.anonymise()) + } + assertFailsWith { + database.transaction { + identityService.assertOwnership(alice.party, anonymousBob.party.anonymise()) + } + } + assertFailsWith { + database.transaction { + identityService.assertOwnership(bob.party, anonymousAlice.party.anonymise()) + } + } + + assertFailsWith { + val owningKey = Crypto.decodePublicKey(trustRoot.certificate.subjectPublicKeyInfo.encoded) + database.transaction { + identityService.assertOwnership(Party(trustRoot.certificate.subject, owningKey), anonymousAlice.party.anonymise()) + } + } + } + } + + @Test + fun `Test Persistence`() { + val trustRoot = DUMMY_CA + val (alice, anonymousAlice) = createParty(ALICE.name, trustRoot) + val (bob, anonymousBob) = createParty(BOB.name, trustRoot) + + database.transaction { + // Register well known identities + identityService.verifyAndRegisterIdentity(alice) + identityService.verifyAndRegisterIdentity(bob) + // Register an anonymous identities + identityService.verifyAndRegisterIdentity(anonymousAlice) + identityService.verifyAndRegisterIdentity(anonymousBob) + } + + // Create new identity service mounted onto same DB + val newPersistentIdentityService = database.transaction { + PersistentIdentityService(trustRoot = DUMMY_CA.certificate) + } + + database.transaction { + newPersistentIdentityService.assertOwnership(alice.party, anonymousAlice.party.anonymise()) + newPersistentIdentityService.assertOwnership(bob.party, anonymousBob.party.anonymise()) + } + + val aliceParent = database.transaction { + newPersistentIdentityService.partyFromAnonymous(anonymousAlice.party.anonymise()) + } + assertEquals(alice.party, aliceParent!!) + + val bobReload = database.transaction { + newPersistentIdentityService.certificateFromKey(anonymousBob.party.owningKey) + } + assertEquals(anonymousBob, bobReload!!) + } + + private fun createParty(x500Name: X500Name, ca: CertificateAndKeyPair): Pair { + val certFactory = CertificateFactory.getInstance("X509") + val issuerKeyPair = generateKeyPair() + val issuer = getTestPartyAndCertificate(x500Name, issuerKeyPair.public, ca) + val txKey = Crypto.generateKeyPair() + val txCert = X509Utilities.createCertificate(CertificateType.IDENTITY, issuer.certificate, issuerKeyPair, x500Name, txKey.public) + val txCertPath = certFactory.generateCertPath(listOf(txCert.cert) + issuer.certPath.certificates) + return Pair(issuer, PartyAndCertificate(txCertPath)) + } + + /** + * Ensure if we feed in a full identity, we get the same identity back. + */ + @Test + fun `deanonymising a well known identity`() { + val expected = ALICE + val actual = database.transaction { + identityService.partyFromAnonymous(expected) + } + assertEquals(expected, actual) + } +} diff --git a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt index 757cf2cd91..1e5670c7ac 100644 --- a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt @@ -92,8 +92,10 @@ class FlowFrameworkTests { // We don't create a network map, so manually handle registrations val nodes = listOf(node1, node2, notary1, notary2) nodes.forEach { node -> - nodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> - node.services.identityService.verifyAndRegisterIdentity(identity) + node.database.transaction { + nodes.map { it.services.myInfo.legalIdentityAndCert }.forEach { identity -> + node.services.identityService.verifyAndRegisterIdentity(identity) + } } } } @@ -170,6 +172,7 @@ class FlowFrameworkTests { node3.services.startFlow(flow) assertEquals(false, flow.flowStarted) // Not started yet as no network activity has been allowed yet node3.disableDBCloseOnStop() + node3.services.networkMapCache.clearNetworkMapCache() // zap persisted NetworkMapCache to force use of network. node3.stop() node3 = mockNet.createNode(node1.network.myAddress, node3.id) @@ -179,6 +182,7 @@ class FlowFrameworkTests { node3.smm.executor.flush() assertEquals(true, restoredFlow.flowStarted) // Now we should have run the flow and hopefully cleared the init checkpoint node3.disableDBCloseOnStop() + node3.services.networkMapCache.clearNetworkMapCache() // zap persisted NetworkMapCache to force use of network. node3.stop() // Now it is completed the flow should leave no Checkpoint. diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt index a09fa66682..021a787e6a 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt @@ -43,11 +43,6 @@ class IRSSimulation(networkSendManuallyPumped: Boolean, runAsync: Boolean, laten private val executeOnNextIteration = Collections.synchronizedList(LinkedList<() -> Unit>()) override fun startMainSimulation(): CompletableFuture { - // TODO: Determine why this isn't happening via the network map - mockNet.nodes.map { it.services.identityService }.forEach { service -> - mockNet.nodes.forEach { node -> service.verifyAndRegisterIdentity(node.info.legalIdentityAndCert) } - } - om = JacksonSupport.createInMemoryMapper(InMemoryIdentityService((banks + regulators + networkMap).map { it.info.legalIdentityAndCert }, trustRoot = DUMMY_CA.certificate)) registerFinanceJSONMappers(om) diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt index 75590b6784..935455c67d 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt @@ -3,8 +3,6 @@ package net.corda.testing.node import com.google.common.jimfs.Configuration.unix import com.google.common.jimfs.Jimfs import com.nhaarman.mockito_kotlin.whenever -import net.corda.core.utilities.CertificateAndKeyPair -import net.corda.core.utilities.cert import net.corda.core.crypto.entropyToKeyPair import net.corda.core.crypto.random63BitValue import net.corda.core.identity.PartyAndCertificate @@ -18,12 +16,10 @@ import net.corda.core.node.CordaPluginRegistry import net.corda.core.node.ServiceEntry import net.corda.core.node.WorldMapLocation import net.corda.core.node.services.* -import net.corda.core.utilities.NetworkHostAndPort -import net.corda.core.utilities.getOrThrow -import net.corda.core.utilities.loggerFor +import net.corda.core.utilities.* import net.corda.node.internal.AbstractNode import net.corda.node.services.config.NodeConfiguration -import net.corda.node.services.identity.InMemoryIdentityService +import net.corda.node.services.identity.PersistentIdentityService import net.corda.node.services.keys.E2ETestKeyManagementService import net.corda.node.services.messaging.MessagingService import net.corda.node.services.network.InMemoryNetworkMapService @@ -32,6 +28,7 @@ import net.corda.node.services.transactions.* import net.corda.node.utilities.AffinityExecutor import net.corda.node.utilities.AffinityExecutor.ServiceAffinityExecutor import net.corda.testing.* +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties import org.apache.activemq.artemis.utils.ReusableLatch import org.bouncycastle.asn1.x500.X500Name import org.slf4j.Logger @@ -41,7 +38,6 @@ import java.security.KeyPair import java.security.cert.X509Certificate import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger -import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties /** * A mock node brings up a suite of in-memory services in a fast manner suitable for unit testing. @@ -69,7 +65,6 @@ class MockNetwork(private val networkSendManuallyPumped: Boolean = false, val messagingNetwork = InMemoryMessagingNetwork(networkSendManuallyPumped, servicePeerAllocationStrategy, busyLatch) // A unique identifier for this network to segregate databases with the same nodeID but different networks. private val networkId = random63BitValue() - private val identities = mutableListOf() private val _nodes = mutableListOf() /** A read only view of the current set of executing nodes. */ val nodes: List get() = _nodes @@ -169,8 +164,17 @@ class MockNetwork(private val networkSendManuallyPumped: Boolean = false, val caCertificates: Array = listOf(legalIdentity.certificate.cert, clientCa?.certificate?.cert) .filterNotNull() .toTypedArray() - return InMemoryIdentityService((mockNet.identities + info.legalIdentityAndCert).toSet(), + val identityService = PersistentIdentityService(setOf(info.legalIdentityAndCert), trustRoot = trustRoot, caCertificates = *caCertificates) + services.networkMapCache.partyNodes.forEach { identityService.verifyAndRegisterIdentity(it.legalIdentityAndCert) } + services.networkMapCache.changed.subscribe { mapChange -> + // TODO how should we handle network map removal + if (mapChange is NetworkMapCache.MapChange.Added) { + identityService.verifyAndRegisterIdentity(mapChange.node.legalIdentityAndCert) + } + } + + return identityService } override fun makeKeyManagementService(identityService: IdentityService): KeyManagementService { @@ -218,11 +222,6 @@ class MockNetwork(private val networkSendManuallyPumped: Boolean = false, override fun myAddresses() = emptyList() - override fun start() { - super.start() - mockNet.identities.add(info.legalIdentityAndCert) - } - // Allow unit tests to modify the plugin list before the node start, // so they don't have to ServiceLoad test plugins into all unit tests. val testPluginRegistries = super.pluginRegistries.toMutableList() @@ -365,9 +364,6 @@ class MockNetwork(private val networkSendManuallyPumped: Boolean = false, repeat(numPartyNodes) { nodes += createPartyNode(mapAddress) } - nodes.forEach { itNode -> - nodes.map { it.info.legalIdentityAndCert }.map(itNode.services.identityService::verifyAndRegisterIdentity) - } return BasketOfNodes(nodes, notaryNode, mapNode) } diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt index ca9f7e5632..6511f99366 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt @@ -108,9 +108,11 @@ open class MockServices(vararg val keys: KeyPair) : ServiceHub { val dataSourceProps = makeTestDataSourceProperties() val databaseProperties = makeTestDatabaseProperties() val createSchemaService = { NodeSchemaService(customSchemas) } - val database = configureDatabase(dataSourceProps, databaseProperties, createSchemaService, createIdentityService) + val identityServiceRef: IdentityService by lazy { createIdentityService() } + val database = configureDatabase(dataSourceProps, databaseProperties, createSchemaService, { identityServiceRef }) val mockService = database.transaction { object : MockServices(*(keys.toTypedArray())) { + override val identityService: IdentityService = database.transaction { identityServiceRef } override val vaultService: VaultService = makeVaultService(database.hibernateConfig) override fun recordTransactions(notifyVault: Boolean, txs: Iterable) { @@ -146,8 +148,8 @@ open class MockServices(vararg val keys: KeyPair) : ServiceHub { override val attachments: AttachmentStorage = MockAttachmentStorage() override val validatedTransactions: WritableTransactionStorage = MockTransactionStorage() val stateMachineRecordedTransactionMapping: StateMachineRecordedTransactionMappingStorage = MockStateMachineRecordedTransactionMappingStorage() - override final val identityService: IdentityService = InMemoryIdentityService(MOCK_IDENTITIES, trustRoot = DUMMY_CA.certificate) - override val keyManagementService: KeyManagementService = MockKeyManagementService(identityService, *keys) + override val identityService: IdentityService = InMemoryIdentityService(MOCK_IDENTITIES, trustRoot = DUMMY_CA.certificate) + override val keyManagementService: KeyManagementService by lazy { MockKeyManagementService(identityService, *keys) } override val vaultService: VaultService get() = throw UnsupportedOperationException() override val contractUpgradeService: ContractUpgradeService = ContractUpgradeServiceImpl() From 0831fdfd4f1fa4623853e8edfa18547066f88e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Pla=CC=81s=CC=8Cil?= Date: Fri, 25 Aug 2017 17:46:16 +0800 Subject: [PATCH 083/120] Add basic Raft cluster status metrics --- .../transactions/RaftUniquenessProvider.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt b/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt index 69254beeee..afcb08e57c 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt @@ -1,5 +1,6 @@ package net.corda.node.services.transactions +import com.codahale.metrics.Gauge import io.atomix.catalyst.buffer.BufferInput import io.atomix.catalyst.buffer.BufferOutput import io.atomix.catalyst.serializer.Serializer @@ -94,6 +95,22 @@ class RaftUniquenessProvider(services: ServiceHubInternal) : UniquenessProvider, private lateinit var _clientFuture: CompletableFuture private lateinit var server: CopycatServer + + + init { + services.monitoringService.metrics.register("RaftCluster.ThisServerStatus", Gauge { + server.state().name + }) + + services.monitoringService.metrics.register("RaftCluster.MembersCount", Gauge { + server.cluster().members().size + }) + + services.monitoringService.metrics.register("RaftCluster.Members", Gauge> { + server.cluster().members().map { it.address().toString() } + }) + } + /** * Copycat clients are responsible for connecting to the cluster and submitting commands and queries that operate * on the cluster's replicated state machine. From b6e8b05deaf475c42c80052ce16ed33c41d98f1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Pla=CC=81s=CC=8Cil?= Date: Wed, 30 Aug 2017 15:28:14 +0800 Subject: [PATCH 084/120] Raft JMX reporting: initialize after server is created --- .../transactions/RaftUniquenessProvider.kt | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt b/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt index afcb08e57c..ed349f1cc6 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/RaftUniquenessProvider.kt @@ -46,7 +46,7 @@ import javax.persistence.Lob * to the cluster leader to be actioned. */ @ThreadSafe -class RaftUniquenessProvider(services: ServiceHubInternal) : UniquenessProvider, SingletonSerializeAsToken() { +class RaftUniquenessProvider(private val services: ServiceHubInternal) : UniquenessProvider, SingletonSerializeAsToken() { companion object { private val log = loggerFor() @@ -97,20 +97,6 @@ class RaftUniquenessProvider(services: ServiceHubInternal) : UniquenessProvider, private lateinit var server: CopycatServer - init { - services.monitoringService.metrics.register("RaftCluster.ThisServerStatus", Gauge { - server.state().name - }) - - services.monitoringService.metrics.register("RaftCluster.MembersCount", Gauge { - server.cluster().members().size - }) - - services.monitoringService.metrics.register("RaftCluster.Members", Gauge> { - server.cluster().members().map { it.address().toString() } - }) - } - /** * Copycat clients are responsible for connecting to the cluster and submitting commands and queries that operate * on the cluster's replicated state machine. @@ -165,6 +151,8 @@ class RaftUniquenessProvider(services: ServiceHubInternal) : UniquenessProvider, server.bootstrap() } + registerMonitoring() + val client = CopycatClient.builder(address) .withTransport(transport) // TODO: use local transport for client-server communications .withConnectionStrategy(ConnectionStrategies.EXPONENTIAL_BACKOFF) @@ -196,6 +184,21 @@ class RaftUniquenessProvider(services: ServiceHubInternal) : UniquenessProvider, .build() } + private fun registerMonitoring() { + services.monitoringService.metrics.register("RaftCluster.ThisServerStatus", Gauge { + server.state().name + }) + + services.monitoringService.metrics.register("RaftCluster.MembersCount", Gauge { + server.cluster().members().size + }) + + services.monitoringService.metrics.register("RaftCluster.Members", Gauge> { + server.cluster().members().map { it.address().toString() } + }) + } + + override fun commit(states: List, txId: SecureHash, callerIdentity: Party) { val entries = states.mapIndexed { i, stateRef -> stateRef to UniquenessProvider.ConsumingTx(txId, i, callerIdentity) } From 81d83d707f8b21cb7c0fc95fce2bde86eff3c0f7 Mon Sep 17 00:00:00 2001 From: Varun Mathur Date: Fri, 1 Sep 2017 15:27:55 +0100 Subject: [PATCH 085/120] fix typo in notary docs --- docs/source/using-a-notary.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/using-a-notary.rst b/docs/source/using-a-notary.rst index 4c109de85f..3f4bddd7b9 100644 --- a/docs/source/using-a-notary.rst +++ b/docs/source/using-a-notary.rst @@ -33,7 +33,7 @@ The first step is to obtain the notary identity -- ``Party``: .. sourcecode:: kotlin - val ourNotary: Party = serviceHub.networkMapCache.getNotary("Central Bank Notary") + val ourNotary: Party = serviceHub.networkMapCache.getNotary("Notary A") Then we initialise the transaction builder: From 17f7e391836fa3138418af8de72d0d12700ce0cf Mon Sep 17 00:00:00 2001 From: joeldudleyr3 Date: Mon, 4 Sep 2017 17:07:40 +0100 Subject: [PATCH 086/120] Makes set-up instructions clearer. Addresses a zsh-related bug. --- docs/source/getting-set-up.rst | 50 +++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/docs/source/getting-set-up.rst b/docs/source/getting-set-up.rst index 8164e4e89a..510dcc43ae 100644 --- a/docs/source/getting-set-up.rst +++ b/docs/source/getting-set-up.rst @@ -33,17 +33,25 @@ others to provide support. However, if you do use other tools, we'd be intereste Set-up instructions ------------------- -The instructions below will allow you to set up a Corda development environment and run a basic CorDapp on a Windows -or Mac machine. If you have any issues, please consult the :doc:`troubleshooting` page, or reach out on -`Slack `_ or the `forums `_. +The instructions below will allow you to set up a Corda development environment and run a basic CorDapp. If you have +any issues, please consult the :doc:`troubleshooting` page, or reach out on `Slack `_, +`Stack Overflow `_ or the `forums `_. -.. note:: The set-up instructions are also available in video form for both `Windows `_ and `Mac `_. +The set-up instructions are available for the following platforms: + +* :ref:`windows-label` (or `in video form `_) + +* :ref:`mac-label` (or `in video form `_) + +.. _windows-label: Windows -^^^^^^^ +------- + +.. warning:: If you are using a Mac machine, please follow the :ref:`mac-label` instructions instead. Java -~~~~ +^^^^ 1. Visit http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2. Scroll down to "Java SE Development Kit 8uXXX" (where "XXX" is the latest minor version number) 3. Toggle "Accept License Agreement" @@ -52,34 +60,34 @@ Java 6. Open a new command prompt and run ``java -version`` to test that Java is installed correctly Git -~~~ +^^^ 1. Visit https://git-scm.com/download/win 2. Click the "64-bit Git for Windows Setup" download link. 3. Download and run the executable to install Git (use the default settings) 4. Open a new command prompt and type ``git --version`` to test that git is installed correctly IntelliJ -~~~~~~~~ +^^^^^^^^ 1. Visit https://www.jetbrains.com/idea/download/download-thanks.html?code=IIC 2. Download and run the executable to install IntelliJ Community Edition (use the default settings) Download a sample project -~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Open a command prompt 2. Clone the CorDapp tutorial repo by running ``git clone https://github.com/corda/cordapp-tutorial`` 3. Move into the cordapp-tutorial folder by running ``cd cordapp-tutorial`` -4. Retrieve a list of all the milestone (i.e. stable) releases by running ``git branch -a --list *release-M*`` +4. Retrieve a list of all the releases by running ``git branch -a --list`` 5. Check out the latest milestone release by running ``git checkout release-MX`` (where "X" is the latest milestone) Run from the command prompt -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. From the cordapp-tutorial folder, deploy the nodes by running ``gradlew deployNodes`` 2. Start the nodes by running ``call kotlin-source/build/nodes/runnodes.bat`` 3. Wait until all the terminal windows display either "Webserver started up in XX.X sec" or "Node for "NodeC" started up and registered in XX.XX sec" 4. Test the CorDapp is running correctly by visiting the front end at http://localhost:10007/web/example/ Run from IntelliJ -~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^ 1. Open IntelliJ Community Edition 2. On the splash screen, click "Open" (do NOT click "Import Project") and select the cordapp-tutorial folder @@ -92,11 +100,15 @@ Run from IntelliJ 7. Wait until the run windows displays the message "Webserver started up in XX.X sec" 8. Test the CorDapp is running correctly by visiting the front end at http://localhost:10007/web/example/ +.. _mac-label: + Mac -^^^ +--- + +.. warning:: If you are using a Windows machine, please follow the :ref:`windows-label` instructions instead. Java -~~~~ +^^^^ 1. Open "System Preferences > Java" 2. In the Java Control Panel, if an update is available, click "Update Now" 3. In the "Software Update" window, click "Install Update". If required, enter your password and click "Install Helper" when prompted @@ -104,27 +116,27 @@ Java 5. Open a new terminal and type ``java -version`` to test that Java is installed correctly IntelliJ -~~~~~~~~ +^^^^^^^^ 1. Visit https://www.jetbrains.com/idea/download/download-thanks.html?platform=mac&code=IIC 2. Download and run the executable to install IntelliJ Community Edition (use the default settings) Download a sample project -~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Open a terminal 2. Clone the CorDapp tutorial repo by running ``git clone https://github.com/corda/cordapp-tutorial`` 3. Move into the cordapp-tutorial folder by running ``cd cordapp-tutorial`` -4. Retrieve a list of all the milestone (i.e. stable) releases by running ``git branch -a --list *release-M*`` +4. Retrieve a list of all the releases by running ``git branch -a --list`` 5. Check out the latest milestone release by running ``git checkout release-MX`` (where "X" is the latest milestone) Run from the terminal -~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^ 1. From the cordapp-tutorial folder, deploy the nodes by running ``./gradlew deployNodes`` 2. Start the nodes by running ``kotlin-source/build/nodes/runnodes``. Do not click while 8 additional terminal windows start up. 3. Wait until all the terminal windows display either "Webserver started up in XX.X sec" or "Node for "NodeC" started up and registered in XX.XX sec" 4. Test the CorDapp is running correctly by visiting the front end at http://localhost:10007/web/example/ Run from IntelliJ -~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^ 1. Open IntelliJ Community Edition 2. On the splash screen, click "Open" (do NOT click "Import Project") and select the cordapp-tutorial folder 3. Once the project is open, click "File > Project Structure". Under "Project SDK:", set the project SDK by clicking "New...", clicking "JDK", and navigating to /Library/Java/JavaVirtualMachines/jdk1.8.0_XXX (where "XXX" is the latest minor version number). Click "OK". From 875cfabd50346ffbf46b584fa3b4f3c0ca5ecaba Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Tue, 5 Sep 2017 11:34:55 +0100 Subject: [PATCH 087/120] Make SignedTransaction serializable and fix a test by adjusting constructor (#1420) --- .../kotlin/net/corda/core/transactions/SignedTransaction.kt | 1 + .../test/kotlin/net/corda/core/utilities/KotlinUtilsTest.kt | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/transactions/SignedTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/SignedTransaction.kt index 1d25d5e4fb..7da67105f1 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/SignedTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/SignedTransaction.kt @@ -30,6 +30,7 @@ import java.util.function.Predicate * sign. */ // DOCSTART 1 +@CordaSerializable data class SignedTransaction(val txBits: SerializedBytes, override val sigs: List ) : TransactionWithSignatures { diff --git a/core/src/test/kotlin/net/corda/core/utilities/KotlinUtilsTest.kt b/core/src/test/kotlin/net/corda/core/utilities/KotlinUtilsTest.kt index ae4a67c093..60bfdd8369 100644 --- a/core/src/test/kotlin/net/corda/core/utilities/KotlinUtilsTest.kt +++ b/core/src/test/kotlin/net/corda/core/utilities/KotlinUtilsTest.kt @@ -52,8 +52,7 @@ class KotlinUtilsTest : TestDependencyInjectionBase() { } @CordaSerializable - private class CapturingTransientProperty(prefix: String) { - private val seed = random63BitValue() + private class CapturingTransientProperty(val prefix: String, val seed: Long = random63BitValue()) { val transientVal by transient { prefix + seed + random63BitValue() } } } \ No newline at end of file From 3b789b5c2f4f484b3f310a0f1360828479513a6b Mon Sep 17 00:00:00 2001 From: mkit Date: Tue, 5 Sep 2017 12:58:23 +0100 Subject: [PATCH 088/120] Restoring lib/quasar.jar from repo (#1389) * Removing lib/quasar.jar from repo * Restoring quasar.jar --- lib/quasar.jar | Bin 0 -> 1272691 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/quasar.jar diff --git a/lib/quasar.jar b/lib/quasar.jar new file mode 100644 index 0000000000000000000000000000000000000000..c9f0010e79ccfcd54dc5740c3b10de9ffba7adad GIT binary patch literal 1272691 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

)PSR) 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

NpJt|sYz6;@X1hxQ=d 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®7>DDtMO|UE#kb6ghzEb=j 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 z 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

*=J_=E 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

Nw5r`!Ky@%IqS7g0BNMp* zmSLvE%7)IeUdv0f5VybQC6=Z3WoX6?E92o+v;7+syOCWukbO>FDMsy%tyb14gt$#Ep2!RGxY!_lt?t@91$Q15WMJOh4=Ku zJ;d{5h?kI*jTc8JjkD8xY)Z3uV z65H?i@VxQy58__#=QGOJ5V&8xNo0WQYw&kbHdhidOCsv>3D|LA1&>WJ7!@6H5Tr#6r_o?e$Ld-(OlNfeI&9zGkc-+Vs&=!=VHDf zcTXzS5YX@wtFDD=8xa5DgqvnTG2KP26}V2{PHU;(qDwiO$x)J4A-EKiT)<5iZ!dKw z$lUS!s(Qr^OfrFows>f%oZ3NZayCT`bfetXE}{%l@@!@6=a!pKx$(W#0yVjm;B05F zwy)=3zvKNt>0eiHkW?Yu?hRQ%tUk>xa#?E4c(vsxC2=!ZaEV3OK*ST9@S9eTAEN-v zxMyQK@&NgH#&I2?#iQL4$>y5V5o5ai%)m0jB?&`M^VqGyy@CY+1n@bzuqU zh@(HiWLB$Pf(yUS5vNf*FR4&_YQlXVM27v0J8jgGLH$}?< zlpWuS&C!51pXI@Tkmu?^$OvL_=AVGVxeq$ZqYb^lGBYn%2KOrZ)2V~!1}+Xyuo;@A zj2Jm;*ZY<`OK(|-zF=#6u3au~4~jumZEG+?ix5omorUnbkLpjp>MUPfLL((mHm*UE z)dVQ%{6vhmI3TwU{-acQMq#NYp`z4bY=Vz+>B-od^+73bqfe%!dsN(S0E@cNq%gx9 z2=?0&pPM_J&%+s1(Aq_rn0XZWEeU@1!GHi?I5eDT)W(y=-&~x%sbMW&Bxo zp;~vWk7lwCE*Me`RrG$c*qa?Dh?*E)FCOa-lkpm^N7?R2fQf|u^E023(K=Ik0KV_- z2w=0hYUMZX>->NHY^=QY=CNBtZp9U(9#jMQ$ZP>)Czh!Uaoiu zG2l>_cu5y1o#)2X5HEP2O2xa65EBEJL8XQXd~y*YQRP4n*a<1zgKEdsyzx#EiWd!R zPROq{{O31J33`wQcxFaJlVy)`?heFOzH@KRGZ~Fitc5SUG!>3=EXKM`_O%Uje0rdV0EqD!s-1L#Jnnc7=zv1U z4}{U0vYitswMWAVRI2`h&}%YV@AXG76>$Z^dSdFXQ)#a_57nR!Rp*%7bTu0+I#UGhsP7!2awhVn!|y;Fk=5W&$bLkxdS({gyFG z;t;h=UZz)viZ%xGQ*Mm}$1f;s3_5hfog{^-SEf@~pLXVjt8fuQ&r)U`ke<4II>m9~ zHMw{QoAYdrR^7iGb{Kxs9Riz0*+LG0ip9NjHmHR#Wk8pXgHZ!xQH1dX$)o83yB1gl z>pIhCuYa9@N#Fe%UXFR~gD4PNMGuZ|R9&}36J|`!cS68&LUQz4MXrUNRD~C+0~XoS z$BdFB8HYvG5p<#6JSr6Dg?%|wy;Bo3&pRJ5q&EU>I_G#iQt(FcOgVJK1XR@b_(0&B$h?H*aQhz64SGe4|JCR0?eFK?|ZK0~@~pHt$w}aQ zbVCo_S6FF3$tD=ooeYpd{^3!c!Atx~{WUjzWOARWDIH5@CxijV?ypNq3YGv|v0AWe z+L}FyE2RHvI=D$xwX}<5>s!`&2|+7vhmm{2SCj zEK&TUFSL8xPo ziJ!OB7Oz4(^)fhXw#b-?{fy8M8D?Q2G50O=vF41oO{Dv;u*8NBf8-*q96s+OpW_C? z-?~ZXncWh6@{G8n9LP8#d;Dn;uw@>9eNYDc%{+Yh<~sa=JnIVsenaPd30Ie`QCdZh zOx0@-#H-*A#U=ZYQ~uJewlX~vnh`-+VDvCe$d>NN9(K}ajxX7~e;3w=n@(Pl8`g)q zFZ4zy&ar4sdthaDF^sz8o0)1j6EsH{@}$N&ew{`y^W%>iX9Oti(g{5-iCv9T+Qd8v zJ6FYOwU)?2(vw+6)|)800ERo>TR?Fv=D1fd5J=R=WBqIVBzmKz8-JUh*E+<>K%GhN zyKI1HO9@Phn4QMs)4L}LV-nk0Op+^b7G3%eR0KBI-+`XcpZ9yS+Xx)1Nr}bvj=^KI zkb_Z0e~~BDivq?5gx#DFIUotjkZ7xurJW=~rVDpMdXQPzS>KR(09pv2ea&exK@mhD zc6-ly+%6e9xq#nuAJE`^{{%rmhmL|~5jJx_%mg$xql82cd`i4wZqGR}^SSji>cj{) zb22uwx_R;E1WM-S{P)C95rAc`m_oOsf@yP|kuR+Kj6L6#2FEv_F)YWC&5fT16VoDLYQjuZb8RC^RX-i_z z)W&#?I)Zp95z81T=4s34;)6W=H^clrI{x>F)-fp zNzJREJ*1tsKiGiUZtbrrIYqAG0lVyvmDXH<+V*67K{SFvQD`~_;-$}Q1@(e+*P_&6 z5)3&eogv%vuSPDN2Sl28WWRjgc%?br{FXpd-NGJxQzQzx`HPFz`!_&@@Mr9|Km7n~ zO3OhyR^z&3$hjc!q6m5|V()RBne$H<#?9~)^B+?+Ad@|fck-n3aMhMxT4&qgTk~~& zbtilYbZZJ7w9SuHbW0{M9^H2rEY2O#cB@VmW7=87z>?FHt;j9DpcqWT5GP=ID-016 zJI7v^FMvPRuw<4)K-aAw^TYFq}SQ6FKC7dKj^Q`*Q-RX8h3elu|P^VM!mY4yLL}*T$|Az*T%!N z@7-TNzg6vizzuL+XWYIs(%cczr3pz%$i|^57?q|04Xk+(8H>f~YH>|cGNe#ip)xUP zJmHdcf8x)GQ<-N61$tPED{%S52SgJGO5Uu?uBgopd6wHC^&cSNuA{w^Y zD)bC9n5x10GIV}2)gQkT!;MJwU4&af%@j>KrvPK?EW;d?Bc_@uLnU56;gh!((6eH} zlwYZj!*skqx`|BrZc9 zdwm#tS&qlpoq=dR{?#zZ`}-2L{?6GGR61fxEn)sig28Ra7?@U!>8M$;C~$u7O$&-b zK!HjCGnTr-vrj31`+y@m)N&SIbtN0sL8^3sOFPVgmZGaP@rkZ*z!2@szVKUI)qre? zDCPK1zVFFcR0#(zPn(Q2hg_g^=&kZGp`a^|aK4>7M5iMH$C!Nu!K=ihPcV*4V{caZ z0;gLdpXRt-m)51;w+N#owMpxd(48p_o$NF(JjK>zgzys~P%=l8mg=BdYDQ1P3)uzB zMHCIj11H_NU13c#TIvHqX$?|hpP-uDs}oe(!%LzZ-MzVsN~TB6Zf1H_E1O)WqxQ@E zD<*)vH07T^wi4phXa4u5B*K4w6zUJCT;+opO-en$D}Et>80~+wGnX_ck(XI=4ROjG z3)La$nj{sKjR?Mj*PBqUS!SfynMM{PIBcbZJl`jV?kvps{S_+uvMe$uzbD9{80MGavIfKDRS=cRkG>Q)1=`VEY@0R(#v~B{ zGJ9TfMrQtEZ6F#M>~AEDE<}FF`92QJGQ4k~Nj9fe5-&>(+tK{qNQAzqhQDz54A|8z z^o9?OnRmwAzcB&sFhDYcsb#r9SlEo4tuUrTTTrvGL9GKDb_RrP_?nqXPZ4&HhjO(? zAsE0#rYDDWTM^@*_)z~Pl<-SP^A}TOM=N`)<%J{b$z&lr&--wC?7|sEt+qf<;QUG; zjnZa3>H${dEgbNl5Q05O0p01UTI!{$SY~chT4rKVv&=kzoE%^+*Hne`doQ;GgCs0q z-ak@$Nna}%0=IsfUE`fF1#V7$^{BCVKR=({Nsm?*-f=B@rT}cB{_4s!>RpiYj)jYhOV@PUO@ZAJm z7Nxw`O6TrUTb=pAtSkzCP2U9UCZbIW#WaJFwBtQc_ws^4qCtwGrN%p^v=&+R(2*uw zzAW~MEoT1(eel`_1Yg10jaM=MR^qn%_<{{?8>oIByID7zc+jK+k#g4!ba6;=V?YNF zQJ<|n#KaAM6|T|LtkEe@7;;c2;hZGljKAy zan@m(`?D2{!zS)q36D(Fx?sOmvW_zWDwfg`(sy&?{X&f}j^VM4rE9*n@l>O|_KCh; z`8=`BHGO##lhXcscK#c*H$+YI`&x_h4kG#}&*oBcIx5+ZTVs5`=hy@@Ks0D_B}z!* zWXMn`bo8scfB(Vx&{q0(;aXiy?Y+hNk}|Hl$fMwc;Ku86$EGahGR_*ICJ|p?*R&Pq zV~v>k-#iu%2Hr<}Iss9XyqG9TsloM`v1#5P&s~BWS>|{fvN%>@tfXO_v!vPLcc&1i zy<-;b^bRzIgtmaKjo3oQ19O&6#YdQ?p@baiNkCTm+Ug8^{v0}Qy@*Aaa7qHjETL4T zuzW5Xooh0Lt47r{>kLPPb`;f8OJ+1BOFK$i(!)GcmOxD1WpuwCfOL}ixV*HHLw@GO ze?b_NE6fX?Y?0iwDh4%Qo(m(D64~weDC?Sc3QPAnrThs?FrsFebXu3@azL%$AdmYAJ9x5e0jb6Kn{;NRSb z(t%(wv}R?_w+-QowprY8Dw=*$?8#;A$@I|s>Iin(*ZaxX-urvp2UP=2G;s2SJeAko zd}I7ZCKy1pP58!kiK1JhtQQj#Ug^5&zlG(oXS%!glxhWbY1TK89s3h?NW9rJqBi^~ zc4>RY1(ISGF|(Jb(UPs9`dEsk5YLbD4~3o)aF?lP9oF}m1s$zSp?U`Pj)blWn&TM; z-tVGsFfS>TneF+@imS4-1DmRl98VlE*u>(4hF1K#J*r=PY*0Y=GAc$KLvSk8>Y7Q5 zsPjhv#3j+xx==u?p-V)ZecTad{(9e_@b`RnI`Ui5JYsTK9^4tU{EfU3hVTs&c=3As zIChb@i2c4C3l0+;N#N}sbKCa}OavHkHL2KcP*FD;{yLmm4$K&f&2mx5uJ)x>~2~5OKZdxnL8ox8uA1>oI()iZ0t{XyegH$5sZqbf0PRhkA_F~v!TIWFIoFhAj znAeEbWm8$nUtRD_r9M@^{(y|&D5@BfhTmnW#xWg%yE`83ooN!A|hR-rj< zW1@g?_i!AmxiM%~b(020p(!-0A~I`YAM?Ooc?UCMr9bFTCB?a}np3VWy<3D#e8+ol zr}TNOMMjG%Wf*iCD9zRxJ^~;7{Xgb`6xzS&%#nhDed?5DBqKNu3Q<-753eWRMo z%g2+Cw{eFnrfRS%ClTy474=mcn-$I~tvaL%k&DI*D6{NF7u&$G<+{?Vl^WXu@sgF= znC}o=T?fdnQ~9pBDLUF0&Td?~Bi^hli6EivE}p#*4$?I8pk9Y*X#KtgApqGq%2bm? zyDdqO!O0?4(AwhrIES7G#WI{q(Fk`8EG5%7h(dIrCyw}Zzap`bHf`rdCo*JLXJ4r(JIZI0YhSgL6QsjBNINd&TT`lDrJS^Nn zKaR(z%w3-M^%#GWY(cNO_`vL`@4`pCorPlv65tVEbm>cCYvtD4#Sw(m_5q<%_pnlC*d@CT5K>f25F1;ktTBXXJC*PiBAPr$v$oTh1mhOApQ9U?si3PFo9&Ipf*1A1W+2@Efa?1b9*mp790Ox4RygO&2)cWlcVR z>EE{BIJbVW!@$D!mR(Px3P!8dw}{%$+e{xGM2>%oRk6Qy<5HESY~&I3pwEUi{Xzs2 z&EEfOX9BNjuSkw2s~$_hA_|LquaUWK1ZGG)c#i-=a?p&HP?e2=YBHiqtqyqzwJInU zD#@ZmX4QvZZK_sHrr~H<3x$(9DV&%s^NO8I_bs_iuoofsOf`6CS!9?s2L>noUKqB~ zK@mPd4L}vi?1~P-)tD=@ZZ%GiV!ulvB&&r+9*C}9X}uvYOitIVj5#ot%(7&uh>?sv z;EP>a#78S0Zei-HJpS!YVsu__n$p&^c8K|;AS98eyk~H}*0r*uVkNkzf!siiM3;%H z%&l*;!T7d9GuLy`o|Lr=r&5P6B!fCAX^{*=v|$l%JlGWZwZclLO5^T8E}^l%s=#QU zVS4eoL;3Iz!VC~hfHq)0|I16z?`|AkJ`?zvHYBKRP!}8_HQ90T1_7_1qDo#ll!QcJ z_jcpfwFDRvYYa;Z>jRwvKMCV+B;)wUC2%Fjl!ria3=&-`7IH60=E#;*v=mt) zS6+t2-%+S`fe#{RHB!fz(pMB9cbrFZon#HCg5U?ZT|wa7A52T8F~0O&q46-+X5#>k zi8({m&9XG4xzo9zX9Po@PKWP7N7!GGWm@6!k#TS?hS3v9TG}?g7Z?-Q^><5sMugwb zA9^7p`^aB#>=VM6ZZIl~LxtoL*_IqJ9g2_n9`#`NJRf;exigCwdVi+I9!ZA*Rwbvp z#F=2e`qiA16=+ZvI@=q^*!nQSP!MmX!!%~!=OODvF9H*TPv?u7%3@j znH1#B5TD7e$oVt_2YVXj9-E;bjzAvioxD4Xz z-KzzWGf2%IHI@t#S_KX~HT?9e zfF0{kzn|t?SZP@(X<4Oa?&iAY7NfF;EqI3G9OOyR=RS4GH$wkB<&j148-bsbj4%lQ z>J9pDQ$PQkr}lrL#49zQf9k2@_$oSETu%OID@=5Ukom=^&6_1-MSWuOIlU-dpQxZ? zhjL@?oB%&Dw9Yr9go5ED{6&2BYt?U3Y=0GAyYM<|B|X9q$d9kSe{M>*U$cI)tptO9 zPbXx$Tt507>2BR+v0Zify>ozZZC}Casy>VLGOngYCeR#!Jov7$?NejTS zcKQ&v+F9HSlma+2rYU3$coUY-eq^Go$sS4YUeT`Lcx3c}T9f6mVQ;=^bD?M~Hz@5< z(gW4iicfs{4towTxE#2IO%t2}yCOA#UE z;;h=Dlm5>EW0>O(k^Z+RSX#RCFI6I?a+_{>p{8ln%Thg44T8)%6I-T8=J;8A+?-)E zRHeV9^pw>VdT|>!W(A%}B=djMg)>;9p|4BH@w^y`IiXddsPKv326{Ngq&(V`I%=!l zy}{B|WXi7T%UA>#p!m=R=znF2Xjw_9)z<(#(-WkRxLynqvb1R$kKz}F`M^fB2&GM7 zvMS_cnaMnuT0n5+N7%0c1F8%QUEPBhBiK8Cj3$YB5PGOkbW=pq zR%8=c)@sq#P)%9l4NS*Z>_r`hyhx80UAYBYd-eK{UXMz1Dk@6Zc+LP+EEL8os5bSs zN`8AFb;=Y83}X-?&6Uyee}N)#zYAFHl^7ijA^%~=0re6RqCf1y7mQQW1v`+BW;=v6 zx|xeAoalB)b<-lUH&}PMQpzX4env#{x3H$@ByTApnG~_>*DEQvKT{n9&r!<~9(l@N z#&D+5Rv~{TI=yW7$HIuJrKGvnmk21?%M!K%yn$M3!X8cWYhj?2KfEE#PgPaTl!mP8 zJ-ohm%3KQDE}gO;xA|EMZCyZzh^i16h@sP~EDt$aga>7SWI;FHAhSfly-&<5>~mjY zh(vGt53PTz_H|2UtUj{Eg;rXNyB!=@!|yz65vO<5y{MQ=ZJ1~<*kk2l_HC=x z_SJtpajA$Z3Yu9&FAp~S^8OA65M3io2;y#Fada z2}5bo2&fa+tU5}*UgC^)4Z+g4ZD7}?l~M_Jo)fT7oF{PoO+**;Q} z-}cWSEn$@ynobFAq?zSGnZ)NizOjvTK`(CgJIzg-Kd*mf!DbNj>hr)>kwDXLMkC;8 zDnOH}H6cbTde@rEVvvUvQGqy@__=&xQ`|>kdqcOLdUtfqo55>+u+7b~GvjM#h%}Z$ z=doQ@&pihl`s-+Qb&!6{mx5&UvLqfEqOx7j;^(z-!cK# zOXtDpOJ>|mlQ6#H9ox+laPQQT23wJ#hYR{*a;fuFYF9k#ehm(&XS)&^%0rsjODK#> zNRl5PjvbNJ0%5VI<#ufB$7`asGvwX_!FNbIBWJ#tVlf6pnhV^aR`W)Zhu;P8q#jK|s4Pgjf_*s>?4fR1R|_xx2+m7#}gavc-n{K*RR_`mLL z@sERjZHdMUgjIHIe|26Jw|S z{T7xpo5K)dGq%nCZ{~|R!++ikzR_^i2-*R_pQPfFV$ijt_L?h#Dhzre61V*4a0N8J z3A|4&BxOy$;O8tJ*U}za?L8u@xYuVxJ$)$J&L8tcwmr_G|E6;G7h)AMLaG7$LZ+Hl zNB#i;O?vTLBnFijXfbZZOi+SY)UEbyE(StQ2(jl+0+^f-LeC#IgrbzM%mO`@1r(W@ zKDe?&Iaf*gyLbq_~f|26cIuqy0aqZD;v2pPvenqkRGMS&6m;jYh4d75wEA}AfcBf6f zeT_AyTe7$Of#4VO&Q*jg=C~==!B$uVAn+ zHc$;4i%}eSrqzsiHM2$Y($MVMEAf5Q1PrE;Rp3KyQ1Gj6cxT6CZ{04{6oc;gg|UXN z(`S5J&r^?2ep@%1n@?|hV2kAluuFp=yEIGAbUB?-0IgGbQe!12UrJQbuDh-+X}XNI zbh{mS9Im2{z)50OPD9<*h^|-pur}Lobio-8%N2Lm^;7H?3U8YR1|0dQW`vkclR@V! zJg70=+(e5d&J_Klp{Z{kF~^JH9<&wh+p6%M7#d0ao4*Wmch-5e$Wk;c(=``s2dLMY zy3kvlO=*hQz1-8|7|Cg_H+HYjL=TgBh6w}s;qes(Z<%QFiO5vzAk($s-Uk_4sI;%peWC4vNJQQ?&L9+ zluXdj6TVQp_MlJ+TbBTq4t>+UKslQ{TZH3Vf2N;XY0x)T)V44rYDB9w9Ejt~Xv)wE zJ|KCj5$VmykXnWXKVT7PR!xD-6?vQc$T`w{?m^;b$Ui{LQT^T3o zAciW}Yxdf)I5;Q2387&bTOkwbN#`gor#JA8x}ekIW*pa~!~+POIF!n2qekkVJT>-`8{^k80ZrIWttbE=Ws&`Xz?TBg1$k``bX4`E&&Y;9qRiu|1;@a~)PpT6&l zLuse^^*9B3h)mR3%O^P(k;`S}G#+$+B%f;n^C33o(?>H!g(sXTim-wb(2dt%6da#g zqpUmWjHk0ag|LtFX~$R{7x~4o;>u4{Uq_+LDt*8)HNF`qKp+B(6PKJOlpfBqUrmQ( zKb7P_W5AzwW<4vL4NM zGT?5)FYZW!85 zaH6Iwm?G7tX`=rCcEW0a-H#HXPyGR$BGt3;jBv9Cv0G6 zUV+j+J#e*)X5zm^_Rjvm5Lw*K^!*7+WVxPshX`he=&q(p3&hY_7V$?w8q*pQk!F67 zfiJFc_gidSK|-VUi)`6;pketf%l_!Z3kMYUsX*Vd2wyel=&Ub z=Kyi7IxIURwyxRW4C!6vz@bI(U8XWT_##%O++j?rA8D>bE0dwwWC@O3dZM10{7{ZT1A2u9JfJZYn|L4aSBk`u9MW(`I=sg)5@4 z9vm4#vf}DmMYtEmr)cOG{V!sSvMQH+-M4=h{e~XR&bn(FvY6sh#`g_@quo5fuzF2a z+pUhl6TfXJk-wstCxDIEM}V{nCnt-p7k%TWfPkltlvPHNt?3xv3dfUxf#BPS*FPyXUKqaz)ndQP=pq(S z#DucE%Bz>kX_v9y;7Csss@v^q6c0DI#K|Iwt6J%fyaEAXZPW$ujejcS1oBi9a~aLq z3#AxUP6zrB?ybF~7*qiO4MaC2gqS}M@JM!qJF0v9tIP|9)@HGi9MB_)x%}R_ZIPEn zjKww5Hj(dTFEmP-_kwdV6e%QbyiCz@`qFa=(Yh+~1=>yaG3IEy$!q(f^t?ZvY1!(P z1iqV#K1-i2XTd~EaU_getZaRle>5pQY&DL(u!$ydz8kUcg=5q1^QG6-)s_|{pZd(* z@2ogndUI9VDlWrhuVl#-rVVAG=}r;NQlJ7QK+m=lZ6qY|89p69G_c^3qsF1D1j5jD1}&Q=;wjm8u5P44RcC3B>61|J5|&SUNbjj}FSIes-}0v^dtB z$nip*iH5WBi`74zrK!Jh=B}7Eub5#WyU$s^PS8jD^WcNKaC6>{L*GZt12&2hlUQVT$diCBy-jUqMC_>Kf(@^hi9l^@2zR@)!i`A zSAm9k#%f{w`V_bGx3<4A7PJE08)_Bw%2)R#lrG2#d$yTmBF?-}Wxu9ukVOA*7hBGf zP`^{|FvTScsd;9$=RMYoQacy<9b9EX(5@>spk26H~^BrY3U< z!b{8lWpg6nFlb`nN7vTy_3fJ87bBx(jJNN8x1$7T2hPB9L!4YMoh@?jRNyZ42>p=B z9r=d;1@{noMv3%0f!jAd$uFG7C<`6^`jcsw!0QZ##E|=T9EH{XP1NuA}kO z{B4(vV(OZu_`?SDfl%x>t;|1SaB;=$^k>xS&3H0v&NEbyO}8YQN92A26OgDssn`x59IhqWN;|d z1NUQPC+4Z(X6(4o-LN1aKfzOCH6?ndTVVN0HDqd?Z2hcr_!CZ0o2n#514Aj|2Fw1HyU7T4S{Y4on`T2WvsyQn3aiS>qTSh`lUD z7P-y&Cgdw)*9~(tmlv)u{3MW;4yqfy)L_*GI$;8Bsff zb7*Ebiu&Yr;HD<)7uwC1S4rvs&S6m!_LU78I#fiEq}-8;BLeSvj$3@WAeS&(7~HLK zim_s><#t2?e<Uhv{cy5lY*HS zP+U{Ad1Uv9Wonv+hZSIwf8N!(Sqwf<%?rS|@TC&7RugE3JoEW-Q?)p^45CNN+7~~) zT6i5e!YfeD)lhIA=)_kn7ti3vgwh;}l?yHZS)?vc(;vJIp3@V5Xr->pOIN$R%3OKM zi7mN6;U?iKT7#XQgmGa`!d|YhH~1_vSHXr@UULm-*gPt~u~Bx@yDb;dImd$Sd&S?O zFghzg_3>?T3vQrQlT3qOQKn%4UoD74opqMZagjFMiT4e&-{}D&>>EkZ;s5AT*}5!r zcagxEKAw`zqi8JoU2b~HAUOZc%gH8C*&;OHEd+Vp0To9C7lsyYq^9JDUiYz>Pf|wj zKBl;vyIPjnKz!G)0my08X_=SoIl*X)BuRm4LkGpP2d{eqtDDqY&yGJK{ihgK9Dn1# zN=35#^+`Y`AvWG^cNOywroAV_Y-}5*Uart6rNf3%EMsg;?pbCk z@J)vV!hAgAuOH|ydmf#re7~o@u-xsBw?tU17e*sPD;Rb20>MwmTSNt-+83IgkldWP zrr$%oafsA~dWTCAetJc`vR`)un>i5gensjvrFo0=uFj48`lQzy$QJmOVr}0gxEVGH zmrXH8BuC||6`}5pAMiJ>MW>Hi($bE|nPL7Kn5-?$ zcY&Z~TIR1biVVrbC5ks^s-N_&&pmH9nvtPDA{f}$Pu<7=TZO>=Z|`{>ZLM7Y`yk~% zkIO4HbY1W)aC`;58tF#IcsP`0bg@tYkqg1|(ih~FX9J~rIVybidn(`KmLA$}WzMTW zR*C6SiAc`mnuV=6tB5#0;V+sK}VU(6WMR=^k{Ht=ntlR zs?v{ymL-b4upQ$jIjB)ziJ^bu>NU*Zc4PfTCj_A;_0X8ZQ8X*v@aLsvIVYdH1WosS z0Up-+*WQfI1@4&^Q(_R}tXxa@;TnqQqC(9o{PMZjKtt%jduOudH3uDwX@<+4n9H0! zLIJiOTzPL~)b9z1YC&<6ZmI?WW+&p2)iAqV~;~ zUpwkcM+3LLl2}>vzZ|dt31r=Clt^d%>-Y6)Ei#r3mnqWwFGh*4zSW73{%CPqU0_wD zJ--*t|GGikneO^EL%hDa_d&~7IyzjJDVXrfDO+xVV@+J(o{LKt!4tTPT<9e#D#A}W zLvS)Y%=A=R^?`WHU;GLqd&Q3@lPD_FntDa621r^8xo%`Zfq)$hxM>>l!;A0L=!gvt z%ikK&y@bMR(IuD_TJ&F4m~p?1k}k+IrwnQHGoe=GVGa{H^9zl%zC5&WDc@ifxT(ZW z2!&Xo0EBlUGNht`cjVC-9F)TIma~0e z$r8-%J{dkMF%{i_=@jJqN_wA}PS#utc)1qeFcZeDAU&!4U^5BEXnIk0wp^g&X+Kyh z#-+4OEU+@IVYiX>W5l=}Jn1-+a!8AZqO-U^JaE1@8V=oCHBF+prC*g+;JvdKEb+`l zYFt`h+s*KiH(Fx{O5PoeNO=QI@{-FqeEsfmw%*f9=;Zmj`rE;)bYXAfj`!SVLq!%&e z(Mm?K09t9pGJHbgO?EmCoQ;VS*zzF=aj+7YoPVSy!_uux+zc*w5Gcwo8=Cus`-V|x zC$Fw#udbkEhf%ec!n{RGUr#IITJuHbgrLM|HK3W_V%6&&bX$S9GfVxdD1V z<<=gilTDuCTUGIZI{M-+c&|;_0g)$Os8?20Cfs9Q#{*0^bkQNyIs4LE@GnmMA!yub z{i>cX6x7=Aj(O2mOiq@OyP_p!WM5kZxDy=NDWb~9(A+7Zw~WHC0jf2tR8o%3VCU{JJcq= zMqky(38BIZPXK4`xRKQ8c@1la7NWutcRW=cFj-_!emA}BCXe9i&al_+6Bc=cq&G_5 z#;VpJC5~&W3T_(=mJt9bH$Zubr17*s#bJY3-))6lN7sY$#Q(Y`IU4&FGb)t?ikcq3 zC5+4DNkGs_zUxur0@q6Jbq%)Yh!(=zXznvlI3!s`#M1j%KU= zxJRaZ`rvE5r*VFw>h8vr-d|#=(*9tu?T)zQJ)4f74~Z+O*CW!N!AnN|i#WBJ{~|#u zK~4G-E!^}4vda5!*9xx2_CJiBfBcW8c#_h% z47f0Ih0}ukE*+GRh;XK?g8c{uF*FMBe!nuyZU|=2HdV66@NOIGNqP4?J#ZkxpzXM- zsH{y$aBK6695ZHWiAL2(LZfX0o6Up2S!lK%T7fs^(K4j=@Opy7;Z`83$ah5t9taSi zQ45q_Kv8_KF&D31VcsnnA%tTGUxb8rVXXlZ**qw74y*SjSu@bpbFzq&l2z67eKtHX ztorNV%Cr0fTP~-9Zr7t-0{UyV=bP|^E*3~u65b}CU~pgCNUeF4u8T9dehu+~Sm{s_ zi{}EF%(WEBad}TU#OtV~`kR6`KH$qg8Fh5ot2_P7SH{28DgN6TRWr6R`@cMEC$)Y8 z)P~*O%^x>AR}VB^Y+M zJ8dG5(rve@L8G$Uhz&_F;)1T(h-GK6+9R*rBe#2zI_=uBTOF#@$Ghiqsou1aj`bV6 zD(0zYb2$XKOmSIE9oS%He~|v-D3dXkACi42hC2alj;3s^8y73N#t*8HT$o3UPUJS6 z@jjb4YrZgA6el=wcW=-o(o+L{&iHgzujGgnsP3$qxmMh+6{u9LH)aIe5uV$Z_b^_Z z?XOy*maa}MH)hIe-iKEP0&;5{QTNpY)QrW&Jq20=6Gsze(GCQM8F;hC@53^|H4$b(u>fUjHI(*j;I)EeGJ>|O?Vc!D^eb#^w* zmoIou=*kuX>-r|3(A!4}96v1vtqr%32M=ml_Ydi@G{_m>4|-4aE%3X{($HYvul-o_ zu87U&8X>{u*5OU0qivYF6_o$+IwD}*Ms8=UN~3>_;W&vk8HTd9WWb-{dGrUUthBbw zgbMMh-fE(|Nyn=#AOF{ugY}_#MJvK>w+0hW-VzhHN;5PGHn6uz4&t7!C|KEkk3H;n zyWY9Sy6ub6<_^fqN8uzk<>Hj-;6*ChHnkNE*5z%-{tJz0x!1#TA{nMZU=FySF0NLVuSQMGQb0-`rLtob0pM-Y#!Rn z(uc9sFP{erFIKAE1`F1oy@25v1oM8cDwl$Jl!1gGP>}4(a)eJ^0DHwGM)N-Gpvu_7 zsy^`IV3&l-X0JFXY@nZfjNoHhi8Q!xeLZx;3ahN z4DF?Ts!B6Tis(Jy&V&{!cXwYFJ81q8v`H7jXU61R9bJ%KsgQGg-5CLT?h=qLEQPJ8 zpN(lZ;~?UVD5r>!<&_&9WXz>k4Z%3SIX544rh#a7f(T?eJpBn>v2{k|lz~ll`nW5| z@*oIIA1%Wq+y)ZhZK%=nej_L>oLRpgP`U;5Fba5|ep{FV8ZgOY1t)<7Kt zL&wTm9FQ&BfA+(;Th}Ie(*SMTKP0PrxugA(_tP*w9hWRnnYcS!Nw31AES&c6GY4GI zs;nM~sb1*;{<6Tjud73`%n#@aaHgFK#&w34EcKa#cP!>JSmXp!jY{sr^Z*pufj%Cf zQnh0yF1e&(-O`=+oyzz_ExRJ&zK5_gpJK{*fh=Oec*@P1O1lp*Wtk=6wE zcLR3JT_R6%!~P+m=kbq~YLr!w+4D?0pzi=rcAN7Z;{&rF@r`fq%o|+pf#<#Osr)yc zvPK8&9i9HV6irI2EY`CZrHalt?}@G85h#83(2PL&j`id%+m(c>$z8f1WU{+$^f5Bf z;eP6#{EFRZ^rI?TU$RZ;iQpocEP3qPgD%s1#8ma>{o`-#ZV@7SLN&{u&V%^!w$A$1 ziI~whGJ_J;9DeK*xBj4Z#vC5?Gq+m%YP}I|U1zTlB7G8#Cpm#srmc|k$&?rYhGzx| zt6JvjA^xgY!}pgj@M6@>oE7|0&j?ILJ6&@vZ|J+{2ECW<3Ols!SXZjWHKc6Hgd z-BZuI_ntU2XXcF^arTE5u|D5%ul%jdyfQD2=otq}VA}@kyn_}oJaSy%i})EP>hANp zkfRm7pEahIJJd1D4uiTq7EYhcTE70D#avKzS>T#c7*zPpsR?h+i`64AYW~zsELE`p zj1q-afl&eMOIxNvJb?(Uq*~k-hZ832aUm@`xP0cf7sW8YOdM5;Gb`u-HJzQTN8 zEVgLRa)l+a=y%x`0PRk`xBWg74i77bM~og~8ys(744=!bouxf%tu1P|#`ueOp-kK= zvUp*kmZhEbF_G&FA>mb8?Mju2lZs=lWtn@n%an9kho5mtu+1Y_#nvDq^JF0=bPCRb z{(dcRtD2i#VKDYUku_Ud@LuoK$FDu~`NwVM!De|yjsWTR+e9=Ak9$Ib4**P8-Y4y`LmtP%%E50hD=Mj1*|Ak>vG zZWu9DVfBZOW(~S;q|p%=$q1w+!XJqx>Za2L^Gb{KFJ`${aU;-)AMhDOiEk88ARv%L zKTXdGLNe^4F?kBPn7caxX{s2y?r@%dLh(qY5$Ze~4}01((@to7K}xptX7nbAG#p5z zy-D!0B$E{wL`lco8d(TUjv>r>xhoOenZd`4k_sQ7ISYXS|K1QGU)O+%L_}I`0O(Kk z$7`A14q7_tQE`O_W?>t~F$eQoXW3Tzu`0y#kAPm^{!crR&K6$YQ(mwumSYjVvi7f*GiK1m({(DW{Dt;Q zhzAo`gE&8@9bdZfy*?oyqX$)Q(bc`xo2lOEZkHiK_esj%!8@jC_wwS@BfT~vG6hc7 zD5$&F)Hb5Rn#==%g$bPKWqrgXoLiW9!h)-N5iY6Z#4tk+1WmF>G{AOGf$e{*}l zHly;%dwWs2_s8wgUF#Z6#h03>;j`=3wJM>~bQDFr(G6ja2r+Ey{FkFH@F!u(Gv|Ui0Xm9Sr052>*5U< z(x%i;=)=ubbPPV-6CJnw_uXL2Ib0t!sNLd^ci8dW>wKvwV6LUSTb>O|u7GEZ5xd0~ z_``*^Z8tDDK|6|-(C z_7*#~gku_iy1{o*y6|FAI5a-JqOQ9^K<#%Pn^^I5WCO#bL2*BkrVlgB{d#qO{OWku z$NZJ`Bk;mgnQ^zZQnZM=V1e&_n{rqoJi4#xUM|62-}t$eMDB#PV(98V<4Cy`8{6c)kk z2hZPx8W-_l)`zz!MD?^_!YG|W(`oOzU+yc)`)F&%yTe|s#9iuhjk~nK*=Y$uq;g}o zn(qERrNDXpoAvd0d&L(xZ5R%y6`E9YNqe)QNV##!bpFw3`CfaI#$COzV7;ZO%PN0Q zqWeJ(BY~6!dnHy7LTa*Fa%N$|fuyyNccC%GCbbcB2;2On@qUWLKc}#T%>c+-`UL4L z%dZSd>M%yQt}osGDr?oe2436PCFcv$gp-ezz&{Ov37($a8HW0+*%#A6FZ2xr$T+K_%DNq9AV5bi3D>TCCL!HXSD zHB`Sdr&<}{mv3ba5UkB>E7EE-W^b`y6nUQG=6E9Y(6L*J3H^8q=6nIk1?r;`8pmBbuf8Tf06N}$0H+}g(O;_( zipRB2#UA2Dc}9zY(tn|a{*0($ZEM@~bjQ{0!u|y2uBD@>OZ5!2TsM3l{atJdH(i+f zx1OW%r-AMW(Q_E0z0#zDbEHAZ%R^z{Hl$DEU^-Ex_*zMr9kAv`cwx0Ev&_wi*5JvP zy3p&p-<^`sE9+Hxl8J^q4u)^=Dd5S(AmZ^=E&J(5?r+y7QFd4c

uk{3XTAKIsjp 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

A-L!r-j+Y_>9NZ0KR3eyzXv@ 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

GP>PK>zUg^kubWir%oak6 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

smOu%GbC?Wu%y3PSSwh!N}O+7RPi$_$^~zmApD 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� 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

9e_jKOpxkO==U<%N0Uhm7Z8 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%0AAl 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%0DeD?7h3rtog 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 Date: Tue, 5 Sep 2017 13:11:58 +0100 Subject: [PATCH 089/120] Fix steps references. Small text fixes. --- docs/source/hello-world-flow.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/hello-world-flow.rst b/docs/source/hello-world-flow.rst index 1adb34a1e5..229127b4e4 100644 --- a/docs/source/hello-world-flow.rst +++ b/docs/source/hello-world-flow.rst @@ -24,7 +24,7 @@ Subflows Although our flow requirements look complex, we can delegate to existing flows to handle many of these tasks. A flow that is invoked within the context of a larger flow to handle a repeatable task is called a *subflow*. -In our initiator flow, we can automate steps 5, 6 and 7 using ``FinalityFlow``. +In our initiator flow, we can automate steps 4 and 5 using ``FinalityFlow``. All we need to do is write the steps to handle the creation and signing of the proposed transaction. @@ -162,7 +162,7 @@ We now have our own ``FlowLogic`` subclass that overrides ``FlowLogic.call``. Th * There are also a few more annotations, on the ``FlowLogic`` subclass itself: * ``@InitiatingFlow`` means that this flow can be started directly by the node - * ``StartableByRPC`` allows the node owner to start this flow via an RPC call + * ``@StartableByRPC`` allows the node owner to start this flow via an RPC call * We override the progress tracker, even though we are not providing any progress tracker steps yet. The progress tracker is required for the node shell to establish when the flow has ended @@ -204,7 +204,7 @@ the following transaction: So we'll need the following: * The output ``IOUState`` -* A ``Create`` command listing the IOU's borrower as a signer +* A ``Create`` command listing the IOU's lender as a signer The command we use pairs the ``IOUContract.Create`` command defined earlier with our public key. Including this command in the transaction makes us one of the transaction's required signers. From ebc9cacb53d6cfa9a178fbee10cfb2354023abeb Mon Sep 17 00:00:00 2001 From: josecoll Date: Tue, 5 Sep 2017 13:23:19 +0100 Subject: [PATCH 090/120] Contract Upgrade API improvements + persistence (#1392) * All Contract Upgrade functionality performed within a corresponding flow. Removed RPC API calls for contract upgrade authorisation / de-authorisation. Added persistence using AppendOnlyPersistentMap. * Changed to using a PersistentMap to ensure entries can be removed (was causing failing de-authorisation tests). Fixed all warnings. * Added mandatory @Suspendable annotations to flows. * Do not instantiate object unless overridden. * Updated changelog and CordaDocs. * Persistence simplification: only store upgrade contract class name (not serialized object) * Remove nullability from contract_class_name DB column. --- .../flows/AbstractStateReplacementFlow.kt | 1 + .../corda/core/flows/ContractUpgradeFlow.kt | 168 +++++++++++++----- .../net/corda/core/messaging/CordaRPCOps.kt | 22 +-- .../node/services/ContractUpgradeService.kt | 20 +-- .../core/flows/ContractUpgradeFlowTest.kt | 47 ++++- docs/source/changelog.rst | 3 + docs/source/contract-upgrade.rst | 56 +++--- .../net/corda/node/internal/AbstractNode.kt | 13 +- .../corda/node/internal/CordaRPCOpsImpl.kt | 2 - .../corda/node/services/CoreFlowHandlers.kt | 25 --- .../node/services/schema/NodeSchemaService.kt | 4 +- .../upgrade/ContractUpgradeServiceImpl.kt | 47 +++-- .../testing/contracts/DummyContractV2.kt | 2 +- .../net/corda/testing/node/MockServices.kt | 2 +- 14 files changed, 252 insertions(+), 160 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/flows/AbstractStateReplacementFlow.kt b/core/src/main/kotlin/net/corda/core/flows/AbstractStateReplacementFlow.kt index c4a84da857..26e8b79874 100644 --- a/core/src/main/kotlin/net/corda/core/flows/AbstractStateReplacementFlow.kt +++ b/core/src/main/kotlin/net/corda/core/flows/AbstractStateReplacementFlow.kt @@ -138,6 +138,7 @@ abstract class AbstractStateReplacementFlow { // We use Void? instead of Unit? as that's what you'd use in Java. abstract class Acceptor(val otherSide: Party, override val progressTracker: ProgressTracker = Acceptor.tracker()) : FlowLogic() { + constructor(otherSide: Party) : this(otherSide, Acceptor.tracker()) companion object { object VERIFYING : ProgressTracker.Step("Verifying state replacement proposal") object APPROVING : ProgressTracker.Step("State replacement approved") diff --git a/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt b/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt index d6e7024811..c9a1cbee02 100644 --- a/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt +++ b/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt @@ -1,72 +1,146 @@ package net.corda.core.flows +import co.paralleluniverse.fibers.Suspendable import net.corda.core.contracts.* +import net.corda.core.identity.Party import net.corda.core.transactions.LedgerTransaction +import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder import java.security.PublicKey /** - * A flow to be used for upgrading state objects of an old contract to a new contract. + * A flow to be used for authorising and upgrading state objects of an old contract to a new contract. * * This assembles the transaction for contract upgrade and sends out change proposals to all participants * of that state. If participants agree to the proposed change, they each sign the transaction. * Finally, the transaction containing all signatures is sent back to each participant so they can record it and * use the new updated state for future transactions. */ -@InitiatingFlow -@StartableByRPC -class ContractUpgradeFlow( - originalState: StateAndRef, - newContractClass: Class> -) : AbstractStateReplacementFlow.Instigator>>(originalState, newContractClass) { +object ContractUpgradeFlow { - companion object { - @JvmStatic - fun verify(tx: LedgerTransaction) { - // Contract Upgrade transaction should have 1 input, 1 output and 1 command. - verify( - tx.inputStates.single(), - tx.outputStates.single(), - tx.commandsOfType().single()) + /** + * Authorise a contract state upgrade. + * This will store the upgrade authorisation in persistent store, and will be queried by [ContractUpgradeFlow.Acceptor] during contract upgrade process. + * Invoking this flow indicates the node is willing to upgrade the [StateAndRef] using the [UpgradedContract] class. + * This method will NOT initiate the upgrade process. To start the upgrade process, see [Initiator]. + */ + @StartableByRPC + class Authorise( + val stateAndRef: StateAndRef<*>, + private val upgradedContractClass: Class> + ) : FlowLogic() { + @Suspendable + override fun call(): Void? { + val upgrade = upgradedContractClass.newInstance() + if (upgrade.legacyContract != stateAndRef.state.data.contract.javaClass) { + throw FlowException("The contract state cannot be upgraded using provided UpgradedContract.") + } + serviceHub.contractUpgradeService.storeAuthorisedContractUpgrade(stateAndRef.ref, upgradedContractClass) + return null } - @JvmStatic - fun verify(input: ContractState, output: ContractState, commandData: Command) { - val command = commandData.value - val participantKeys: Set = input.participants.map { it.owningKey }.toSet() - val keysThatSigned: Set = commandData.signers.toSet() - @Suppress("UNCHECKED_CAST") - val upgradedContract = command.upgradedContractClass.newInstance() as UpgradedContract - requireThat { - "The signing keys include all participant keys" using keysThatSigned.containsAll(participantKeys) - "Inputs state reference the legacy contract" using (input.contract.javaClass == upgradedContract.legacyContract) - "Outputs state reference the upgraded contract" using (output.contract.javaClass == command.upgradedContractClass) - "Output state must be an upgraded version of the input state" using (output == upgradedContract.upgrade(input)) + } + + /** + * Deauthorise a contract state upgrade. + * This will remove the upgrade authorisation from persistent store (and prevent any further upgrade) + */ + @StartableByRPC + class Deauthorise( + val stateRef: StateRef + ) : FlowLogic< Void?>() { + @Suspendable + override fun call(): Void? { + serviceHub.contractUpgradeService.removeAuthorisedContractUpgrade(stateRef) + return null + } + } + + @InitiatingFlow + @StartableByRPC + class Initiator( + originalState: StateAndRef, + newContractClass: Class> + ) : AbstractStateReplacementFlow.Instigator>>(originalState, newContractClass) { + + companion object { + fun assembleBareTx( + stateRef: StateAndRef, + upgradedContractClass: Class>, + privacySalt: PrivacySalt + ): TransactionBuilder { + val contractUpgrade = upgradedContractClass.newInstance() + return TransactionBuilder(stateRef.state.notary) + .withItems( + stateRef, + contractUpgrade.upgrade(stateRef.state.data), + Command(UpgradeCommand(upgradedContractClass), stateRef.state.data.participants.map { it.owningKey }), + privacySalt + ) } } - fun assembleBareTx( - stateRef: StateAndRef, - upgradedContractClass: Class>, - privacySalt: PrivacySalt - ): TransactionBuilder { - val contractUpgrade = upgradedContractClass.newInstance() - return TransactionBuilder(stateRef.state.notary) - .withItems( - stateRef, - contractUpgrade.upgrade(stateRef.state.data), - Command(UpgradeCommand(upgradedContractClass), stateRef.state.data.participants.map { it.owningKey }), - privacySalt - ) + @Suspendable + override fun assembleTx(): AbstractStateReplacementFlow.UpgradeTx { + val baseTx = assembleBareTx(originalState, modification, PrivacySalt()) + val participantKeys = originalState.state.data.participants.map { it.owningKey }.toSet() + // TODO: We need a much faster way of finding our key in the transaction + val myKey = serviceHub.keyManagementService.filterMyKeys(participantKeys).single() + val stx = serviceHub.signInitialTransaction(baseTx, myKey) + return AbstractStateReplacementFlow.UpgradeTx(stx, participantKeys, myKey) } } - override fun assembleTx(): AbstractStateReplacementFlow.UpgradeTx { - val baseTx = assembleBareTx(originalState, modification, PrivacySalt()) - val participantKeys = originalState.state.data.participants.map { it.owningKey }.toSet() - // TODO: We need a much faster way of finding our key in the transaction - val myKey = serviceHub.keyManagementService.filterMyKeys(participantKeys).single() - val stx = serviceHub.signInitialTransaction(baseTx, myKey) - return AbstractStateReplacementFlow.UpgradeTx(stx, participantKeys, myKey) + @StartableByRPC + @InitiatedBy(ContractUpgradeFlow.Initiator::class) + class Acceptor(otherSide: Party) : AbstractStateReplacementFlow.Acceptor>>(otherSide) { + + companion object { + @JvmStatic + fun verify(tx: LedgerTransaction) { + // Contract Upgrade transaction should have 1 input, 1 output and 1 command. + verify(tx.inputStates.single(), + tx.outputStates.single(), + tx.commandsOfType().single()) + } + + @JvmStatic + fun verify(input: ContractState, output: ContractState, commandData: Command) { + val command = commandData.value + val participantKeys: Set = input.participants.map { it.owningKey }.toSet() + val keysThatSigned: Set = commandData.signers.toSet() + @Suppress("UNCHECKED_CAST") + val upgradedContract = command.upgradedContractClass.newInstance() as UpgradedContract + requireThat { + "The signing keys include all participant keys" using keysThatSigned.containsAll(participantKeys) + "Inputs state reference the legacy contract" using (input.contract.javaClass == upgradedContract.legacyContract) + "Outputs state reference the upgraded contract" using (output.contract.javaClass == command.upgradedContractClass) + "Output state must be an upgraded version of the input state" using (output == upgradedContract.upgrade(input)) + } + } + } + + @Suspendable + @Throws(StateReplacementException::class) + override fun verifyProposal(stx: SignedTransaction, proposal: AbstractStateReplacementFlow.Proposal>>) { + // Retrieve signed transaction from our side, we will apply the upgrade logic to the transaction on our side, and + // verify outputs matches the proposed upgrade. + val ourSTX = serviceHub.validatedTransactions.getTransaction(proposal.stateRef.txhash) + requireNotNull(ourSTX) { "We don't have a copy of the referenced state" } + val oldStateAndRef = ourSTX!!.tx.outRef(proposal.stateRef.index) + val authorisedUpgrade = serviceHub.contractUpgradeService.getAuthorisedContractUpgrade(oldStateAndRef.ref) ?: + throw IllegalStateException("Contract state upgrade is unauthorised. State hash : ${oldStateAndRef.ref}") + val proposedTx = stx.tx + val expectedTx = ContractUpgradeFlow.Initiator.assembleBareTx(oldStateAndRef, proposal.modification, proposedTx.privacySalt).toWireTransaction() + requireThat { + "The instigator is one of the participants" using (otherSide in oldStateAndRef.state.data.participants) + "The proposed upgrade ${proposal.modification.javaClass} is a trusted upgrade path" using (proposal.modification.name == authorisedUpgrade) + "The proposed tx matches the expected tx for this upgrade" using (proposedTx == expectedTx) + } + ContractUpgradeFlow.Acceptor.verify( + oldStateAndRef.state.data, + expectedTx.outRef(0).state.data, + expectedTx.toLedgerTransaction(serviceHub).commandsOfType().single()) + } } } diff --git a/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt b/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt index fab679795b..6470493af9 100644 --- a/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt +++ b/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt @@ -123,11 +123,11 @@ interface CordaRPCOps : RPCOps { * * Generic vault query function which takes a [QueryCriteria] object to define filters, * optional [PageSpecification] and optional [Sort] modification criteria (default unsorted), - * and returns a [Vault.PageAndUpdates] object containing - * 1) a snapshot as a [Vault.Page] (described previously in [queryBy]) + * and returns a [DataFeed] object containing + * 1) a snapshot as a [Vault.Page] (described previously in [CordaRPCOps.vaultQueryBy]) * 2) an [Observable] of [Vault.Update] * - * Notes: the snapshot part of the query adheres to the same behaviour as the [queryBy] function. + * Notes: the snapshot part of the query adheres to the same behaviour as the [CordaRPCOps.vaultQueryBy] function. * the [QueryCriteria] applies to both snapshot and deltas (streaming updates). */ // DOCSTART VaultTrackByAPI @@ -239,20 +239,6 @@ interface CordaRPCOps : RPCOps { */ fun uploadAttachment(jar: InputStream): SecureHash - /** - * Authorise a contract state upgrade. - * This will store the upgrade authorisation in the vault, and will be queried by [ContractUpgradeFlow.Acceptor] during contract upgrade process. - * Invoking this method indicate the node is willing to upgrade the [state] using the [upgradedContractClass]. - * This method will NOT initiate the upgrade process. To start the upgrade process, see [ContractUpgradeFlow.Instigator]. - */ - fun authoriseContractUpgrade(state: StateAndRef<*>, upgradedContractClass: Class>) - - /** - * Authorise a contract state upgrade. - * This will remove the upgrade authorisation from the vault. - */ - fun deauthoriseContractUpgrade(state: StateAndRef<*>) - /** * Returns the node's current time. */ @@ -338,7 +324,7 @@ inline fun > CordaRPCOps.startFlow( flowConstructor: () -> R ): FlowHandle = startFlowDynamic(R::class.java) -inline fun > CordaRPCOps.startFlow( +inline fun > CordaRPCOps.startFlow( @Suppress("UNUSED_PARAMETER") flowConstructor: (A) -> R, arg0: A diff --git a/core/src/main/kotlin/net/corda/core/node/services/ContractUpgradeService.kt b/core/src/main/kotlin/net/corda/core/node/services/ContractUpgradeService.kt index c29702077c..42d1689796 100644 --- a/core/src/main/kotlin/net/corda/core/node/services/ContractUpgradeService.kt +++ b/core/src/main/kotlin/net/corda/core/node/services/ContractUpgradeService.kt @@ -1,8 +1,8 @@ package net.corda.core.node.services -import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.StateRef import net.corda.core.contracts.UpgradedContract +import net.corda.core.flows.ContractUpgradeFlow /** * The [ContractUpgradeService] is responsible for securely upgrading contract state objects according to @@ -12,19 +12,11 @@ import net.corda.core.contracts.UpgradedContract interface ContractUpgradeService { /** Get contracts we would be willing to upgrade the suggested contract to. */ - fun getAuthorisedContractUpgrade(ref: StateRef): Class>? + fun getAuthorisedContractUpgrade(ref: StateRef): String? - /** - * Authorise a contract state upgrade. - * This will store the upgrade authorisation in the vault, and will be queried by [ContractUpgradeFlow.Acceptor] during contract upgrade process. - * Invoking this method indicate the node is willing to upgrade the [state] using the [upgradedContractClass]. - * This method will NOT initiate the upgrade process. To start the upgrade process, see [ContractUpgradeFlow.Instigator]. - */ - fun authoriseContractUpgrade(stateAndRef: StateAndRef<*>, upgradedContractClass: Class>) + /** Store authorised state ref and associated UpgradeContract class */ + fun storeAuthorisedContractUpgrade(ref: StateRef, upgradedContractClass: Class>) - /** - * Authorise a contract state upgrade. - * This will remove the upgrade authorisation from the vault. - */ - fun deauthoriseContractUpgrade(stateAndRef: StateAndRef<*>) + /** Remove a previously authorised state ref */ + fun removeAuthorisedContractUpgrade(ref: StateRef) } diff --git a/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt b/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt index d5687b45ad..ccf543c4e1 100644 --- a/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt +++ b/core/src/test/kotlin/net/corda/core/flows/ContractUpgradeFlowTest.kt @@ -84,15 +84,24 @@ class ContractUpgradeFlowTest { requireNotNull(btx) // The request is expected to be rejected because party B hasn't authorised the upgrade yet. - val rejectedFuture = a.services.startFlow(ContractUpgradeFlow(atx!!.tx.outRef(0), DummyContractV2::class.java)).resultFuture + val rejectedFuture = a.services.startFlow(ContractUpgradeFlow.Initiator(atx!!.tx.outRef(0), DummyContractV2::class.java)).resultFuture mockNet.runNetwork() assertFailsWith(UnexpectedFlowEndException::class) { rejectedFuture.getOrThrow() } - // Party B authorise the contract state upgrade. - b.services.contractUpgradeService.authoriseContractUpgrade(btx!!.tx.outRef(0), DummyContractV2::class.java) + // Party B authorise the contract state upgrade, and immediately deauthorise the same. + b.services.startFlow(ContractUpgradeFlow.Authorise(btx!!.tx.outRef(0), DummyContractV2::class.java)).resultFuture.getOrThrow() + b.services.startFlow(ContractUpgradeFlow.Deauthorise(btx.tx.outRef(0).ref)).resultFuture.getOrThrow() + + // The request is expected to be rejected because party B has subsequently deauthorised and a previously authorised upgrade. + val deauthorisedFuture = a.services.startFlow(ContractUpgradeFlow.Initiator(atx.tx.outRef(0), DummyContractV2::class.java)).resultFuture + mockNet.runNetwork() + assertFailsWith(UnexpectedFlowEndException::class) { deauthorisedFuture.getOrThrow() } + + // Party B authorise the contract state upgrade + b.services.startFlow(ContractUpgradeFlow.Authorise(btx.tx.outRef(0), DummyContractV2::class.java)).resultFuture.getOrThrow() // Party A initiates contract upgrade flow, expected to succeed this time. - val resultFuture = a.services.startFlow(ContractUpgradeFlow(atx.tx.outRef(0), DummyContractV2::class.java)).resultFuture + val resultFuture = a.services.startFlow(ContractUpgradeFlow.Initiator(atx.tx.outRef(0), DummyContractV2::class.java)).resultFuture mockNet.runNetwork() val result = resultFuture.getOrThrow() @@ -138,7 +147,10 @@ class ContractUpgradeFlowTest { val user = rpcTestUser.copy(permissions = setOf( startFlowPermission(), - startFlowPermission>() + startFlowPermission>(), + startFlowPermission(), + startFlowPermission(), + startFlowPermission() )) val rpcA = startProxy(a, user) val rpcB = startProxy(b, user) @@ -151,18 +163,35 @@ class ContractUpgradeFlowTest { requireNotNull(atx) requireNotNull(btx) - val rejectedFuture = rpcA.startFlow({ stateAndRef, upgrade -> ContractUpgradeFlow(stateAndRef, upgrade) }, + val rejectedFuture = rpcA.startFlow({ stateAndRef, upgrade -> ContractUpgradeFlow.Initiator(stateAndRef, upgrade) }, atx!!.tx.outRef(0), DummyContractV2::class.java).returnValue mockNet.runNetwork() assertFailsWith(UnexpectedFlowEndException::class) { rejectedFuture.getOrThrow() } + // Party B authorise the contract state upgrade, and immediately deauthorise the same. + rpcB.startFlow( { stateAndRef, upgrade -> ContractUpgradeFlow.Authorise(stateAndRef, upgrade ) }, + btx!!.tx.outRef(0), + DummyContractV2::class.java).returnValue + rpcB.startFlow( { stateRef -> ContractUpgradeFlow.Deauthorise(stateRef) }, + btx.tx.outRef(0).ref).returnValue + + // The request is expected to be rejected because party B has subsequently deauthorised and a previously authorised upgrade. + val deauthorisedFuture = rpcA.startFlow( {stateAndRef, upgrade -> ContractUpgradeFlow.Initiator(stateAndRef, upgrade) }, + atx.tx.outRef(0), + DummyContractV2::class.java).returnValue + + mockNet.runNetwork() + assertFailsWith(UnexpectedFlowEndException::class) { deauthorisedFuture.getOrThrow() } + // Party B authorise the contract state upgrade. - rpcB.authoriseContractUpgrade(btx!!.tx.outRef(0), DummyContractV2::class.java) + rpcB.startFlow( { stateAndRef, upgrade -> ContractUpgradeFlow.Authorise(stateAndRef, upgrade ) }, + btx.tx.outRef(0), + DummyContractV2::class.java).returnValue // Party A initiates contract upgrade flow, expected to succeed this time. - val resultFuture = rpcA.startFlow({ stateAndRef, upgrade -> ContractUpgradeFlow(stateAndRef, upgrade) }, + val resultFuture = rpcA.startFlow({ stateAndRef, upgrade -> ContractUpgradeFlow.Initiator(stateAndRef, upgrade) }, atx.tx.outRef(0), DummyContractV2::class.java).returnValue @@ -194,7 +223,7 @@ class ContractUpgradeFlowTest { val baseState = a.database.transaction { a.services.vaultQueryService.queryBy().states.single() } assertTrue(baseState.state.data is Cash.State, "Contract state is old version.") // Starts contract upgrade flow. - val upgradeResult = a.services.startFlow(ContractUpgradeFlow(stateAndRef, CashV2::class.java)).resultFuture + val upgradeResult = a.services.startFlow(ContractUpgradeFlow.Initiator(stateAndRef, CashV2::class.java)).resultFuture mockNet.runNetwork() upgradeResult.getOrThrow() // Get contract state from the vault. diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 4504cc20cf..618361a151 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -6,6 +6,9 @@ from the previous milestone release. UNRELEASED ---------- +* Contract Upgrades: deprecated RPC authorisation / deauthorisation API calls in favour of equivalent flows in ContractUpgradeFlow. + Implemented contract upgrade persistence using JDBC backed persistent map. + * Vault query common attributes (state status and contract state types) are now handled correctly when using composite criteria specifications. State status is overridable. Contract states types are aggregatable. diff --git a/docs/source/contract-upgrade.rst b/docs/source/contract-upgrade.rst index 5d7298b36b..a00b6b0870 100644 --- a/docs/source/contract-upgrade.rst +++ b/docs/source/contract-upgrade.rst @@ -21,23 +21,21 @@ Here's the workflow for contract upgrades: 1. Two banks, A and B negotiate a trade, off-platform -2. Banks A and B execute a protocol to construct a state object representing the trade, using contract X, and include it in a transaction (which is then signed and sent to the Uniqueness Service). +2. Banks A and B execute a protocol to construct a state object representing the trade, using contract X, and include it in a transaction (which is then signed and sent to the consensus service). 3. Time passes. -4. The developer of contract X discovers a bug in the contract code, and releases a new version, contract Y. -And notify the users (e.g. via a mailing list or CorDapp store). -At this point of time all nodes should stop issuing states of contract X. +4. The developer of contract X discovers a bug in the contract code, and releases a new version, contract Y. The developer will then notify all existing users (e.g. via a mailing list or CorDapp store) to stop their nodes from issuing further states with contract X. -5. Banks A and B review the new contract via standard change control processes and identify the contract states they agreed to upgrade, they can decide not to upgrade some contract states as they might be needed for other obligation contract. +5. Banks A and B review the new contract via standard change control processes and identify the contract states they agree to upgrade (they may decide not to upgrade some contract states as these might be needed for some other obligation contract). 6. Banks A and B instruct their Corda nodes (via RPC) to be willing to upgrade state objects of contract X, to state objects for contract Y using agreed upgrade path. -7. One of the parties ``Instigator`` initiates an upgrade of state objects referring to contract X, to a new state object referring to contract Y. +7. One of the parties initiates (``Initiator``) an upgrade of state objects referring to contract X, to a new state object referring to contract Y. 8. A proposed transaction ``Proposal``, taking in the old state and outputting the reissued version, is created and signed with the node's private key. -9. The node ``Instigator`` sends the proposed transaction, along with details of the new contract upgrade path it's proposing, to all participants of the state object. +9. The ``Initiator`` node sends the proposed transaction, along with details of the new contract upgrade path its proposing, to all participants of the state object. 10. Each counterparty ``Acceptor`` verifies the proposal, signs or rejects the state reissuance accordingly, and sends a signature or rejection notification back to the initiating node. @@ -48,32 +46,38 @@ Authorising upgrade ------------------- Each of the participants in the upgrading contract will have to instruct their node that they are willing to upgrade the state object before the upgrade. -Currently the vault service is used to manage the authorisation records. The administrator can use RPC to perform such instructions. +The ``ContractUpgradeFlow`` is used to manage the authorisation records. The administrator can use RPC to trigger either an ``Authorise`` or ``Deauthorise`` flow. .. container:: codeset .. sourcecode:: kotlin - - /** - * Authorise a contract state upgrade. - * This will store the upgrade authorisation in the vault, and will be queried by [ContractUpgradeFlow] during contract upgrade process. - * Invoking this method indicate the node is willing to upgrade the [state] using the [upgradedContractClass]. - * This method will NOT initiate the upgrade process. - */ - fun authoriseContractUpgrade(state: StateAndRef<*>, upgradedContractClass: Class>) - /** - * Authorise a contract state upgrade. - * This will remove the upgrade authorisation from the vault. - */ - fun deauthoriseContractUpgrade(state: StateAndRef<*>) + /** + * Authorise a contract state upgrade. + * This will store the upgrade authorisation in persistent store, and will be queried by [ContractUpgradeFlow.Acceptor] during contract upgrade process. + * Invoking this flow indicates the node is willing to upgrade the [StateAndRef] using the [UpgradedContract] class. + * This method will NOT initiate the upgrade process. To start the upgrade process, see [Initiator]. + */ + @StartableByRPC + class Authorise( + val stateAndRef: StateAndRef<*>, + private val upgradedContractClass: Class> + ) : FlowLogic() + /** + * Deauthorise a contract state upgrade. + * This will remove the upgrade authorisation from persistent store (and prevent any further upgrade) + */ + @StartableByRPC + class Deauthorise( + val stateRef: StateRef + ) : FlowLogic< Void?>() Proposing an upgrade -------------------- -After all parties have registered the intention of upgrading the contract state, one of the contract participant can initiate the upgrade process by running the contract upgrade flow. -The Instigator will create a new state and sent to each participant for signatures, each of the participants (Acceptor) will verify and sign the proposal and returns to the instigator. +After all parties have registered the intention of upgrading the contract state, one of the contract participants can initiate the upgrade process by triggering the ``Initiator`` contract upgrade flow. +The ``Initiator`` will create a new state and sent to each participant for signatures, each of the participants (Acceptor) will verify, sign the proposal and return to the initiator. The transaction will be notarised and persisted once every participant verified and signed the upgrade proposal. Examples @@ -81,7 +85,7 @@ Examples Lets assume Bank A has entered into an agreement with Bank B, and the contract is translated into contract code ``DummyContract`` with state object ``DummyContractState``. -Few days after the exchange of contracts, the developer of the contract code discovered a bug/misrepresentation in the contract code. +A few days after the exchange of contracts, the developer of the contract code discovered a bug/misrepresentation in the contract code. Bank A and Bank B decided to upgrade the contract to ``DummyContractV2`` 1. Developer will create a new contract extending the ``UpgradedContract`` class, and a new state object ``DummyContractV2.State`` referencing the new contract. @@ -99,7 +103,7 @@ Bank A and Bank B decided to upgrade the contract to ``DummyContractV2`` val rpcClient : CordaRPCClient = << Bank A's Corda RPC Client >> val rpcA = rpcClient.proxy() - rpcA.authoriseContractUpgrade(<>, DummyContractV2::class.java) + rpcA.startFlow(ContractUpgradeFlow.Authorise(<>, DummyContractV2::class.java)) 3. Bank B now initiate the upgrade Flow, this will send a upgrade proposal to all contract participants. Each of the participants of the contract state will sign and return the contract state upgrade proposal once they have validated and agreed with the upgrade. @@ -115,7 +119,7 @@ The upgraded transaction state will be recorded in every participant's node at t <>, DummyContractV2::class.java) -.. note:: See ``ContractUpgradeFlowTest.2 parties contract upgrade using RPC`` for more detailed code example. +.. note:: See ``ContractUpgradeFlowTest`` for more detailed code examples. diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index d5f509261b..9e8fc5d6bb 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -9,6 +9,7 @@ import io.github.lukehutch.fastclasspathscanner.scanner.ScanResult import net.corda.core.concurrent.CordaFuture import net.corda.core.crypto.* import net.corda.core.flows.* +import net.corda.core.flows.ContractUpgradeFlow.Acceptor import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate import net.corda.core.internal.* @@ -18,14 +19,16 @@ import net.corda.core.internal.concurrent.openFuture import net.corda.core.messaging.CordaRPCOps import net.corda.core.messaging.RPCOps import net.corda.core.messaging.SingleMessageRecipient -import net.corda.core.node.* +import net.corda.core.node.CordaPluginRegistry +import net.corda.core.node.NodeInfo +import net.corda.core.node.PluginServiceHub +import net.corda.core.node.ServiceEntry import net.corda.core.node.services.* import net.corda.core.node.services.NetworkMapCache.MapChange import net.corda.core.serialization.SerializeAsToken import net.corda.core.serialization.SingletonSerializeAsToken import net.corda.core.transactions.SignedTransaction import net.corda.core.utilities.* -import net.corda.node.services.ContractUpgradeHandler import net.corda.node.services.NotaryChangeHandler import net.corda.node.services.NotifyTransactionHandler import net.corda.node.services.TransactionKeyHandler @@ -38,11 +41,11 @@ import net.corda.node.services.identity.PersistentIdentityService import net.corda.node.services.keys.PersistentKeyManagementService import net.corda.node.services.messaging.MessagingService import net.corda.node.services.messaging.sendRequest -import net.corda.node.services.network.PersistentNetworkMapCache import net.corda.node.services.network.NetworkMapService import net.corda.node.services.network.NetworkMapService.RegistrationRequest import net.corda.node.services.network.NetworkMapService.RegistrationResponse import net.corda.node.services.network.NodeRegistration +import net.corda.node.services.network.PersistentNetworkMapCache import net.corda.node.services.network.PersistentNetworkMapService import net.corda.node.services.persistence.DBCheckpointStorage import net.corda.node.services.persistence.DBTransactionMappingStorage @@ -378,7 +381,7 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, .filter { it.isUserInvokable() } + // Add any core flows here listOf( - ContractUpgradeFlow::class.java) + ContractUpgradeFlow.Initiator::class.java) } /** @@ -399,7 +402,7 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, private fun installCoreFlows() { installCoreFlow(BroadcastTransactionFlow::class, ::NotifyTransactionHandler) installCoreFlow(NotaryChangeFlow::class, ::NotaryChangeHandler) - installCoreFlow(ContractUpgradeFlow::class, ::ContractUpgradeHandler) + installCoreFlow(ContractUpgradeFlow.Initiator::class, ::Acceptor) installCoreFlow(TransactionKeyFlow::class, ::TransactionKeyHandler) } diff --git a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt index eb84b6e513..550e22f791 100644 --- a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt +++ b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt @@ -171,8 +171,6 @@ class CordaRPCOpsImpl( } } - override fun authoriseContractUpgrade(state: StateAndRef<*>, upgradedContractClass: Class>) = services.contractUpgradeService.authoriseContractUpgrade(state, upgradedContractClass) - override fun deauthoriseContractUpgrade(state: StateAndRef<*>) = services.contractUpgradeService.deauthoriseContractUpgrade(state) override fun currentNodeTime(): Instant = Instant.now(services.clock) override fun waitUntilNetworkReady(): CordaFuture { diff --git a/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt b/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt index d311ea4fd2..3cf2c341ff 100644 --- a/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt +++ b/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt @@ -49,31 +49,6 @@ class NotaryChangeHandler(otherSide: Party) : AbstractStateReplacementFlow.Accep } } -class ContractUpgradeHandler(otherSide: Party) : AbstractStateReplacementFlow.Acceptor>>(otherSide) { - @Suspendable - @Throws(StateReplacementException::class) - override fun verifyProposal(stx: SignedTransaction, proposal: AbstractStateReplacementFlow.Proposal>>) { - // Retrieve signed transaction from our side, we will apply the upgrade logic to the transaction on our side, and - // verify outputs matches the proposed upgrade. - val ourSTX = serviceHub.validatedTransactions.getTransaction(proposal.stateRef.txhash) - requireNotNull(ourSTX) { "We don't have a copy of the referenced state" } - val oldStateAndRef = ourSTX!!.tx.outRef(proposal.stateRef.index) - val authorisedUpgrade = serviceHub.contractUpgradeService.getAuthorisedContractUpgrade(oldStateAndRef.ref) ?: - throw IllegalStateException("Contract state upgrade is unauthorised. State hash : ${oldStateAndRef.ref}") - val proposedTx = stx.tx - val expectedTx = ContractUpgradeFlow.assembleBareTx(oldStateAndRef, proposal.modification, proposedTx.privacySalt).toWireTransaction() - requireThat { - "The instigator is one of the participants" using (otherSide in oldStateAndRef.state.data.participants) - "The proposed upgrade ${proposal.modification.javaClass} is a trusted upgrade path" using (proposal.modification == authorisedUpgrade) - "The proposed tx matches the expected tx for this upgrade" using (proposedTx == expectedTx) - } - ContractUpgradeFlow.verify( - oldStateAndRef.state.data, - expectedTx.outRef(0).state.data, - expectedTx.toLedgerTransaction(serviceHub).commandsOfType().single()) - } -} - class TransactionKeyHandler(val otherSide: Party, val revocationEnabled: Boolean) : FlowLogic() { constructor(otherSide: Party) : this(otherSide, false) companion object { diff --git a/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt b/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt index ac64a908ba..9adcace424 100644 --- a/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt +++ b/node/src/main/kotlin/net/corda/node/services/schema/NodeSchemaService.kt @@ -22,6 +22,7 @@ import net.corda.node.services.persistence.NodeAttachmentService import net.corda.node.services.transactions.BFTNonValidatingNotaryService import net.corda.node.services.transactions.PersistentUniquenessProvider import net.corda.node.services.transactions.RaftUniquenessProvider +import net.corda.node.services.upgrade.ContractUpgradeServiceImpl import net.corda.node.services.vault.VaultSchemaV1 /** @@ -54,7 +55,8 @@ class NodeSchemaService(customSchemas: Set = emptySet()) : SchemaS RaftUniquenessProvider.RaftState::class.java, BFTNonValidatingNotaryService.PersistedCommittedState::class.java, PersistentIdentityService.PersistentIdentity::class.java, - PersistentIdentityService.PersistentIdentityNames::class.java + PersistentIdentityService.PersistentIdentityNames::class.java, + ContractUpgradeServiceImpl.DBContractUpgrade::class.java )) // Required schemas are those used by internal Corda services diff --git a/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt b/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt index c93a8d55da..0a7ef3f1c9 100644 --- a/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt +++ b/node/src/main/kotlin/net/corda/node/services/upgrade/ContractUpgradeServiceImpl.kt @@ -1,26 +1,51 @@ package net.corda.node.services.upgrade -import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.StateRef import net.corda.core.contracts.UpgradedContract import net.corda.core.node.services.ContractUpgradeService +import net.corda.node.utilities.NODE_DATABASE_PREFIX +import net.corda.node.utilities.PersistentMap +import javax.persistence.* class ContractUpgradeServiceImpl : ContractUpgradeService { - // TODO : Persist this in DB. - private val authorisedUpgrade = mutableMapOf>>() + @Entity + @Table(name = "${NODE_DATABASE_PREFIX}contract_upgrades") + class DBContractUpgrade( + @Id + @Column(name = "state_ref", length = 96) + var stateRef: String = "", - override fun getAuthorisedContractUpgrade(ref: StateRef) = authorisedUpgrade[ref] + /** refers to the UpgradedContract class name*/ + @Column(name = "contract_class_name") + var upgradedContractClassName: String = "" + ) - override fun authoriseContractUpgrade(stateAndRef: StateAndRef<*>, upgradedContractClass: Class>) { - val upgrade = upgradedContractClass.newInstance() - if (upgrade.legacyContract != stateAndRef.state.data.contract.javaClass) { - throw IllegalArgumentException("The contract state cannot be upgraded using provided UpgradedContract.") + private companion object { + fun createContractUpgradesMap(): PersistentMap { + return PersistentMap( + toPersistentEntityKey = { it }, + fromPersistentEntity = { Pair(it.stateRef, it.upgradedContractClassName) }, + toPersistentEntity = { key: String, value: String -> + DBContractUpgrade().apply { + stateRef = key + upgradedContractClassName = value + } + }, + persistentEntityClass = DBContractUpgrade::class.java + ) } - authorisedUpgrade.put(stateAndRef.ref, upgradedContractClass) } - override fun deauthoriseContractUpgrade(stateAndRef: StateAndRef<*>) { - authorisedUpgrade.remove(stateAndRef.ref) + private val authorisedUpgrade = createContractUpgradesMap() + + override fun getAuthorisedContractUpgrade(ref: StateRef) = authorisedUpgrade[ref.toString()] + + override fun storeAuthorisedContractUpgrade(ref: StateRef, upgradedContractClass: Class>) { + authorisedUpgrade.put(ref.toString(), upgradedContractClass.name) + } + + override fun removeAuthorisedContractUpgrade(ref: StateRef) { + authorisedUpgrade.remove(ref.toString()) } } \ No newline at end of file diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt b/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt index 220e17d629..f8103acecc 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt @@ -32,7 +32,7 @@ class DummyContractV2 : UpgradedContract Date: Tue, 5 Sep 2017 16:22:58 +0100 Subject: [PATCH 091/120] Added pull request and issue templates for GitHub. --- .github/ISSUE_TEMPLATE.md | 8 ++++++++ .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..e9b1a592c2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,8 @@ +Thank you for choosing to reporting an issue with Corda. + +When reporting an issue please make sure it contains; + +* A clear description of the issue +* Any logs or stack traces that you can provide +* Steps to reproduce the issue +* The version/tag/release or commit hash it occured on \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..4b6e99e780 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +Thank you for choosing to contribute to Corda. As a contributor please read [CONTRIBUTING](../contributing.md) before +contributing. + +## PR Process + +Your PR must be approved by one or more reviewers and all tests must be passed on [TeamCity CI](https://ci.corda.r3cev.com) +in order to be merged. + +Once you have submitted a PR you are responsible for keeping it up to date until the time it is merged. + +## PR Checklist + +1. Ensure you have done any relevant automated and manual testing. +2. Add your changes to the changelog. +3. Update any documentation relating to your changes. + From a86abc49aabe57d5818103062cb03317b40c49cd Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Tue, 5 Sep 2017 16:36:11 +0100 Subject: [PATCH 092/120] Addressed review comments. --- .github/ISSUE_TEMPLATE.md | 4 ++-- .github/PULL_REQUEST_TEMPLATE.md | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index e9b1a592c2..a033b80436 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,8 +1,8 @@ -Thank you for choosing to reporting an issue with Corda. +Thank you for choosing to report an issue with Corda. When reporting an issue please make sure it contains; * A clear description of the issue -* Any logs or stack traces that you can provide +* Any logs or stack traces that you can provide (use a site like [pastebin](https://pastebin.com)for larger logs) * Steps to reproduce the issue * The version/tag/release or commit hash it occured on \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4b6e99e780..dbfed2cad1 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,4 @@ -Thank you for choosing to contribute to Corda. As a contributor please read [CONTRIBUTING](../contributing.md) before -contributing. +Thank you for choosing to contribute to Corda. ## PR Process @@ -11,6 +10,7 @@ Once you have submitted a PR you are responsible for keeping it up to date until ## PR Checklist 1. Ensure you have done any relevant automated and manual testing. -2. Add your changes to the changelog. -3. Update any documentation relating to your changes. - +2. Add your changes to `docs/src/changelog.rst` +3. Update any documentation in `docs/src` relating to your changes. +4. If you are contributing for the first time please read the agreement in [CONTRIBUTING](../contributing.md) now + and add to this Pull Request that you have read, and agreed to, the agreement. From cd912f8add769f7cca3f8789f5d7fffad5b6c808 Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko Date: Tue, 5 Sep 2017 13:33:00 +0100 Subject: [PATCH 093/120] CORDA-540: Allow lists as root object in AMQP serialization graph --- .../amqp/CollectionSerializer.kt | 28 +++++++++++++++++-- .../serialization/amqp/SerializerFactory.kt | 14 +++++++--- .../serialization/ListsSerializationTest.kt | 18 ++++++++++-- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt index 5d218a1a2a..7c7ff00d5d 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt @@ -18,18 +18,42 @@ class CollectionSerializer(val declaredType: ParameterizedType, factory: Seriali override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" companion object { - private val supportedTypes: Map>, (List<*>) -> Collection<*>> = mapOf( + // NB: Order matters in this map, the most specific classes should be listed at the end + private val supportedTypes: Map>, (List<*>) -> Collection<*>> = Collections.unmodifiableMap(linkedMapOf( Collection::class.java to { list -> Collections.unmodifiableCollection(list) }, List::class.java to { list -> Collections.unmodifiableList(list) }, Set::class.java to { list -> Collections.unmodifiableSet(LinkedHashSet(list)) }, SortedSet::class.java to { list -> Collections.unmodifiableSortedSet(TreeSet(list)) }, NavigableSet::class.java to { list -> Collections.unmodifiableNavigableSet(TreeSet(list)) }, NonEmptySet::class.java to { list -> NonEmptySet.copyOf(list) } - ) + )) private fun findConcreteType(clazz: Class<*>): (List<*>) -> Collection<*> { return supportedTypes[clazz] ?: throw NotSerializableException("Unsupported collection type $clazz.") } + + fun deriveParameterizedType(declaredType: Type, declaredClass: Class<*>, actualClass: Class<*>?): ParameterizedType { + if(supportedTypes.containsKey(declaredClass)) { + // Simple case - it is already known to be a collection. + @Suppress("UNCHECKED_CAST") + return deriveParametrizedType(declaredType, declaredClass as Class>) + } + else if (actualClass != null && Collection::class.java.isAssignableFrom(actualClass)) { + // Declared class is not collection, but [actualClass] is - represent it accordingly. + val collectionClass = findMostSuitableCollectionType(actualClass) + return deriveParametrizedType(declaredType, collectionClass) + } + + throw NotSerializableException("Cannot derive collection type for declaredType: '$declaredType', declaredClass: '$declaredClass', actualClass: '$actualClass'") + } + + private fun deriveParametrizedType(declaredType: Type, collectionClass: Class>): ParameterizedType = + (declaredType as? ParameterizedType) ?: DeserializedParameterizedType(collectionClass, arrayOf(SerializerFactory.AnyType)) + + + private fun findMostSuitableCollectionType(actualClass: Class<*>): Class> = + supportedTypes.keys.findLast { it.isAssignableFrom(actualClass) }!! + } private val concreteBuilder: (List<*>) -> Collection<*> = findConcreteType(declaredType.rawType as Class<*>) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt index 2d240c5329..e98704aa1d 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt @@ -4,6 +4,7 @@ import com.google.common.primitives.Primitives import com.google.common.reflect.TypeResolver import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.CordaSerializable +import net.corda.nodeapi.internal.serialization.amqp.CollectionSerializer.Companion.deriveParameterizedType import net.corda.nodeapi.internal.serialization.carpenter.* import org.apache.qpid.proton.amqp.* import java.io.NotSerializableException @@ -69,10 +70,15 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl: ClassLoader) { val actualType: Type = inferTypeVariables(actualClass, declaredClass, declaredType) ?: declaredType val serializer = when { - (Collection::class.java.isAssignableFrom(declaredClass)) -> { - serializersByType.computeIfAbsent(declaredType) { - CollectionSerializer(declaredType as? ParameterizedType ?: DeserializedParameterizedType( - declaredClass, arrayOf(AnyType), null), this) + (Collection::class.java.isAssignableFrom(declaredClass) || + // declared class may not be set to Collection, but actual class could be a collection. + // In this case use of CollectionSerializer is perfectly appropriate. + (actualClass != null && Collection::class.java.isAssignableFrom(actualClass))) -> { + + val declaredTypeAmended= deriveParameterizedType(declaredType, declaredClass, actualClass) + + serializersByType.computeIfAbsent(declaredTypeAmended) { + CollectionSerializer(declaredTypeAmended, this) } } Map::class.java.isAssignableFrom(declaredClass) -> serializersByType.computeIfAbsent(declaredClass) { diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt index 09941c8afc..23b931f651 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt @@ -3,19 +3,33 @@ package net.corda.nodeapi.internal.serialization import net.corda.core.serialization.SerializedBytes import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize +import net.corda.node.services.statemachine.SessionData import net.corda.testing.TestDependencyInjectionBase -import net.corda.testing.kryoSpecific import org.junit.Test import kotlin.test.assertEquals class ListsSerializationTest : TestDependencyInjectionBase() { @Test - fun `check list can be serialized as root of serialization graph`() = kryoSpecific("AMQP doesn't support lists as the root of serialization graph"){ + fun `check list can be serialized as root of serialization graph`() { assertEqualAfterRoundTripSerialization(listOf(1)) assertEqualAfterRoundTripSerialization(listOf(1, 2)) } + @Test + fun `check list can be serialized as part of SessionData`() { + + run { + val sessionData = SessionData(123, listOf(1)) + assertEqualAfterRoundTripSerialization(sessionData) + } + + run { + val sessionData = SessionData(123, listOf(1, 2)) + assertEqualAfterRoundTripSerialization(sessionData) + } + } + private inline fun assertEqualAfterRoundTripSerialization(obj: T) { val serializedForm: SerializedBytes = obj.serialize() From a01f39051532a9e16ee91ce36f3ead78ee8fdd45 Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko Date: Tue, 5 Sep 2017 13:35:48 +0100 Subject: [PATCH 094/120] CORDA-540: Upgrade version of "org.apache.qpid:proton-j" used and minor project files changes --- .idea/compiler.xml | 3 +++ node-api/build.gradle | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 7ca71b5aa7..de5a2c1a30 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -61,6 +61,9 @@ + + + diff --git a/node-api/build.gradle b/node-api/build.gradle index a0844f5f13..88892c4eff 100644 --- a/node-api/build.gradle +++ b/node-api/build.gradle @@ -32,7 +32,7 @@ dependencies { compile "de.javakaffee:kryo-serializers:0.41" // For AMQP serialisation. - compile "org.apache.qpid:proton-j:0.19.0" + compile "org.apache.qpid:proton-j:0.21.0" // Unit testing helpers. testCompile "junit:junit:$junit_version" From cac2465ea581db8163d10b0f504621955f1fe26a Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko Date: Tue, 5 Sep 2017 13:56:13 +0100 Subject: [PATCH 095/120] CORDA-540: Special provisions when artificial "AnyType" is used --- .../nodeapi/internal/serialization/amqp/DeserializationInput.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt index 57371c7c9d..7522844db0 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt @@ -126,7 +126,7 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { is DescribedType -> { // Look up serializer in factory by descriptor val serializer = serializerFactory.get(obj.descriptor, schema) - if (serializer.type != type && with(serializer.type) { !isSubClassOf(type) && !materiallyEquivalentTo(type) }) + if (SerializerFactory.AnyType != type && serializer.type != type && with(serializer.type) { !isSubClassOf(type) && !materiallyEquivalentTo(type) }) throw NotSerializableException("Described type with descriptor ${obj.descriptor} was " + "expected to be of type $type but was ${serializer.type}") serializer.readObject(obj.described, schema, this) From 349692f831241a54910f2f947d4f9656d05c989d Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko Date: Tue, 5 Sep 2017 15:25:57 +0100 Subject: [PATCH 096/120] CORDA-540: Tighten-up the unit test to prevent concrete collection classes to be used --- .../serialization/ListsSerializationTest.kt | 17 +++++++++++++++++ .../kotlin/net/corda/testing/CoreTestUtils.kt | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt index 23b931f651..a5e83e0c01 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt @@ -1,11 +1,15 @@ package net.corda.nodeapi.internal.serialization +import net.corda.core.serialization.CordaSerializable import net.corda.core.serialization.SerializedBytes import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import net.corda.node.services.statemachine.SessionData import net.corda.testing.TestDependencyInjectionBase +import net.corda.testing.amqpSpecific +import org.assertj.core.api.Assertions import org.junit.Test +import java.io.NotSerializableException import kotlin.test.assertEquals class ListsSerializationTest : TestDependencyInjectionBase() { @@ -30,6 +34,19 @@ class ListsSerializationTest : TestDependencyInjectionBase() { } } + @CordaSerializable + data class WrongPayloadType(val payload: ArrayList) + + @Test + fun `check throws for forbidden declared type`() = amqpSpecific("Such exceptions are not expected in Kryo mode.") { + val payload = ArrayList() + payload.add(1) + payload.add(2) + val wrongPayloadType = WrongPayloadType(payload) + Assertions.assertThatThrownBy { wrongPayloadType.serialize() } + .isInstanceOf(NotSerializableException::class.java).hasMessageContaining("Cannot derive collection type for declaredType") + } + private inline fun assertEqualAfterRoundTripSerialization(obj: T) { val serializedForm: SerializedBytes = obj.serialize() diff --git a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt index 87eb8dd992..73a406d3cf 100644 --- a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt +++ b/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt @@ -162,4 +162,10 @@ inline fun kryoSpecific(reason: String, function: () -> Unit) function() } else { loggerFor().info("Ignoring Kryo specific test, reason: $reason" ) +} + +inline fun amqpSpecific(reason: String, function: () -> Unit) = if(AMQP_ENABLED) { + function() +} else { + loggerFor().info("Ignoring AMQP specific test, reason: $reason" ) } \ No newline at end of file From df2ec0ca9b8b6a6bd53c40e0be122f44fda40865 Mon Sep 17 00:00:00 2001 From: Andrzej Cichocki Date: Tue, 5 Sep 2017 17:17:33 +0100 Subject: [PATCH 097/120] Suppress output of jarsigner and friends. (#1426) --- .../net/corda/core/internal/AbstractAttachmentTest.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/src/test/kotlin/net/corda/core/internal/AbstractAttachmentTest.kt b/core/src/test/kotlin/net/corda/core/internal/AbstractAttachmentTest.kt index 338cbfdb19..3c3f224091 100644 --- a/core/src/test/kotlin/net/corda/core/internal/AbstractAttachmentTest.kt +++ b/core/src/test/kotlin/net/corda/core/internal/AbstractAttachmentTest.kt @@ -15,8 +15,15 @@ class AbstractAttachmentTest { companion object { private val dir = Files.createTempDirectory(AbstractAttachmentTest::class.simpleName) private val bin = Paths.get(System.getProperty("java.home")).let { if (it.endsWith("jre")) it.parent else it } / "bin" + private val shredder = (dir / "_shredder").toFile() // No need to delete after each test. fun execute(vararg command: String) { - assertEquals(0, ProcessBuilder().inheritIO().directory(dir.toFile()).command((bin / command[0]).toString(), *command.sliceArray(1 until command.size)).start().waitFor()) + assertEquals(0, ProcessBuilder() + .inheritIO() + .redirectOutput(shredder) + .directory(dir.toFile()) + .command((bin / command[0]).toString(), *command.sliceArray(1 until command.size)) + .start() + .waitFor()) } @BeforeClass @@ -45,7 +52,7 @@ class AbstractAttachmentTest { dir.toFile().listFiles().forEach { if (!it.name.startsWith("_")) it.deleteRecursively() } - assertEquals(4, dir.toFile().listFiles().size) + assertEquals(5, dir.toFile().listFiles().size) } @Test From ccf231440fa8cc60804d9bfd8ed956ecb7a105fb Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Tue, 5 Sep 2017 17:21:07 +0100 Subject: [PATCH 098/120] Added a page to explain testing. --- .github/PULL_REQUEST_TEMPLATE.md | 7 +++--- docs/source/testing.rst | 41 ++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 docs/source/testing.rst diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index dbfed2cad1..66ff0a88b1 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -9,8 +9,9 @@ Once you have submitted a PR you are responsible for keeping it up to date until ## PR Checklist -1. Ensure you have done any relevant automated and manual testing. -2. Add your changes to `docs/src/changelog.rst` -3. Update any documentation in `docs/src` relating to your changes. +1. Ensure any new code is tested as described [here](https://docs.corda.net/testing.html) +1. Ensure you have done any relevant automated testing and manual testing +2. Add your changes to `docs/source/changelog.rst` +3. Update any documentation in `docs/source` relating to your changes and learn how to build them [here](https://docs.corda.net/building-the-docs.html) 4. If you are contributing for the first time please read the agreement in [CONTRIBUTING](../contributing.md) now and add to this Pull Request that you have read, and agreed to, the agreement. diff --git a/docs/source/testing.rst b/docs/source/testing.rst new file mode 100644 index 0000000000..69a81a706a --- /dev/null +++ b/docs/source/testing.rst @@ -0,0 +1,41 @@ +Testing Corda +============= + +Automated Tests +--------------- + +Corda has a maintained suite of tests that any contributing developers must maintain and add to if new code has been added. + +There are several distinct test suites each with a different purpose; + +**Unit tests**: These are traditional unit tests that should only test a single code unit, typically a method or class. + +**Integration tests**: These tests should test the integration of small numbers of units, preferably with mocked out services. + +**Smoke tests**: These are full end to end tests which start a full set of Corda nodes and verify broader behaviour. + +**Other**: These include tests such as performance tests, stress tests, etc, and may be in an external repo. + +These tests are mostly written with JUnit and can be run via ``gradle`` with ``gradlew test integrationTest smokeTest`` +or any combination of these three. + +Before creating a pull request please make sure these pass. + +Manual Testing +-------------- + +Manual testing would ideally be done for every set of changes merged into master, but practically you should manually test +anything that would be impacted by your changes. The areas that usually need to be manually tested and when are below; + +**Node startup** - changes in the ``node`` or ``node:capsule`` project in both the Kotlin or gradle or the ``cordformation`` gradle plugin. + +**Sample project** - changes in the ``samples`` project. eg; changing the IRS demo means you should manually test the IRS demo. + +**Explorer** - changes to the ``tools/explorer`` project. + +**Demobench** - changes to the ``tools/demobench`` project. + +How to manually test each of these areas differs and is currently not fully specified. For now the best thing to do is +ensure the program starts, that you can interact with it, and that no exceptions are generated in normal operation. + +TODO: Add instructions on manual testing \ No newline at end of file From 3ccddf91eab3cb4ae95ac7fa22e1042ef005f64c Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Tue, 5 Sep 2017 17:38:53 +0100 Subject: [PATCH 099/120] Addressed release comments. --- .github/PULL_REQUEST_TEMPLATE.md | 8 ++++---- docs/source/release-process-index.rst | 3 ++- docs/source/testing.rst | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 66ff0a88b1..7946da9d1f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,8 +10,8 @@ Once you have submitted a PR you are responsible for keeping it up to date until ## PR Checklist 1. Ensure any new code is tested as described [here](https://docs.corda.net/testing.html) -1. Ensure you have done any relevant automated testing and manual testing -2. Add your changes to `docs/source/changelog.rst` -3. Update any documentation in `docs/source` relating to your changes and learn how to build them [here](https://docs.corda.net/building-the-docs.html) -4. If you are contributing for the first time please read the agreement in [CONTRIBUTING](../contributing.md) now +2. Ensure you have done any relevant automated testing and manual testing +3. Add your changes to `docs/source/changelog.rst` +4. Update any documentation in `docs/source` relating to your changes and learn how to build them [here](https://docs.corda.net/building-the-docs.html) +5. If you are contributing for the first time please read the agreement in [CONTRIBUTING](../contributing.md) now and add to this Pull Request that you have read, and agreed to, the agreement. diff --git a/docs/source/release-process-index.rst b/docs/source/release-process-index.rst index 9e5276f786..1b59977668 100644 --- a/docs/source/release-process-index.rst +++ b/docs/source/release-process-index.rst @@ -6,4 +6,5 @@ Release process release-notes changelog - codestyle \ No newline at end of file + codestyle + testing \ No newline at end of file diff --git a/docs/source/testing.rst b/docs/source/testing.rst index 69a81a706a..c082361d2d 100644 --- a/docs/source/testing.rst +++ b/docs/source/testing.rst @@ -16,8 +16,8 @@ There are several distinct test suites each with a different purpose; **Other**: These include tests such as performance tests, stress tests, etc, and may be in an external repo. -These tests are mostly written with JUnit and can be run via ``gradle`` with ``gradlew test integrationTest smokeTest`` -or any combination of these three. +These tests are mostly written with JUnit and can be run via ``gradle``. On windows run ``gradlew test integrationTest +smokeTest`` and on unix run ``./gradlw test integrationTest smokeTest`` or any combination of these three arguments. Before creating a pull request please make sure these pass. From cb5ba4cc3b09decc9e514de4bae89343ede94120 Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Tue, 5 Sep 2017 18:07:17 +0100 Subject: [PATCH 100/120] Minor improvements to github templates. --- .github/ISSUE_TEMPLATE.md | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index a033b80436..37dc57e9fa 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -3,6 +3,6 @@ Thank you for choosing to report an issue with Corda. When reporting an issue please make sure it contains; * A clear description of the issue -* Any logs or stack traces that you can provide (use a site like [pastebin](https://pastebin.com)for larger logs) +* Any logs or stack traces that you can provide (use a site like https://pastebin.com for larger logs) * Steps to reproduce the issue * The version/tag/release or commit hash it occured on \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 7946da9d1f..fa66ea084c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,17 +1,21 @@ Thank you for choosing to contribute to Corda. -## PR Process +PR Process +---------- -Your PR must be approved by one or more reviewers and all tests must be passed on [TeamCity CI](https://ci.corda.r3cev.com) +Your PR must be approved by one or more reviewers and all tests must be passed on TeamCity (https://ci.corda.r3cev.com) in order to be merged. Once you have submitted a PR you are responsible for keeping it up to date until the time it is merged. -## PR Checklist +PR Checklist +------------ -1. Ensure any new code is tested as described [here](https://docs.corda.net/testing.html) +1. Ensure any new code is tested as described in https://docs.corda.net/testing.html 2. Ensure you have done any relevant automated testing and manual testing -3. Add your changes to `docs/source/changelog.rst` -4. Update any documentation in `docs/source` relating to your changes and learn how to build them [here](https://docs.corda.net/building-the-docs.html) -5. If you are contributing for the first time please read the agreement in [CONTRIBUTING](../contributing.md) now - and add to this Pull Request that you have read, and agreed to, the agreement. +3. Add your changes to docs/source/changelog.rst +4. Update any documentation in docs/source relating to your changes and learn how to build them in https://docs.corda.net/building-the-docs.html +5. If you are contributing for the first time please read the agreement in CONTRIBUTING.md now and add to this + Pull Request that you have read, and agreed to, the agreement. + +Please remove this message when you have read it. From 8ded93c2a26b55d35e85a4f535995032bcce42ef Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Tue, 5 Sep 2017 18:08:00 +0100 Subject: [PATCH 101/120] Minor changes to PR template. --- .github/PULL_REQUEST_TEMPLATE.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fa66ea084c..8bf23481c5 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,15 +1,11 @@ -Thank you for choosing to contribute to Corda. - -PR Process ----------- +Thank you for choosing to contribute to Corda. Your PR must be approved by one or more reviewers and all tests must be passed on TeamCity (https://ci.corda.r3cev.com) in order to be merged. Once you have submitted a PR you are responsible for keeping it up to date until the time it is merged. -PR Checklist ------------- +PR Checklist: 1. Ensure any new code is tested as described in https://docs.corda.net/testing.html 2. Ensure you have done any relevant automated testing and manual testing From bc28a2e062994de512a0d70392732d2e14131105 Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Tue, 5 Sep 2017 18:08:29 +0100 Subject: [PATCH 102/120] Minor changes to PR template formatting --- .github/PULL_REQUEST_TEMPLATE.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8bf23481c5..b1aef9f7ad 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -11,7 +11,6 @@ PR Checklist: 2. Ensure you have done any relevant automated testing and manual testing 3. Add your changes to docs/source/changelog.rst 4. Update any documentation in docs/source relating to your changes and learn how to build them in https://docs.corda.net/building-the-docs.html -5. If you are contributing for the first time please read the agreement in CONTRIBUTING.md now and add to this - Pull Request that you have read, and agreed to, the agreement. +5. If you are contributing for the first time please read the agreement in CONTRIBUTING.md now and add to this Pull Request that you have read, and agreed to, the agreement. Please remove this message when you have read it. From 6a7f6a814eb2f327772a66ce59e8407a3aa8bc42 Mon Sep 17 00:00:00 2001 From: Clinton Alexander Date: Tue, 5 Sep 2017 18:08:51 +0100 Subject: [PATCH 103/120] Minor changes to PR template formatting - again --- .github/PULL_REQUEST_TEMPLATE.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b1aef9f7ad..62d77dd2d8 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,7 +1,6 @@ Thank you for choosing to contribute to Corda. -Your PR must be approved by one or more reviewers and all tests must be passed on TeamCity (https://ci.corda.r3cev.com) -in order to be merged. +Your PR must be approved by one or more reviewers and all tests must be passed on TeamCity (https://ci.corda.r3cev.com) in order to be merged. Once you have submitted a PR you are responsible for keeping it up to date until the time it is merged. From 579abda044dd5ae82bdf192e6856090c818da215 Mon Sep 17 00:00:00 2001 From: Andrzej Cichocki Date: Tue, 5 Sep 2017 18:27:26 +0100 Subject: [PATCH 104/120] Group test scope modules in testing dir (#1419) --- .idea/compiler.xml | 22 +++++-------------- docs/source/changelog.rst | 3 +++ settings.gradle | 5 ++++- .../smoke-test-utils}/build.gradle | 0 .../net/corda/smoketesting/NodeConfig.kt | 0 .../net/corda/smoketesting/NodeProcess.kt | 0 .../test-common}/build.gradle | 0 .../src/main/resources/log4j2-test.xml | 0 .../test-utils}/build.gradle | 0 .../kotlin/net/corda/testing/CoreTestUtils.kt | 0 .../main/kotlin/net/corda/testing/Expect.kt | 0 .../net/corda/testing/FlowStackSnapshot.kt | 0 .../corda/testing/IntegrationTestCategory.kt | 0 .../net/corda/testing/LedgerDSLInterpreter.kt | 0 .../kotlin/net/corda/testing/LogHelper.kt | 0 .../main/kotlin/net/corda/testing/Measure.kt | 0 .../net/corda/testing/ProjectStructure.kt | 0 .../corda/testing/SerializationTestHelpers.kt | 0 .../kotlin/net/corda/testing/TestConstants.kt | 0 .../main/kotlin/net/corda/testing/TestDSL.kt | 0 .../testing/TestDependencyInjectionBase.kt | 0 .../kotlin/net/corda/testing/TestTimestamp.kt | 0 .../testing/TransactionDSLInterpreter.kt | 0 .../corda/testing/contracts/DummyContract.kt | 0 .../testing/contracts/DummyContractV2.kt | 0 .../testing/contracts/DummyDealContract.kt | 0 .../testing/contracts/DummyLinearContract.kt | 0 .../net/corda/testing/contracts/DummyState.kt | 0 .../corda/testing/contracts/VaultFiller.kt | 0 .../kotlin/net/corda/testing/http/HttpApi.kt | 0 .../net/corda/testing/http/HttpUtils.kt | 0 .../corda/testing/messaging/SimpleMQClient.kt | 0 .../testing/node/MockAttachmentStorage.kt | 0 .../net/corda/testing/performance/Rate.kt | 0 .../testing/schemas/DummyDealStateSchemaV1.kt | 0 .../schemas/DummyLinearStateSchemaV1.kt | 0 .../schemas/DummyLinearStateSchemaV2.kt | 0 ...ices.statemachine.FlowStackSnapshotFactory | 0 38 files changed, 13 insertions(+), 17 deletions(-) rename {smoke-test-utils => testing/smoke-test-utils}/build.gradle (100%) rename {smoke-test-utils => testing/smoke-test-utils}/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt (100%) rename {smoke-test-utils => testing/smoke-test-utils}/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt (100%) rename {test-common => testing/test-common}/build.gradle (100%) rename {test-common => testing/test-common}/src/main/resources/log4j2-test.xml (100%) rename {test-utils => testing/test-utils}/build.gradle (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/CoreTestUtils.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/Expect.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/IntegrationTestCategory.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/LedgerDSLInterpreter.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/LogHelper.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/Measure.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/ProjectStructure.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/TestConstants.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/TestDSL.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/TestDependencyInjectionBase.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/TestTimestamp.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/contracts/DummyContract.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/contracts/DummyState.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/contracts/VaultFiller.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/http/HttpApi.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/http/HttpUtils.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/performance/Rate.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/schemas/DummyDealStateSchemaV1.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV1.kt (100%) rename {test-utils => testing/test-utils}/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV2.kt (100%) rename {test-utils => testing/test-utils}/src/main/resources/META-INF/services/net.corda.node.services.statemachine.FlowStackSnapshotFactory (100%) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index de5a2c1a30..83b640e02c 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -14,9 +14,6 @@ - - - @@ -28,9 +25,6 @@ - - - @@ -64,8 +58,6 @@ - - @@ -85,15 +77,15 @@ - - - - - - + + + + + + @@ -104,8 +96,6 @@ - - diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 618361a151..c676118a55 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -6,6 +6,9 @@ from the previous milestone release. UNRELEASED ---------- +* About half of the code in test-utils has been moved to a new module ``node-driver``, + and the test scope modules are now located in a ``testing`` directory. + * Contract Upgrades: deprecated RPC authorisation / deauthorisation API calls in favour of equivalent flows in ContractUpgradeFlow. Implemented contract upgrade persistence using JDBC backed persistent map. diff --git a/settings.gradle b/settings.gradle index 8c4324969c..e1beec48a7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -22,7 +22,10 @@ include 'test-common' include 'test-utils' include 'smoke-test-utils' include 'node-driver' -project(':node-driver').projectDir = new File("$settingsDir/testing/node-driver") +// Avoid making 'testing' a project, and allow build.gradle files to refer to these by their simple names: +['test-common', 'test-utils', 'smoke-test-utils', 'node-driver'].each { + project(":$it").projectDir = new File("$settingsDir/testing/$it") +} include 'tools:explorer' include 'tools:explorer:capsule' include 'tools:demobench' diff --git a/smoke-test-utils/build.gradle b/testing/smoke-test-utils/build.gradle similarity index 100% rename from smoke-test-utils/build.gradle rename to testing/smoke-test-utils/build.gradle diff --git a/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt similarity index 100% rename from smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt rename to testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt diff --git a/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt similarity index 100% rename from smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt rename to testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt diff --git a/test-common/build.gradle b/testing/test-common/build.gradle similarity index 100% rename from test-common/build.gradle rename to testing/test-common/build.gradle diff --git a/test-common/src/main/resources/log4j2-test.xml b/testing/test-common/src/main/resources/log4j2-test.xml similarity index 100% rename from test-common/src/main/resources/log4j2-test.xml rename to testing/test-common/src/main/resources/log4j2-test.xml diff --git a/test-utils/build.gradle b/testing/test-utils/build.gradle similarity index 100% rename from test-utils/build.gradle rename to testing/test-utils/build.gradle diff --git a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/Expect.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/Expect.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/Expect.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/Expect.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/IntegrationTestCategory.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/IntegrationTestCategory.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/IntegrationTestCategory.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/IntegrationTestCategory.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/LedgerDSLInterpreter.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/LedgerDSLInterpreter.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/LedgerDSLInterpreter.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/LedgerDSLInterpreter.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/LogHelper.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/LogHelper.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/LogHelper.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/LogHelper.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/Measure.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/Measure.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/Measure.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/Measure.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/ProjectStructure.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/ProjectStructure.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/ProjectStructure.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/ProjectStructure.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestDependencyInjectionBase.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TestDependencyInjectionBase.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/TestDependencyInjectionBase.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/TestDependencyInjectionBase.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestTimestamp.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TestTimestamp.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/TestTimestamp.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/TestTimestamp.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContract.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContract.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContract.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContract.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyState.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyState.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/contracts/DummyState.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyState.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/VaultFiller.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/VaultFiller.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/contracts/VaultFiller.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/VaultFiller.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/performance/Rate.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/performance/Rate.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/performance/Rate.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/performance/Rate.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyDealStateSchemaV1.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyDealStateSchemaV1.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/schemas/DummyDealStateSchemaV1.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyDealStateSchemaV1.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV1.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV1.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV1.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV1.kt diff --git a/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV2.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV2.kt similarity index 100% rename from test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV2.kt rename to testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV2.kt diff --git a/test-utils/src/main/resources/META-INF/services/net.corda.node.services.statemachine.FlowStackSnapshotFactory b/testing/test-utils/src/main/resources/META-INF/services/net.corda.node.services.statemachine.FlowStackSnapshotFactory similarity index 100% rename from test-utils/src/main/resources/META-INF/services/net.corda.node.services.statemachine.FlowStackSnapshotFactory rename to testing/test-utils/src/main/resources/META-INF/services/net.corda.node.services.statemachine.FlowStackSnapshotFactory From fe17d26bb08bbffe6ec2a1f4007eb9b9a4d8164f Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Wed, 6 Sep 2017 09:25:45 +0100 Subject: [PATCH 105/120] Reshuffle docs on NetworkRegistrationHelper (#1429) Reshuffle docs on NetworkRegistrationHelper, and in particular note that it can cause the whole process to exit. --- .../registration/NetworkRegistrationHelper.kt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt b/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt index 02ef6fb12c..b7f855a7af 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt @@ -19,11 +19,8 @@ import java.security.cert.Certificate import kotlin.system.exitProcess /** - * This checks the config.certificatesDirectory field for certificates required to connect to a Corda network. - * If the certificates are not found, a [org.bouncycastle.pkcs.PKCS10CertificationRequest] will be submitted to - * Corda network permissioning server using [NetworkRegistrationService]. This process will enter a polling loop until - * the request has been approved, and then the certificate chain will be downloaded and stored in [KeyStore] reside in - * the certificates directory. + * Helper for managing the node registration process, which checks for any existing certificates and requests them if + * needed. */ class NetworkRegistrationHelper(val config: NodeConfiguration, val certService: NetworkRegistrationService) { companion object { @@ -36,6 +33,17 @@ class NetworkRegistrationHelper(val config: NodeConfiguration, val certService: // TODO: Use different password for private key. private val privateKeyPassword = config.keyStorePassword + /** + * Ensure the initial keystore for a node is set up; note that this function may cause the process to exit under + * some circumstances. + * + * This checks the "config.certificatesDirectory" field for certificates required to connect to a Corda network. + * If the certificates are not found, a PKCS #10 certification request will be submitted to the + * Corda network permissioning server via [NetworkRegistrationService]. This process will enter a polling loop until + * the request has been approved, and then the certificate chain will be downloaded and stored in [KeyStore] reside in + * the certificates directory. + */ + // TODO: Stop killing the calling process from within a called function. fun buildKeystore() { validateX500Name(config.myLegalName) config.certificatesDirectory.createDirectories() From b2051952d27b17f35b2cba323423634bd5aee210 Mon Sep 17 00:00:00 2001 From: Andrzej Cichocki Date: Wed, 6 Sep 2017 12:58:06 +0100 Subject: [PATCH 106/120] Add kotlin throwables to whitelist (#1424) --- .gitignore | 1 + .../net/corda/client/rpc/RPCFailureTests.kt | 64 +++++++++++++++++++ .../main/kotlin/net/corda/nodeapi/RPCApi.kt | 10 ++- .../serialization/CordaClassResolver.kt | 6 +- 4 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 client/rpc/src/test/kotlin/net/corda/client/rpc/RPCFailureTests.kt diff --git a/.gitignore b/.gitignore index ded13230cd..67dc614169 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ local.properties **/build/* lib/dokka.jar +lib/quasar.jar **/logs/* diff --git a/client/rpc/src/test/kotlin/net/corda/client/rpc/RPCFailureTests.kt b/client/rpc/src/test/kotlin/net/corda/client/rpc/RPCFailureTests.kt new file mode 100644 index 0000000000..378a41f783 --- /dev/null +++ b/client/rpc/src/test/kotlin/net/corda/client/rpc/RPCFailureTests.kt @@ -0,0 +1,64 @@ +package net.corda.client.rpc + +import com.esotericsoftware.kryo.KryoException +import net.corda.core.concurrent.CordaFuture +import net.corda.core.internal.concurrent.openFuture +import net.corda.core.messaging.* +import net.corda.core.utilities.getOrThrow +import net.corda.testing.rpcDriver +import net.corda.testing.startRpcClient +import org.assertj.core.api.Assertions.assertThatThrownBy +import org.junit.Test + +class RPCFailureTests { + class Unserializable + interface Ops : RPCOps { + fun getUnserializable(): Unserializable + fun getUnserializableAsync(): CordaFuture + fun kotlinNPE() + fun kotlinNPEAsync(): CordaFuture + } + + class OpsImpl : Ops { + override val protocolVersion = 1 + override fun getUnserializable() = Unserializable() + override fun getUnserializableAsync(): CordaFuture { + return openFuture().apply { capture { getUnserializable() } } + } + + override fun kotlinNPE() { + (null as Any?)!!.hashCode() + } + + override fun kotlinNPEAsync(): CordaFuture { + return openFuture().apply { capture { kotlinNPE() } } + } + } + + private fun rpc(proc: (Ops) -> Any?): Unit = rpcDriver { + val server = startRpcServer(ops = OpsImpl()).getOrThrow() + proc(startRpcClient(server.broker.hostAndPort!!).getOrThrow()) + } + + @Test + fun `kotlin NPE`() = rpc { + assertThatThrownBy { it.kotlinNPE() }.isInstanceOf(KotlinNullPointerException::class.java) + } + + @Test + fun `kotlin NPE async`() = rpc { + val future = it.kotlinNPEAsync() + assertThatThrownBy { future.getOrThrow() }.isInstanceOf(KotlinNullPointerException::class.java) + } + + @Test + fun `unserializable`() = rpc { + assertThatThrownBy { it.getUnserializable() }.isInstanceOf(KryoException::class.java) + } + + @Test + fun `unserializable async`() = rpc { + val future = it.getUnserializableAsync() + assertThatThrownBy { future.getOrThrow() }.isInstanceOf(KryoException::class.java) + } +} diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/RPCApi.kt b/node-api/src/main/kotlin/net/corda/nodeapi/RPCApi.kt index 408276fded..93ba7b3a27 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/RPCApi.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/RPCApi.kt @@ -170,7 +170,7 @@ object RPCApi { override fun writeToClientMessage(context: SerializationContext, message: ClientMessage) { message.putIntProperty(TAG_FIELD_NAME, Tag.RPC_REPLY.ordinal) message.putLongProperty(RPC_ID_FIELD_NAME, id.toLong) - message.bodyBuffer.writeBytes(result.serialize(context = context).bytes) + message.bodyBuffer.writeBytes(result.safeSerialize(context) { Try.Failure(it) }.bytes) } } @@ -181,11 +181,17 @@ object RPCApi { override fun writeToClientMessage(context: SerializationContext, message: ClientMessage) { message.putIntProperty(TAG_FIELD_NAME, Tag.OBSERVATION.ordinal) message.putLongProperty(OBSERVABLE_ID_FIELD_NAME, id.toLong) - message.bodyBuffer.writeBytes(content.serialize(context = context).bytes) + message.bodyBuffer.writeBytes(content.safeSerialize(context) { Notification.createOnError(it) }.bytes) } } companion object { + private fun Any.safeSerialize(context: SerializationContext, wrap: (Throwable) -> Any) = try { + serialize(context = context) + } catch (t: Throwable) { + wrap(t).serialize(context = context) + } + fun fromClientMessage(context: SerializationContext, message: ClientMessage): ServerToClient { val tag = Tag.values()[message.getIntProperty(TAG_FIELD_NAME)] return when (tag) { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt index 7d54a85007..5fa3d61e9c 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt @@ -139,7 +139,11 @@ object EmptyWhitelist : ClassWhitelist { } class BuiltInExceptionsWhitelist : ClassWhitelist { - override fun hasListed(type: Class<*>): Boolean = Throwable::class.java.isAssignableFrom(type) && type.`package`.name.startsWith("java.") + companion object { + private val packageName = "^(?:java|kotlin)(?:[.]|$)".toRegex() + } + + override fun hasListed(type: Class<*>) = Throwable::class.java.isAssignableFrom(type) && packageName.containsMatchIn(type.`package`.name) } object AllWhitelist : ClassWhitelist { From dc0b56432b96e2ce975da7bfd98c6888c063d839 Mon Sep 17 00:00:00 2001 From: Matthew Nesbit Date: Wed, 6 Sep 2017 10:11:30 +0100 Subject: [PATCH 107/120] Change PersistentIdentityService to use AppendOnlyPersistentMap as this has bounded memory and works correctly for the use case of repeated duplicate inserts. --- .../identity/PersistentIdentityService.kt | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt b/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt index b5f931408b..6774883ab9 100644 --- a/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt +++ b/node/src/main/kotlin/net/corda/node/services/identity/PersistentIdentityService.kt @@ -13,8 +13,8 @@ import net.corda.core.node.services.UnknownAnonymousPartyException import net.corda.core.serialization.SingletonSerializeAsToken import net.corda.core.utilities.cert import net.corda.core.utilities.loggerFor +import net.corda.node.utilities.AppendOnlyPersistentMap import net.corda.node.utilities.NODE_DATABASE_PREFIX -import net.corda.node.utilities.PersistentMap import org.bouncycastle.asn1.x500.X500Name import org.bouncycastle.cert.X509CertificateHolder import java.io.ByteArrayInputStream @@ -40,8 +40,8 @@ class PersistentIdentityService(identities: Iterable = empt private val log = loggerFor() private val certFactory: CertificateFactory = CertificateFactory.getInstance("X.509") - fun createPKMap(): PersistentMap { - return PersistentMap( + fun createPKMap(): AppendOnlyPersistentMap { + return AppendOnlyPersistentMap( toPersistentEntityKey = { it.toString() }, fromPersistentEntity = { Pair(SecureHash.parse(it.publicKeyHash), @@ -56,8 +56,8 @@ class PersistentIdentityService(identities: Iterable = empt ) } - fun createX500Map(): PersistentMap { - return PersistentMap( + fun createX500Map(): AppendOnlyPersistentMap { + return AppendOnlyPersistentMap( toPersistentEntityKey = { it.toString() }, fromPersistentEntity = { Pair(X500Name(it.name), SecureHash.parse(it.publicKeyHash)) }, toPersistentEntity = { key: X500Name, value: SecureHash -> @@ -104,10 +104,13 @@ class PersistentIdentityService(identities: Iterable = empt init { val caCertificatesWithRoot: Set = caCertificates.toSet() + trustRoot caCertStore = CertStore.getInstance("Collection", CollectionCertStoreParameters(caCertificatesWithRoot)) - keyToParties.putAll(identities.associateBy { mapToKey(it) }) - principalToParties.putAll(identities.associateBy({ it.name }, { mapToKey(it) })) - confidentialIdentities.forEach { identity -> - principalToParties.computeIfAbsent(identity.name) { mapToKey(identity) } + identities.forEach { + val key = mapToKey(it) + keyToParties.addWithDuplicatesAllowed(key, it) + principalToParties.addWithDuplicatesAllowed(it.name, key) + } + confidentialIdentities.forEach { + principalToParties.addWithDuplicatesAllowed(it.name, mapToKey(it)) } } @@ -122,9 +125,10 @@ class PersistentIdentityService(identities: Iterable = empt identity.verify(trustAnchor) log.info("Registering identity $identity") - keyToParties[mapToKey(identity)] = identity + val key = mapToKey(identity) + keyToParties.addWithDuplicatesAllowed(key, identity) // Always keep the first party we registered, as that's the well known identity - principalToParties.computeIfAbsent(identity.name) { mapToKey(identity) } + principalToParties.addWithDuplicatesAllowed(identity.name, key) val parentId = mapToKey(identity.certPath.certificates[1].publicKey) return keyToParties[parentId] } @@ -140,7 +144,7 @@ class PersistentIdentityService(identities: Iterable = empt override fun certificateFromParty(party: Party): PartyAndCertificate = certificateFromX500Name(party.name) ?: throw IllegalArgumentException("Unknown identity ${party.name}") // We give the caller a copy of the data set to avoid any locking problems - override fun getAllIdentities(): Iterable = ArrayList(keyToParties.values) + override fun getAllIdentities(): Iterable = keyToParties.allPersisted().map { it.second }.asIterable() override fun partyFromKey(key: PublicKey): Party? = certificateFromKey(key)?.party override fun partyFromX500Name(principal: X500Name): Party? = certificateFromX500Name(principal)?.party @@ -166,7 +170,7 @@ class PersistentIdentityService(identities: Iterable = empt override fun partiesFromName(query: String, exactMatch: Boolean): Set { val results = LinkedHashSet() - for ((x500name, partyId) in principalToParties) { + for ((x500name, partyId) in principalToParties.allPersisted()) { val party = keyToParties[partyId]!!.party for (rdn in x500name.rdNs) { val component = rdn.first.value.toString() From 6fa20e33dac43ddd4d517d0942c05064f659e827 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Wed, 6 Sep 2017 15:00:34 +0100 Subject: [PATCH 108/120] Remove unused `myKey` from TwoPartyDealFlow (#1436) --- .../kotlin/net/corda/finance/flows/TwoPartyDealFlow.kt | 3 --- .../src/main/kotlin/net/corda/irs/flows/AutoOfferFlow.kt | 2 -- .../src/main/kotlin/net/corda/irs/flows/FixingFlow.kt | 5 ----- .../kotlin/net/corda/netmap/simulation/IRSSimulation.kt | 8 +++----- .../src/main/kotlin/net/corda/vega/flows/IRSTradeFlow.kt | 3 +-- .../src/main/kotlin/net/corda/vega/flows/SimmFlow.kt | 3 +-- 6 files changed, 5 insertions(+), 19 deletions(-) diff --git a/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyDealFlow.kt b/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyDealFlow.kt index 91174c0a28..62245f11d0 100644 --- a/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyDealFlow.kt +++ b/finance/src/main/kotlin/net/corda/finance/flows/TwoPartyDealFlow.kt @@ -50,8 +50,6 @@ object TwoPartyDealFlow { abstract val payload: Any abstract val notaryNode: NodeInfo abstract val otherParty: Party - // TODO: This is never read from, and should be removed - abstract val myKey: PublicKey @Suspendable override fun call(): SignedTransaction { progressTracker.currentStep = GENERATING_ID @@ -169,7 +167,6 @@ object TwoPartyDealFlow { */ open class Instigator(override val otherParty: Party, override val payload: AutoOffer, - override val myKey: PublicKey, override val progressTracker: ProgressTracker = Primary.tracker()) : Primary() { override val notaryNode: NodeInfo get() = serviceHub.networkMapCache.notaryNodes.filter { it.notaryIdentity == payload.notary }.single() diff --git a/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/AutoOfferFlow.kt b/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/AutoOfferFlow.kt index 099d82c73a..bb7b27e9fc 100644 --- a/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/AutoOfferFlow.kt +++ b/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/AutoOfferFlow.kt @@ -52,11 +52,9 @@ object AutoOfferFlow { // need to pick which ever party is not us val otherParty = notUs(dealToBeOffered.participants).map { serviceHub.identityService.partyFromAnonymous(it) }.requireNoNulls().single() progressTracker.currentStep = DEALING - val myKey = serviceHub.legalIdentityKey val instigator = Instigator( otherParty, AutoOffer(notary, dealToBeOffered), - myKey, progressTracker.getChildProgressTracker(DEALING)!! ) val stx = subFlow(instigator) diff --git a/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt b/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt index 7ca5de5d61..c95dafe25a 100644 --- a/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt +++ b/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt @@ -103,17 +103,12 @@ object FixingFlow { class Floater(override val otherParty: Party, override val payload: FixingSession, override val progressTracker: ProgressTracker = TwoPartyDealFlow.Primary.tracker()) : TwoPartyDealFlow.Primary() { - @Suppress("UNCHECKED_CAST") internal val dealToFix: StateAndRef by transient { val state = serviceHub.loadState(payload.ref) as TransactionState StateAndRef(state, payload.ref) } - override val myKey: PublicKey get() { - return serviceHub.keyManagementService.filterMyKeys(dealToFix.state.data.participants.map(AbstractParty::owningKey)).single() - } - override val notaryNode: NodeInfo get() { return serviceHub.networkMapCache.notaryNodes.single { it.notaryIdentity == dealToFix.state.notary } } diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt index 021a787e6a..49b5d64c7c 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/IRSSimulation.kt @@ -136,10 +136,9 @@ class IRSSimulation(networkSendManuallyPumped: Boolean, runAsync: Boolean, laten @InitiatingFlow class StartDealFlow(val otherParty: Party, - val payload: AutoOffer, - val myKey: PublicKey) : FlowLogic() { + val payload: AutoOffer) : FlowLogic() { @Suspendable - override fun call(): SignedTransaction = subFlow(Instigator(otherParty, payload, myKey)) + override fun call(): SignedTransaction = subFlow(Instigator(otherParty, payload)) } @InitiatedBy(StartDealFlow::class) @@ -157,8 +156,7 @@ class IRSSimulation(networkSendManuallyPumped: Boolean, runAsync: Boolean, laten val instigator = StartDealFlow( node2.info.legalIdentity, - AutoOffer(notary.info.notaryIdentity, irs), - node1.services.legalIdentityKey) + AutoOffer(notary.info.notaryIdentity, irs)) val instigatorTxFuture = node1.services.startFlow(instigator).resultFuture return allOf(instigatorTxFuture.toCompletableFuture(), acceptorTxFuture).thenCompose { instigatorTxFuture.toCompletableFuture() } diff --git a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/flows/IRSTradeFlow.kt b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/flows/IRSTradeFlow.kt index ad8c949331..d167e347ae 100644 --- a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/flows/IRSTradeFlow.kt +++ b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/flows/IRSTradeFlow.kt @@ -40,8 +40,7 @@ object IRSTradeFlow { return subFlow(TwoPartyDealFlow.Instigator( otherParty, - TwoPartyDealFlow.AutoOffer(notary, offer), - serviceHub.legalIdentityKey)) + TwoPartyDealFlow.AutoOffer(notary, offer))) } } diff --git a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/flows/SimmFlow.kt b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/flows/SimmFlow.kt index 31acaa837d..e8565f65ec 100644 --- a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/flows/SimmFlow.kt +++ b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/flows/SimmFlow.kt @@ -291,8 +291,7 @@ object SimmFlow { val seller = TwoPartyDealFlow.Instigator( replyToParty, - TwoPartyDealFlow.AutoOffer(offer.notary, offer.dealBeingOffered), - serviceHub.legalIdentityKey) + TwoPartyDealFlow.AutoOffer(offer.notary, offer.dealBeingOffered)) logger.info("Starting two party deal initiator with: ${replyToParty.name}") return subFlow(seller) } From 999515db95a1597c1f19e9d676c022198eea41dd Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko Date: Wed, 6 Sep 2017 15:06:35 +0100 Subject: [PATCH 109/120] CORDA-540: Allow maps as roots of serialization graph (#1432) --- .../serialization/amqp/MapSerializer.kt | 34 +++++++++-- .../serialization/amqp/SerializerFactory.kt | 28 ++++----- .../serialization/ListsSerializationTest.kt | 11 ++-- .../serialization/MapsSerializationTest.kt | 57 +++++++++++++++++++ .../serialization/amqp/DeserializeMapTests.kt | 24 +++++--- 5 files changed, 123 insertions(+), 31 deletions(-) create mode 100644 node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/MapsSerializationTest.kt diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt index 314c9b6aa9..de803afc37 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt @@ -10,6 +10,8 @@ import kotlin.collections.Map import kotlin.collections.iterator import kotlin.collections.map +private typealias MapCreationFunction = (Map<*, *>) -> Map<*, *> + /** * Serialization / deserialization of certain supported [Map] types. */ @@ -18,7 +20,8 @@ class MapSerializer(private val declaredType: ParameterizedType, factory: Serial override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" companion object { - private val supportedTypes: Map, (Map<*, *>) -> Map<*, *>> = mapOf( + // NB: Order matters in this map, the most specific classes should be listed at the end + private val supportedTypes: Map>, MapCreationFunction> = Collections.unmodifiableMap(linkedMapOf( // Interfaces Map::class.java to { map -> Collections.unmodifiableMap(map) }, SortedMap::class.java to { map -> Collections.unmodifiableSortedMap(TreeMap(map)) }, @@ -26,13 +29,36 @@ class MapSerializer(private val declaredType: ParameterizedType, factory: Serial // concrete classes for user convenience LinkedHashMap::class.java to { map -> LinkedHashMap(map) }, TreeMap::class.java to { map -> TreeMap(map) } - ) - private fun findConcreteType(clazz: Class<*>): (Map<*, *>) -> Map<*, *> { + )) + + private fun findConcreteType(clazz: Class<*>): MapCreationFunction { return supportedTypes[clazz] ?: throw NotSerializableException("Unsupported map type $clazz.") } + + fun deriveParameterizedType(declaredType: Type, declaredClass: Class<*>, actualClass: Class<*>?): ParameterizedType { + if(supportedTypes.containsKey(declaredClass)) { + // Simple case - it is already known to be a map. + @Suppress("UNCHECKED_CAST") + return deriveParametrizedType(declaredType, declaredClass as Class>) + } + else if (actualClass != null && Map::class.java.isAssignableFrom(actualClass)) { + // Declared class is not map, but [actualClass] is - represent it accordingly. + val mapClass = findMostSuitableMapType(actualClass) + return deriveParametrizedType(declaredType, mapClass) + } + + throw NotSerializableException("Cannot derive map type for declaredType: '$declaredType', declaredClass: '$declaredClass', actualClass: '$actualClass'") + } + + private fun deriveParametrizedType(declaredType: Type, collectionClass: Class>): ParameterizedType = + (declaredType as? ParameterizedType) ?: DeserializedParameterizedType(collectionClass, arrayOf(SerializerFactory.AnyType, SerializerFactory.AnyType)) + + + private fun findMostSuitableMapType(actualClass: Class<*>): Class> = + MapSerializer.supportedTypes.keys.findLast { it.isAssignableFrom(actualClass) }!! } - private val concreteBuilder: (Map<*, *>) -> Map<*, *> = findConcreteType(declaredType.rawType as Class<*>) + private val concreteBuilder: MapCreationFunction = findConcreteType(declaredType.rawType as Class<*>) private val typeNotation: TypeNotation = RestrictedType(SerializerFactory.nameForType(declaredType), null, emptyList(), "map", Descriptor(typeDescriptor, null), emptyList()) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt index e98704aa1d..408c6400b9 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt @@ -4,7 +4,6 @@ import com.google.common.primitives.Primitives import com.google.common.reflect.TypeResolver import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.CordaSerializable -import net.corda.nodeapi.internal.serialization.amqp.CollectionSerializer.Companion.deriveParameterizedType import net.corda.nodeapi.internal.serialization.carpenter.* import org.apache.qpid.proton.amqp.* import java.io.NotSerializableException @@ -70,20 +69,23 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl: ClassLoader) { val actualType: Type = inferTypeVariables(actualClass, declaredClass, declaredType) ?: declaredType val serializer = when { + // Declared class may not be set to Collection, but actual class could be a collection. + // In this case use of CollectionSerializer is perfectly appropriate. (Collection::class.java.isAssignableFrom(declaredClass) || - // declared class may not be set to Collection, but actual class could be a collection. - // In this case use of CollectionSerializer is perfectly appropriate. - (actualClass != null && Collection::class.java.isAssignableFrom(actualClass))) -> { - - val declaredTypeAmended= deriveParameterizedType(declaredType, declaredClass, actualClass) - - serializersByType.computeIfAbsent(declaredTypeAmended) { - CollectionSerializer(declaredTypeAmended, this) - } + (actualClass != null && Collection::class.java.isAssignableFrom(actualClass))) -> { + val declaredTypeAmended= CollectionSerializer.deriveParameterizedType(declaredType, declaredClass, actualClass) + serializersByType.computeIfAbsent(declaredTypeAmended) { + CollectionSerializer(declaredTypeAmended, this) + } } - Map::class.java.isAssignableFrom(declaredClass) -> serializersByType.computeIfAbsent(declaredClass) { - makeMapSerializer(declaredType as? ParameterizedType ?: DeserializedParameterizedType( - declaredClass, arrayOf(AnyType, AnyType), null)) + // Declared class may not be set to Map, but actual class could be a map. + // In this case use of MapSerializer is perfectly appropriate. + (Map::class.java.isAssignableFrom(declaredClass) || + (actualClass != null && Map::class.java.isAssignableFrom(actualClass))) -> { + val declaredTypeAmended= MapSerializer.deriveParameterizedType(declaredType, declaredClass, actualClass) + serializersByType.computeIfAbsent(declaredClass) { + makeMapSerializer(declaredTypeAmended) + } } Enum::class.java.isAssignableFrom(declaredClass) -> serializersByType.computeIfAbsent(declaredClass) { EnumSerializer(actualType, actualClass ?: declaredClass, this) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt index a5e83e0c01..2d01f3466c 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt @@ -16,6 +16,7 @@ class ListsSerializationTest : TestDependencyInjectionBase() { @Test fun `check list can be serialized as root of serialization graph`() { + assertEqualAfterRoundTripSerialization(emptyList()) assertEqualAfterRoundTripSerialization(listOf(1)) assertEqualAfterRoundTripSerialization(listOf(1, 2)) } @@ -46,12 +47,12 @@ class ListsSerializationTest : TestDependencyInjectionBase() { Assertions.assertThatThrownBy { wrongPayloadType.serialize() } .isInstanceOf(NotSerializableException::class.java).hasMessageContaining("Cannot derive collection type for declaredType") } +} - private inline fun assertEqualAfterRoundTripSerialization(obj: T) { +internal inline fun assertEqualAfterRoundTripSerialization(obj: T) { - val serializedForm: SerializedBytes = obj.serialize() - val deserializedInstance = serializedForm.deserialize() + val serializedForm: SerializedBytes = obj.serialize() + val deserializedInstance = serializedForm.deserialize() - assertEquals(obj, deserializedInstance) - } + assertEquals(obj, deserializedInstance) } \ No newline at end of file diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/MapsSerializationTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/MapsSerializationTest.kt new file mode 100644 index 0000000000..78e0e10c31 --- /dev/null +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/MapsSerializationTest.kt @@ -0,0 +1,57 @@ +package net.corda.nodeapi.internal.serialization + +import net.corda.core.serialization.CordaSerializable +import net.corda.core.serialization.serialize +import net.corda.node.services.statemachine.SessionData +import net.corda.testing.TestDependencyInjectionBase +import net.corda.testing.amqpSpecific +import org.assertj.core.api.Assertions +import org.junit.Test +import org.bouncycastle.asn1.x500.X500Name +import java.io.NotSerializableException + +class MapsSerializationTest : TestDependencyInjectionBase() { + + private val smallMap = mapOf("foo" to "bar", "buzz" to "bull") + + @Test + fun `check EmptyMap serialization`() = amqpSpecific("kotlin.collections.EmptyMap is not enabled for Kryo serialization") { + assertEqualAfterRoundTripSerialization(emptyMap()) + } + + @Test + fun `check Map can be root of serialization graph`() { + assertEqualAfterRoundTripSerialization(smallMap) + } + + @Test + fun `check list can be serialized as part of SessionData`() { + val sessionData = SessionData(123, smallMap) + assertEqualAfterRoundTripSerialization(sessionData) + } + + @CordaSerializable + data class WrongPayloadType(val payload: HashMap) + + @Test + fun `check throws for forbidden declared type`() = amqpSpecific("Such exceptions are not expected in Kryo mode.") { + val payload = HashMap(smallMap) + val wrongPayloadType = WrongPayloadType(payload) + Assertions.assertThatThrownBy { wrongPayloadType.serialize() } + .isInstanceOf(NotSerializableException::class.java).hasMessageContaining("Cannot derive map type for declaredType") + } + + @CordaSerializable + data class MyKey(val keyContent: Double) + + @CordaSerializable + data class MyValue(val valueContent: X500Name) + + @Test + fun `check map serialization works with custom types`() { + val myMap = mapOf( + MyKey(1.0) to MyValue(X500Name("CN=one")), + MyKey(10.0) to MyValue(X500Name("CN=ten"))) + assertEqualAfterRoundTripSerialization(myMap) + } +} \ No newline at end of file diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeMapTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeMapTests.kt index 162756b06c..37dfb8d3f4 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeMapTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeMapTests.kt @@ -1,6 +1,8 @@ package net.corda.nodeapi.internal.serialization.amqp +import org.assertj.core.api.Assertions import org.junit.Test +import java.io.NotSerializableException import java.util.* class DeserializeCollectionTests { @@ -11,7 +13,7 @@ class DeserializeCollectionTests { private const val VERBOSE = false } - val sf = testDefaultFactory() + private val sf = testDefaultFactory() @Test fun mapTest() { @@ -57,7 +59,7 @@ class DeserializeCollectionTests { DeserializationInput(sf).deserialize(serialisedBytes) } - @Test(expected=java.io.NotSerializableException::class) + @Test fun dictionaryTest() { data class C(val c: Dictionary) val v : Hashtable = Hashtable() @@ -66,10 +68,11 @@ class DeserializeCollectionTests { val c = C(v) // expected to throw - TestSerializationOutput(VERBOSE, sf).serialize(c) + Assertions.assertThatThrownBy { TestSerializationOutput(VERBOSE, sf).serialize(c) } + .isInstanceOf(IllegalArgumentException::class.java).hasMessageContaining("Unable to serialise deprecated type class java.util.Dictionary.") } - @Test(expected=java.lang.IllegalArgumentException::class) + @Test fun hashtableTest() { data class C(val c: Hashtable) val v : Hashtable = Hashtable() @@ -78,24 +81,27 @@ class DeserializeCollectionTests { val c = C(v) // expected to throw - TestSerializationOutput(VERBOSE, sf).serialize(c) + Assertions.assertThatThrownBy { TestSerializationOutput(VERBOSE, sf).serialize(c) } + .isInstanceOf(NotSerializableException::class.java).hasMessageContaining("Cannot derive map type for declaredType") } - @Test(expected=java.lang.IllegalArgumentException::class) + @Test fun hashMapTest() { data class C(val c : HashMap) val c = C (HashMap (mapOf("A" to 1, "B" to 2))) // expect this to throw - TestSerializationOutput(VERBOSE, sf).serialize(c) + Assertions.assertThatThrownBy { TestSerializationOutput(VERBOSE, sf).serialize(c) } + .isInstanceOf(NotSerializableException::class.java).hasMessageContaining("Cannot derive map type for declaredType") } - @Test(expected=java.lang.IllegalArgumentException::class) + @Test fun weakHashMapTest() { data class C(val c : WeakHashMap) val c = C (WeakHashMap (mapOf("A" to 1, "B" to 2))) - TestSerializationOutput(VERBOSE, sf).serialize(c) + Assertions.assertThatThrownBy { TestSerializationOutput(VERBOSE, sf).serialize(c) } + .isInstanceOf(NotSerializableException::class.java).hasMessageContaining("Cannot derive map type for declaredType") } @Test From 810e6a230ea3d062e1ed267cde0bd088a00c2b65 Mon Sep 17 00:00:00 2001 From: Matthew Nesbit Date: Wed, 6 Sep 2017 15:07:26 +0100 Subject: [PATCH 110/120] Remove dead and expensive call to key management service --- .../kotlin/net/corda/node/services/vault/NodeVaultService.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt b/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt index 9bb3249da8..bf8cc64458 100644 --- a/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt +++ b/node/src/main/kotlin/net/corda/node/services/vault/NodeVaultService.kt @@ -169,7 +169,6 @@ class NodeVaultService(private val services: ServiceHub) : SingletonSerializeAsT } private fun notifyNotaryChange(txns: Iterable) { - val ourKeys = services.keyManagementService.keys fun makeUpdate(tx: NotaryChangeWireTransaction): Vault.Update { // We need to resolve the full transaction here because outputs are calculated from inputs // We also can't do filtering beforehand, since output encumbrance pointers get recalculated based on From 291a55d2d2e6018023b9e18a323a113b8c650e72 Mon Sep 17 00:00:00 2001 From: Matthew Nesbit Date: Wed, 6 Sep 2017 16:48:54 +0100 Subject: [PATCH 111/120] Remove some trivial syntax related warning messages. Fix whitespace Address PR comment --- .../contracts/asset/cash/selection/CashSelectionH2Impl.kt | 5 ++--- .../net/corda/node/services/vault/VaultQueryTests.kt | 3 +-- .../main/kotlin/net/corda/netmap/VisualiserViewModel.kt | 4 ++-- .../kotlin/net/corda/demobench/model/NodeController.kt | 4 ++-- .../main/kotlin/net/corda/demobench/views/NodeTabView.kt | 8 ++++---- .../src/main/kotlin/net/corda/explorer/views/Network.kt | 2 +- .../net/corda/explorer/views/cordapps/cash/CashViewer.kt | 8 ++++---- 7 files changed, 16 insertions(+), 18 deletions(-) diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2Impl.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2Impl.kt index 5687027c3a..e402103630 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2Impl.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2Impl.kt @@ -7,7 +7,6 @@ import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.StateRef import net.corda.core.contracts.TransactionState import net.corda.core.crypto.SecureHash -import net.corda.core.utilities.toBase58String import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.node.ServiceHub @@ -30,8 +29,8 @@ class CashSelectionH2Impl : CashSelection { val log = loggerFor() } - override fun isCompatible(metaData: DatabaseMetaData): Boolean { - return metaData.driverName == JDBC_DRIVER_NAME + override fun isCompatible(metadata: DatabaseMetaData): Boolean { + return metadata.driverName == JDBC_DRIVER_NAME } // coin selection retry loop counter, sleep (msecs) and lock for selecting states diff --git a/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt b/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt index b1516a14ea..17fe519f61 100644 --- a/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt @@ -3,7 +3,6 @@ package net.corda.node.services.vault import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash import net.corda.core.crypto.entropyToKeyPair -import net.corda.core.utilities.toBase58String import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.services.* @@ -1060,7 +1059,7 @@ class VaultQueryTests : TestDependencyInjectionBase() { } database.transaction { @Suppress("EXPECTED_CONDITION") - val pagingSpec = PageSpecification(DEFAULT_PAGE_NUM, MAX_PAGE_SIZE + 1) // overflow = -2147483648 + val pagingSpec = PageSpecification(DEFAULT_PAGE_NUM, @Suppress("INTEGER_OVERFLOW")MAX_PAGE_SIZE + 1) // overflow = -2147483648 val criteria = VaultQueryCriteria(status = Vault.StateStatus.ALL) vaultQuerySvc.queryBy(criteria, paging = pagingSpec) } diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt index 954359b89e..228088417e 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt @@ -7,9 +7,9 @@ import javafx.scene.layout.StackPane import javafx.scene.shape.Circle import javafx.scene.shape.Line import javafx.util.Duration -import net.corda.core.utilities.commonName import net.corda.core.node.ScreenCoordinate import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.commonName import net.corda.netmap.simulation.IRSSimulation import net.corda.testing.node.MockNetwork import org.bouncycastle.asn1.x500.X500Name @@ -85,7 +85,7 @@ class VisualiserViewModel { // bottom left: -23.2031,29.8406 // top right: 33.0469,64.3209 try { - return node.place.coordinate!!.project(view.mapImage.fitWidth, view.mapImage.fitHeight, 64.3209, 29.8406, -23.2031, 33.0469) + return node.place.coordinate.project(view.mapImage.fitWidth, view.mapImage.fitHeight, 64.3209, 29.8406, -23.2031, 33.0469) } catch(e: Exception) { throw Exception("Cannot project ${node.info.legalIdentity}", e) } diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt index e4d0b0ef5e..a9fdd71bc5 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt @@ -56,8 +56,8 @@ class NodeController(check: atRuntime = ::checkExists) : Controller() { baseDir, getX509Name( myLegalName = nodeData.legalName.value.trim(), - email = "corda@city.${location.countryCode!!.toLowerCase()}.example", - nearestCity = location.description!!, + email = "corda@city.${location.countryCode.toLowerCase()}.example", + nearestCity = location.description, country = location.countryCode ), nodeData.p2pPort.value, diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt index 7f1f8d44c0..f70ccd11f7 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt @@ -14,15 +14,15 @@ import javafx.scene.layout.Pane import javafx.scene.layout.Priority import javafx.stage.FileChooser import javafx.util.StringConverter -import net.corda.core.utilities.commonName import net.corda.core.internal.div import net.corda.core.internal.exists +import net.corda.core.internal.readAllLines +import net.corda.core.internal.writeLines import net.corda.core.node.CityDatabase import net.corda.core.node.WorldMapLocation -import net.corda.core.internal.readAllLines +import net.corda.core.utilities.commonName import net.corda.core.utilities.normaliseLegalName import net.corda.core.utilities.validateLegalName -import net.corda.core.internal.writeLines import net.corda.demobench.model.* import net.corda.demobench.ui.CloseableTab import org.controlsfx.control.CheckListView @@ -220,7 +220,7 @@ class NodeTabView : Fragment() { imageview { image = flags.get()[it.countryCode] } - label(it.description!!) + label(it.description) alignment = Pos.CENTER_LEFT } } diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt index f75f3aa1f7..0481534d5b 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/Network.kt @@ -99,7 +99,7 @@ class Network : CordaView() { copyableLabel(SimpleObjectProperty(node.legalIdentity.owningKey.toBase58String())).apply { minWidth = 400.0 } } row("Services :") { label(node.advertisedServices.map { it.info }.joinToString(", ")) } - node.getWorldMapLocation()?.apply { row("Location :") { label(this@apply.description!!) } } + node.getWorldMapLocation()?.apply { row("Location :") { label(this@apply.description) } } } } setOnMouseClicked { diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt index e332157467..86ab57bc53 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt @@ -22,8 +22,8 @@ import net.corda.client.jfx.utils.* import net.corda.core.contracts.Amount import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.withoutIssuer -import net.corda.core.utilities.commonName import net.corda.core.identity.AbstractParty +import net.corda.core.utilities.commonName import net.corda.explorer.formatters.AmountFormatter import net.corda.explorer.formatters.PartyNameFormatter import net.corda.explorer.identicon.identicon @@ -174,11 +174,11 @@ class CashViewer : CordaView("Cash") { * Next we create subgroups based on currency. [memberStates] here is all states holding currency [currency] issued by [issuer] above. * Note that these states will not be displayed in the TreeTable, but rather in the side pane if the user clicks on the row. */ - val currencyNodes = AggregatedList(memberStates, { it.state.data.amount.token.product }) { currency, memberStates -> + val currencyNodes = AggregatedList(memberStates, { it.state.data.amount.token.product }) { currency, groupedMemberStates -> /** * We sum the states in the subgroup, to be displayed in the "Local Currency" column */ - val amounts = memberStates.map { it.state.data.amount.withoutIssuer() } + val amounts = groupedMemberStates.map { it.state.data.amount.withoutIssuer() } val sumAmount = amounts.foldObservable(Amount(0, currency), Amount::plus) /** @@ -190,7 +190,7 @@ class CashViewer : CordaView("Cash") { /** * Finally assemble the actual TreeTable Currency node. */ - TreeItem(ViewerNode.CurrencyNode(sumAmount, equivSumAmount, memberStates)) + TreeItem(ViewerNode.CurrencyNode(sumAmount, equivSumAmount, groupedMemberStates)) } /** From 8d261faac0c0c768c358493436e54a5fa91d9d7d Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Wed, 6 Sep 2017 17:50:21 +0100 Subject: [PATCH 112/120] Correct outInputState -> ourInputState (#1435) --- .../kotlin/net/corda/docs/FxTransactionBuildTutorial.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/example-code/src/main/kotlin/net/corda/docs/FxTransactionBuildTutorial.kt b/docs/source/example-code/src/main/kotlin/net/corda/docs/FxTransactionBuildTutorial.kt index 759cabb4d9..13d6b13acc 100644 --- a/docs/source/example-code/src/main/kotlin/net/corda/docs/FxTransactionBuildTutorial.kt +++ b/docs/source/example-code/src/main/kotlin/net/corda/docs/FxTransactionBuildTutorial.kt @@ -109,10 +109,10 @@ class ForeignExchangeFlow(val tradeId: String, } else throw IllegalArgumentException("Our identity must be one of the parties in the trade.") // Call the helper method to identify suitable inputs and make the outputs - val (outInputStates, ourOutputStates) = prepareOurInputsAndOutputs(serviceHub, runId.uuid, localRequest) + val (ourInputStates, ourOutputStates) = prepareOurInputsAndOutputs(serviceHub, runId.uuid, localRequest) // identify the notary for our states - val notary = outInputStates.first().state.notary + val notary = ourInputStates.first().state.notary // ensure request to other side is for a consistent notary val remoteRequestWithNotary = remoteRequest.copy(notary = notary) @@ -142,7 +142,7 @@ class ForeignExchangeFlow(val tradeId: String, } // having collated the data create the full transaction. - val signedTransaction = buildTradeProposal(outInputStates, ourOutputStates, theirInputStates, theirOutputStates) + val signedTransaction = buildTradeProposal(ourInputStates, ourOutputStates, theirInputStates, theirOutputStates) // pass transaction details to the counterparty to revalidate and confirm with a signature // Allow otherParty to access our data to resolve the transaction. From 50c51493c365b6e616188ba8bfa8adaa9f0bcc07 Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko Date: Thu, 7 Sep 2017 11:17:55 +0100 Subject: [PATCH 113/120] CORDA-540: AMQP-forge "example-code" (#1439) --- .../net/corda/docs/WorkflowTransactionBuildTutorial.kt | 2 +- .../internal/serialization/amqp/SerializerFactory.kt | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/source/example-code/src/main/kotlin/net/corda/docs/WorkflowTransactionBuildTutorial.kt b/docs/source/example-code/src/main/kotlin/net/corda/docs/WorkflowTransactionBuildTutorial.kt index 1a95f67464..8d42157936 100644 --- a/docs/source/example-code/src/main/kotlin/net/corda/docs/WorkflowTransactionBuildTutorial.kt +++ b/docs/source/example-code/src/main/kotlin/net/corda/docs/WorkflowTransactionBuildTutorial.kt @@ -30,7 +30,7 @@ enum class WorkflowState { * Minimal contract to encode a simple workflow with one initial state and two possible eventual states. * It is assumed one party unilaterally submits and the other manually retrieves the deal and completes it. */ -data class TradeApprovalContract(private val blank: Void? = null) : Contract { +data class TradeApprovalContract(val blank: Unit? = null) : Contract { interface Commands : CommandData { class Issue : TypeOnlyCommandData(), Commands // Record receipt of deal details diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt index 408c6400b9..c0e2cc7af2 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt @@ -7,10 +7,7 @@ import net.corda.core.serialization.CordaSerializable import net.corda.nodeapi.internal.serialization.carpenter.* import org.apache.qpid.proton.amqp.* import java.io.NotSerializableException -import java.lang.reflect.GenericArrayType -import java.lang.reflect.ParameterizedType -import java.lang.reflect.Type -import java.lang.reflect.WildcardType +import java.lang.reflect.* import java.util.* import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArrayList @@ -346,6 +343,7 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl: ClassLoader) { is ParameterizedType -> "${nameForType(type.rawType)}<${type.actualTypeArguments.joinToString { nameForType(it) }}>" is GenericArrayType -> "${nameForType(type.genericComponentType)}[]" is WildcardType -> "Any" + is TypeVariable<*> -> "?" else -> throw NotSerializableException("Unable to render type $type to a string.") } From c293d6b18acb7b6ffb36c11594f3a8bfb150dcdb Mon Sep 17 00:00:00 2001 From: Shams Asari Date: Wed, 6 Sep 2017 17:36:13 +0100 Subject: [PATCH 114/120] Added check to receive and sendAndReceive to make sure the primitive classes aren't used (#1400) --- .idea/compiler.xml | 5 +++ .../net/corda/core/flows/FlowsInJavaTest.java | 43 +++++++++++++++++++ .../statemachine/FlowStateMachineImpl.kt | 20 ++++++--- 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 83b640e02c..652807fef9 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -14,6 +14,9 @@ + + + @@ -96,6 +99,8 @@ + + diff --git a/core/src/test/java/net/corda/core/flows/FlowsInJavaTest.java b/core/src/test/java/net/corda/core/flows/FlowsInJavaTest.java index 5c6308c2d5..af255b2938 100644 --- a/core/src/test/java/net/corda/core/flows/FlowsInJavaTest.java +++ b/core/src/test/java/net/corda/core/flows/FlowsInJavaTest.java @@ -1,6 +1,7 @@ package net.corda.core.flows; import co.paralleluniverse.fibers.Suspendable; +import com.google.common.primitives.Primitives; import net.corda.core.identity.Party; import net.corda.testing.node.MockNetwork; import org.junit.After; @@ -11,6 +12,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.Assert.fail; public class FlowsInJavaTest { @@ -41,6 +43,30 @@ public class FlowsInJavaTest { assertThat(result.get()).isEqualTo("Hello"); } + @Test + public void primitiveClassForReceiveType() throws InterruptedException { + // Using the primitive classes causes problems with the checkpointing so we use the wrapper classes and convert + // to the primitive class at callsite. + for (Class receiveType : Primitives.allWrapperTypes()) { + primitiveReceiveTypeTest(receiveType); + } + } + + private void primitiveReceiveTypeTest(Class receiveType) throws InterruptedException { + PrimitiveReceiveFlow flow = new PrimitiveReceiveFlow(node2.getInfo().getLegalIdentity(), receiveType); + Future result = node1.getServices().startFlow(flow).getResultFuture(); + mockNet.runNetwork(); + try { + result.get(); + fail("ExecutionException should have been thrown"); + } catch (ExecutionException e) { + assertThat(e.getCause()) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("primitive") + .hasMessageContaining(receiveType.getName()); + } + } + @InitiatingFlow private static class SendInUnwrapFlow extends FlowLogic { private final Party otherParty; @@ -74,4 +100,21 @@ public class FlowsInJavaTest { } } + @InitiatingFlow + private static class PrimitiveReceiveFlow extends FlowLogic { + private final Party otherParty; + private final Class receiveType; + + private PrimitiveReceiveFlow(Party otherParty, Class receiveType) { + this.otherParty = otherParty; + this.receiveType = receiveType; + } + + @Suspendable + @Override + public Void call() throws FlowException { + receive(Primitives.unwrap(receiveType), otherParty); + return null; + } + } } diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt index 977e1b416e..d8fa038ed2 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt @@ -1,9 +1,11 @@ package net.corda.node.services.statemachine import co.paralleluniverse.fibers.Fiber +import co.paralleluniverse.fibers.Fiber.parkAndSerialize import co.paralleluniverse.fibers.FiberScheduler import co.paralleluniverse.fibers.Suspendable import co.paralleluniverse.strands.Strand +import com.google.common.primitives.Primitives import net.corda.core.concurrent.CordaFuture import net.corda.core.crypto.SecureHash import net.corda.core.crypto.random63BitValue @@ -165,24 +167,26 @@ class FlowStateMachineImpl(override val id: StateMachineRunId, payload: Any, sessionFlow: FlowLogic<*>, retrySend: Boolean): UntrustworthyData { + requireNonPrimitive(receiveType) logger.debug { "sendAndReceive(${receiveType.name}, $otherParty, ${payload.toString().abbreviate(300)}) ..." } val session = getConfirmedSessionIfPresent(otherParty, sessionFlow) - val sessionData = if (session == null) { + val receivedSessionData: ReceivedSessionMessage = if (session == null) { val newSession = startNewSession(otherParty, sessionFlow, payload, waitForConfirmation = true, retryable = retrySend) // Only do a receive here as the session init has carried the payload - receiveInternal(newSession, receiveType) + receiveInternal(newSession, receiveType) } else { val sendData = createSessionData(session, payload) - sendAndReceiveInternal(session, sendData, receiveType) + sendAndReceiveInternal(session, sendData, receiveType) } - logger.debug { "Received ${sessionData.message.payload.toString().abbreviate(300)}" } - return sessionData.checkPayloadIs(receiveType) + logger.debug { "Received ${receivedSessionData.message.payload.toString().abbreviate(300)}" } + return receivedSessionData.checkPayloadIs(receiveType) } @Suspendable override fun receive(receiveType: Class, otherParty: Party, sessionFlow: FlowLogic<*>): UntrustworthyData { + requireNonPrimitive(receiveType) logger.debug { "receive(${receiveType.name}, $otherParty) ..." } val session = getConfirmedSession(otherParty, sessionFlow) val sessionData = receiveInternal(session, receiveType) @@ -190,6 +194,12 @@ class FlowStateMachineImpl(override val id: StateMachineRunId, return sessionData.checkPayloadIs(receiveType) } + private fun requireNonPrimitive(receiveType: Class<*>) { + require(!receiveType.isPrimitive) { + "Use the wrapper type ${Primitives.wrap(receiveType).name} instead of the primitive $receiveType.class" + } + } + @Suspendable override fun send(otherParty: Party, payload: Any, sessionFlow: FlowLogic<*>) { logger.debug { "send($otherParty, ${payload.toString().abbreviate(300)})" } From d9d17be284413f8db492ceda24a7a09672137436 Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko Date: Thu, 7 Sep 2017 13:31:41 +0100 Subject: [PATCH 115/120] CORDA-540: Small changes to make "finance" tests pass in AMQP mode (#1445) --- .../java/net/corda/finance/contracts/JavaCommercialPaper.java | 2 +- .../internal/serialization/amqp/CollectionSerializer.kt | 2 +- .../corda/nodeapi/internal/serialization/amqp/MapSerializer.kt | 2 +- .../nodeapi/internal/serialization/amqp/SerializationHelper.kt | 2 +- .../nodeapi/internal/serialization/amqp/SerializerFactory.kt | 3 +-- .../internal/serialization/amqp/SerializationOutputTests.kt | 2 +- 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java b/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java index c5e669f345..0f2d081043 100644 --- a/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java +++ b/finance/src/main/java/net/corda/finance/contracts/JavaCommercialPaper.java @@ -82,7 +82,7 @@ public class JavaCommercialPaper implements Contract { return owner; } - Amount> getFaceValue() { + public Amount> getFaceValue() { return faceValue; } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt index 7c7ff00d5d..737c9e7ee2 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt @@ -14,7 +14,7 @@ import kotlin.collections.Set * Serialization / deserialization of predefined set of supported [Collection] types covering mostly [List]s and [Set]s. */ class CollectionSerializer(val declaredType: ParameterizedType, factory: SerializerFactory) : AMQPSerializer { - override val type: Type = declaredType as? DeserializedParameterizedType ?: DeserializedParameterizedType.make(declaredType.toString()) + override val type: Type = declaredType as? DeserializedParameterizedType ?: DeserializedParameterizedType.make(SerializerFactory.nameForType(declaredType)) override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" companion object { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt index de803afc37..6bb802593f 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt @@ -16,7 +16,7 @@ private typealias MapCreationFunction = (Map<*, *>) -> Map<*, *> * Serialization / deserialization of certain supported [Map] types. */ class MapSerializer(private val declaredType: ParameterizedType, factory: SerializerFactory) : AMQPSerializer { - override val type: Type = declaredType as? DeserializedParameterizedType ?: DeserializedParameterizedType.make(declaredType.toString()) + override val type: Type = declaredType as? DeserializedParameterizedType ?: DeserializedParameterizedType.make(SerializerFactory.nameForType(declaredType)) override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" companion object { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt index 53a8ddf18e..8374a7b898 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt @@ -37,7 +37,7 @@ internal fun constructorForDeserialization(type: Type): KFunction? { val kotlinConstructors = clazz.kotlin.constructors val hasDefault = kotlinConstructors.any { it.parameters.isEmpty() } for (kotlinConstructor in kotlinConstructors) { - if (preferredCandidate == null && kotlinConstructors.size == 1 && !hasDefault) { + if (preferredCandidate == null && kotlinConstructors.size == 1) { preferredCandidate = kotlinConstructor } else if (preferredCandidate == null && kotlinConstructors.size == 2 && hasDefault && kotlinConstructor.parameters.isNotEmpty()) { preferredCandidate = kotlinConstructor diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt index c0e2cc7af2..b184255a53 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt @@ -27,7 +27,6 @@ data class schemaAndDescriptor(val schema: Schema, val typeDescriptor: Any) // TODO: use guava caches etc so not unbounded // TODO: do we need to support a transient annotation to exclude certain properties? // TODO: allow definition of well known types that are left out of the schema. -// TODO: generally map Object to '*' all over the place in the schema and make sure use of '*' amd '?' is consistent and documented in generics. // TODO: found a document that states textual descriptors are Symbols. Adjust schema class appropriately. // TODO: document and alert to the fact that classes cannot default superclass/interface properties otherwise they are "erased" due to matching with constructor. // TODO: type name prefixes for interfaces and abstract classes? Or use label? @@ -342,7 +341,7 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl: ClassLoader) { } is ParameterizedType -> "${nameForType(type.rawType)}<${type.actualTypeArguments.joinToString { nameForType(it) }}>" is GenericArrayType -> "${nameForType(type.genericComponentType)}[]" - is WildcardType -> "Any" + is WildcardType -> "?" is TypeVariable<*> -> "?" else -> throw NotSerializableException("Unable to render type $type to a string.") } diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt index f2798fcdfd..8945903f6b 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt @@ -266,7 +266,7 @@ class SerializationOutputTests { serdes(obj) } - @Test(expected = NotSerializableException::class) + @Test fun `test top level list array`() { val obj = arrayOf(listOf("Fred", "Ginger"), listOf("Rogers", "Hammerstein")) serdes(obj) From 57412d449866b2403cd390bbedde3bf16a3fe6dc Mon Sep 17 00:00:00 2001 From: Patrick Kuo Date: Thu, 7 Sep 2017 14:47:42 +0100 Subject: [PATCH 116/120] Enforce X500Name format defined in design doc (#1427) * Standardise X500Name format - WIP * address PR issues * failing test fix and replace X500Name with getX500Name * gradle plugin fix * Added country code validation --- build.gradle | 8 +- .../rpc/StandaloneCordaRPCJavaClientTest.java | 4 +- .../kotlin/rpc/StandaloneCordaRPClientTest.kt | 18 +- config/dev/generalnodea.conf | 4 +- config/dev/generalnodeb.conf | 2 +- config/dev/nameservernode.conf | 2 +- constants.properties | 2 +- .../kotlin/net/corda/core/node/NodeInfo.kt | 6 +- .../net/corda/core/utilities/CountryCode.kt | 253 ++++++++++++ .../core/utilities/LegalNameValidator.kt | 199 ++++++---- .../net/corda/core/utilities/X500NameUtils.kt | 90 ++--- .../corda/core/crypto/CompositeKeyTests.kt | 6 +- .../core/crypto/X509NameConstraintsTest.kt | 7 +- .../core/identity/PartyAndCertificateTest.kt | 4 +- .../net/corda/core/node/ServiceInfoTests.kt | 4 +- .../core/utilities/LegalNameValidatorTest.kt | 30 ++ docs/source/corda-configuration-file.rst | 2 +- docs/source/deploying-a-node.rst | 4 +- docs/source/example-code/build.gradle | 6 +- .../java/net/corda/docs/FlowCookbookJava.java | 8 +- .../kotlin/net/corda/docs/FlowCookbook.kt | 13 +- .../resources/example-network-map-node.conf | 2 +- .../src/main/resources/example-node.conf | 4 +- .../example-out-of-process-verifier-node.conf | 4 +- docs/source/hello-world-running.rst | 6 +- docs/source/shell.rst | 2 +- docs/source/tutorial-cordapp.rst | 22 +- .../contracts/universal/PrettyPrint.kt | 6 +- .../net/corda/finance/contracts/asset/Cash.kt | 16 +- .../finance/contracts/asset/Obligation.kt | 11 +- .../main/groovy/net/corda/plugins/Node.groovy | 2 +- .../corda/nodeapi/config/ConfigUtilities.kt | 1 - .../corda/nodeapi/config/ConfigParsingTest.kt | 4 +- .../node/services/AdvertisedServiceTests.kt | 4 +- .../node/services/BFTNotaryServiceTests.kt | 4 +- .../node/services/RaftNotaryServiceTests.kt | 4 +- .../services/messaging/P2PMessagingTest.kt | 5 +- .../services/messaging/P2PSecurityTest.kt | 7 +- .../net/corda/node/internal/AbstractNode.kt | 32 +- .../net/corda/node/internal/NodeStartup.kt | 10 +- .../node/services/config/ConfigUtilities.kt | 15 +- .../node/services/config/NodeConfiguration.kt | 2 + .../identity/InMemoryIdentityService.kt | 16 +- .../services/messaging/NodeMessagingClient.kt | 3 +- .../node/shell/FlowWatchPrintingSubscriber.kt | 4 +- .../corda/node/utilities/KeyStoreUtilities.kt | 3 +- .../net/corda/node/utilities/X509Utilities.kt | 15 +- .../registration/NetworkRegistrationHelper.kt | 5 +- .../kotlin/net/corda/node/CordappSmokeTest.kt | 4 +- .../corda/node/services/NotaryChangeTests.kt | 3 +- .../config/FullNodeConfigurationTest.kt | 6 +- .../events/NodeSchedulerServiceTest.kt | 10 +- .../network/AbstractNetworkMapServiceTest.kt | 3 +- .../network/InMemoryIdentityServiceTests.kt | 9 +- .../network/PersistentIdentityServiceTests.kt | 5 +- .../statemachine/FlowFrameworkTests.kt | 7 +- .../node/services/vault/VaultQueryTests.kt | 364 +++++++++--------- .../corda/node/utilities/X509UtilitiesTest.kt | 28 +- .../NetworkisRegistrationHelperTest.kt | 8 +- samples/attachment-demo/build.gradle | 8 +- samples/bank-of-corda-demo/build.gradle | 8 +- .../net/corda/bank/BankOfCordaDriver.kt | 4 +- samples/irs-demo/build.gradle | 8 +- .../resources/irsweb/js/viewmodel/FixedLeg.js | 2 +- .../irsweb/js/viewmodel/FloatingLeg.js | 2 +- .../irs/simulation/example-irs-trade.json | 4 +- .../corda/irs/api/NodeInterestRatesTest.kt | 3 +- .../net/corda/netmap/NetworkMapVisualiser.kt | 4 +- .../net/corda/netmap/VisualiserViewModel.kt | 7 +- .../net/corda/netmap/simulation/Simulation.kt | 16 +- .../net/corda/notarydemo/BFTNotaryCordform.kt | 22 +- .../corda/notarydemo/RaftNotaryCordform.kt | 23 +- samples/simm-valuation-demo/build.gradle | 10 +- .../net/corda/vega/api/PortfolioApiUtils.kt | 8 +- .../app/viewmodel/FixedLegViewModel.js | 2 +- .../src/app/viewmodel/FixedLegViewModel.ts | 2 +- samples/trader-demo/build.gradle | 10 +- .../corda/testing/FlowStackSnapshotTest.kt | 2 +- .../kotlin/net/corda/testing/NodeTestUtils.kt | 3 +- .../kotlin/net/corda/testing/driver/Driver.kt | 15 +- .../testing/node/InMemoryMessagingNetwork.kt | 4 +- .../corda/testing/node/MockNetworkMapCache.kt | 6 +- .../kotlin/net/corda/testing/node/MockNode.kt | 4 +- .../net/corda/testing/node/NodeBasedTest.kt | 14 +- .../net/corda/testing/node/SimpleNode.kt | 8 +- .../net/corda/smoketesting/NodeConfig.kt | 4 +- .../kotlin/net/corda/testing/CoreTestUtils.kt | 31 +- .../kotlin/net/corda/testing/TestConstants.kt | 26 +- .../corda/testing/messaging/SimpleMQClient.kt | 4 +- .../corda/demobench/model/NetworkMapConfig.kt | 6 +- .../net/corda/demobench/model/NodeConfig.kt | 4 +- .../corda/demobench/model/NodeController.kt | 11 +- .../kotlin/net/corda/demobench/pty/R3Pty.kt | 4 +- .../net/corda/demobench/views/NodeTabView.kt | 4 +- .../corda/demobench/views/NodeTerminalView.kt | 4 +- .../demobench/model/NetworkMapConfigTest.kt | 2 +- .../corda/demobench/model/NodeConfigTest.kt | 13 +- .../demobench/model/NodeControllerTest.kt | 11 +- .../net/corda/explorer/ExplorerSimulation.kt | 6 +- .../explorer/formatters/PartyNameFormatter.kt | 4 +- .../corda/explorer/views/TransactionViewer.kt | 8 +- .../views/cordapps/cash/CashViewer.kt | 4 +- .../net/corda/verifier/GeneratedLedger.kt | 4 +- .../net/corda/verifier/VerifierDriver.kt | 10 +- 104 files changed, 1000 insertions(+), 687 deletions(-) create mode 100644 core/src/main/kotlin/net/corda/core/utilities/CountryCode.kt diff --git a/build.gradle b/build.gradle index ba78f59ae8..f16c378b85 100644 --- a/build.gradle +++ b/build.gradle @@ -216,15 +216,15 @@ tasks.withType(Test) { task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" - networkMap "CN=Controller,O=R3,OU=corda,L=London,C=GB" + networkMap "O=Controller,OU=corda,L=London,C=GB" node { - name "CN=Controller,O=R3,OU=corda,L=London,C=GB" + name "O=Controller,OU=corda,L=London,C=GB" advertisedServices = ["corda.notary.validating"] p2pPort 10002 cordapps = [] } node { - name "CN=Bank A,O=R3,OU=corda,L=London,C=GB" + name "O=Bank A,OU=corda,L=London,C=GB" advertisedServices = [] p2pPort 10012 rpcPort 10013 @@ -232,7 +232,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { cordapps = [] } node { - name "CN=Bank B,O=R3,OU=corda,L=London,C=GB" + name "O=Bank B,OU=corda,L=London,C=GB" advertisedServices = [] p2pPort 10007 rpcPort 10008 diff --git a/client/rpc/src/smoke-test/java/net/corda/java/rpc/StandaloneCordaRPCJavaClientTest.java b/client/rpc/src/smoke-test/java/net/corda/java/rpc/StandaloneCordaRPCJavaClientTest.java index 2cd3ad6628..5a8a8349eb 100644 --- a/client/rpc/src/smoke-test/java/net/corda/java/rpc/StandaloneCordaRPCJavaClientTest.java +++ b/client/rpc/src/smoke-test/java/net/corda/java/rpc/StandaloneCordaRPCJavaClientTest.java @@ -6,12 +6,12 @@ import net.corda.core.messaging.CordaRPCOps; import net.corda.core.messaging.FlowHandle; import net.corda.core.node.NodeInfo; import net.corda.core.utilities.OpaqueBytes; +import net.corda.core.utilities.X500NameUtils; import net.corda.finance.flows.AbstractCashFlow; import net.corda.finance.flows.CashIssueFlow; import net.corda.nodeapi.User; import net.corda.smoketesting.NodeConfig; import net.corda.smoketesting.NodeProcess; -import org.bouncycastle.asn1.x500.X500Name; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -43,7 +43,7 @@ public class StandaloneCordaRPCJavaClientTest { private NodeInfo notaryNode; private NodeConfig notaryConfig = new NodeConfig( - new X500Name("CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH"), + X500NameUtils.getX500Name("Notary Service", "Zurich", "CH"), port.getAndIncrement(), port.getAndIncrement(), port.getAndIncrement(), diff --git a/client/rpc/src/smoke-test/kotlin/net/corda/kotlin/rpc/StandaloneCordaRPClientTest.kt b/client/rpc/src/smoke-test/kotlin/net/corda/kotlin/rpc/StandaloneCordaRPClientTest.kt index a8c670dc2a..4fab64c88f 100644 --- a/client/rpc/src/smoke-test/kotlin/net/corda/kotlin/rpc/StandaloneCordaRPClientTest.kt +++ b/client/rpc/src/smoke-test/kotlin/net/corda/kotlin/rpc/StandaloneCordaRPClientTest.kt @@ -9,10 +9,7 @@ import net.corda.core.messaging.* import net.corda.core.node.NodeInfo import net.corda.core.node.services.Vault import net.corda.core.node.services.vault.* -import net.corda.core.utilities.OpaqueBytes -import net.corda.core.utilities.getOrThrow -import net.corda.core.utilities.loggerFor -import net.corda.core.utilities.seconds +import net.corda.core.utilities.* import net.corda.finance.DOLLARS import net.corda.finance.POUNDS import net.corda.finance.SWISS_FRANCS @@ -26,7 +23,6 @@ import net.corda.nodeapi.User import net.corda.smoketesting.NodeConfig import net.corda.smoketesting.NodeProcess import org.apache.commons.io.output.NullOutputStream -import org.bouncycastle.asn1.x500.X500Name import org.junit.After import org.junit.Before import org.junit.Test @@ -58,12 +54,12 @@ class StandaloneCordaRPClientTest { private lateinit var notaryNode: NodeInfo private val notaryConfig = NodeConfig( - legalName = X500Name("CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH"), - p2pPort = port.andIncrement, - rpcPort = port.andIncrement, - webPort = port.andIncrement, - extraServices = listOf("corda.notary.validating"), - users = listOf(user) + legalName = getX500Name(O = "Notary Service", OU = "corda", L = "Zurich", C = "CH"), + p2pPort = port.andIncrement, + rpcPort = port.andIncrement, + webPort = port.andIncrement, + extraServices = listOf("corda.notary.validating"), + users = listOf(user) ) @Before diff --git a/config/dev/generalnodea.conf b/config/dev/generalnodea.conf index 94b08cfc0c..16eb90f526 100644 --- a/config/dev/generalnodea.conf +++ b/config/dev/generalnodea.conf @@ -1,4 +1,4 @@ -myLegalName : "CN=Bank A,O=Bank A,L=London,C=GB" +myLegalName : "O=Bank A,L=London,C=GB" keyStorePassword : "cordacadevpass" trustStorePassword : "trustpass" p2pAddress : "localhost:10002" @@ -7,6 +7,6 @@ webAddress : "localhost:10004" extraAdvertisedServiceIds : [ "corda.interest_rates" ] networkMapService : { address : "localhost:10000" - legalName : "CN=Network Map Service,O=R3,OU=corda,L=London,C=GB" + legalName : "O=Network Map Service,OU=corda,L=London,C=GB" } useHTTPS : false diff --git a/config/dev/generalnodeb.conf b/config/dev/generalnodeb.conf index 0fe9e66d9c..1eb839aece 100644 --- a/config/dev/generalnodeb.conf +++ b/config/dev/generalnodeb.conf @@ -7,6 +7,6 @@ webAddress : "localhost:10007" extraAdvertisedServiceIds : [ "corda.interest_rates" ] networkMapService : { address : "localhost:10000" - legalName : "CN=Network Map Service,O=R3,OU=corda,L=London,C=GB" + legalName : "O=Network Map Service,OU=corda,L=London,C=GB" } useHTTPS : false diff --git a/config/dev/nameservernode.conf b/config/dev/nameservernode.conf index 154f88aad9..664f2b6816 100644 --- a/config/dev/nameservernode.conf +++ b/config/dev/nameservernode.conf @@ -1,4 +1,4 @@ -myLegalName : "CN=Notary Service,O=R3,OU=corda,L=London,C=GB" +myLegalName : "O=Notary Service,OU=corda,L=London,C=GB" keyStorePassword : "cordacadevpass" trustStorePassword : "trustpass" p2pAddress : "localhost:10000" diff --git a/constants.properties b/constants.properties index ded142b810..68c33706ba 100644 --- a/constants.properties +++ b/constants.properties @@ -1,4 +1,4 @@ -gradlePluginsVersion=0.16.0 +gradlePluginsVersion=0.16.1 kotlinVersion=1.1.4 guavaVersion=21.0 bouncycastleVersion=1.57 diff --git a/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt b/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt index 32a8a20a21..322fcf3d5a 100644 --- a/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt +++ b/core/src/main/kotlin/net/corda/core/node/NodeInfo.kt @@ -6,7 +6,7 @@ import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.ServiceType import net.corda.core.serialization.CordaSerializable import net.corda.core.utilities.NetworkHostAndPort -import net.corda.core.utilities.locationOrNull +import net.corda.core.utilities.locality /** * Information for an advertised service including the service specific identity information. @@ -44,7 +44,7 @@ data class NodeInfo(val addresses: List, * Uses node's owner X500 name to infer the node's location. Used in Explorer in map view. */ fun getWorldMapLocation(): WorldMapLocation? { - val nodeOwnerLocation = legalIdentity.name.locationOrNull - return nodeOwnerLocation?.let { CityDatabase[it] } + val nodeOwnerLocation = legalIdentity.name.locality + return nodeOwnerLocation.let { CityDatabase[it] } } } diff --git a/core/src/main/kotlin/net/corda/core/utilities/CountryCode.kt b/core/src/main/kotlin/net/corda/core/utilities/CountryCode.kt new file mode 100644 index 0000000000..94f0770279 --- /dev/null +++ b/core/src/main/kotlin/net/corda/core/utilities/CountryCode.kt @@ -0,0 +1,253 @@ +package net.corda.core.utilities + +val countryCodes = hashSetOf( + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "KH", + "CM", + "CA", + "CV", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MK", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SZ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" +) \ No newline at end of file diff --git a/core/src/main/kotlin/net/corda/core/utilities/LegalNameValidator.kt b/core/src/main/kotlin/net/corda/core/utilities/LegalNameValidator.kt index f03ff70048..8081a16e8e 100644 --- a/core/src/main/kotlin/net/corda/core/utilities/LegalNameValidator.kt +++ b/core/src/main/kotlin/net/corda/core/utilities/LegalNameValidator.kt @@ -3,6 +3,7 @@ package net.corda.core.utilities import org.bouncycastle.asn1.x500.X500Name +import org.bouncycastle.asn1.x500.style.BCStyle import java.lang.Character.UnicodeScript.* import java.text.Normalizer import java.util.regex.Pattern @@ -21,16 +22,9 @@ import javax.security.auth.x500.X500Principal * @throws IllegalArgumentException if the name does not meet the required rules. The message indicates why not. */ fun validateLegalName(normalizedLegalName: String) { - legalNameRules.forEach { it.validate(normalizedLegalName) } + Rule.legalNameRules.forEach { it.validate(normalizedLegalName) } } -// TODO: Implement X500 attribute validation once the specification has been finalised. -fun validateX500Name(x500Name: X500Name) { - validateLegalName(x500Name.commonName) -} - -val WHITESPACE = "\\s++".toRegex() - /** * The normalize function will trim the input string, replace any multiple spaces with a single space, * and normalize the string according to NFKC normalization form. @@ -40,82 +34,137 @@ fun normaliseLegalName(legalName: String): String { return Normalizer.normalize(trimmedLegalName, Normalizer.Form.NFKC) } -private val legalNameRules: List> = listOf( - UnicodeNormalizationRule(), - CharacterRule(',', '=', '$', '"', '\'', '\\'), - WordRule("node", "server"), - LengthRule(maxLength = 255), - // TODO: Implement confusable character detection if we add more scripts. - UnicodeRangeRule(LATIN, COMMON, INHERITED), - CapitalLetterRule(), - X500NameRule(), - MustHaveAtLeastTwoLettersRule() -) +val WHITESPACE = "\\s++".toRegex() -private class UnicodeNormalizationRule : Rule { - override fun validate(legalName: String) { - require(legalName == normaliseLegalName(legalName)) { "Legal name must be normalized. Please use 'normaliseLegalName' to normalize the legal name before validation." } +private val mandatoryAttributes = setOf(BCStyle.O, BCStyle.C, BCStyle.L) +private val supportedAttributes = mandatoryAttributes + setOf(BCStyle.CN, BCStyle.ST, BCStyle.OU) + +/** + * Validate X500Name according to Corda X500Name specification + * + * Supported attributes: + * - organisation (O) – VARCHAR(127) + * - state (ST) – VARCHAR(64) nullable + * - locality (L) – VARCHAR(64) + * - country (C) – VARCHAR(2) - ISO code of the country in which it is registered + * - organizational-unit (OU) – VARCHAR(64) nullable + * - common name (CN) – VARCHAR(64) + * + * @throws IllegalArgumentException if the name does not meet the required rules. The message indicates why not. + * @see Design Doc. + */ +fun validateX500Name(x500Name: X500Name) { + val rDNs = x500Name.rdNs.flatMap { it.typesAndValues.toList() } + val attributes = rDNs.map { it.type } + + // Duplicate attribute value checks. + require(attributes.size == attributes.toSet().size) { "X500Name contain duplicate attribute." } + + // Mandatory attribute checks. + require(attributes.containsAll(mandatoryAttributes)) { + val missingAttributes = mandatoryAttributes.subtract(attributes).map { BCStyle.INSTANCE.oidToDisplayName(it) } + "The following attribute${if (missingAttributes.size > 1) "s are" else " is"} missing from the legal name : $missingAttributes" } + + // Supported attribute checks. + require(attributes.subtract(supportedAttributes).isEmpty()) { + val unsupportedAttributes = attributes.subtract(supportedAttributes).map { BCStyle.INSTANCE.oidToDisplayName(it) } + "The following attribute${if (unsupportedAttributes.size > 1) "s are" else " is"} not supported in Corda :$unsupportedAttributes" + } + // Legal name checks. + validateLegalName(x500Name.organisation) + + // Attribute data width checks. + require(x500Name.country.length == 2) { "Invalid country '${x500Name.country}' Country code must be 2 letters ISO code " } + require(x500Name.country.toUpperCase() == x500Name.country) { "Country code should be in upper case." } + require(countryCodes.contains(x500Name.country)) { "Invalid country code '${x500Name.country}'" } + + require(x500Name.organisation.length < 127) { "Organisation attribute (O) must contain less then 127 characters." } + require(x500Name.locality.length < 64) { "Locality attribute (L) must contain less then 64 characters." } + + x500Name.state?.let { require(it.length < 64) { "State attribute (ST) must contain less then 64 characters." } } + x500Name.organisationUnit?.let { require(x500Name.organisationUnit!!.length < 64) { "Organisation Unit attribute (OU) must contain less then 64 characters." } } + x500Name.commonName?.let { require(x500Name.commonName!!.length < 64) { "Common Name attribute (CN) must contain less then 64 characters." } } } -private class UnicodeRangeRule(vararg supportScripts: Character.UnicodeScript) : Rule { - private val pattern = supportScripts.map { "\\p{Is$it}" }.joinToString(separator = "", prefix = "[", postfix = "]*").let { Pattern.compile(it) } +private sealed class Rule { + companion object { + val legalNameRules: List> = listOf( + UnicodeNormalizationRule(), + CharacterRule(',', '=', '$', '"', '\'', '\\'), + WordRule("node", "server"), + LengthRule(maxLength = 255), + // TODO: Implement confusable character detection if we add more scripts. + UnicodeRangeRule(LATIN, COMMON, INHERITED), + CapitalLetterRule(), + X500NameRule(), + MustHaveAtLeastTwoLettersRule() + ) + } - override fun validate(legalName: String) { - require(pattern.matcher(legalName).matches()) { - val illegalChars = legalName.replace(pattern.toRegex(), "").toSet() - if (illegalChars.size > 1) { - "Forbidden characters $illegalChars in \"$legalName\"." - } else { - "Forbidden character $illegalChars in \"$legalName\"." + abstract fun validate(legalName: T) + + private class UnicodeNormalizationRule : Rule() { + override fun validate(legalName: String) { + require(legalName == normaliseLegalName(legalName)) { "Legal name must be normalized. Please use 'normaliseLegalName' to normalize the legal name before validation." } + } + } + + private class UnicodeRangeRule(vararg supportScripts: Character.UnicodeScript) : Rule() { + private val pattern = supportScripts.map { "\\p{Is$it}" }.joinToString(separator = "", prefix = "[", postfix = "]*").let { Pattern.compile(it) } + + override fun validate(legalName: String) { + require(pattern.matcher(legalName).matches()) { + val illegalChars = legalName.replace(pattern.toRegex(), "").toSet() + if (illegalChars.size > 1) { + "Forbidden characters $illegalChars in \"$legalName\"." + } else { + "Forbidden character $illegalChars in \"$legalName\"." + } } } } -} -private class CharacterRule(vararg val bannedChars: Char) : Rule { - override fun validate(legalName: String) { - bannedChars.forEach { - require(!legalName.contains(it, true)) { "Character not allowed in legal names: $it" } + private class CharacterRule(vararg val bannedChars: Char) : Rule() { + override fun validate(legalName: String) { + bannedChars.forEach { + require(!legalName.contains(it, true)) { "Character not allowed in legal names: $it" } + } + } + } + + private class WordRule(vararg val bannedWords: String) : Rule() { + override fun validate(legalName: String) { + bannedWords.forEach { + require(!legalName.contains(it, ignoreCase = true)) { "Word not allowed in legal names: $it" } + } + } + } + + private class LengthRule(val maxLength: Int) : Rule() { + override fun validate(legalName: String) { + require(legalName.length <= maxLength) { "Legal name longer then $maxLength characters." } + } + } + + private class CapitalLetterRule : Rule() { + override fun validate(legalName: String) { + val capitalizedLegalName = legalName.capitalize() + require(legalName == capitalizedLegalName) { "Legal name should be capitalized. i.e. '$capitalizedLegalName'" } + } + } + + private class X500NameRule : Rule() { + override fun validate(legalName: String) { + // This will throw IllegalArgumentException if the name does not comply with X500 name format. + X500Principal("CN=$legalName") + } + } + + private class MustHaveAtLeastTwoLettersRule : Rule() { + override fun validate(legalName: String) { + // Try to exclude names like "/", "£", "X" etc. + require(legalName.count { it.isLetter() } >= 2) { "Illegal input legal name '$legalName'. Legal name must have at least two letters" } } } } - -private class WordRule(vararg val bannedWords: String) : Rule { - override fun validate(legalName: String) { - bannedWords.forEach { - require(!legalName.contains(it, ignoreCase = true)) { "Word not allowed in legal names: $it" } - } - } -} - -private class LengthRule(val maxLength: Int) : Rule { - override fun validate(legalName: String) { - require(legalName.length <= maxLength) { "Legal name longer then $maxLength characters." } - } -} - -private class CapitalLetterRule : Rule { - override fun validate(legalName: String) { - val capitalizedLegalName = legalName.capitalize() - require(legalName == capitalizedLegalName) { "Legal name should be capitalized. i.e. '$capitalizedLegalName'" } - } -} - -private class X500NameRule : Rule { - override fun validate(legalName: String) { - // This will throw IllegalArgumentException if the name does not comply with X500 name format. - X500Principal("CN=$legalName") - } -} - -private class MustHaveAtLeastTwoLettersRule : Rule { - override fun validate(legalName: String) { - // Try to exclude names like "/", "£", "X" etc. - require(legalName.count { it.isLetter() } >= 2) { "Illegal input legal name '$legalName'. Legal name must have at least two letters" } - } -} - -private interface Rule { - fun validate(legalName: T) -} diff --git a/core/src/main/kotlin/net/corda/core/utilities/X500NameUtils.kt b/core/src/main/kotlin/net/corda/core/utilities/X500NameUtils.kt index 74a08ce4fa..a1cf8f8933 100644 --- a/core/src/main/kotlin/net/corda/core/utilities/X500NameUtils.kt +++ b/core/src/main/kotlin/net/corda/core/utilities/X500NameUtils.kt @@ -1,8 +1,9 @@ @file:JvmName("X500NameUtils") + package net.corda.core.utilities import net.corda.core.internal.toX509CertHolder -import org.bouncycastle.asn1.ASN1Encodable +import org.bouncycastle.asn1.ASN1ObjectIdentifier import org.bouncycastle.asn1.x500.X500Name import org.bouncycastle.asn1.x500.X500NameBuilder import org.bouncycastle.asn1.x500.style.BCStyle @@ -11,68 +12,47 @@ import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter import java.security.KeyPair import java.security.cert.X509Certificate -/** - * Rebuild the distinguished name, adding a postfix to the common name. If no common name is present. - * @throws IllegalArgumentException if the distinguished name does not contain a common name element. - */ -fun X500Name.appendToCommonName(commonName: String): X500Name = mutateCommonName { attr -> attr.toString() + commonName } +val X500Name.commonName: String? get() = getRDNValueString(BCStyle.CN) +val X500Name.organisationUnit: String? get() = getRDNValueString(BCStyle.OU) +val X500Name.state: String? get() = getRDNValueString(BCStyle.ST) +val X500Name.organisation: String get() = getRDNValueString(BCStyle.O) ?: throw IllegalArgumentException("Malformed X500 name, organisation attribute (O) cannot be empty.") +val X500Name.locality: String get() = getRDNValueString(BCStyle.L) ?: throw IllegalArgumentException("Malformed X500 name, locality attribute (L) cannot be empty.") +val X500Name.country: String get() = getRDNValueString(BCStyle.C) ?: throw IllegalArgumentException("Malformed X500 name, country attribute (C) cannot be empty.") -/** - * Rebuild the distinguished name, replacing the common name with the given value. If no common name is present, this - * adds one. - * @throws IllegalArgumentException if the distinguished name does not contain a common name element. - */ -fun X500Name.replaceCommonName(commonName: String): X500Name = mutateCommonName { _ -> commonName } +private fun X500Name.getRDNValueString(identifier: ASN1ObjectIdentifier): String? = getRDNs(identifier).firstOrNull()?.first?.value?.toString() -/** - * Rebuild the distinguished name, replacing the common name with a value generated from the provided function. - * - * @param mutator a function to generate the new value from the previous one. - * @throws IllegalArgumentException if the distinguished name does not contain a common name element. - */ -private fun X500Name.mutateCommonName(mutator: (ASN1Encodable) -> String): X500Name { - val builder = X500NameBuilder(BCStyle.INSTANCE) - var matched = false - this.rdNs.forEach { rdn -> - rdn.typesAndValues.forEach { typeAndValue -> - when (typeAndValue.type) { - BCStyle.CN -> { - matched = true - builder.addRDN(typeAndValue.type, mutator(typeAndValue.value)) - } - else -> { - builder.addRDN(typeAndValue) - } - } - } - } - require(matched) { "Input X.500 name must include a common name (CN) attribute: ${this}" } - return builder.build() -} - -val X500Name.commonName: String get() = getRDNs(BCStyle.CN).first().first.value.toString() -val X500Name.orgName: String? get() = getRDNs(BCStyle.O).firstOrNull()?.first?.value?.toString() -val X500Name.location: String get() = getRDNs(BCStyle.L).first().first.value.toString() -val X500Name.locationOrNull: String? get() = try { - location -} catch (e: Exception) { - null -} val X509Certificate.subject: X500Name get() = toX509CertHolder().subject val X509CertificateHolder.cert: X509Certificate get() = JcaX509CertificateConverter().getCertificate(this) /** - * Generate a distinguished name from the provided values. + * Generate a distinguished name from the provided X500 . + * + * @param O organisation name. + * @param L locality. + * @param C county. + * @param CN common name. + * @param OU organisation unit. + * @param ST state. */ @JvmOverloads -fun getX509Name(myLegalName: String, nearestCity: String, email: String, country: String? = null): X500Name { - return X500NameBuilder(BCStyle.INSTANCE).let { builder -> - builder.addRDN(BCStyle.CN, myLegalName) - builder.addRDN(BCStyle.L, nearestCity) - country?.let { builder.addRDN(BCStyle.C, it) } - builder.addRDN(BCStyle.E, email) - builder.build() - } +fun getX500Name(O: String, L: String, C: String, CN: String? = null, OU: String? = null, ST: String? = null): X500Name { + return X500NameBuilder(BCStyle.INSTANCE).apply { + addRDN(BCStyle.C, C) + ST?.let { addRDN(BCStyle.ST, it) } + addRDN(BCStyle.L, L) + addRDN(BCStyle.O, O) + OU?.let { addRDN(BCStyle.OU, it) } + CN?.let { addRDN(BCStyle.CN, it) } + }.build() +} + +fun X500Name.withCommonName(commonName: String?): X500Name { + return getX500Name(organisation, locality, country, commonName, organisationUnit, state) +} + +fun X500Name.toWellFormattedName(): X500Name { + validateX500Name(this) + return getX500Name(organisation, locality, country, commonName, organisationUnit, state) } data class CertificateAndKeyPair(val certificate: X509CertificateHolder, val keyPair: KeyPair) diff --git a/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt b/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt index 0b9ede1d80..873c3e5a97 100644 --- a/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt +++ b/core/src/test/kotlin/net/corda/core/crypto/CompositeKeyTests.kt @@ -7,11 +7,11 @@ import net.corda.core.internal.div import net.corda.core.serialization.serialize import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.cert +import net.corda.core.utilities.getX500Name import net.corda.core.utilities.toBase58String import net.corda.node.utilities.* import net.corda.testing.TestDependencyInjectionBase import net.corda.testing.kryoSpecific -import org.bouncycastle.asn1.x500.X500Name import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder @@ -331,10 +331,10 @@ class CompositeKeyTests : TestDependencyInjectionBase() { // Create self sign CA. val caKeyPair = Crypto.generateKeyPair() - val ca = X509Utilities.createSelfSignedCACertificate(X500Name("CN=Test CA"), caKeyPair) + val ca = X509Utilities.createSelfSignedCACertificate(getX500Name(CN = "Test CA", O = "R3", L = "London", C = "GB"), caKeyPair) // Sign the composite key with the self sign CA. - val compositeKeyCert = X509Utilities.createCertificate(CertificateType.IDENTITY, ca, caKeyPair, X500Name("CN=CompositeKey"), compositeKey) + val compositeKeyCert = X509Utilities.createCertificate(CertificateType.IDENTITY, ca, caKeyPair, getX500Name(CN = "CompositeKey", O = "R3", L = "London", C = "GB"), compositeKey) // Store certificate to keystore. val keystorePath = tempFolder.root.toPath() / "keystore.jks" diff --git a/core/src/test/kotlin/net/corda/core/crypto/X509NameConstraintsTest.kt b/core/src/test/kotlin/net/corda/core/crypto/X509NameConstraintsTest.kt index 82bf9edacd..09b31737d1 100644 --- a/core/src/test/kotlin/net/corda/core/crypto/X509NameConstraintsTest.kt +++ b/core/src/test/kotlin/net/corda/core/crypto/X509NameConstraintsTest.kt @@ -2,6 +2,7 @@ package net.corda.core.crypto import net.corda.core.internal.toTypedArray import net.corda.core.utilities.cert +import net.corda.core.utilities.getX500Name import net.corda.node.utilities.* import org.bouncycastle.asn1.x500.X500Name import org.bouncycastle.asn1.x509.GeneralName @@ -19,13 +20,13 @@ class X509NameConstraintsTest { private fun makeKeyStores(subjectName: X500Name, nameConstraints: NameConstraints): Pair { val rootKeys = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val rootCACert = X509Utilities.createSelfSignedCACertificate(net.corda.core.utilities.getX509Name("Corda Root CA", "London", "demo@r3.com", null), rootKeys) + val rootCACert = X509Utilities.createSelfSignedCACertificate(getX500Name(CN = "Corda Root CA", O = "R3CEV", L = "London", C = "GB"), rootKeys) val intermediateCAKeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val intermediateCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, rootCACert, rootKeys, net.corda.core.utilities.getX509Name("Corda Intermediate CA", "London", "demo@r3.com", null), intermediateCAKeyPair.public) + val intermediateCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, rootCACert, rootKeys, getX500Name(CN = "Corda Intermediate CA", O = "R3CEV", L = "London", C = "GB"), intermediateCAKeyPair.public) val clientCAKeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val clientCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, intermediateCACert, intermediateCAKeyPair, net.corda.core.utilities.getX509Name("Corda Client CA", "London", "demo@r3.com", null), clientCAKeyPair.public, nameConstraints = nameConstraints) + val clientCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, intermediateCACert, intermediateCAKeyPair, getX500Name(CN = "Corda Client CA", O = "R3CEV", L = "London", C = "GB"), clientCAKeyPair.public, nameConstraints = nameConstraints) val keyPass = "password" val trustStore = KeyStore.getInstance(KEYSTORE_TYPE) diff --git a/core/src/test/kotlin/net/corda/core/identity/PartyAndCertificateTest.kt b/core/src/test/kotlin/net/corda/core/identity/PartyAndCertificateTest.kt index f6341d9253..17bfe21510 100644 --- a/core/src/test/kotlin/net/corda/core/identity/PartyAndCertificateTest.kt +++ b/core/src/test/kotlin/net/corda/core/identity/PartyAndCertificateTest.kt @@ -3,10 +3,10 @@ package net.corda.core.identity import net.corda.core.crypto.entropyToKeyPair import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize +import net.corda.core.utilities.getX500Name import net.corda.testing.getTestPartyAndCertificate import net.corda.testing.withTestSerialization import org.assertj.core.api.Assertions.assertThat -import org.bouncycastle.asn1.x500.X500Name import org.junit.Test import java.math.BigInteger @@ -15,7 +15,7 @@ class PartyAndCertificateTest { fun `kryo serialisation`() { withTestSerialization { val original = getTestPartyAndCertificate(Party( - X500Name("CN=Test Corp,O=Test Corp,L=Madrid,C=ES"), + getX500Name(O = "Test Corp", L = "Madrid", C = "ES"), entropyToKeyPair(BigInteger.valueOf(83)).public)) val copy = original.serialize().deserialize() assertThat(copy).isEqualTo(original).isNotSameAs(original) diff --git a/core/src/test/kotlin/net/corda/core/node/ServiceInfoTests.kt b/core/src/test/kotlin/net/corda/core/node/ServiceInfoTests.kt index 7cf226d988..c7dfa52327 100644 --- a/core/src/test/kotlin/net/corda/core/node/ServiceInfoTests.kt +++ b/core/src/test/kotlin/net/corda/core/node/ServiceInfoTests.kt @@ -2,14 +2,14 @@ package net.corda.core.node import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.ServiceType -import net.corda.testing.getTestX509Name +import net.corda.core.utilities.getX500Name import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith class ServiceInfoTests { val serviceType = ServiceType.getServiceType("test", "service").getSubType("subservice") - val name = getTestX509Name("service.name") + val name = getX500Name(O = "service.name", L = "London", C = "GB") @Test fun `type and name encodes correctly`() { diff --git a/core/src/test/kotlin/net/corda/core/utilities/LegalNameValidatorTest.kt b/core/src/test/kotlin/net/corda/core/utilities/LegalNameValidatorTest.kt index 899624c112..163381ca69 100644 --- a/core/src/test/kotlin/net/corda/core/utilities/LegalNameValidatorTest.kt +++ b/core/src/test/kotlin/net/corda/core/utilities/LegalNameValidatorTest.kt @@ -1,5 +1,6 @@ package net.corda.core.utilities +import org.bouncycastle.asn1.x500.X500Name import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith @@ -99,4 +100,33 @@ class LegalNameValidatorTest { validateLegalName("Legal Name With\n\rLine\nBreaks") } } + + @Test + fun `validate x500Name`() { + validateX500Name(X500Name("O=Bank A, L=New York, C=US, OU=Org Unit, CN=Service Name")) + validateX500Name(X500Name("O=Bank A, L=New York, C=US, CN=Service Name")) + validateX500Name(X500Name("O=Bank A, L=New York, C=US")) + validateX500Name(X500Name("O=Bank A, L=New York, C=US")) + + // Missing Organisation + assertFailsWith(IllegalArgumentException::class) { + validateX500Name(X500Name("L=New York, C=US, OU=Org Unit, CN=Service Name")) + } + // Missing Locality + assertFailsWith(IllegalArgumentException::class) { + validateX500Name(X500Name("O=Bank A, C=US, OU=Org Unit, CN=Service Name")) + } + // Missing Country + assertFailsWith(IllegalArgumentException::class) { + validateX500Name(X500Name("O=Bank A, L=New York, OU=Org Unit, CN=Service Name")) + } + // Wrong organisation name format + assertFailsWith(IllegalArgumentException::class) { + validateX500Name(X500Name("O=B, L=New York, C=US, OU=Org Unit, CN=Service Name")) + } + // Wrong organisation name format + assertFailsWith(IllegalArgumentException::class) { + validateX500Name(X500Name("O=B, L=New York, C=US, OU=Org Unit, CN=Service Name")) + } + } } \ No newline at end of file diff --git a/docs/source/corda-configuration-file.rst b/docs/source/corda-configuration-file.rst index 0bf02b3467..2a382e69e8 100644 --- a/docs/source/corda-configuration-file.rst +++ b/docs/source/corda-configuration-file.rst @@ -34,7 +34,7 @@ NetworkMapService plus Simple Notary configuration file. .. parsed-literal:: - myLegalName : "CN=Notary Service,O=R3,OU=corda,L=London,C=GB" + myLegalName : "O=Notary Service,OU=corda,L=London,C=GB" keyStorePassword : "cordacadevpass" trustStorePassword : "trustpass" p2pAddress : "localhost:12345" diff --git a/docs/source/deploying-a-node.rst b/docs/source/deploying-a-node.rst index eac18bd663..0517d61c4d 100644 --- a/docs/source/deploying-a-node.rst +++ b/docs/source/deploying-a-node.rst @@ -17,9 +17,9 @@ notary/network map node: task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" - networkMap "CN=Controller,O=R3,OU=corda,L=London,C=UK" + networkMap "O=Controller,OU=corda,L=London,C=UK" node { - name "CN=Controller,O=R3,OU=corda,L=London,C=UK" + name "O=Controller,OU=corda,L=London,C=UK" advertisedServices = ["corda.notary.validating"] p2pPort 10002 rpcPort 10003 diff --git a/docs/source/example-code/build.gradle b/docs/source/example-code/build.gradle index cca5e9a29e..621dfffb76 100644 --- a/docs/source/example-code/build.gradle +++ b/docs/source/example-code/build.gradle @@ -70,9 +70,9 @@ task integrationTest(type: Test) { task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" - networkMap "CN=Notary Service,O=R3,OU=corda,L=London,C=GB" + networkMap "O=Notary Service,OU=corda,L=London,C=GB" node { - name "CN=Notary Service,O=R3,OU=corda,L=London,C=GB" + name "O=Notary Service,OU=corda,L=London,C=GB" advertisedServices = ["corda.notary.validating"] p2pPort 10002 rpcPort 10003 @@ -80,7 +80,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { cordapps = [] } node { - name "CN=Alice Corp,O=Alice Corp,L=London,C=GB" + name "O=Alice Corp,L=London,C=GB" advertisedServices = [] p2pPort 10005 rpcPort 10006 diff --git a/docs/source/example-code/src/main/java/net/corda/docs/FlowCookbookJava.java b/docs/source/example-code/src/main/java/net/corda/docs/FlowCookbookJava.java index bf91c9870d..998b6bb4d9 100644 --- a/docs/source/example-code/src/main/java/net/corda/docs/FlowCookbookJava.java +++ b/docs/source/example-code/src/main/java/net/corda/docs/FlowCookbookJava.java @@ -16,19 +16,17 @@ import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria; import net.corda.core.transactions.LedgerTransaction; import net.corda.core.transactions.SignedTransaction; import net.corda.core.transactions.TransactionBuilder; -import net.corda.core.transactions.WireTransaction; import net.corda.core.utilities.ProgressTracker; import net.corda.core.utilities.ProgressTracker.Step; import net.corda.core.utilities.UntrustworthyData; +import net.corda.core.utilities.X500NameUtils; import net.corda.finance.contracts.asset.Cash; import net.corda.testing.contracts.DummyContract; import net.corda.testing.contracts.DummyState; -import org.bouncycastle.asn1.x500.X500Name; import org.jetbrains.annotations.NotNull; import java.security.GeneralSecurityException; import java.security.PublicKey; -import java.security.SignatureException; import java.time.Duration; import java.time.Instant; import java.util.List; @@ -124,7 +122,7 @@ public class FlowCookbookJava { // - To serve as a timestamping authority if the transaction has a time-window // We retrieve a notary from the network map. // DOCSTART 1 - Party specificNotary = getServiceHub().getNetworkMapCache().getNotary(new X500Name("CN=Notary Service,O=R3,OU=corda,L=London,C=UK")); + Party specificNotary = getServiceHub().getNetworkMapCache().getNotary(X500NameUtils.getX500Name("Notary Service", "London", "UK")); Party anyNotary = getServiceHub().getNetworkMapCache().getAnyNotary(null); // Unlike the first two methods, ``getNotaryNodes`` returns a // ``List``. We have to extract the notary identity of @@ -135,7 +133,7 @@ public class FlowCookbookJava { // We may also need to identify a specific counterparty. // Again, we do so using the network map. // DOCSTART 2 - Party namedCounterparty = getServiceHub().getNetworkMapCache().getNodeByLegalName(new X500Name("CN=NodeA,O=NodeA,L=London,C=UK")).getLegalIdentity(); + Party namedCounterparty = getServiceHub().getNetworkMapCache().getNodeByLegalName(X500NameUtils.getX500Name("NodeA", "London", "UK")).getLegalIdentity(); Party keyedCounterparty = getServiceHub().getNetworkMapCache().getNodeByLegalIdentityKey(dummyPubKey).getLegalIdentity(); Party firstCounterparty = getServiceHub().getNetworkMapCache().getPartyNodes().get(0).getLegalIdentity(); // DOCEND 2 diff --git a/docs/source/example-code/src/main/kotlin/net/corda/docs/FlowCookbook.kt b/docs/source/example-code/src/main/kotlin/net/corda/docs/FlowCookbook.kt index 904d4fa95d..1824302eb6 100644 --- a/docs/source/example-code/src/main/kotlin/net/corda/docs/FlowCookbook.kt +++ b/docs/source/example-code/src/main/kotlin/net/corda/docs/FlowCookbook.kt @@ -16,16 +16,12 @@ import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria import net.corda.core.transactions.LedgerTransaction import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder -import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.* import net.corda.core.utilities.ProgressTracker.Step -import net.corda.core.utilities.UntrustworthyData -import net.corda.core.utilities.seconds -import net.corda.core.utilities.unwrap import net.corda.finance.contracts.asset.Cash import net.corda.testing.ALICE_PUBKEY import net.corda.testing.contracts.DummyContract import net.corda.testing.contracts.DummyState -import org.bouncycastle.asn1.x500.X500Name import java.security.PublicKey import java.time.Instant @@ -63,6 +59,7 @@ object FlowCookbook { // subflow's progress steps in our flow's progress tracker. override fun childProgressTracker() = CollectSignaturesFlow.tracker() } + object VERIFYING_SIGS : Step("Verifying a transaction's signatures.") object FINALISATION : Step("Finalising a transaction.") { override fun childProgressTracker() = FinalityFlow.tracker() @@ -105,7 +102,7 @@ object FlowCookbook { // - To serve as a timestamping authority if the transaction has a time-window // We retrieve the notary from the network map. // DOCSTART 1 - val specificNotary: Party? = serviceHub.networkMapCache.getNotary(X500Name("CN=Notary Service,O=R3,OU=corda,L=London,C=UK")) + val specificNotary: Party? = serviceHub.networkMapCache.getNotary(getX500Name(O = "Notary Service", OU = "corda", L = "London", C = "UK")) val anyNotary: Party? = serviceHub.networkMapCache.getAnyNotary() // Unlike the first two methods, ``getNotaryNodes`` returns a // ``List``. We have to extract the notary identity of @@ -116,7 +113,7 @@ object FlowCookbook { // We may also need to identify a specific counterparty. Again, we // do so using the network map. // DOCSTART 2 - val namedCounterparty: Party? = serviceHub.networkMapCache.getNodeByLegalName(X500Name("CN=NodeA,O=NodeA,L=London,C=UK"))?.legalIdentity + val namedCounterparty: Party? = serviceHub.networkMapCache.getNodeByLegalName(getX500Name(O = "NodeA", L = "London", C = "UK"))?.legalIdentity val keyedCounterparty: Party? = serviceHub.networkMapCache.getNodeByLegalIdentityKey(dummyPubKey)?.legalIdentity val firstCounterparty: Party = serviceHub.networkMapCache.partyNodes[0].legalIdentity // DOCEND 2 @@ -389,7 +386,7 @@ object FlowCookbook { subFlow(SendTransactionFlow(counterparty, twiceSignedTx)) // Optional request verification to further restrict data access. - subFlow(object :SendTransactionFlow(counterparty, twiceSignedTx){ + subFlow(object : SendTransactionFlow(counterparty, twiceSignedTx) { override fun verifyDataRequest(dataRequest: FetchDataFlow.Request.Data) { // Extra request verification. } diff --git a/docs/source/example-code/src/main/resources/example-network-map-node.conf b/docs/source/example-code/src/main/resources/example-network-map-node.conf index 1b425c1bd7..fe00d9aa38 100644 --- a/docs/source/example-code/src/main/resources/example-network-map-node.conf +++ b/docs/source/example-code/src/main/resources/example-network-map-node.conf @@ -1,4 +1,4 @@ -myLegalName : "CN=Notary Service,O=R3,OU=corda,L=London,C=GB" +myLegalName : "O=Notary Service,OU=corda,L=London,C=GB" keyStorePassword : "cordacadevpass" trustStorePassword : "trustpass" p2pAddress : "my-network-map:10000" diff --git a/docs/source/example-code/src/main/resources/example-node.conf b/docs/source/example-code/src/main/resources/example-node.conf index bb7ce35947..e6a5a706f5 100644 --- a/docs/source/example-code/src/main/resources/example-node.conf +++ b/docs/source/example-code/src/main/resources/example-node.conf @@ -1,4 +1,4 @@ -myLegalName : "CN=Bank A,O=Bank A,L=London,C=GB" +myLegalName : "O=Bank A,L=London,C=GB" keyStorePassword : "cordacadevpass" trustStorePassword : "trustpass" dataSourceProperties : { @@ -13,7 +13,7 @@ webAddress : "localhost:10004" extraAdvertisedServiceIds : [ "corda.interest_rates" ] networkMapService : { address : "my-network-map:10000" - legalName : "CN=Network Map Service,O=R3,OU=corda,L=London,C=GB" + legalName : "O=Network Map Service,OU=corda,L=London,C=GB" } useHTTPS : false rpcUsers : [ diff --git a/docs/source/example-code/src/main/resources/example-out-of-process-verifier-node.conf b/docs/source/example-code/src/main/resources/example-out-of-process-verifier-node.conf index 713da39f55..8d43f51a9f 100644 --- a/docs/source/example-code/src/main/resources/example-out-of-process-verifier-node.conf +++ b/docs/source/example-code/src/main/resources/example-out-of-process-verifier-node.conf @@ -1,8 +1,8 @@ -myLegalName : "CN=Bank A,O=Bank A,L=London,C=GB" +myLegalName : "O=Bank A,L=London,C=GB" p2pAddress : "my-corda-node:10002" webAddress : "localhost:10003" networkMapService : { address : "my-network-map:10000" - legalName : "CN=Network Map Service,O=R3,OU=corda,L=London,C=GB" + legalName : "O=Network Map Service,OU=corda,L=London,C=GB" } verifierType: "OutOfProcess" diff --git a/docs/source/hello-world-running.rst b/docs/source/hello-world-running.rst index 78788090c3..2e15aaf74e 100644 --- a/docs/source/hello-world-running.rst +++ b/docs/source/hello-world-running.rst @@ -25,9 +25,9 @@ Let's take a look at the nodes we're going to deploy. Open the project's ``build task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" - networkMap "CN=Controller,O=R3,OU=corda,L=London,C=UK" + networkMap "O=Controller,OU=corda,L=London,C=UK" node { - name "CN=Controller,O=R3,OU=corda,L=London,C=UK" + name "O=Controller,OU=corda,L=London,C=UK" advertisedServices = ["corda.notary.validating"] p2pPort 10002 rpcPort 10003 @@ -156,7 +156,7 @@ The vaults of Node A and Node B should both display the following output: participants: - "CN=NodeA,O=NodeA,L=London,C=GB" - "CN=NodeB,O=NodeB,L=New York,C=US" - notary: "CN=Controller,O=R3,OU=corda,L=London,C=GB,OU=corda.notary.validating" + notary: "O=Controller,OU=corda,L=London,C=GB,OU=corda.notary.validating" encumbrance: null ref: txhash: "656A1BF64D5AEEC6F6C944E287F34EF133336F5FC2C5BFB9A0BFAE25E826125F" diff --git a/docs/source/shell.rst b/docs/source/shell.rst index dc08c27cb8..8cc68a4313 100644 --- a/docs/source/shell.rst +++ b/docs/source/shell.rst @@ -68,7 +68,7 @@ Yaml (yet another markup language) is a simple JSON-like way to describe object that make it helpful for our use case, like a lightweight syntax and support for "bare words" which mean you can often skip the quotes around strings. Here is an example of how this syntax is used: -``flow start CashIssue amount: $1000, issueRef: 1234, recipient: "CN=Bank A,O=Bank A,L=London,C=GB", notary: "CN=Notary Service,O=R3,OU=corda,L=London,C=GB"`` +``flow start CashIssue amount: $1000, issueRef: 1234, recipient: "O=Bank A,L=London,C=GB", notary: "O=Notary Service,OU=corda,L=London,C=GB"`` This invokes a constructor of a flow with the following prototype in the code: diff --git a/docs/source/tutorial-cordapp.rst b/docs/source/tutorial-cordapp.rst index 7b96013513..ad788338c8 100644 --- a/docs/source/tutorial-cordapp.rst +++ b/docs/source/tutorial-cordapp.rst @@ -279,11 +279,11 @@ and adds an RPC user for all but the "Controller" node (which serves as the nota // No permissions required as we are not invoking flows. val user = User("user1", "test", permissions = setOf()) driver(isDebug = true) { - startNode(X500Name("CN=Controller,O=R3,OU=corda,L=London,C=UK"), setOf(ServiceInfo(ValidatingNotaryService.type))) + startNode(getX500Name(O="Controller",OU="corda",L="London",C='UK"), setOf(ServiceInfo(ValidatingNotaryService.type))) val (nodeA, nodeB, nodeC) = Futures.allAsList( - startNode(X500Name("CN=NodeA,O=NodeA,L=London,C=UK"), rpcUsers = listOf(user)), - startNode(X500Name("CN=NodeB,O=NodeB,L=New York,C=US"), rpcUsers = listOf(user)), - startNode(X500Name("CN=NodeC,O=NodeC,L=Paris,C=FR"), rpcUsers = listOf(user))).getOrThrow() + startNode(getX500Name(O="NodeA",L="London",C="UK"), rpcUsers = listOf(user)), + startNode(getX500Name(O="NodeB",L="New York",C="US"), rpcUsers = listOf(user)), + startNode(getX500Name(O="NodeC",L="Paris",C="FR"), rpcUsers = listOf(user))).getOrThrow() startWebserver(nodeA) startWebserver(nodeB) @@ -454,7 +454,7 @@ We can see a list of the states in our node's vault using ``run vaultAndUpdates` participants: - "CN=NodeB,O=NodeB,L=New York,C=US" - "CN=NodeA,O=NodeA,L=London,C=UK" - notary: "CN=Controller,O=R3,OU=corda,L=London,C=UK,OU=corda.notary.validating" + notary: "O=Controller,OU=corda,L=London,C=UK,OU=corda.notary.validating" encumbrance: null ref: txhash: "52A1B18E6ABD535EF36B2075469B01D2EF888034F721C4BECD26F40355C8C9DC" @@ -488,14 +488,14 @@ abbreviated the output below): participants: - "CN=NodeB,O=NodeB,L=New York,C=US" - "CN=NodeA,O=NodeA,L=London,C=UK" - notary: "CN=Controller,O=R3,OU=corda,L=London,C=UK,OU=corda.notary.validating" + notary: "O=Controller,OU=corda,L=London,C=UK,OU=corda.notary.validating" encumbrance: null commands: - value: {} signers: - "8Kqd4oWdx4KQAVc3u5qvHZTGJxMtrShFudAzLUTdZUzbF9aPQcCZD5KXViC" - "8Kqd4oWdx4KQAVcBx98LBHwXwC3a7hNptQomrg9mq2ScY7t1Qqsyk5dCNAr" - notary: "CN=Controller,O=R3,OU=corda,L=London,C=UK,OU=corda.notary.validating" + notary: "O=Controller,OU=corda,L=London,C=UK,OU=corda.notary.validating" type: {} timeWindow: null mustSign: @@ -578,11 +578,11 @@ Debugging is done via IntelliJ as follows: // No permissions required as we are not invoking flows. val user = User("user1", "test", permissions = setOf()) driver(isDebug = true) { - startNode(X500Name("CN=Controller,O=R3,OU=corda,L=London,C=UK"), setOf(ServiceInfo(ValidatingNotaryService.type))) + startNode(getX500Name(O="Controller",OU="corda",L="London",C="UK"), setOf(ServiceInfo(ValidatingNotaryService.type))) val (nodeA, nodeB, nodeC) = Futures.allAsList( - startNode(X500Name("CN=NodeA,O=NodeA,L=London,C=UK"), rpcUsers = listOf(user)), - startNode(X500Name("CN=NodeB,O=NodeB,L=New York,C=US"), rpcUsers = listOf(user)), - startNode(X500Name("CN=NodeC,O=NodeC,L=Paris,C=FR"), rpcUsers = listOf(user))).getOrThrow() + startNode(getX500Name(O="NodeA",L=London,C=UK"), rpcUsers = listOf(user)), + startNode(getX500Name(O="NodeB",L=New York,C=US"), rpcUsers = listOf(user)), + startNode(getX500Name(O="NodeC",L=Paris,C=FR"), rpcUsers = listOf(user))).getOrThrow() startWebserver(nodeA) startWebserver(nodeB) diff --git a/experimental/src/main/kotlin/net/corda/finance/contracts/universal/PrettyPrint.kt b/experimental/src/main/kotlin/net/corda/finance/contracts/universal/PrettyPrint.kt index 2ab265e3e2..0db2bfc0ef 100644 --- a/experimental/src/main/kotlin/net/corda/finance/contracts/universal/PrettyPrint.kt +++ b/experimental/src/main/kotlin/net/corda/finance/contracts/universal/PrettyPrint.kt @@ -1,6 +1,6 @@ package net.corda.finance.contracts.universal -import net.corda.core.utilities.commonName +import net.corda.core.utilities.organisation import net.corda.core.crypto.toStringShort import net.corda.core.identity.Party import java.math.BigDecimal @@ -48,7 +48,7 @@ private class PrettyPrint(arr : Arrangement) { fun createPartyName(party : Party) : String { - val parts = party.name.commonName.toLowerCase().split(' ') + val parts = party.name.organisation.toLowerCase().split(' ') var camelName = parts.drop(1).fold(parts.first()) { s, i -> s + i.first().toUpperCase() + i.drop(1) @@ -66,7 +66,7 @@ private class PrettyPrint(arr : Arrangement) { init { parties.forEach { - println( "val ${createPartyName(it)} = Party(\"${it.name.commonName}\", \"${it.owningKey.toStringShort()}\")" ) + println("val ${createPartyName(it)} = Party(\"${it.name.organisation}\", \"${it.owningKey.toStringShort()}\")") } } diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt index e6344db586..366b5ee666 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/Cash.kt @@ -1,13 +1,13 @@ -@file:JvmName("CashUtilities") // So the static extension functions get put into a class with a better name than CashKt +@file:JvmName("CashUtilities") + +// So the static extension functions get put into a class with a better name than CashKt package net.corda.finance.contracts.asset import co.paralleluniverse.fibers.Suspendable -import net.corda.finance.contracts.asset.cash.selection.CashSelectionH2Impl import net.corda.core.contracts.* import net.corda.core.contracts.Amount.Companion.sumOrThrow -import net.corda.core.crypto.entropyToKeyPair import net.corda.core.crypto.NullKeys.NULL_PARTY -import net.corda.core.utilities.toBase58String +import net.corda.core.crypto.entropyToKeyPair import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.internal.Emoji @@ -18,11 +18,13 @@ import net.corda.core.schemas.QueryableState import net.corda.core.transactions.LedgerTransaction import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.OpaqueBytes +import net.corda.core.utilities.getX500Name +import net.corda.core.utilities.toBase58String +import net.corda.finance.contracts.asset.cash.selection.CashSelectionH2Impl import net.corda.finance.schemas.CashSchemaV1 import net.corda.finance.utils.sumCash import net.corda.finance.utils.sumCashOrNull import net.corda.finance.utils.sumCashOrZero -import org.bouncycastle.asn1.x500.X500Name import java.math.BigInteger import java.security.PublicKey import java.sql.DatabaseMetaData @@ -56,7 +58,7 @@ interface CashSelection { instance.set(cashSelectionAlgo) cashSelectionAlgo } ?: throw ClassNotFoundException("\nUnable to load compatible cash selection algorithm implementation for JDBC driver ($_metadata)." + - "\nPlease specify an implementation in META-INF/services/net.corda.finance.contracts.asset.CashSelection") + "\nPlease specify an implementation in META-INF/services/net.corda.finance.contracts.asset.CashSelection") }.invoke() } } @@ -345,7 +347,7 @@ class Cash : OnLedgerAsset() { /** A randomly generated key. */ val DUMMY_CASH_ISSUER_KEY by lazy { entropyToKeyPair(BigInteger.valueOf(10)) } /** A dummy, randomly generated issuer party by the name of "Snake Oil Issuer" */ -val DUMMY_CASH_ISSUER by lazy { Party(X500Name("CN=Snake Oil Issuer,O=R3,OU=corda,L=London,C=GB"), DUMMY_CASH_ISSUER_KEY.public).ref(1) } +val DUMMY_CASH_ISSUER by lazy { Party(getX500Name(O = "Snake Oil Issuer", OU = "corda", L = "London", C = "GB"), DUMMY_CASH_ISSUER_KEY.public).ref(1) } /** An extension property that lets you write 100.DOLLARS.CASH */ val Amount.CASH: Cash.State get() = Cash.State(Amount(quantity, Issued(DUMMY_CASH_ISSUER, token)), NULL_PARTY) /** An extension property that lets you get a cash state from an issued token, under the [NULL_PARTY] */ diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/Obligation.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/Obligation.kt index ff72af7503..b7968bc755 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/Obligation.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/Obligation.kt @@ -1,9 +1,5 @@ package net.corda.finance.contracts.asset -import net.corda.finance.contracts.NetCommand -import net.corda.finance.contracts.NetType -import net.corda.finance.contracts.NettableState -import net.corda.finance.contracts.asset.Obligation.Lifecycle.NORMAL import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash import net.corda.core.crypto.entropyToKeyPair @@ -16,7 +12,12 @@ import net.corda.core.serialization.CordaSerializable import net.corda.core.transactions.LedgerTransaction import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.NonEmptySet +import net.corda.core.utilities.getX500Name import net.corda.core.utilities.seconds +import net.corda.finance.contracts.NetCommand +import net.corda.finance.contracts.NetType +import net.corda.finance.contracts.NettableState +import net.corda.finance.contracts.asset.Obligation.Lifecycle.NORMAL import net.corda.finance.utils.sumFungibleOrNull import net.corda.finance.utils.sumObligations import net.corda.finance.utils.sumObligationsOrNull @@ -793,4 +794,4 @@ infix fun Obligation.State.`issued by`(party: AbstractParty) = copy /** A randomly generated key. */ val DUMMY_OBLIGATION_ISSUER_KEY by lazy { entropyToKeyPair(BigInteger.valueOf(10)) } /** A dummy, randomly generated issuer party by the name of "Snake Oil Issuer" */ -val DUMMY_OBLIGATION_ISSUER by lazy { Party(X500Name("CN=Snake Oil Issuer,O=R3,OU=corda,L=London,C=GB"), DUMMY_OBLIGATION_ISSUER_KEY.public) } +val DUMMY_OBLIGATION_ISSUER by lazy { Party(getX500Name(O = "Snake Oil Issuer", OU = "corda", L = "London", C = "GB"), DUMMY_OBLIGATION_ISSUER_KEY.public) } diff --git a/gradle-plugins/cordformation/src/main/groovy/net/corda/plugins/Node.groovy b/gradle-plugins/cordformation/src/main/groovy/net/corda/plugins/Node.groovy index f530928695..c96a937fef 100644 --- a/gradle-plugins/cordformation/src/main/groovy/net/corda/plugins/Node.groovy +++ b/gradle-plugins/cordformation/src/main/groovy/net/corda/plugins/Node.groovy @@ -90,7 +90,7 @@ class Node extends CordformNode { def dirName try { X500Name x500Name = new X500Name(name) - dirName = x500Name.getRDNs(BCStyle.CN).getAt(0).getFirst().getValue().toString() + dirName = x500Name.getRDNs(BCStyle.O).getAt(0).getFirst().getValue().toString() } catch(IllegalArgumentException ignore) { // Can't parse as an X500 name, use the full string dirName = name diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/config/ConfigUtilities.kt b/node-api/src/main/kotlin/net/corda/nodeapi/config/ConfigUtilities.kt index 34a7bbe87e..20f8fb8513 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/config/ConfigUtilities.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/config/ConfigUtilities.kt @@ -3,7 +3,6 @@ package net.corda.nodeapi.config import com.typesafe.config.Config import com.typesafe.config.ConfigUtil import net.corda.core.internal.noneOrSingle -import net.corda.core.utilities.validateX500Name import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.parseNetworkHostAndPort import org.bouncycastle.asn1.x500.X500Name diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/config/ConfigParsingTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/config/ConfigParsingTest.kt index 1d7b061fad..7264d57b5c 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/config/ConfigParsingTest.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/config/ConfigParsingTest.kt @@ -6,7 +6,7 @@ import com.typesafe.config.ConfigRenderOptions.defaults import com.typesafe.config.ConfigValueFactory import net.corda.core.internal.div import net.corda.core.utilities.NetworkHostAndPort -import net.corda.testing.getTestX509Name +import net.corda.core.utilities.getX500Name import org.assertj.core.api.Assertions.assertThat import org.bouncycastle.asn1.x500.X500Name import org.junit.Test @@ -112,7 +112,7 @@ class ConfigParsingTest { @Test fun x500Name() { - testPropertyType(getTestX509Name("Mock Party"), getTestX509Name("Mock Party 2"), valuesToString = true) + testPropertyType(getX500Name(O = "Mock Party", L = "London", C = "GB"), getX500Name(O = "Mock Party 2", L = "London", C = "GB"), valuesToString = true) } @Test diff --git a/node/src/integration-test/kotlin/net/corda/node/services/AdvertisedServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/AdvertisedServiceTests.kt index 204058c519..55a7ac3bf0 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/AdvertisedServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/AdvertisedServiceTests.kt @@ -6,15 +6,15 @@ import net.corda.core.flows.StartableByRPC import net.corda.core.messaging.startFlow import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.ServiceType +import net.corda.core.utilities.getX500Name import net.corda.node.services.FlowPermissions.Companion.startFlowPermission import net.corda.nodeapi.User import net.corda.testing.driver.driver -import org.bouncycastle.asn1.x500.X500Name import org.junit.Test import kotlin.test.assertTrue class AdvertisedServiceTests { - private val serviceName = X500Name("CN=Custom Service,O=R3,OU=corda,L=London,C=GB") + private val serviceName = getX500Name(O = "Custom Service", OU = "corda", L = "London", C = "GB") private val serviceType = ServiceType.corda.getSubType("custom") private val user = "bankA" private val pass = "passA" diff --git a/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt index 72c3f7d9f9..eaa4fcb2a2 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt @@ -15,6 +15,7 @@ import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.Try import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.getX500Name import net.corda.node.internal.AbstractNode import net.corda.node.services.config.BFTSMaRtConfiguration import net.corda.node.services.network.NetworkMapService @@ -25,7 +26,6 @@ import net.corda.node.utilities.ServiceIdentityGenerator import net.corda.testing.contracts.DummyContract import net.corda.testing.dummyCommand import net.corda.testing.node.MockNetwork -import org.bouncycastle.asn1.x500.X500Name import org.junit.After import org.junit.Test import java.nio.file.Files @@ -34,7 +34,7 @@ import kotlin.test.assertTrue class BFTNotaryServiceTests { companion object { - private val clusterName = X500Name("CN=BFT,O=R3,OU=corda,L=Zurich,C=CH") + private val clusterName = getX500Name(O = "BFT", OU = "corda", L = "Zurich", C = "CH") private val serviceType = BFTNonValidatingNotaryService.type } diff --git a/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt index a91edb17aa..f975a1225a 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/RaftNotaryServiceTests.kt @@ -10,19 +10,19 @@ import net.corda.core.internal.concurrent.map import net.corda.core.internal.concurrent.transpose import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.getX500Name import net.corda.node.internal.AbstractNode import net.corda.testing.DUMMY_BANK_A import net.corda.testing.contracts.DummyContract import net.corda.testing.dummyCommand import net.corda.testing.node.NodeBasedTest -import org.bouncycastle.asn1.x500.X500Name import org.junit.Test import java.util.* import kotlin.test.assertEquals import kotlin.test.assertFailsWith class RaftNotaryServiceTests : NodeBasedTest() { - private val notaryName = X500Name("CN=RAFT Notary Service,O=R3,OU=corda,L=London,C=GB") + private val notaryName = getX500Name(O = "RAFT Notary Service", OU = "corda", L = "London", C = "GB") @Test fun `detect double spend`() { diff --git a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt index e3af49da13..dd79a907f8 100644 --- a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt +++ b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PMessagingTest.kt @@ -12,6 +12,7 @@ import net.corda.core.serialization.CordaSerializable import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.getX500Name import net.corda.core.utilities.seconds import net.corda.node.internal.Node import net.corda.node.services.messaging.* @@ -30,8 +31,8 @@ import java.util.concurrent.atomic.AtomicInteger class P2PMessagingTest : NodeBasedTest() { private companion object { - val DISTRIBUTED_SERVICE_NAME = getTestX509Name("DistributedService") - val SERVICE_2_NAME = getTestX509Name("Service 2") + val DISTRIBUTED_SERVICE_NAME = getX500Name(O = "DistributedService", L = "London", C = "GB") + val SERVICE_2_NAME = getX500Name(O = "Service 2", L = "London", C = "GB") } @Test diff --git a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt index 245df87f74..76918e4a74 100644 --- a/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt +++ b/node/src/integration-test/kotlin/net/corda/services/messaging/P2PSecurityTest.kt @@ -2,12 +2,9 @@ package net.corda.services.messaging import com.nhaarman.mockito_kotlin.whenever import net.corda.core.concurrent.CordaFuture -import net.corda.core.utilities.cert import net.corda.core.crypto.random63BitValue import net.corda.core.node.NodeInfo -import net.corda.core.utilities.seconds -import net.corda.core.utilities.NonEmptySet -import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.* import net.corda.node.internal.NetworkMapInfo import net.corda.node.services.config.configureWithDevSSLCertificate import net.corda.node.services.messaging.sendRequest @@ -30,7 +27,7 @@ class P2PSecurityTest : NodeBasedTest() { @Test fun `incorrect legal name for the network map service config`() { - val incorrectNetworkMapName = getTestX509Name("NetworkMap-${random63BitValue()}") + val incorrectNetworkMapName = getX500Name(O = "NetworkMap-${random63BitValue()}", L = "London", C = "GB") val node = startNode(BOB.name, configOverrides = mapOf( "networkMapService" to mapOf( "address" to networkMapNode.configuration.p2pAddress.toString(), diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index 9e8fc5d6bb..b03cd9e989 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -147,6 +147,10 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, val nodeReadyFuture: CordaFuture get() = _nodeReadyFuture + protected val myLegalName: X500Name by lazy { + loadKeyStore(configuration.nodeKeystore, configuration.keyStorePassword).getX509Certificate(X509Utilities.CORDA_CLIENT_CA).subject.withCommonName(null) + } + /** Fetch CordaPluginRegistry classes registered in META-INF/services/net.corda.core.node.CordaPluginRegistry files that exist in the classpath */ open val pluginRegistries: List by lazy { ServiceLoader.load(CordaPluginRegistry::class.java).toList() @@ -414,7 +418,7 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, checkpointStorage = DBCheckpointStorage() _services = ServiceHubInternalImpl() attachments = NodeAttachmentService(services.monitoringService.metrics) - val legalIdentity = obtainIdentity("identity", configuration.myLegalName) + val legalIdentity = obtainIdentity() network = makeMessagingService(legalIdentity) info = makeInfo(legalIdentity) @@ -497,9 +501,7 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, */ protected open fun makeServiceEntries(): List { return advertisedServices.map { - val serviceId = it.type.id - val serviceName = it.name ?: X500Name("${configuration.myLegalName},OU=$serviceId") - val identity = obtainIdentity(serviceId, serviceName) + val identity = obtainIdentity(it) ServiceEntry(it, identity) } } @@ -525,12 +527,6 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, "or if you don't have one yet, fill out the config file and run corda.jar --initial-registration. " + "Read more at: https://docs.corda.net/permissioning.html" } - val identitiesKeystore = loadKeyStore(configuration.sslKeystore, configuration.keyStorePassword) - val tlsIdentity = identitiesKeystore.getX509Certificate(X509Utilities.CORDA_CLIENT_TLS).subject - - require(tlsIdentity == configuration.myLegalName) { - "Expected '${configuration.myLegalName}' but got '$tlsIdentity' from the keystore." - } } // Specific class so that MockNode can catch it. @@ -692,15 +688,23 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, protected abstract fun startMessagingService(rpcOps: RPCOps) - private fun obtainIdentity(id: String, name: X500Name): PartyAndCertificate { + private fun obtainIdentity(serviceInfo: ServiceInfo? = null): PartyAndCertificate { // Load the private identity key, creating it if necessary. The identity key is a long term well known key that // is distributed to other peers and we use it (or a key signed by it) when we need to do something // "permissioned". The identity file is what gets distributed and contains the node's legal name along with // the public key. Obviously in a real system this would need to be a certificate chain of some kind to ensure // the legal name is actually validated in some way. + val keyStore = KeyStoreWrapper(configuration.nodeKeystore, configuration.keyStorePassword) + + val (id, name) = if (serviceInfo == null) { + // Create node identity if service info = null + Pair("identity", myLegalName.withCommonName(null)) + } else { + val name = serviceInfo.name ?: myLegalName.withCommonName(serviceInfo.type.id) + Pair(serviceInfo.type.id, name) + } // TODO: Integrate with Key management service? - val keyStore = KeyStoreWrapper(configuration.nodeKeystore, configuration.keyStorePassword) val privateKeyAlias = "$id-private-key" val compositeKeyAlias = "$id-composite-key" @@ -715,7 +719,7 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, migrateKeysFromFile(keyStore, name, pubIdentityFile, privKeyFile, compositeKeyFile, privateKeyAlias, compositeKeyAlias) } else { log.info("$privateKeyAlias not found in key store ${configuration.nodeKeystore}, generating fresh key!") - keyStore.saveNewKeyPair(name, privateKeyAlias, generateKeyPair()) + keyStore.signAndSaveNewKeyPair(name, privateKeyAlias, generateKeyPair()) } } @@ -751,7 +755,7 @@ abstract class AbstractNode(open val configuration: NodeConfiguration, // Load the private key. val publicKey = Crypto.decodePublicKey(pubKeyFile.readAll()) val privateKey = Crypto.decodePrivateKey(privKeyFile.readAll()) - keyStore.saveNewKeyPair(serviceName, privateKeyAlias, KeyPair(publicKey, privateKey)) + keyStore.signAndSaveNewKeyPair(serviceName, privateKeyAlias, KeyPair(publicKey, privateKey)) // Store composite key separately. if (compositeKeyFile.exists()) { keyStore.savePublicKey(serviceName, compositeKeyAlias, Crypto.decodePublicKey(compositeKeyFile.readAll())) diff --git a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt index 294c57562e..8bb57a35b0 100644 --- a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt +++ b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt @@ -3,14 +3,11 @@ package net.corda.node.internal import com.jcabi.manifests.Manifests import com.typesafe.config.ConfigException import joptsimple.OptionException -import net.corda.core.utilities.commonName -import net.corda.core.utilities.orgName -import net.corda.core.internal.concurrent.thenMatch -import net.corda.core.internal.createDirectories -import net.corda.core.internal.div import net.corda.core.internal.* +import net.corda.core.internal.concurrent.thenMatch import net.corda.core.node.services.ServiceInfo import net.corda.core.utilities.loggerFor +import net.corda.core.utilities.organisation import net.corda.node.* import net.corda.node.services.config.FullNodeConfiguration import net.corda.node.services.transactions.bftSMaRtSerialFilter @@ -102,8 +99,7 @@ open class NodeStartup(val args: Array) { node.nodeReadyFuture.thenMatch({ val elapsed = (System.currentTimeMillis() - startTime) / 10 / 100.0 - // TODO: Replace this with a standard function to get an unambiguous rendering of the X.500 name. - val name = node.info.legalIdentity.name.orgName ?: node.info.legalIdentity.name.commonName + val name = node.info.legalIdentity.name.organisation Node.printBasicNodeInfo("Node for \"$name\" started up and registered in $elapsed sec") // Don't start the shell if there's no console attached. diff --git a/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt b/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt index f66e53a7be..b070bc3565 100644 --- a/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt +++ b/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt @@ -11,6 +11,8 @@ import net.corda.core.internal.createDirectories import net.corda.core.internal.div import net.corda.core.internal.exists import net.corda.core.utilities.loggerFor +import net.corda.core.utilities.toWellFormattedName +import net.corda.core.utilities.withCommonName import net.corda.node.utilities.* import net.corda.nodeapi.config.SSLConfiguration import org.bouncycastle.asn1.x500.X500Name @@ -86,11 +88,18 @@ fun createKeystoreForCordaNode(sslKeyStorePath: Path, val (intermediateCACert, intermediateCAKeyPair) = caKeyStore.getCertificateAndKeyPair(X509Utilities.CORDA_INTERMEDIATE_CA, caKeyPassword) val clientKey = Crypto.generateKeyPair(signatureScheme) - val nameConstraints = NameConstraints(arrayOf(GeneralSubtree(GeneralName(GeneralName.directoryName, legalName))), arrayOf()) - val clientCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, intermediateCACert, intermediateCAKeyPair, legalName, clientKey.public, nameConstraints = nameConstraints) + val clientName = legalName.toWellFormattedName().withCommonName(null) + + val nameConstraints = NameConstraints(arrayOf(GeneralSubtree(GeneralName(GeneralName.directoryName, clientName))), arrayOf()) + val clientCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, + intermediateCACert, + intermediateCAKeyPair, + clientName.withCommonName(X509Utilities.CORDA_CLIENT_CA_CN), + clientKey.public, + nameConstraints = nameConstraints) val tlsKey = Crypto.generateKeyPair(signatureScheme) - val clientTLSCert = X509Utilities.createCertificate(CertificateType.TLS, clientCACert, clientKey, legalName, tlsKey.public) + val clientTLSCert = X509Utilities.createCertificate(CertificateType.TLS, clientCACert, clientKey, clientName, tlsKey.public) val keyPass = keyPassword.toCharArray() diff --git a/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt b/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt index 99f4159cbc..f884d8b31e 100644 --- a/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt +++ b/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt @@ -19,6 +19,8 @@ data class BFTSMaRtConfiguration(val replicaId: Int, val debug: Boolean, val exp } interface NodeConfiguration : NodeSSLConfiguration { + // myLegalName should be only used in the initial network registration, we should use the name from the certificate instead of this. + // TODO: Remove this so we don't accidentally use this identity in the code? val myLegalName: X500Name val networkMapService: NetworkMapInfo? val minimumPlatformVersion: Int diff --git a/node/src/main/kotlin/net/corda/node/services/identity/InMemoryIdentityService.kt b/node/src/main/kotlin/net/corda/node/services/identity/InMemoryIdentityService.kt index 3be29e3d2f..312d5895ee 100644 --- a/node/src/main/kotlin/net/corda/node/services/identity/InMemoryIdentityService.kt +++ b/node/src/main/kotlin/net/corda/node/services/identity/InMemoryIdentityService.kt @@ -1,7 +1,6 @@ package net.corda.node.services.identity import net.corda.core.contracts.PartyAndReference -import net.corda.core.utilities.cert import net.corda.core.crypto.toStringShort import net.corda.core.identity.AbstractParty import net.corda.core.identity.AnonymousParty @@ -11,7 +10,9 @@ import net.corda.core.internal.toX509CertHolder import net.corda.core.node.services.IdentityService import net.corda.core.node.services.UnknownAnonymousPartyException import net.corda.core.serialization.SingletonSerializeAsToken +import net.corda.core.utilities.cert import net.corda.core.utilities.loggerFor +import net.corda.core.utilities.subject import net.corda.core.utilities.trace import org.bouncycastle.asn1.x500.X500Name import org.bouncycastle.cert.X509CertificateHolder @@ -65,8 +66,17 @@ class InMemoryIdentityService(identities: Iterable = emptyS @Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class) override fun verifyAndRegisterIdentity(identity: PartyAndCertificate): PartyAndCertificate? { // Validate the chain first, before we do anything clever with it - identity.verify(trustAnchor) - + try { + identity.verify(trustAnchor) + } catch (e: CertPathValidatorException) { + log.error("Certificate validation failed for ${identity.name} against trusted root ${trustAnchor.trustedCert.subject}.") + log.error("Certificate path :") + identity.certPath.certificates.reversed().forEachIndexed { index, certificate -> + val space = (0 until index).map { " " }.joinToString("") + log.error("$space${certificate.toX509CertHolder().subject}") + } + throw e + } log.trace { "Registering identity $identity" } keyToParties[identity.owningKey] = identity // Always keep the first party we registered, as that's the well known identity diff --git a/node/src/main/kotlin/net/corda/node/services/messaging/NodeMessagingClient.kt b/node/src/main/kotlin/net/corda/node/services/messaging/NodeMessagingClient.kt index 8bde1f046a..4d4bbd65b4 100644 --- a/node/src/main/kotlin/net/corda/node/services/messaging/NodeMessagingClient.kt +++ b/node/src/main/kotlin/net/corda/node/services/messaging/NodeMessagingClient.kt @@ -244,7 +244,8 @@ class NodeMessagingClient(override val config: NodeConfiguration, } }, {}) - rpcServer = RPCServer(rpcOps, NODE_USER, NODE_USER, locator, userService, config.myLegalName) + val myLegalName = loadKeyStore(config.sslKeystore, config.keyStorePassword).getX509Certificate(X509Utilities.CORDA_CLIENT_TLS).subject + rpcServer = RPCServer(rpcOps, NODE_USER, NODE_USER, locator, userService, myLegalName) fun checkVerifierCount() { if (session.queueQuery(SimpleString(VERIFICATION_REQUESTS_QUEUE_NAME)).consumerCount == 0) { diff --git a/node/src/main/kotlin/net/corda/node/shell/FlowWatchPrintingSubscriber.kt b/node/src/main/kotlin/net/corda/node/shell/FlowWatchPrintingSubscriber.kt index fc03f127e4..72ae711a93 100644 --- a/node/src/main/kotlin/net/corda/node/shell/FlowWatchPrintingSubscriber.kt +++ b/node/src/main/kotlin/net/corda/node/shell/FlowWatchPrintingSubscriber.kt @@ -1,6 +1,6 @@ package net.corda.node.shell -import net.corda.core.utilities.commonName +import net.corda.core.utilities.organisation import net.corda.core.flows.FlowInitiator import net.corda.core.flows.StateMachineRunId import net.corda.core.internal.concurrent.openFuture @@ -110,7 +110,7 @@ class FlowWatchPrintingSubscriber(private val toStream: RenderPrintWriter) : Sub return when (flowInitiator) { is FlowInitiator.Scheduled -> flowInitiator.scheduledState.ref.toString() is FlowInitiator.Shell -> "Shell" // TODO Change when we will have more information on shell user. - is FlowInitiator.Peer -> flowInitiator.party.name.commonName + is FlowInitiator.Peer -> flowInitiator.party.name.organisation is FlowInitiator.RPC -> "RPC: " + flowInitiator.username } } diff --git a/node/src/main/kotlin/net/corda/node/utilities/KeyStoreUtilities.kt b/node/src/main/kotlin/net/corda/node/utilities/KeyStoreUtilities.kt index cfd2381b60..03427411e9 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/KeyStoreUtilities.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/KeyStoreUtilities.kt @@ -183,10 +183,11 @@ class KeyStoreWrapper(private val storePath: Path, private val storePassword: St val cert = X509Utilities.createCertificate(CertificateType.IDENTITY, clientCA.certificate, clientCA.keyPair, serviceName, pubKey) val certPath = CertificateFactory.getInstance("X509").generateCertPath(listOf(cert.cert) + clientCertPath) require(certPath.certificates.isNotEmpty()) { "Certificate path cannot be empty" } + // TODO: X509Utilities.validateCertificateChain() return certPath } - fun saveNewKeyPair(serviceName: X500Name, privateKeyAlias: String, keyPair: KeyPair) { + fun signAndSaveNewKeyPair(serviceName: X500Name, privateKeyAlias: String, keyPair: KeyPair) { val certPath = createCertificate(serviceName, keyPair.public) // Assume key password = store password. keyStore.addOrReplaceKey(privateKeyAlias, keyPair.private, storePassword.toCharArray(), certPath.certificates.toTypedArray()) diff --git a/node/src/main/kotlin/net/corda/node/utilities/X509Utilities.kt b/node/src/main/kotlin/net/corda/node/utilities/X509Utilities.kt index 50fc141b80..7f67a4a8ac 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/X509Utilities.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/X509Utilities.kt @@ -1,13 +1,17 @@ package net.corda.node.utilities -import net.corda.core.crypto.* +import net.corda.core.crypto.Crypto +import net.corda.core.crypto.SignatureScheme +import net.corda.core.crypto.random63BitValue import net.corda.core.utilities.cert import net.corda.core.utilities.days import net.corda.core.utilities.millis import org.bouncycastle.asn1.ASN1EncodableVector import org.bouncycastle.asn1.ASN1Sequence import org.bouncycastle.asn1.DERSequence +import org.bouncycastle.asn1.DERUTF8String import org.bouncycastle.asn1.x500.X500Name +import org.bouncycastle.asn1.x500.style.BCStyle import org.bouncycastle.asn1.x509.* import org.bouncycastle.asn1.x509.Extension import org.bouncycastle.cert.X509CertificateHolder @@ -44,6 +48,8 @@ object X509Utilities { val CORDA_CLIENT_TLS = "cordaclienttls" val CORDA_CLIENT_CA = "cordaclientca" + val CORDA_CLIENT_CA_CN = "Corda Client CA Certificate" + private val DEFAULT_VALIDITY_WINDOW = Pair(0.millis, 3650.days) /** * Helper function to return the latest out of an instant and an optional date. @@ -107,6 +113,7 @@ object X509Utilities { return createCertificate(certificateType, issuerCertificate.subject, issuerKeyPair, subject, subjectPublicKey, window, nameConstraints) } + @Throws(CertPathValidatorException::class) fun validateCertificateChain(trustedRoot: X509CertificateHolder, vararg certificates: Certificate) { require(certificates.isNotEmpty()) { "Certificate path must contain at least one certificate" } val certFactory = CertificateFactory.getInstance("X509") @@ -225,12 +232,12 @@ object X509Utilities { /** * Create certificate signing request using provided information. */ - fun createCertificateSigningRequest(subject: X500Name, keyPair: KeyPair, signatureScheme: SignatureScheme): PKCS10CertificationRequest { + fun createCertificateSigningRequest(subject: X500Name, email: String, keyPair: KeyPair, signatureScheme: SignatureScheme): PKCS10CertificationRequest { val signer = ContentSignerBuilder.build(signatureScheme, keyPair.private, Crypto.findProvider(signatureScheme.providerName)) - return JcaPKCS10CertificationRequestBuilder(subject, keyPair.public).build(signer) + return JcaPKCS10CertificationRequestBuilder(subject, keyPair.public).addAttribute(BCStyle.E, DERUTF8String(email)).build(signer) } - fun createCertificateSigningRequest(subject: X500Name, keyPair: KeyPair) = createCertificateSigningRequest(subject, keyPair, DEFAULT_TLS_SIGNATURE_SCHEME) + fun createCertificateSigningRequest(subject: X500Name, email: String, keyPair: KeyPair) = createCertificateSigningRequest(subject, email, keyPair, DEFAULT_TLS_SIGNATURE_SCHEME) } diff --git a/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt b/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt index b7f855a7af..bcd1c17674 100644 --- a/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt +++ b/node/src/main/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelper.kt @@ -22,7 +22,7 @@ import kotlin.system.exitProcess * Helper for managing the node registration process, which checks for any existing certificates and requests them if * needed. */ -class NetworkRegistrationHelper(val config: NodeConfiguration, val certService: NetworkRegistrationService) { +class NetworkRegistrationHelper(private val config: NodeConfiguration, private val certService: NetworkRegistrationService) { companion object { val pollInterval = 10.seconds val SELF_SIGNED_PRIVATE_KEY = "Self Signed Private Key" @@ -100,7 +100,6 @@ class NetworkRegistrationHelper(val config: NodeConfiguration, val certService: } } - /** * Poll Certificate Signing Server for approved certificate, * enter a slow polling loop if server return null. @@ -127,7 +126,7 @@ class NetworkRegistrationHelper(val config: NodeConfiguration, val certService: private fun submitOrResumeCertificateSigningRequest(keyPair: KeyPair): String { // Retrieve request id from file if exists, else post a request to server. return if (!requestIdStore.exists()) { - val request = X509Utilities.createCertificateSigningRequest(config.myLegalName, keyPair) + val request = X509Utilities.createCertificateSigningRequest(config.myLegalName, config.emailAddress, keyPair) val writer = StringWriter() JcaPEMWriter(writer).use { it.writeObject(PemObject("CERTIFICATE REQUEST", request.encoded)) diff --git a/node/src/smoke-test/kotlin/net/corda/node/CordappSmokeTest.kt b/node/src/smoke-test/kotlin/net/corda/node/CordappSmokeTest.kt index 4093f6b935..26a913db24 100644 --- a/node/src/smoke-test/kotlin/net/corda/node/CordappSmokeTest.kt +++ b/node/src/smoke-test/kotlin/net/corda/node/CordappSmokeTest.kt @@ -9,11 +9,11 @@ import net.corda.core.internal.div import net.corda.core.internal.list import net.corda.core.messaging.startFlow import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.getX500Name import net.corda.nodeapi.User import net.corda.smoketesting.NodeConfig import net.corda.smoketesting.NodeProcess import org.assertj.core.api.Assertions.assertThat -import org.bouncycastle.asn1.x500.X500Name import org.junit.Test import java.nio.file.Paths import java.util.concurrent.atomic.AtomicInteger @@ -28,7 +28,7 @@ class CordappSmokeTest { private val factory = NodeProcess.Factory() private val aliceConfig = NodeConfig( - legalName = X500Name("CN=Alice Corp,O=Alice Corp,L=Madrid,C=ES"), + legalName = getX500Name(O = "Alice Corp", L = "Madrid", C = "ES"), p2pPort = port.andIncrement, rpcPort = port.andIncrement, webPort = port.andIncrement, diff --git a/node/src/test/kotlin/net/corda/node/services/NotaryChangeTests.kt b/node/src/test/kotlin/net/corda/node/services/NotaryChangeTests.kt index bf5f9a4f12..696e27ee96 100644 --- a/node/src/test/kotlin/net/corda/node/services/NotaryChangeTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/NotaryChangeTests.kt @@ -9,6 +9,7 @@ import net.corda.core.node.services.ServiceInfo import net.corda.core.transactions.TransactionBuilder import net.corda.core.transactions.WireTransaction import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.getX500Name import net.corda.core.utilities.seconds import net.corda.node.internal.AbstractNode import net.corda.node.services.network.NetworkMapService @@ -86,7 +87,7 @@ class NotaryChangeTests { @Test fun `should throw when a participant refuses to change Notary`() { val state = issueMultiPartyState(clientNodeA, clientNodeB, oldNotaryNode) - val newEvilNotary = getTestPartyAndCertificate(X500Name("CN=Evil Notary,O=Evil R3,OU=corda,L=London,C=GB"), generateKeyPair().public) + val newEvilNotary = getTestPartyAndCertificate(getX500Name(OU="Evil Notary",O="Evil R3",L="London",C="GB"), generateKeyPair().public) val flow = NotaryChangeFlow(state, newEvilNotary.party) val future = clientNodeA.services.startFlow(flow) diff --git a/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt b/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt index 58be899e35..c37d17b897 100644 --- a/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/config/FullNodeConfigurationTest.kt @@ -1,9 +1,9 @@ package net.corda.node.services.config -import net.corda.core.utilities.commonName +import net.corda.core.utilities.organisation import net.corda.core.utilities.NetworkHostAndPort -import net.corda.testing.ALICE import net.corda.nodeapi.User +import net.corda.testing.ALICE import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties import org.assertj.core.api.Assertions.assertThatThrownBy @@ -21,7 +21,7 @@ class FullNodeConfigurationTest { emailAddress = "", keyStorePassword = "cordacadevpass", trustStorePassword = "trustpass", - dataSourceProperties = makeTestDataSourceProperties(ALICE.name.commonName), + dataSourceProperties = makeTestDataSourceProperties(ALICE.name.organisation), database = makeTestDatabaseProperties(), certificateSigningService = URL("http://localhost"), rpcUsers = emptyList(), diff --git a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt index 144c7a76d4..370d7667a1 100644 --- a/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/events/NodeSchedulerServiceTest.kt @@ -12,6 +12,7 @@ import net.corda.core.node.services.VaultService import net.corda.core.serialization.SingletonSerializeAsToken import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.days +import net.corda.core.utilities.getX500Name import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.services.persistence.DBCheckpointStorage import net.corda.node.services.statemachine.FlowLogicRefFactoryImpl @@ -24,6 +25,9 @@ import net.corda.node.utilities.configureDatabase import net.corda.testing.* import net.corda.testing.node.InMemoryMessagingNetwork import net.corda.testing.node.MockKeyManagementService +import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties +import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties +import net.corda.testing.node.MockServices.Companion.makeTestIdentityService import net.corda.testing.node.TestClock import org.assertj.core.api.Assertions.assertThat import org.bouncycastle.asn1.x500.X500Name @@ -31,16 +35,12 @@ import org.junit.After import org.junit.Before import org.junit.Test import java.nio.file.Paths -import java.security.PublicKey import java.time.Clock import java.time.Instant import java.util.concurrent.CountDownLatch import java.util.concurrent.Executors import java.util.concurrent.TimeUnit import kotlin.test.assertTrue -import net.corda.testing.node.MockServices.Companion.makeTestDatabaseProperties -import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties -import net.corda.testing.node.MockServices.Companion.makeTestIdentityService class NodeSchedulerServiceTest : SingletonSerializeAsToken() { val realClock: Clock = Clock.systemUTC() @@ -89,7 +89,7 @@ class NodeSchedulerServiceTest : SingletonSerializeAsToken() { database) services = object : MockServiceHubInternal( database, - testNodeConfiguration(Paths.get("."), getTestX509Name("Alice")), + testNodeConfiguration(Paths.get("."), getX500Name(O = "Alice", L = "London", C = "GB")), overrideClock = testClock, keyManagement = kms, network = mockMessagingService), TestReference { diff --git a/node/src/test/kotlin/net/corda/node/services/network/AbstractNetworkMapServiceTest.kt b/node/src/test/kotlin/net/corda/node/services/network/AbstractNetworkMapServiceTest.kt index c817fca191..30c0de2843 100644 --- a/node/src/test/kotlin/net/corda/node/services/network/AbstractNetworkMapServiceTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/network/AbstractNetworkMapServiceTest.kt @@ -6,6 +6,7 @@ import net.corda.core.node.NodeInfo import net.corda.core.node.services.ServiceInfo import net.corda.core.serialization.deserialize import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.getX500Name import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.messaging.MessagingService import net.corda.node.services.messaging.send @@ -46,7 +47,7 @@ abstract class AbstractNetworkMapServiceTest lateinit var alice: MockNode companion object { - val subscriberLegalName = X500Name("CN=Subscriber,OU=Corda QA Department,O=R3 CEV,L=New York,C=US") + val subscriberLegalName = getX500Name(O="Subscriber",L="New York",C="US") } @Before diff --git a/node/src/test/kotlin/net/corda/node/services/network/InMemoryIdentityServiceTests.kt b/node/src/test/kotlin/net/corda/node/services/network/InMemoryIdentityServiceTests.kt index ba1993cbd4..43e917b73d 100644 --- a/node/src/test/kotlin/net/corda/node/services/network/InMemoryIdentityServiceTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/network/InMemoryIdentityServiceTests.kt @@ -1,13 +1,14 @@ package net.corda.node.services.network -import net.corda.core.utilities.CertificateAndKeyPair import net.corda.core.crypto.Crypto -import net.corda.core.utilities.cert import net.corda.core.crypto.generateKeyPair import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.services.UnknownAnonymousPartyException +import net.corda.core.utilities.CertificateAndKeyPair +import net.corda.core.utilities.cert +import net.corda.core.utilities.getX500Name import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.utilities.CertificateType import net.corda.node.utilities.X509Utilities @@ -62,7 +63,7 @@ class InMemoryIdentityServiceTests { val service = InMemoryIdentityService(trustRoot = trustRoot.certificate) service.verifyAndRegisterIdentity(ALICE_IDENTITY) service.verifyAndRegisterIdentity(BOB_IDENTITY) - val alicente = getTestPartyAndCertificate(X500Name("O=Alicente Worldwide,L=London,C=GB"), generateKeyPair().public) + val alicente = getTestPartyAndCertificate(getX500Name(O = "Alicente Worldwide", L = "London", C = "GB"), generateKeyPair().public) service.verifyAndRegisterIdentity(alicente) assertEquals(setOf(ALICE, alicente.party), service.partiesFromName("Alice", false)) assertEquals(setOf(ALICE), service.partiesFromName("Alice Corp", true)) @@ -73,7 +74,7 @@ class InMemoryIdentityServiceTests { fun `get identity by name`() { val service = InMemoryIdentityService(trustRoot = DUMMY_CA.certificate) val identities = listOf("Node A", "Node B", "Node C") - .map { getTestPartyAndCertificate(X500Name("CN=$it,O=R3,OU=corda,L=London,C=GB"), generateKeyPair().public) } + .map { getTestPartyAndCertificate(getX500Name(O = it, OU = "corda", L = "London", C = "GB"), generateKeyPair().public) } assertNull(service.partyFromX500Name(identities.first().name)) identities.forEach { service.verifyAndRegisterIdentity(it) } identities.forEach { assertEquals(it.party, service.partyFromX500Name(it.name)) } diff --git a/node/src/test/kotlin/net/corda/node/services/network/PersistentIdentityServiceTests.kt b/node/src/test/kotlin/net/corda/node/services/network/PersistentIdentityServiceTests.kt index 0ba68a7dd9..1d936a0135 100644 --- a/node/src/test/kotlin/net/corda/node/services/network/PersistentIdentityServiceTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/network/PersistentIdentityServiceTests.kt @@ -9,6 +9,7 @@ import net.corda.core.node.services.IdentityService import net.corda.core.node.services.UnknownAnonymousPartyException import net.corda.core.utilities.CertificateAndKeyPair import net.corda.core.utilities.cert +import net.corda.core.utilities.getX500Name import net.corda.node.services.identity.PersistentIdentityService import net.corda.node.utilities.CertificateType import net.corda.node.utilities.CordaPersistence @@ -96,7 +97,7 @@ class PersistentIdentityServiceTests { identityService.verifyAndRegisterIdentity(ALICE_IDENTITY) identityService.verifyAndRegisterIdentity(BOB_IDENTITY) } - val alicente = getTestPartyAndCertificate(X500Name("O=Alicente Worldwide,L=London,C=GB"), generateKeyPair().public) + val alicente = getTestPartyAndCertificate(getX500Name(O = "Alicente Worldwide", L = "London", C = "GB"), generateKeyPair().public) database.transaction { identityService.verifyAndRegisterIdentity(alicente) assertEquals(setOf(ALICE, alicente.party), identityService.partiesFromName("Alice", false)) @@ -108,7 +109,7 @@ class PersistentIdentityServiceTests { @Test fun `get identity by name`() { val identities = listOf("Node A", "Node B", "Node C") - .map { getTestPartyAndCertificate(X500Name("CN=$it,O=R3,OU=corda,L=London,C=GB"), generateKeyPair().public) } + .map { getTestPartyAndCertificate(getX500Name(O = it, OU = "corda", L = "London", C = "GB"), generateKeyPair().public) } database.transaction { assertNull(identityService.partyFromX500Name(identities.first().name)) } diff --git a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt index 1e5670c7ac..7da73c2258 100644 --- a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt @@ -21,11 +21,8 @@ import net.corda.core.serialization.serialize import net.corda.core.toFuture import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.TransactionBuilder -import net.corda.core.utilities.OpaqueBytes -import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.* import net.corda.core.utilities.ProgressTracker.Change -import net.corda.core.utilities.getOrThrow -import net.corda.core.utilities.unwrap import net.corda.finance.DOLLARS import net.corda.finance.flows.CashIssueFlow import net.corda.finance.flows.CashPaymentFlow @@ -79,7 +76,7 @@ class FlowFrameworkTests { // We intentionally create our own notary and ignore the one provided by the network val notaryKeyPair = generateKeyPair() - val notaryService = ServiceInfo(ValidatingNotaryService.type, getTestX509Name("notary-service-2000")) + val notaryService = ServiceInfo(ValidatingNotaryService.type, getX500Name(O = "notary-service-2000", L = "London", C = "GB")) val overrideServices = mapOf(Pair(notaryService, notaryKeyPair)) // Note that these notaries don't operate correctly as they don't share their state. They are only used for testing // service addressing. diff --git a/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt b/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt index 17fe519f61..16780717e0 100644 --- a/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt @@ -32,7 +32,6 @@ import net.corda.testing.schemas.DummyLinearStateSchemaV1 import org.assertj.core.api.Assertions import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatThrownBy -import org.bouncycastle.asn1.x500.X500Name import org.junit.* import org.junit.rules.ExpectedException import java.lang.Thread.sleep @@ -55,7 +54,7 @@ class VaultQueryTests : TestDependencyInjectionBase() { // test cash notary val CASH_NOTARY_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(21)) } - val CASH_NOTARY: Party get() = Party(X500Name("CN=Cash Notary Service,O=R3,OU=corda,L=Zurich,C=CH"), CASH_NOTARY_KEY.public) + val CASH_NOTARY: Party get() = Party(getX500Name(O = "Cash Notary Service", OU = "corda", L = "Zurich", C = "CH"), CASH_NOTARY_KEY.public) val CASH_NOTARY_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(CASH_NOTARY.nameOrNull(), CASH_NOTARY_KEY.public) @Before @@ -278,7 +277,7 @@ class VaultQueryTests : TestDependencyInjectionBase() { val sortAttributeTxnId = SortAttribute.Standard(Sort.CommonStateAttribute.STATE_REF_TXN_ID) val sortAttributeIndex = SortAttribute.Standard(Sort.CommonStateAttribute.STATE_REF_INDEX) val sortBy = Sort(setOf(Sort.SortColumn(sortAttributeTxnId, Sort.Direction.ASC), - Sort.SortColumn(sortAttributeIndex, Sort.Direction.ASC))) + Sort.SortColumn(sortAttributeIndex, Sort.Direction.ASC))) val criteria = VaultQueryCriteria() val results = vaultQuerySvc.queryBy(criteria, sortBy) @@ -295,11 +294,11 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun `unconsumed states for state refs`() { val stateRefs = - database.transaction { - services.fillWithSomeTestLinearStates(8) - val issuedStates = services.fillWithSomeTestLinearStates(2) - issuedStates.states.map { it.ref }.toList() - } + database.transaction { + services.fillWithSomeTestLinearStates(8) + val issuedStates = services.fillWithSomeTestLinearStates(2) + issuedStates.states.map { it.ref }.toList() + } database.transaction { // DOCSTART VaultQueryExample2 val sortAttribute = SortAttribute.Standard(Sort.CommonStateAttribute.STATE_REF_TXN_ID) @@ -472,15 +471,15 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun `unconsumed states with soft locking`() { val (lockId1, lockId2) = - database.transaction { - val issuedStates = services.fillWithSomeTestCash(100.DOLLARS, notaryServices, CASH_NOTARY, 10, 10, Random(0L)).states.toList() - vaultSvc.softLockReserve(UUID.randomUUID(), NonEmptySet.of(issuedStates[1].ref, issuedStates[2].ref, issuedStates[3].ref)) - val lockId1 = UUID.randomUUID() - vaultSvc.softLockReserve(lockId1, NonEmptySet.of(issuedStates[4].ref, issuedStates[5].ref)) - val lockId2 = UUID.randomUUID() - vaultSvc.softLockReserve(lockId2, NonEmptySet.of(issuedStates[6].ref)) - Pair(lockId1, lockId2) - } + database.transaction { + val issuedStates = services.fillWithSomeTestCash(100.DOLLARS, notaryServices, CASH_NOTARY, 10, 10, Random(0L)).states.toList() + vaultSvc.softLockReserve(UUID.randomUUID(), NonEmptySet.of(issuedStates[1].ref, issuedStates[2].ref, issuedStates[3].ref)) + val lockId1 = UUID.randomUUID() + vaultSvc.softLockReserve(lockId1, NonEmptySet.of(issuedStates[4].ref, issuedStates[5].ref)) + val lockId2 = UUID.randomUUID() + vaultSvc.softLockReserve(lockId2, NonEmptySet.of(issuedStates[6].ref)) + Pair(lockId1, lockId2) + } database.transaction { // excluding soft locked states val criteriaExclusive = VaultQueryCriteria(softLockingCondition = SoftLockingCondition(SoftLockingType.UNLOCKED_ONLY)) @@ -739,10 +738,10 @@ class VaultQueryTests : TestDependencyInjectionBase() { val avgCriteria = VaultCustomQueryCriteria(avg) val results = vaultQuerySvc.queryBy>(sumCriteria - .and(countCriteria) - .and(maxCriteria) - .and(minCriteria) - .and(avgCriteria)) + .and(countCriteria) + .and(maxCriteria) + .and(minCriteria) + .and(avgCriteria)) // DOCEND VaultQueryExample21 assertThat(results.otherResults).hasSize(5) @@ -778,9 +777,9 @@ class VaultQueryTests : TestDependencyInjectionBase() { val avgCriteria = VaultCustomQueryCriteria(avg) val results = vaultQuerySvc.queryBy>(sumCriteria - .and(maxCriteria) - .and(minCriteria) - .and(avgCriteria)) + .and(maxCriteria) + .and(minCriteria) + .and(avgCriteria)) // DOCEND VaultQueryExample22 assertThat(results.otherResults).hasSize(24) @@ -826,9 +825,10 @@ class VaultQueryTests : TestDependencyInjectionBase() { } database.transaction { // DOCSTART VaultQueryExample23 - val sum = builder { CashSchemaV1.PersistentCashState::pennies.sum(groupByColumns = listOf(CashSchemaV1.PersistentCashState::issuerParty, - CashSchemaV1.PersistentCashState::currency), - orderBy = Sort.Direction.DESC) + val sum = builder { + CashSchemaV1.PersistentCashState::pennies.sum(groupByColumns = listOf(CashSchemaV1.PersistentCashState::issuerParty, + CashSchemaV1.PersistentCashState::currency), + orderBy = Sort.Direction.DESC) } val results = vaultQuerySvc.queryBy>(VaultCustomQueryCriteria(sum)) @@ -880,16 +880,16 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun `aggregate functions count by contract type and state status`() { - val (linearStatesJKL,linearStatesXYZ,dealStates) = - database.transaction { - // create new states - services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 10, 10, Random(0L)) - val linearStatesXYZ = services.fillWithSomeTestLinearStates(1, "XYZ") - val linearStatesJKL = services.fillWithSomeTestLinearStates(2, "JKL") - services.fillWithSomeTestLinearStates(3, "ABC") - val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")) - Triple(linearStatesJKL,linearStatesXYZ,dealStates) - } + val (linearStatesJKL, linearStatesXYZ, dealStates) = + database.transaction { + // create new states + services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 10, 10, Random(0L)) + val linearStatesXYZ = services.fillWithSomeTestLinearStates(1, "XYZ") + val linearStatesJKL = services.fillWithSomeTestLinearStates(2, "JKL") + services.fillWithSomeTestLinearStates(3, "ABC") + val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")) + Triple(linearStatesJKL, linearStatesXYZ, dealStates) + } val count = builder { VaultSchemaV1.VaultStates::recordedTime.count() } database.transaction { // count fungible assets @@ -906,15 +906,15 @@ class VaultQueryTests : TestDependencyInjectionBase() { assertThat(dealStateCount).isEqualTo(3L) } val cashUpdates = - database.transaction { - // consume some states - services.consumeLinearStates(linearStatesXYZ.states.toList(), DUMMY_NOTARY) - services.consumeLinearStates(linearStatesJKL.states.toList(), DUMMY_NOTARY) - services.consumeDeals(dealStates.states.filter { it.state.data.linearId.externalId == "456" }, DUMMY_NOTARY) - services.consumeCash(50.DOLLARS, notary = DUMMY_NOTARY) + database.transaction { + // consume some states + services.consumeLinearStates(linearStatesXYZ.states.toList(), DUMMY_NOTARY) + services.consumeLinearStates(linearStatesJKL.states.toList(), DUMMY_NOTARY) + services.consumeDeals(dealStates.states.filter { it.state.data.linearId.externalId == "456" }, DUMMY_NOTARY) + services.consumeCash(50.DOLLARS, notary = DUMMY_NOTARY) - // UNCONSUMED states (default) - } + // UNCONSUMED states (default) + } database.transaction { // count fungible assets val countCriteriaUnconsumed = QueryCriteria.VaultCustomQueryCriteria(count, Vault.StateStatus.UNCONSUMED) @@ -1228,9 +1228,9 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun `unconsumed linear heads for linearId without external Id`() { val issuedStates = - database.transaction { - services.fillWithSomeTestLinearStates(10) - } + database.transaction { + services.fillWithSomeTestLinearStates(10) + } database.transaction { // DOCSTART VaultQueryExample8 val linearIds = issuedStates.states.map { it.state.data.linearId }.toList() @@ -1244,12 +1244,12 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun `unconsumed linear heads by linearId`() { val (linearState1, linearState3) = - database.transaction { - val linearState1 = services.fillWithSomeTestLinearStates(1, "ID1") - services.fillWithSomeTestLinearStates(1, "ID2") - val linearState3 = services.fillWithSomeTestLinearStates(1, "ID3") - Pair(linearState1, linearState3) - } + database.transaction { + val linearState1 = services.fillWithSomeTestLinearStates(1, "ID1") + services.fillWithSomeTestLinearStates(1, "ID2") + val linearState3 = services.fillWithSomeTestLinearStates(1, "ID3") + Pair(linearState1, linearState3) + } database.transaction { val linearIds = listOf(linearState1.states.first().state.data.linearId, linearState3.states.first().state.data.linearId) val criteria = LinearStateQueryCriteria(linearId = linearIds) @@ -1278,14 +1278,14 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun `all linear states for a given linear id`() { val linearId = - database.transaction { - val txns = services.fillWithSomeTestLinearStates(1, "TEST") - val linearState = txns.states.first() - services.evolveLinearState(linearState, DUMMY_NOTARY) // consume current and produce new state reference - services.evolveLinearState(linearState, DUMMY_NOTARY) // consume current and produce new state reference - services.evolveLinearState(linearState, DUMMY_NOTARY) // consume current and produce new state reference - linearState.state.data.linearId - } + database.transaction { + val txns = services.fillWithSomeTestLinearStates(1, "TEST") + val linearState = txns.states.first() + services.evolveLinearState(linearState, DUMMY_NOTARY) // consume current and produce new state reference + services.evolveLinearState(linearState, DUMMY_NOTARY) // consume current and produce new state reference + services.evolveLinearState(linearState, DUMMY_NOTARY) // consume current and produce new state reference + linearState.state.data.linearId + } database.transaction { // should now have 1 UNCONSUMED & 3 CONSUMED state refs for Linear State with "TEST" // DOCSTART VaultQueryExample9 @@ -1300,14 +1300,14 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun `all linear states for a given id sorted by uuid`() { val linearStates = - database.transaction { - val txns = services.fillWithSomeTestLinearStates(2, "TEST") - val linearStates = txns.states.toList() - services.evolveLinearStates(linearStates, DUMMY_NOTARY) // consume current and produce new state reference - services.evolveLinearStates(linearStates, DUMMY_NOTARY) // consume current and produce new state reference - services.evolveLinearStates(linearStates, DUMMY_NOTARY) // consume current and produce new state reference - linearStates - } + database.transaction { + val txns = services.fillWithSomeTestLinearStates(2, "TEST") + val linearStates = txns.states.toList() + services.evolveLinearStates(linearStates, DUMMY_NOTARY) // consume current and produce new state reference + services.evolveLinearStates(linearStates, DUMMY_NOTARY) // consume current and produce new state reference + services.evolveLinearStates(linearStates, DUMMY_NOTARY) // consume current and produce new state reference + linearStates + } database.transaction { // should now have 1 UNCONSUMED & 3 CONSUMED state refs for Linear State with "TEST" val linearStateCriteria = LinearStateQueryCriteria(uuid = linearStates.map { it.state.data.linearId.id }, status = Vault.StateStatus.ALL) @@ -1340,11 +1340,11 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun `unconsumed deal states sorted`() { val uid = - database.transaction { - val linearStates = services.fillWithSomeTestLinearStates(10) - services.fillWithSomeTestDeals(listOf("123", "456", "789")) - linearStates.states.first().state.data.linearId.id - } + database.transaction { + val linearStates = services.fillWithSomeTestLinearStates(10) + services.fillWithSomeTestDeals(listOf("123", "456", "789")) + linearStates.states.first().state.data.linearId.id + } database.transaction { val linearStateCriteria = LinearStateQueryCriteria(uuid = listOf(uid)) val dealStateCriteria = LinearStateQueryCriteria(externalId = listOf("123", "456", "789")) @@ -1378,14 +1378,14 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun `return consumed linear states for a given linear id`() { val txns = - database.transaction { - val txns = services.fillWithSomeTestLinearStates(1, "TEST") - val linearState = txns.states.first() - val linearState2 = services.evolveLinearState(linearState, DUMMY_NOTARY) // consume current and produce new state reference - val linearState3 = services.evolveLinearState(linearState2, DUMMY_NOTARY) // consume current and produce new state reference - services.evolveLinearState(linearState3, DUMMY_NOTARY) // consume current and produce new state reference - txns - } + database.transaction { + val txns = services.fillWithSomeTestLinearStates(1, "TEST") + val linearState = txns.states.first() + val linearState2 = services.evolveLinearState(linearState, DUMMY_NOTARY) // consume current and produce new state reference + val linearState3 = services.evolveLinearState(linearState2, DUMMY_NOTARY) // consume current and produce new state reference + services.evolveLinearState(linearState3, DUMMY_NOTARY) // consume current and produce new state reference + txns + } database.transaction { // should now have 1 UNCONSUMED & 3 CONSUMED state refs for Linear State with "TEST" val linearStateCriteria = LinearStateQueryCriteria(linearId = txns.states.map { it.state.data.linearId }, status = Vault.StateStatus.CONSUMED) @@ -1484,15 +1484,15 @@ class VaultQueryTests : TestDependencyInjectionBase() { fun `unconsumed fungible assets for selected issuer parties`() { // GBP issuer val gbpCashIssuerKey = entropyToKeyPair(BigInteger.valueOf(1001)) - val gbpCashIssuer = Party(X500Name("CN=British Pounds Cash Issuer,O=R3,OU=corda,L=London,C=GB"), gbpCashIssuerKey.public).ref(1) + val gbpCashIssuer = Party(getX500Name(O = "British Pounds Cash Issuer", OU = "corda", L = "London", C = "GB"), gbpCashIssuerKey.public).ref(1) val gbpCashIssuerServices = MockServices(gbpCashIssuerKey) // USD issuer val usdCashIssuerKey = entropyToKeyPair(BigInteger.valueOf(1002)) - val usdCashIssuer = Party(X500Name("CN=US Dollars Cash Issuer,O=R3,OU=corda,L=New York,C=US"), usdCashIssuerKey.public).ref(1) + val usdCashIssuer = Party(getX500Name(O = "US Dollars Cash Issuer", OU = "corda", L = "New York", C = "US"), usdCashIssuerKey.public).ref(1) val usdCashIssuerServices = MockServices(usdCashIssuerKey) // CHF issuer val chfCashIssuerKey = entropyToKeyPair(BigInteger.valueOf(1003)) - val chfCashIssuer = Party(X500Name("CN=Swiss Francs Cash Issuer,O=R3,OU=corda,L=Zurich,C=CH"), chfCashIssuerKey.public).ref(1) + val chfCashIssuer = Party(getX500Name(O = "Swiss Francs Cash Issuer", OU = "corda", L = "Zurich", C = "CH"), chfCashIssuerKey.public).ref(1) val chfCashIssuerServices = MockServices(chfCashIssuerKey) database.transaction { @@ -1871,14 +1871,14 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun `unconsumed linear heads for a given external id or uuid`() { val uuid = - database.transaction { - services.fillWithSomeTestLinearStates(1, "TEST1") - val aState = services.fillWithSomeTestLinearStates(1, "TEST2").states - services.consumeLinearStates(aState.toList(), DUMMY_NOTARY) - services.fillWithSomeTestLinearStates(1, "TEST1").states.first().state.data.linearId.id + database.transaction { + services.fillWithSomeTestLinearStates(1, "TEST1") + val aState = services.fillWithSomeTestLinearStates(1, "TEST2").states + services.consumeLinearStates(aState.toList(), DUMMY_NOTARY) + services.fillWithSomeTestLinearStates(1, "TEST1").states.first().state.data.linearId.id - // 2 unconsumed states with same external ID, 1 consumed with different external ID - } + // 2 unconsumed states with same external ID, 1 consumed with different external ID + } database.transaction { val results = builder { val externalIdCondition = VaultSchemaV1.VaultLinearStates::externalId.equal("TEST1") @@ -1919,12 +1919,12 @@ class VaultQueryTests : TestDependencyInjectionBase() { identitySvc.verifyAndRegisterIdentity(BOB_IDENTITY) identitySvc.verifyAndRegisterIdentity(CHARLIE_IDENTITY) - services.fillWithSomeTestLinearStates(1, "TEST1", listOf(ALICE,BOB,CHARLIE)) + services.fillWithSomeTestLinearStates(1, "TEST1", listOf(ALICE, BOB, CHARLIE)) services.fillWithSomeTestLinearStates(1) services.fillWithSomeTestLinearStates(1, "TEST3") } database.transaction { - val linearStateCriteria = LinearStateQueryCriteria(participants = listOf(ALICE,BOB,CHARLIE)) + val linearStateCriteria = LinearStateQueryCriteria(participants = listOf(ALICE, BOB, CHARLIE)) val results = vaultQuerySvc.queryBy(linearStateCriteria) assertThat(results.states).hasSize(1) @@ -1984,12 +1984,12 @@ class VaultQueryTests : TestDependencyInjectionBase() { database.transaction { // Base criteria val baseCriteria = VaultQueryCriteria(notary = listOf(DUMMY_NOTARY), - status = Vault.StateStatus.CONSUMED) + status = Vault.StateStatus.CONSUMED) // Enrich and override QueryCriteria with additional default attributes (such as soft locks) - val enrichedCriteria = VaultQueryCriteria(contractStateTypes = setOf(DealState::class.java), // enrich - softLockingCondition = QueryCriteria.SoftLockingCondition(QueryCriteria.SoftLockingType.UNLOCKED_AND_SPECIFIED, listOf(UUID.randomUUID())), - status = Vault.StateStatus.UNCONSUMED) // override + val enrichedCriteria = VaultQueryCriteria(contractStateTypes = setOf(DealState::class.java), // enrich + softLockingCondition = QueryCriteria.SoftLockingCondition(QueryCriteria.SoftLockingType.UNLOCKED_AND_SPECIFIED, listOf(UUID.randomUUID())), + status = Vault.StateStatus.UNCONSUMED) // override // Sorting val sortAttribute = SortAttribute.Standard(Sort.CommonStateAttribute.STATE_REF) val sorter = Sort(setOf(Sort.SortColumn(sortAttribute, Sort.Direction.ASC))) @@ -2007,28 +2007,28 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun trackCashStates_unconsumed() { val updates = - database.transaction { - // DOCSTART VaultQueryExample15 - vaultQuerySvc.trackBy().updates // UNCONSUMED default - // DOCEND VaultQueryExample15 - } - val (linearStates,dealStates) = - database.transaction { - services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 5, 5, Random(0L)) - val linearStates = services.fillWithSomeTestLinearStates(10).states - val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")).states - // add more cash - services.fillWithSomeTestCash(100.POUNDS, notaryServices, DUMMY_NOTARY, 1, 1, Random(0L)) - // add another deal - services.fillWithSomeTestDeals(listOf("SAMPLE DEAL")) - Pair(linearStates,dealStates) - } + database.transaction { + // DOCSTART VaultQueryExample15 + vaultQuerySvc.trackBy().updates // UNCONSUMED default + // DOCEND VaultQueryExample15 + } + val (linearStates, dealStates) = + database.transaction { + services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 5, 5, Random(0L)) + val linearStates = services.fillWithSomeTestLinearStates(10).states + val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")).states + // add more cash + services.fillWithSomeTestCash(100.POUNDS, notaryServices, DUMMY_NOTARY, 1, 1, Random(0L)) + // add another deal + services.fillWithSomeTestDeals(listOf("SAMPLE DEAL")) + Pair(linearStates, dealStates) + } database.transaction { // consume stuff services.consumeCash(100.DOLLARS, notary = DUMMY_NOTARY) services.consumeDeals(dealStates.toList(), DUMMY_NOTARY) services.consumeLinearStates(linearStates.toList(), DUMMY_NOTARY) - } + } updates.expectEvents { sequence( @@ -2049,22 +2049,22 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun trackCashStates_consumed() { val updates = - database.transaction { - val criteria = VaultQueryCriteria(status = Vault.StateStatus.CONSUMED) - vaultQuerySvc.trackBy(criteria).updates - } - val (linearStates,dealStates) = - database.transaction { - services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 5, 5, Random(0L)) - val linearStates = services.fillWithSomeTestLinearStates(10).states - val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")).states + database.transaction { + val criteria = VaultQueryCriteria(status = Vault.StateStatus.CONSUMED) + vaultQuerySvc.trackBy(criteria).updates + } + val (linearStates, dealStates) = + database.transaction { + services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 5, 5, Random(0L)) + val linearStates = services.fillWithSomeTestLinearStates(10).states + val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")).states - // add more cash - services.fillWithSomeTestCash(100.POUNDS, notaryServices, DUMMY_NOTARY, 1, 1, Random(0L)) - // add another deal - services.fillWithSomeTestDeals(listOf("SAMPLE DEAL")) - Pair(linearStates,dealStates) - } + // add more cash + services.fillWithSomeTestCash(100.POUNDS, notaryServices, DUMMY_NOTARY, 1, 1, Random(0L)) + // add another deal + services.fillWithSomeTestDeals(listOf("SAMPLE DEAL")) + Pair(linearStates, dealStates) + } database.transaction { // consume stuff services.consumeCash(100.POUNDS, notary = DUMMY_NOTARY) @@ -2095,21 +2095,21 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun trackCashStates_all() { val updates = - database.transaction { - val criteria = VaultQueryCriteria(status = Vault.StateStatus.ALL) - vaultQuerySvc.trackBy(criteria).updates - } - val (linearStates,dealStates) = - database.transaction { - services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 5, 5, Random(0L)) - val linearStates = services.fillWithSomeTestLinearStates(10).states - val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")).states - // add more cash - services.fillWithSomeTestCash(100.POUNDS, notaryServices, DUMMY_NOTARY, 1, 1, Random(0L)) - // add another deal - services.fillWithSomeTestDeals(listOf("SAMPLE DEAL")) - Pair(linearStates,dealStates) - } + database.transaction { + val criteria = VaultQueryCriteria(status = Vault.StateStatus.ALL) + vaultQuerySvc.trackBy(criteria).updates + } + val (linearStates, dealStates) = + database.transaction { + services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 5, 5, Random(0L)) + val linearStates = services.fillWithSomeTestLinearStates(10).states + val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")).states + // add more cash + services.fillWithSomeTestCash(100.POUNDS, notaryServices, DUMMY_NOTARY, 1, 1, Random(0L)) + // add another deal + services.fillWithSomeTestDeals(listOf("SAMPLE DEAL")) + Pair(linearStates, dealStates) + } database.transaction { // consume stuff services.consumeCash(99.POUNDS, notary = DUMMY_NOTARY) @@ -2150,24 +2150,24 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun trackLinearStates() { val updates = - database.transaction { - // DOCSTART VaultQueryExample16 - val (snapshot, updates) = vaultQuerySvc.trackBy() - // DOCEND VaultQueryExample16 - assertThat(snapshot.states).hasSize(0) - updates - } - val (linearStates,dealStates) = - database.transaction { - services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 3, 3, Random(0L)) - val linearStates = services.fillWithSomeTestLinearStates(10).states - val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")).states - // add more cash - services.fillWithSomeTestCash(100.POUNDS, notaryServices, DUMMY_NOTARY, 1, 1, Random(0L)) - // add another deal - services.fillWithSomeTestDeals(listOf("SAMPLE DEAL")) - Pair(linearStates,dealStates) - } + database.transaction { + // DOCSTART VaultQueryExample16 + val (snapshot, updates) = vaultQuerySvc.trackBy() + // DOCEND VaultQueryExample16 + assertThat(snapshot.states).hasSize(0) + updates + } + val (linearStates, dealStates) = + database.transaction { + services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 3, 3, Random(0L)) + val linearStates = services.fillWithSomeTestLinearStates(10).states + val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")).states + // add more cash + services.fillWithSomeTestCash(100.POUNDS, notaryServices, DUMMY_NOTARY, 1, 1, Random(0L)) + // add another deal + services.fillWithSomeTestDeals(listOf("SAMPLE DEAL")) + Pair(linearStates, dealStates) + } database.transaction { // consume stuff services.consumeCash(100.DOLLARS, notary = DUMMY_NOTARY) @@ -2199,24 +2199,24 @@ class VaultQueryTests : TestDependencyInjectionBase() { @Test fun trackDealStates() { val updates = - database.transaction { - // DOCSTART VaultQueryExample17 - val (snapshot, updates) = vaultQuerySvc.trackBy() - // DOCEND VaultQueryExample17 - assertThat(snapshot.states).hasSize(0) - updates - } - val (linearStates,dealStates) = - database.transaction { - services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 3, 3, Random(0L)) - val linearStates = services.fillWithSomeTestLinearStates(10).states - val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")).states - // add more cash - services.fillWithSomeTestCash(100.POUNDS, notaryServices, DUMMY_NOTARY, 1, 1, Random(0L)) - // add another deal - services.fillWithSomeTestDeals(listOf("SAMPLE DEAL")) - Pair(linearStates,dealStates) - } + database.transaction { + // DOCSTART VaultQueryExample17 + val (snapshot, updates) = vaultQuerySvc.trackBy() + // DOCEND VaultQueryExample17 + assertThat(snapshot.states).hasSize(0) + updates + } + val (linearStates, dealStates) = + database.transaction { + services.fillWithSomeTestCash(100.DOLLARS, notaryServices, DUMMY_NOTARY, 3, 3, Random(0L)) + val linearStates = services.fillWithSomeTestLinearStates(10).states + val dealStates = services.fillWithSomeTestDeals(listOf("123", "456", "789")).states + // add more cash + services.fillWithSomeTestCash(100.POUNDS, notaryServices, DUMMY_NOTARY, 1, 1, Random(0L)) + // add another deal + services.fillWithSomeTestDeals(listOf("SAMPLE DEAL")) + Pair(linearStates, dealStates) + } database.transaction { // consume stuff services.consumeCash(100.DOLLARS, notary = DUMMY_NOTARY) diff --git a/node/src/test/kotlin/net/corda/node/utilities/X509UtilitiesTest.kt b/node/src/test/kotlin/net/corda/node/utilities/X509UtilitiesTest.kt index a3ca17f2c5..930b8a8e78 100644 --- a/node/src/test/kotlin/net/corda/node/utilities/X509UtilitiesTest.kt +++ b/node/src/test/kotlin/net/corda/node/utilities/X509UtilitiesTest.kt @@ -3,21 +3,25 @@ package net.corda.node.utilities import net.corda.core.crypto.Crypto import net.corda.core.crypto.Crypto.EDDSA_ED25519_SHA512 import net.corda.core.crypto.Crypto.generateKeyPair -import net.corda.core.utilities.cert -import net.corda.core.utilities.commonName -import net.corda.core.utilities.getX509Name import net.corda.core.internal.div import net.corda.core.internal.toTypedArray import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize +import net.corda.core.utilities.cert +import net.corda.core.utilities.commonName +import net.corda.core.utilities.getX500Name +import net.corda.core.utilities.organisation import net.corda.node.serialization.KryoServerSerializationScheme import net.corda.node.services.config.createKeystoreForCordaNode import net.corda.nodeapi.internal.serialization.AllWhitelist import net.corda.nodeapi.internal.serialization.KryoHeaderV0_1 import net.corda.nodeapi.internal.serialization.SerializationContextImpl import net.corda.nodeapi.internal.serialization.SerializationFactoryImpl -import net.corda.testing.* +import net.corda.testing.ALICE +import net.corda.testing.BOB +import net.corda.testing.BOB_PUBKEY +import net.corda.testing.MEGA_CORP import org.bouncycastle.asn1.x500.X500Name import org.bouncycastle.asn1.x509.BasicConstraints import org.bouncycastle.asn1.x509.Extension @@ -54,7 +58,7 @@ class X509UtilitiesTest { @Test fun `create valid self-signed CA certificate`() { val caKey = generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val caCert = X509Utilities.createSelfSignedCACertificate(getTestX509Name("Test Cert"), caKey) + val caCert = X509Utilities.createSelfSignedCACertificate(getX500Name(CN = "Test Cert", O = "R3 Ltd", L = "London", C = "GB"), caKey) assertTrue { caCert.subject.commonName == "Test Cert" } // using our subject common name assertEquals(caCert.issuer, caCert.subject) //self-signed caCert.isValidOn(Date()) // throws on verification problems @@ -69,7 +73,7 @@ class X509UtilitiesTest { fun `load and save a PEM file certificate`() { val tmpCertificateFile = tempFile("cacert.pem") val caKey = generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val caCert = X509Utilities.createSelfSignedCACertificate(getTestX509Name("Test Cert"), caKey) + val caCert = X509Utilities.createSelfSignedCACertificate(getX500Name(CN = "Test Cert", O = "R3 Ltd", L = "London", C = "GB"), caKey) X509Utilities.saveCertificateAsPEMFile(caCert, tmpCertificateFile) val readCertificate = X509Utilities.loadCertificateFromPEMFile(tmpCertificateFile) assertEquals(caCert, readCertificate) @@ -78,8 +82,8 @@ class X509UtilitiesTest { @Test fun `create valid server certificate chain`() { val caKey = generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val caCert = X509Utilities.createSelfSignedCACertificate(getTestX509Name("Test CA Cert"), caKey) - val subject = getTestX509Name("Server Cert") + val caCert = X509Utilities.createSelfSignedCACertificate(getX500Name(CN = "Test CA Cert", O = "R3 Ltd", L = "London", C = "GB"), caKey) + val subject = getX500Name(CN = "Server Cert", O = "R3 Ltd", L = "London", C = "GB") val keyPair = generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) val serverCert = X509Utilities.createCertificate(CertificateType.TLS, caCert, caKey, subject, keyPair.public) assertTrue { serverCert.subject.toString().contains("CN=Server Cert") } // using our subject common name @@ -208,7 +212,7 @@ class X509UtilitiesTest { serverCertAndKey.certificate.isValidOn(Date()) serverCertAndKey.certificate.isSignatureValid(JcaContentVerifierProviderBuilder().build(caCertAndKey.certificate.subjectPublicKeyInfo)) - assertTrue { serverCertAndKey.certificate.subject.toString().contains(MEGA_CORP.name.commonName) } + assertTrue { serverCertAndKey.certificate.subject.toString().contains(MEGA_CORP.name.organisation) } // Load back server certificate val sslKeyStore = loadKeyStore(tmpSSLKeyStore, "serverstorepass") @@ -217,7 +221,7 @@ class X509UtilitiesTest { sslCertAndKey.certificate.isValidOn(Date()) sslCertAndKey.certificate.isSignatureValid(JcaContentVerifierProviderBuilder().build(serverCertAndKey.certificate.subjectPublicKeyInfo)) - assertTrue { sslCertAndKey.certificate.subject.toString().contains(MEGA_CORP.name.commonName) } + assertTrue { sslCertAndKey.certificate.subject.toString().contains(MEGA_CORP.name.organisation) } // Now sign something with private key and verify against certificate public key val testData = "123456".toByteArray() val signature = Crypto.doSign(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME, serverCertAndKey.keyPair.private, testData) @@ -355,10 +359,10 @@ class X509UtilitiesTest { trustStorePassword: String ): KeyStore { val rootCAKey = generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val rootCACert = X509Utilities.createSelfSignedCACertificate(getX509Name("Corda Node Root CA", "London", "demo@r3.com", null), rootCAKey) + val rootCACert = X509Utilities.createSelfSignedCACertificate(getX500Name(CN = "Corda Node Root CA", O = "R3CEV", L = "London", C = "GB"), rootCAKey) val intermediateCAKeyPair = Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME) - val intermediateCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, rootCACert, rootCAKey, getX509Name("Corda Node Intermediate CA", "London", "demo@r3.com", null), intermediateCAKeyPair.public) + val intermediateCACert = X509Utilities.createCertificate(CertificateType.INTERMEDIATE_CA, rootCACert, rootCAKey, getX500Name(CN = "Corda Node Intermediate CA", O = "R3CEV", L = "London", C = "GB"), intermediateCAKeyPair.public) val keyPass = keyPassword.toCharArray() val keyStore = loadOrCreateKeyStore(keyStoreFilePath, storePassword) diff --git a/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkisRegistrationHelperTest.kt b/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkisRegistrationHelperTest.kt index eca0695b11..38e8dabf99 100644 --- a/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkisRegistrationHelperTest.kt +++ b/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkisRegistrationHelperTest.kt @@ -5,15 +5,15 @@ import com.nhaarman.mockito_kotlin.eq import com.nhaarman.mockito_kotlin.mock import net.corda.core.crypto.Crypto import net.corda.core.crypto.SecureHash -import net.corda.core.utilities.cert -import net.corda.core.utilities.commonName import net.corda.core.internal.exists import net.corda.core.internal.toTypedArray import net.corda.core.internal.toX509CertHolder +import net.corda.core.utilities.cert +import net.corda.core.utilities.commonName +import net.corda.core.utilities.getX500Name import net.corda.node.utilities.X509Utilities import net.corda.node.utilities.loadKeyStore import net.corda.testing.ALICE -import net.corda.testing.getTestX509Name import net.corda.testing.testNodeConfiguration import org.junit.Rule import org.junit.Test @@ -34,7 +34,7 @@ class NetworkRegistrationHelperTest { val identities = listOf("CORDA_CLIENT_CA", "CORDA_INTERMEDIATE_CA", "CORDA_ROOT_CA") - .map { getTestX509Name(it) } + .map { getX500Name(CN = it, O = "R3 Ltd", L = "London", C = "GB") } val certs = identities.stream().map { X509Utilities.createSelfSignedCACertificate(it, Crypto.generateKeyPair(X509Utilities.DEFAULT_TLS_SIGNATURE_SCHEME)) } .map { it.cert }.toTypedArray() diff --git a/samples/attachment-demo/build.gradle b/samples/attachment-demo/build.gradle index f5e436df20..7d1587af73 100644 --- a/samples/attachment-demo/build.gradle +++ b/samples/attachment-demo/build.gradle @@ -37,9 +37,9 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { ext.rpcUsers = [['username': "demo", 'password': "demo", 'permissions': ["StartFlow.net.corda.attachmentdemo.AttachmentDemoFlow"]]] directory "./build/nodes" - networkMap "CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH" + networkMap "O=Notary Service,OU=corda,L=Zurich,C=CH" node { - name "CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH" + name "O=Notary Service,OU=corda,L=Zurich,C=CH" advertisedServices["corda.notary.validating"] p2pPort 10002 rpcPort 10003 @@ -47,7 +47,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { rpcUsers = ext.rpcUsers } node { - name "CN=Bank A,O=Bank A,L=London,C=GB" + name "O=Bank A,L=London,C=GB" advertisedServices = [] p2pPort 10005 rpcPort 10006 @@ -55,7 +55,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { rpcUsers = ext.rpcUsers } node { - name "CN=Bank B,O=Bank B,L=New York,C=US" + name "O=Bank B,L=New York,C=US" advertisedServices = [] p2pPort 10008 rpcPort 10009 diff --git a/samples/bank-of-corda-demo/build.gradle b/samples/bank-of-corda-demo/build.gradle index 22bdb29b35..16bb935396 100644 --- a/samples/bank-of-corda-demo/build.gradle +++ b/samples/bank-of-corda-demo/build.gradle @@ -50,16 +50,16 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" // This name "Notary" is hard-coded into BankOfCordaClientApi so if you change it here, change it there too. // In this demo the node that runs a standalone notary also acts as the network map server. - networkMap "CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH" + networkMap "O=Notary Service,OU=corda,L=Zurich,C=CH" node { - name "CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH" + name "O=Notary Service,OU=corda,L=Zurich,C=CH" advertisedServices = ["corda.notary.validating"] p2pPort 10002 rpcPort 10003 cordapps = ["net.corda:finance:$corda_release_version"] } node { - name "CN=BankOfCorda,O=R3,L=New York,C=US" + name "O=BankOfCorda,L=New York,C=US" advertisedServices = ["corda.issuer.USD"] p2pPort 10005 rpcPort 10006 @@ -74,7 +74,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { ] } node { - name "CN=BigCorporation,O=R3,OU=corda,L=London,C=GB" + name "O=BigCorporation,OU=corda,L=London,C=GB" advertisedServices = [] p2pPort 10008 rpcPort 10009 diff --git a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaDriver.kt b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaDriver.kt index d1f93ff00c..1c0f6af795 100644 --- a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaDriver.kt +++ b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaDriver.kt @@ -6,6 +6,7 @@ import net.corda.bank.api.BankOfCordaWebApi.IssueRequestParams import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.ServiceType import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.getX500Name import net.corda.finance.flows.CashExitFlow import net.corda.finance.flows.CashIssueAndPaymentFlow import net.corda.finance.flows.CashPaymentFlow @@ -15,7 +16,6 @@ import net.corda.nodeapi.User import net.corda.testing.BOC import net.corda.testing.DUMMY_NOTARY import net.corda.testing.driver.driver -import org.bouncycastle.asn1.x500.X500Name import kotlin.system.exitProcess /** @@ -28,7 +28,7 @@ fun main(args: Array) { val BANK_USERNAME = "bankUser" val BIGCORP_USERNAME = "bigCorpUser" -val BIGCORP_LEGAL_NAME = X500Name("CN=BigCorporation,O=R3,OU=corda,L=London,C=GB") +val BIGCORP_LEGAL_NAME = getX500Name(O = "BigCorporation", OU = "corda", L = "London", C = "GB") private class BankOfCordaDriver { enum class Role { diff --git a/samples/irs-demo/build.gradle b/samples/irs-demo/build.gradle index 66f894dd1a..1eef8f0ff1 100644 --- a/samples/irs-demo/build.gradle +++ b/samples/irs-demo/build.gradle @@ -50,9 +50,9 @@ dependencies { task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" - networkMap "CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH" + networkMap "O=Notary Service,OU=corda,L=Zurich,C=CH" node { - name "CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH" + name "O=Notary Service,OU=corda,L=Zurich,C=CH" advertisedServices = ["corda.notary.validating", "corda.interest_rates"] p2pPort 10002 rpcPort 10003 @@ -61,7 +61,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { useTestClock true } node { - name "CN=Bank A,O=Bank A,L=London,C=GB" + name "O=Bank A,L=London,C=GB" advertisedServices = [] p2pPort 10005 rpcPort 10006 @@ -70,7 +70,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { useTestClock true } node { - name "CN=Bank B,O=Bank B,L=New York,C=US" + name "O=Bank B,L=New York,C=US" advertisedServices = [] p2pPort 10008 rpcPort 10009 diff --git a/samples/irs-demo/src/main/resources/irsweb/js/viewmodel/FixedLeg.js b/samples/irs-demo/src/main/resources/irsweb/js/viewmodel/FixedLeg.js index a6d25e2ec1..e8e6fc6486 100644 --- a/samples/irs-demo/src/main/resources/irsweb/js/viewmodel/FixedLeg.js +++ b/samples/irs-demo/src/main/resources/irsweb/js/viewmodel/FixedLeg.js @@ -2,7 +2,7 @@ define(['utils/dayCountBasisLookup'], (dayCountBasisLookup) => { return { - fixedRatePayer: "CN=Bank A,O=Bank A,L=London,C=GB", + fixedRatePayer: "O=Bank A,L=London,C=GB", notional: { quantity: 2500000000 }, diff --git a/samples/irs-demo/src/main/resources/irsweb/js/viewmodel/FloatingLeg.js b/samples/irs-demo/src/main/resources/irsweb/js/viewmodel/FloatingLeg.js index 51f38c4f68..a103cafa86 100644 --- a/samples/irs-demo/src/main/resources/irsweb/js/viewmodel/FloatingLeg.js +++ b/samples/irs-demo/src/main/resources/irsweb/js/viewmodel/FloatingLeg.js @@ -2,7 +2,7 @@ define(['utils/dayCountBasisLookup'], (dayCountBasisLookup) => { return { - floatingRatePayer: "CN=Bank B,O=Bank B,L=New York,C=US", + floatingRatePayer: "O=Bank B,L=New York,C=US", notional: { quantity: 2500000000 }, diff --git a/samples/irs-demo/src/main/resources/net/corda/irs/simulation/example-irs-trade.json b/samples/irs-demo/src/main/resources/net/corda/irs/simulation/example-irs-trade.json index 829c38d6a5..389fa1618c 100644 --- a/samples/irs-demo/src/main/resources/net/corda/irs/simulation/example-irs-trade.json +++ b/samples/irs-demo/src/main/resources/net/corda/irs/simulation/example-irs-trade.json @@ -1,6 +1,6 @@ { "fixedLeg": { - "fixedRatePayer": "CN=Bank A,O=Bank A,L=London,C=GB", + "fixedRatePayer": "O=Bank A,L=London,C=GB", "notional": "€25000000", "paymentFrequency": "SemiAnnual", "effectiveDate": "2016-03-11", @@ -22,7 +22,7 @@ "interestPeriodAdjustment": "Adjusted" }, "floatingLeg": { - "floatingRatePayer": "CN=Bank B,O=Bank B,L=New York,C=US", + "floatingRatePayer": "O=Bank B,L=New York,C=US", "notional": "€25000000", "paymentFrequency": "Quarterly", "effectiveDate": "2016-03-11", diff --git a/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt b/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt index 1075b81154..714840f777 100644 --- a/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt +++ b/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt @@ -11,6 +11,7 @@ import net.corda.core.node.services.ServiceInfo import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.getX500Name import net.corda.finance.DOLLARS import net.corda.finance.contracts.Fix import net.corda.finance.contracts.FixOf @@ -48,7 +49,7 @@ class NodeInterestRatesTest : TestDependencyInjectionBase() { """.trimIndent()) val DUMMY_CASH_ISSUER_KEY = generateKeyPair() - val DUMMY_CASH_ISSUER = Party(X500Name("CN=Cash issuer,O=R3,OU=corda,L=London,C=GB"), DUMMY_CASH_ISSUER_KEY.public) + val DUMMY_CASH_ISSUER = Party(getX500Name(O="Cash issuer",OU="corda",L="London",C="GB"), DUMMY_CASH_ISSUER_KEY.public) lateinit var oracle: NodeInterestRates.Oracle lateinit var database: CordaPersistence diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt index 12f783851c..16bf49e595 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/NetworkMapVisualiser.kt @@ -11,7 +11,7 @@ import javafx.scene.input.KeyCodeCombination import javafx.scene.layout.VBox import javafx.stage.Stage import javafx.util.Duration -import net.corda.core.utilities.commonName +import net.corda.core.utilities.organisation import net.corda.core.serialization.deserialize import net.corda.core.utilities.ProgressTracker import net.corda.netmap.VisualiserViewModel.Style @@ -233,7 +233,7 @@ class NetworkMapVisualiser : Application() { } else if (!viewModel.trackerBoxes.containsKey(tracker)) { // New flow started up; add. val extraLabel = viewModel.simulation.extraNodeLabels[node] - val label = if (extraLabel != null) "${node.info.legalIdentity.name.commonName}: $extraLabel" else node.info.legalIdentity.name.commonName + val label = if (extraLabel != null) "${node.info.legalIdentity.name.organisation}: $extraLabel" else node.info.legalIdentity.name.organisation val widget = view.buildProgressTrackerWidget(label, tracker.topLevelTracker) println("Added: $tracker, $widget") viewModel.trackerBoxes[tracker] = widget diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt index 228088417e..638f8bb168 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/VisualiserViewModel.kt @@ -9,7 +9,8 @@ import javafx.scene.shape.Line import javafx.util.Duration import net.corda.core.node.ScreenCoordinate import net.corda.core.utilities.ProgressTracker -import net.corda.core.utilities.commonName +import net.corda.core.utilities.getX500Name +import net.corda.core.utilities.organisation import net.corda.netmap.simulation.IRSSimulation import net.corda.testing.node.MockNetwork import org.bouncycastle.asn1.x500.X500Name @@ -127,7 +128,7 @@ class VisualiserViewModel { } } - fun makeNodeWidget(forNode: MockNetwork.MockNode, type: String, label: X500Name = X500Name("CN=Bank of Bologna,OU=Corda QA Department,O=R3 CEV,L=Bologna,C=IT"), + fun makeNodeWidget(forNode: MockNetwork.MockNode, type: String, label: X500Name = getX500Name(O = "Bank of Bologna", OU = "Corda QA Department", L = "Bologna", C = "IT"), nodeType: NetworkMapVisualiser.NodeType, index: Int): NodeWidget { fun emitRadarPulse(initialRadius: Double, targetRadius: Double, duration: Double): Pair { val pulse = Circle(initialRadius).apply { @@ -157,7 +158,7 @@ class VisualiserViewModel { view.root.children += longPulseOuterDot view.root.children += innerDot - val nameLabel = Label(label.commonName) + val nameLabel = Label(label.organisation) val nameLabelRect = StackPane(nameLabel).apply { styleClass += "node-label" alignment = Pos.CENTER_RIGHT diff --git a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt index 9a8bae5d4d..fbc3ab9304 100644 --- a/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt +++ b/samples/network-visualiser/src/main/kotlin/net/corda/netmap/simulation/Simulation.kt @@ -1,27 +1,27 @@ package net.corda.netmap.simulation -import net.corda.core.utilities.locationOrNull import net.corda.core.flows.FlowLogic import net.corda.core.messaging.SingleMessageRecipient import net.corda.core.node.CityDatabase import net.corda.core.node.WorldMapLocation import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.containsType -import net.corda.testing.DUMMY_MAP -import net.corda.testing.DUMMY_NOTARY -import net.corda.testing.DUMMY_REGULATOR import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.getX500Name +import net.corda.core.utilities.locality import net.corda.irs.api.NodeInterestRates import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.network.NetworkMapService import net.corda.node.services.statemachine.StateMachineManager import net.corda.node.services.transactions.SimpleNotaryService +import net.corda.testing.DUMMY_MAP +import net.corda.testing.DUMMY_NOTARY +import net.corda.testing.DUMMY_REGULATOR import net.corda.testing.node.InMemoryMessagingNetwork import net.corda.testing.node.MockNetwork import net.corda.testing.node.TestClock import net.corda.testing.node.setTo import net.corda.testing.testNodeConfiguration -import org.bouncycastle.asn1.x500.X500Name import rx.Observable import rx.subjects.PublishSubject import java.math.BigInteger @@ -57,7 +57,7 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean, entropyRoot: BigInteger) : MockNetwork.MockNode(config, mockNet, networkMapAddress, advertisedServices, id, overrideServices, entropyRoot) { override fun findMyLocation(): WorldMapLocation? { - return configuration.myLegalName.locationOrNull?.let { CityDatabase[it] } + return configuration.myLegalName.locality.let { CityDatabase[it] } } } @@ -72,7 +72,7 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean, val cfg = testNodeConfiguration( baseDirectory = config.baseDirectory, - myLegalName = X500Name("CN=Bank $letter,O=Bank $letter,L=$city,C=$country")) + myLegalName = getX500Name(O = "Bank $letter", L = city, C = country)) return SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) } @@ -112,7 +112,7 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean, object RatesOracleFactory : MockNetwork.Factory { // TODO: Make a more realistic legal name - val RATES_SERVICE_NAME = X500Name("CN=Rates Service Provider,O=R3,OU=corda,L=Madrid,C=ES") + val RATES_SERVICE_NAME = getX500Name(O = "Rates Service Provider", OU = "corda", L = "Madrid", C = "ES") override fun create(config: NodeConfiguration, network: MockNetwork, networkMapAddr: SingleMessageRecipient?, advertisedServices: Set, id: Int, overrideServices: Map?, diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt index b57011a62d..d5ffa5aa65 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt @@ -1,21 +1,21 @@ package net.corda.notarydemo -import net.corda.core.internal.div -import net.corda.core.node.services.ServiceInfo -import net.corda.testing.ALICE -import net.corda.testing.BOB -import net.corda.demorun.util.* -import net.corda.demorun.runNodes -import net.corda.node.services.transactions.BFTNonValidatingNotaryService -import net.corda.node.utilities.ServiceIdentityGenerator -import net.corda.cordform.CordformDefinition import net.corda.cordform.CordformContext +import net.corda.cordform.CordformDefinition import net.corda.cordform.CordformNode +import net.corda.core.internal.div import net.corda.core.internal.stream import net.corda.core.internal.toTypedArray +import net.corda.core.node.services.ServiceInfo import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.getX500Name +import net.corda.demorun.runNodes +import net.corda.demorun.util.* +import net.corda.node.services.transactions.BFTNonValidatingNotaryService import net.corda.node.services.transactions.minCorrectReplicas -import org.bouncycastle.asn1.x500.X500Name +import net.corda.node.utilities.ServiceIdentityGenerator +import net.corda.testing.ALICE +import net.corda.testing.BOB fun main(args: Array) = BFTNotaryCordform.runNodes() @@ -23,7 +23,7 @@ private val clusterSize = 4 // Minimum size that tolerates a faulty replica. private val notaryNames = createNotaryNames(clusterSize) object BFTNotaryCordform : CordformDefinition("build" / "notary-demo-nodes", notaryNames[0]) { - private val clusterName = X500Name("CN=BFT,O=R3,OU=corda,L=Zurich,C=CH") + private val clusterName = getX500Name(O = "BFT", OU = "corda", L = "Zurich", C = "CH") private val advertisedService = ServiceInfo(BFTNonValidatingNotaryService.type, clusterName) init { diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt index 276bb07baf..4cc4878137 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt @@ -1,30 +1,27 @@ package net.corda.notarydemo -import net.corda.core.utilities.appendToCommonName +import net.corda.cordform.CordformContext +import net.corda.cordform.CordformDefinition +import net.corda.cordform.CordformNode import net.corda.core.internal.div import net.corda.core.node.services.ServiceInfo -import net.corda.testing.ALICE -import net.corda.testing.BOB -import net.corda.testing.DUMMY_NOTARY +import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.getX500Name +import net.corda.demorun.runNodes import net.corda.demorun.util.* import net.corda.node.services.transactions.RaftValidatingNotaryService import net.corda.node.utilities.ServiceIdentityGenerator -import net.corda.cordform.CordformDefinition -import net.corda.cordform.CordformContext -import net.corda.cordform.CordformNode -import net.corda.core.utilities.NetworkHostAndPort -import net.corda.demorun.runNodes -import net.corda.demorun.util.node -import org.bouncycastle.asn1.x500.X500Name +import net.corda.testing.ALICE +import net.corda.testing.BOB fun main(args: Array) = RaftNotaryCordform.runNodes() -internal fun createNotaryNames(clusterSize: Int) = (0 until clusterSize).map { DUMMY_NOTARY.name.appendToCommonName(" $it") } +internal fun createNotaryNames(clusterSize: Int) = (0 until clusterSize).map { getX500Name(CN = "Notary Service $it", O = "R3 Ltd", OU = "corda", L = "Zurich", C = "CH") } private val notaryNames = createNotaryNames(3) object RaftNotaryCordform : CordformDefinition("build" / "notary-demo-nodes", notaryNames[0]) { - private val clusterName = X500Name("CN=Raft,O=R3,OU=corda,L=Zurich,C=CH") + private val clusterName = getX500Name(O = "Raft", OU = "corda", L = "Zurich", C = "CH") private val advertisedService = ServiceInfo(RaftValidatingNotaryService.type, clusterName) init { diff --git a/samples/simm-valuation-demo/build.gradle b/samples/simm-valuation-demo/build.gradle index 7b4a941edc..16dd0242f7 100644 --- a/samples/simm-valuation-demo/build.gradle +++ b/samples/simm-valuation-demo/build.gradle @@ -63,29 +63,29 @@ dependencies { task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" - networkMap "CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH" + networkMap "O=Notary Service,OU=corda,L=Zurich,C=CH" node { - name "CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH" + name "O=Notary Service,OU=corda,L=Zurich,C=CH" advertisedServices = ["corda.notary.validating"] p2pPort 10002 cordapps = ["net.corda:finance:$corda_release_version"] } node { - name "CN=Bank A,O=Bank A,L=London,C=GB" + name "O=Bank A,L=London,C=GB" advertisedServices = [] p2pPort 10004 webPort 10005 cordapps = ["net.corda:finance:$corda_release_version"] } node { - name "CN=Bank B,O=Bank B,L=New York,C=US" + name "O=Bank B,L=New York,C=US" advertisedServices = [] p2pPort 10006 webPort 10007 cordapps = ["net.corda:finance:$corda_release_version"] } node { - name "CN=Bank C,O=Bank C,L=Tokyo,C=Japan" + name "O=Bank C,L=Tokyo,C=Japan" advertisedServices = [] p2pPort 10008 webPort 10009 diff --git a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApiUtils.kt b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApiUtils.kt index 80201333b0..f4d4ad5bdc 100644 --- a/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApiUtils.kt +++ b/samples/simm-valuation-demo/src/main/kotlin/net/corda/vega/api/PortfolioApiUtils.kt @@ -5,11 +5,11 @@ import com.opengamma.strata.product.swap.IborRateCalculation import com.opengamma.strata.product.swap.RateCalculationSwapLeg import com.opengamma.strata.product.swap.SwapLegType import net.corda.core.contracts.hash -import net.corda.core.utilities.commonName import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party -import net.corda.core.utilities.toBase58String import net.corda.core.messaging.CordaRPCOps +import net.corda.core.utilities.organisation +import net.corda.core.utilities.toBase58String import net.corda.vega.contracts.IRSState import net.corda.vega.contracts.PortfolioState import net.corda.vega.portfolio.Portfolio @@ -136,7 +136,7 @@ class PortfolioApiUtils(private val ownParty: Party) { return TradeView( fixedLeg = mapOf( - "fixedRatePayer" to (fixedRatePayer.nameOrNull()?.commonName ?: fixedRatePayer.owningKey.toBase58String()), + "fixedRatePayer" to (fixedRatePayer.nameOrNull()?.organisation ?: fixedRatePayer.owningKey.toBase58String()), "notional" to mapOf( "token" to fixedLeg.currency.code, "quantity" to fixedLeg.notionalSchedule.amount.initialValue @@ -152,7 +152,7 @@ class PortfolioApiUtils(private val ownParty: Party) { "paymentCalendar" to mapOf() // TODO ), floatingLeg = mapOf( - "floatingRatePayer" to (floatingRatePayer.nameOrNull()?.commonName ?: floatingRatePayer.owningKey.toBase58String()), + "floatingRatePayer" to (floatingRatePayer.nameOrNull()?.organisation ?: floatingRatePayer.owningKey.toBase58String()), "notional" to mapOf( "token" to floatingLeg.currency.code, "quantity" to floatingLeg.notionalSchedule.amount.initialValue diff --git a/samples/simm-valuation-demo/src/main/resources/simmvaluationweb/app/viewmodel/FixedLegViewModel.js b/samples/simm-valuation-demo/src/main/resources/simmvaluationweb/app/viewmodel/FixedLegViewModel.js index 9ac11fba23..793a319f1b 100644 --- a/samples/simm-valuation-demo/src/main/resources/simmvaluationweb/app/viewmodel/FixedLegViewModel.js +++ b/samples/simm-valuation-demo/src/main/resources/simmvaluationweb/app/viewmodel/FixedLegViewModel.js @@ -1,7 +1,7 @@ "use strict"; var FixedLegViewModel = (function () { function FixedLegViewModel() { - this.fixedRatePayer = "CN=Bank A,O=Bank A,L=London,C=GB"; + this.fixedRatePayer = "O=Bank A,L=London,C=GB"; this.notional = { quantity: 2500000000 }; diff --git a/samples/simm-valuation-demo/src/main/web/src/app/viewmodel/FixedLegViewModel.ts b/samples/simm-valuation-demo/src/main/web/src/app/viewmodel/FixedLegViewModel.ts index c088492179..7f02629e3c 100644 --- a/samples/simm-valuation-demo/src/main/web/src/app/viewmodel/FixedLegViewModel.ts +++ b/samples/simm-valuation-demo/src/main/web/src/app/viewmodel/FixedLegViewModel.ts @@ -1,7 +1,7 @@ export class FixedLegViewModel { constructor() { } - fixedRatePayer = "CN=Bank A,O=Bank A,L=London,C=GB"; + fixedRatePayer = "O=Bank A,L=London,C=GB"; notional: Object = { quantity: 2500000000 }; diff --git a/samples/trader-demo/build.gradle b/samples/trader-demo/build.gradle index 36d77c5797..36928a8807 100644 --- a/samples/trader-demo/build.gradle +++ b/samples/trader-demo/build.gradle @@ -51,15 +51,15 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" // This name "Notary" is hard-coded into TraderDemoClientApi so if you change it here, change it there too. // In this demo the node that runs a standalone notary also acts as the network map server. - networkMap "CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH" + networkMap "O=Notary Service,OU=corda,L=Zurich,C=CH" node { - name "CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH" + name "O=Notary Service,OU=corda,L=Zurich,C=CH" advertisedServices = ["corda.notary.validating"] p2pPort 10002 cordapps = ["net.corda:finance:$corda_release_version"] } node { - name "CN=Bank A,O=Bank A,L=London,C=GB" + name "O=Bank A,L=London,C=GB" advertisedServices = [] p2pPort 10005 rpcPort 10006 @@ -67,7 +67,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { rpcUsers = ext.rpcUsers } node { - name "CN=Bank B,O=Bank B,L=New York,C=US" + name "O=Bank B,L=New York,C=US" advertisedServices = [] p2pPort 10008 rpcPort 10009 @@ -75,7 +75,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { rpcUsers = ext.rpcUsers } node { - name "CN=BankOfCorda,O=R3,L=New York,C=US" + name "O=BankOfCorda,L=New York,C=US" advertisedServices = [] p2pPort 10011 rpcPort 10012 diff --git a/testing/node-driver/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt b/testing/node-driver/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt index daca04c3c7..0aa4bec5e4 100644 --- a/testing/node-driver/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt +++ b/testing/node-driver/src/integration-test/kotlin/net/corda/testing/FlowStackSnapshotTest.kt @@ -34,7 +34,7 @@ fun convertToStackSnapshotFrames(snapshot: FlowStackSnapshot): List, startInSameProcess: Boolean? ): CordaFuture>> { - val nodeNames = (0 until clusterSize).map { DUMMY_NOTARY.name.appendToCommonName(" $it") } + val nodeNames = (0 until clusterSize).map { getX500Name(O = "Notary Service $it", OU = "corda", L = "Zurich", C = "CH") } val paths = nodeNames.map { baseDirectory(it) } ServiceIdentityGenerator.generateToDisk(paths, type.id, notaryName) val advertisedServices = setOf(ServiceInfo(type, notaryName)) @@ -772,7 +769,7 @@ class DriverDSL( } } - override fun baseDirectory(nodeName: X500Name): Path = driverDirectory / nodeName.commonName.replace(WHITESPACE, "") + override fun baseDirectory(nodeName: X500Name): Path = driverDirectory / nodeName.organisation.replace(WHITESPACE, "") override fun startDedicatedNetworkMapService(startInProcess: Boolean?): CordaFuture { val webAddress = portAllocation.nextHostAndPort() @@ -859,13 +856,13 @@ class DriverDSL( config: Config ): CordaFuture> { return executorService.fork { - log.info("Starting in-process Node ${nodeConf.myLegalName.commonName}") + log.info("Starting in-process Node ${nodeConf.myLegalName.organisation}") // Write node.conf writeConfig(nodeConf.baseDirectory, "node.conf", config) // TODO pass the version in? val node = Node(nodeConf, nodeConf.calculateServices(), MOCK_VERSION_INFO, initialiseSerialization = false) node.start() - val nodeThread = thread(name = nodeConf.myLegalName.commonName) { + val nodeThread = thread(name = nodeConf.myLegalName.organisation) { node.run() } node to nodeThread @@ -882,7 +879,7 @@ class DriverDSL( callerPackage: String ): CordaFuture { val processFuture = executorService.fork { - log.info("Starting out-of-process Node ${nodeConf.myLegalName.commonName}") + log.info("Starting out-of-process Node ${nodeConf.myLegalName.organisation}") // Write node.conf writeConfig(nodeConf.baseDirectory, "node.conf", config) diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt index 8568adddbc..886043b644 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/InMemoryMessagingNetwork.kt @@ -3,7 +3,7 @@ package net.corda.testing.node import com.google.common.util.concurrent.Futures import com.google.common.util.concurrent.ListenableFuture import com.google.common.util.concurrent.SettableFuture -import net.corda.core.utilities.getX509Name +import net.corda.core.utilities.getX500Name import net.corda.core.internal.ThreadBox import net.corda.core.messaging.AllPossibleRecipients import net.corda.core.messaging.MessageRecipientGroup @@ -127,7 +127,7 @@ class InMemoryMessagingNetwork( id: Int, executor: AffinityExecutor, advertisedServices: List, - description: X500Name = getX509Name("In memory node $id", "London", "demo@r3.com", null), + description: X500Name = getX500Name(O = "In memory node $id", L = "London", C = "UK"), database: CordaPersistence) : MessagingServiceBuilder { val peerHandle = PeerHandle(id, description) diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt index 75cdade8e0..45ac7ae63b 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNetworkMapCache.kt @@ -7,10 +7,10 @@ import net.corda.core.node.NodeInfo import net.corda.core.node.services.NetworkMapCache import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.NonEmptySet +import net.corda.core.utilities.getX500Name import net.corda.node.services.api.ServiceHubInternal import net.corda.node.services.network.PersistentNetworkMapCache import net.corda.testing.getTestPartyAndCertificate -import net.corda.testing.getTestX509Name import rx.Observable import rx.subjects.PublishSubject import java.math.BigInteger @@ -20,8 +20,8 @@ import java.math.BigInteger */ class MockNetworkMapCache(serviceHub: ServiceHubInternal) : PersistentNetworkMapCache(serviceHub) { private companion object { - val BANK_C = getTestPartyAndCertificate(getTestX509Name("Bank C"), entropyToKeyPair(BigInteger.valueOf(1000)).public) - val BANK_D = getTestPartyAndCertificate(getTestX509Name("Bank D"), entropyToKeyPair(BigInteger.valueOf(2000)).public) + val BANK_C = getTestPartyAndCertificate(getX500Name(O = "Bank C", L = "London", C = "GB"), entropyToKeyPair(BigInteger.valueOf(1000)).public) + val BANK_D = getTestPartyAndCertificate(getX500Name(O = "Bank D", L = "London", C = "GB"), entropyToKeyPair(BigInteger.valueOf(2000)).public) val BANK_C_ADDR = NetworkHostAndPort("bankC", 8080) val BANK_D_ADDR = NetworkHostAndPort("bankD", 8080) } diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt index 935455c67d..d747d090cb 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt @@ -152,7 +152,7 @@ class MockNetwork(private val networkSendManuallyPumped: Boolean = false, id, serverThread, makeServiceEntries(), - configuration.myLegalName, + myLegalName, database) .start() .getOrThrow() @@ -303,7 +303,7 @@ class MockNetwork(private val networkSendManuallyPumped: Boolean = false, val id = forcedID ?: nextNodeId++ val config = testNodeConfiguration( baseDirectory = baseDirectory(id).createDirectories(), - myLegalName = legalName ?: getTestX509Name("Mock Company $id")).also { + myLegalName = legalName ?: getX500Name(O = "Mock Company $id", L = "London", C = "GB")).also { whenever(it.dataSourceProperties).thenReturn(makeTestDataSourceProperties("node_${id}_net_$networkId")) configOverrides(it) } diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt index b33113e03f..2d5366a17f 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/NodeBasedTest.kt @@ -130,7 +130,7 @@ abstract class NodeBasedTest : TestDependencyInjectionBase() { clusterSize: Int, serviceType: ServiceType = RaftValidatingNotaryService.type): CordaFuture> { ServiceIdentityGenerator.generateToDisk( - (0 until clusterSize).map { baseDirectory(notaryName.appendToCommonName("-$it")) }, + (0 until clusterSize).map { baseDirectory(getX500Name(O = "${notaryName.organisation}-$it", L = notaryName.locality, C = notaryName.country)) }, serviceType.id, notaryName) @@ -138,19 +138,19 @@ abstract class NodeBasedTest : TestDependencyInjectionBase() { val nodeAddresses = getFreeLocalPorts("localhost", clusterSize).map { it.toString() } val masterNodeFuture = startNode( - getX509Name("${notaryName.commonName}-0", "London", "demo@r3.com", null), + getX500Name(O = "${notaryName.organisation}-0", L = notaryName.locality, C = notaryName.country), advertisedServices = setOf(serviceInfo), configOverrides = mapOf("notaryNodeAddress" to nodeAddresses[0], - "database" to mapOf("serverNameTablePrefix" to if (clusterSize > 1) "${notaryName.commonName}0".replace(Regex("[^0-9A-Za-z]+"),"") else ""))) + "database" to mapOf("serverNameTablePrefix" to if (clusterSize > 1) "${notaryName.organisation}0".replace(Regex("[^0-9A-Za-z]+"), "") else ""))) val remainingNodesFutures = (1 until clusterSize).map { startNode( - getX509Name("${notaryName.commonName}-$it", "London", "demo@r3.com", null), + getX500Name(O = "${notaryName.organisation}-$it", L = notaryName.locality, C = notaryName.country), advertisedServices = setOf(serviceInfo), configOverrides = mapOf( "notaryNodeAddress" to nodeAddresses[it], "notaryClusterAddresses" to listOf(nodeAddresses[0]), - "database" to mapOf("serverNameTablePrefix" to "${notaryName.commonName}$it".replace(Regex("[^0-9A-Za-z]+"), "")))) + "database" to mapOf("serverNameTablePrefix" to "${notaryName.organisation}$it".replace(Regex("[^0-9A-Za-z]+"), "")))) } return remainingNodesFutures.transpose().flatMap { remainingNodes -> @@ -158,7 +158,7 @@ abstract class NodeBasedTest : TestDependencyInjectionBase() { } } - protected fun baseDirectory(legalName: X500Name) = tempFolder.root.toPath() / legalName.commonName.replace(WHITESPACE, "") + protected fun baseDirectory(legalName: X500Name) = tempFolder.root.toPath() / legalName.organisation.replace(WHITESPACE, "") private fun startNodeInternal(legalName: X500Name, platformVersion: Int, @@ -187,7 +187,7 @@ abstract class NodeBasedTest : TestDependencyInjectionBase() { initialiseSerialization = false) node.start() nodes += node - thread(name = legalName.commonName) { + thread(name = legalName.organisation) { node.run() } return node diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/SimpleNode.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/SimpleNode.kt index cc0ab2c972..34d0372409 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/SimpleNode.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/SimpleNode.kt @@ -1,13 +1,13 @@ package net.corda.testing.node import com.codahale.metrics.MetricRegistry -import net.corda.core.utilities.commonName import net.corda.core.crypto.generateKeyPair import net.corda.core.internal.concurrent.openFuture import net.corda.core.messaging.RPCOps import net.corda.core.node.services.IdentityService import net.corda.core.node.services.KeyManagementService import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.organisation import net.corda.node.services.RPCUserServiceImpl import net.corda.node.services.api.MonitoringService import net.corda.node.services.config.NodeConfiguration @@ -21,10 +21,10 @@ import net.corda.node.utilities.AffinityExecutor.ServiceAffinityExecutor import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.configureDatabase import net.corda.testing.freeLocalHostAndPort +import net.corda.testing.node.MockServices.Companion.MOCK_VERSION_INFO import java.security.KeyPair import java.security.cert.X509Certificate import kotlin.concurrent.thread -import net.corda.testing.node.MockServices.Companion.MOCK_VERSION_INFO /** * This is a bare-bones node which can only send and receive messages. It doesn't register with a network map service or @@ -40,7 +40,7 @@ class SimpleNode(val config: NodeConfiguration, val address: NetworkHostAndPort val identityService: IdentityService = InMemoryIdentityService(trustRoot = trustRoot) val database: CordaPersistence = configureDatabase(config.dataSourceProperties, config.database, { NodeSchemaService() }, { InMemoryIdentityService(trustRoot = trustRoot) }) val keyService: KeyManagementService = E2ETestKeyManagementService(identityService, setOf(identity)) - val executor = ServiceAffinityExecutor(config.myLegalName.commonName, 1) + val executor = ServiceAffinityExecutor(config.myLegalName.organisation, 1) // TODO: We should have a dummy service hub rather than change behaviour in tests val broker = ArtemisMessagingServer(config, address.port, rpcAddress.port, MockNetworkMapCache(serviceHub = object : MockServiceHubInternal(database = database, configuration = config) {}), userService) @@ -64,7 +64,7 @@ class SimpleNode(val config: NodeConfiguration, val address: NetworkHostAndPort override val protocolVersion = 0 }, userService) - thread(name = config.myLegalName.commonName) { + thread(name = config.myLegalName.organisation) { network.run(broker.serverControl) } } diff --git a/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt index a5de6c5344..71ad5805ba 100644 --- a/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt +++ b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt @@ -5,7 +5,7 @@ import com.typesafe.config.ConfigFactory.empty import com.typesafe.config.ConfigRenderOptions import com.typesafe.config.ConfigValue import com.typesafe.config.ConfigValueFactory -import net.corda.core.utilities.commonName +import net.corda.core.utilities.organisation import net.corda.nodeapi.User import org.bouncycastle.asn1.x500.X500Name @@ -22,7 +22,7 @@ class NodeConfig( val renderOptions: ConfigRenderOptions = ConfigRenderOptions.defaults().setOriginComments(false) } - val commonName: String get() = legalName.commonName + val commonName: String get() = legalName.organisation /* * The configuration object depends upon the networkMap, diff --git a/testing/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt index 73a406d3cf..88987a562e 100644 --- a/testing/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt +++ b/testing/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt @@ -4,14 +4,12 @@ package net.corda.testing import net.corda.core.contracts.StateRef -import net.corda.core.crypto.* +import net.corda.core.crypto.SecureHash +import net.corda.core.crypto.generateKeyPair import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate import net.corda.core.node.services.IdentityService import net.corda.core.utilities.* -import net.corda.core.utilities.NetworkHostAndPort -import net.corda.core.utilities.OpaqueBytes -import net.corda.core.utilities.loggerFor import net.corda.finance.contracts.asset.DUMMY_CASH_ISSUER import net.corda.node.services.config.configureDevKeyAndTrustStores import net.corda.node.services.identity.InMemoryIdentityService @@ -20,8 +18,6 @@ import net.corda.node.utilities.X509Utilities import net.corda.nodeapi.config.SSLConfiguration import net.corda.nodeapi.internal.serialization.AMQP_ENABLED import org.bouncycastle.asn1.x500.X500Name -import org.bouncycastle.asn1.x500.X500NameBuilder -import org.bouncycastle.asn1.x500.style.BCStyle import java.nio.file.Files import java.security.KeyPair import java.security.PublicKey @@ -62,20 +58,20 @@ val ALICE_PUBKEY: PublicKey get() = ALICE_KEY.public val BOB_PUBKEY: PublicKey get() = BOB_KEY.public val CHARLIE_PUBKEY: PublicKey get() = CHARLIE_KEY.public -val MEGA_CORP_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(getX509Name("MegaCorp", "London", "demo@r3.com", null), MEGA_CORP_PUBKEY) +val MEGA_CORP_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(getX500Name(O = "MegaCorp", L = "London", C = "GB"), MEGA_CORP_PUBKEY) val MEGA_CORP: Party get() = MEGA_CORP_IDENTITY.party -val MINI_CORP_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(getX509Name("MiniCorp", "London", "demo@r3.com", null), MINI_CORP_PUBKEY) +val MINI_CORP_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(getX500Name(O = "MiniCorp", L = "London", C = "GB"), MINI_CORP_PUBKEY) val MINI_CORP: Party get() = MINI_CORP_IDENTITY.party val BOC_KEY: KeyPair by lazy { generateKeyPair() } val BOC_PUBKEY: PublicKey get() = BOC_KEY.public -val BOC_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(getTestX509Name("BankOfCorda"), BOC_PUBKEY) +val BOC_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(getX500Name(O = "BankOfCorda", L = "London", C = "GB"), BOC_PUBKEY) val BOC: Party get() = BOC_IDENTITY.party val BOC_PARTY_REF = BOC.ref(OpaqueBytes.of(1)).reference val BIG_CORP_KEY: KeyPair by lazy { generateKeyPair() } val BIG_CORP_PUBKEY: PublicKey get() = BIG_CORP_KEY.public -val BIG_CORP_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(getX509Name("BigCorporation", "London", "demo@r3.com", null), BIG_CORP_PUBKEY) +val BIG_CORP_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(getX500Name(O = "BigCorporation", L = "London", C = "GB"), BIG_CORP_PUBKEY) val BIG_CORP: Party get() = BIG_CORP_IDENTITY.party val BIG_CORP_PARTY_REF = BIG_CORP.ref(OpaqueBytes.of(1)).reference @@ -129,21 +125,6 @@ fun configureTestSSL(legalName: X500Name = MEGA_CORP.name): SSLConfiguration = o } } - -/** - * Return a bogus X.509 for testing purposes. - */ -fun getTestX509Name(commonName: String): X500Name { - require(!commonName.startsWith("CN=")) - // TODO: Consider if we want to make these more variable, i.e. different locations? - val nameBuilder = X500NameBuilder(BCStyle.INSTANCE) - nameBuilder.addRDN(BCStyle.CN, commonName) - nameBuilder.addRDN(BCStyle.O, "R3") - nameBuilder.addRDN(BCStyle.L, "New York") - nameBuilder.addRDN(BCStyle.C, "US") - return nameBuilder.build() -} - fun getTestPartyAndCertificate(party: Party, trustRoot: CertificateAndKeyPair = DUMMY_CA): PartyAndCertificate { val certFactory = CertificateFactory.getInstance("X509") val certHolder = X509Utilities.createCertificate(CertificateType.IDENTITY, trustRoot.certificate, trustRoot.keyPair, party.name, party.owningKey) diff --git a/testing/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt index 9cfca24f74..ba76178760 100644 --- a/testing/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt +++ b/testing/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt @@ -4,13 +4,13 @@ package net.corda.testing import net.corda.core.contracts.Command import net.corda.core.contracts.TypeOnlyCommandData -import net.corda.core.utilities.CertificateAndKeyPair import net.corda.core.crypto.entropyToKeyPair import net.corda.core.crypto.generateKeyPair import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate +import net.corda.core.utilities.CertificateAndKeyPair +import net.corda.core.utilities.getX500Name import net.corda.node.utilities.X509Utilities -import org.bouncycastle.asn1.x500.X500Name import java.math.BigInteger import java.security.KeyPair import java.security.PublicKey @@ -25,47 +25,47 @@ val DUMMY_KEY_2: KeyPair by lazy { generateKeyPair() } val DUMMY_NOTARY_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(20)) } /** Dummy notary identity for tests and simulations */ val DUMMY_NOTARY_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(DUMMY_NOTARY) -val DUMMY_NOTARY: Party get() = Party(X500Name("CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH"), DUMMY_NOTARY_KEY.public) +val DUMMY_NOTARY: Party get() = Party(getX500Name(O = "Notary Service", OU = "corda", L = "Zurich", C = "CH"), DUMMY_NOTARY_KEY.public) val DUMMY_MAP_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(30)) } /** Dummy network map service identity for tests and simulations */ -val DUMMY_MAP: Party get() = Party(X500Name("CN=Network Map Service,O=R3,OU=corda,L=Amsterdam,C=NL"), DUMMY_MAP_KEY.public) +val DUMMY_MAP: Party get() = Party(getX500Name(O = "Network Map Service", OU = "corda", L = "Amsterdam", C = "NL"), DUMMY_MAP_KEY.public) val DUMMY_BANK_A_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(40)) } /** Dummy bank identity for tests and simulations */ -val DUMMY_BANK_A: Party get() = Party(X500Name("CN=Bank A,O=Bank A,L=London,C=GB"), DUMMY_BANK_A_KEY.public) +val DUMMY_BANK_A: Party get() = Party(getX500Name(O = "Bank A", L = "London", C = "GB"), DUMMY_BANK_A_KEY.public) val DUMMY_BANK_B_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(50)) } /** Dummy bank identity for tests and simulations */ -val DUMMY_BANK_B: Party get() = Party(X500Name("CN=Bank B,O=Bank B,L=New York,C=US"), DUMMY_BANK_B_KEY.public) +val DUMMY_BANK_B: Party get() = Party(getX500Name(O = "Bank B", L = "New York", C = "US"), DUMMY_BANK_B_KEY.public) val DUMMY_BANK_C_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(60)) } /** Dummy bank identity for tests and simulations */ -val DUMMY_BANK_C: Party get() = Party(X500Name("CN=Bank C,O=Bank C,L=Tokyo,C=JP"), DUMMY_BANK_C_KEY.public) +val DUMMY_BANK_C: Party get() = Party(getX500Name(O = "Bank C", L = "Tokyo", C = "JP"), DUMMY_BANK_C_KEY.public) val ALICE_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(70)) } /** Dummy individual identity for tests and simulations */ val ALICE_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(ALICE) -val ALICE: Party get() = Party(X500Name("CN=Alice Corp,O=Alice Corp,L=Madrid,C=ES"), ALICE_KEY.public) +val ALICE: Party get() = Party(getX500Name(O = "Alice Corp", L = "Madrid", C = "ES"), ALICE_KEY.public) val BOB_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(80)) } /** Dummy individual identity for tests and simulations */ val BOB_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(BOB) -val BOB: Party get() = Party(X500Name("CN=Bob Plc,O=Bob Plc,L=Rome,C=IT"), BOB_KEY.public) +val BOB: Party get() = Party(getX500Name(O = "Bob Plc", L = "Rome", C = "IT"), BOB_KEY.public) val CHARLIE_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(90)) } /** Dummy individual identity for tests and simulations */ val CHARLIE_IDENTITY: PartyAndCertificate get() = getTestPartyAndCertificate(CHARLIE) -val CHARLIE: Party get() = Party(X500Name("CN=Charlie Ltd,O=Charlie Ltd,L=Athens,C=GR"), CHARLIE_KEY.public) +val CHARLIE: Party get() = Party(getX500Name(O = "Charlie Ltd", L = "Athens", C = "GR"), CHARLIE_KEY.public) val DUMMY_REGULATOR_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(100)) } /** Dummy regulator for tests and simulations */ -val DUMMY_REGULATOR: Party get() = Party(X500Name("CN=Regulator A,OU=Corda,O=AMF,L=Paris,C=FR"), DUMMY_REGULATOR_KEY.public) +val DUMMY_REGULATOR: Party get() = Party(getX500Name(O = "Regulator A", OU = "Corda", L = "Paris", C = "FR"), DUMMY_REGULATOR_KEY.public) val DUMMY_CA_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(110)) } val DUMMY_CA: CertificateAndKeyPair by lazy { // TODO: Should be identity scheme - val cert = X509Utilities.createSelfSignedCACertificate(X500Name("CN=Dummy CA,OU=Corda,O=R3 Ltd,L=London,C=GB"), DUMMY_CA_KEY) + val cert = X509Utilities.createSelfSignedCACertificate(getX500Name(CN = "Dummy CA", OU = "Corda", O = "R3 Ltd", L = "London", C = "GB"), DUMMY_CA_KEY) CertificateAndKeyPair(cert, DUMMY_CA_KEY) } @@ -74,4 +74,4 @@ fun dummyCommand(vararg signers: PublicKey = arrayOf(generateKeyPair().public) ) object DummyCommandData : TypeOnlyCommandData() val DUMMY_IDENTITY_1: PartyAndCertificate get() = getTestPartyAndCertificate(DUMMY_PARTY) -val DUMMY_PARTY: Party get() = Party(X500Name("CN=Dummy,O=Dummy,L=Madrid,C=ES"), DUMMY_KEY_1.public) +val DUMMY_PARTY: Party get() = Party(getX500Name(O = "Dummy", L = "Madrid", C = "ES"), DUMMY_KEY_1.public) diff --git a/testing/test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt index 12ac044952..c14b750e0c 100644 --- a/testing/test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt +++ b/testing/test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt @@ -1,13 +1,13 @@ package net.corda.testing.messaging import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.getX500Name import net.corda.nodeapi.ArtemisMessagingComponent import net.corda.nodeapi.ArtemisTcpTransport import net.corda.nodeapi.ConnectionDirection import net.corda.nodeapi.config.SSLConfiguration import net.corda.testing.configureTestSSL import org.apache.activemq.artemis.api.core.client.* -import org.bouncycastle.asn1.x500.X500Name /** * As the name suggests this is a simple client for connecting to MQ brokers. @@ -15,7 +15,7 @@ import org.bouncycastle.asn1.x500.X500Name class SimpleMQClient(val target: NetworkHostAndPort, override val config: SSLConfiguration? = configureTestSSL(DEFAULT_MQ_LEGAL_NAME)) : ArtemisMessagingComponent() { companion object { - val DEFAULT_MQ_LEGAL_NAME = X500Name("CN=SimpleMQClient,O=R3,OU=corda,L=London,C=GB") + val DEFAULT_MQ_LEGAL_NAME = getX500Name(O = "SimpleMQClient", OU = "corda", L = "London", C = "GB") } lateinit var sessionFactory: ClientSessionFactory lateinit var session: ClientSession diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NetworkMapConfig.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NetworkMapConfig.kt index 9967f034aa..4aaccb3558 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NetworkMapConfig.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NetworkMapConfig.kt @@ -1,13 +1,11 @@ package net.corda.demobench.model -import net.corda.core.utilities.commonName +import net.corda.core.utilities.organisation import net.corda.core.utilities.WHITESPACE import org.bouncycastle.asn1.x500.X500Name open class NetworkMapConfig(val legalName: X500Name, val p2pPort: Int) { - - val key: String = legalName.commonName.toKey() - + val key: String = legalName.organisation.toKey() } fun String.stripWhitespace() = replace(WHITESPACE, "") diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt index ea109a68b3..275ce76a45 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeConfig.kt @@ -1,7 +1,7 @@ package net.corda.demobench.model import com.typesafe.config.* -import net.corda.core.utilities.locationOrNull +import net.corda.core.utilities.locality import net.corda.nodeapi.User import org.bouncycastle.asn1.x500.X500Name import java.io.File @@ -26,7 +26,7 @@ class NodeConfig( val defaultUser = user("guest") } - val nearestCity: String = legalName.locationOrNull ?: "Unknown location" + val nearestCity: String = legalName.locality val nodeDir: Path = baseDir.resolve(key) override val pluginDir: Path = nodeDir.resolve("plugins") val explorerDir: Path = baseDir.resolve("$key-explorer") diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt index a9fdd71bc5..8fdb371618 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/model/NodeController.kt @@ -2,7 +2,7 @@ package net.corda.demobench.model import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.ServiceType -import net.corda.core.utilities.getX509Name +import net.corda.core.utilities.getX500Name import net.corda.demobench.plugin.PluginController import net.corda.demobench.pty.R3Pty import tornadofx.* @@ -54,11 +54,10 @@ class NodeController(check: atRuntime = ::checkExists) : Controller() { val location = nodeData.nearestCity.value val config = NodeConfig( baseDir, - getX509Name( - myLegalName = nodeData.legalName.value.trim(), - email = "corda@city.${location.countryCode.toLowerCase()}.example", - nearestCity = location.description, - country = location.countryCode + getX500Name( + O = nodeData.legalName.value.trim(), + L = location.description, + C = location.countryCode ), nodeData.p2pPort.value, nodeData.rpcPort.value, diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt index 913ab862fe..869adc5735 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/pty/R3Pty.kt @@ -4,8 +4,8 @@ import com.jediterm.terminal.ui.JediTermWidget import com.jediterm.terminal.ui.UIUtil import com.jediterm.terminal.ui.settings.SettingsProvider import com.pty4j.PtyProcess -import net.corda.core.utilities.commonName import net.corda.core.utilities.loggerFor +import net.corda.core.utilities.organisation import org.bouncycastle.asn1.x500.X500Name import java.awt.Dimension import java.io.IOException @@ -34,7 +34,7 @@ class R3Pty(val name: X500Name, settings: SettingsProvider, dimension: Dimension val process = PtyProcess.exec(command, environment, workingDir) try { - return PtyProcessTtyConnector(name.commonName, process, UTF_8) + return PtyProcessTtyConnector(name.organisation, process, UTF_8) } catch (e: Exception) { process.destroyForcibly() process.waitFor(30, SECONDS) diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt index f70ccd11f7..3597b530e2 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTabView.kt @@ -20,8 +20,8 @@ import net.corda.core.internal.readAllLines import net.corda.core.internal.writeLines import net.corda.core.node.CityDatabase import net.corda.core.node.WorldMapLocation -import net.corda.core.utilities.commonName import net.corda.core.utilities.normaliseLegalName +import net.corda.core.utilities.organisation import net.corda.core.utilities.validateLegalName import net.corda.demobench.model.* import net.corda.demobench.ui.CloseableTab @@ -267,7 +267,7 @@ class NodeTabView : Fragment() { if (countryCode != null) { nodeTab.graphic = ImageView(flags.get()[countryCode]).apply { fitWidth = 24.0; isPreserveRatio = true } } - nodeTab.text = config.legalName.commonName + nodeTab.text = config.legalName.organisation nodeTerminalView.open(config) { exitCode -> Platform.runLater { if (exitCode == 0) { diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt index b67b4b55d0..e5a8bff1fd 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/views/NodeTerminalView.kt @@ -15,7 +15,7 @@ import javafx.scene.layout.VBox import javafx.util.Duration import net.corda.core.concurrent.match import net.corda.core.contracts.ContractState -import net.corda.core.utilities.commonName +import net.corda.core.utilities.organisation import net.corda.core.messaging.CordaRPCOps import net.corda.core.messaging.vaultTrackBy import net.corda.core.node.services.vault.PageSpecification @@ -71,7 +71,7 @@ class NodeTerminalView : Fragment() { private lateinit var swingTerminal: SwingNode fun open(config: NodeConfig, onExit: (Int) -> Unit) { - nodeName.text = config.legalName.commonName + nodeName.text = config.legalName.organisation swingTerminal = SwingNode() swingTerminal.setOnMouseClicked { diff --git a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NetworkMapConfigTest.kt b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NetworkMapConfigTest.kt index 62ad3d41a6..324d09aa9c 100644 --- a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NetworkMapConfigTest.kt +++ b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NetworkMapConfigTest.kt @@ -8,7 +8,7 @@ class NetworkMapConfigTest { @Test fun keyValue() { - val config = NetworkMapConfig(X500Name("CN=My\tNasty Little\rLabel\n"), 10000) + val config = NetworkMapConfig(X500Name("O=My\tNasty Little\rLabel\n"), 10000) assertEquals("mynastylittlelabel", config.key) } diff --git a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt index e73cbef9c7..db2b61410c 100644 --- a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt +++ b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt @@ -7,11 +7,12 @@ import com.typesafe.config.ConfigFactory import com.typesafe.config.ConfigValueFactory import net.corda.core.internal.div import net.corda.core.utilities.NetworkHostAndPort -import net.corda.testing.DUMMY_NOTARY +import net.corda.core.utilities.getX500Name import net.corda.node.internal.NetworkMapInfo import net.corda.node.services.config.FullNodeConfiguration import net.corda.nodeapi.User import net.corda.nodeapi.config.parseAs +import net.corda.testing.DUMMY_NOTARY import net.corda.webserver.WebServerConfig import org.bouncycastle.asn1.x500.X500Name import org.junit.Test @@ -28,7 +29,7 @@ class NodeConfigTest { companion object { private val baseDir: Path = Paths.get(".").toAbsolutePath() - private val myLegalName = X500Name("CN=My Name,OU=Corda QA Department,O=R3 CEV,L=New York,C=US") + private val myLegalName = getX500Name(OU = "Corda QA Department", O = "My Name", L = "New York", C = "US") } @Test @@ -145,7 +146,7 @@ class NodeConfigTest { + "\"detectPublicIp\":false," + "\"extraAdvertisedServiceIds\":[\"my.service\"]," + "\"h2port\":30001," - + "\"myLegalName\":\"CN=My Name,OU=Corda QA Department,O=R3 CEV,L=New York,C=US\"," + + "\"myLegalName\":\"C=US,L=New York,O=My Name,OU=Corda QA Department\"," + "\"p2pAddress\":\"localhost:10001\"," + "\"rpcAddress\":\"localhost:40002\"," + "\"rpcUsers\":[" @@ -173,8 +174,8 @@ class NodeConfigTest { + "\"detectPublicIp\":false," + "\"extraAdvertisedServiceIds\":[\"my.service\"]," + "\"h2port\":30001," - + "\"myLegalName\":\"CN=My Name,OU=Corda QA Department,O=R3 CEV,L=New York,C=US\"," - + "\"networkMapService\":{\"address\":\"localhost:12345\",\"legalName\":\"CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH\"}," + + "\"myLegalName\":\"C=US,L=New York,O=My Name,OU=Corda QA Department\"," + + "\"networkMapService\":{\"address\":\"localhost:12345\",\"legalName\":\"C=CH,L=Zurich,O=Notary Service,OU=corda\"}," + "\"p2pAddress\":\"localhost:10001\"," + "\"rpcAddress\":\"localhost:40002\"," + "\"rpcUsers\":[" @@ -252,7 +253,7 @@ class NodeConfigTest { } private fun createConfig( - legalName: X500Name = X500Name("CN=Unknown,O=R3,OU=corda,L=Nowhere,C=GB"), + legalName: X500Name = getX500Name(O = "Unknown", OU = "corda", L = "Nowhere", C = "GB"), p2pPort: Int = -1, rpcPort: Int = -1, webPort: Int = -1, diff --git a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt index c80bf2e1ed..2aaec00fb9 100644 --- a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt +++ b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeControllerTest.kt @@ -1,6 +1,6 @@ package net.corda.demobench.model -import net.corda.core.utilities.getX509Name +import net.corda.core.utilities.getX500Name import net.corda.nodeapi.User import net.corda.testing.DUMMY_NOTARY import org.junit.Test @@ -174,11 +174,10 @@ class NodeControllerTest { users: List = listOf(user("guest")) ) = NodeConfig( baseDir, - legalName = getX509Name( - myLegalName = commonName, - nearestCity = "New York", - country = "US", - email = "corda@city.us.example" + legalName = getX500Name( + O = commonName, + L = "New York", + C = "US" ), p2pPort = p2pPort, rpcPort = rpcPort, diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/ExplorerSimulation.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/ExplorerSimulation.kt index 9983ede708..5e6646d76f 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/ExplorerSimulation.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/ExplorerSimulation.kt @@ -16,6 +16,7 @@ import net.corda.core.node.services.ServiceInfo import net.corda.core.node.services.ServiceType import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.getOrThrow +import net.corda.core.utilities.getX500Name import net.corda.finance.GBP import net.corda.finance.USD import net.corda.finance.contracts.asset.Cash @@ -34,7 +35,6 @@ import net.corda.testing.DUMMY_NOTARY import net.corda.testing.driver.NodeHandle import net.corda.testing.driver.PortAllocation import net.corda.testing.driver.driver -import org.bouncycastle.asn1.x500.X500Name import java.time.Instant import java.util.* @@ -79,8 +79,8 @@ class ExplorerSimulation(val options: OptionSet) { val bob = startNode(providedName = BOB.name, rpcUsers = arrayListOf(user), advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("cash"))), customOverrides = mapOf("nearestCity" to "Madrid")) - val ukBankName = X500Name("CN=UK Bank Plc,O=UK Bank Plc,L=London,C=GB") - val usaBankName = X500Name("CN=USA Bank Corp,O=USA Bank Corp,L=New York,C=USA") + val ukBankName = getX500Name(O = "UK Bank Plc", L = "London", C = "GB") + val usaBankName = getX500Name(O = "USA Bank Corp", L = "New York", C = "USA") val issuerGBP = startNode(providedName = ukBankName, rpcUsers = arrayListOf(manager), advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("issuer.GBP"))), customOverrides = mapOf("nearestCity" to "London")) diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/formatters/PartyNameFormatter.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/formatters/PartyNameFormatter.kt index 8cdec83233..2af31ad3ee 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/formatters/PartyNameFormatter.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/formatters/PartyNameFormatter.kt @@ -1,11 +1,11 @@ package net.corda.explorer.formatters -import net.corda.core.utilities.commonName +import net.corda.core.utilities.organisation import org.bouncycastle.asn1.x500.X500Name object PartyNameFormatter { val short = object : Formatter { - override fun format(value: X500Name) = value.commonName + override fun format(value: X500Name) = value.organisation } val full = object : Formatter { diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt index cbbc9d1d72..83d1e69f0c 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/TransactionViewer.kt @@ -22,12 +22,12 @@ import net.corda.client.jfx.utils.map import net.corda.client.jfx.utils.sequence import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash -import net.corda.core.utilities.commonName -import net.corda.core.utilities.toBase58String import net.corda.core.crypto.toStringShort import net.corda.core.identity.AbstractParty import net.corda.core.identity.Party import net.corda.core.node.NodeInfo +import net.corda.core.utilities.organisation +import net.corda.core.utilities.toBase58String import net.corda.explorer.AmountDiff import net.corda.explorer.formatters.AmountFormatter import net.corda.explorer.formatters.Formatter @@ -136,8 +136,8 @@ class TransactionViewer : CordaView("Transactions") { "Transaction ID" to { tx, s -> "${tx.id}".contains(s, true) }, "Input" to { tx, s -> tx.inputs.resolved.any { it.state.data.contract.javaClass.simpleName.contains(s, true) } }, "Output" to { tx, s -> tx.outputs.any { it.state.data.contract.javaClass.simpleName.contains(s, true) } }, - "Input Party" to { tx, s -> tx.inputParties.any { it.any { it.value?.name?.commonName?.contains(s, true) ?: false } } }, - "Output Party" to { tx, s -> tx.outputParties.any { it.any { it.value?.name?.commonName?.contains(s, true) ?: false } } }, + "Input Party" to { tx, s -> tx.inputParties.any { it.any { it.value?.name?.organisation?.contains(s, true) ?: false } } }, + "Output Party" to { tx, s -> tx.outputParties.any { it.any { it.value?.name?.organisation?.contains(s, true) ?: false } } }, "Command Type" to { tx, s -> tx.commandTypes.any { it.simpleName.contains(s, true) } } ) root.top = searchField.root diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt index 86ab57bc53..ab5bdfb82a 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/cordapps/cash/CashViewer.kt @@ -23,7 +23,7 @@ import net.corda.core.contracts.Amount import net.corda.core.contracts.StateAndRef import net.corda.core.contracts.withoutIssuer import net.corda.core.identity.AbstractParty -import net.corda.core.utilities.commonName +import net.corda.core.utilities.organisation import net.corda.explorer.formatters.AmountFormatter import net.corda.explorer.formatters.PartyNameFormatter import net.corda.explorer.identicon.identicon @@ -148,7 +148,7 @@ class CashViewer : CordaView("Cash") { */ val searchField = SearchField(cashStates, "Currency" to { state, text -> state.state.data.amount.token.product.toString().contains(text, true) }, - "Issuer" to { state, text -> state.resolveIssuer().value?.name?.commonName?.contains(text, true) ?: false } + "Issuer" to { state, text -> state.resolveIssuer().value?.name?.organisation?.contains(text, true) ?: false } ) root.top = hbox(5.0) { button("New Transaction", FontAwesomeIconView(FontAwesomeIcon.PLUS)) { diff --git a/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt b/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt index ff4dc2d99f..21f576a7c3 100644 --- a/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt +++ b/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt @@ -11,8 +11,8 @@ import net.corda.core.identity.Party import net.corda.core.internal.AbstractAttachment import net.corda.core.transactions.LedgerTransaction import net.corda.core.transactions.WireTransaction +import net.corda.core.utilities.getX500Name import net.corda.testing.contracts.DummyContract -import net.corda.testing.getTestX509Name import java.math.BigInteger import java.security.PublicKey import java.util.* @@ -209,7 +209,7 @@ fun commandGenerator(partiesToPickFrom: Collection): Generator = Generator.int().combine(publicKeyGenerator) { n, key -> - Party(getTestX509Name("Party$n"), key) + Party(getX500Name(O = "Party$n", L = "London", C = "GB"), key) } fun pickOneOrMaybeNew(from: Collection, generator: Generator): Generator { diff --git a/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierDriver.kt b/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierDriver.kt index 6a53ab73cf..d9aa442501 100644 --- a/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierDriver.kt +++ b/verifier/src/integration-test/kotlin/net/corda/verifier/VerifierDriver.kt @@ -3,13 +3,14 @@ package net.corda.verifier import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import net.corda.core.concurrent.CordaFuture -import net.corda.core.utilities.commonName import net.corda.core.crypto.random63BitValue import net.corda.core.internal.concurrent.* import net.corda.core.internal.div import net.corda.core.transactions.LedgerTransaction import net.corda.core.utilities.NetworkHostAndPort +import net.corda.core.utilities.getX500Name import net.corda.core.utilities.loggerFor +import net.corda.core.utilities.organisation import net.corda.node.services.config.configureDevKeyAndTrustStores import net.corda.nodeapi.ArtemisMessagingComponent.Companion.NODE_USER import net.corda.nodeapi.ArtemisTcpTransport @@ -18,7 +19,6 @@ import net.corda.nodeapi.VerifierApi import net.corda.nodeapi.config.NodeSSLConfiguration import net.corda.nodeapi.config.SSLConfiguration import net.corda.testing.driver.* -import net.corda.testing.getTestX509Name import org.apache.activemq.artemis.api.core.SimpleString import org.apache.activemq.artemis.api.core.client.ActiveMQClient import org.apache.activemq.artemis.api.core.client.ClientProducer @@ -181,7 +181,7 @@ data class VerifierDriverDSL( } private fun startVerificationRequestorInternal(name: X500Name, hostAndPort: NetworkHostAndPort): VerificationRequestorHandle { - val baseDir = driverDSL.driverDirectory / name.commonName + val baseDir = driverDSL.driverDirectory / name.organisation val sslConfig = object : NodeSSLConfiguration { override val baseDirectory = baseDir override val keyStorePassword: String get() = "cordacadevpass" @@ -249,8 +249,8 @@ data class VerifierDriverDSL( val id = verifierCount.andIncrement val jdwpPort = if (driverDSL.isDebug) driverDSL.debugPortAllocation.nextPort() else null val processFuture = driverDSL.executorService.fork { - val verifierName = getTestX509Name("verifier$id") - val baseDirectory = driverDSL.driverDirectory / verifierName.commonName + val verifierName = getX500Name(O = "Verifier$id", L = "London", C = "GB") + val baseDirectory = driverDSL.driverDirectory / verifierName.organisation val config = createConfiguration(baseDirectory, address) val configFilename = "verifier.conf" writeConfig(baseDirectory, configFilename, config) From 879b1a639353d323cc37b6078f7d1ccd5d0f3441 Mon Sep 17 00:00:00 2001 From: Andrzej Cichocki Date: Thu, 7 Sep 2017 15:00:03 +0100 Subject: [PATCH 117/120] Tutorial runExampleClientRPC is now runExampleClientRPCKotlin. (#1446) --- docs/source/tutorial-cordapp.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/tutorial-cordapp.rst b/docs/source/tutorial-cordapp.rst index ad788338c8..9b1b965941 100644 --- a/docs/source/tutorial-cordapp.rst +++ b/docs/source/tutorial-cordapp.rst @@ -531,7 +531,7 @@ Green Arrow to run the client. You can edit the run configuration to connect on Run the following gradle task: -``./gradlew runExampleClientRPC localhost:10007`` +``./gradlew runExampleClientRPCKotlin localhost:10007`` You can close the application using ``ctrl+C``. From 6bf28718192aabd611c90a9382ee8522c6b90da5 Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Thu, 7 Sep 2017 17:05:39 +0100 Subject: [PATCH 118/120] Change descriptor name from string to symbol on the wire to adhere to section 1.5 of the AMQP 1.0 spec (#1423) --- .../serialization/AMQPSerializationScheme.kt | 2 +- .../amqp/AMQPPrimitiveSerializer.kt | 3 ++- .../serialization/amqp/AMQPSerializer.kt | 3 ++- .../serialization/amqp/ArraySerializer.kt | 5 +++-- .../serialization/amqp/CollectionSerializer.kt | 5 +++-- .../serialization/amqp/CustomSerializer.kt | 7 ++++--- .../serialization/amqp/EnumSerializer.kt | 7 ++++--- .../serialization/amqp/MapSerializer.kt | 5 +++-- .../serialization/amqp/ObjectSerializer.kt | 5 +++-- .../internal/serialization/amqp/Schema.kt | 10 ++++++---- .../serialization/amqp/SerializerFactory.kt | 4 ---- .../serialization/amqp/SingletonSerializer.kt | 6 ++++-- .../serialization/amqp/EvolvabilityTests.kt | 3 +-- .../amqp/EvolvabilityTests.addAdditionalParam | Bin 378 -> 261 bytes ...vabilityTests.addAdditionalParamNotMandatory | Bin 273 -> 273 bytes .../EvolvabilityTests.addAndRemoveParameters | Bin 390 -> 390 bytes ...ityTests.addMandatoryFieldWithAltConstructor | Bin 285 -> 285 bytes ...dMandatoryFieldWithAltConstructorUnAnnotated | Bin 296 -> 296 bytes ...addMandatoryFieldWithAltReorderedConstructor | Bin 387 -> 387 bytes ...ryFieldWithAltReorderedConstructorAndRemoval | Bin 403 -> 403 bytes .../amqp/EvolvabilityTests.changeSubType | Bin 616 -> 616 bytes .../amqp/EvolvabilityTests.multiVersion.1 | Bin 294 -> 294 bytes .../amqp/EvolvabilityTests.multiVersion.2 | Bin 327 -> 327 bytes .../amqp/EvolvabilityTests.multiVersion.3 | Bin 372 -> 372 bytes .../EvolvabilityTests.multiVersionWithRemoval.1 | Bin 338 -> 338 bytes .../EvolvabilityTests.multiVersionWithRemoval.2 | Bin 392 -> 392 bytes .../EvolvabilityTests.multiVersionWithRemoval.3 | Bin 425 -> 425 bytes .../amqp/EvolvabilityTests.removeParameters | Bin 378 -> 378 bytes ...olvabilityTests.simpleOrderSwapDifferentType | Bin 311 -> 311 bytes .../EvolvabilityTests.simpleOrderSwapSameType | Bin 302 -> 302 bytes 30 files changed, 36 insertions(+), 29 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt index 21566a0b88..bc0b5e1ee0 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AMQPSerializationScheme.kt @@ -27,7 +27,7 @@ fun SerializerFactory.addToWhitelist(vararg types: Class<*>) { abstract class AbstractAMQPSerializationScheme : SerializationScheme { internal companion object { private val pluginRegistries: List by lazy { - ServiceLoader.load(CordaPluginRegistry::class.java, this.javaClass.classLoader).toList() + ServiceLoader.load(CordaPluginRegistry::class.java, this::class.java.classLoader).toList() } fun registerCustomSerializers(factory: SerializerFactory) { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPPrimitiveSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPPrimitiveSerializer.kt index 11f91005ed..02a4379fc8 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPPrimitiveSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPPrimitiveSerializer.kt @@ -1,6 +1,7 @@ package net.corda.nodeapi.internal.serialization.amqp import org.apache.qpid.proton.amqp.Binary +import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type @@ -10,7 +11,7 @@ import java.lang.reflect.Type * [ByteArray] is automatically marshalled to/from the Proton-J wrapper, [Binary]. */ class AMQPPrimitiveSerializer(clazz: Class<*>) : AMQPSerializer { - override val typeDescriptor: String = SerializerFactory.primitiveTypeName(clazz)!! + override val typeDescriptor = Symbol.valueOf(SerializerFactory.primitiveTypeName(clazz)!!) override val type: Type = clazz // NOOP since this is a primitive type. diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializer.kt index 85cdc24e11..707cefa44f 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializer.kt @@ -1,5 +1,6 @@ package net.corda.nodeapi.internal.serialization.amqp +import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type @@ -18,7 +19,7 @@ interface AMQPSerializer { * * This should be unique enough that we can use one global cache of [AMQPSerializer]s and use this as the look up key. */ - val typeDescriptor: String + val typeDescriptor: Symbol /** * Add anything required to the AMQP schema via [SerializationOutput.writeTypeNotations] and any dependent serializers diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ArraySerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ArraySerializer.kt index f1595d70d6..e49eafaa96 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ArraySerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ArraySerializer.kt @@ -1,5 +1,6 @@ package net.corda.nodeapi.internal.serialization.amqp +import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException import java.lang.reflect.Type @@ -31,12 +32,12 @@ open class ArraySerializer(override val type: Type, factory: SerializerFactory) "${type.componentType().typeName}$arrayType" } - override val typeDescriptor by lazy { "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" } + override val typeDescriptor by lazy { Symbol.valueOf("$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}") } internal val elementType: Type by lazy { type.componentType() } internal open val typeName by lazy { calcTypeName(type) } internal val typeNotation: TypeNotation by lazy { - RestrictedType(typeName, null, emptyList(), "list", Descriptor(typeDescriptor, null), emptyList()) + RestrictedType(typeName, null, emptyList(), "list", Descriptor(typeDescriptor), emptyList()) } override fun writeClassInfo(output: SerializationOutput) { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt index 737c9e7ee2..667b75e818 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt @@ -1,6 +1,7 @@ package net.corda.nodeapi.internal.serialization.amqp import net.corda.core.utilities.NonEmptySet +import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException import java.lang.reflect.ParameterizedType @@ -15,7 +16,7 @@ import kotlin.collections.Set */ class CollectionSerializer(val declaredType: ParameterizedType, factory: SerializerFactory) : AMQPSerializer { override val type: Type = declaredType as? DeserializedParameterizedType ?: DeserializedParameterizedType.make(SerializerFactory.nameForType(declaredType)) - override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" + override val typeDescriptor = Symbol.valueOf("$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}") companion object { // NB: Order matters in this map, the most specific classes should be listed at the end @@ -58,7 +59,7 @@ class CollectionSerializer(val declaredType: ParameterizedType, factory: Seriali private val concreteBuilder: (List<*>) -> Collection<*> = findConcreteType(declaredType.rawType as Class<*>) - private val typeNotation: TypeNotation = RestrictedType(SerializerFactory.nameForType(declaredType), null, emptyList(), "list", Descriptor(typeDescriptor, null), emptyList()) + private val typeNotation: TypeNotation = RestrictedType(SerializerFactory.nameForType(declaredType), null, emptyList(), "list", Descriptor(typeDescriptor), emptyList()) override fun writeClassInfo(output: SerializationOutput) { if (output.writeTypeNotations(typeNotation)) { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt index f9a98cf109..fdb5896444 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt @@ -1,6 +1,7 @@ package net.corda.nodeapi.internal.serialization.amqp import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.nameForType +import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type @@ -49,8 +50,8 @@ abstract class CustomSerializer : AMQPSerializer { override fun isSerializerFor(clazz: Class<*>): Boolean = clazz == this.clazz override val type: Type get() = clazz - override val typeDescriptor: String = "$DESCRIPTOR_DOMAIN:${fingerprintForDescriptors(superClassSerializer.typeDescriptor, nameForType(clazz))}" - private val typeNotation: TypeNotation = RestrictedType(SerializerFactory.nameForType(clazz), null, emptyList(), SerializerFactory.nameForType(superClassSerializer.type), Descriptor(typeDescriptor, null), emptyList()) + override val typeDescriptor = Symbol.valueOf("$DESCRIPTOR_DOMAIN:${fingerprintForDescriptors(superClassSerializer.typeDescriptor.toString(), nameForType(clazz))}") + private val typeNotation: TypeNotation = RestrictedType(SerializerFactory.nameForType(clazz), null, emptyList(), SerializerFactory.nameForType(superClassSerializer.type), Descriptor(typeDescriptor), emptyList()) override fun writeClassInfo(output: SerializationOutput) { output.writeTypeNotations(typeNotation) } @@ -72,7 +73,7 @@ abstract class CustomSerializer : AMQPSerializer { */ abstract class CustomSerializerImp(protected val clazz: Class, protected val withInheritance: Boolean) : CustomSerializer() { override val type: Type get() = clazz - override val typeDescriptor: String = "$DESCRIPTOR_DOMAIN:${nameForType(clazz)}" + override val typeDescriptor = Symbol.valueOf("$DESCRIPTOR_DOMAIN:${nameForType(clazz)}") override fun writeClassInfo(output: SerializationOutput) {} override val descriptor: Descriptor = Descriptor(typeDescriptor) override fun isSerializerFor(clazz: Class<*>): Boolean = if (withInheritance) this.clazz.isAssignableFrom(clazz) else this.clazz == clazz diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt index 294a0c3cf0..a11c547a90 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt @@ -1,8 +1,9 @@ package net.corda.nodeapi.internal.serialization.amqp +import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data -import java.lang.reflect.Type import java.io.NotSerializableException +import java.lang.reflect.Type /** * Our definition of an enum with the AMQP spec is a list (of two items, a string and an int) that is @@ -10,13 +11,13 @@ import java.io.NotSerializableException */ class EnumSerializer(declaredType: Type, declaredClass: Class<*>, factory: SerializerFactory) : AMQPSerializer { override val type: Type = declaredType - override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" + override val typeDescriptor = Symbol.valueOf("$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}") private val typeNotation: TypeNotation init { typeNotation = RestrictedType( SerializerFactory.nameForType(declaredType), - null, emptyList(), "list", Descriptor(typeDescriptor, null), + null, emptyList(), "list", Descriptor(typeDescriptor), declaredClass.enumConstants.zip(IntRange(0, declaredClass.enumConstants.size)).map { Choice(it.first.toString(), it.second.toString()) }) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt index 6bb802593f..ba033241aa 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt @@ -1,5 +1,6 @@ package net.corda.nodeapi.internal.serialization.amqp +import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException import java.lang.reflect.ParameterizedType @@ -17,7 +18,7 @@ private typealias MapCreationFunction = (Map<*, *>) -> Map<*, *> */ class MapSerializer(private val declaredType: ParameterizedType, factory: SerializerFactory) : AMQPSerializer { override val type: Type = declaredType as? DeserializedParameterizedType ?: DeserializedParameterizedType.make(SerializerFactory.nameForType(declaredType)) - override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" + override val typeDescriptor = Symbol.valueOf("$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}") companion object { // NB: Order matters in this map, the most specific classes should be listed at the end @@ -60,7 +61,7 @@ class MapSerializer(private val declaredType: ParameterizedType, factory: Serial private val concreteBuilder: MapCreationFunction = findConcreteType(declaredType.rawType as Class<*>) - private val typeNotation: TypeNotation = RestrictedType(SerializerFactory.nameForType(declaredType), null, emptyList(), "map", Descriptor(typeDescriptor, null), emptyList()) + private val typeNotation: TypeNotation = RestrictedType(SerializerFactory.nameForType(declaredType), null, emptyList(), "map", Descriptor(typeDescriptor), emptyList()) override fun writeClassInfo(output: SerializationOutput) { if (output.writeTypeNotations(typeNotation)) { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt index da04f8fbd0..488150a14b 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt @@ -3,6 +3,7 @@ package net.corda.nodeapi.internal.serialization.amqp import net.corda.core.utilities.debug import net.corda.core.utilities.loggerFor import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.nameForType +import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException import java.lang.reflect.Type @@ -24,10 +25,10 @@ open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPS private val typeName = nameForType(clazz) - override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" + override val typeDescriptor = Symbol.valueOf("$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}") private val interfaces = interfacesForSerialization(clazz, factory) // We restrict to only those annotated or whitelisted - open internal val typeNotation : TypeNotation by lazy {CompositeType(typeName, null, generateProvides(), Descriptor(typeDescriptor, null), generateFields()) } + open internal val typeNotation: TypeNotation by lazy { CompositeType(typeName, null, generateProvides(), Descriptor(typeDescriptor), generateFields()) } override fun writeClassInfo(output: SerializationOutput) { if (output.writeTypeNotations(typeNotation)) { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt index 2dfe80015a..2e27fbfd9a 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt @@ -2,10 +2,11 @@ package net.corda.nodeapi.internal.serialization.amqp import com.google.common.hash.Hasher import com.google.common.hash.Hashing -import net.corda.core.utilities.toBase64 import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.loggerFor +import net.corda.core.utilities.toBase64 import org.apache.qpid.proton.amqp.DescribedType +import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.amqp.UnsignedInteger import org.apache.qpid.proton.amqp.UnsignedLong import org.apache.qpid.proton.codec.Data @@ -13,7 +14,6 @@ import org.apache.qpid.proton.codec.DescribedTypeConstructor import java.io.NotSerializableException import java.lang.reflect.* import java.util.* - import net.corda.nodeapi.internal.serialization.carpenter.Field as CarpenterField import net.corda.nodeapi.internal.serialization.carpenter.Schema as CarpenterSchema @@ -106,7 +106,9 @@ data class Schema(val types: List) : DescribedType { override fun toString(): String = types.joinToString("\n") } -data class Descriptor(val name: String?, val code: UnsignedLong? = null) : DescribedType { +data class Descriptor(val name: Symbol?, val code: UnsignedLong? = null) : DescribedType { + constructor(name: String?) : this(Symbol.valueOf(name)) + companion object : DescribedTypeConstructor { val DESCRIPTOR = DescriptorRegistry.OBJECT_DESCRIPTOR.amqpDescriptor @@ -122,7 +124,7 @@ data class Descriptor(val name: String?, val code: UnsignedLong? = null) : Descr override fun newInstance(described: Any?): Descriptor { val list = described as? List<*> ?: throw IllegalStateException("Was expecting a list") - return Descriptor(list[0] as? String, list[1] as? UnsignedLong) + return Descriptor(list[0] as? Symbol, list[1] as? UnsignedLong) } } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt index b184255a53..c05587b4c7 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt @@ -18,16 +18,12 @@ data class schemaAndDescriptor(val schema: Schema, val typeDescriptor: Any) /** * Factory of serializers designed to be shared across threads and invocations. */ -// TODO: object references - need better fingerprinting? -// TODO: class references? (e.g. cheat with repeated descriptors using a long encoding, like object ref proposal) -// TODO: Inner classes etc. Should we allow? Currently not considered. // TODO: support for intern-ing of deserialized objects for some core types (e.g. PublicKey) for memory efficiency // TODO: maybe support for caching of serialized form of some core types for performance // TODO: profile for performance in general // TODO: use guava caches etc so not unbounded // TODO: do we need to support a transient annotation to exclude certain properties? // TODO: allow definition of well known types that are left out of the schema. -// TODO: found a document that states textual descriptors are Symbols. Adjust schema class appropriately. // TODO: document and alert to the fact that classes cannot default superclass/interface properties otherwise they are "erased" due to matching with constructor. // TODO: type name prefixes for interfaces and abstract classes? Or use label? // TODO: generic types should define restricted type alias with source of the wildcarded version, I think, if we're to generate classes from schema diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SingletonSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SingletonSerializer.kt index dfc587a1dd..e38914cd4d 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SingletonSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SingletonSerializer.kt @@ -1,5 +1,6 @@ package net.corda.nodeapi.internal.serialization.amqp +import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type @@ -9,12 +10,13 @@ import java.lang.reflect.Type * want converting back to that singleton instance on the receiving JVM. */ class SingletonSerializer(override val type: Class<*>, val singleton: Any, factory: SerializerFactory) : AMQPSerializer { - override val typeDescriptor = "$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}" + override val typeDescriptor = Symbol.valueOf("$DESCRIPTOR_DOMAIN:${fingerprintForType(type, factory)}") + private val interfaces = interfacesForSerialization(type, factory) private fun generateProvides(): List = interfaces.map { it.typeName } - internal val typeNotation: TypeNotation = RestrictedType(type.typeName, "Singleton", generateProvides(), "boolean", Descriptor(typeDescriptor, null), emptyList()) + internal val typeNotation: TypeNotation = RestrictedType(type.typeName, "Singleton", generateProvides(), "boolean", Descriptor(typeDescriptor), emptyList()) override fun writeClassInfo(output: SerializationOutput) { output.writeTypeNotations(typeNotation) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.kt index fd8e6b3058..0bf23ae85d 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.kt @@ -1,8 +1,7 @@ package net.corda.nodeapi.internal.serialization.amqp -import net.corda.core.serialization.SerializedBytes import net.corda.core.serialization.DeprecatedConstructorForDeserialization - +import net.corda.core.serialization.SerializedBytes import org.junit.Test import java.io.File import java.io.NotSerializableException diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addAdditionalParam b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addAdditionalParam index 375f8642c2fb1d74ebd43a3b89a005d437f410a0..06c32d9eff45607d1bf17103d69f1d624f52ba21 100644 GIT binary patch literal 261 zcmYe!FG@*dWME)u0Ahv%w-^`?d}Lx+tdy5pqL&Pkvq}#0^D%M?_b@N@D=)1yE_F+D zGfgeGwLQSh7{UnG#&lp8!}3R3VeF!0TM^P5Vl8Ym&;-4}76gnkf0E8j=NUI{d;8YX5p)7x^X9`3~Y&^_P7 zF3Y;dm+gG+#z{$SY+j{J%}ybfNl-e8!zoaaLmSn9q~`xN|4$QohK85ahXfQD&Q z92$NA!=+%*c6(Ozvgu*N8*bi8)J9Jfwz9`HC}`2|>B(x97vVUu`TkyusQ_?YyI2$4N6;bU;qFB diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addAdditionalParamNotMandatory b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addAdditionalParamNotMandatory index eb7fdfc16027814f91e7fe0b98a257cc510e7033..4b5eb1dda9e5102ca2d1c003d6b016ffdb7b7986 100644 GIT binary patch delta 19 YcmbQpG?8h77~|rJ=aeT}O$O1<07XRymjD0& delta 19 YcmbQpG?8h77~{f;=aeT}O$O1<07WGSlK=n! diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addAndRemoveParameters b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addAndRemoveParameters index 5a45bb3e39222c25220a2563f184b454b3f86f72..d31d1b26fd817758619c2fd0badc95b7e642a680 100644 GIT binary patch delta 16 WcmZo;ZeyMx!?<{&?0F#Zb|wHWwFa92 delta 16 WcmZo;ZeyMx!?Zf2e!!?<{&>`M@#JXwn|5&%W227mwn delta 20 ZcmZo>Zf2e!!?`M@#JXwn|5&%Vj27CYj diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructorAndRemoval b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructorAndRemoval index 32d79fc258072e40d9aca39cf53ed1c7c3dcf0bd..769ea67e2d69fd636d0493e3a9fa5ff08f793b3b 100644 GIT binary patch delta 20 ZcmbQtJehfd4CCU7vOhtD@?e07_*CxBvhE delta 19 Ycmcb_bctz#4CBIyvO7V9^2A>e07^dxv;Y7A diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersionWithRemoval.2 b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersionWithRemoval.2 index f0eac50a93090d3c1bdf7135dfbe4a302243a581..bc41d9c9d081f6255e69f094d7c5803ce10de1c9 100644 GIT binary patch delta 19 YcmeBR?qHrE!?<|jN9BnQ8$k4Q07pj%N&o-= delta 19 YcmeBR?qHrE!?4CCU7vNu44@?=TI2>?o{2H^kz delta 20 ZcmZ34CBIyvNu44@?=TI2>?od2HgMv diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.removeParameters b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.removeParameters index 375f8642c2fb1d74ebd43a3b89a005d437f410a0..c0d7333de59fc3aa587c52122c5380ed9fadee83 100644 GIT binary patch delta 19 Ycmeyx^owbN4CCU750xi6ECA6n0agzP{r~^~ delta 19 Ycmeyx^owbN4CBIy50xi6ECA6n0afn^`Tzg` diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.simpleOrderSwapDifferentType b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.simpleOrderSwapDifferentType index 4b6bf6a7b8ec01744c9a816f95bc907064b034d8..2e6a7098f682d45036947aa23143678a6ab348b2 100644 GIT binary patch delta 19 Ycmdnaw4G^!4CCU7vO7V9^2A@Z07iZXX8-^I delta 19 Ycmdnaw4G^!4CBIyvO7V9^2A@Z07h5`V*mgE diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.simpleOrderSwapSameType b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.simpleOrderSwapSameType index b3852fe5ff6c0adbb00453c45f8610144bc94fa2..6e04f4bdf329090688724dc39dab89427dbdae27 100644 GIT binary patch delta 19 YcmZ3-w2oBo_5c6? delta 19 YcmZ3-w2o Date: Fri, 8 Sep 2017 08:16:38 +0100 Subject: [PATCH 119/120] Introduce current context concept for serialization in preparation for WireTransaction changes (#1448) --- .../core/serialization/SerializationAPI.kt | 80 ++++++++++++++++--- .../core/transactions/MerkleTransaction.kt | 6 +- .../nodeapi/internal/serialization/Kryo.kt | 8 +- .../serialization/SerializationScheme.kt | 32 +++++++- .../nodeapi/AttachmentClassLoaderTests.kt | 37 ++++++--- .../serialization/CordaClassResolverTests.kt | 2 +- .../corda/testing/SerializationTestHelpers.kt | 7 +- 7 files changed, 138 insertions(+), 34 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/serialization/SerializationAPI.kt b/core/src/main/kotlin/net/corda/core/serialization/SerializationAPI.kt index b9f2094394..9440851fdd 100644 --- a/core/src/main/kotlin/net/corda/core/serialization/SerializationAPI.kt +++ b/core/src/main/kotlin/net/corda/core/serialization/SerializationAPI.kt @@ -3,8 +3,6 @@ package net.corda.core.serialization import net.corda.core.crypto.SecureHash import net.corda.core.crypto.sha256 import net.corda.core.internal.WriteOnceProperty -import net.corda.core.serialization.SerializationDefaults.P2P_CONTEXT -import net.corda.core.serialization.SerializationDefaults.SERIALIZATION_FACTORY import net.corda.core.utilities.ByteSequence import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.sequence @@ -13,7 +11,7 @@ import net.corda.core.utilities.sequence * An abstraction for serializing and deserializing objects, with support for versioning of the wire format via * a header / prefix in the bytes. */ -interface SerializationFactory { +abstract class SerializationFactory { /** * Deserialize the bytes in to an object, using the prefixed bytes to determine the format. * @@ -21,7 +19,7 @@ interface SerializationFactory { * @param clazz The class or superclass or the object to be deserialized, or [Any] or [Object] if unknown. * @param context A context that configures various parameters to deserialization. */ - fun deserialize(byteSequence: ByteSequence, clazz: Class, context: SerializationContext): T + abstract fun deserialize(byteSequence: ByteSequence, clazz: Class, context: SerializationContext): T /** * Serialize an object to bytes using the preferred serialization format version from the context. @@ -29,7 +27,63 @@ interface SerializationFactory { * @param obj The object to be serialized. * @param context A context that configures various parameters to serialization, including the serialization format version. */ - fun serialize(obj: T, context: SerializationContext): SerializedBytes + abstract fun serialize(obj: T, context: SerializationContext): SerializedBytes + + /** + * If there is a need to nest serialization/deserialization with a modified context during serialization or deserialization, + * this will return the current context used to start serialization/deserialization. + */ + val currentContext: SerializationContext? get() = _currentContext.get() + + /** + * A context to use as a default if you do not require a specially configured context. It will be the current context + * if the use is somehow nested (see [currentContext]). + */ + val defaultContext: SerializationContext get() = currentContext ?: SerializationDefaults.P2P_CONTEXT + + private val _currentContext = ThreadLocal() + + /** + * Change the current context inside the block to that supplied. + */ + fun withCurrentContext(context: SerializationContext?, block: () -> T): T { + val priorContext = _currentContext.get() + if (context != null) _currentContext.set(context) + try { + return block() + } finally { + if (context != null) _currentContext.set(priorContext) + } + } + + /** + * Allow subclasses to temporarily mark themselves as the current factory for the current thread during serialization/deserialization. + * Will restore the prior context on exiting the block. + */ + protected fun asCurrent(block: SerializationFactory.() -> T): T { + val priorContext = _currentFactory.get() + _currentFactory.set(this) + try { + return block() + } finally { + _currentFactory.set(priorContext) + } + } + + companion object { + private val _currentFactory = ThreadLocal() + + /** + * A default factory for serialization/deserialization, taking into account the [currentFactory] if set. + */ + val defaultFactory: SerializationFactory get() = currentFactory ?: SerializationDefaults.SERIALIZATION_FACTORY + + /** + * If there is a need to nest serialization/deserialization with a modified context during serialization or deserialization, + * this will return the current factory used to start serialization/deserialization. + */ + val currentFactory: SerializationFactory? get() = _currentFactory.get() + } } /** @@ -76,6 +130,12 @@ interface SerializationContext { */ fun withClassLoader(classLoader: ClassLoader): SerializationContext + /** + * Helper method to return a new context based on this context with the appropriate class loader constructed from the passed attachment identifiers. + * (Requires the attachment storage to have been enabled). + */ + fun withAttachmentsClassLoader(attachmentHashes: List): SerializationContext + /** * Helper method to return a new context based on this context with the given class specifically whitelisted. */ @@ -107,26 +167,26 @@ object SerializationDefaults { /** * Convenience extension method for deserializing a ByteSequence, utilising the defaults. */ -inline fun ByteSequence.deserialize(serializationFactory: SerializationFactory = SERIALIZATION_FACTORY, context: SerializationContext = P2P_CONTEXT): T { +inline fun ByteSequence.deserialize(serializationFactory: SerializationFactory = SerializationFactory.defaultFactory, context: SerializationContext = serializationFactory.defaultContext): T { return serializationFactory.deserialize(this, T::class.java, context) } /** * Convenience extension method for deserializing SerializedBytes with type matching, utilising the defaults. */ -inline fun SerializedBytes.deserialize(serializationFactory: SerializationFactory = SERIALIZATION_FACTORY, context: SerializationContext = P2P_CONTEXT): T { +inline fun SerializedBytes.deserialize(serializationFactory: SerializationFactory = SerializationFactory.defaultFactory, context: SerializationContext = serializationFactory.defaultContext): T { return serializationFactory.deserialize(this, T::class.java, context) } /** * Convenience extension method for deserializing a ByteArray, utilising the defaults. */ -inline fun ByteArray.deserialize(serializationFactory: SerializationFactory = SERIALIZATION_FACTORY, context: SerializationContext = P2P_CONTEXT): T = this.sequence().deserialize(serializationFactory, context) +inline fun ByteArray.deserialize(serializationFactory: SerializationFactory = SerializationFactory.defaultFactory, context: SerializationContext = serializationFactory.defaultContext): T = this.sequence().deserialize(serializationFactory, context) /** * Convenience extension method for serializing an object of type T, utilising the defaults. */ -fun T.serialize(serializationFactory: SerializationFactory = SERIALIZATION_FACTORY, context: SerializationContext = P2P_CONTEXT): SerializedBytes { +fun T.serialize(serializationFactory: SerializationFactory = SerializationFactory.defaultFactory, context: SerializationContext = serializationFactory.defaultContext): SerializedBytes { return serializationFactory.serialize(this, context) } @@ -142,4 +202,4 @@ class SerializedBytes(bytes: ByteArray) : OpaqueBytes(bytes) { interface ClassWhitelist { fun hasListed(type: Class<*>): Boolean -} \ No newline at end of file +} diff --git a/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt index 3675b20dc8..b23800baec 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt @@ -4,7 +4,7 @@ import net.corda.core.contracts.* import net.corda.core.crypto.* import net.corda.core.identity.Party import net.corda.core.serialization.CordaSerializable -import net.corda.core.serialization.SerializationDefaults.P2P_CONTEXT +import net.corda.core.serialization.SerializationFactory import net.corda.core.serialization.serialize import java.nio.ByteBuffer import java.util.function.Predicate @@ -22,12 +22,12 @@ fun serializedHash(x: T, privacySalt: PrivacySalt?, index: Int): Secur fun serializedHash(x: T, nonce: SecureHash): SecureHash { return if (x !is PrivacySalt) // PrivacySalt is not required to have an accompanied nonce. - (x.serialize(context = P2P_CONTEXT.withoutReferences()).bytes + nonce.bytes).sha256() + (x.serialize(context = SerializationFactory.defaultFactory.defaultContext.withoutReferences()).bytes + nonce.bytes).sha256() else serializedHash(x) } -fun serializedHash(x: T): SecureHash = x.serialize(context = P2P_CONTEXT.withoutReferences()).bytes.sha256() +fun serializedHash(x: T): SecureHash = x.serialize(context = SerializationFactory.defaultFactory.defaultContext.withoutReferences()).bytes.sha256() /** The nonce is computed as Hash(privacySalt || index). */ fun computeNonce(privacySalt: PrivacySalt, index: Int) = (privacySalt.bytes + ByteBuffer.allocate(4).putInt(index).array()).sha256() diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/Kryo.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/Kryo.kt index 562c321053..47d793fb6e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/Kryo.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/Kryo.kt @@ -8,12 +8,11 @@ import com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer import com.esotericsoftware.kryo.serializers.FieldSerializer import com.esotericsoftware.kryo.util.MapReferenceResolver import net.corda.core.contracts.* +import net.corda.core.crypto.CompositeKey import net.corda.core.crypto.Crypto import net.corda.core.crypto.SecureHash import net.corda.core.crypto.TransactionSignature -import net.corda.core.crypto.CompositeKey import net.corda.core.identity.Party -import net.corda.core.internal.VisibleForTesting import net.corda.core.serialization.AttachmentsClassLoader import net.corda.core.serialization.MissingAttachmentsException import net.corda.core.serialization.SerializeAsTokenContext @@ -241,9 +240,6 @@ fun Input.readBytesWithLength(): ByteArray { /** A serialisation engine that knows how to deserialise code inside a sandbox */ @ThreadSafe object WireTransactionSerializer : Serializer() { - @VisibleForTesting - internal val attachmentsClassLoaderEnabled = "attachments.class.loader.enabled" - override fun write(kryo: Kryo, output: Output, obj: WireTransaction) { kryo.writeClassAndObject(output, obj.inputs) kryo.writeClassAndObject(output, obj.attachments) @@ -255,7 +251,7 @@ object WireTransactionSerializer : Serializer() { } private fun attachmentsClassLoader(kryo: Kryo, attachmentHashes: List): ClassLoader? { - kryo.context[attachmentsClassLoaderEnabled] as? Boolean ?: false || return null + kryo.context[attachmentsClassLoaderEnabledPropertyName] as? Boolean ?: false || return null val serializationContext = kryo.serializationContext() ?: return null // Some tests don't set one. val missing = ArrayList() val attachments = ArrayList() diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt index f08f66e9fb..9cdd9c49e5 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt @@ -8,6 +8,10 @@ import com.esotericsoftware.kryo.Serializer import com.esotericsoftware.kryo.io.Input import com.esotericsoftware.kryo.io.Output import com.esotericsoftware.kryo.pool.KryoPool +import com.google.common.cache.Cache +import com.google.common.cache.CacheBuilder +import net.corda.core.contracts.Attachment +import net.corda.core.crypto.SecureHash import net.corda.core.internal.LazyPool import net.corda.core.serialization.* import net.corda.core.utilities.ByteSequence @@ -17,6 +21,8 @@ import java.io.NotSerializableException import java.util.* import java.util.concurrent.ConcurrentHashMap +val attachmentsClassLoaderEnabledPropertyName = "attachments.class.loader.enabled" + object NotSupportedSeralizationScheme : SerializationScheme { private fun doThrow(): Nothing = throw UnsupportedOperationException("Serialization scheme not supported.") @@ -33,6 +39,24 @@ data class SerializationContextImpl(override val preferredSerializationVersion: override val properties: Map, override val objectReferencesEnabled: Boolean, override val useCase: SerializationContext.UseCase) : SerializationContext { + + private val cache: Cache, AttachmentsClassLoader> = CacheBuilder.newBuilder().weakValues().maximumSize(1024).build() + + // We need to cache the AttachmentClassLoaders to avoid too many contexts, since the class loader is part of cache key for the context. + override fun withAttachmentsClassLoader(attachmentHashes: List): SerializationContext { + properties[attachmentsClassLoaderEnabledPropertyName] as? Boolean ?: false || return this + val serializationContext = properties[serializationContextKey] as? SerializeAsTokenContextImpl ?: return this // Some tests don't set one. + return withClassLoader(cache.get(attachmentHashes) { + val missing = ArrayList() + val attachments = ArrayList() + attachmentHashes.forEach { id -> + serializationContext.serviceHub.attachments.openAttachment(id)?.let { attachments += it } ?: run { missing += id } + } + missing.isNotEmpty() && throw MissingAttachmentsException(missing) + AttachmentsClassLoader(attachments) + }) + } + override fun withProperty(property: Any, value: Any): SerializationContext { return copy(properties = properties + (property to value)) } @@ -56,7 +80,7 @@ data class SerializationContextImpl(override val preferredSerializationVersion: private const val HEADER_SIZE: Int = 8 -open class SerializationFactoryImpl : SerializationFactory { +open class SerializationFactoryImpl : SerializationFactory() { private val creator: List = Exception().stackTrace.asList() private val registeredSchemes: MutableCollection = Collections.synchronizedCollection(mutableListOf()) @@ -75,10 +99,12 @@ open class SerializationFactoryImpl : SerializationFactory { } @Throws(NotSerializableException::class) - override fun deserialize(byteSequence: ByteSequence, clazz: Class, context: SerializationContext): T = schemeFor(byteSequence, context.useCase).deserialize(byteSequence, clazz, context) + override fun deserialize(byteSequence: ByteSequence, clazz: Class, context: SerializationContext): T { + return asCurrent { withCurrentContext(context) { schemeFor(byteSequence, context.useCase).deserialize(byteSequence, clazz, context) } } + } override fun serialize(obj: T, context: SerializationContext): SerializedBytes { - return schemeFor(context.preferredSerializationVersion, context.useCase).serialize(obj, context) + return asCurrent { withCurrentContext(context) { schemeFor(context.preferredSerializationVersion, context.useCase).serialize(obj, context) } } } fun registerScheme(scheme: SerializationScheme) { diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt index e566f957dc..a81287b26f 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/AttachmentClassLoaderTests.kt @@ -10,13 +10,13 @@ import net.corda.core.internal.declaredField import net.corda.core.node.ServiceHub import net.corda.core.node.services.AttachmentStorage import net.corda.core.serialization.* -import net.corda.core.serialization.SerializationDefaults.P2P_CONTEXT +import net.corda.core.serialization.SerializationFactory import net.corda.core.transactions.LedgerTransaction import net.corda.core.transactions.TransactionBuilder import net.corda.core.utilities.ByteSequence import net.corda.core.utilities.OpaqueBytes import net.corda.nodeapi.internal.serialization.SerializeAsTokenContextImpl -import net.corda.nodeapi.internal.serialization.WireTransactionSerializer +import net.corda.nodeapi.internal.serialization.attachmentsClassLoaderEnabledPropertyName import net.corda.nodeapi.internal.serialization.withTokenContext import net.corda.testing.DUMMY_NOTARY import net.corda.testing.MEGA_CORP @@ -51,7 +51,7 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { private fun SerializationContext.withAttachmentStorage(attachmentStorage: AttachmentStorage): SerializationContext { val serviceHub = mock() whenever(serviceHub.attachments).thenReturn(attachmentStorage) - return this.withTokenContext(SerializeAsTokenContextImpl(serviceHub) {}).withProperty(WireTransactionSerializer.attachmentsClassLoaderEnabled, true) + return this.withTokenContext(SerializeAsTokenContextImpl(serviceHub) {}).withProperty(attachmentsClassLoaderEnabledPropertyName, true) } } @@ -223,7 +223,7 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { val cl = AttachmentsClassLoader(arrayOf(att0, att1, att2).map { storage.openAttachment(it)!! }, FilteringClassLoader) - val context = P2P_CONTEXT.withClassLoader(cl).withWhitelisted(contract.javaClass) + val context = SerializationFactory.defaultFactory.defaultContext.withClassLoader(cl).withWhitelisted(contract.javaClass) val state2 = bytes.deserialize(context = context) assertTrue(state2.javaClass.classLoader is AttachmentsClassLoader) assertNotNull(state2) @@ -239,7 +239,7 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { assertNotNull(data.contract) - val context2 = P2P_CONTEXT.withWhitelisted(data.contract.javaClass) + val context2 = SerializationFactory.defaultFactory.defaultContext.withWhitelisted(data.contract.javaClass) val bytes = data.serialize(context = context2) @@ -251,7 +251,7 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { val cl = AttachmentsClassLoader(arrayOf(att0, att1, att2).map { storage.openAttachment(it)!! }, FilteringClassLoader) - val context = P2P_CONTEXT.withClassLoader(cl).withWhitelisted(Class.forName("net.corda.contracts.isolated.AnotherDummyContract", true, cl)) + val context = SerializationFactory.defaultFactory.defaultContext.withClassLoader(cl).withWhitelisted(Class.forName("net.corda.contracts.isolated.AnotherDummyContract", true, cl)) val state2 = bytes.deserialize(context = context) assertEquals(cl, state2.contract.javaClass.classLoader) @@ -260,7 +260,7 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { // We should be able to load same class from a different class loader and have them be distinct. val cl2 = AttachmentsClassLoader(arrayOf(att0, att1, att2).map { storage.openAttachment(it)!! }, FilteringClassLoader) - val context3 = P2P_CONTEXT.withClassLoader(cl2).withWhitelisted(Class.forName("net.corda.contracts.isolated.AnotherDummyContract", true, cl2)) + val context3 = SerializationFactory.defaultFactory.defaultContext.withClassLoader(cl2).withWhitelisted(Class.forName("net.corda.contracts.isolated.AnotherDummyContract", true, cl2)) val state3 = bytes.deserialize(context = context3) assertEquals(cl2, state3.contract.javaClass.classLoader) @@ -312,7 +312,7 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { val contract = contractClass.newInstance() as DummyContractBackdoor val tx = contract.generateInitial(MEGA_CORP.ref(0), 42, DUMMY_NOTARY) val storage = MockAttachmentStorage() - val context = P2P_CONTEXT.withWhitelisted(contract.javaClass) + val context = SerializationFactory.defaultFactory.defaultContext.withWhitelisted(contract.javaClass) .withWhitelisted(Class.forName("net.corda.contracts.isolated.AnotherDummyContract\$State", true, child)) .withWhitelisted(Class.forName("net.corda.contracts.isolated.AnotherDummyContract\$Commands\$Create", true, child)) .withAttachmentStorage(storage) @@ -346,13 +346,13 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { val wireTransaction = tx.toWireTransaction() - wireTransaction.serialize(context = P2P_CONTEXT.withAttachmentStorage(storage)) + wireTransaction.serialize(context = SerializationFactory.defaultFactory.defaultContext.withAttachmentStorage(storage)) } // use empty attachmentStorage val e = assertFailsWith(MissingAttachmentsException::class) { val mockAttStorage = MockAttachmentStorage() - bytes.deserialize(context = P2P_CONTEXT.withAttachmentStorage(mockAttStorage)) + bytes.deserialize(context = SerializationFactory.defaultFactory.defaultContext.withAttachmentStorage(mockAttStorage)) if(mockAttStorage.openAttachment(attachmentRef) == null) { throw MissingAttachmentsException(listOf(attachmentRef)) @@ -360,4 +360,21 @@ class AttachmentClassLoaderTests : TestDependencyInjectionBase() { } assertEquals(attachmentRef, e.ids.single()) } + + @Test + fun `test loading a class from attachment during deserialization`() { + val child = ClassLoaderForTests() + val contractClass = Class.forName("net.corda.contracts.isolated.AnotherDummyContract", true, child) + val contract = contractClass.newInstance() as DummyContractBackdoor + val storage = MockAttachmentStorage() + val attachmentRef = importJar(storage) + val outboundContext = SerializationFactory.defaultFactory.defaultContext.withClassLoader(child) + // We currently ignore annotations in attachments, so manually whitelist. + val inboundContext = SerializationFactory.defaultFactory.defaultContext.withWhitelisted(contract.javaClass).withAttachmentStorage(storage).withAttachmentsClassLoader(listOf(attachmentRef)) + + // Serialize with custom context to avoid populating the default context with the specially loaded class + val serialized = contract.serialize(context = outboundContext) + // Then deserialize with the attachment class loader associated with the attachment + serialized.deserialize(context = inboundContext) + } } \ No newline at end of file diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolverTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolverTests.kt index 11eb91de40..c3f0ab3aaf 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolverTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolverTests.kt @@ -76,7 +76,7 @@ class DefaultSerializableSerializer : Serializer() { } class CordaClassResolverTests { - val factory: SerializationFactory = object : SerializationFactory { + val factory: SerializationFactory = object : SerializationFactory() { override fun deserialize(byteSequence: ByteSequence, clazz: Class, context: SerializationContext): T { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } diff --git a/testing/test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt index 9712bc866d..1d914914a2 100644 --- a/testing/test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt +++ b/testing/test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt @@ -1,6 +1,7 @@ package net.corda.testing import net.corda.client.rpc.serialization.KryoClientSerializationScheme +import net.corda.core.crypto.SecureHash import net.corda.core.serialization.* import net.corda.core.utilities.ByteSequence import net.corda.node.serialization.KryoServerSerializationScheme @@ -89,7 +90,7 @@ fun resetTestSerialization() { (SerializationDefaults.CHECKPOINT_CONTEXT as TestSerializationContext).delegate = null } -class TestSerializationFactory : SerializationFactory { +class TestSerializationFactory : SerializationFactory() { var delegate: SerializationFactory? = null set(value) { field = value @@ -150,4 +151,8 @@ class TestSerializationContext : SerializationContext { override fun withPreferredSerializationVersion(versionHeader: ByteSequence): SerializationContext { return TestSerializationContext().apply { delegate = this@TestSerializationContext.delegate!!.withPreferredSerializationVersion(versionHeader) } } + + override fun withAttachmentsClassLoader(attachmentHashes: List): SerializationContext { + return TestSerializationContext().apply { delegate = this@TestSerializationContext.delegate!!.withAttachmentsClassLoader(attachmentHashes) } + } } From df31e52665591c9f35b0aea76be3a3f02a454962 Mon Sep 17 00:00:00 2001 From: Michele Sollecito Date: Fri, 8 Sep 2017 09:24:22 +0100 Subject: [PATCH 120/120] [CORDA-303]: Add some tests that stop and start a node and check state is persistent. (#1449) * [CORDA-303]: Add some tests that stop and start a node and check state is persistent. * [CORDA-303]: Updated change log and added Javadocs. * [CORDA-303]: Cleaned up test. * [CORDA-303]: Removed blank lines after class or function declarations. * [CORDA-303]: Wrapped multiple invocations in `with` construct. --- docs/source/changelog.rst | 2 + .../test/node/NodeStatePersistenceTests.kt | 160 ++++++++++++++++++ .../kotlin/net/corda/testing/driver/Driver.kt | 26 ++- 3 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 node/src/integration-test/kotlin/net/corda/test/node/NodeStatePersistenceTests.kt diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index c676118a55..0f66efa1de 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -124,6 +124,8 @@ UNRELEASED directly build a ``FilteredTransaction`` using provided filtering functions, without first accessing the ``tx: WireTransaction``. +* Test type ``NodeHandle`` now has method ``stop(): CordaFuture`` that terminates the referenced node. + Milestone 14 ------------ diff --git a/node/src/integration-test/kotlin/net/corda/test/node/NodeStatePersistenceTests.kt b/node/src/integration-test/kotlin/net/corda/test/node/NodeStatePersistenceTests.kt new file mode 100644 index 0000000000..b6389806de --- /dev/null +++ b/node/src/integration-test/kotlin/net/corda/test/node/NodeStatePersistenceTests.kt @@ -0,0 +1,160 @@ +package net.corda.test.node + +import co.paralleluniverse.fibers.Suspendable +import net.corda.core.contracts.Command +import net.corda.core.contracts.CommandData +import net.corda.core.contracts.Contract +import net.corda.core.contracts.LinearState +import net.corda.core.contracts.UniqueIdentifier +import net.corda.core.contracts.requireSingleCommand +import net.corda.core.contracts.requireThat +import net.corda.core.flows.FinalityFlow +import net.corda.core.flows.FlowLogic +import net.corda.core.flows.StartableByRPC +import net.corda.core.identity.AbstractParty +import net.corda.core.identity.Party +import net.corda.core.messaging.startFlow +import net.corda.core.node.services.ServiceInfo +import net.corda.core.schemas.MappedSchema +import net.corda.core.schemas.PersistentState +import net.corda.core.schemas.QueryableState +import net.corda.core.serialization.CordaSerializable +import net.corda.core.transactions.LedgerTransaction +import net.corda.core.transactions.SignedTransaction +import net.corda.core.transactions.TransactionBuilder +import net.corda.core.utilities.ProgressTracker +import net.corda.core.utilities.getOrThrow +import net.corda.node.services.FlowPermissions +import net.corda.node.services.transactions.SimpleNotaryService +import net.corda.nodeapi.User +import net.corda.testing.DUMMY_NOTARY +import net.corda.testing.driver.driver +import org.junit.Test +import java.lang.management.ManagementFactory +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.Table +import kotlin.test.assertEquals + +class NodeStatePersistenceTests { + + @Test + fun `persistent state survives node restart`() { + val user = User("mark", "dadada", setOf(FlowPermissions.startFlowPermission())) + val message = Message("Hello world!") + driver(isDebug = true, startNodesInProcess = isQuasarAgentSpecified()) { + + startNode(providedName = DUMMY_NOTARY.name, advertisedServices = setOf(ServiceInfo(SimpleNotaryService.type))).getOrThrow() + var nodeHandle = startNode(rpcUsers = listOf(user)).getOrThrow() + val nodeName = nodeHandle.nodeInfo.legalIdentity.name + nodeHandle.rpcClientToNode().start(user.username, user.password).use { + it.proxy.startFlow(::SendMessageFlow, message).returnValue.getOrThrow() + } + nodeHandle.stop().getOrThrow() + + nodeHandle = startNode(providedName = nodeName, rpcUsers = listOf(user)).getOrThrow() + nodeHandle.rpcClientToNode().start(user.username, user.password).use { + val page = it.proxy.vaultQuery(MessageState::class.java) + val retrievedMessage = page.states.singleOrNull()?.state?.data?.message + assertEquals(message, retrievedMessage) + } + } + } +} + +fun isQuasarAgentSpecified(): Boolean { + val jvmArgs = ManagementFactory.getRuntimeMXBean().inputArguments + return jvmArgs.any { it.startsWith("-javaagent:") && it.endsWith("quasar.jar") } +} + +@CordaSerializable +data class Message(val value: String) + +data class MessageState(val message: Message, val by: Party, override val linearId: UniqueIdentifier = UniqueIdentifier()) : LinearState, QueryableState { + override val contract = MessageContract() + override val participants: List = listOf(by) + + override fun generateMappedObject(schema: MappedSchema): PersistentState { + return when (schema) { + is MessageSchemaV1 -> MessageSchemaV1.PersistentMessage( + by = by.name.toString(), + value = message.value + ) + else -> throw IllegalArgumentException("Unrecognised schema $schema") + } + } + + override fun supportedSchemas(): Iterable = listOf(MessageSchemaV1) +} + +object MessageSchema +object MessageSchemaV1 : MappedSchema( + schemaFamily = MessageSchema.javaClass, + version = 1, + mappedTypes = listOf(PersistentMessage::class.java)) { + + @Entity + @Table(name = "messages") + class PersistentMessage( + @Column(name = "by") + var by: String, + + @Column(name = "value") + var value: String + ) : PersistentState() +} + +open class MessageContract : Contract { + override fun verify(tx: LedgerTransaction) { + val command = tx.commands.requireSingleCommand() + requireThat { + // Generic constraints around the IOU transaction. + "No inputs should be consumed when sending a message." using (tx.inputs.isEmpty()) + "Only one output state should be created." using (tx.outputs.size == 1) + val out = tx.outputsOfType().single() + "Message sender must sign." using (command.signers.containsAll(out.participants.map { it.owningKey })) + + "Message value must not be empty." using (out.message.value.isNotBlank()) + } + } + + interface Commands : CommandData { + class Send : Commands + } +} + +@StartableByRPC +class SendMessageFlow(private val message: Message) : FlowLogic() { + companion object { + object GENERATING_TRANSACTION : ProgressTracker.Step("Generating transaction based on the message.") + object VERIFYING_TRANSACTION : ProgressTracker.Step("Verifying contract constraints.") + object SIGNING_TRANSACTION : ProgressTracker.Step("Signing transaction with our private key.") + object FINALISING_TRANSACTION : ProgressTracker.Step("Obtaining notary signature and recording transaction.") { + override fun childProgressTracker() = FinalityFlow.tracker() + } + + fun tracker() = ProgressTracker(GENERATING_TRANSACTION, VERIFYING_TRANSACTION, SIGNING_TRANSACTION, FINALISING_TRANSACTION) + } + + override val progressTracker = tracker() + + @Suspendable + override fun call(): SignedTransaction { + val notary = serviceHub.networkMapCache.getAnyNotary() + + progressTracker.currentStep = GENERATING_TRANSACTION + + val messageState = MessageState(message = message, by = serviceHub.myInfo.legalIdentity) + val txCommand = Command(MessageContract.Commands.Send(), messageState.participants.map { it.owningKey }) + val txBuilder = TransactionBuilder(notary).withItems(messageState, txCommand) + + progressTracker.currentStep = VERIFYING_TRANSACTION + txBuilder.toWireTransaction().toLedgerTransaction(serviceHub).verify() + + progressTracker.currentStep = SIGNING_TRANSACTION + val signedTx = serviceHub.signInitialTransaction(txBuilder) + + progressTracker.currentStep = FINALISING_TRANSACTION + return subFlow(FinalityFlow(signedTx, FINALISING_TRANSACTION.childProgressTracker())).single() + } +} \ No newline at end of file diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt index 75f99de85a..a704ad5646 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -188,7 +188,15 @@ sealed class NodeHandle { override val webAddress: NetworkHostAndPort, val debugPort: Int?, val process: Process - ) : NodeHandle() + ) : NodeHandle() { + override fun stop(): CordaFuture { + with(process) { + destroy() + waitFor() + } + return doneFuture(Unit) + } + } data class InProcess( override val nodeInfo: NodeInfo, @@ -197,9 +205,23 @@ sealed class NodeHandle { override val webAddress: NetworkHostAndPort, val node: Node, val nodeThread: Thread - ) : NodeHandle() + ) : NodeHandle() { + override fun stop(): CordaFuture { + node.stop() + with(nodeThread) { + interrupt() + join() + } + return doneFuture(Unit) + } + } fun rpcClientToNode(): CordaRPCClient = CordaRPCClient(configuration.rpcAddress!!, initialiseSerialization = false) + + /** + * Stops the referenced node. + */ + abstract fun stop(): CordaFuture } data class WebserverHandle(

41+a_)|T?gtRQ1N?^XI^2vnTPu*(iIcqYyk0h) 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≦l0}_G_~DZhC<7z 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%0A_{Ju{dVYZ2EL*db!-TrFf3c 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 p+M9zPK>d#R-s|Xj)!Tom>i7oK{&7>d<4RW8 zizMbt9o54)WR7`#qJ{OF^ic_c6o7sk-=5};_x9_t6{{Ir!P1QO#_nHSHw#o1RhOKXIolZ=%B?_1fJjEj zfML)NNSGmngM(0j4v|jEtVEJ);y%h7%KSD@)hB@d6+}(5OQ9H~SalBt;nTm@NO5Pa zlw8Iy?ME@f{Bf4IrrCA#6W>^FtnUY&00BCh94ggn#pQZ&f^r0p+w3g}IZjZ|C0d|$ z{vI09wp$kiH`3Z+h4O?tG&|QccgvPc=aejpRKCq`y{1Oe^~~{@X*!PJnV|fc{9?tE zloXKU6HJq#O_79}aX*BJKp}OX;N#rSZcZ=q&lNzeh)3;H;bC`pANVKuhiKSmSaj z(e_z{zoa?Or0FP|?z&700HyQhBbn$lT|-qwwMA%|L=829rA;C_b1RfcS|>jC=*Z7-F1m3W-nGeAfo3(B=S8glz*Nqq*D|b`?#zwKha+6}Xb4Nd+ zD`M1}%%rCnDAVnQ$r*kWPE`GouW8AxHU@%RXpb-m93gPE0za*uj}L~r@v;A4%)`zXaIWBNv=#DIy+spR9qWR zdf)qAJL`*>WWdQb*w`gx1+D|e(Zb6QsNSGKdvho09KvvFerx}8l_Jee;|rl)S7zlw zEx7zlvSTEYlBu=ktZ-=SOypQ*k1nV{tpWC*i_oyykpgQg5T!R;LJTh z@=eC^Ez4Mb?hef^ruZiy%K@jcfQsTm<3S5$N*b&*H=0w@RBwy=4;t!=JOdAUg)y8j zHoSVo{i;OD#az>6r_fiC*GhrMveT3Z;7C2SYF;yDb@8>mn@@P&R=_knF-INh;Z5+a zx>PlOK!o%TW{Oh1YmRf;>3uf=4^+-i*vkvW3tUOT#^w(DuOh?CcLSdCp$(@<6h*z# z^NW6E#v38?`feczx>ws6uEidr8wE6&>Pf`p6#aQK{v~Z1*zdx+gUK z83}41zBpu9W(3`30(_3BXNNDmq=m2{3XdgR@GZYd+6lI!5=jqsu?zN3f?ss4A@;UH zE6()-<1fnPmfn1)Bm6DzI%qN6sn+)^0IclV7d=_Z4p-&flY_JA1>xf(3Ah!g&!#z-0Cit)nDDM6hjhf};%;^XlZoeh3m z2}l-UW^v@QUiTD_u)#NqACS%Zhr`M}WAKB4ppe<3K>j28NPMM2Oje^>9<*O1ks?n< zMu7_`cWx8Z+%({gPWUiRFx9KW3G}Rea2?@nf^010*0;gorPpMD9OrjsBa#9YFHbix zJw{L}O#k@MVVCtlavFw9a3Se{i#!}jP@4aNuyZRp%13!}d;3hz!a>o3z}$&E6fYjc z+9``H`75jwq4=dFlZ&jcICs+tc6CC(o^Ql4c7!mG6?ScIzOGE!7HYE|Dr;M`Ly~mH z;iHoqwl?7#!&RPG!+x`RZS?BqP%}ZKO9P|={JCn?c1IAzpsBu{r4aC|7FSh&(}RWVO#E-M={*n*vZj3@DqgU z89`ws5+I8!B+)fv4?;+|Y5;7~el^9WMS(Xr)rW&c-!&t`aN7@YlOI*uNo){?*_Jl% z)bsfEAhVv^+w=9KE`ZFCcQS$4FnCD`Lkv&)++@#@T4tNn!gQ`*%i_+293xb`VS8*Y z@Tdj#gSXQ0w6Z3F94HL&I?_1a+;EH3&hw3F5<~^6+F$EHO25Q{t>b`R&JW2{XYHui z4LQYb%fOGza8D{Vi2KF!Fhe>hd1|t}cJ)gPE4da~uh|wv<3bEmbU^@YKge=?**FbS zaeyTMD3jQFBf#rHtZlUeFuNQSykvBo;YsmDhico|B;p=+iU`L;#3J|U2UXagZHKaZ zYCj44)RXc+YM9`X-`P(!JMXv*(eEyf)vk*BSVWs_Pfl%3#hyf8AZuKtJKxWFS~qB> z43f)25%Xbq%UylP9@1Gg<a1Jl5CmdIjvkMjLz zfVMCo8@B$tP@3{@OXqz5y^EqQXJ-QVkIOub^3_UOQH_lUTcX##5ua2U42}f+*=qRK3k#q4f&z zSMQetyhY8Y`4$Ua&}DDz7@_n@VK^Fv4=lNijX!NhL{DUTwC-Jh`m4$3?% z-+-NWwpw_CSep>0M3EW9HH=9Cz4T~>suw9elFO2XZmE2Hvb99B9!?I`;vznH5!5kA z?WpOS*wMXF8DqB~{~Rt}yur9dBB?6U#Mor_WX683>8lVh^xJ%*2o zVpMc@{r8^Xs9C*uwEC21HIAMOW-tTt+ z0y3Khu_W;OcTfJ?y7+&A{;vFg6MX+4Z$h)0t`mwXrjH!^Sc`?)rIu451WHU8YsS8hML3CjD!i1LI(&ENoCiq5I5%NN%_2t4DHZ{<3( zlgYf(u7L{@29qflUM*>zOI*90{F{LTA?!^oD~6vr6OVBf^;C z_CDkZEjOgrMvZb9iQ_Fp{X&B$-v-UI;qeDuV#$M-g%(qqvZ^PHfn=i+A>jz#xAW^_ z(S%)q?W#Q}v*WCd+wu4<1|v^46V**D}(YxA~d~%Iix&@t=OEobs|EKAdGOLf1YS|~ zFXZPRryQYuh6%fC%Ype+!c`Eu;OU@zBCQ%X_1d^!LHjR)!;4!3Tc-{D#>Xhnkn4j% z!36Y*r~woriRn=b_5?BEuN=x`mchhh7mv}n?XO;E7XNN&4L{lnOECsFEIsXCb)m34YlbOZVO9)P6@ z6@QY;GAw%Yi}wOYyhNi;(%khTd%`GE1}K>j#(E4la(TLK=EACI#;MetmcIe6sl3AT z>cy8%9vc|e-g7Cm9rH5alE#_ZX~?Q_hHnwe8Fl)U9K4(*hm6cjO%&=169PfIjHM4;wm{1r8(RjgO4WwBWx2 z>|KX3=7>V$jaJ83$#HL`OmvnXUtvjTB^MnG!hBWj>dT@QUf&x|_=O zvF)~>V3u0>`%2z;7V}51QxpOxHw3Ri1@i}ak30Mqs3gP|A5Z2{e_wmv6yGQ{D_C^n8j4w{Z?$zw?$tPjh zPAzagJGiKxpXt6ZFqwXl9>k2SEFp!f%xoL-4Cc+Q8>-x_5`?MSpW!BxT~2TK_IQY7 zJT`{Xl+fvLKXA1N^`WlmySw~p^PeA=@)p&+pIAaJH8wGsp#poK}JvdK^-m;jgjb;ID*eZIk`S^Tu6eDpsBz zSbCKH@t_+=TSj_q2gUd~j$DvK`12v@@VUx~}V6jgQ>))eW= zQ`e_ADs6%rkuS3xRhW!lQPtd1Hc%U+tR2H8v0Yi-F`K(bm?XbH zqkOvf49`WxKZS);Ytd zioLnHnGTid%jwFK*<%&)gH=>w2`vLoF=DUlF ze@BYJ<*p?Hz=b(90s+@3WMW5`j9--iB5EZOk%Cn=(B+AQ1_Ts*;6cq|RZG1^Gdj_u z#qHCy5y`yJq{gu=B_JgsGrUL*gNoc!W-iu3cJ>m|Avx4N%Vi0r!6$yKD>D1IE^i*n+l{Ao#bF0+U z=H?Dy(eqU3smU~R0$<`8#3@rJ75d{KWqMc^E5mS&=&31U*fsefr$YASSk4HcQvMw)EBhO#2-mOuMQ)}r&{5fReTk!BTKvRXs$ zcj*aU26PU=e`Kw~pCEhq9`23O_`)$P9+#KmaWgx{9A4Em=c}Nbnw*r~yfbf;PgrUN zBgxnv*kU#HlUH>@2HMnNRg`?U2o>N`uvwS!duS)>1UEEuoHIFQO=07TOi=m!lk z0o)3QnnzgRVPgYnc%jaLfplnY+d=hCC06UMPJn#G2c0NB%f>Wtqgs_>X~3XIzcSd z%}a*pa~Nb?`RI{BEUlofocQUV>GmdkhDnNJItoV5AxKoc+PNp2^^oC#!;v?81VZt{ z*(oWz43PQKV*S>BeeHD+X!nWPPI&IjB{u5s>4}-^EO&z;cyzn*3f-I#bVWkJ=ye`ndOX5h(wB1Paf~>A<^T-~9T@j;c$!3n(c` z5&Hv=dxM~>`za}&e?u%pySNA`Wn4(ti5-)L{Ag*Ffvr`BHWsW!uD*=LLD(KCPo^%$ zz)@dWSU@U~lTO5uFU}1nUMOeFZ^UwBn1~xzwqim4Cp@9NwIv26A50c*(O;n~pYlK; zx+>_^7%uTNb(L!CL27LIVb%CTs*`8R9g1cV)QRShxRc3NOG|Q?R zHTI6k%na-d8jhyW@Wjra<3u&*e7K>jw@SEjG{JOqqJV1!PNDP%HO!B4ka{haied1M0|X1eRKxGQw&*%cBzTj0$!%2&*=K1KqBz zyh1(c+pe$KEzmN$+5St=0Z!WA42FE*TTn>z52RBM?urskX=amim5-B;_0mqyUzvCpG z`z+`j;qu7MR@#uu;nPet59&t z+X`5Yg9EhyuifjjvY@aXxO9bOl&)e80#N*5Ec8$aOH{&A0KN4eOnd-?AQcYd$~mF5 zQeV^^BIg>8Eqwp!Wg5M~WB{jEx(Ac?-qzfc>1UCBH<>tDsND?;5gqvUCz2zy@#z_35 z2q_66NzDt1yqL6dr+7ziIME%v6-y!wop0FctYS;Im{(qsHem?NyqMN`Nm{ukwbteq z74Q=YnmvUin6NBkD;SW1Z29y+2h0YDMS(CIe$SYIYUm=RYx@{WAB^Kt#2@Oc z=1ld8r4);CZc~g$HRz-ShJV2r5GvkqES3aFx%>!y0#*5?Y%t-V;gv=y+%w~L;#~)t zlJJsK^2A{v{217$iWs@LAWt{0agHs;_=4Ym&I=x?j#?tH#kPL+!Eggf^Mvm|-q@gI z5av4+#a6Zjk#eDi*dolLmCOxS;KFR-12;R`TB7GIKbJ&^825g)=Kak+eZrBOx|XzT z3~+=G2^U(bTvXJ`DQu=unYtg9fyRG`$oG^sCV3E4Kq$IKmR z7L~FXORH)^3?AbJRzCSJX1W2l5L}fgHQ6SWadIh=l!7u5DS1iiaUnrUA(2os8~Q21 z7A9*l2&cm}CUYhnz|JJlqM2s)8>6B-aUR0#0hdj}2HHMv2JkAzs9igiHNv z^M6c9xK6}*Vb`W(xg=rrz1P>(8Efs@wu+i58n&$WKdwM;KS;H_kfIP{=eIY9Nj+QR z#huhkUafTD<5-EZHF`?2(YsLBGRCH|GOx+PU{>i}w=h&f+;?JL+Szy9*o)XJx=s@= z)dZ1@nc(n%h7YeBm?y&mhI7N2K4p?_>HFD9_p@)5DS@+Zr75HWln@xDK#HiN8Dv&} za7v*>sS1&VnWj}V^#T5fX_Q(Ahyj?b6>0)({-C$XtwL|B^}x4Ms}DdOV!P|Cg3D8^ z?|K|^xeKlmg0VsyO$$bGAP5IZXpyL9*~3t?e?*#la9O-)`hgN;1#6sbgIU2DPW@CI zo?~Kvpq@Cg?e9|gnM;Dv#_?c&W$0WZkH!lkx zcc@^(VR`ha75KeIU_I=<4A(Z|&n}K4r;b&^fJzuS=LH$(d)z@?=z%>YQ;G;ahj;tREn` zq%HkbAwI3m%XB-l7UlP^X5zraW|^^I4fkZbG4xTXq*JWpx905B;FRjsy82t7rn}(x zOMKy(KOFiav2^AO0Lcfn#RlcWwu7m#Mfj%&Omf_gP}>71gtDhd;{#qs!B;%y`e`5X zUs2iz1f}v;5OADe?D-RPnc6P|C#k2G{-DM_@|OQxo!{Rp31O%3mV>k49Zyf0Kd>d) zuODK38>kIIIEDDMiEo8t=LKr;Qv=uUQ6G z#YK>!KKNusbn%z6N+$0=MnuEF zeC~w4Py4@`FNvX7q6l}`l9@|Dn!olLu?@Y~AWpCne9bUQXMOhvHi^xam9|#QC^ z;OopO&8|FEsc9U4Iq67FXbMVn(M2~Rod-983Mw4#3o4^(^9GHl0c}>?vAC*o%rMVo?(CbyPha;V9!j^IVPj8NaV{z%Pqoj|5yB}f zr!WX!gI8WmR4C-9E}Qz*>^bX~koen>%Q3D8GbgXQgd&WMSm9nGL>zN@fTWl51W8PU zuOD%M1a^T>hz2WS2bnWts4?Wp6)&x;--cw#{;`Yt6h;kml|#{tnV6vj=QMF2Er+<~ zniW<(_h;@a$}OY-@Zi)5Q6V?9=@h0`?<1Y47xNa@Qb>cG8x{FALt-QJ&4NtNr#b4) zn^mZ>I5S$hWnuvCNewTkV0V1aeqrL*B=-V5#rpOQ=mgta-z>bmveG>K^rO^*xwx!L zv!r9YvKJig=~-M+x8Qz{$t7{CGCX-K{X$BK`WuE5o$3=>hhb{8XNWd-VdVRki3`F7aW}wI;umz!y=>wsBe5{5|onI3DB@r#vCL_^K)58rd!?f5Ah{ zl;)f>SL%;c{x`y1wU{=8nnGxRlW%+Xzvr=g-WhQRi$%H(C}cXPPFJ%#*+^ zesiaIJM$vVn{|Qhe)2%daR0`>(pX$tzZg~TKapPwiCp7vT~U6e;0U@hCj!9<5!|L z@9(QpR*;5+kZ=H zs;A^gg=5TI+-T^DV}`$26PLg=QEJ?**F!q@MWpS<3?H+gKXWEb{P6Vfx=j4wrq#!F zg{mjDg3wihkcjO8g>Xfp7e+aQ4YHUP z$^37-2d>Rlqdu4U;^kCjlOt?2HS<_E(;nu-idc*oydsl#MW)88;P`j~jmef%K)rFV zU#AHV@t8C7Kkcfdml ziEI|{5t28cM4>uWnJ{T&n1a;1FGMErk(6ytTFSl~PD3o2 z{%|G6R3zE*PKPyVS2S_i`56k03|u=X>d3&fZm>1EpOIwP!tmmBVPhmDtK3^cdfo!> zQ|lq>XKvha+szJ)O}ED`p&RJymmr9C0IQL+4fF($%FghX*w_bXH`=GGyuT)}=xC~kmhDG(?(X==Q z7^xN`Dw=vi@-W=Vjd{g!H1h{KUX%obS#OB)OO>-Zj1XV>KIsI^-WQ5 zs9SVpBY0$YZ@_V}FQswb$|8-RET*Py!Bd9dPRd>jpIEe-K(Jy}mw5ijFlj@pP9=N# zw?IdsFF&O>?dgi0@p}rq`uM;%rXQ3SJUSSy#R#X$<(I2bN0JTLip=E^t~cC3aAiAh z6nzt;!`ObzifG@tug^4a@PQ6}xkXclBV))#nYHkoNoYJg5>Z|Fi->F=qWznl%t7^)|r+tgR5&)V~kR%V66)efNi*!x!@r_m|X1cHH-j{)2 zUhn|O4rSkg)KJvDMcKj+GWc*a(x1w7-Wn!u2(-0Uc>IXO~ZcXHJvEO0XB1%Nt zrN+mpxrNBeH=h=Gk<>rsz#~h)e%3t3pe)Bn&c#4aK7_+Wm1CsD`*gLFX400HX2N2m zREdbwPfMP-2f@@3=O@a%tVC zbU_0Yyuz>0P4MKYrigEg(mRkXjX9$5wP4-3iaxZ)JG+DYaa=N{cqt>@v!(yJ;vZ!I z<51ek8#(m5@d=feyg-Y0s0d3;WgTGQOFUFDE}=5;Jquc@OWCDkUc=13g7Vh{pr*WG zecv%``sEEE43`PE&Fvwu`UT%PaQmFDNpnKYYf+XBF*&Hh)=|M)Xv!P2mWlpoC(%H7 z#S)seb~C!ap5+s+P+ckX*OrP$6<9WyB+S#%28O+A?8;1wdZ;!lNVmj%*??~Tb$u6Z z-s3Y%^`7|B0_}SF(gRi1VH9)_E=YjZPG)V@yXlo9`|u+Ryfk&VFm|}OLQd`Paa|fh zV~O0T4xQrM-rcCKZ|GPT%@w7p&3LEl=rtrqs4%yvn;YTJCvh3rX{~G#PVf!#qB-9( zglp+{dqyrBKk`PW=K~v4{UyJh-ObsCZB{@bw-vhDnbW#wUyN4mtZ5g-8mrtRpFhc$ zqJ00$nr3pBrh&9Acx234L(7o$A8FUF!xn^G?9kqKh}S5#`x%N~BHm-|bi3~0F1f{W zFc$%)##J?rG0mcz^9(O>J%|$iT6^8m**4;VxYSk&2E|Q)OyV8p?dnX?j^e^kI#CmA z=jri??t%9d!Ly1h>FgRTe<=akfeasv@XeU3#}_=>G;q=!G9w=GfUT~kw!a8P?Jjo0 z55Q0XUd3rUbWf072GimTf_CuOGvh7DYP)Z6H>I&i_>R>@%i98pf+%gk)S~1M>{Fyr zJ!ns%I@d*_LWySuyBQa-+z@jTGiluVPax+}?rTC{V@G}W4^=U{z^qcQ$83xxOgV{KzHutAB}Shdz}@1Drj*X&M3%*HeLW_%PvTxEg5Ad zI>oUNzWp`!>_6H1IG=d+u)8f55#x<<5={KuhO|sRQ1MLo0!33DLd!*hW!`Tz`KK8) zOI(v6R(ddX?ED#gE}CGD9`~=(jgt)17WfXtGve1L1VJCoHR2ZlYyO(W$COfGD@;V_ z0L~lp^KX3Imh0$5Uif&$t=e4R80tS#pElGVp0BZ#02aS z@wKv1f!Ri^-s({SA4asigu{KYqCXoWZ?2t~eolpjU&mbc=?{@Ur=~?Q89{RosmLG# z(`d~MGSZ^;m>@j@HQkXUoOWA`y-MFv=m{=K#qxgV`;KO}JLtFFMZa`}I7?3g{Q6T7Eu3IQ6H9h|b z_A$rt-D4EggX1($wnR|r-#|OkH5caqqkoOc8y2+>3!BME2vKBDxSo5KOow;~)a{5f zoTczKkI?xyI8nyOhs2NiugqUF20t!{ zlz(8)lKd#b`Wa?7T_zcMffhVtt_p2~f7ZaL@g-w;H6!r5lhjWZb)<*L3b}_qA zSRQ`Y^Ih!kj;p=gci)z(4^3gm-hFPua~B{~1`2s)QPr~&k8#uZfy^Ue|0vmHi$u~_ zPx5e@M(u@*O43&~UO%_;T~acJy?co7N{-PS&0$twN^$?D%|^G5DXU`u9RP>0XlyLi zvT__TET&G%-pU&u4U?X#agkxKk-NQ6AjLOIE+MU<&{CzF9w>h`DE4)s{*eGIf zB+#3Ht9jPJSBC&M-AfO`+-@kkUZvgmc&y*MZpN2(0Fe4RyEReq>DZEzwsi<4@L(q> zc>+myn@vu0N!jq11)<%kUNP8O1gY?Zt~z1`H}rE%XBeVX75GKG zRASEcShM3~6Gfc~2l)j_RNO_FKPSkgSNECcINewknq2vhByTh&JG7?}A_uo z@{TITO4lJhU(bO2j(D_{kcsmAqB>ZfK)fw}v~7H8lj9d$_&#)f1cN$}Y}%W5&Hxfb zFVpHQ8!D-r1Yo3a`Yc;7o-T)p+yWfAtEmKX*uw1kh=D68d2bW$J0nR za26>4f=dSJ-POEd^iVnaD|X4AMk*hW-W*xfaO2BjOn$kVj}U>Yfh?8WHT& zeQ?TcL=5e+XHmd^OW*O9BY0}{Hp2BW+;-r00q;4jp|vYr?mevte&q1G6T80Ny1f29 z7zn#1yF|PU@KojQ8j^^yl){6t$vO@iV;JH|L%V79I=Jf9h!jbS`MPCj6pN@1QnDzq z6(EBsR^6Oc=wTF#;ky*4DmR_&zdQ5v=zWW;(HY9m2B#NocY7APb}>%7cF7))Zt6XC zvJ~aR^~>>g)la>4RUdqAGG6Q4mGj)CNyA%!(w!vCgI9wFH`SO#pM=HXPa<{C1sa5( zq$v>sFg?$|E0G8yJa0JaMBjD2#l1-%!~DWZ21nM=Zx}ALZo(hwZpvIcp0k(=c03|>U1mZt(e(Hot)b;#LVZflC-1SU!z zST;ek6>o>AjHdfQt9A%}-MGk0$aC z1$9d`srtmFu18?A5LoQ_^Fhpcz7V>GMYV}7ZjVd^dS9Y4C%AhvDWFAA*-Bgk%+kI~ zop(_a&CK=fGGcWe=^l9Yk~y8$6MF{9=@cflNFLrT>~!+62o%~xk>JG#4teRhRN}Xo zm)T1(C8g6s)-^o19y`~J(5`(?RJ_LrsG6?2U$+R6BMA-W80Gp|WJm9(b-Ll154a|KI)BJ4BY+ItsW)^4sA_TeFm5IotVe+)3 zQ$oynj>VCEf#k z|2dN9VOf@)kXIyZ1^JhIDw0E%k_Khr(~E)_6+~+G-W*g6SC-Db7Q7W;F^wDEV?;%X?y+ZY5{hRn4qpCjG2~>((`Q8hOF*KaK0^ zZQrz!@5c4}@ACekS26N?`_J!T;&xVPyC+O-CVNkJ_L4fZ<#Zd zbxs%dbIzR-bCs|GscJ@uT)-c?=n(?#Y1*Hg08Sw>)ucL=NZizyYUsiOTE@*KCQV7O zJnwY0c5=MwaC#Wj$-)$C51OJ5=~&J3jc!|jqJetm@kV|C{{87n$OU+N{9ocA-vHa$ za$)2m=TdBLMD3EVjl_W7n5r(&;x$6|q=Z(ZnSZnvu;OzN>u7BOqWOdYuQ3N(MwOGLhXYv zVZyC~S+f1JKV?xQL6R-9K8EUA!#t6ig&xNAXpz4hEMe6A!?Y|W#ZLP&AB}Sn`3@pv_qI%=X@+2Yux>WKXI*cL%P3 z|NT;7IqD47Z=ZR_7-yR3N!_xp&DH*53}b0FmBDwg*Q?vrAZ2Ll_LY)rMbqbhi_^+1 ze^V{#E}<)D@y^1DgE75G)F=@>={f~*f)*OL*)!oZ|D}p3?;xSm5`Dh zaWXm_PG{5~@>8|*=kF$#OzgB)OzW9IC6j&3fG9hlBh&$R5|of)zl&erLXeA$pLIl5 zRFxOXK=lf9-%;|{sKE5mw+;QA1};rqdf~pJAkF< z|1{a_Qnz$hS;X>{cRbn}V2_e)Ue%oA%HuJBo zC-0+=Zl^YyF#OMp|o<)x|_ zR(gdwJY45_rcWL&jy?N}*Q5qx^XhfE_Vk}T!Z?Rgp+OaBW{c6l(koTUnu;s9J)KF& zzTQd3Vk0fEafKp-eOGQxpy{4a?(E%Q_O1yZx=E4X>i{Rj{Lnqm7Y*#k?>3%n zOkq?rQiY_;OUA-=Q3|)E@^TuMWggv-Q4{yzjbgJ%)=Ujm42TAx8xT>`W1|FEWkVLsI1S5`!0ay3ihzunYKtB+~Fui42-92j#D6KgFAU5ff2pkdS+v2=UafL_YM}oKgZj3RL&_Nd(sQ0S}864 z!E?yVx~+0#Y<1O9&q?}VesJMr$VHw$eoRt5TL`$kn1UY{qY8cGj+Z%V9A_!xCTw_u zHTrzSnKBOt-DJKdLLa|jYlveia&(r`{|?ou+a8jG=Z`0Zye`RUd-d1lwPV!u5m=|} zoDe*qb7Zp2lWs$wvvkI8%6`_ZAgJQ z{=R8s@EyK^xE92EMciZ_ygR;U$o#F#OaC+@eyzxrxz4E{azGs`PY=~~Z~WX!+a(<6 znkD1fEXGeH#y^%BQzEu&=&glG;efFR)Xm`Cdx0W?ailj?3%GflW5}(7cADZ`?WZBla`FK! zsMdx2f~^5wQ~Tl%C%Q{beWfyw?e$CE|BAe$_|q3|z4=pHFBJKvD?EyXqEnP#W&}@e z?Q$I9+XZr3Zq3kws*}b{>1X3V_#C;CYiHR> zwvz|+uzCvQJ&U)Dd2Zzgn!S$g?}r9h@dS{x16gkL)Gr@++HbA(QKqK%oMxgJIsQ%8 zkWt44X+B9^2hV&xs#~y~LF{?fMv6NKmGVJZgF3rY1&c7(;?3xJ=cFY`nz!OwDUFIY z7*c;U_U0{2%YrwUCW#<|aK{N~ks-Z|`F{qmxlF@h)BD%YV2jZXymvJY>aao_SUIb1jb~tqqCL(FnSQbw|>;V$4{xy&@BQnB_+@U|8I@6&?R1 z=$f{`93VWUqh{7nFsbb|Cu}Op7@$mLZEH=NrhC&lw5Ff%rgw{z{vBmakCEcYB;9%s zMm&ru6umW0{Kq0*p;3bJ6eU56#99ohiMH%OA=W!UtE<>GT>b)}#G*OO+5{|GsGKi* zNRRKu^sVSR5cRDi?$Lf>U9BAzqQ2NJ4dVa>z`DTOB6hpp zu#)ZaX7Aas5l?ts5VWM`CId%o#sLwHWM#716VoZ!wQT>0aVTp-&=#vNc0G;0EDy!??dZu9#}GwkB%iw150lQ-D^ zl-iD2EY22Q5;4voq0xWBK!{k8T#Zv=U6aqni5FABq zXW#bZx;6H=xcw1rLqN)96lmcCRfa7k!Eit_9H~RzSkmxOE^r+evkxPd5D#xS72e3| zAeE+vJJ3tqUjH6xvUqGM#6N9;U9QDC%6yq}Wf79Z-C*ICgKvW5`B6~DsQ2{@AO?WdlXmSCUA$9 zw;#%V_r7@Gy`=HuyI{S&R$~-WXYtgoL$pOT=P+Fr7t|Z^ZjN;9jBUU-n&BVTw=&iE zE_at@1fZL3BwNv|S@P*bJ8cQ+_6jL|!1Qq_PQVQNfE0V;NpFdu;ZQSvxGd!EUl`p~ zD|(hYPpFzqrdf^InxKjmI=O><-I)8-CEchlNA?`k(zQecRJ7#N##rx~tPzZ;b<)V0 z>Mc)ei;bc5FYg*wSLJOymYWF=uE?0u#ehbUH&BXm+pEO3+SEeQI&c%<F7r7$H&O@cRf8|$=j5o9J9BBEHWpsPb>{_Hn7!VD(y__UD7`WH z_TRPX$=)654!_gRHAl=ndg7bQ3$Fb|y*F*eJ*!QDJgbf0?G9-=LpnP9ll^oc#v3Zv z8Ajh3B5Os*Ug7##x*AAVPM}_9yH7iJiDAibTZG3gx>m75E#b8&86u|uY7=Fpy`_Tc z1`Oj-z@0yhk*~fi*>e|L_^2#>;{kKg56|^HRqJS5CsgMvBTZJ^BzLkMWX-5lbeX z5-2XoRL|rZKmnvz9N#XeE202yU5MD^F_hk# zmVgVsLH}OmW8*GQM!F`U9er(U#gvtg;Tp>mJ6&9mjk-Nl5%P361{~$gPDTgC+05@t zRd5-`xV{B6_w{aarq2~qR4F+&r(@3?|4jg%NlzCl1@q&_Cf0uq*JT4BB)=o{|96mm z-~I0lvrP=04b5!q+!#Rqlbrvz_r3+?{~7=59Dwor`Tx;J)eLP&nf?bhKvh>6=UYDx zzgkNQ+UKiKwrG@T1xXXImIBSz2n-fWRKgLFwmqxo>RmdpF>@0x`|86o$F+M0ap^ph zi97~+4gsIG9_2m|@JgO@5@nG_O)L`6J*GVba(o2jKiwZEYJN=hnn-8^img10_v}l^ z&s8s9c=sT3sHlC5jld7{_qHY`)8!mRAdHXOtgADyMo^{G(}5iu(9R;5%vB2GY(3+m zLpt`)4;hFFr(w*_h^KME#u69HFnD;d7Z^5%5Sk%8WkxImqFwag4>e`r2T%DhXsB2Gi(4Sx%+!8Cuvan@Jh& z+dzhmE&9I@$ zz<{neD4l-OGQPI2j-uHHZpQ`Uvf|Pa#?A1~^MF=M&5aUEoMMkm_jsf=5SpMjM1mnC zVFw&{kze}0T-!&sg|#(CVn+G}gQ}ZWT_RB5Hsa=alf5R`nOe%LlF-_ho@paJAGV$Rl$%4W^O0}(eeon`(V@xPt`W-SocXP4$l7;yY4bp=>+Z0`ph z{0npEE>XBA$}Z#(_=o>A-e7i}-Fm=8Y{^jD&zj0EVjT36t&e#2n6Z8m)_?>!YFZ9S+$JZO*n`C)OOQ7*n`iJb0+W zy|s5iX_CMn`=+C^Pk4+na;HJ8p&-V(XcarB!(`VaPUT=$Sq-lG$vt_UKG_71V^46B z@&N<+*&BwK20H4*;sV*5nPQS+5_xP4ZqkRI*JQBwSL6dqd zfTgqph`0(+*odO&vZTM^LdYXt(>jA^$7HgALsgAUO_{c~x)DQNbo7nXLdane&DfP| zUCm8e(p8%_))?PM(Z9AUQ)b~|((AW}*mSRdZBLa?JVzUE=iekk2>XaYA=X5F- z{FdES5u2`LDeZV?a#QlPxp;OK9OA!b8~#cbY5#Ou&Xt_Hu);ILV@4yIQnh9$ zJHdn{*~v1)he&2kh%;o1Dn-caSu@9qD_<%yj_A@#6g(JHf41~94cKE}Q$JfwhSy6P zzSbKpwTvt|MlDbri!~>1sNpmL#m|oSSHa(*a~{lit*N5$PO}0d=@~t-fDRrL6-z}4 zIFn5d(o1V-W*BUCzs;4|H%-abOumRO?Vqg>lFbP-F7Jy)RCXG7UW~JKO=QW}jM6oj zXGPH0vchx?izxef1X99G(J8Z#xlJZYIA|uZ4_VQ*FU;6;G^zE!-L}-U*#SkcG76Mu zwakucX2j$6)39(}rNH;QU!2$@&q#xBsPyyzXNTc|YX*O6nfn6JM9lNab`32e=E^j0 z1-L9F_XXU*`nW2WdIEeI#Wb%paccwY0Bme%6YY0r0U<~Td(`3Nxvq>K!v>X;aw?_x zRE6MXR64A@de9r(lcTx&;#hK@0@=47t0Khm%eVq&1u10yc`{5R6tTY&gLlg~Wiih* zQpIfZ173n>i9!Z{I5o2J5egd)6BWsz4Z}oD6Zg)cZ)UQFMS4OXGw#V^u^7{>Vm7sd zN`a?PW;Kq=kS3&CIjUqXwzI3%H07JI+un5WWrmF}ow}H1n9vZtd2_xIuCSRZ)ro|n z9C!+(DLgyWHCM&8VfE;Y*OtrV6vVAx^H>;n>iP)h;#jQ1>ueejA+V(=jxabneJ4rlcPyD z&BsV&WV+f|B~>o7!O%9{s%rqsQmsYf)p=+yQ)Mwi3&ZM+*OE_)Fn3K_O&^!Cfg*~R z5Tpi#`kZ^6^5j;H{l<73x&= zN1w5B9LUvo>y~5BN58A+piA>;RkDNiU`1=4-0y2PXmm|;CY|aQhEgWkWRdwbK!8o7 z_nG76Z1>{|Q0r>^$TY&Dx!8SpP~%>-G+iQF&nT3EIUx_6Ag7aTgxbLeLTA&Zu%#MiGu=*+;Z#{H@i*dV(u5jr|A7n(x!vUTZYYYKoq+Y8rH6a99vm)o zL+WkWmG-siQv)Y4w4G$-Mj9_o*mm6@;<;2QjVMYTRT43jcIN6W ztI<Egq_fPlY0p6j~6wt-NvaDB{3$2i0MqYPI8uGZ!4LVFKJKEbsYt9 z7kiyY_m2EmZtjbvbKl&>SF?7O@zmHy z)cXUt2}mU?8XgN!*kHIRr~Qzkj?YRei1N2VoYLRpaAfRxARz}n919LOF--$sU4|v9 zDI7LSy=^;1294)VHd&*S=E&RdMjMg}MaS4b)MUi|x;LapjB(W@2$-o5IVdmp3Jozw zXy;rMdcm6p13q(V1bi^&ep<11;A+}_O&`tVY1xG-r@ITyKNPIw!VvA@;~zYTIDu!g zSi}?=FVrbqW)_oJjE`2WFKs1F7UwU`r3Diz@&#tl21@8GNXf&ix6C-&YM zK<%MowqrTC`Hto(#08Me#|pykm@OH9hHEu!ZV1;SW^n1H7tV(nhjBy#hhJa`qC+_Lk zOZmk+w8)(0oj;(6j8cYhfw| zq!0^11vf4DFlpx|2#Eqn{ z){QBHjafMl@`Mn_t{emTNgJ=8h0@z0W^eHK7_SyY>)0P}&C=sf)88q_f1Vj#0cLiE ztC<#$XgVDUX8JC1tI!xbMk5=l3R*^OX&ne5UN{@o7hDB4E(gNBx;f_l>dNfaWcW!* z*<)LQ(gxhv=-k-6`8$7t=7w2B>dnLUtzWbwOF`ni9V!sSH%79J-#B{KASF}Ly>hB+ z_o1hc#T+5(H&-|*H$!9z-PnH)KSlhig$Ox*!QWcCL+{>X)(Vhi~_U_{Yn9*(=8O@pW zIX)=-+vn3R(^i*z0buE#)(nn~7MfW}`Z=?J6o+J$7L>__5!t-0!~b!4=+4l*E4U#R z*}UtpcFTHMIN4z_ySZQ=8^UCGM^EkrYolm4;O6hoxH9y>ahBCL4^nZL1#-S4jJ|R% z9Kl<3jZPo1$MH{Wb;aq$;rBbfMrv{W`Zd3lfJ*@lll6i4gE!&}g}D%wSRZ{7uGeGfAMU(p5d(;~ZsU?*=x_lz!PR!hnBC4X48b)aZa9T<_ z0)p#RCvc2}diI5v7>K{?_9fF*|LvYLjVGu-vv;7OT0ZhYJRDcYd;DkaV~;v8N2=yW z_mXrBpwpEc%pzF7TL;A%ULiw0p|@mY`A{i?h@|MngcgG;0Uz~fKQ!ljwqNgT`0Bj) zU^C>j+>zUQ_HX?hj-9Y3fe~$K&p$8QZ#p{c#Uq!8%E@Fu~WUKAdBV^ZF~536&iV~a;>rvHJ3k8rDQ%d0OAjD ztcOo8rD8%Dky{Jt#NU8-t${{Dt)F~+AHWxDk2rTt%ox#gl0xABv~WCtV{ z)|o(Wq`QCHAZ!OO1IQ+TW5>r|ozd6_&tGZSKtCp6Un^V*juzs)SHxDg6 z-Z;Gpyp|!vo^(8Nv7`qRf$~qTzEw6ou31+->As!6T<^7f!5Xl97R5;%A$v3!m^G+1 z@2`kg3e8HPZU&y1M0^`&WQ5kY6@(+PtaF%g$0W1mq2~PKp5wD$;WZ+!FJ{TWfq~2jRZfu&3WWSNAap`6x|GJ3+!;Yl90dRO)aXVePTo~qq9ryk8S{AL{wR^uM)(x z=#(-%9W=<3G`w;Cvm{Lmec|H7WkRr@Cc*8jf!%_;JkIzYGKmC?;YzF#4W>c9W3Nss zWy=1GRuv^QDO|C?rdfPiC=L9zCy@pKY{*eGpBakNr#8umr`R^(tzW2yi60T@zl8}A zuJI%HA#b3HLH?~A>2zbOrH#^_!R<5JX#D|a5l$E=%KR2AG=tX=39Wk2X3RFP^jqdK}}nQqoWuIBZdIU?Dj`Ge_iOvwQl-I zOt}xcDY9Bsq16x2Y0lRF*l2x}mDA4Fc9!u$I&w!lq*jAUD-YVG6k*${Zn$|5kH9sg z#6R8L#5~|pVK6@T8Qz$j8Xj;#sypt;Z0lP0cdX4;b+0)n(UzyGlFQQ6JFUtFS#MDp=X7qY_J<-6 zA`TVR4MkK*PXYIu8CPY+F&h8}%ktYO%em@CbL`nbf;qPzf0a^{ANMa85-;ifDtPmG zMjLxIz;b&Y$=P^O=zQcSz`|sfl zf{q49Ns!e6sYwoza9e@;@6ZF-wl;CvVpMvrWW6W@RIkD{<4V^*jz5MDpF0bshIqsO z2^bbhv~6m25NX zLqm!!0?R4=Hx_2VClHilkcK}ZDM=U7Kg?ycsqAQBql?cRxxlU-Q=R_Z|5E72dCCD? zRJRykV>|C2xpv1KxdsJst%P!$nGRezZs5V{Q-03Z@Rl@8*WED1hycvZR)oSJq(m62 zkq6dD4B!vU(+cyaK6#5=vz-(hKXW5Z&d;ErELkv9{e6=4mR|Tr?jrKHxNIP(q9o6U zFY+p^=8E};TCXH?keFkkhjKuzHw78hgiJpY%&&&UEFQChwPk8 z1>r_W;i?d$)@`&v9iNwWS!Y(XdVdM=N)(9ZbZNG2Zo@px`mg_8N9hCTrh~AbrTB76 zw(cf=E&VQ~(vw1+6-WIZ(!yXZq~)&HR}X|+PP}oN*y9=H1elzp#xqJJ0#o` zE7oniK=vBOHtBJE7nv57ZB5kk2~*lO=lwY|*FoA9p~9|PgRe!Ev z_b%4eTio2;F&?*qIHAgIN<_97^$q9%3OS-r*wJYBGM#9T!SSzl@Qq$Ky$mh{<>p{J zxYphlaine7*0w!bzpL$(4|9hzEZVEE>^|F)GRW<3rJ0AAMnJNoz0*>0b`OW}vex3} z@6ER?2GO|bMepj}N9&oWCg0zFe}*oSJPmP=GTk-TZ_rax>mEUcPEn6ql99X&J-dDL z3Zi(7ODwP|!>y|b)N!!u;{A-Q_q5JN4o=u#9GdDSwzboi9QSlX=rm&sAkEj6mc;m8vB?pbLdqDm7jlhaR?I|cGe)p^*-i7QJr4ygygJe z;|_hxnfk{x^)l)2)>QVI6r~?;R-^HID!&dqf9451(l^7ora1hAqV{ZQHibwr$(CdA4oa zwr$(C`S!hC^n6x56F_S9$)lu5!ZPOO2o>S%pyj=R|ETq3uW&m;8#8;i7`i^v zwlbk%I}<-}bk({kurQ$>l;1t$^f7)jZ_jW~C2Md7T$Gw{03F|G<}@?@8G_vwZivKn z0xf*k@LvQ;90fVTG6BIAUBV@OIGJK2MNk@2KZwjg?4_^{qu}J;Bstq!Zi92ewwyzI zT@ts#Vp%#5htlsIR>fwpmHLF0R*+>r5F}K^D0G{GF%31t5rA%5QR)65sU{M8GC9 zzW>7aYzw4dTNX04&0eK@iNcVv(f>z$?r4^XT|tVWbq)Y)RyX6O$Mj@Il=lXA5gUoA zO%Qc<76HPUc?s08gSY_ROmQ=pPsITF?_gOFWxCLLZXE-SKYUwWu?ZVoS`r+9yYNq% zTPj>VLqU||#C+EosdByFE^>W{zvjkvHd?Mu8_wXpZe^+(mB!tkZcdnzrL7CXx=Z+x zu5>p9{>8l|8miN0!Im!?=c5SX&8X5LLjbw)8$W91%EfYsMtOrUU_xf^nJRSRi|?E- z5oK#kTJv;OC9P0N(%sE-bNtg~rYfenBy*!S`%NnihgN@gIP~oSOm-KA3Bf`B;E+O? zMfNs}T|q)y=urB^aKYSslyN-HFS#g1bsma5XhWbvkl9|k+0d))GaqJC8?NnB=;UeM ztS$4-!v_*-^L@IEUvC}GgBRxlLb=sh0eUgsuKPIzP^&ju72RaJXZ<#!g|&(t8C7I3 z=+B)i4a&1CQl!U+n*-j}Y%%|k%D&RwM;uLLOKbtd?UaA9o1yWioj{E2G#ey~ZZ&N8 z&qtH}%H*FCmQ{II+vJM{nbV>(=lDYSewUe*KeO1Gr0{NAY4ri2gm() zpf!bWekO?%2`m;P)GTN~Fi)(+m(LzjzEX_KI)m7*aV3#f_ybvtk2v<_7Y_uz1*p0y z?nM6-*7OBdc51E9$HyCXkKhKrs3zc62{9rLwF%JX&e|yEjN6aYkr^0lbBHE zBSvV=*3ju9_a{n94~W>89yajE!~ucSm*AOI8jg zMkfZY3t|sE($Dk8Z#<83wBsFF$?B9nd14h`i32!y(fj9iwzp1_B%9HXA~qM8Oburj z?2Fgygw*SoK*Ir~Pami6~SB-*IIBhb8;>_P-g2gL^GID$=tsLd&-D||nT zvi2}*KJV`S&dnyCb8Q){sW{M!50{mHb}$-xm$x};INWvY`OYl?dt)L5-00Q9ZMLK3 z!|uX1=)X#P8osHx>yU_VkhGs8;7r`d@DVuEIE~&LR7D&#|MVoH?zZn`v@iBd86AKK zUaSuh8buu5!&AC@boC*791ZJEjA@KbFJ<;uS!lm9*+4TZF$sAAa2H%>Mq3)Ow~aRR zy|0-Dq59&6?VpK{>^cR-bEp0rIpQwM6Y?Ojz|m*^fUJ_gL~o6={{@fZi60W7oEpC> z=^9FMI&30?6Q@l(-b&OCTr7I3^JmRj%^il`400CVox0~0dbLjK-dUCrFQ6fl4&lq3@|m8{chv!Z|y2Tz)r zvr0#4xAI*IpPyt}b!NmgHcm%TEC`47+|h`rR>y@G0xmR@ILtMbLz2U}3wgueF1~x+ z#Y6^6cyuu#Ntdn@N2J!NbGXj%xMJ^ixMDxfayv@YhV&|h*-RVW9@}8)pTh%Ird?m@a1QB`ls$B+r)>0Ihao&~ zXsD_rv1;EiD&CkJr(khHvd^Thqy~H(UN7WF21D#2Xw}HEW8gOXdlSJOe2SKdv_+=` z#2m;?TqWVxLz6k(itI~m;BjUzxZT>jVyzmS%1q|HX?Q+fwpUT)xjGc(800uKnlzhO zj}37`w26{(YDUJ<>Pcb1W@v^jof@1JSWGxqxqcqm1;b5?#{wCcbU2YQPhl(EZzoIl z_mYJp!mZytwQenG2*yu%9)5ELzMm=sLl~|e1Vwp0g*s(5PneZ6i*W66OB#!L0-kM< z>1}Q7yxg%py&Mn{1A~%F1z$HX*^`<+Bf5=jk4*dMbR^a3Yegm&>nBd{49=P{0%|+ce7uBaaOo0Wm^QZu>qxHFI(Lr)XWw#h>5)3e>%qqoeYFjgUk*2ZzkX1)KJu7t}F zebs-Fyr%IEjWIfrv0a^{@I{pSrzOw>Up+r`Cl5_KKph=sytKn~?jn=EVN_Ml7Cfpx zyom48mLw8s4}5Ndw^?fTig{uRxjo8KuE;l73D6`uRIGkYUAZ=y*=6vmV)p#D!kA)h zOU6rM%QXK)YKs2imreHZ!9EC2U@WX~7Y<^|tO46*&{Sl;Ml=!k_|Bae<%G;AnxXIm z*m-FosY?|8s3zY$(F-e*Gy~@TWQ&0AQYboRd!;~jV42?i!7~DYv5UDYWOXD>zuh+Q z5wny#W2+_=kjScVa&+5BebR$GNB zqlf0uB)z3*vf%}cL17R3qCbPi$!TGwu?qJ&a+ozR;&~b(N{sfyx;O$D!mW5xMmfU zc}FE(n_*6(XHIabX=CX1tY*VoeO9w#Z4MHn$w(O>cKOS8+fK)I?WG!q74H08ZB z^cH|?BT=T?*?O!**{w>6>tp=YV8s5YItrm1e!sL@n%NsYZRy3pG5@|1uzeCY32Ud< zlmx_q;ndDfko8sF6`5WJ{g(o&T#Z|D<#6+OReE>(A{k#j&*10Nl6Coho+6Zpph5+- zd)9VR! z#_dk?On1&@lj(4eE;m}G_cVS7j?U(2x?jfkAnC?arA+mjlAD0^q5X`uU@nZ<9*~{d zd&4)}v;tSThV$aqm4?}80g*}9RxGi0-(43YtL#-Ytdsuv?-sLCxu!-@iR`VENyc!hR&JY3 z(CMF*eH_1l|4^pOZ;isXq-aZnMa(+q)gez-@S4JE0#rV6Tj3WSiN zXCbk7p;cE1B&GPpGk)p~n^z#~srSQw8WK#TMb{awDuJQ6snuDHzz#JY67;qx&>aqy z6a_|iP?gAGOzi09PjK9Trs(8tT;$0&H|#lV#y5QNF1maQT7pRDnobETM9HT9CEf$& zdW^o4ycM>uT{$Jzal14c5$rWlO%C6}tqY>h^h{*L3#Wi-@r{eGz5Xb`fwjn=22ge3 z`ZTZ^-!<$;x8(wUqyxHN@7_Xbi!E<>0-vr-RU|Qa^rgQ+XOf|y_S6v+Vf>Z~IDF4F zw+wsIq4zdv9Bd&bSh0rQfztvOz5!HxxWuxD7TKP?L$6V{BcYagI3lCs1#;>2_j`$0 zwKywyW;jA+CpJN&L_FIB@QJmTu`Xygmvqv^Pbq?79Z`|nU-2|IM=taq=G%wO$RueNnrM!L6YC?`$;9PGCvCsKP3<+|Bx?p z*CrWG3SE^ExIi8z6=EmQu;uNzR<)UAlrNE3Xk+Wh-Gn(V34ao-R46smV!^&YaTA+# zdBwQ~(lwD-5bV~{F~N$g1o5+25ujS|qp4LSWDaab5L4t7W~}LVEYKq03{;MC0y>f>D63w6-?% zXe%qQN8sfTeMqe5ifp7+wu;`n6X@#^DS+01OkTy?^Ggyu2 z&IoL5Jf%|aJEEl~@O6gbDVBrk7KAF*&M&rbJ6)gE|huW_%X% z-4At^gFLk88$c*5*}5QpM0b79oKg>DVHf!|O`ri{zs4WI!{4mt-F0ZSCEU>1U)C94 zo1*iMtQ6l`%m5n4q1we;oE~f0nx84k`PoMc<9xm)@|B${PS#S4QI)l*792a>&TW$T zj&sq1pe94!@GqRyk2Jz1ffKnJ6a4M<{)TMK)(63!Ts9Jj#RWJ;Y`NVna$H!RtFLR^r9ELQgM`8Im*NsRM#9BdP3aj9`R7IlMR2U}_hPW!%J6ls5qQd~& z$DvKkw5tfL@W8z|A(xWJ9WP@h1r=UrF*=8b6j*D1dh$v|M*p%Rfr@s0&{vos#DUmL zW<>P*zXQs$C`Rl)&EyC?NE#cCvNiT|NY1RM^GOg~ZRB7w?$_qHMUX5q4Loaz;zSd! z91FUvV;Ze|ax00E!+D}!Ddej3#1K3a2vWG>B0KBzb@hc#IuU$LEhW}uZkE>TC|h$Y zMQ@75CMxqswh?DY;2YE)X=%Xq5ajh_Yl847iYu-qEf$vvES4Lc?NwRr1rcvqwk94d zn1t5Q@r=Bz)ROEFlhZ20y5 zD6RCW)vK)xw}SrX_X8d6q(&kf>G89n@#>PhsiO`H$Lgh4DvVUt7M7+~>uW14S&@08 zTU&+%1KX-3so`<$)pi_dAvO7HR{Urac%5OT!$8Tuu-aNt0fi> zZ~?Y9YO0v%Qk#FO2BZT!IGkg~AK*?7#Dl-Bhk(qF1P0eoCtfTrj8oi)QgSHeTaNU& zTizI8uTY2zgNNHfa(CL#xmVT?*q7rn){OQqrPT$jN~uw4 zDM!*#ZDwAZe#^qw9Mc#$1ge8e{6J;;cpAfsx?>#0cuHHg6zH47vR4Z zmcQx>|I<<{9ky?0%Xm<-5YNJxFA$`)U$VMNh+uP9bGXQ>5@`S!fZtI;pp_(krxuxQ zf+uzQK(?ZWcPGWBUrz#!d>aok@`M>jOWEI^4off*Ol|HSrrw0v`3_@eajJ7T8xo`39#!Nrqd?2+l(Dbfb;}s><-}%}rA)+mPoGr{S6Z8@7Kj4kP zv~%O_73F;cK?g03n~P_g{+O-hOi4`;)aqe=cx8!m(_q#a32Nl+mF-D+RjX3Pgqsc5 zDr8c9bO#)q97(bP%UlhZ ztaX+tNNzYgy~^F_)-U_B8JmXY+6;DRZz^!Nhjs3TdMK&mIX5Y=Q9HI*Tend(_u(1S8n5VmXjS7~w#DhV3+lYk>lv@B?qQ{XPvZz| zOuod+X|anJ4Py0{Auuk>>J$VgXo#2o800BHYa&h5{8krlVtw)*1*9SHb=ROuG)}E{ zX)ba$ny1=>f;ZB+7Ms2Kbbly@$!>xE_%;1LNT{tOgnP*dO+M6tfF{pyyIT?CBR>{C z*)@L-FIZGdhALQuXi`w`kU?PEjn8<Fc>ccSjQKqDz<%@ubFm9>#jaTq&xH(1NPmGSqOMilrJ?Zt8GMTG0HEgm)_`9R$)I(h_!})xRP? z_volHO_}AzPV>*yy&2ygFYapM5L`MzA=2kAe zOi?-aqW$dF>e2P@pqrrlb~|I+uOfssCE<+Gq7`RWB2H-~QF2zI%#`>i>&G0<7_0)> zHAKcVeefS$qNLm^;e5j_v*_DJ*Q=j5Q^VCnnehtUBc!GE{TunVmV*Z;?+B!2bX0S^ z^x_R?Qlc_`zQlGLVAJb$RH4B}6MHYE&Vcs5jjXYPoP&l`X+PM!lmhfE*tNSE)uB_r z;5=C`;KU$TXy76)ur2rd{rwxj6Y9YuYTYm;#d`gM3x4!=(eU_+PPmcGx8Ox`e%~pr z$+w6i$0vpSQDunLoboopA0keG)nBaN0Gqvxs>oOalL0HP7>~X96DK<}NAsqtFGNXD zxwQsh>zq@%!xihlXXR@UZCa*1 z%+;F9GkbmQh(c1)udqAr8JzNq zc%+ZGi&ne9s#nFW7sH*eKECpUeO~LZS?=%|I`TqwJKy9_R*c!n%y%EiEweQ7jE*0s zmx=CV8D^Qh-8YaqFY8(}OO!A6UduoD^qp+iy8lwsSLj&Jn5RK%9W!ezU>5Bk%3(jc zWf$RrHG8A9dgBz+u{4V=$j;|~LzMp{D&?7IH7KwWztCtJ5UA(*u^jVX40v(8L24`8 z<{OoCEx^4xtAEjiKcUe%8E!bj&p64^^m*NgNb8kvd$C*hN${malgS!DWiF3(*odXb z5Fukd08^dJY)EVm-0_``8#2)Rc9ZAjf78KR93~GWZ78Pl^T>vc(U!Y=F2#*;=NfyK z!HrH{315|_iDCDDXYx1;9e1mHtACN^N0fau!hdbG^i;CNA)aLJ1?X7tISgqH&8eXw z2}rh6&)3c(-Pzb6H?dY-m}hRLwf`d5=Pk8M&ND1e)9T1}d6swi;d0tw@JdQ^uPz8g!-JX^+l$Ji^xwX`T*| zHr}3lP3iEe7sSnnfoUI5|3FXBWZXkK(eT;-V-}a%&9FKt<)7 zZ~;u{*pUx!ro$%>l4c*|XAhvQ2)sbwWFaO5CzPU-;@!XAHI)(T0BZ04X=t&q<#biq%tBidil78{f<-opVi?W2XI?;+q_HH9yf@d zfH9I_Hv3ARvfZ@vL5mubq;wfwSNcnwzQp#B_r=MJHknd?-7)6Q7rqrZkX-3BtQWhO zvr%C!EU}ZuNsMKyD~umM3M`Lc+|#tAHz-&~P*x>iCY{OZ*fR9T^E~Eq|Hrah$(_{& zouttgTG}&n=jUzON8j^A!EUGpisaRDg(1f{2zY^zoT$FrD82!cz2{JPaiJ6AF&T_e zNkI%5IaM0l!IH~9MyI)fsvc$W%;f6obw9{!x;LRaW}x8a=^#x0we2k40C@62Tw_{wAQD(M)7z1?}XD!SIvb=><~wL6C0 zx!gP+&Uqb0B?LQZaMxR6qi*&Hz8r?L93w-C^iqg5f)M{`i^I6_JykS%N7@Sf@h@F}Qluylky@fel18n(d==K%N%KDPxHD8_SE*+ab7& z*E1xuX5DwCbun|13?JDe%q5W1G8z%*a5w}HE-b3)7RR%EPg7)YpPJc2q6Bfwixs78 zLsQT9LPuyu@nDDyG(K?&Uq?Me=s!?GA9tS4i^(02Xe^3HMD4Gb*EAq>Z1nYpIYK2(Y9v=QPLXsbx@P2?VCvtG`0TSfQSV#II}F}RJo54bvGy~yAYqeOGl-7 z`)kZj6*2r*Uj$+gmz^YKR3chY=A5!Tv(|eRYDvTERWuiZO{q{h3+60&XemvTu z(F(6GQVYCd(5d8(U3XvOL3`HL^v)PaC;Lpj(+T?LqO3hgkiiyMj;o%mUR0HRj8gb5GaypB+Cl9 z$XRoNb?RHN%Kc*w6iX=};rQ&&I9>pb2AL07+qeO#ETCe`AiiT4!>vsHGfHC_stTBs zA}16FBv-4%h?ZqOdKqXI=ikBMcfzuVl>WEeRNT3fP7JbXitRAlKlV+jIC zlV~G~&4gfHp#O2U*6WINSNhX2zx6Yy_y4RU_|M$zWL>O{4FC6ELX?Vy3g$BMrV4`C z2!UM!8t6p>5dbKW9&_#Hny!HXR25$e5n4N&^gKU??!{~*10w^Q)mo9&+>%$@>AV;3 zW|0}@h0u&^Wn1<~E^jF%0l|PvR-d3^*-@tm;e}8YvNdq6*Ba6O{K?TAK>P? zd_PIeDD zT34XXV}ur5&i&9G0Kd>?-4?)AYCp^HRO@t02y_AadQiWV{AtW8h}+z(EfH3n_miG{ zQ&dxGMXZpHR{}pT?x?V;eJVfh6--f3oG`uS9LBRBWb3#TdV)5u-%xx&Qp zwh2BRpf-2bFu--G0RXH77T86zD!Hb@qvC=iy`yS}rah;zaLPB|H$+qZjvyi|qei!; zYIPkefHvUYcADxOa?9`*CrSsT`(g&Fc-pl~62!lsHe{Bj+QgKm&E|5uRcED~rx2n2 z&EZJulloICM(mnuZ6;?8t*6$K9U~U^Fz%C#VNyw=-rs>qjCcfGIfBJ;Lw$4+8UYy+ zduSTOF^Wo+YE`+Cfuk*}S1^*U-8@D7Gj{Rp5Lf&HnZ8zm)$Ou3ykvI1+Tf7}k4HUv zX=ZbI43Udb8tZKS}B%paiio)g0)*$*0P9k_Awqs;wqqQ>XMMc-U%r2@YZc zmWnXJnTsXfLw#2siC4FkzVa*z_Y(FM*lIx!#V2%mzaQkz4KowBDJls@(67>339l$}q8FbNh$`(2cMlI>mtoJ94 zsbT~1TA*{{8goO{(_bfuJfC*g=XeZ;2wp)9tc~(FPB(BJYlmmUq-`9SizMTIm2as*w>utKUV=f zJxaD#5=yrd?(PU(bhfQo2|!Ffu_k|+feP`+Jq*EK59&wjDJW0dSK^9JHYjMQmf^cd z>DC9HkI%q(CywEl@n_r-r;Dxkf*gw=J}1?oc&sX! z*VO5YGe$Q(qneC~-GXUQ%;~A+6(rh~<+_57&3Moyx>N`Ck#$;vP_1*EK3KG~#4C3w zU6PbI8*;Hx1MrAluq~riZWetxd6@}4qi>IZucH-`Oq4R^c7@^7!uIqbk-J6U^uPtM z2oU4rmW92Md9zYmBD_*Zbdh;|1cmec5qh`XM83+;KTIqMxXA8jaLr;i22;jFJOWQm zV@5O$ulD#z<}?Sd8IZon5s&h@U``-LB%4ktGPkr`dM!# zvATlF**!70TYaw)4%*8!^Umz++akaJX(=%zX+LfMilO}!oS^;-`-x&P3|AJ{~ujbl`7zlKen1*It=|p{gA0tz!+rcC6WkW zf+%p}LV&Nw3?lx87~Gzqh};+`hVHxdnxs9&m%oI{0P9AT7MR zuVQ{jYPqxJc@P+@LcS1WWy*1viE>5l*09(j#$XqaHMHiM@t-?eB_G{d{5X@OS*<%& zt98?P{q%J@(k>AMFVAhxY$Ltt1V20$a=8Sn%$o$N2gHD+U#+&t;jhe(a?wn{s-zXBkYai%@<7D63a zkA9&`h4pbi69+?r#bRcS`q+ycq*YXej!}ChOZCAXQ{!C|s2#_outT%~)| zz5u-po%&-&fy@}isnjMB3Fi}sCVZKH2Mg>T&?y$Pg?7_;TEvF@beEJA9z_8?V^#6F z`3HaWiS&48vu6$Wz^xSLxELP`P7vO&hLy2L?nn zm%>eIUE!R^sTb9oHyh-YCHy{126YI$*%`E5K2WPzY1A}O2*Q#}sU!BJNj7ZR0$zvD zuT6%-433lh6L|5eC$roo-5gBhv|LMdU^medd{XS9e6gx6+&;kHv$3*_PKjqhr7^p< zzx#Q(D~9uq`&auyTm{I?tKcR3<_aQ{T7L8J$JFM^64)qz=Gs|e(mkr~@61QXtK-Q$ z6)UxAN6M5w0DFa>zCqpf98ncw^LHC#cxSpz>(V=*XXWxc?@~#T?)5$^MjF0Fz_y)pct8%KU}P2tUc!WO&D$BO z$B9v;=c)cfGlE!c`#XgGQD5%#{K5Zkm&o==E&&nXdh(ezujw5%qa$x#>Da>G_@X}d zWL!Uwip!a2EB81rFYqu(bs;s#T7q=-ucACn&+Wo%`t0rL+)|jn&Qu$%loydO6*Id! zz=$^Yu6%DPUcKJzA)z!Np3d&c@>jc1Z<-}<`d}wF?hlAeOi^ivbRhgqY(0S4#7+Dz zu+3hY=2g^*Tpi9+qpNO%DLW5Ywv}Pj3d_0fed+FF$+SnZguUMC7HNnfwg~arD+bDF#x<8os33PxfViQhAF6twjI_ZuYQ%0MBcX8Gr3(E zKHWi-Z*q>MyA=f_rwt~|r^UZ#SoNB&l+*U3=by6OIQv6Q;-hYVyu3NxcEV~3l?`x( zArc))I*L=ps*=H@Mg$=eCy8Yc+0_lWh*2f73GXR}T_>!%7e51b;HhjZMd2D>1DL#0;<_loKzBRV1pK=;8ZN1CZWZ0a6{}SnL9Z zJtlq0cNy?K8-5M-dcfb=5;l-MpmsbeuyEn0$*~JaQWR$t9||sLs<}m{S#{y7n?+@j zyu(#;1Zb^3Kx7dM_$$w=6IcwOE1f7sD&?qZ0C`TXSqobL3EZu`$g zJgOSCngujmfgL8}6yBnibUFks=`^%%6tZl)t(~0nqCfMgri!Fjh^>at-<3jCOcX6w zdP(539L^b=<-v~#I7gEy{nZ+}J4;Db1>UbnRp)A+p|0sa!wDH?(H)$SOmOjQaz?Sn z#Q!8vWy08O1&xX4em5-i;Ek;8a5w^cTw5uaWH=2r0~BbUqCT#FBq$d zzX{jwzw(%d+yXTHI^)6(GY%-Wls|&`XNA@GAP5BjW-QG%RT1-Zv8=Is7Z=wxK9Zlx zLHVe^`zDW}$S}JLO;?83HIl?($ptzNJ>3>bVY_s!j-i-Epcxm(EB8WCg6`gk&bh`B zRDh3?KXE%u&KaTj{x4f5Kf5bUkPzY%jc5xcoHFBvjh`VUg-0T?2+W6f0ELw%Zu=?C z=$GV8_NtAMDE0R*+s&k`am^qH0~L5XfXL$rvAD)eCCa&Z89b=U@O^2 zEjAJBqzvsBFM>*!GKI^Pl1Q=P!d0Y&OOe^n+6G7exQktD&bfN=Jb<3d9piVev3#S$ zmPCUCiAQCP6@}FR>B|?D59gtsT==AO+D=d9_-aby_@xjtH(Xc>Gf~IFY;2w)Q{e2x zY%MMvLy6O$mR6wiur65A2ue4^+Sx!ayOgBfW)mv|12y;ey+J`)uRFeg6zO`sZ@OP~ zxLU%k4G1sr)3G-D*c92iaK1kHRI^W|H=OdST+%p2G-f}Lr1_6ZN6?)*oCElG%r54> zp4-ir-*;~F-R{Twb-&%qjcGjWOD2Wajz*lz0qHB9R5oX3eBDP2LlH%o*lpWipJ(s+twma7As@1uo`j`a!e99}YNZ_TJnj1w-XpTR&3;EvNLszBg zjWV057dLF)NxzLzzO)t%c|-hEljnpriMiQ4B|v<)7X9u9a%hJi)rxIRUz){fc<{)% z);8UMJoQ52M|9ncuPcv87;jKV7oH160_FBdwZ9#t6(23~(MY-H{l{U~pv-lK@sE&< z73Du>#{a93?7x`C3g|hQ8T^Md)=G9<28bRCtNGn@JfCZf*AO-ql9Z1dj~W31LEvzJ zI|dGz`)I+GgXQNEOViO)QOmCX_fhSsB?2**NK28vO^%g|XZ} znBju9iTsGiudz+zf3rG9#QGvD5d}8oJ4~1!n${qCWcJJ1{(=d*u}%y12TVgZ+dA>G zIl4dp1nOa)0(TiIZ-h|~BxY|vgi{-&F@45ZB(d8oxpHbKs;xryzM&~%g=v(P+&$K& z5hFNif*Oq7DgWh0nmgYh&^ z4MgVh6L*Q$!3aP1sczcZit@|qDje^M%AVu%+BisPjkeW;Hsx%S674xOt5)kn(z=iD2c<3oC>W8bSXjE{->Fc*0P<*d=1K`viWWL5qVBsb z8RtD4$I*mVDkxf$1tb;1A7uxH|5jbqUvinCI{Wn#uRCTTXjhZdzXd+v7NErhHe()l zHj4=i7>l0B)*qz9*;rHt;6)aTi=Z8pG1c8Bf%kVjHSNe2va>zk_~yV?Uj^j=LCyZg z*=^0#-B<+sTgChNPnf@tN}SezP$m9Ln8N>Um{K;@CjV1l*2)0#!v%i>9Q*=t1K~8? z7`loiiC2x4jBJgz<|0idKBu|Zy0b;$@r4!c=nVg(YRdTcgYmW7=ji?A6=VlyIdFKa z6x)MEM5^Hpk0%r&%H$nqfkz@CCyVW*Y@vyz&Yooe_BN>g(IU+l4-i#@r-s4O;_t)OO0MWzX6?nj)dn{-NN z8Xb+3Rcn|w*xxx}ozZ%hIrnE<0D+~hwq+4)1AnAf1Qqe#hH|foHlDYCvcv)Ch5tuj z{%e-}|8184fn#E9?+-_);BWsH-;@`?jmKXOw+9F?aBT3QYO+I;YUxfRY?O?g119@B zKtKHvdNF8-oeh)QNAK%6UC%nduI!}6?&ZB|3=9T<%U$+5$aL77sM4YF2Kd6MrUlEV>iAB}V&5M09g3Ud+x@VHXFcJIMG$_U-6Y z04E22*{DFt!UP^feaiDt3fwa{}1fNfSl(ImIBAc#XZz#Z>{l2^^~vnoSt zF4l%=XReF>;}O}143$0ggU0Y*1|t1`5uT0fe}Gk}ye^NVf}~}FhKA-PeY^fZ7*dRDE+Z+hIgGOjb&o4tVK&{9?8?FI^+*zFOEF^M`E zm+4;&;%0}v^CnYUCYPPd+V49yKA(4#z6Nw4b0YW(3)q`=1xihmMyD+d`$<@vQ|+l9 zMrujcN1A$vWoyECz}7HP*<)L?$&ZnR>k+A=ubgva&@eXKW8PqOS82f^+)T_oY+PhB zPdqZfdVXIqec?I$c*>*heE1LzKVC4W!5IzJoW|l1q3k$qMV+Rjv;LP!$pwUex+^q{ zF!nXh;Y$pn0ili77g0~W$r$|27Fg@g1rxb!}o1>y{Fn1?oFbycOyn_%Fads&}VT~ANHe7>S%32!Huovg{ zR}+xWG+N`9(lK7Kfspz;B8AlULtah2M4goTsc`oFVvrMgNk|o!q!CYt21A8RBCes1 zt5}q+t;j{TqNtu`ZXm33)&XniT3!Z|f$t}yisNP1KX!P2%!4JcEfeuZ#7(<{lM$r{ z8_SWaLUKD3&)1wdm&l0{3`Q;~F!+3X3CE8JuLl!JJ!{ij$eSTRLp_<0Ty`|0a*Mc=jtZ5cF zL|*is!bEkK$ZI1JVf1K2M4@8O<{E(6zBd9A0cFVLvZpo3oM;j4pnQXN50yB2Ci8K= zcn}zDHbJIeZ9_l?w@O9aa{IJkRcxyhb(q8J$C{VYFYOnrnVV71oKozVW`C3?EsuQ% zk3)UXNt&;FvJ`oh0%0jZZ8><<4>}m0%WScBC*fwM&Cx3!sl{-my%f=V9Skh00<%xg@<@<{8d-9b?y$I$zPEbI52iuX z=$B^O?m!dlDg~Y+S-JvQT0;I~0mfT!3rw0I@9|@mA@5#(ht71f3*ZU{cYyK62f%fE zO~<+iE4b@%PACZG6BrnKV_q)Bx5_}%O$h*j^_KdxkcHJS&!*$&M6)s8M{G&as8 zJzG9%#?;7(*8csbJQ=iWIu1VWJa?12?vV&|FHI!QFV4n zw`hX9ySuvv4-nkl-Q696Z=B%n?(XjH?u6j(9^jI^Z=bKb?;W|_-#EW`_D^cms#>$= zT(j_(Z?It=#NG`~yH6@AbI3`P&ZrtxxLG!DF3$O8WJ-pqoy;W9n-ZDy{F%Ut^0()i z7TVQIwA+;`#rcDZn2o|@HLxaRf0|SS6Dtl=#CU>$+xmX%4N%eLI@-|F0lD=ix`I1h z1DU6DuS(83ZCqj{eOqEq6Xoe0zS&|;Q(G+M!>*>fWfTqvjlkdPobndeOUQMNw7L*{ z`Ap;FPJ^f3+b`nVmqC2XOqRI~f*c(5L#JHN99D;Ka9F92uDxfCX7Fy|xUg+`_$d}+ zl|hX1>JqjCR{t&rJ?a~qX2ChDyUZ+~NF`;1%YXrCXqB__TClFI3|* z>bv!6R}}wUE5P>-qyC3n_;(2P`9G_^f@byxPL_K10#3%pM)oBCxby!-3*;+nD4>X- zyr!fZ>0&C=5rN1N61J3$=(myjfoL+Q)#QBa%i5b6V`JbPt8kEGL^VKy>>!2T6Nb8u zQoPhJA(1NzRl4MPBRdxxJ6u*%C5fks2}(ZWD4cZZnB70#csZ@q`3hO5PR%sn_^ULT^h!Yk(RQwe(e91q_!D z_Z?nJ2)HN(V3;ok)r|_lfU~7b2vG{E5fb_{k-7qWVP!*=&p!1y!`k0r!r`+A-lUmO zI2FPa*86Yiy3ay#QMQd%!8E3BiJtKFHAa{heW}ACEi#7a-?>Md6VB45zD%6MaA${K zW1ZPtUe{iN%vr8?3tz~&5Rc`u9vKNf7JN-Wn*9j78!WoFiaAGl1`~Q*an3=X?9e+` zB|#@UJ%%u0BvmUY2+D$a1ti#;g5nNce%N?Q<8;{%;XL|8ZMfjju+`EtgD~n}kNCvm zLZ@&qk9DV?$#P~wky-cnK*7$#53Ntx91H3Ag<|<5Qs9JxCi@yDEci8I5C+yF28>&R zg=E<4am$bx5mh7u3u$xxpw&WisSK+}^PUBOYd)>E7E=b@8B^Q1C@g=G0id;7MaFea z%Z=78C+cQ69&T%@Gm?)Mq-8y;xvMzs7-<~3h6X6FZn&u>&sFG!JBj-#W9q7Ho&(~g zIGktuLdBZ)rIMv%0AX6H`?M=^;Hwsa0&9!PLp*mXo)wq2Qw(!fXqI&~j|Jz#SP zMUFM?t3Ib-NUI}r)Kda$6-oV&9Ai&a#1V^Sw3-ze>alwyKu)b+Esc1`kd2rmxol!w z&Kmm)BXS5mu#$aZ2P%@*tQX0D*PW5AUcg7JFJ1*f*KETg~hDk z#l*!KGeb_v4U#k+__CewBKjZEWG^vV2bHV##fqpMxz9tvD`xr&JD;z)+&rGgjoRwa zq;&jco1bZOE*YDdeq49_)Stt`tr9zI2CcyQFKZ}=2p za(IJZxSpt$0bQ~dNa<*RKW)+go^V-1vYork3#wGbnTlEp2t!i;04$nb;c#T-?4Qc%B z`}QDvJiR*~vX`5-jDkgM5B#!)7!_4PS$^1Cl8ElldKMi|N}H5d!%$d<&`lEdkA8}; zq=#43>X)qLF9Rm%K-7gupApXG-xZbS?w`x`c~bS;RX{9z-nt5ibdj|O$&T*ze9P{G z$6bU%Cclq=ZUXkT%@qX0J(H$dSLo2=g4Mqa_^G6 z-*6ypG%IZH-D@NHk2?VV|NJ)W{vvGuwWj`qVSQ0SS;YJbhK9DlzW^G7L9I`!wQxj5 zKqdeQ5eCYhrA82)QqVgADjbyT#0wHzaHx`!Czbk@9cwku3^|s~$`3F%?i zfUlxi_>KktUMBwu>8v!NS=%Qd)U>4WBSY0Md~8z zG1H`Zd-a72I!f6Alz;@5`!>Jw3O(ASlQ@IpuL<}H#%A;`4^w(rkzsm?KGq+3fFdCd zP;KM7W?^C{TbgKs=svCkxr5*!PEq^pG$f@Q^Xy_|4AOKgjrSYGUm|*F0kweMKzt&~ zQt6WWy7;61`JBAsJ}b%+j;F~r3JZMkuqZua2qvNc#ZscRBVLnf&C-6wzTQnZ6;XP1 z=V#j}H)mC3SdaQF@3>R)HfEk}pKU!y>|tK*W)+OhXMQP9%LWHwey27EVIg#PqN0z8 zHS_w^8_{TU3b|~M3WdjEli%g3O08?BZ9A{w^7i-XcJ>h z2sR!&FN*Xb2Ah}lP$5tD$>g~W&|p=%b5rw@hK|45%4ydEQYlB>^}k(p*iEoYPF6vE zE&W9E;407^DK7wr`XkyNC-umZ$xk8e$||4OAYl;A6_&R+Yxyd1&lO`va(4KP#=%mh z9|isk*sP)nIxu(p93sq5N%EN=}ep#r=g^~0@Es3-k z(!_FwNDS3VpkxA*kKs(dr+jz75O)YoEaU*J)i)Job(1L|%h)njg*ECsrL-VSeh>-A z3Dyh)DogHhbo-rlfQ5^Boz`ZSW+E| zmm8`@l1pOnWv#}s0g5-)8NL=}37J&zt5EJK56p6B&g=}PRpW1wLm^@Ba;_T;H^g+9 zB)z{*LV%q|)xGPa}if%N`XMG?yRvrd(qsbTAndz9VbSGKR?lwS+sPF?Is!cNv} z9wccw@0e@=UODGlVc&V$Dzie%Wt9ur2{NfVc@1b(`$`4l0svO&CITxH=6m6L7@Er{ z-m)xb+HG;vmMjIZVNxKsG%5i0SxjneL|BxwlSlHpv^jO`LgY3$iy!GMIg4Kg?$T+n zSsyAmjn&2=V}hEqoyFU+WaG18LI!zf2QIQ7C^9DDdJa~TK8LdKCAB`l*KqWW-= zG)T|l9;*7Zkobu08vEEnJV+WO*1{&inq>5Y`b0>+O6zOtoA}7Rwq&(>iEdMQX0+wJ ze%?-R;{tIFHgE(#pJUk+?xb^!?ZY>{fhswKUrKBW+34$Sw6%nN3F#w0fIqar5Is@v z)g_7^9KsS-In-o*6`kY}03&Ar10kL$MhgFws`L;%P@>7>9Gr5r_a4vac2iX}3Zc=t${ZzG^3&(I|v zi`ffTl)mr~&(r1JNm7%4d!ls79=mX2t?!U4`yeBo@CD8ICf@$uWxJT*yvg~s;$uIN z@aFlVzk_%1angSQH4C{#n9<~oA!XSU#))#^G&#^#U~F~DgFF% z+MM0X_|dmV6Kr&7RR4+IGD0#Av^^K}Me)d!N{FXzLwAIq)P<+ z*^FN@CJ^C!W)t%YaeHPdT;%tqk9x$~zwZEXG^^iK2SQl&qtS@tb5T(osqU*mBZ7&y zFzkvmdu7%AU?DXoyPygv*%N-^>+fpTw_DFbY+p1|ju={+yDS^&rIIOYfm(G!-Aay6 z;mc0e3U^Q5gWmP+#2=rWnWaQiOcu6b#&U9hx}Rxk!;A>)qxZT+d(_I`grXCJW_AoM z^l`_XB(K;GY~b!tGUun|KP>7;%lolv#8FgHOAd7kXEdM#dDttv;tFW{!7(LUHJvd? zonIQvyC};thKnol7GtQ=?&T~s zL{J5xq8Bi7qwOwO206ICQZ@UvEA_X{wJvD=*VUe%^%ka|+_2BnvsHS)U6jQXpxuk3 z+dAkv24%l(Zr#rWwHxBzsE5mgXxPT4JkiE9Nilin#AfPac*B`f`9*OSrNM9Cy3dg6 zYe&?7IF5psrrRUxditi0Q8%|B9R5*Ja8e z^CJwtX}GuFeG)Iv`hlFIw3^c%N^pfBX(|}U5(ClQ=OWQsE)vPL)>?`$;gyY~^YHPf z?7(uXKz0?*=tQcZUlL7gNLamn3HyL4MvOl>dDqM`=-@u{gV-O z(iXmfN`|>01M~@7M-t2ex}(Az5(XML4mey+!MhVl3~iV~wV-YWXW>tR@2h^E1F3pv z@(Vo0iD4P*&0C$T2CCF?Qsh@y83C4HkeYg`%{WDyhJBcWO2AlT7%?S0fW_VsEZ1*y z77fIHOU5a)`_Apm=ME`kcDvCmXKUsiFrA#p)*UDA##(Fe*GO~^F&n#D zMRq%QX0QUgOhTzOJjWbW&bJ(?wXV35t6=`~lCE;LUc>6IdX|W!{j|&&K^faPD)V#M zSi=Q}JVHVr%ezB0Jf3qf5%PV4sB|ND7TVBu_p!BOxmq<>(puRu2pfd?kP=3V(fPSx0|X-%+&J5FoS!(etBY(uRYrXn%iMU?u1{e;! z;uUA=2+2!*_xm|0lJxSl`4dzhEvjoE*h^g>{@Z1^_r0T@HSYIt(A5p13 zD-bunVph6>Y&XQbk{q!s<}wPuuP4hAOMD(Ve=KwC!*4@N8|jNkz4vDWbANm`!1KRP z?Z0OLanCZdvM7U{iS4SzK5ZyLP<~agMnv>_1|w|K(f#OP#GUb{OcLVIr%)kp0dEi? zDM@-Pj6YBCjkp_WQ?1Ebl1Up2_t&mDCU2j=(QkejBc7~MWI+NCEjGnkwAAAHQP7X9 z+^={O6aT5MdA$6KGHX~vK@vyr#-?MEI6gHtM+wK+Qf~A&_TRRLnF~Te@k= zkn@qgEL^|1UrLGIg4^OCp?$JFF9X^mMz6X(K;VM8?8OC$5CjwOHdlcu$I$DZx}IUH zGa(2-Fg|$I8myWDTI*f#W$LvYeI;~cc3fbFC{WZY&%*?o{^@KfF(7m!29cH7t>c!f z4l_z?HAat{wfsbTOKYNASHGUX>}OISR})6Wv}$}|_Y$SYu+pZn3z$_sgB*4W;*&`~h?N>KZD8DJ!YZAkBVMH$=xMngI zvO_{Ec1*`#6lp|^sOL%n?B*%ws*(fq<-ic2;Bil@TVd> z`1nhvxE~6c{B;4H(WLXLNY!VqH0#3N?y(4%(LsoJ%db;j#b6qB7c#(wgI!%{DAMjUZzJUCiwP687qo3XnS>hiT z+Kc~}hfKxB-tZso@Wow@(V-?h0WFVBEHg8AzBNnU-DhTYe&Fsx>#bO3 zmu}i=ptYQ=1_-qD*n-D!X)Qi{hm>g&?u{uhacF*Sp>LIG&m|^=?pQzIs&Jt(#0l3c zWCf2y-NU}SC31KAU z+-V@kSmG75yqK_uo(mJHRkS4%rqV34=2*~8%~noBmp3o04zNUmZu-2N62k1OIv|8A zw}ZhFkKTLD0SrYaQgjt}u#r~R!$Pqf+cpc=l7*U@&*ncNrO-4NN^36c^(xS@F0+kQ zaV+{>7%Ob3C}ktBKto!^GpB%EY_twEk@!VaZn)50|02{I=lQ_eG~#O_ud=#V?5Y(V z?M8Kfwmaia&%`9T3A6<5C?b8^c4QQ>%vIMBhv#>(np^)4a;a*Q;y}k)y8z3jHK)K* zE7>%;CuW){K|SE*vKFMBX;T^lP#Dr0?I$iD#b*1^dHY>1I@EKPzlvu)UHMp zzia{Lls(;3rtwr3{SI;&pyMXao=(CTeZ!Gm8`T%z2&Zk7cSX<`Um%QiHiG<+B*nq& zS!=l8sA|6_CD{$Jq|l z30M!%M?!)nB-(s2bJ&L9gn%NDB1putk7Y}ZspGITG_86%u7}{AZqjc8-u!&GX`yJ` zRx&Ren>%J)F14b0Uwz@1xm?c1xF^TbxgMW0H{XC5z+&|@Sru5V?X=KaEKFB>YJ^6d zX{;4b<`Sqi^$P7%@>@6?3-D8vjYi6q15tqtk|xI_Q5GNBWDeIQ@@mZh7KL{(gk4i_aDFPJ^nk|q*b0Kt^Fv4|iVN6Q$|oqjLi{nq+l^3?+~9x` zBF#I1>UISwgw(P`;z;Ev%S@%8s2_iiQ!QJ*!lX=)kvN6xl*b4vu7yR8AAvzPo_IDk z!QhB$wJ2(3-jJfsWT}m62AXLgkP>r4$s6k$3zJShCeS3*U(`Gyz~h@^R>pMG|F-!I zN?*v81hvg(|HUQsm`;glOi5|!?&9EpLXhn1LaNx1w#7<51}&!2{qylp#;{~9r8%5& z76FQYDdA*SDNdnrH^tHn;RTNLRcFp<63GIaDJbNvQhnlZ$3pi=C6 z*YVB9ggPaEt_o7F9K)6bDq~i+tQ}ZE)eS2ME`(eExN;l?y564;^0yM=dh7@TYn z(o4mxFxrT@Tx+;HEa*U*OegDpvSD-Tehj)scvE%#!wU*f28*a~61i5N2S`zL*+a@# z%`B(%uecdHd>^$5J{>;u0z6frKYlZ2ar1#Mh)MiPvKCD)7$h3=<4Ek}0Q-bO9wQ%v z17GoSbMQ@RAc(f32%iu2R$0fkrS(^T#`cWzMj zcE9pxAz*t)Y39Lia)jkyLQaSUZ=S()h_Jc3Zp7}Q*-wbIzwC)I_jOd;M}ytj$9>S5 zVqK4@(@n_Z)DKlQ!;Z7<%*ev-(}LeivW8cW8bsZE1dWbfp_x9V!~6c~uy)Ze@2*QA z>vn~_^42wzdlnR=>V}GmPawlRRyoT=wuc*= z!K}t)_XX4!g>dKck3WCkiKB}(@*>{HxKR*)f_wjEyZ$ZM`nz5K{{HuNZSxE44P?@` zR6`tBWJg zb}T2Su0M`5$C`P+Jw8Hr0VQBAX!v^cpeD)>E!|58LIq+Ahdw`NKQp3LL#($Hs#oun z5CY?s_k)8ApdxqTJ?MGT#6b>Jt)2kaV;8+R%!pqHXWFaSzfDPH)z61^ybM+_mcfG1 zIm=5LVitI?$WPB>YQwUDA(QnUC_u0&As`%+JhpQf~T_iXbOu zs)tBUKA{lz0{ots18uEBn|1O*g-e#=62L7DY>~(+ZgR4vtOU&jKoEKhysHX*W zu#yA|x0jyHLx-%>aIb7Y5@`d!H%6K4l*i|ck3HF+_kq0H^Pgdsqp#N3CFAzLet%MV z8qim~`75d#k1yV% z%p}A8Zs%i|BX4Wb8|V0>!dE5c7SJ8856UxZ*hp2Hs^p0D^1-PBFhFf5%DS3zvfT*t z^Ob9aix9I=_N5gmL$J zPK)AE737#{);irLrJ~8G8!1dnC|?cju{Fl1&C{%;=bI(H-tz~rPa#z0FY@R-7qF;24P>vNZc$z>lI)Qv)_7RQS8j`*oFyLt{=5edFx>jca|eDUWMVUz-RoT z56gv0Zs3y66o3sgQ-RQkGEP=Ok2X2n6oLrZi;?eGt?8*DjADSa!XOP*aS06A0OLKx znJTyx=NLZT4OeeiduR*C_yLrZwI}PfLqOv;o!Z(&KBS=N6-nr6YMRoU8;MqmE5$xr z*^*sg$lWEGWIr~Ng!aBCcXBHGI(B7f!Qc{2#NLg#7`j-swAV?+NDf6bZFf)HyzLeU zFJxi{?@nh8u+R0}MzO#z=_Kk}Hp5UO98$2U!VntTke^gilY1#;H#LKzn9f%V@7#1~ z)`NYNQ4wbqYiQP6HBK~H+(WSMl%A?4RZU~97q|40A>d$Dd{g8SYbrV4+wI{%WaW$F z0ZgV;3t+#39ZLOxIsE42V+*WXV-o*C0*~Nu z9zj&`qKWs@6ar56cM9c_<V&B%SFe!)DyKf=8KQ1kl_`tMzv`ghlO|N8fy@q1+m;LQq78b|PbX9#mX0s(k1 zFiRGmqO5-uk&t2zMewLp4P=F8YuV|Ayk-|DxLx;!74RSy#3AJDHK|KW#v>tu@5NXPDVOiKQST+ZpSH{px0}=A zr5`dOD+9n~oP)teYZ=%6E@jZOODdJiD>f>Je&_6~(C*u`3nmwmtSdL%@nzVv5-ZpNJRK2lodz>@Ef)ZzHk-O*2mgs1LC>mfB zTb@`Fs(MSwVfG7}!D<7bxR7N`eM&kv!ssz9Uk{6VC3PN9%LiJ-NPITpO?ZE=#i|YVVU{+Zlf_Pd)0|zVztahB%dT>`fk5<@7 zF_1<|0YGLbpeXZ{q=5N1N1TRlLWAUePHVE*cvEFZ)`>TJDb_)&wC@10p&z@Rfrgz{ zqzy`XML;jBP9V3*i`RCgIJgJ z9cV}sU#|a1p5GxHRdBR*JvCr3TWUrIZ75JdYC75x-_%kV$NM*NohthFS@=D3{r}h< zIR87K_kS|?@7|!OCW9=8@=CX!#8l%ifyj@rniD>hGb5jX6iXI?4MuE}c$g1|X{=iS z9MajH`NN;AfFuPY<3(=3q0nHpj(aIZ?2N}D;oQ?C`SJGoS?0s&lAh{<)oB3N8cX1z z+CZ|cW_B}bkOrv=*KGi~Cauk<78CnIU8RQhUcs%tE(~5&E(k9Zu6%XN2G_pHCS&{3 zGQ=zjX!6+6pU?|zF0fvURU-vM?;JEP^zcDFi!p|Bi$1bo65+k~ut6|Wcq6MB|H5$9 zvXsAx*i$MQSYURgSa;RJN8=AmpA|6CxFWx0XJ$8c6Qr=xaLVMY4PB4uj zt$Ip#O^1l~6vZ9j4Eao-;p;lRJYg~V6;4L0%I@^{MF5t_Y@l8Vl0!O~IUagu!kr zC^|5knMwfFrFI-e@jA3|bqsMu{f6yhK92H%?O|+Mj2MO>p@>nw^ylZFUQa+W9d#cl ztUg@(YoOe*e3$})i*`h{DDRGL_$~(}O`tHTZF53OR;p@~znS3`2VwK5O=$V-LVx85 zA4~E)C!)Q`;M2|U{QIrG_iLQ_%KHiW^2gdQ`rnaQCi}o;RCXMPr?L$N`Pp4rp>?IHSg|MJOQu1KEtqy;QSmVo>IU1D>at_26 z>v1e@6H40pZgI&Nsn!%OLH5lyFlyITUX>z#@H{gx%zp$spm{pY*T~NJ2%0hTJDKl*hw-D?>(`PYQd54^3QU~`sp^{Yx# zs{lvN_6Yk5!rp2mxsDJxZgGsL_28igQ8>!;UL<~Th3D2m!0pU+o_PxqgrSeop7b^F z=f}3!+LQcl$D!K#$77ED!iTitGEbrGnk(G>&Wn8%b4z*{c~82J)rFK0@XM1Ikc!J! zaL7!l$4)F-kATul0LubF(iD!rh3MfW@JO926IfZ>&TiR}^4%d^XBuZ4 z$etWx%(cdZMwfO|AMrj2dCJ!BsL5{@S&?zP#c7@eZ_osgsh)*k!#Ya)$a}F;hVuHG z;M5&?OcZ_3-jF}mf3E*+_Wq**So}`d#EzvJpew~NAipIvBOz^ZiD)!2aV#B-a8Hef z#1_Nlz;!y3SI{>ovXrD4Q~igNZ%h-XbhLH&b*xfn>A!P!&)ECr_4VB>EQ6WGG{L@T zr9{uRm-W`bnoHAeq`@2wcXw!)&Lu9*+M*(R1$30gXuX}sTI5#?Q17bftUbvAmqx#v zH&9|!tj&WMQ6#&imsFdduBTn6!Q?hcj`Zj%_0tYB4b`jWVMGMMRDP@V1knR*?JSya6D@wW>g>1n078_>bCL!lO%WXw z!W(9gQGCZBz2bOw`SbKUOvjsVX}-IdE$K%~I?Kw_^Ixc-%#eFukWkJy=GiucORaK$+K z6dBM(A~r`hzBk1L6D?MtjIGcTPsn0PMQQ*R`h^s4*p&iBZ!l06HN14VLC~X2roRxPcHZ z5CDW1`Jn+h9$R|p4gI$dFGH!}5ovngsgrSCh4+*82M7Q@C9L7tAV>>RYdK}CHG!tG z!bv%jj$5-82>Og{77Pvx!jF?{5Oh*Z$NvN@JA9!|de$V4YmbsqU1Sy_FP|z*B4+KOe))Xk zbp<2S!Ga(v1v1-i@#SKUT=oEML$=0Gk@(Xb2p)kg%%S>iWLS5`w)8Iupo~w@y=<=h zq4{V%#Hr$5lTat17?0A0&xCwgJBX?jXtNn;RMY0|hYtJv5JK zhXP_m2r!wweSBu+8^Ki{Fh3Ke~HguKmN5<=EvFm zVxI>xM;ENa8Ogq*Tu#oFtje~0^n)Pm7K#J81T|#5oY!g|i<#Lv4SgtQi8l4z0>2Q% zoU{rvh-9ZWo4L!#c%5*_a9G{+{`v}3O6x+8^?k5oU|XFp9QeCayFcK-eiYRFnXUBK2#ypwmjP#S>1)#^jvuA229UK z878%eo}7H-+k=r{^pGO#k2o6gPMwL-i8KT(#~fb+BO;i z0*6G}uev~v^2H*X?!t3`w(S6iWB$6#8k3E0Q1r;0FqMzZcW$9G0^ksTw5 zXjKa*tW4{WY3+5s?}G$h%{xjUZVE>s6&IInA?1|Qtx@bS1@{WAWNL`7H(iLuH2=Za zJ0+%+ZVr>EH-mC?+WuX_Ok>T=*6g}~*m*uAdkXufr{kTj<*0LigZB~&Qz*>&5^bW3 zr`WxEu_Sg#+q&8F3=(#O_>gr=MU+#JN5+M09vREiG~6`5|Hmu0TT0n4xe!i}Pq0%* zN>Lxf6^*6kipD$#=Ty|m7)17INT-R{x};hr?!OfHcYewOk7kN#3S33J!ELY1Y8Kzc zhT^leaX&*5PSk+N6xMXQ{{VluZXLMR43$jaftJfqJVG3oLxqi^((E31J0dWGZM!|{Em{s=e2aMrBLlpMK70i^_C+2WMGQoK_&d2)aX-V; zBt-fO&bPjlq8SbJQ9foKL?sDb%BCYl{J6ps89}cIVyIM^*crKM!N_!1__4{fzd0GCWxbW7)JGSt2Z9NcV4E>7G<9uSw%Xlw2x%F{>lkW}8 z7LJcmb85^oU87AInRRhWCD16W>{NBFXlePm!Zt8{{5WB6p^3G&iiX9c=NH=sYLJ9S ztw}|Dt&~x2XTW%T?694$rTb)RP#d`B8mZ^FNS+J9jAMO&>yf=tyz8&=7Dv+31J0J8=9&c7*>2zrQBa>8gC zv}AK_lZc}3&$=kWeE0E#fI})9IM$p^cR~$9IPb>8F%CWri1-m4>J=>Z!nM<*He&_Q zLhX#N8b@ndqV$oRUBH)3@oKQ9S?H4*Eo(|42^wb(2(ZiC`g~;NK9hG^qLD)YD^PqB z7kVEpPf^aoUt#;45gN-2Uxdo?u#h ziUSC(xqe_@+$X^{t!1JXIYbMTH{tu2;U0pq1a zg+Hh&#Ab6sCvDYgJks?x;c6+YWsw)POa>}5@i7HUq(mg^>5pKnsop2(RAW??&2wf@ zi!6Gpy}2euGqdRmDb`%|9t#ll9+IV?u`8Q(lx1c)X9op{{fTmY6k0Z~9=KaR(Vg_iY=A{GNeZM@c9@+|C()X22hp<&3W*0#h<+Ua5%xT9Dk z$%kW|Y6;8o)TB6JYq8^T1(ls?QU9 zDd-7i&*l8ln}Sl^Os0l#^_)psHDh2pMIl{5lwNbYLgWS{XuBY|6!lxu8yIf2L_0Uh zhMqwhEg&iJ@K|T30^(eF<#i(;d`8z_jOap5)9&TK-Sr8o<(tejb|GZIXU?Amr!xJ0QzPyUIFqHczqYr6Lka&{~;&XF1`^q7CqP$uKU3b&&`+xfO z4U$Trg6@a>_n!pi9ZL42M?h-jZiHeYg9m*Gfzf$$-we`8JT81_>@lDPQb@Rx{jQ)! zGyzuMX9qRp9)>CTQ6j8j#vNO^hedr}cn%N9piFu3bxT7;WTJJvLwkr{TTK?fs8ISn zu$3Vl9#SLeDpCLs3!P9F1eY6#Xy-T{f%0yu6)mBuFv3T>wK7#Ns28b9?1T<(NSP;T zR9lbzaQ-gmp3s1Jcy<|SOWd^GYzE-+vG(+>?cUl)36G0ZXu5nvf7ru>>Q2~43bEbY zqCfBgwW6bAtGeN2i*tp{y@GkvnfA~cVa9HHdkP7%1IX_Ckr)+&+oB|hEO6X(0g(F` z1#Adr?)CjFuMC|64M91*BM``jpQw2G5&2xF0UNpjFCvE@XhNIWuin%sD0G536)Ut{ z55}c~?PJTFJPc3sb?6zV(2f7H+zT&}KgN9rL1NHn8`sRq|uu>aIu9Yx6iSii%`!l?0T+FUBml*59N*%yu*WTk+y*oQ9n{{Al0 zG0oO0h|-@TZydSMJ;PF%!k97ey3qjJq z;)^aS(N@*_v3<8ifDQNTxkrVqNI3o#MB+wv_%kp52FM77AvJ|hw!n0$DOeP%d7&z+ zIbYRX1TS*YOe+Tb7E=X~910NzOsLb<7Xw@(lsu>cLHpS~3n<8O6(^w`Rd@`MD>1lH;KhYg19@G7r$HcNnCbNn4>+Ak~=ZEkfLkxv+ z$9N6R#lSPHmB=c~=my*{Y$LArQz(_CL$h&tt#l1|$x`lJWvU)1Uq%{36EY}l&!9pl z>#}@w32Xr;rsf_@1PjyU{A5YGUfY+kWI_-O_l+pv>4*IuZ`)aegP%5AK&hCpKGcSLt1#)8Pkg zYQYcO@-EP!D#!5UI8GUl;*o%t3BbR%`{{WYhgnsRU!3Hu!MxyTH_0?wK}Bs`su<7E zaDJ@?CB73&U012DKd@wMDoL`B(s!wy6xt;4N^5OHg;6qp|4}fBB7k&6Xv>vncr?Q^ zI3QexDWIg_6o)u^pI9?K;~S*dfqs}gOD@fwXg`i#{2gw!YVi`11Qp@Y9oB3SP`>ec zmTCkF9X$%U$-6H(bc01+Ba4O(;R4^&yyl2_O- zoiIjSMQ!%`WMI)Ou5vxT#K5|gl9cs}^ItF-l|zlzS)8ZEd54|%Jb-O7-z*^0lxytK z(I58ge~-x};gc$kZlTyOYQ5lVkDcYSN}wcDXP|Tq)JOqQkAVj)tp+JJoF7n_0#q;Z zp2)3)f=W|e+~zkMQR-QLsdK<{On<9$4rQ+Zgf!>B)H#KiFf;XQ!9{I|Lr1aKC*`Lb zDRbvhz#_o~^7KIAaom%Snyuxx&7Ew29K$qwtb}V`%X9xg`IIzQXQW#>x$v z=?1%ckqRamn`w=MpDTGFueI|*EoO7}4XN2z(9=%cYbW9*s?>-HY#T&@{M+suwEeiAM2gOoXFb0hCdY*QpBe$Su{jPmZ4pv3R@)XZwcf=z@6wz%ELz88!TTf2 zzJx}$?hC9hjToouK!3ej2l%{>1-?sjg8nGY`41I||71xe=4fQE=Vg^?{8~0xs^;eBcejxJv#@=R< z&!JU%Xir=nG2q>`?gOS0KAL&JOjLJ1{Lwt%+uIB&uRVTWqfP<1c^nx_ReB)UZ zg0?mCV|Bm)w_2fP`la)y$+QroIMd5HsEp4Lp5IV2%X|@pdW^F-JSa_2%jJ)MFW>Y< zeaoMIAHCTBarE*Z&UpXFe(K*NS8e_7o%F@Tw@+6fE>gz_AQ7!7Oi3#wkOcvG)K4>X zU>JLiJJKk3@$s=Jm`erHENdC_RMbY~`Ne_zqiZ+u7Ay692CN0`3hE=jBxy+vAj~PB zH~mwwVu?fpes`w^qooA0FU06@BzzeQx(2JpDM{_{4%7<%)B}1hZ)_WBK%s{WDN(etbc7UtJ@JFN(qd1w^ZmyL-Q#eXZMQ>7GP8<)V(cbh!Yg{q z2X)*&h}#x^uRGaEGWYt1$zKyIhkCi{UoJIPe+(PPe>Ty3r$m3d)ckwUy3OB%26&UR z2v@rN!L=mOsB44xEzpO82!%WH5CJJ6!rHmtd`+_3qkx1@{e@2zX2v3vul~(6h=(PMtG|Vnf$RLnZz%*hYYWiidrVCJ z7`6Y9Q2sxTQvV*d(O;)j$fkJsA(*h#Q*dpGZY`n-hC+}8;*8pWF`R{GWtR4_f#&Mt z*SMwAkwLO$MO3HnbNO(CnK~Z~xRD3k@*6DGET%W&JgV!9R@B&z)lb`8iX2&ND$hTRj6aM>io?10y3tBg0>RZ5_>Qtp8?Y zq+6x?7!YtaiNOhNA>^hBv9h{gaUl*-_)!Tjr*1ulp~5{UwwA~rXsAe_czwPJSOS5f z!fLx2yWC|zK6rY7+lEU8im4rgy456DIT{al=&gguRG8lw>+Sm{BdEsg?IK0lEQ=hzeZ5L^&h)PE=Z%Jl%dNYhi>Bi~%pa$|c zu}27K|9rpcNGefCk#>;phxJhQEA^*_fM7^wgs)r!&h<#ZVK$1t<~7h(R_ zyfl&>7w^?YNV5vBzO4*}kJkLj?aGw@J=>2USh210P+p!F>G@@6i~HdNZ(LKg>y)N* z((>}U9$)7M-v`a@a9gGNy$DEa626JL|=%;+Wzrg z02fSgosF!XxPOC*SGqju|0UkVM(v`x`^43~vfhPAAO=p&;1q7MC$#+e7cEQiz} zO2^~>fbg2w##35#LXz~p_>TRnD(=u+hJAmJkj5WlDE6Pl@L!E0f4j>6Q)?#qoAJnx z)cSSY14>^sSOxANd>>8-TtBLzULp9o`q^1I=BG~|;u5M{cLTdp3@5ei_xqLjne!g3 zzSx5@bVFxTv~#TJ3aRFlPT<5vEOfU-q$unRnJdSyLZNS%aoZ*VbURIWD*_Y0J=>=F zLOgC{lp`KD>{+z$*Gx>2w7pG6;vwig-5_If2E2|8%3kFlk+n@|QEDUK4&P4LK={M& ze?rk$QoCknnd-?*IViBqiqJkntBHHjQBaS)I{WRoL!{#F*!~_7mOsW!_y0=F{)*rK z81(;ZhL$V+o;mQu)`=ZsAqn`%TT{YDLC?V^`o)#JFLXqq3=If<@^M`zE7jjwscI;_ zg8d2f<`cC-blC-dAs4JhZl0@+Ab$0Ic|CcV*<_;P^fxPVfkF>qvzl=$N3r#322#sI zg-S>LYgWMOWw}f?OumiP(pdwsMaFRumwY(|Deq#t?PzqR6ZdAi$l1^|L>`iFVGKdf z;+`%jQC|KYcr`VRNYkovqqvjXt7G=j+uVVHXWh3cEI+N+vV=j1F#l>XBL1Z3#)WHj z_@0repoBgWy{EQV;yFMkT0DuQfD?poY?J6vnh-r=TjR@5plh59_glnWjVRR`EiP5E zGIU`dl{FSS$YilT+rSHR*&&0f(I#VEoY?@zb@r|G3z|tU3$@5%X_QqIX$r_ofof@j z#7scQYEv%uC}W~Pt}447vI{Im5;4ZQ6>T%R?Hv5-sWsAh%QtY&;;dPl|A)4>jLNI+ zl7vZccertPcXtQ`_u%gC?s6l+-QC?Cg1c*QcXt8-KJvV6-%R&2z22T#>-;#suXWD8 zs%qD+jn(l(^obd!Qk+n?@t4}*E`Zl!k_Z4?97Cm)_@ zp+S2Y#05C)Dpmnc{ozU501C zOAGP?|G@%_&VXA6bt0l&qw<^o>83kYA8Hdhg*_BY3-T+BpXgp`-9F2S5UoSgLt3Ht zm!CstL^qqVdMU+>I(40{LABv-dlN}fLgA1pba;7QC^V}f#-e+t68d!THmCZC)st^6 zRfRlh0vD7^_YX*S;|2>Wg>aW^^>iD7(-)A`e4|ylAxCax9f9gyV9z$brfs|A2UjcAj~F1 z|D+-}cxFQ*R~CUR0;z8y{=2&fhQI#9xHc9pJV|ejhYPW7_4sIvbMS=r7(#yhc5k{Y zmN05tX?r}}`G}Q;x(LUl7_ulL)|&HrE~#93s^R)McP(qc?OtRlt9qjmjC7bEi-Ktwxj6FU(RID4#XC=px31RY(KbD0*pj|BmLDof@n86I!ra1b_ePpYVZ`5s%${`E$)KM7 zf|puv<@87VJkp$4PCy$X!a z>s1vb)-}OxXdN{V9d=q3XIe9C!b1`(+4NtMsyfDC(-Ga4eWUm8<3`rQWnRoS%6@{| z%OyiHXOdT~-fZ8XQ4Uk{fZxw7x?Won1n>vO!PQou3i2a6;DVQOTwkrD4n|f$%OX z79~Z#-WHg-hY_La9Px&G&%&=FRvIWFwc!!QtwtUSdn%G!tNd8LmU(kY-kvXCk&c0V ztud|hiTK!`nxDV>X^H}jPodl&^Dc%s#p(;2vtO(38|VTf-=TeHlCNKHkx60suqM<>52lD1n8Cr{}FVrko_fsJyvFGpSpvNn0*#R#1#Mn%hd471Cwu})t_ zhRIg5N*8rfduY2IR?fQkh7*dWA8?&Iuv!S;HNh6Isd7HE0-WwVUY@-kPR7eOag#s< zH&MkXHZ8`Y`;EvPO!}qI7tf3~B`|gzlq3J=E!meatUl%r^)HH5DY_H#af(!NR1+m4 zht5?v_{{1|BI+m7iVX@i)%S}S z@|GFPt<=!3!xgx-1iz}O*k&s5CNmfy_O5vJx(2Kj{$^P_jZ$l9>b+6~(ogHbupkoY z>|U4vf%(o_Mg{ZMOR!3TiWOJPkzlR)c7UuBeeY=#i2MSZC087}kyhe|NbxJHy-p{q zy|1?};JI0Gm5z>yJP^7p1Cn}x`z9XO(-8lvIQ_5?A8Q#-c)6xCd+*y%)f^Wibqb9w zhdkY-b>}>7Ev6~L*uwG5T^N)QwlJiiyNDn>QLC{1hMeuNuewx9lwL&_m&XkAx6oaj zGTjef?76=dhY8P1WtL=tO>RXP6x-pxD>&!%@Gc*iAL0PF62cQqzHU~k?#=Gv5vhI0Tm?~ z#wldozk)y5rkN%zE6RKDQB?ihCb@)tZf^!*v1}Lbk2ReXokeRwwrWKtWw^}`TJUK= zLt~_=Ar59!A2${{2dA5faUE`|-}cYn17gcTJNkhoT>rMo@!xFA{U?9Vzsp(w&NdVz zLH|gA^)rzQcF}}8t`J0!p%9=x5>Q-1?dI$_+${DU6k7|wuRyqz?egA#)#jAtq(ORf z`gnr^cGIr3Ae(oG%koB=J;TT++lGCNFG#+kIF2oHP|t1AS(EV(3}>^zuhGdKh76&I zmauo27N6m8_-;z9CsIN^n$FCG5lO$j2!~1a+F>bH7%!F~+30#z_AuX(uX9&Gaa3lUm*g#y zCm8;qFlfCU#1Hcta~2l1WD8(!e<&-}@nGDw>vrPo_do2)Zi81vhw23X5@ypJd>6bA z8P}fPbx(zsdsP{A{?RHqY4vF#+moXDbqL(O-b&P%JS|1A_<;pA0xDP34d`n661XHG zRf*`8u8H9Kl0>hlTa{6v^q!3((iXA`SV3;tm$T&TsbNG(MT>*GeNSl3YtVB;zHd>K zV3E$YH-V#xtrnpJkI%&yT1BI0md+fc$NHceUWsN=Zq-2EjaHqjXb^}#m zQYn%oKpH3Md}4$idc&1&Kot|I@)DdaNj&fAH!`{iSBug=5jXv?0}!B&$Cha=k?IR7 zQK4vQ1HiEK6b`*D1QCr(i|?6!7_T);Jj1y%k9NBIXvz~rLQrf$TE(XDv_fs+p95?BH=9xVDHM!Z@tvNbwE-3XJNO5ZFO&pBqxe0{tiRZ#4fsGUPJ2LXBX{goq@0zpToQOf5s>D`i4{_^R21?n z^0f!Q;+qwS@kQ-YMY8M-mE3?W!@`iV$P&v1K>hwpZJfeGIoACs4iUEdMYKA6den0@y+(nF_bBR0dE@{sAj6)~yn(Y~ZVebZQJCdq@~b>ox74P6VzH zpJ=#cU&ubPkX{cW1V*pw4!!Vz0fz+SloL0+Z8TkDW