在 corda 合同中获取错误未解决的参考?

Getting an error unresolved refrence in corda contract?

我的用例与 IOU 用例相似。在为此编写合同时,我收到以下错误。

> Task :contracts:compileKotlin FAILED
e: D:\Capstone_Tryout\contracts\src\main\kotlin\com\template\contracts\TradeContract.kt: (45, 34): Unresolved reference: signers

我的代码是

package com.template.contracts

import com.template.states.TradeState
import net.corda.core.contracts.CommandData
import net.corda.core.contracts.Contract
import net.corda.core.contracts.requireSingleCommand
import net.corda.core.contracts.requireThat
import net.corda.core.transactions.LedgerTransaction

// ************
// * Contract *
// ************
class TradeContract :Contract {
    companion object {
        // Used to identify our contract when building a transaction.
        const val ID = "com.template.contracts.TradeContract"
    }

    // A transaction is valid if the verify() function of the contract of all the transaction's input and output states
    // does not throw an exception.

    override fun verify(tx: LedgerTransaction) {
        val command = tx.commands.requireSingleCommand<Commands>().value

        when(command) {
            is Commands.Issue -> requireThat {
                "There should be no input state" using (tx.inputs.isEmpty())
                "There should be one output state" using (tx.outputs.size == 1)

                "The output state should be of type TradeState" using (tx.outputs.get(0).data is TradeState)
                val outputState = tx.outputs.get(0).data as TradeState
                "TradeId should be 10 character long" using (outputState.TradeId.length == 10)

                val trade = tx.outputsOfType<TradeState>().single()
                "All of the participants must be signers." using (command.signers.toSet() == trade.participants.map { it.owningKey }.toSet())
                "A newly issued TradeState must have a positive amount." using (trade.Amount > 0)
                "The FromParty and ToParty cannot have the same identity." using (trade.FromParty != trade.ToParty)


            }
        }

        // Verification logic goes here.
    }

    // Used to indicate the transaction's intent.
    interface Commands : CommandData {
        class Issue : Commands
    }
}

虽然类似的代码在 corda 示例中运行。

val iou = tx.outputsOfType<IOUState>().single()
"Both Parties together only may sign Trade issue transaction." using
                        (command.signers.toSet() == iou.participants.map { it.owningKey }.toSet())

我无法弄清楚为什么会出现此错误。

请确认您执行了以下操作:

  1. 在你的合约中定义命令:
public interface Commands extends CommandData {
    class Create implements Commands {}
}
  1. 从您的 verify() 方法中的事务中提取命令:
final CommandWithParties<Commands.Create> command = 
                    requireSingleCommand(tx.getCommands(), Commands.Create.class);

命令包装值和签名者。

  • 值是命令的类型
  • 签名者是命令所需签名者的 public 密钥。

上面代码中的问题是:

val command = tx.commands.requireSingleCommand<Commands>().value

将上面的替换为:

val command = tx.commands.requireSingleCommand<Commands>()