From 7957c5a92b19dde4ad440cc0720c60373fb3b46c Mon Sep 17 00:00:00 2001 From: Elizabeth Engelman Date: Wed, 28 Nov 2018 16:15:19 -0600 Subject: [PATCH] Add a state diff service --- cmd/geth/usage.go | 6 +++++ cmd/utils/flags.go | 13 +++++++++++ statediff/service.go | 54 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 statediff/service.go diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index 82f17e0ee..152ac059b 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -245,6 +245,12 @@ var AppHelpFlagGroups = []flagGroup{ utils.MinerLegacyExtraDataFlag, }, }, + { + Name: "STATE DIFF", + Flags: []cli.Flag{ + utils.StateDiffFlag, + }, + }, { Name: "MISC", }, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index c18d98383..b16f9cdca 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -58,6 +58,7 @@ import ( "github.com/ethereum/go-ethereum/params" whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" "gopkg.in/urfave/cli.v1" + "github.com/ethereum/go-ethereum/statediff" ) var ( @@ -1338,6 +1339,18 @@ func RegisterEthStatsService(stack *node.Node, url string) { } } +func RegisterStateDiffService(stack *node.Node) { + if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { + var ethServ *eth.Ethereum + ctx.Service(ðServ) + chainDb := ethServ.ChainDb() + blockChain := ethServ.BlockChain() + return statediff.NewStateDiffService(chainDb, blockChain) + }); err != nil { + Fatalf("Failed to register State Diff Service", err) + } +} + func SetupMetrics(ctx *cli.Context) { if metrics.Enabled { log.Info("Enabling metrics collection") diff --git a/statediff/service.go b/statediff/service.go new file mode 100644 index 000000000..695e3d638 --- /dev/null +++ b/statediff/service.go @@ -0,0 +1,54 @@ +package statediff + +import ( + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/ethdb" + "fmt" +) + +type StateDiffService struct { + builder *builder + extractor *extractor + blockchain *core.BlockChain +} + +func NewStateDiffService(db ethdb.Database, blockChain *core.BlockChain) (*StateDiffService, error) { + config := Config{} + extractor, _ := NewExtractor(db, config) + return &StateDiffService{ + blockchain: blockChain, + extractor: extractor, + }, nil +} + +func (StateDiffService) Protocols() []p2p.Protocol { + return []p2p.Protocol{} + +} + +func (StateDiffService) APIs() []rpc.API { + return []rpc.API{} +} + +func (sds *StateDiffService) Start(server *p2p.Server) error { + fmt.Println("starting the state diff service") + blockChannel := make(chan core.ChainHeadEvent) + sds.blockchain.SubscribeChainHeadEvent(blockChannel) + for { + select { + case <-blockChannel: + headOfChainEvent := <-blockChannel + previousBlock := headOfChainEvent.Block + //TODO: figure out the best way to get the previous block + currentBlock := headOfChainEvent.Block + sds.extractor.ExtractStateDiff(*previousBlock, *currentBlock) + } + } + return nil +} +func (StateDiffService) Stop() error { + fmt.Println("stopping the state diff service") + return nil +} \ No newline at end of file