diff --git a/statediff/indexer/indexer.go b/statediff/indexer/indexer.go index f0a24c730..62135e5ba 100644 --- a/statediff/indexer/indexer.go +++ b/statediff/indexer/indexer.go @@ -23,6 +23,8 @@ import ( "math/big" "time" + "github.com/lib/pq" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" @@ -163,7 +165,8 @@ func (sdi *StateDiffIndexer) PushBlock(block *types.Block, receipts types.Receip t = time.Now() // Publish and index header, collect headerID - headerID, err := sdi.processHeader(tx, block.Header(), headerNode, reward, totalDifficulty) + var headerID int64 + headerID, err = sdi.processHeader(tx, block.Header(), headerNode, reward, totalDifficulty) if err != nil { return nil, err } @@ -321,11 +324,36 @@ func (sdi *StateDiffIndexer) processReceiptsAndTxs(tx *sqlx.Tx, args processArgs Data: trx.Data(), CID: txNode.Cid().String(), MhKey: shared.MultihashKeyFromCID(txNode.Cid()), + Type: trx.Type(), } txID, err := sdi.dbWriter.upsertTransactionCID(tx, txModel, args.headerID) if err != nil { return err } + + // AccessListEntryModel is the db model for eth.access_list_entry + type AccessListElementModel struct { + ID int64 `db:"id"` + Index int64 `db:"index"` + TxID int64 `db:"tx_id"` + Address string `db:"address"` + StorageKeys pq.StringArray `db:"storage_keys"` + } + // index access list if this is one + for j, accessListElement := range trx.AccessList() { + storageKeys := make([]string, len(accessListElement.StorageKeys)) + for k, storageKey := range accessListElement.StorageKeys { + storageKeys[k] = storageKey.Hex() + } + accessListElementModel := models.AccessListElementModel{ + Index: int64(j), + Address: accessListElement.Address.Hex(), + StorageKeys: storageKeys, + } + if err := sdi.dbWriter.upsertAccessListElement(tx, accessListElementModel, txID); err != nil { + return err + } + } // index the receipt rctModel := models.ReceiptModel{ Topic0s: topicSets[0], diff --git a/statediff/indexer/writer.go b/statediff/indexer/writer.go index db71538f4..b523c057f 100644 --- a/statediff/indexer/writer.go +++ b/statediff/indexer/writer.go @@ -80,6 +80,17 @@ func (in *PostgresCIDWriter) upsertTransactionCID(tx *sqlx.Tx, transaction model return txID, nil } +func (in *PostgresCIDWriter) upsertAccessListElement(tx *sqlx.Tx, accessListElement models.AccessListElementModel, txID int64) error { + _, err := tx.Exec(`INSERT INTO eth.access_list_element (tx_id, index, address, storage_keys) VALUES ($1, $2, $3, $4) + ON CONFLICT (tx_id, index) DO UPDATE SET (address, storage_keys) = ($3, $4)`, + txID, accessListElement.Index, accessListElement.Address, accessListElement.StorageKeys) + if err != nil { + return fmt.Errorf("error upserting access_list_element entry: %v", err) + } + indexerMetrics.accessListEntries.Inc(1) + return nil +} + func (in *PostgresCIDWriter) upsertReceiptCID(tx *sqlx.Tx, rct models.ReceiptModel, txID int64) error { _, err := tx.Exec(`INSERT INTO eth.receipt_cids (tx_id, cid, contract, contract_hash, topic0s, topic1s, topic2s, topic3s, log_contracts, mh_key, post_state, post_status) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) ON CONFLICT (tx_id) DO UPDATE SET (cid, contract, contract_hash, topic0s, topic1s, topic2s, topic3s, log_contracts, mh_key, post_state, post_status) = ($2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`,