科达与令牌和帐户

时间:2020-06-02 14:12:40

标签: corda

我们正在与Kotlin一起在Corda使用令牌和帐户。我将详细说明该场景。 我们有一个node1和一个node2。 我们创建了一个从TokenType扩展的“ OurTokenType”。 我们在node1上创建了两个帐户(卖方和买方),并与node2共享。 根据应用程序的业务规则,node2是发行令牌(FungibleToken)的节点,并且发行可以正常进行。最后,node1和node2可以访问FungibleStates进行发行事务。 我们的问题在于这些令牌的转移。当我们尝试将代币从帐户卖方转移到买方时。 在我们的方案中,令牌的传输可以发生在node1或node2上。 当我们通过作为帐户宿主的node1进行转移时,可以使用有效的MoveFungibleTokensFlow类,并将node1上的FungibleStates更新为正确的值。但是,当我们在observerSessions参数中将node2添加为观察者时,node2上的FungibleStates没有正确更新。 而且,当我们使用MoveFungibleTokensFlow类按不是帐户宿主的node2进行转帐时,它不起作用,它将生成com.r3.corda.lib.tokens.selection.InsufficientBalanceException异常:可支配的支出不足确定的状态,甚至保持平衡。

我的问题是,即使帐户位于另一台主机上,我也可以使用MoveFungibleTokensFlow类在帐户之间进行转移吗? 当我们在托管帐户的节点上运行时,使用observerSessions更新FungibleStates有什么问题? 还是我必须遵循链接https://github.com/corda/samples-kotlin/tree/master/Accounts/worldcupticketbooking的示例?

2 个答案:

答案 0 :(得分:1)

让我将您的问题分为两部分:

  1. 观察者会话不会自动更新: 以下是我们如何在观察者会话上触发更新的示例:https://github.com/corda/samples-kotlin/blob/master/Tokens/stockpaydividend/workflows/src/main/kotlin/net/corda/samples/stockpaydividend/flows/AnnounceDividend.kt#L37 这将确保无论维护者何时进行更新,观察者的令牌状态都会被更新。 (注意:只有维护者才能进行更新,而所有者则不能)

  2. 双方之间的可替代令牌转让:是。这是可行的。这行代码是worldcupticketbooking示例中https://github.com/corda/samples-kotlin/blob/master/Accounts/worldcupticketbooking/workflows/src/main/kotlin/com/t20worldcup/flows/DVPAccountsHostedOnDifferentNodes.kt#L102的FungibleToken传输的开始。

我看到您提到您在InsufficientBalanceException上收到一条错误消息,如果我是您,我将开始从那里进行挖掘,并查看正在准确查询哪个令牌。

答案 1 :(得分:1)

  • MoveFungibleTokensFlow没有一个输入参数来指定谁是移动令牌的源,这是因为它将流的发起者视为令牌的源。
class MoveFungibleTokensFlow
@JvmOverloads
constructor(
        val partiesAndAmounts: List<PartyAndAmount<TokenType>>,
        override val participantSessions: List<FlowSession>,
        override val observerSessions: List<FlowSession> = emptyList(),
        val queryCriteria: QueryCriteria? = null,
        val changeHolder: AbstractParty? = null
) : AbstractMoveTokensFlow() {
  • 您对“ node1和node2都看到已发行的令牌”是不正确的,在FungibleToken中,唯一的参与者是令牌的holder,因此当令牌被发行给卖方和买方帐户,唯一的参与者是托管这些帐户的节点(即node1)。

  • 回到我的第一点,因为只有node1拥有发行的令牌,并且您正在node2上运行移动流程(该流程将node2作为令牌的来源,但node2没有令牌的来源) );这就是为什么您会收到余额不足错误的原因。

  • 即使您在向买家和卖家发行令牌时添加了node2作为观察者(即node1和node2都具有生成的令牌);如果您深入研究MoveFungibleTokensflow的代码(该代码继承自AbstractMoveTokensFlow的{​​{1}}来签署交易),您会在ObserverAwareFinalityFlow内看到它没有被调用ObserverAwareFinalityFlow流,仅在本地签署交易(请参见here);这意味着只有拥有帐户私钥的节点才能在move命令上签名,并且由于node1是买卖双方的CollectSignatures;那么node1是私钥/公钥的所有者,只有node1可以代表买方和卖方签名。因此,即使您与node2共享了买方和卖方帐户;只有node1可以签名,并且由于您正在从node2调用host(您的第二种情况),当它到达需要代表卖方签名(移动其代币)的部分时,它将失败。不拥有该帐户的私钥。
  • 另一方面,当您从节点1调用MoveFungibleTokensFlow将卖方的代币转移到买方时;确保为MoveFungibleTokesnFlow提供一个值,以仅选择属于卖方的令牌;如果您没有提供价值;那么流程将选择托管在node1上的所有令牌,这样您最终可能会移动属于其他帐户的令牌。
  • 还请确保提供queryCriteria的值,以便将更改退还给卖方(如果您将其保留为空);任何结果更改都将分配给发起节点(即node1)而不是帐户。
  • 您可以在my article的Tokens SDK上找到许多有用的提示。
  • R3最近还发布了免费的Corda课程;它在令牌SDK上有一个great section
  • 为了使您能够使用node1或node2将令牌从卖方转移到买方,您必须依靠效用函数changeHolder而不是现成的流程(即addMoveTokens())(因为上述原因)。因此,您必须自己创建交易,然后使用MoveFungibleTokensFlow添加要移动的令牌,然后必须使用addMoveTokens()流收集(卖方的)签名(卖方将在响应者中签名)流);此外,您还必须完成交易。
  • 仅需澄清以上流程,您的流程应检查它是否是卖方的主机;如果不是主机,则可以在本地签名;那么您必须使用帐户的托管人创建一个CollectSignatures,以便您可以收集其签名(即,批准其移动持有的令牌)。
  • 样品回购中有some examples个使用FlowSession的示例;我建议花一些时间来探索它们。