-
Notifications
You must be signed in to change notification settings - Fork 669
/
tx_mempool_verifier.go
91 lines (74 loc) · 2.2 KB
/
tx_mempool_verifier.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright (C) 2019-2021, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package executor
import (
"errors"
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/vms/platformvm/state"
"github.com/ava-labs/avalanchego/vms/platformvm/txs"
)
var _ txs.Visitor = &MempoolTxVerifier{}
type MempoolTxVerifier struct {
*Backend
ParentID ids.ID
StateVersions state.Versions
Tx *txs.Tx
}
func (*MempoolTxVerifier) AdvanceTimeTx(*txs.AdvanceTimeTx) error { return errWrongTxType }
func (*MempoolTxVerifier) RewardValidatorTx(*txs.RewardValidatorTx) error { return errWrongTxType }
func (v *MempoolTxVerifier) AddValidatorTx(tx *txs.AddValidatorTx) error {
return v.proposalTx(tx)
}
func (v *MempoolTxVerifier) AddSubnetValidatorTx(tx *txs.AddSubnetValidatorTx) error {
return v.proposalTx(tx)
}
func (v *MempoolTxVerifier) AddDelegatorTx(tx *txs.AddDelegatorTx) error {
return v.proposalTx(tx)
}
func (v *MempoolTxVerifier) CreateChainTx(tx *txs.CreateChainTx) error {
return v.standardTx(tx)
}
func (v *MempoolTxVerifier) CreateSubnetTx(tx *txs.CreateSubnetTx) error {
return v.standardTx(tx)
}
func (v *MempoolTxVerifier) ImportTx(tx *txs.ImportTx) error {
return v.standardTx(tx)
}
func (v *MempoolTxVerifier) ExportTx(tx *txs.ExportTx) error {
return v.standardTx(tx)
}
func (v *MempoolTxVerifier) proposalTx(tx txs.StakerTx) error {
startTime := tx.StartTime()
maxLocalStartTime := v.Clk.Time().Add(MaxFutureStartTime)
if startTime.After(maxLocalStartTime) {
return errFutureStakeTime
}
executor := ProposalTxExecutor{
Backend: v.Backend,
ParentID: v.ParentID,
StateVersions: v.StateVersions,
Tx: v.Tx,
}
err := tx.Visit(&executor)
// We ignore [errFutureStakeTime] here because an advanceTimeTx will be
// issued before this transaction is issued.
if errors.Is(err, errFutureStakeTime) {
return nil
}
return err
}
func (v *MempoolTxVerifier) standardTx(tx txs.UnsignedTx) error {
state, err := state.NewDiff(
v.ParentID,
v.StateVersions,
)
if err != nil {
return err
}
executor := StandardTxExecutor{
Backend: v.Backend,
State: state,
Tx: v.Tx,
}
return tx.Visit(&executor)
}