diff --git a/bfa_client/src/bfa/node.go b/bfa_client/src/bfa/node.go index f04700caceaa2e1889e24d941ec7052363636a40..2a9fbd8df3b0588d46dcbebb3595b198b13acb89 100644 --- a/bfa_client/src/bfa/node.go +++ b/bfa_client/src/bfa/node.go @@ -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 } diff --git a/bfa_client/src/client/bfa_client.go b/bfa_client/src/client/bfa_client.go index 86890ca75e8ee12ab87c6115fec4dde31715e6fe..f4e323462a72572e5a0a8a2ebac18c9c5761a747 100644 --- a/bfa_client/src/client/bfa_client.go +++ b/bfa_client/src/client/bfa_client.go @@ -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] }