mirror of
https://github.com/corda/corda.git
synced 2024-12-21 13:57:54 +00:00
Clean up to NotaryFlow API (#1554)
This commit is contained in:
parent
838e753164
commit
1d6bd85f8a
@ -15,11 +15,12 @@ import net.corda.core.node.services.UniquenessProvider
|
|||||||
import net.corda.core.serialization.CordaSerializable
|
import net.corda.core.serialization.CordaSerializable
|
||||||
import net.corda.core.transactions.SignedTransaction
|
import net.corda.core.transactions.SignedTransaction
|
||||||
import net.corda.core.utilities.ProgressTracker
|
import net.corda.core.utilities.ProgressTracker
|
||||||
|
import net.corda.core.utilities.UntrustworthyData
|
||||||
import net.corda.core.utilities.unwrap
|
import net.corda.core.utilities.unwrap
|
||||||
import java.security.SignatureException
|
import java.security.SignatureException
|
||||||
import java.util.function.Predicate
|
import java.util.function.Predicate
|
||||||
|
|
||||||
object NotaryFlow {
|
class NotaryFlow {
|
||||||
/**
|
/**
|
||||||
* A flow to be used by a party for obtaining signature(s) from a [NotaryService] ascertaining the transaction
|
* A flow to be used by a party for obtaining signature(s) from a [NotaryService] ascertaining the transaction
|
||||||
* time-window is correct and none of its inputs have been used in another completed transaction.
|
* time-window is correct and none of its inputs have been used in another completed transaction.
|
||||||
@ -42,14 +43,12 @@ object NotaryFlow {
|
|||||||
fun tracker() = ProgressTracker(REQUESTING, VALIDATING)
|
fun tracker() = ProgressTracker(REQUESTING, VALIDATING)
|
||||||
}
|
}
|
||||||
|
|
||||||
lateinit var notaryParty: Party
|
|
||||||
|
|
||||||
@Suspendable
|
@Suspendable
|
||||||
@Throws(NotaryException::class)
|
@Throws(NotaryException::class)
|
||||||
override fun call(): List<TransactionSignature> {
|
override fun call(): List<TransactionSignature> {
|
||||||
progressTracker.currentStep = REQUESTING
|
progressTracker.currentStep = REQUESTING
|
||||||
|
|
||||||
notaryParty = stx.notary ?: throw IllegalStateException("Transaction does not specify a Notary")
|
val notaryParty = stx.notary ?: throw IllegalStateException("Transaction does not specify a Notary")
|
||||||
check(stx.inputs.all { stateRef -> serviceHub.loadState(stateRef).notary == notaryParty }) {
|
check(stx.inputs.all { stateRef -> serviceHub.loadState(stateRef).notary == notaryParty }) {
|
||||||
"Input states must have the same Notary"
|
"Input states must have the same Notary"
|
||||||
}
|
}
|
||||||
@ -84,17 +83,28 @@ object NotaryFlow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return response.unwrap { signatures ->
|
return response.unwrap { signatures ->
|
||||||
signatures.forEach { validateSignature(it, stx.id) }
|
signatures.forEach { validateSignature(it, stx.id, notaryParty) }
|
||||||
signatures
|
signatures
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun validateSignature(sig: TransactionSignature, txId: SecureHash) {
|
private fun validateSignature(sig: TransactionSignature, txId: SecureHash, notaryParty: Party) {
|
||||||
check(sig.by in notaryParty.owningKey.keys) { "Invalid signer for the notary result" }
|
check(sig.by in notaryParty.owningKey.keys) { "Invalid signer for the notary result" }
|
||||||
sig.verify(txId)
|
sig.verify(txId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The [SendTransactionWithRetry] flow is equivalent to [SendTransactionFlow] but using [sendAndReceiveWithRetry]
|
||||||
|
* instead of [sendAndReceive], [SendTransactionWithRetry] is intended to be use by the notary client only.
|
||||||
|
*/
|
||||||
|
private class SendTransactionWithRetry(otherSide: Party, stx: SignedTransaction) : SendTransactionFlow(otherSide, stx) {
|
||||||
|
@Suspendable
|
||||||
|
override fun sendPayloadAndReceiveDataRequest(otherSide: Party, payload: Any): UntrustworthyData<FetchDataFlow.Request> {
|
||||||
|
return sendAndReceiveWithRetry(otherSide, payload)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A flow run by a notary service that handles notarisation requests.
|
* A flow run by a notary service that handles notarisation requests.
|
||||||
*
|
*
|
||||||
@ -151,12 +161,3 @@ sealed class NotaryError {
|
|||||||
override fun toString() = cause.toString()
|
override fun toString() = cause.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* The [SendTransactionWithRetry] flow is equivalent to [SendTransactionFlow] but using [sendAndReceiveWithRetry]
|
|
||||||
* instead of [sendAndReceive], [SendTransactionWithRetry] is intended to be use by the notary client only.
|
|
||||||
*/
|
|
||||||
private class SendTransactionWithRetry(otherSide: Party, stx: SignedTransaction) : SendTransactionFlow(otherSide, stx) {
|
|
||||||
@Suspendable
|
|
||||||
override fun sendPayloadAndReceiveDataRequest(otherSide: Party, payload: Any) = sendAndReceiveWithRetry<FetchDataFlow.Request>(otherSide, payload)
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user