kopia lustrzana https://github.com/bugout-dev/moonstream
107 wiersze
2.8 KiB
Go
107 wiersze
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
_ "github.com/lib/pq"
|
|
)
|
|
|
|
var (
|
|
databaseClient DatabaseClient
|
|
)
|
|
|
|
type DatabaseClient struct {
|
|
Client *sql.DB
|
|
}
|
|
|
|
// Establish connection with database
|
|
func InitDatabaseClient() error {
|
|
db, err := sql.Open("postgres", MOONSTREAM_DB_URI_READ_ONLY)
|
|
if err != nil {
|
|
return fmt.Errorf("DSN parse error or another database initialization error: %v", err)
|
|
}
|
|
|
|
// Set the maximum number of concurrently idle connections,
|
|
// by default sql.DB allows a maximum of 2 idle connections.
|
|
db.SetMaxIdleConns(MOONSTREAM_DB_MAX_IDLE_CONNS)
|
|
|
|
// Set the maximum lifetime of a connection.
|
|
// Longer lifetime increase memory usage.
|
|
db.SetConnMaxLifetime(MOONSTREAM_DB_CONN_MAX_LIFETIME)
|
|
|
|
databaseClient = DatabaseClient{
|
|
Client: db,
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type Block struct {
|
|
BlockNumber uint64 `json:"block_number"`
|
|
Difficulty uint64 `json:"difficulty"`
|
|
ExtraData string `json:"extra_data"`
|
|
GasLimit uint64 `json:"gas_limit"`
|
|
GasUsed uint64 `json:"gas_used"`
|
|
BaseFeePerGas interface{} `json:"base_fee_per_gas"`
|
|
Hash string `json:"hash"`
|
|
LogsBloom string `json:"logs_bloom"`
|
|
Miner string `json:"miner"`
|
|
Nonce string `json:"nonce"`
|
|
ParentHash string `json:"parent_hash"`
|
|
ReceiptRoot string `json:"receipt_root"`
|
|
Uncles string `json:"uncles"`
|
|
Size float64 `json:"size"`
|
|
StateRoot string `json:"state_root"`
|
|
Timestamp uint64 `json:"timestamp"`
|
|
TotalDifficulty string `json:"total_difficulty"`
|
|
TransactionsRoot string `json:"transactions_root"`
|
|
|
|
IndexedAt string `json:"indexed_at"`
|
|
}
|
|
|
|
// Get block from database
|
|
func (dbc *DatabaseClient) GetBlock(blockchain string, blockNumber uint64) (Block, error) {
|
|
var block Block
|
|
|
|
// var tableName string
|
|
// if blockchain == "ethereum" {
|
|
// tableName = "ethereum_blocks"
|
|
// } else if blockchain == "polygon" {
|
|
// tableName = "polygon_blocks"
|
|
// } else {
|
|
// return block, fmt.Errorf("Unsupported blockchain")
|
|
// }
|
|
row := dbc.Client.QueryRow(
|
|
"SELECT 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,indexed_at FROM ethereum_blocks WHERE block_number = $1",
|
|
// tableName,
|
|
blockNumber,
|
|
)
|
|
|
|
if err := row.Scan(
|
|
&block.BlockNumber,
|
|
&block.Difficulty,
|
|
&block.ExtraData,
|
|
&block.GasLimit,
|
|
&block.GasUsed,
|
|
&block.BaseFeePerGas,
|
|
&block.Hash,
|
|
&block.LogsBloom,
|
|
&block.Miner,
|
|
&block.Nonce,
|
|
&block.ParentHash,
|
|
&block.ReceiptRoot,
|
|
&block.Uncles,
|
|
&block.Size,
|
|
&block.StateRoot,
|
|
&block.Timestamp,
|
|
&block.TotalDifficulty,
|
|
&block.TransactionsRoot,
|
|
&block.IndexedAt,
|
|
); err != nil {
|
|
return block, err
|
|
}
|
|
|
|
return block, nil
|
|
}
|