From 2f795259b5b9f654f3ea4b8692ba0efa0747e69c Mon Sep 17 00:00:00 2001 From: i-norden Date: Mon, 6 Jun 2022 10:04:16 -0500 Subject: [PATCH] update ipld parser --- statediff/indexer/ipld/eth_parser.go | 67 ++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/statediff/indexer/ipld/eth_parser.go b/statediff/indexer/ipld/eth_parser.go index 03061f828..5e5728f5c 100644 --- a/statediff/indexer/ipld/eth_parser.go +++ b/statediff/indexer/ipld/eth_parser.go @@ -124,12 +124,12 @@ func FromBlockJSON(r io.Reader) (*EthHeader, []*EthTx, []*EthTxTrie, error) { } // FromBlockAndReceipts takes a block and processes it -// to return it a set of IPLD nodes for further processing. -func FromBlockAndReceipts(block *types.Block, receipts []*types.Receipt) (*EthHeader, []*EthHeader, []*EthTx, []*EthTxTrie, []*EthReceipt, []*EthRctTrie, [][]node.Node, [][]cid.Cid, []cid.Cid, error) { +// to return a set of IPLD nodes for further processing. +func FromBlockAndReceipts(block *types.Block, receipts []*types.Receipt) (*EthHeader, []*EthHeader, []*EthTx, []*EthReceipt, [][]*EthLog, error) { // Process the header headerNode, err := NewEthHeader(block.Header()) if err != nil { - return nil, nil, nil, nil, nil, nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, err } // Process the uncles @@ -137,23 +137,72 @@ func FromBlockAndReceipts(block *types.Block, receipts []*types.Receipt) (*EthHe for i, uncle := range block.Uncles() { uncleNode, err := NewEthHeader(uncle) if err != nil { - return nil, nil, nil, nil, nil, nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, err } uncleNodes[i] = uncleNode } // Process the txs - txNodes, txTrieNodes, err := processTransactions(block.Transactions(), - block.Header().TxHash[:]) + txNodes, err := processTransactionsSuccinct(block.Transactions()) if err != nil { - return nil, nil, nil, nil, nil, nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, err } // Process the receipts and logs - rctNodes, tctTrieNodes, logTrieAndLogNodes, logLeafNodeCIDs, rctLeafNodeCIDs, err := processReceiptsAndLogs(receipts, + rctNodes, logNodes, err := processReceiptsAndLogsSuccinct(receipts, block.Header().ReceiptHash[:]) - return headerNode, uncleNodes, txNodes, txTrieNodes, rctNodes, tctTrieNodes, logTrieAndLogNodes, logLeafNodeCIDs, rctLeafNodeCIDs, err + return headerNode, uncleNodes, txNodes, rctNodes, logNodes, err +} + +// processTransactions converts txs to IPLDs +func processTransactionsSuccinct(txs []*types.Transaction) ([]*EthTx, error) { + ethTxNodes := make([]*EthTx, len(txs)) + + for i, tx := range txs { + ethTx, err := NewEthTx(tx) + if err != nil { + return nil, err + } + ethTxNodes[i] = ethTx + } + return ethTxNodes, nil +} + +// processReceiptsAndLogsSuccinct will take in receipts and returns the IPLDs for the receipts and logs contained within +func processReceiptsAndLogsSuccinct(rcts []*types.Receipt, expectedRctRoot []byte) ([]*EthReceipt, [][]*EthLog, error) { + // Pre allocating memory. + ethRctNodes := make([]*EthReceipt, len(rcts)) + ethLogNodes := make([][]*EthLog, 0, len(rcts)) + + for i, rct := range rcts { + // Process logs for each receipt. + ethLogs, err := processLogsSuccinct(rct.Logs) + if err != nil { + return nil, nil, err + } + ethRct, err := NewReceipt(rct) + if err != nil { + return nil, nil, err + } + ethRctNodes[i] = ethRct + ethLogNodes[i] = ethLogs + } + + return ethRctNodes, ethLogNodes, nil +} + +func processLogsSuccinct(logs []*types.Log) ([]*EthLog, error) { + ethLogs := make([]*EthLog, len(logs)) + for i, log := range logs { + logNode, err := NewLog(log) + if err != nil { + return nil, err + } + ethLogs[i] = logNode + } + + return ethLogs, nil } // processTransactions will take the found transactions in a parsed block body