From ec510811cd3710bd466bad0af08c70a51459c17b Mon Sep 17 00:00:00 2001 From: Martin Boehm Date: Fri, 28 Jan 2022 10:06:30 +0100 Subject: [PATCH] Refactor storing Ethereum block specific data --- db/bulkconnect.go | 17 +++++++---------- db/rocksdb.go | 7 ++----- db/rocksdb_ethereumtype.go | 21 ++++++++++++++++++--- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/db/bulkconnect.go b/db/bulkconnect.go index f6bf4ba0..39adee34 100644 --- a/db/bulkconnect.go +++ b/db/bulkconnect.go @@ -307,26 +307,23 @@ func (b *BulkConnect) connectBlockEthereumType(block *bchain.Block, storeBlockTx defer wb.Destroy() bac := b.bulkAddressesCount if sa || b.bulkAddressesCount > maxBulkAddresses { - if err := b.storeBulkAddresses(wb); err != nil { + if err = b.storeBulkAddresses(wb); err != nil { return err } } - if err := b.d.storeInternalDataEthereumType(wb, b.ethBlockTxs); err != nil { + if err = b.d.storeInternalDataEthereumType(wb, b.ethBlockTxs); err != nil { return err } b.ethBlockTxs = b.ethBlockTxs[:0] - blockSpecificData, _ := block.CoinSpecificData.(*bchain.EthereumBlockSpecificData) - if blockSpecificData != nil && blockSpecificData.InternalDataError != "" { - if err := b.d.storeBlockInternalDataErrorEthereumType(wb, block, blockSpecificData.InternalDataError); err != nil { - return err - } + if err = b.d.storeBlockSpecificDataEthereumType(wb, block); err != nil { + return err } if storeBlockTxs { - if err := b.d.storeAndCleanupBlockTxsEthereumType(wb, block, blockTxs); err != nil { + if err = b.d.storeAndCleanupBlockTxsEthereumType(wb, block, blockTxs); err != nil { return err } } - if err := b.d.db.Write(b.d.wo, wb); err != nil { + if err = b.d.db.Write(b.d.wo, wb); err != nil { return err } if bac > b.bulkAddressesCount { @@ -338,7 +335,7 @@ func (b *BulkConnect) connectBlockEthereumType(block *bchain.Block, storeBlockTx if blockSpecificData != nil && blockSpecificData.InternalDataError != "" { wb := gorocksdb.NewWriteBatch() defer wb.Destroy() - if err := b.d.storeBlockInternalDataErrorEthereumType(wb, block, blockSpecificData.InternalDataError); err != nil { + if err = b.d.storeBlockSpecificDataEthereumType(wb, block); err != nil { return err } } diff --git a/db/rocksdb.go b/db/rocksdb.go index 4438db17..4ef396d2 100644 --- a/db/rocksdb.go +++ b/db/rocksdb.go @@ -484,11 +484,8 @@ func (d *RocksDB) ConnectBlock(block *bchain.Block) error { if err := d.storeInternalDataEthereumType(wb, blockTxs); err != nil { return err } - blockSpecificData, _ := block.CoinSpecificData.(*bchain.EthereumBlockSpecificData) - if blockSpecificData != nil && blockSpecificData.InternalDataError != "" { - if err := d.storeBlockInternalDataErrorEthereumType(wb, block, blockSpecificData.InternalDataError); err != nil { - return err - } + if err = d.storeBlockSpecificDataEthereumType(wb, block); err != nil { + return err } if err := d.storeAndCleanupBlockTxsEthereumType(wb, block, blockTxs); err != nil { return err diff --git a/db/rocksdb_ethereumtype.go b/db/rocksdb_ethereumtype.go index 03bbcf49..2e2eb4da 100644 --- a/db/rocksdb_ethereumtype.go +++ b/db/rocksdb_ethereumtype.go @@ -215,8 +215,8 @@ func addToContract(c *AddrContract, contractIndex int, index int32, contract bch aggregate = func(s, v *big.Int) { s.Sub(s, v) if s.Sign() < 0 { - glog.Warningf("rocksdb: addToContracts: contract %s, from %s, negative aggregate", transfer.Contract, transfer.From) - s.SetInt64(0) + // glog.Warningf("rocksdb: addToContracts: contract %s, from %s, negative aggregate", transfer.Contract, transfer.From) + s.SetUint64(0) } } } else { @@ -254,8 +254,12 @@ func addToContract(c *AddrContract, contractIndex int, index int32, contract bch } } // if not found and transfer to, add to the list + // it is necessary to add a copy of the value so that subsequent calls to addToContract do not change the transfer value if index >= 0 { - c.IdValues = append(c.IdValues, t) + c.IdValues = append(c.IdValues, bchain.TokenTransferIdValue{ + Id: t.Id, + Value: *new(big.Int).Set(&t.Value), + }) } nextTransfer: } @@ -665,6 +669,17 @@ func (d *RocksDB) storeBlockInternalDataErrorEthereumType(wb *gorocksdb.WriteBat return nil } +func (d *RocksDB) storeBlockSpecificDataEthereumType(wb *gorocksdb.WriteBatch, block *bchain.Block) error { + blockSpecificData, _ := block.CoinSpecificData.(*bchain.EthereumBlockSpecificData) + if blockSpecificData != nil && blockSpecificData.InternalDataError != "" { + glog.Info("storeBlockSpecificDataEthereumType ", block.Height, ": ", blockSpecificData.InternalDataError) + if err := d.storeBlockInternalDataErrorEthereumType(wb, block, blockSpecificData.InternalDataError); err != nil { + return err + } + } + return nil +} + // unpackBlockTx unpacks ethBlockTx from buf, starting at position pos // the position is updated as the data is unpacked and returned to the caller func unpackBlockTx(buf []byte, pos int) (*ethBlockTx, int, error) {