corda - 线性状态的 Corda 转移,收集签名
问题描述
我已经实现了几个命令,其中公证人签名满足用例。有两种情况我有未解决的问题:
我有一个从输入/输出状态更改的所有者字段,一切都很好,但我希望新所有者在其上签字,例如我需要一种机制来通过保险库检索状态(最后未使用?),我想我需要对参与者进行身份验证和过滤并让新所有者对其进行签名,例如“按下按钮”,我该怎么做?
我如何最终确定一个线性状态,例如它不能参与任何形式的事务/命令?
@InitiatingFlow
@StartableByRPC
class DeviceFlow(private val deviceState: DeviceState,
private val stateAndRef: Optional<StateAndRef<DeviceState>>,
private val command: DeviceContract.Commands)
: FlowLogic<SignedTransaction>() {
override val progressTracker = tracker()
companion object {
object GENERATING_TRANSACTION : Step("Generating transaction based on new IOU.")
object VERIFYING_TRANSACTION : Step("Verifying contract constraints.")
object SIGNING_TRANSACTION : Step("Signing transaction with our private key.")
object GATHERING_SIGS : Step("Gathering the counterparty's signature.") {
override fun childProgressTracker() = CollectSignaturesFlow.tracker()
}
object FINALISING_TRANSACTION : Step("Obtaining notary signature and recording transaction.") {
override fun childProgressTracker() = FinalityFlow.tracker()
}
fun tracker() = ProgressTracker(
GENERATING_TRANSACTION,
VERIFYING_TRANSACTION,
SIGNING_TRANSACTION,
GATHERING_SIGS,
FINALISING_TRANSACTION
)
}
@Suspendable
override fun call(): SignedTransaction {
progressTracker.currentStep = GENERATING_TRANSACTION
val notary = serviceHub.networkMapCache.getNotary(CordaX500Name("Notary", "London", "GB"))
val transactionBuilder = TransactionBuilder(notary = notary)
.addCommand(command, deviceState.participants.map { it.owningKey })
.addOutputState(deviceState, DeviceContract.ID)
if (stateAndRef.isPresent)
transactionBuilder.addInputState(stateAndRef.get())
progressTracker.currentStep = VERIFYING_TRANSACTION
transactionBuilder.verify(serviceHub)
progressTracker.currentStep = SIGNING_TRANSACTION
val signedTransaction = serviceHub.signInitialTransaction(transactionBuilder)
val otherPartySession = initiateFlow(notary!!)
val fullySignedTx = subFlow(
CollectSignaturesFlow(signedTransaction, setOf(otherPartySession), GATHERING_SIGS.childProgressTracker()))
progressTracker.currentStep = FINALISING_TRANSACTION
return subFlow(FinalityFlow(fullySignedTx, setOf(otherPartySession), FINALISING_TRANSACTION.childProgressTracker()))
}
}
@InitiatedBy(DeviceFlow::class)
class DeviceCreateFlowResponder(val flowSession: FlowSession) : FlowLogic<SignedTransaction>() {
@Suspendable
override fun call(): SignedTransaction {
val signTransactionFlow = object : SignTransactionFlow(flowSession) {
override fun checkTransaction(stx: SignedTransaction) = requireThat {
val output = stx.tx.outputs.single().data
"This must be a Device transaction." using (output is DeviceState)
}
}
val txId = subFlow(signTransactionFlow).id
return subFlow(ReceiveFinalityFlow(flowSession, expectedTxId = txId))
}
}
解决方案
新主人签字
- 您将从保险库中检索最新版本的状态。最新版本应该是未使用的。
- 创建一个 TransactionBuilder 并将此状态添加为输入。
- 创建此状态的副本,但更改所有者属性以反映新所有者。将此作为输出添加到 TransactionBuilder。
- 确保您管理该州的合同规则强制执行前所有者和新所有者都是必需的签名者。
完成线性(或任何状态)
- 您可以向状态添加一个属性,并让您的合同强制一旦设置此属性,该状态就不能再进化。
- 您可以通过将状态作为输入添加到事务中而不添加输出来使用状态。(同样,您的联系人必须允许这样做)
推荐阅读
- debugging - 如何将布尔参数传递给 VS Code 中的深入研究?
- java - 无法延迟初始化集合,无法初始化代理用于将 JSON 转换为实体
- bootstrap-4 - Bootstrap 4 - 覆盖断点 - 转换为 em
- html - 如何在html中用帽子“^”键入文本?
- database - Rethinkdb 完全搜索包含文本
- python - grpc Python:忽略不受信任的证书
- android - Volley StringRequest 在对象的数组中总是给出 500 个结果
- python - Python 3 XOR 字节数组
- c++ - static_cast 的 GCC 问题
- signalr - 热门获取 SignalR 核心组中的连接数