【问题标题】:Corda transfer of Linear State, collecting signatures线性状态的 Corda 转移,收集签名
【发布时间】: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


【解决方案1】:

新所有者签字

  • 您将从保管库中检索最新版本的状态。最新版本应未使用。
  • 创建一个 TransactionBuilder 并将此状态添加为输入。
  • 创建此状态的副本,但更改所有者属性以反映新所有者。将此作为输出添加到 TransactionBuilder。
  • 确保管理该州的合同规则强制前所有者和新所有者都是必需的签名者。

完成一个线性(或任何状态)

  • 您可以向状态添加一个属性,并让您的合同强制在设置此属性后状态不能再演化。
  • 您可以通过将状态添加到事务中作为输入而不添加输出来使用状态。 (同样,您的联系人必须允许这样做)

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多