From 7df396d9cec05a2fdf347afc65a6b7848d5f82a0 Mon Sep 17 00:00:00 2001 From: Nick Johnson Date: Fri, 17 Nov 2017 19:14:13 +0000 Subject: [PATCH] eth, internal: Implement using trie diffs --- eth/api.go | 30 ++++++++++++++++++++++++++++++ internal/web3ext/web3ext.go | 12 ++++++++++++ 2 files changed, 42 insertions(+) diff --git a/eth/api.go b/eth/api.go index e91f51bb99..bf06796ce4 100644 --- a/eth/api.go +++ b/eth/api.go @@ -636,3 +636,33 @@ func storageRangeAt(st state.Trie, start []byte, maxResult int) StorageRangeResu } return result } + +func (api *PrivateDebugAPI) GetDirtyAccountsByNumber(startNum, endNum uint64) ([]common.Address, error) { + return api.getDirtyAccounts(api.eth.blockchain.GetBlockByNumber(startNum), api.eth.blockchain.GetBlockByNumber(endNum)) +} + +func (api *PrivateDebugAPI) GetDirtyAccountsByHash(startHash, endHash common.Hash) ([]common.Address, error) { + return api.getDirtyAccounts( + api.eth.blockchain.GetBlockByHash(startHash), + api.eth.blockchain.GetBlockByHash(endHash)) +} + +func (api *PrivateDebugAPI) getDirtyAccounts(startBlock, endBlock *types.Block) ([]common.Address, error) { + oldTrie, err := trie.NewSecure(startBlock.Root(), api.eth.chainDb, 0) + if err != nil { + return nil, err + } + + newTrie, err := trie.NewSecure(endBlock.Root(), api.eth.chainDb, 0) + if err != nil { + return nil, err + } + + diff, _ := trie.NewDifferenceIterator(oldTrie.NodeIterator([]byte{}), newTrie.NodeIterator([]byte{})) + iter := trie.NewIterator(diff) + var dirty []common.Address + for iter.Next() { + dirty = append(dirty, common.BytesToAddress(newTrie.GetKey(iter.Key))) + } + return dirty, nil +} diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 1ae6e2d738..fa81472e2c 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -354,6 +354,18 @@ web3._extend({ call: 'debug_storageRangeAt', params: 5, }), + new web3._extend.Method({ + name: 'getDirtyAccountsByNumber', + call: 'debug_getDirtyAccountsByNumber', + params: 2, + inputFormatter: [null, null], + }), + new web3._extend.Method({ + name: 'getDirtyAccountsByHash', + call: 'debug_getDirtyAccountsByHash', + params: 2, + inputFormatter:[web3._extend.formatters.inputAddressFormatter, web3._extend.formatters.inputAddressFormatter], + }), ], properties: [] });