aboutsummaryrefslogtreecommitdiff
path: root/plugin/evm/block.go
diff options
context:
space:
mode:
authorDeterminant <[email protected]>2020-08-20 00:44:56 -0400
committerDeterminant <[email protected]>2020-08-20 00:44:56 -0400
commit5fc26bb832c715cfd2628585d41bb82209ecdfe4 (patch)
treeba2d409dc6ffb1e2edbe47becc33987df1ff8d81 /plugin/evm/block.go
parenteeb62be039927d461bcd5bebc456e3ab1a31307c (diff)
...
Diffstat (limited to 'plugin/evm/block.go')
-rw-r--r--plugin/evm/block.go65
1 files changed, 36 insertions, 29 deletions
diff --git a/plugin/evm/block.go b/plugin/evm/block.go
index 1cbf0b7..d75ea1d 100644
--- a/plugin/evm/block.go
+++ b/plugin/evm/block.go
@@ -4,6 +4,7 @@
package evm
import (
+ "errors"
"fmt"
"github.com/ava-labs/coreth/core/types"
@@ -62,39 +63,45 @@ func (b *Block) Parent() snowman.Block {
// Verify implements the snowman.Block interface
func (b *Block) Verify() error {
vm := b.vm
- if b.ethBlock.Hash() == vm.genesisHash {
- return nil
- }
- p := b.Parent()
- path := []*Block{}
- inputs := new(ids.Set)
- for {
- if p.Status() == choices.Accepted || p.(*Block).ethBlock.Hash() == vm.genesisHash {
- break
+ tx := vm.getAtomicTx(b.ethBlock)
+ switch atx := tx.UnsignedTx.(type) {
+ case *UnsignedImportTx:
+ if b.ethBlock.Hash() == vm.genesisHash {
+ return nil
}
- if ret, hit := vm.blockAtomicInputCache.Get(p.ID()); hit {
- inputs = ret.(*ids.Set)
- break
+ p := b.Parent()
+ path := []*Block{}
+ inputs := new(ids.Set)
+ for {
+ if p.Status() == choices.Accepted || p.(*Block).ethBlock.Hash() == vm.genesisHash {
+ break
+ }
+ if ret, hit := vm.blockAtomicInputCache.Get(p.ID()); hit {
+ inputs = ret.(*ids.Set)
+ break
+ }
+ path = append(path, p.(*Block))
+ p = p.Parent().(*Block)
}
- path = append(path, p.(*Block))
- p = p.Parent().(*Block)
- }
- for i := len(path) - 1; i >= 0; i-- {
- inputsCopy := new(ids.Set)
- p := path[i]
- atx := vm.getAtomicTx(p.ethBlock)
- inputs.Union(atx.UnsignedTx.(UnsignedAtomicTx).InputUTXOs())
- inputsCopy.Union(*inputs)
- vm.blockAtomicInputCache.Put(p.ID(), inputsCopy)
- }
- tx := b.vm.getAtomicTx(b.ethBlock)
- atx := tx.UnsignedTx.(*UnsignedImportTx)
- for _, in := range atx.InputUTXOs().List() {
- if inputs.Contains(in) {
- return errInvalidBlock
+ for i := len(path) - 1; i >= 0; i-- {
+ inputsCopy := new(ids.Set)
+ p := path[i]
+ atx := vm.getAtomicTx(p.ethBlock)
+ inputs.Union(atx.UnsignedTx.(UnsignedAtomicTx).InputUTXOs())
+ inputsCopy.Union(*inputs)
+ vm.blockAtomicInputCache.Put(p.ID(), inputsCopy)
}
+ for _, in := range atx.InputUTXOs().List() {
+ if inputs.Contains(in) {
+ return errInvalidBlock
+ }
+ }
+ case *UnsignedExportTx:
+ default:
+ return errors.New("unknown atomic tx type")
}
- if atx.SemanticVerify(b.vm, tx) != nil {
+
+ if tx.UnsignedTx.(UnsignedAtomicTx).SemanticVerify(vm, tx) != nil {
return errInvalidBlock
}