代币不匹配-美元对英镑-Cordapp-Kotlin-区块链

时间:2019-04-09 07:08:04

标签: kotlin blockchain corda

我在IOUStateTests中进行的所有测试均通过,但我编写“ pay”方法的测试除外。我写的如下。

我收到Token mismatch: USD vs GBP错误。默认情况下,Corda是否将美元作为货币?如问题陈述中所述,“ IOUState类”的一个属性,即“付费”以磅为单位初始化。我也一样我已将其复制到类中的“付款”方法中,并将其添加到“已付款”中。但是得到上面的错误。请帮忙:)

这是使用Kotlin开发的CorDapp。

data class IOUState(val amount: Amount<Currency>,
                    val lender:Party,
                    val borrower:Party,
                    val paid: Amount<Currency> = POUNDS(0),
                    override val linearId : UniqueIdentifier = UniqueIdentifier()):  LinearState {
    override val participants: List<Party> get() = listOf(lender, borrower)
    fun pay(amountToPay: Amount<Currency>) = copy(paid = paid.plus(amountToPay))

}

我希望方法'pay'以磅为单位返回'paid''amountToPay'的加法。但是我得到一个错误,'paid '在POUNDS中,而amountToPay在USD中。所以,无法添加。

2 个答案:

答案 0 :(得分:0)

您在已定义的IOUState中的付费属性设置为“磅”。导致出现此错误的唯一合理的解释是,您正在向薪水函数传递一些美元金额。

答案 1 :(得分:0)

您当前的解决方案将“付费”字段初始化为零磅。对于支付字段,货币令牌被硬编码为POUND。

这是当将任何其他货币作为付费方法的参数传递时代码中断的原因。

IOUStateTests类的前几个测试中,使用POUND量。这与您当前的代码配合得很好。但是,一旦您还执行了以后的测试(使用DOLLAR Amounts进行测试),您的代码就会中断。

您不应在代码中对货币进行硬编码。

该问题的潜在解决方案是根据所传递的金额初始化付费字段。您可以在初始化支付字段时引用传递的金额值。

以下内容对我有用:

@BelongsToContract(IOUContract::class)
data class IOUState(
        val amount: Amount<java.util.Currency>,
        val lender: Party,
        val borrower: Party,
        val paid: Amount<java.util.Currency> = Amount.zero(amount.token),
        override val linearId: UniqueIdentifier = UniqueIdentifier()
    ): ContractState, LinearState {

    override val participants: List<Party> get() = listOf(lender, borrower)

    fun pay(paid: Amount<Currency>) = this.copy(paid = this.paid.plus(paid))
}

不是将Currency令牌硬编码为POUND或DOLLAR;我们可以使用amount参数的货币令牌。

使用此解决方案,所有测试都可以通过,而无需更改测试中使用的币种:

Results