【问题标题】:Inaccessible Cash State无法访问的现金状态
【发布时间】:2020-06-01 20:34:58
【问题描述】:

我遇到了现金状态的问题。基本上我有一个节点自己发行货币并且无法访问现有状态以用于支付/任何事情。假设这个状态是 5 美元,如果我再发 10 美元,rpcOps 和 servicehub getCashBalances 都会说我有 15 美元。但是,任何尝试使用超过 10 美元的现金流都会告诉我我没有足够的余额。

我已经为节点设置了 api 端点,甚至只是退出现金,但它会说我退出的次数比我拥有的多。当我使用QueryCriteria.VaultQueryCriteria(Vault.StateStatus.UNCONSUMED) 查询保管库时,我可以看到状态在那里,并且似乎没有任何东西可以将不可访问状态与任何后续可访问状态区分开来。

这里有什么我可以忽略的吗?发行者是相同的,所有者是散列的,但也应该是相同的。

用命令/代码更新:

fun selfIssueTime(@QueryParam(value = "amount") amount: Long,
                  @QueryParam(value = "currency") currency: String): Response {

    // 1. Prepare issue request.
    val issueAmount = Amount(amount.toLong() * 100, Currency.getInstance(currency))
    val notary = rpcOps.notaryIdentities().firstOrNull() ?: throw IllegalStateException("Could not find a notary.")
    val issueRef = OpaqueBytes.of(0)
    val issueRequest = CashIssueFlow.IssueRequest(issueAmount, issueRef, notary)
    val self = myIdentity

    // 2. Start flow and wait for response.
    val (status, message) = try {
        val flowHandle = rpcOps.startFlowDynamic(
                CashIssueFlow::class.java,
                issueRequest
        )

        flowHandle.use { it.returnValue.getOrThrow() }
        CREATED to "$issueAmount issued to $self."
    } catch (e: Exception) {
        BAD_REQUEST to e.message
    }

    // 3. Return the response.
    return Response.status(status).entity(message).build()
}

【问题讨论】:

  • 你能发布你用来发行现金的命令/代码吗?
  • 当然——刚刚用代码@Joel更新了原版
  • 做了更多的挖掘,发现与这个状态相关的transaction_id在h2的vault_states表中设置了一个lock_id。我可以手动更新它并将 lock_id 设置为 null,但我不确定它为什么首先被锁定。
  • 解锁后,提现可以退出,但我尝试用它向其他节点发现仍然报错。

标签: corda


【解决方案1】:

我相信这已通过 Corda 财务 jar 的更高版本修复。我们使用 currency 类开发了更多 CorDapps 示例,我们没有遇到任何问题。例如:https://github.com/corda/samples-java/blob/master/Tokens/dollartohousetoken/workflows/src/main/java/net/corda/examples/dollartohousetoken/flows/FiatCurrencyIssueFlow.java#L39

此外,随着 Corda TokenSDk 的发布,Corda 上的货币实际上有了一种新的方式来获得发行、转移和赎回。这是由以下人员完成的:

        /* Create an instance of the fiat currency token */
        TokenType token = FiatCurrency.Companion.getInstance(currency);

        /* Create an instance of IssuedTokenType for the fiat currency */
        IssuedTokenType issuedTokenType = new IssuedTokenType(getOurIdentity(), token);

        /* Create an instance of FungibleToken for the fiat currency to be issued */
        FungibleToken fungibleToken = new FungibleToken(new Amount<>(amount, issuedTokenType), recipient, null);

        /* Issue the required amount of the token to the recipient */
        return subFlow(new IssueTokens(ImmutableList.of(fungibleToken), ImmutableList.of(recipient)));

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多