Да, это возможно, и оба контракта вызываются на всю транзакцию.По сути, узел работает:
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.
}
}
}
}
}