Несколько контрактов в одной транзакции - PullRequest
0 голосов
/ 19 октября 2018

У меня есть требование, когда есть состояние ввода (состояние A и контракт A) и состояние вывода (состояние B и контракт B).Можем ли мы включить это в одну транзакцию?Кроме того, как вызывается метод проверки двух разных контрактов?Было бы очень полезно, если бы в качестве примера использовался ответ.Спасибо.

1 Ответ

0 голосов
/ 19 октября 2018

Да, это возможно, и оба контракта вызываются на всю транзакцию.По сути, узел работает:

ContractA().verify(transaction)
ContractB().verify(transaction)

Поэтому вы должны соблюдать осторожность при написании двух verify методов.Часто вам нужно написать метод verify каждого контракта, чтобы он смотрел только на команды и состояния, связанные с этим контрактом.Например:

class ExampleContract : Contract {
    companion object {
        val ID = "com.example.ExampleContract"
    }

    interface ExampleCommands : CommandData {
        class Issue : ExampleCommands
        class Transfer : ExampleCommands
        class Exit: ExampleCommands
    }

    override fun verify(tx: LedgerTransaction) {
        val exampleCommands = tx.commandsOfType<ExampleCommands>()
        val exampleInputs = tx.inputsOfType<ExampleState>()
        val exampleOutputs = tx.outputsOfType<ExampleState>()

        exampleCommands.forEach { command ->
            when (command.value) {
                is ExampleCommands.Issue -> {
                    if (exampleInputs.isNotEmpty()) throw IllegalArgumentException("Issuance should have no inputs.")
                    if (exampleOutputs.isEmpty()) throw IllegalArgumentException("Issuance should have outputs.")
                    // TODO: More verification.
                }

                is ExampleCommands.Transfer -> {
                    if (exampleInputs.isEmpty()) throw IllegalArgumentException("Transfer should have inputs.")
                    if (exampleOutputs.isEmpty()) throw IllegalArgumentException("Transfer should have outputs.")
                    // TODO: More verification.
                }

                is ExampleCommands.Exit -> {
                    if (exampleInputs.isEmpty()) throw IllegalArgumentException("Exit should have inputs.")
                    if (exampleOutputs.isNotEmpty()) throw IllegalArgumentException("Exit should have no outputs.")
                    // TODO: More verification.
                }
            }
        }
    }
}
...