mirror of
https://github.com/corda/corda.git
synced 2024-12-18 20:47:57 +00:00
Update notary demo to ensure txn signed by all before recording.
This commit is contained in:
parent
d0645e3f88
commit
17a1e149fa
@ -58,6 +58,15 @@ task deployNodesSingle(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) {
|
|||||||
}
|
}
|
||||||
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
||||||
}
|
}
|
||||||
|
node {
|
||||||
|
name "O=Bob Plc,L=Rome,C=IT"
|
||||||
|
p2pPort 10005
|
||||||
|
rpcSettings {
|
||||||
|
address "localhost:10006"
|
||||||
|
adminAddress "localhost:10007"
|
||||||
|
}
|
||||||
|
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
||||||
|
}
|
||||||
node {
|
node {
|
||||||
name "O=Notary Node,L=Zurich,C=CH"
|
name "O=Notary Node,L=Zurich,C=CH"
|
||||||
p2pPort 10009
|
p2pPort 10009
|
||||||
@ -90,6 +99,15 @@ task deployNodesCustom(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) {
|
|||||||
}
|
}
|
||||||
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
||||||
}
|
}
|
||||||
|
node {
|
||||||
|
name "O=Bob Plc,L=Rome,C=IT"
|
||||||
|
p2pPort 10005
|
||||||
|
rpcSettings {
|
||||||
|
address "localhost:10006"
|
||||||
|
adminAddress "localhost:10007"
|
||||||
|
}
|
||||||
|
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
||||||
|
}
|
||||||
node {
|
node {
|
||||||
name "O=Notary Node,L=Zurich,C=CH"
|
name "O=Notary Node,L=Zurich,C=CH"
|
||||||
p2pPort 10009
|
p2pPort 10009
|
||||||
@ -124,6 +142,15 @@ task deployNodesRaft(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) {
|
|||||||
}
|
}
|
||||||
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
||||||
}
|
}
|
||||||
|
node {
|
||||||
|
name "O=Bob Plc,L=Rome,C=IT"
|
||||||
|
p2pPort 10005
|
||||||
|
rpcSettings {
|
||||||
|
address "localhost:10006"
|
||||||
|
adminAddress "localhost:10007"
|
||||||
|
}
|
||||||
|
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
||||||
|
}
|
||||||
node {
|
node {
|
||||||
name "O=Notary Service 0,L=Zurich,C=CH"
|
name "O=Notary Service 0,L=Zurich,C=CH"
|
||||||
p2pPort 10009
|
p2pPort 10009
|
||||||
@ -193,6 +220,15 @@ task deployNodesBFT(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) {
|
|||||||
}
|
}
|
||||||
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
||||||
}
|
}
|
||||||
|
node {
|
||||||
|
name "O=Bob Plc,L=Rome,C=IT"
|
||||||
|
p2pPort 10005
|
||||||
|
rpcSettings {
|
||||||
|
address "localhost:10006"
|
||||||
|
adminAddress "localhost:10007"
|
||||||
|
}
|
||||||
|
rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
|
||||||
|
}
|
||||||
node {
|
node {
|
||||||
name "O=Notary Service 0,L=Zurich,C=CH"
|
name "O=Notary Service 0,L=Zurich,C=CH"
|
||||||
p2pPort 10009
|
p2pPort 10009
|
||||||
|
@ -2,10 +2,8 @@ package net.corda.notarydemo.client
|
|||||||
|
|
||||||
import net.corda.client.rpc.CordaRPCClient
|
import net.corda.client.rpc.CordaRPCClient
|
||||||
import net.corda.core.crypto.CompositeKey
|
import net.corda.core.crypto.CompositeKey
|
||||||
import net.corda.core.crypto.Crypto
|
|
||||||
import net.corda.core.crypto.toStringShort
|
import net.corda.core.crypto.toStringShort
|
||||||
import net.corda.core.identity.CordaX500Name
|
import net.corda.core.identity.CordaX500Name
|
||||||
import net.corda.core.identity.Party
|
|
||||||
import net.corda.core.messaging.CordaRPCOps
|
import net.corda.core.messaging.CordaRPCOps
|
||||||
import net.corda.core.messaging.startFlow
|
import net.corda.core.messaging.startFlow
|
||||||
import net.corda.core.transactions.SignedTransaction
|
import net.corda.core.transactions.SignedTransaction
|
||||||
@ -32,7 +30,7 @@ private class NotaryDemoClientApi(val rpc: CordaRPCOps) {
|
|||||||
|
|
||||||
/** A dummy identity. */
|
/** A dummy identity. */
|
||||||
private val BOB_NAME = CordaX500Name("Bob Plc", "Rome", "IT")
|
private val BOB_NAME = CordaX500Name("Bob Plc", "Rome", "IT")
|
||||||
private val counterparty = Party(BOB_NAME, Crypto.generateKeyPair(Crypto.DEFAULT_SIGNATURE_SCHEME).public)
|
private val counterparty = rpc.wellKnownPartyFromX500Name(BOB_NAME) ?: throw IllegalArgumentException("Couldn't find Bob Plc party")
|
||||||
|
|
||||||
/** Makes calls to the node rpc to start transaction notarisation. */
|
/** Makes calls to the node rpc to start transaction notarisation. */
|
||||||
fun notarise(count: Int) {
|
fun notarise(count: Int) {
|
||||||
|
@ -2,15 +2,22 @@ package net.corda.notarydemo.flows
|
|||||||
|
|
||||||
import co.paralleluniverse.fibers.Suspendable
|
import co.paralleluniverse.fibers.Suspendable
|
||||||
import net.corda.core.contracts.ContractState
|
import net.corda.core.contracts.ContractState
|
||||||
|
import net.corda.core.flows.FinalityFlow
|
||||||
import net.corda.core.flows.FlowLogic
|
import net.corda.core.flows.FlowLogic
|
||||||
|
import net.corda.core.flows.FlowSession
|
||||||
|
import net.corda.core.flows.InitiatedBy
|
||||||
|
import net.corda.core.flows.InitiatingFlow
|
||||||
|
import net.corda.core.flows.ReceiveFinalityFlow
|
||||||
import net.corda.core.flows.StartableByRPC
|
import net.corda.core.flows.StartableByRPC
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
|
import net.corda.core.node.StatesToRecord
|
||||||
import net.corda.core.transactions.SignedTransaction
|
import net.corda.core.transactions.SignedTransaction
|
||||||
import net.corda.core.transactions.TransactionBuilder
|
import net.corda.core.transactions.TransactionBuilder
|
||||||
import net.corda.notarydemo.contracts.DO_NOTHING_PROGRAM_ID
|
import net.corda.notarydemo.contracts.DO_NOTHING_PROGRAM_ID
|
||||||
import net.corda.notarydemo.contracts.DummyCommand
|
import net.corda.notarydemo.contracts.DummyCommand
|
||||||
import net.corda.notarydemo.contracts.DummyState
|
import net.corda.notarydemo.contracts.DummyState
|
||||||
|
|
||||||
|
@InitiatingFlow
|
||||||
@StartableByRPC
|
@StartableByRPC
|
||||||
class DummyIssueAndMove(private val notary: Party, private val counterpartyNode: Party, private val discriminator: Int) : FlowLogic<SignedTransaction>() {
|
class DummyIssueAndMove(private val notary: Party, private val counterpartyNode: Party, private val discriminator: Int) : FlowLogic<SignedTransaction>() {
|
||||||
@Suspendable
|
@Suspendable
|
||||||
@ -22,12 +29,22 @@ class DummyIssueAndMove(private val notary: Party, private val counterpartyNode:
|
|||||||
addCommand(DummyCommand(), listOf(ourIdentity.owningKey))
|
addCommand(DummyCommand(), listOf(ourIdentity.owningKey))
|
||||||
})
|
})
|
||||||
serviceHub.recordTransactions(issueTx)
|
serviceHub.recordTransactions(issueTx)
|
||||||
// Move ownership of the asset to the counterparty
|
|
||||||
// We don't check signatures because we know that the notary's signature is missing
|
val stx = serviceHub.signInitialTransaction(TransactionBuilder(notary).apply {
|
||||||
return serviceHub.signInitialTransaction(TransactionBuilder(notary).apply {
|
|
||||||
addInputState(issueTx.tx.outRef<ContractState>(0))
|
addInputState(issueTx.tx.outRef<ContractState>(0))
|
||||||
addOutputState(state.copy(participants = listOf(counterpartyNode)), DO_NOTHING_PROGRAM_ID)
|
addOutputState(state.copy(participants = listOf(counterpartyNode)), DO_NOTHING_PROGRAM_ID)
|
||||||
addCommand(DummyCommand(), listOf(ourIdentity.owningKey))
|
addCommand(DummyCommand(), listOf(ourIdentity.owningKey))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
return subFlow(FinalityFlow(stx, initiateFlow(counterpartyNode)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@InitiatedBy(DummyIssueAndMove::class)
|
||||||
|
class DummyIssueAndMoveResponder(private val otherSide: FlowSession) : FlowLogic<Unit>() {
|
||||||
|
@Suspendable
|
||||||
|
override fun call() {
|
||||||
|
// As a non-participant to the transaction we need to record all states
|
||||||
|
subFlow(ReceiveFinalityFlow(otherSide, statesToRecord = StatesToRecord.ALL_VISIBLE))
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user