要获得状态,我可以使用保险柜,但是交易呢?我如何通过txHash获得它们?是否可以通过CordaRPCOps做到这一点,有internalVerifiedTransactionsSnapshot方法,但是现在不推荐使用。
首先,请注意,从Corda 3开始,关于任何检索事务或其依赖关系的方法的行为都没有稳定性保证。特别是,我们不能保证所检索的事务集在Corda版本之间不会发生变化。
这是因为在未来版本的Corda中,节点可能只会交换SGX加密形式的交易链。然后,将在节点上的SGX飞地内验证这些交易链。这将防止节点看到他们正在验证的事务的内容(请参阅此处的博客文章:https ://www.corda.net/2017/06/corda-sgx-privacy-update/ )。甚至可能只允许节点查看它们正在签名的事务的某些部分。
从Corda 3开始检索交易的方法
1.使用 CordaRPCOps.internalVerifiedTransactionsSnapshot
如果要通过RPC与节点进行交互,则CordaRPCOps.internalVerifiedTransactionsSnapshot返回所有已记录事务的列表。
如果您只想进行一次交易并且知道其哈希值,则可以编写:
val transactions = cordaRPCOps.internalVerifiedTransactionsSnapshot()
val signedTransaction = transactions
.find { it.id == transactionHash }
?: throw IllegalArgumentException("Unknown transaction hash.")
Run Code Online (Sandbox Code Playgroud)
请注意,返回的交易类型为SignedTransaction。此表单不包含事务的附件或输入(仅附件哈希和输入状态引用)。
要通过RPC检索事务的附件,您可以编写:
val transactions = cordaRPCOps.internalVerifiedTransactionsSnapshot()
val signedTransaction = transactions
.find { it.id == transactionHash }
?: throw IllegalArgumentException("Unknown transaction hash.")
val attachmentHashes = signedTransaction.tx.attachments
val attachmentStreams = attachmentHashes.map { hash -> cordaRPCOps.openAttachment(hash) }
Run Code Online (Sandbox Code Playgroud)
要通过RPC检索事务的输入,您可以编写:
val transactions = cordaRPCOps.internalVerifiedTransactionsSnapshot()
val signedTransaction = transactions
.find { it.id == transactionHash }
?: throw IllegalArgumentException("Unknown transaction hash.")
val inputStateRefs = signedTransaction.inputs
val inputStates = inputStateRefs.map { stateRef ->
val transaction = transactions.find { it.id == stateRef.txhash }
?: throw IllegalArgumentException("Unknown transaction hash.")
transaction.tx.outputStates[stateRef.index]
}
Run Code Online (Sandbox Code Playgroud)
2.使用 ServiceHub
如果您处于可以访问节点ServiceHub(例如,在流或Corda服务中)的情况下,则可以使用serviceHub.validatedTransactions.track().snapshot来获取所有交易,并serviceHub.validatedTransactions.getTransaction(transactionHash)通过哈希来获取特定交易。
请注意,返回的交易类型为SignedTransaction。此表单不包含事务的附件或输入(仅附件哈希和输入状态引用)。
要将转换SignedTransaction为LedgerTransaction(解析附件和输入的位置),可以编写:
val signedTransaction = serviceHub.validatedTransactions.getTransaction(transactionHash)
val ledgerTransaction = signedTransaction.toLedgerTransaction(serviceHub)
Run Code Online (Sandbox Code Playgroud)
3.通过连接到节点的数据库
您可以直接连接到支持该节点的SQL数据库,并使用SQL查询检索事务。
| 归档时间: |
|
| 查看次数: |
1698 次 |
| 最近记录: |