diff options
Diffstat (limited to 'plugin/evm/block.go')
-rw-r--r-- | plugin/evm/block.go | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/plugin/evm/block.go b/plugin/evm/block.go new file mode 100644 index 0000000..ec47490 --- /dev/null +++ b/plugin/evm/block.go @@ -0,0 +1,75 @@ +// (c) 2019-2020, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package evm + +import ( + "fmt" + + "github.com/ava-labs/go-ethereum/core/types" + "github.com/ava-labs/go-ethereum/rlp" + + "github.com/ava-labs/gecko/ids" + "github.com/ava-labs/gecko/snow/choices" + "github.com/ava-labs/gecko/snow/consensus/snowman" +) + +// Block implements the snowman.Block interface +type Block struct { + id ids.ID + ethBlock *types.Block + vm *VM +} + +// ID implements the snowman.Block interface +func (b *Block) ID() ids.ID { return b.id } + +// Accept implements the snowman.Block interface +func (b *Block) Accept() { + b.vm.ctx.Log.Verbo("Block %s is accepted", b.ID()) + b.vm.updateStatus(b.ID(), choices.Accepted) +} + +// Reject implements the snowman.Block interface +func (b *Block) Reject() { + b.vm.ctx.Log.Verbo("Block %s is rejected", b.ID()) + b.vm.updateStatus(b.ID(), choices.Rejected) +} + +// Status implements the snowman.Block interface +func (b *Block) Status() choices.Status { + status := b.vm.getCachedStatus(b.ID()) + if status == choices.Unknown && b.ethBlock != nil { + return choices.Processing + } + return status +} + +// Parent implements the snowman.Block interface +func (b *Block) Parent() snowman.Block { + parentID := ids.NewID(b.ethBlock.ParentHash()) + block := &Block{ + id: parentID, + ethBlock: b.vm.getCachedBlock(parentID), + vm: b.vm, + } + b.vm.ctx.Log.Verbo("Parent(%s) has status: %s", block.ID(), block.Status()) + return block +} + +// Verify implements the snowman.Block interface +func (b *Block) Verify() error { + _, err := b.vm.chain.InsertChain([]*types.Block{b.ethBlock}) + return err +} + +// Bytes implements the snowman.Block interface +func (b *Block) Bytes() []byte { + res, err := rlp.EncodeToBytes(b.ethBlock) + if err != nil { + panic(err) + } + return res +} + +func (b *Block) String() string { return fmt.Sprintf("EVM block, ID = %s", b.ID()) } |