Skip to content
Snippets Groups Projects
Commit b2e0fd29 authored by Miguel Montes's avatar Miguel Montes
Browse files

Cambio de mecanismo para obtención de bloques y encabezados

parent b6a1f902
No related branches found
No related tags found
No related merge requests found
......@@ -3,10 +3,12 @@ package bfa
import (
. "../clique"
. "../util"
"context"
"fmt"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/consensus/clique"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/rpc"
"math/big"
......@@ -16,6 +18,26 @@ import (
type Node rpc.Client
type Block struct {
ParentHash common.Hash `json:"parentHash"`
Coinbase common.Address `json:"miner"`
Root common.Hash `json:"stateRoot"`
TxHash common.Hash `json:"transactionsRoot"`
ReceiptHash common.Hash `json:"receiptsRoot"`
Bloom types.Bloom `json:"logsBloom"`
Difficulty *big.Int `json:"difficulty"`
Number *big.Int `json:"number"`
GasLimit uint64 `json:"gasLimit"`
GasUsed uint64 `json:"gasUsed"`
Time *big.Int `json:"timestamp"`
Extra []byte `json:"extraData"`
MixDigest common.Hash `json:"mixHash"`
Nonce types.BlockNonce `json:"nonce"`
Transactions []types.Transaction `json:"transactions"`
TotalDifficulty *big.Int `json:"totalDifficulty"`
Signer string `json:"signer"`
}
type Snapshot struct {
Number uint64 `json:"number"` // Block number where the snapshot was created
Hash common.Hash `json:"hash"` // Block hash where the snapshot was created
......@@ -124,7 +146,7 @@ func (node *Node) Coinbase() (coinbase string, err error) {
return
}
func (node *Node) BlockByNumber(blockNumber int64) types.Header {
func (node *Node) HeaderByNumber(blockNumber int64) types.Header {
var (
number string
resp types.Header
......@@ -134,12 +156,39 @@ func (node *Node) BlockByNumber(blockNumber int64) types.Header {
} else {
number = fmt.Sprintf("0x%x", blockNumber)
}
node.Call(&resp, "eth_getBlockByNumber", number, false)
node.Call(&resp, "eth_getBlockByNumber", number, true)
return resp
}
func (node *Node) BlockByNumber(blockNumber int64) (block Block) {
ethClient := ethclient.NewClient((*rpc.Client)(node))
b, err := ethClient.BlockByNumber(context.Background(), nil)
h := b.Header()
Check(err)
block.ParentHash = h.ParentHash
block.Coinbase = h.Coinbase
block.Root = h.Root
block.TxHash = h.TxHash
block.ReceiptHash = h.ReceiptHash
block.Bloom = h.Bloom
block.Difficulty = h.Difficulty
block.Number = h.Number
block.GasLimit = h.GasLimit
block.GasUsed = h.GasUsed
block.Time = h.Time
block.Extra = h.Extra
block.MixDigest = h.MixDigest
block.Nonce = h.Nonce
for _, transaction := range b.Transactions() {
block.Transactions = append(block.Transactions, *transaction)
}
block.Signer, err = GetSigner(h)
block.TotalDifficulty = b.DeprecatedTd()
return block
}
func (node *Node) BlockSigner(blockNumber int64) (signer string) {
header := node.BlockByNumber(blockNumber)
header := node.HeaderByNumber(blockNumber)
signer, err := GetSigner(&header)
Check(err)
return
......@@ -264,7 +313,7 @@ func (node *Node) SealersStatus(blockNumber int64) (status map[string]*SealerSta
}
}
notSeen := int64(len(status))
block := node.BlockByNumber(blockNumber)
block := node.HeaderByNumber(blockNumber)
blockNumber = block.Number.Int64()
until := Max(1, blockNumber-5*notSeen)
for notSeen > 0 {
......@@ -279,7 +328,7 @@ func (node *Node) SealersStatus(blockNumber int64) (status map[string]*SealerSta
break
}
blockNumber--
block = node.BlockByNumber(blockNumber)
block = node.HeaderByNumber(blockNumber)
}
return status
}
......
......@@ -395,6 +395,21 @@ func status() {
util.PrintJson(nodeStatus)
}
func block() {
var (
blockNumber int64
)
description = "Presenta la lista de selladores. Opcionalmente indica el último bloque sellado por cada uno."
setFlags()
flags.Int64Var(&blockNumber, "block-number", latest, "Número del bloque en el cual se quiere conocer la lista de selladores (-1 para el último)")
parseFlags()
url = updateURL(url)
node, err := bfa.Dial(url)
util.Check(err)
defer node.Close()
util.PrintJson(node.BlockByNumber(blockNumber))
}
func main() {
var (
commands = map[string]func(){
......@@ -403,17 +418,19 @@ func main() {
"vote": propose,
"autovote": autovote,
"status": status,
"block": block,
}
validCommands []string
)
for command := range commands {
validCommands = append(validCommands, command)
}
defer func() {
if err := recover(); err != nil {
log.Printf("Error: %s", err)
}
}()
sort.Strings(validCommands)
//defer func() {
// if err := recover(); err != nil {
// log.Printf("Error: %s", err)
// }
//}()
if len(os.Args) > 1 {
command = os.Args[1]
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment