Memoizing keccak hhash of address => transformer

This commit is contained in:
Elizabeth Engelman 2019-07-30 07:52:36 -05:00
parent 045d78be25
commit 18f47b7b6a
2 changed files with 67 additions and 18 deletions

View File

@ -33,22 +33,25 @@ import (
) )
type StorageWatcher struct { type StorageWatcher struct {
db *postgres.DB db *postgres.DB
diffSource string diffSource string
StorageFetcher fetcher.IStorageFetcher StorageFetcher fetcher.IStorageFetcher
Queue storage.IStorageQueue Queue storage.IStorageQueue
Transformers map[common.Address]transformer.StorageTransformer Transformers map[common.Address]transformer.StorageTransformer
KeccakAddressTransformers map[common.Address]transformer.StorageTransformer // keccak hash of an address => transformer
} }
func NewStorageWatcher(fetcher fetcher.IStorageFetcher, db *postgres.DB) StorageWatcher { func NewStorageWatcher(fetcher fetcher.IStorageFetcher, db *postgres.DB) StorageWatcher {
transformers := make(map[common.Address]transformer.StorageTransformer)
queue := storage.NewStorageQueue(db) queue := storage.NewStorageQueue(db)
transformers := make(map[common.Address]transformer.StorageTransformer)
keccakAddressTransformers := make(map[common.Address]transformer.StorageTransformer)
return StorageWatcher{ return StorageWatcher{
db: db, db: db,
diffSource: "csv", diffSource: "csv",
StorageFetcher: fetcher, StorageFetcher: fetcher,
Queue: queue, Queue: queue,
Transformers: transformers, Transformers: transformers,
KeccakAddressTransformers: keccakAddressTransformers,
} }
} }
@ -83,11 +86,16 @@ func (storageWatcher StorageWatcher) getTransformer(contractAddress common.Addre
storageTransformer, ok := storageWatcher.Transformers[contractAddress] storageTransformer, ok := storageWatcher.Transformers[contractAddress]
return storageTransformer, ok return storageTransformer, ok
} else if storageWatcher.diffSource == "geth" { } else if storageWatcher.diffSource == "geth" {
logrus.Debug("number of transformers", len(storageWatcher.Transformers)) storageTransformer, ok := storageWatcher.KeccakAddressTransformers[contractAddress]
for address, t := range storageWatcher.Transformers { if ok {
keccakOfTransformerAddress := common.BytesToAddress(crypto.Keccak256(address[:])) return storageTransformer, ok
if keccakOfTransformerAddress == contractAddress { } else {
return t, true for address, transformer := range storageWatcher.Transformers {
keccakOfTransformerAddress := common.BytesToAddress(crypto.Keccak256(address[:]))
if keccakOfTransformerAddress == contractAddress {
storageWatcher.KeccakAddressTransformers[contractAddress] = transformer
return transformer, true
}
} }
} }

View File

@ -56,12 +56,15 @@ var _ = Describe("Storage Watcher", func() {
gethDiff utils.StorageDiff gethDiff utils.StorageDiff
diffs chan utils.StorageDiff diffs chan utils.StorageDiff
storageWatcher watcher.StorageWatcher storageWatcher watcher.StorageWatcher
address common.Address
keccakOfAddress common.Address
) )
BeforeEach(func() { BeforeEach(func() {
errs = make(chan error) errs = make(chan error)
diffs = make(chan utils.StorageDiff) diffs = make(chan utils.StorageDiff)
address := common.HexToAddress("0x0123456789abcdef") address = common.HexToAddress("0x0123456789abcdef")
keccakOfAddress = common.BytesToAddress(crypto.Keccak256(address[:]))
mockFetcher = mocks.NewMockStorageFetcher() mockFetcher = mocks.NewMockStorageFetcher()
mockQueue = &mocks.MockStorageQueue{} mockQueue = &mocks.MockStorageQueue{}
mockTransformer = &mocks.MockStorageTransformer{Address: address} mockTransformer = &mocks.MockStorageTransformer{Address: address}
@ -75,7 +78,7 @@ var _ = Describe("Storage Watcher", func() {
} }
gethDiff = utils.StorageDiff{ gethDiff = utils.StorageDiff{
Id: 1338, Id: 1338,
Contract: common.BytesToAddress(crypto.Keccak256(address[:])), Contract: keccakOfAddress,
BlockHash: common.HexToHash("0xfedcba9876543210"), BlockHash: common.HexToHash("0xfedcba9876543210"),
BlockHeight: 0, BlockHeight: 0,
StorageKey: common.HexToHash("0xabcdef1234567890"), StorageKey: common.HexToHash("0xabcdef1234567890"),
@ -208,6 +211,44 @@ var _ = Describe("Storage Watcher", func() {
}).Should(ContainSubstring(fakes.FakeError.Error())) }).Should(ContainSubstring(fakes.FakeError.Error()))
close(done) close(done)
}) })
It("keeps track transformers by the keccak256 hash of their contract address ", func(done Done) {
go storageWatcher.Execute(diffs, errs, time.Hour)
m := make(map[common.Address]transformer.StorageTransformer)
m[keccakOfAddress] = mockTransformer
Eventually(func() map[common.Address]transformer.StorageTransformer {
return storageWatcher.KeccakAddressTransformers
}).Should(Equal(m))
close(done)
})
It("gets the transformer from the known keccak address map first", func(done Done) {
anotherAddress := common.HexToAddress("0xafakeaddress")
anotherTransformer := &mocks.MockStorageTransformer{Address: anotherAddress}
keccakOfAnotherAddress := common.BytesToAddress(crypto.Keccak256(anotherAddress[:]))
anotherGethDiff := utils.StorageDiff{
Id: 1338,
Contract: keccakOfAnotherAddress,
BlockHash: common.HexToHash("0xfedcba9876543210"),
BlockHeight: 0,
StorageKey: common.HexToHash("0xabcdef1234567890"),
StorageValue: common.HexToHash("0x9876543210abcdef"),
}
mockFetcher.DiffsToReturn = []utils.StorageDiff{anotherGethDiff}
storageWatcher.KeccakAddressTransformers[keccakOfAnotherAddress] = anotherTransformer
go storageWatcher.Execute(diffs, errs, time.Hour)
Eventually(func() utils.StorageDiff {
return anotherTransformer.PassedDiff
}).Should(Equal(anotherGethDiff))
close(done)
})
}) })
}) })