diff --git a/pkg/morph/event/notary_preparator.go b/pkg/morph/event/notary_preparator.go index f85b5b64..3d499fec 100644 --- a/pkg/morph/event/notary_preparator.go +++ b/pkg/morph/event/notary_preparator.go @@ -103,55 +103,8 @@ func notaryPreparator(prm PreparatorPrm) NotaryPreparator { // transaction is expected to be received one more time // from the Notary service but already signed. This happens // since every notary call is a new notary request in fact. -// -// nolint: funlen func (p Preparator) Prepare(nr *payload.P2PNotaryRequest) (NotaryEvent, error) { - // notary request's main tx is expected to have - // three or four witnesses: one for proxy contract, - // one for alphabet multisignature, one optional for - // notary's invoker and one is for notary contract - ln := len(nr.MainTransaction.Scripts) - switch ln { - case 3, 4: - default: - return nil, errUnexpectedWitnessAmount - } - invokerWitness := ln == 4 - - // alphabet node should handle only notary requests - // that have been sent unsigned(by storage nodes) => - // such main TXs should have dummy scripts as an - // invocation script - // - // this check prevents notary flow recursion - if !bytes.Equal(nr.MainTransaction.Scripts[1].InvocationScript, p.dummyInvocationScript) { - return nil, ErrTXAlreadyHandled - } - - currentAlphabet, err := p.alphaKeys() - if err != nil { - return nil, fmt.Errorf("could not fetch Alphabet public keys: %w", err) - } - - err = p.validateCosigners(ln, nr.MainTransaction.Signers, currentAlphabet) - if err != nil { - return nil, err - } - - // validate main TX's notary attribute - err = p.validateAttributes(nr.MainTransaction.Attributes, currentAlphabet, invokerWitness) - if err != nil { - return nil, err - } - - // validate main TX's witnesses - err = p.validateWitnesses(nr.MainTransaction.Scripts, currentAlphabet, invokerWitness) - if err != nil { - return nil, err - } - - // validate main TX expiration - err = p.validateExpiration(nr.FallbackTransaction) + err := p.validateNotaryRequest(nr) if err != nil { return nil, err } @@ -219,6 +172,60 @@ func (p Preparator) Prepare(nr *payload.P2PNotaryRequest) (NotaryEvent, error) { }, nil } +func (p Preparator) validateNotaryRequest(nr *payload.P2PNotaryRequest) error { + // notary request's main tx is expected to have + // three or four witnesses: one for proxy contract, + // one for alphabet multisignature, one optional for + // notary's invoker and one is for notary contract + ln := len(nr.MainTransaction.Scripts) + switch ln { + case 3, 4: + default: + return errUnexpectedWitnessAmount + } + invokerWitness := ln == 4 + + // alphabet node should handle only notary requests + // that have been sent unsigned(by storage nodes) => + // such main TXs should have dummy scripts as an + // invocation script + // + // this check prevents notary flow recursion + if !bytes.Equal(nr.MainTransaction.Scripts[1].InvocationScript, p.dummyInvocationScript) { + return ErrTXAlreadyHandled + } + + currentAlphabet, err := p.alphaKeys() + if err != nil { + return fmt.Errorf("could not fetch Alphabet public keys: %w", err) + } + + err = p.validateCosigners(ln, nr.MainTransaction.Signers, currentAlphabet) + if err != nil { + return err + } + + // validate main TX's notary attribute + err = p.validateAttributes(nr.MainTransaction.Attributes, currentAlphabet, invokerWitness) + if err != nil { + return err + } + + // validate main TX's witnesses + err = p.validateWitnesses(nr.MainTransaction.Scripts, currentAlphabet, invokerWitness) + if err != nil { + return err + } + + // validate main TX expiration + err = p.validateExpiration(nr.FallbackTransaction) + if err != nil { + return err + } + + return nil +} + func (p Preparator) validateParameterOpcodes(ops []Op) error { l := len(ops)