kopia lustrzana https://github.com/bugout-dev/moonstream
Insert block
rodzic
e8ae125dd1
commit
392bdf801d
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue