pull/557/head
kompotkot 2022-03-06 00:11:13 +00:00
rodzic e8ae125dd1
commit 392bdf801d
2 zmienionych plików z 115 dodań i 35 usunięć

Wyświetl plik

@ -3,7 +3,7 @@ package cmd
import (
"fmt"
"github.com/bugout-dev/moonstream/crawlers/ldb/configs"
// "github.com/bugout-dev/moonstream/crawlers/ldb/configs"
"github.com/ethereum/go-ethereum/common"
_ "github.com/lib/pq"
@ -29,26 +29,45 @@ func (cb *CorruptBlocks) registerCorruptBlock(number uint64, source, description
}
func add(blockchain string, start, end uint64) error {
for i := start; i < end; i++ {
block, err := localConnections.getChainBlock(i)
if err != nil {
description := fmt.Sprintf("Unable to get block: %d from chain, err %v", i, err)
fmt.Println(description)
corruptBlocks.registerCorruptBlock(i, "blockchain", description)
continue
}
td := localConnections.Chain.GetTd(block.Hash(), block.NumberU64())
chainTxs := localConnections.getChainTxs(block.Hash(), i)
err = localConnections.writeDatabaseBlockTxs(blockchain, block, chainTxs, td)
if err != nil {
fmt.Printf("Error occurred due saving block %d with transactions in database: %v", i, err)
}
fmt.Printf("Processed block number: %d\r", i)
}
return nil
}
// Return range of block hashes with transaction hashes from blockchain
func show(start, end uint64) error {
for i := start; i <= end; i++ {
header, err := localConnections.getChainBlock(i)
block, err := localConnections.getChainBlock(i)
if err != nil {
fmt.Printf("Unable to get block: %d from chain, err %v\n", i, err)
continue
}
chainTxs := localConnections.getChainTxs(header.Hash(), i)
chainTxs := localConnections.getChainTxs(block.Hash(), i)
var txs []common.Hash
for _, tx := range chainTxs {
txs = append(txs, tx.Hash())
}
fmt.Printf("Block %d header with hash: %s and transactions: %s\n", header.Number, header.Hash().String(), txs)
fmt.Printf("Block %d block with hash: %s and transactions: %s\n", block.Number(), block.Hash().String(), txs)
}
return nil
@ -59,7 +78,7 @@ func verify(blockchain string, start, end uint64) error {
var cnt uint64 // Counter until report formed and sent to Humbug
for i := start; i < end; i++ {
header, err := localConnections.getChainBlock(i)
block, err := localConnections.getChainBlock(i)
if err != nil {
description := fmt.Sprintf("Unable to get block: %d from chain, err %v", i, err)
fmt.Println(description)
@ -67,7 +86,7 @@ func verify(blockchain string, start, end uint64) error {
continue
}
dbBlock, err := localConnections.getDatabaseBlockTxs(blockchain, header.Hash().String())
dbBlock, err := localConnections.getDatabaseBlockTxs(blockchain, block.Hash().String())
if err != nil {
description := fmt.Sprintf("Unable to get block: %d, err: %v", i, err)
@ -83,14 +102,14 @@ func verify(blockchain string, start, end uint64) error {
continue
}
if header.Number.Uint64() != dbBlock.Number.Uint64() {
if block.NumberU64() != dbBlock.Number.Uint64() {
description := fmt.Sprintf("Incorrect %d block retrieved from database", i)
fmt.Println(description)
corruptBlocks.registerCorruptBlock(i, "database", description)
continue
}
chainTxs := localConnections.getChainTxs(header.Hash(), i)
chainTxs := localConnections.getChainTxs(block.Hash(), i)
if len(chainTxs) != len(dbBlock.Transactions) {
description := fmt.Sprintf("Different number of transactions in block %d, err %v", i, err)
@ -102,19 +121,19 @@ func verify(blockchain string, start, end uint64) error {
fmt.Printf("Processed block number: %d\r", i)
cnt++
if cnt >= configs.BLOCK_RANGE_REPORT {
err := humbugReporter.submitReport(start, end)
if err != nil {
return fmt.Errorf("Unable to send humbug report: %v", err)
}
cnt = 0
}
// if cnt >= configs.BLOCK_RANGE_REPORT {
// err := humbugReporter.submitReport(start, end)
// if err != nil {
// return fmt.Errorf("Unable to send humbug report: %v", err)
// }
// cnt = 0
// }
}
err := humbugReporter.submitReport(start, end)
if err != nil {
return fmt.Errorf("Unable to send humbug report: %v", err)
}
// err := humbugReporter.submitReport(start, end)
// if err != nil {
// return fmt.Errorf("Unable to send humbug report: %v", err)
// }
fmt.Println("")
return nil

Wyświetl plik

@ -74,18 +74,18 @@ func setDatabase() error {
}
// Retrive block from blockchain
func (lc *LocalConnections) getChainBlock(number uint64) (*types.Header, error) {
header := lc.Chain.GetHeaderByNumber(number)
if header == nil {
func (lc *LocalConnections) getChainBlock(number uint64) (*types.Block, error) {
block := lc.Chain.GetBlockByNumber(number)
if block == nil {
return nil, fmt.Errorf("Not found %d block in chain", number)
}
return header, nil
return block, nil
}
// Retrive block transactions from blockchain
func (lc *LocalConnections) getChainTxs(headerHash common.Hash, number uint64) []*types.Transaction {
func (lc *LocalConnections) getChainTxs(blockHash common.Hash, number uint64) []*types.Transaction {
var transactions []*types.Transaction
body := rawdb.ReadBody(lc.ChainDB, headerHash, number)
body := rawdb.ReadBody(lc.ChainDB, blockHash, number)
for _, tx := range body.Transactions {
transactions = append(transactions, tx)
}
@ -94,7 +94,7 @@ func (lc *LocalConnections) getChainTxs(headerHash common.Hash, number uint64) [
}
// Retrive block with transactions from database
func (lc *LocalConnections) getDatabaseBlockTxs(blockchain, headerHash string) (LightBlock, error) {
func (lc *LocalConnections) getDatabaseBlockTxs(blockchain, blockHash string) (LightBlock, error) {
var lBlock LightBlock
var txs []LightTransaction
query := fmt.Sprintf(
@ -105,15 +105,7 @@ func (lc *LocalConnections) getDatabaseBlockTxs(blockchain, headerHash string) (
FROM %s_blocks
LEFT JOIN %s_transactions ON %s_blocks.block_number = %s_transactions.block_number
WHERE %s_blocks.hash = '%s';`,
blockchain,
blockchain,
blockchain,
blockchain,
blockchain,
blockchain,
blockchain,
blockchain,
headerHash,
blockchain, blockchain, blockchain, blockchain, blockchain, blockchain, blockchain, blockchain, blockHash,
)
rows, err := lc.Database.Query(query)
if err != nil {
@ -151,3 +143,72 @@ func (lc *LocalConnections) getDatabaseBlockTxs(blockchain, headerHash string) (
return lBlock, nil
}
// Write block with transactions to database
func (lc *LocalConnections) writeDatabaseBlockTxs(
blockchain string, block *types.Block, txs []*types.Transaction, td *big.Int,
) error {
// block.extraData doesn't exist at Polygon mainnet
var extraData interface{}
if block.Extra() == nil {
extraData = "NULL"
} else {
extraData = fmt.Sprintf("'0x%x'", block.Extra())
}
// For support of blocks before London hardfork
var baseFee interface{}
if block.BaseFee() == nil {
baseFee = "NULL"
} else {
baseFee = block.BaseFee()
}
query := fmt.Sprintf(
`INSERT INTO ethereum_blocks (
block_number,
difficulty,
extra_data,
gas_limit,
gas_used,
base_fee_per_gas,
hash,
logs_bloom,
miner,
nonce,
parent_hash,
receipt_root,
uncles,
size,
state_root,
timestamp,
total_difficulty,
transactions_root
)
VALUES (%d, %d, %v, %d, %d, %v, '%s', '0x%x', '%s', '0x%x', '0x%x', '0x%x', '0x%x', %f, '0x%x', %d, %d, '0x%x');`,
block.Number(),
block.Difficulty(),
extraData,
block.GasLimit(),
block.GasUsed(),
baseFee,
block.Hash(),
block.Bloom(),
block.Coinbase(),
block.Nonce(),
block.ParentHash(),
block.ReceiptHash(),
block.UncleHash(),
block.Size(),
block.Root(),
block.Time(),
td,
block.TxHash(),
)
_, err := lc.Database.Exec(query)
if err != nil {
return fmt.Errorf("An error occurred during sql operation: %v", err)
}
return nil
}