【发布时间】:2019-05-31 01:13:56
【问题描述】:
我已经实现了几个命令,其中公证人签名满足用例。有两种情况我有未解决的问题:
我有一个从输入/输出状态更改的所有者字段,一切正常,但我希望新所有者在其上签字,例如我需要一种机制来通过保险库检索状态(最后一次未使用?),我想我需要对参与者进行身份验证和过滤并让新所有者对其进行签名,例如“按下按钮”,我该怎么做?
如何确定线性状态,例如以后不能参与任何形式的交易/命令?
@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))
}
}
【问题讨论】:
-
如果你只想要状态并且那个人不需要签名你有两种方式第一个将他添加到参与者并且在你创建交易时不要将他的签名放入命令中,第二种方式使用广播流
标签: corda