Corda 自动三方流

Corda 自动三方流,corda,Corda,我是Corda的新手,有一个需要执行以下操作的用例: 我有3个节点: 班卡,班卡,班卡 账户A是银行账户A,账户B是银行账户B,账户C是银行账户C AccountA向AccountB发送发票 AccountB自动将全额付款发送给AccountA 从AccountB收到款项后,AccountA自动将该笔款项的20%发送给AccountC 剩下的80%归AccountA所有 在这个简单的场景中,我不关心AccountB是否有足够的钱进行支付,这是一个概念证明。唯一的“手动”步骤是AccoutA发送发

我是Corda的新手,有一个需要执行以下操作的用例:

我有3个节点:

班卡,班卡,班卡

账户A是银行账户A,账户B是银行账户B,账户C是银行账户C

  • AccountA向AccountB发送发票
  • AccountB自动将全额付款发送给AccountA
  • 从AccountB收到款项后,AccountA自动将该笔款项的20%发送给AccountC
  • 剩下的80%归AccountA所有
  • 在这个简单的场景中,我不关心AccountB是否有足够的钱进行支付,这是一个概念证明。唯一的“手动”步骤是AccoutA发送发票,其余步骤自动触发


    在Corda中,有没有一种方法可以使用帐户实现这一点?如果有,如何实现?示例代码/伪代码将是很好的。

    我将尽可能详细地说明:

  • 创建一个状态
    发票
    ,该状态具有金额属性和类型为
    抽象方
    (即accountA、accountB和accountC)的3个属性
  • 您所在的州将有两个命令:
    Issue
    Exit
    (或
    Pay
    ;我将使用
    Pay
    ,当然您可以使用任何名称)
  • 创建创建
    发票
    状态的流程(即
    发出
    命令)
  • 您的概念证明是将金额从accountA发送到accountB再发送到accountC,但如何证明此金额分配确实发生了?如果所有3个账户都签署了您的交易,则可以证明,详情如下
  • 您的
    发票
    状态将有一个合同(以验证不同的命令),对于
    支付
    命令,您必须检查所有3个帐户是否都是必需的签名者
  • 现在创建付款发票流,它将由两部分组成(发起人和响应人)
  • 发起人将创建一个交易,输入是
    发票
    状态,所需的签名人是3个账户,没有输出(意味着发票已支付,现在已脱离分类账)
  • 然后,流将使用
    send和receive
    功能将发票状态发送给NodeB
  • 现在,在安装在NodeB上的响应器流中,NodeB可以进行许多检查,例如NodeB将检查accountB(它从收到的
    发票中提取的
    )是否托管在其上,如果不是的话;它将抛出一个错误
    
  • 您说您现在不关心付款,所以您可以向NodeA发送一个类型为
    Double
    的对象,其金额等于收到的发票中的金额(请记住,我们在initator中使用了
    send和receive
    ,因此NodeA正在等待响应者发送
    send
    ,否则流程将被阻塞)。如果您想查看使用tokens SDK支付状态的示例;请看这里:,在您的情况下,您将拥有一个正常状态(即,
    Invoice extends LinearState
    ContractState
  • 现在回到发起者,发起者刚刚从NodeB收到了数量;它将首先检查收到的金额是否等于发票金额
  • 现在它将向NodeC发送20%:您可以使用
    send
    发送发票和
    Double
    类型的对象来表示金额(20%)
  • 正如您所看到的,发起方和响应方之间有很多杂耍,因为从发起方接收的每个
    receive
    ,来自响应方的
    send
    必须存在(顺便说一句,您在启动器中调用的
    collectSignatureFlow
    有一个
    receive
    ,您可以通过调用
    SignTransactionFlow
    ——在响应程序中调用
    send
    ——来实现)
  • 现在,在安装在NodeC内部的响应程序中,它将接收到
    Double
    ;您可以进行一些验证(例如,accountC托管在NodeC上,例如验证对象
    Double
    的金额是否等于收到的发票金额的20%)
  • 现在回到发起者,它将调用
    CollectSignaturesFlow
    从NodeB收集accountB的签名,并从NodeC收集accountC的签名
  • NodeB呼叫的内部响应程序
    SignTransactionFlow
  • NodeC调用的内部响应程序
    SignTransactionFlow
  • 在启动器内部调用最终流
  • 在响应者内部调用接收最终流
  • 注意我提到有两个应答器(一个安装在NodeB上,一个安装在NodeC上),这是因为NodeB的响应逻辑与NodeC不同。拥有两个响应者是一个高级主题;因此,只需创建一个响应者流,并在其中检查流会话的参与方(如果是PartyB);然后执行PartyB逻辑,否则执行PartyC逻辑。
    以下是上述步骤的伪代码:

    // Notice the sequence of the numbers; that's how the juggeling is happening
    
    // Initiator (NodeA)
    1. Choose notary
    2. Create empty transaction
    3. Set input (Invoice), required signers (the 3 accounts), command (Pay)
    4. Validate tx (state contract is called)
    5. Send invoice to PartyB 
    9. Receive double
    10. Validate that Double.amount = 100% invoice.amount
    11. Send invoice and Double(20 %) to NodeC
    14. Sign transaction with NodeA key and accountA key (node A must sign with its key
     because it initiated the flow)
    15. Call CollectSignaturesFlow
    16. Call Finality flow
    
    
    // Responder
    If (session.party = PartyB)
        6. Receive invoice
        7. Validate that accountB is hosted on NodeB
        8. Send  new Double(100% invoice amount)
        16. Call SignTransactionFlow
        17. Call receive finality flow
    // PartyC
    else
        12. Receive invoice and Double
        13. Validate accountC is hosted here and Double.amount == 20%
        16. Call SignTransactionFlow
        17. Call receive finality flow
    

    请将问题标记为已回答。