Skip to content

Commit

Permalink
wip: moving avm fees checks from syntactic to semantic verifier
Browse files Browse the repository at this point in the history
  • Loading branch information
abi87 committed Feb 1, 2024
1 parent ca8e6c7 commit fe1e477
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 123 deletions.
77 changes: 52 additions & 25 deletions vms/avm/txs/executor/semantic_verifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/vms/avm/state"
"github.com/ava-labs/avalanchego/vms/avm/txs"
"github.com/ava-labs/avalanchego/vms/avm/txs/fees"
"github.com/ava-labs/avalanchego/vms/components/avax"
"github.com/ava-labs/avalanchego/vms/components/verify"
)
Expand All @@ -31,36 +32,15 @@ type SemanticVerifier struct {
}

func (v *SemanticVerifier) BaseTx(tx *txs.BaseTx) error {
for i, in := range tx.Ins {
// Note: Verification of the length of [t.tx.Creds] happens during
// syntactic verification, which happens before semantic verification.
cred := v.Tx.Creds[i].Credential
if err := v.verifyTransfer(tx, in, cred); err != nil {
return err
}
}

for _, out := range tx.Outs {
fxIndex, err := v.getFx(out.Out)
if err != nil {
return err
}

assetID := out.AssetID()
if err := v.verifyFxUsage(fxIndex, assetID); err != nil {
return err
}
}

return nil
return v.verifyBaseTx(tx, nil, nil)
}

func (v *SemanticVerifier) CreateAssetTx(tx *txs.CreateAssetTx) error {
return v.BaseTx(&tx.BaseTx)
}

