Приложение My Corda состоит из одного Contract
, двух OwnableStates
Инициатора FlowLogic
и Ответчика FlowLogic
. Транзакция, которую я пытаюсь сформировать, имеет два входа и два выхода. Один вход должен быть активом, а другой - валютой, для которой я создал собственную OwnableState
.
Я добавил следующие входы и выходы в построитель транзакций:
TransactionBuilder txBuilder = new TransactionBuilder(notary);
txBuilder.addInputState(new StateAndRef<AssetState>(new TransactionState<AssetState>(inputAsset, notary), new StateRef(SecureHash.sha256("com.template.contracts.Contract"), 0)));
txBuilder.addInputState(new StateAndRef<CurrencyState>(new TransactionState<CurrencyState>(inputCurrency, notary), new StateRef(SecureHash.sha256("com.template.contracts.ContractCurrency"), 1)));
txBuilder.addOutputState(outputAsset, notary);
txBuilder.addOutputState(outputCurrency, notary);
txBuilder.addCommand(command);
Единственное различие между состояниями ввода и вывода - владельцы. И валюта, и состояние актива принадлежат одному контракту. Логика проверки этого контракта показана ниже:
@Override
public void verify(LedgerTransaction tx) {
List<InOutGroup<AssetState, AssetState>> AssetGroups = tx.groupStates(AssetState.class, AssetState::withoutOwner);
List<InOutGroup<CurrencyState, CurrencyState>> CurrencyGroups = tx.groupStates(CurrencyState.class, CurrencyState::withoutOwner);
CommandWithParties<Commands> cmd = requireSingleCommand(tx.getCommands(), Commands.class);
for (InOutGroup AssetGroup : AssetGroups) {
List<AssetState> AssetInputs = AssetGroup.getInputs();
List<AssetState> AssetOutputs = AssetGroup.getOutputs();
AssetState AssetInput = AssetsInputs.get(0);
if (cmd.getValue() instanceof Commands.Transfer) {
requireThat(require -> {
require.using("the transaction is signed by the owner of the Asset", cmd.getSigners().contains(AssetInput.getOwner().getOwningKey()));
return null;
});
} else {
throw new IllegalArgumentException("Unrecognised command");
}
for (InOutGroup CurrencyGroup : CurrencyGroups) {
List<CurrencyState> CurrencyInputs = CurrencyGroup.getInputs();
List<CurrencyState> CurrencyOutputs = CurrencyGroup.getOutputs();
if (cmd.getValue() instanceof Commands.Transfer) {
CurrencyState CurrencyInput = CurrencyInputs.get(0);
requireThat(require -> {
require.using("the transaction is signed by the owner of the Currency", cmd.getSigners().contains(CurrencyInput.getOwner().getOwningKey()));
return null;
});
} else {
throw new IllegalArgumentException("Unrecognised command");
}
}
}}
При выполнении TransactionFlow
в терминале я получаю сообщение об ошибке:
Contracts cannot be satisfied by an AutomaticPlaceholderConstraint placeholder.
Я не смог найти в Интернете ничего, чтомне помогает, и я не уверен, где искать ошибку. Поэтому я был бы признателен за вашу помощь. Спасибо!
Отказ от ответственности: я изменил имена классов и переменных, чтобы их было легче понять. Если в именах есть опечатка, пожалуйста, игнорируйте ее. Я уверен, что это не проблема;).