Как начать течение в Corda - PullRequest
       9

Как начать течение в Corda

0 голосов
/ 19 апреля 2020

Я изучаю этот пример шнура приложения https://github.com/corda/corda-training-template.git

Я изменил код в соответствии с шаблоном решения, доступным в Github. Всякий раз, когда я запускаю поток, я получаю сообщение об ошибке (конструктор не найден, отсутствует состояние параметра), см. Скриншот ниже. Я инициировал этот поток из узла A, поэтому я не понимаю, что будет параметром конструктора. Я вставил код состояния ниже.

Скриншот проблемы потока

Код конструктора IOUState

@BelongsToContract(IOUContract.class)
public class IOUState implements ContractState, LinearState {

    public final Amount<Currency> amount;
    public final Party lender;
    public final Party borrower;
    public final Amount<Currency> paid;
    private final UniqueIdentifier linearId;

    // Private constructor used only for copying a State object
    @ConstructorForDeserialization
    private IOUState(Amount<Currency> amount, Party lender, Party borrower, Amount<Currency> paid, UniqueIdentifier linearId){
        this.amount = amount;
        this.lender = lender;
        this.borrower = borrower;
        this.paid = paid;
        this.linearId = linearId;
    }

    public IOUState(Amount<Currency> amount, Party lender, Party borrower) {
        this(amount, lender, borrower, new Amount<>(0, amount.getToken()), new UniqueIdentifier());
    }

    public Amount<Currency> getAmount() {
        return amount;
    }

    public Party getLender() {
        return lender;
    }

    public Party getBorrower() {
        return borrower;
    }

    public Amount<Currency> getPaid() {
        return paid;
    }

    @Override
    public UniqueIdentifier getLinearId() {
        return linearId;
    }

    /**
     *  This method will return a list of the nodes which can "use" this state in a valid transaction. In this case, the
     *  lender or the borrower.
     */
    @Override
    public List<AbstractParty> getParticipants() {
        return ImmutableList.of(lender, borrower);
    }

    /**
     * Helper methods for when building transactions for settling and transferring IOUs.
     * - [pay] adds an amount to the paid property. It does no validation.
     * - [withNewLender] creates a copy of the current state with a newly specified lender. For use when transferring.
     * - [copy] creates a copy of the state using the internal copy constructor ensuring the LinearId is preserved.
     */
    public IOUState pay(Amount<Currency> amountToPay) {
        Amount<Currency> newAmountPaid = this.paid.plus(amountToPay);
        return new IOUState(amount, lender, borrower, newAmountPaid, linearId);
    }

    public IOUState withNewLender(Party newLender) {
        return new IOUState(amount, newLender, borrower, paid, linearId);
    }

    public IOUState copy(Amount<Currency> amount, Party lender, Party borrower, Amount<Currency> paid) {
        return new IOUState(amount, lender, borrower, paid, this.getLinearId());
    }

}

1 Ответ

0 голосов
/ 19 апреля 2020
  1. Я предполагаю, что одним из входных параметров в конструкторе вашего потока является класс (Amount<Currency>), поэтому вы должны передать экземпляр этого класса при запуске потока в оболочке узла.
  2. См. здесь , как создать экземпляр класса в оболочке узла.
  3. Проблема в вашем коде в том, что вы используете Amount<Currency>; то есть для создания экземпляра вам нужно сделать что-то вроде этого:
Amount<Currency> usdAmount = new Amount(100, Currency.getInstance("USD"));
Мы должны использовать Currency.getInstance(), потому что Currency не имеет конструктора public. С Currency код:
/**
 * Constructs a <code>Currency</code> instance. The constructor is private
 * so that we can insure that there's never more than one instance for a
 * given currency.
 */
private Currency(String currencyCode, int defaultFractionDigits, int numericCode) {
    this.currencyCode = currencyCode;
    this.defaultFractionDigits = defaultFractionDigits;
    this.numericCode = numericCode;
}
Оболочка узла не позволяет вызывать функции (например, Currency.getInstance()). Таким образом, чтобы ваш поток работал, вы должны изменить его конструктор и заставить его принимать только примитивные параметры, а не принимать классы; затем внутри конструктора вы можете создать экземпляр класса Amount. Это будет выглядеть так:
// Class attributes.
private Amount<Currency> iouAmount;
private Party otherParty;

// Constructor.
public Initiator(String currencyCode, long quantity, Party otherParty) {
    this.iouAmount = new Amount(quantity, Currency.getInstance(currencyCode));
    this.otherParty = otherParty;
}

Теперь внутри оболочки узла:

flow start IOUIssueFlow$Initiator currencyCode: USD, quantity: 100, otherParty: PartyB
Обратите внимание, что вы используете Amount, поэтому quantity должно быть типа long. Смотрите здесь .
...