Corda 自动三方流
我是Corda的新手,有一个需要执行以下操作的用例: 我有3个节点: 班卡,班卡,班卡 账户A是银行账户A,账户B是银行账户B,账户C是银行账户CCorda 自动三方流,corda,Corda,我是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
,当然您可以使用任何名称)李>
发票
状态的流程(即发出
命令)李>
发票
状态将有一个合同(以验证不同的命令),对于支付
命令,您必须检查所有3个帐户是否都是必需的签名者李>
发票
状态,所需的签名人是3个账户,没有输出(意味着发票已支付,现在已脱离分类账)李>
send和receive
功能将发票状态发送给NodeB李>
发票中提取的)是否托管在其上,如果不是的话;它将抛出一个错误李>
您说您现在不关心付款,所以您可以向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
请将问题标记为已回答。