mirror of
https://github.com/corda/corda.git
synced 2025-01-29 15:43:55 +00:00
Minor: move code from TransactionTools.kt into the respective classes, and add some @Throws annotations that were missing (matters for java users)
This commit is contained in:
parent
f3c2bd6748
commit
99f8477bf1
@ -1,42 +0,0 @@
|
|||||||
package com.r3corda.core.contracts
|
|
||||||
|
|
||||||
import com.r3corda.core.node.ServiceHub
|
|
||||||
import com.r3corda.core.transactions.LedgerTransaction
|
|
||||||
import com.r3corda.core.transactions.SignedTransaction
|
|
||||||
import com.r3corda.core.transactions.WireTransaction
|
|
||||||
import java.io.FileNotFoundException
|
|
||||||
|
|
||||||
// TODO: Move these into the actual classes (i.e. where people would expect to find them) and split Transactions.kt into multiple files
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Looks up identities and attachments from storage to generate a [LedgerTransaction]. A transaction is expected to
|
|
||||||
* have been fully resolved using the resolution protocol by this point.
|
|
||||||
*
|
|
||||||
* @throws FileNotFoundException if a required attachment was not found in storage.
|
|
||||||
* @throws TransactionResolutionException if an input points to a transaction not found in storage.
|
|
||||||
*/
|
|
||||||
fun WireTransaction.toLedgerTransaction(services: ServiceHub): LedgerTransaction {
|
|
||||||
// Look up random 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 -> services.identityService.partyFromKey(pk) }
|
|
||||||
AuthenticatedObject(it.signers, parties, it.value)
|
|
||||||
}
|
|
||||||
// Open attachments specified in this transaction. If we haven't downloaded them, we fail.
|
|
||||||
val attachments = attachments.map {
|
|
||||||
services.storageService.attachments.openAttachment(it) ?: throw FileNotFoundException(it.toString())
|
|
||||||
}
|
|
||||||
val resolvedInputs = inputs.map { StateAndRef(services.loadState(it), it) }
|
|
||||||
return LedgerTransaction(resolvedInputs, outputs, authenticatedArgs, attachments, id, notary, signers, timestamp, type)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calls [verify] to check all required signatures are present, and then calls [WireTransaction.toLedgerTransaction]
|
|
||||||
* with the passed in [ServiceHub] to resolve the dependencies, returning an unverified LedgerTransaction.
|
|
||||||
*
|
|
||||||
* @throws FileNotFoundException if a required attachment was not found in storage.
|
|
||||||
* @throws TransactionResolutionException if an input points to a transaction not found in storage.
|
|
||||||
*/
|
|
||||||
fun SignedTransaction.toLedgerTransaction(services: ServiceHub): LedgerTransaction {
|
|
||||||
verifySignatures()
|
|
||||||
return tx.toLedgerTransaction(services)
|
|
||||||
}
|
|
@ -1,10 +1,13 @@
|
|||||||
package com.r3corda.core.transactions
|
package com.r3corda.core.transactions
|
||||||
|
|
||||||
import com.r3corda.core.contracts.NamedByHash
|
import com.r3corda.core.contracts.NamedByHash
|
||||||
|
import com.r3corda.core.contracts.TransactionResolutionException
|
||||||
import com.r3corda.core.crypto.DigitalSignature
|
import com.r3corda.core.crypto.DigitalSignature
|
||||||
import com.r3corda.core.crypto.SecureHash
|
import com.r3corda.core.crypto.SecureHash
|
||||||
import com.r3corda.core.crypto.toStringsShort
|
import com.r3corda.core.crypto.toStringsShort
|
||||||
|
import com.r3corda.core.node.ServiceHub
|
||||||
import com.r3corda.core.serialization.SerializedBytes
|
import com.r3corda.core.serialization.SerializedBytes
|
||||||
|
import java.io.FileNotFoundException
|
||||||
import java.security.PublicKey
|
import java.security.PublicKey
|
||||||
import java.security.SignatureException
|
import java.security.SignatureException
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@ -38,6 +41,7 @@ data class SignedTransaction(val txBits: SerializedBytes<WireTransaction>,
|
|||||||
*
|
*
|
||||||
* @throws SignatureException if a signature is invalid, does not match or if any signature is missing.
|
* @throws SignatureException if a signature is invalid, does not match or if any signature is missing.
|
||||||
*/
|
*/
|
||||||
|
@Throws(SignatureException::class)
|
||||||
fun verifySignatures(throwIfSignaturesAreMissing: Boolean = true): Set<PublicKey> {
|
fun verifySignatures(throwIfSignaturesAreMissing: Boolean = true): Set<PublicKey> {
|
||||||
// Embedded WireTransaction is not deserialised until after we check the signatures.
|
// Embedded WireTransaction is not deserialised until after we check the signatures.
|
||||||
for (sig in sigs)
|
for (sig in sigs)
|
||||||
@ -97,4 +101,18 @@ data class SignedTransaction(val txBits: SerializedBytes<WireTransaction>,
|
|||||||
if (sigKeys.containsAll(requiredKeys)) return emptySet()
|
if (sigKeys.containsAll(requiredKeys)) return emptySet()
|
||||||
return requiredKeys - sigKeys
|
return requiredKeys - sigKeys
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls [verifySignatures] to check all required signatures are present, and then calls
|
||||||
|
* [WireTransaction.toLedgerTransaction] with the passed in [ServiceHub] to resolve the dependencies,
|
||||||
|
* returning an unverified LedgerTransaction.
|
||||||
|
*
|
||||||
|
* @throws FileNotFoundException if a required attachment was not found in storage.
|
||||||
|
* @throws TransactionResolutionException if an input points to a transaction not found in storage.
|
||||||
|
*/
|
||||||
|
@Throws(FileNotFoundException::class, TransactionResolutionException::class)
|
||||||
|
fun toLedgerTransaction(services: ServiceHub): LedgerTransaction {
|
||||||
|
verifySignatures()
|
||||||
|
return tx.toLedgerTransaction(services)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,13 @@ import com.r3corda.core.contracts.*
|
|||||||
import com.r3corda.core.crypto.Party
|
import com.r3corda.core.crypto.Party
|
||||||
import com.r3corda.core.crypto.SecureHash
|
import com.r3corda.core.crypto.SecureHash
|
||||||
import com.r3corda.core.indexOfOrThrow
|
import com.r3corda.core.indexOfOrThrow
|
||||||
|
import com.r3corda.core.node.ServiceHub
|
||||||
import com.r3corda.core.serialization.SerializedBytes
|
import com.r3corda.core.serialization.SerializedBytes
|
||||||
import com.r3corda.core.serialization.THREAD_LOCAL_KRYO
|
import com.r3corda.core.serialization.THREAD_LOCAL_KRYO
|
||||||
import com.r3corda.core.serialization.deserialize
|
import com.r3corda.core.serialization.deserialize
|
||||||
import com.r3corda.core.serialization.serialize
|
import com.r3corda.core.serialization.serialize
|
||||||
import com.r3corda.core.utilities.Emoji
|
import com.r3corda.core.utilities.Emoji
|
||||||
|
import java.io.FileNotFoundException
|
||||||
import java.security.PublicKey
|
import java.security.PublicKey
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,4 +61,26 @@ data class WireTransaction(val inputs: List<StateRef>,
|
|||||||
for (attachment in attachments) buf.appendln("${Emoji.paperclip}ATTACHMENT: $attachment")
|
for (attachment in attachments) buf.appendln("${Emoji.paperclip}ATTACHMENT: $attachment")
|
||||||
return buf.toString()
|
return buf.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Looks up identities and attachments from storage to generate a [LedgerTransaction]. A transaction is expected to
|
||||||
|
* have been fully resolved using the resolution protocol by this point.
|
||||||
|
*
|
||||||
|
* @throws FileNotFoundException if a required attachment was not found in storage.
|
||||||
|
* @throws TransactionResolutionException if an input points to a transaction not found in storage.
|
||||||
|
*/
|
||||||
|
@Throws(FileNotFoundException::class, TransactionResolutionException::class)
|
||||||
|
fun toLedgerTransaction(services: ServiceHub): LedgerTransaction {
|
||||||
|
// 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 -> services.identityService.partyFromKey(pk) }
|
||||||
|
AuthenticatedObject(it.signers, parties, it.value)
|
||||||
|
}
|
||||||
|
// Open attachments specified in this transaction. If we haven't downloaded them, we fail.
|
||||||
|
val attachments = attachments.map {
|
||||||
|
services.storageService.attachments.openAttachment(it) ?: throw FileNotFoundException(it.toString())
|
||||||
|
}
|
||||||
|
val resolvedInputs = inputs.map { StateAndRef(services.loadState(it), it) }
|
||||||
|
return LedgerTransaction(resolvedInputs, outputs, authenticatedArgs, attachments, id, notary, signers, timestamp, type)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@ import com.r3corda.core.checkedAdd
|
|||||||
import com.r3corda.core.transactions.LedgerTransaction
|
import com.r3corda.core.transactions.LedgerTransaction
|
||||||
import com.r3corda.core.transactions.SignedTransaction
|
import com.r3corda.core.transactions.SignedTransaction
|
||||||
import com.r3corda.core.transactions.WireTransaction
|
import com.r3corda.core.transactions.WireTransaction
|
||||||
import com.r3corda.core.contracts.toLedgerTransaction
|
|
||||||
import com.r3corda.core.crypto.Party
|
import com.r3corda.core.crypto.Party
|
||||||
import com.r3corda.core.crypto.SecureHash
|
import com.r3corda.core.crypto.SecureHash
|
||||||
import com.r3corda.core.protocols.ProtocolLogic
|
import com.r3corda.core.protocols.ProtocolLogic
|
||||||
|
@ -4,7 +4,6 @@ import co.paralleluniverse.fibers.Suspendable
|
|||||||
import com.r3corda.core.transactions.SignedTransaction
|
import com.r3corda.core.transactions.SignedTransaction
|
||||||
import com.r3corda.core.contracts.TransactionVerificationException
|
import com.r3corda.core.contracts.TransactionVerificationException
|
||||||
import com.r3corda.core.transactions.WireTransaction
|
import com.r3corda.core.transactions.WireTransaction
|
||||||
import com.r3corda.core.contracts.toLedgerTransaction
|
|
||||||
import com.r3corda.core.crypto.Party
|
import com.r3corda.core.crypto.Party
|
||||||
import com.r3corda.core.node.services.TimestampChecker
|
import com.r3corda.core.node.services.TimestampChecker
|
||||||
import com.r3corda.core.node.services.UniquenessProvider
|
import com.r3corda.core.node.services.UniquenessProvider
|
||||||
|
Binary file not shown.
@ -3,7 +3,6 @@ package com.r3corda.contracts
|
|||||||
import com.r3corda.core.contracts.DOLLARS
|
import com.r3corda.core.contracts.DOLLARS
|
||||||
import com.r3corda.core.transactions.LedgerTransaction
|
import com.r3corda.core.transactions.LedgerTransaction
|
||||||
import com.r3corda.core.contracts.`issued by`
|
import com.r3corda.core.contracts.`issued by`
|
||||||
import com.r3corda.core.contracts.toLedgerTransaction
|
|
||||||
import com.r3corda.core.seconds
|
import com.r3corda.core.seconds
|
||||||
import com.r3corda.core.serialization.OpaqueBytes
|
import com.r3corda.core.serialization.OpaqueBytes
|
||||||
import com.r3corda.core.utilities.DUMMY_NOTARY
|
import com.r3corda.core.utilities.DUMMY_NOTARY
|
||||||
|
Loading…
x
Reference in New Issue
Block a user