func (v *SemanticVerifier) OperationTx(tx *txs.OperationTx) error {
if err := v.BaseTx(&tx.BaseTx); err != nil {
if err := v.verifyBaseTx(&tx.BaseTx, nil, nil); err != nil {
return err
}

Expand All @@ -81,7 +61,7 @@ func (v *SemanticVerifier) OperationTx(tx *txs.OperationTx) error {
}

func (v *SemanticVerifier) ImportTx(tx *txs.ImportTx) error {
if err := v.BaseTx(&tx.BaseTx); err != nil {
if err := v.verifyBaseTx(&tx.BaseTx, tx.ImportedIns, nil); err != nil {
return err
}

Expand Down Expand Up @@ -122,7 +102,7 @@ func (v *SemanticVerifier) ImportTx(tx *txs.ImportTx) error {
}

func (v *SemanticVerifier) ExportTx(tx *txs.ExportTx) error {
if err := v.BaseTx(&tx.BaseTx); err != nil {
if err := v.verifyBaseTx(&tx.BaseTx, nil, tx.ExportedOuts); err != nil {
return err
}

Expand All @@ -146,6 +126,53 @@ func (v *SemanticVerifier) ExportTx(tx *txs.ExportTx) error {
return nil
}

func (v *SemanticVerifier) verifyBaseTx(
tx *txs.BaseTx,
importedIns []*avax.TransferableInput,
exportedOuts []*avax.TransferableOutput,
) error {
feeCalculator := fees.Calculator{
Config: v.Config,
}
if err := tx.Visit(&feeCalculator); err != nil {
return err
}

err := avax.VerifyTx(
feeCalculator.Fee,
v.FeeAssetID,
[][]*avax.TransferableInput{tx.Ins, importedIns},
[][]*avax.TransferableOutput{tx.Outs, exportedOuts},
v.Codec,
)
if err != nil {
return err
}

for i, in := range tx.Ins {
// Note: Verification of the length of [t.tx.Creds] happens during
// syntactic verification, which happens before semantic verification.
cred := v.Tx.Creds[i].Credential
if err := v.verifyTransfer(tx, in, cred); err != nil {
return err
}
}

for _, out := range tx.Outs {
fxIndex, err := v.getFx(out.Out)
if err != nil {
return err
}

assetID := out.AssetID()
if err := v.verifyFxUsage(fxIndex, assetID); err != nil {
return err
}
}

return nil
}

func (v *SemanticVerifier) verifyTransfer(
tx txs.UnsignedTx,
in *avax.TransferableInput,
Expand Down
98 changes: 0 additions & 98 deletions vms/avm/txs/executor/syntactic_verifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ import (
"github.com/ava-labs/avalanchego/utils"
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/vms/avm/txs"
"github.com/ava-labs/avalanchego/vms/avm/txs/fees"
"github.com/ava-labs/avalanchego/vms/components/avax"
)

const (
Expand Down Expand Up @@ -58,24 +56,6 @@ func (v *SyntacticVerifier) BaseTx(tx *txs.BaseTx) error {
return err
}

feeCalculator := fees.Calculator{
Config: v.Config,
}
if err := tx.Visit(&feeCalculator); err != nil {
return err
}

err := avax.VerifyTx(
feeCalculator.Fee,
v.FeeAssetID,
[][]*avax.TransferableInput{tx.Ins},
[][]*avax.TransferableOutput{tx.Outs},
v.Codec,
)
if err != nil {
return err
}

for _, cred := range v.Tx.Creds {
if err := cred.Verify(); err != nil {
return err
Expand Down Expand Up @@ -128,24 +108,6 @@ func (v *SyntacticVerifier) CreateAssetTx(tx *txs.CreateAssetTx) error {
return err
}

feeCalculator := fees.Calculator{
Config: v.Config,
}
if err := tx.Visit(&feeCalculator); err != nil {
return err
}

err := avax.VerifyTx(
feeCalculator.Fee,
v.FeeAssetID,
[][]*avax.TransferableInput{tx.Ins},
[][]*avax.TransferableOutput{tx.Outs},
v.Codec,
)
if err != nil {
return err
}

for _, state := range tx.States {
if err := state.Verify(v.Codec, len(v.Fxs)); err != nil {
return err
Expand Down Expand Up @@ -183,24 +145,6 @@ func (v *SyntacticVerifier) OperationTx(tx *txs.OperationTx) error {
return err
}

feeCalculator := fees.Calculator{
Config: v.Config,
}
if err := tx.Visit(&feeCalculator); err != nil {
return err
}

err := avax.VerifyTx(
feeCalculator.Fee,
v.FeeAssetID,
[][]*avax.TransferableInput{tx.Ins},
[][]*avax.TransferableOutput{tx.Outs},
v.Codec,
)
if err != nil {
return err
}

inputs := set.NewSet[ids.ID](len(tx.Ins))
for _, in := range tx.Ins {
inputs.Add(in.InputID())
Expand Down Expand Up @@ -250,27 +194,6 @@ func (v *SyntacticVerifier) ImportTx(tx *txs.ImportTx) error {
return err
}

feeCalculator := fees.Calculator{
Config: v.Config,
}
if err := tx.Visit(&feeCalculator); err != nil {
return err
}

err := avax.VerifyTx(
feeCalculator.Fee,
v.FeeAssetID,
[][]*avax.TransferableInput{
tx.Ins,
tx.ImportedIns,
},
[][]*avax.TransferableOutput{tx.Outs},
v.Codec,
)
if err != nil {
return err
}

for _, cred := range v.Tx.Creds {
if err := cred.Verify(); err != nil {
return err
Expand Down Expand Up @@ -299,27 +222,6 @@ func (v *SyntacticVerifier) ExportTx(tx *txs.ExportTx) error {
return err
}

feeCalculator := fees.Calculator{
Config: v.Config,
}
if err := tx.Visit(&feeCalculator); err != nil {
return err
}

err := avax.VerifyTx(
feeCalculator.Fee,
v.FeeAssetID,
[][]*avax.TransferableInput{tx.Ins},
[][]*avax.TransferableOutput{
tx.Outs,
tx.ExportedOuts,
},
v.Codec,
)
if err != nil {
return err
}

for _, cred := range v.Tx.Creds {
if err := cred.Verify(); err != nil {
return err
Expand Down

0 comments on commit fe1e477

Please sign in to comment.