R3- 没有公证人签名的 Corda 交易

R3- Corda transaction without notary signature

我是Corda新手,想详细了解公证人的作用。根据文件中的说法,例如甲方和乙方之间发生一笔交易,公证人将签署交易,公证人的作用是防止双花。我们可以进行没有公证签名的交易吗?在 TransactionBuilder class 它的说法 var notary: Party?用于交易的公证人。如果为空,则表示交易没有公证人。根据语法,我们可以将其设置为空,如果我们将其设置为空,交易是否有效以及 corda 如何防止双花。如果我误解了这个概念,请纠正我。

只有在以下情况下才需要公证签名:

  1. 如果您的交易有输入:证明这些输入没有被消耗,防止双花。
  2. 如果您的交易有参考状态:证明这些参考状态没有被消耗,从而阻止使用 "out-dated" 参考数据。
  3. 如果您的交易有时间-window:证明交易在指定时间内完成-window。

可以看到hereFinalityFlow里面的函数needsNotarySignature()证明了以上几点

我同意Adel对他提到的案例的公证签名要求的回答。除此之外,交易需要与公证人相关联,它不应该为空。

一种可能认为不需要公证人的情况是国家的签发。实际上,不需要公证人的签名,但是交易仍然需要公证人,因为状态需要标记给公证人以防止在消费状态时出现双花。

如果没有公证人,状态可以发送给不同的公证人,这可能会导致双花。

您可以在 TransactionBuilder 的 addOutput 方法中验证这一点:

fun addOutputState(
    state: ContractState,
    contract: ContractClassName = requireNotNullContractClassName(state),
    constraint: AttachmentConstraint = AutomaticPlaceholderConstraint
): TransactionBuilder {
    checkNotNull(notary) { "Need to specify a notary for the state, or set a default one on TransactionBuilder initialisation" }
    addOutputState(state, contract, notary!!, constraint = constraint)
    return this
}