aboutsummaryrefslogtreecommitdiff
path: root/consensus/clique/api.go
diff options
context:
space:
mode:
Diffstat (limited to 'consensus/clique/api.go')
-rw-r--r--consensus/clique/api.go62
1 files changed, 60 insertions, 2 deletions
diff --git a/consensus/clique/api.go b/consensus/clique/api.go
index 04e74eb..4776b97 100644
--- a/consensus/clique/api.go
+++ b/consensus/clique/api.go
@@ -17,16 +17,18 @@
package clique
import (
+ "fmt"
+
"github.com/ava-labs/coreth/consensus"
"github.com/ava-labs/coreth/core/types"
"github.com/ava-labs/coreth/rpc"
- "github.com/ava-labs/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common"
)
// API is a user facing RPC API to allow controlling the signer and voting
// mechanisms of the proof-of-authority scheme.
type API struct {
- chain consensus.ChainReader
+ chain consensus.ChainHeaderReader
clique *Clique
}
@@ -117,3 +119,59 @@ func (api *API) Discard(address common.Address) {
delete(api.clique.proposals, address)
}
+
+type status struct {
+ InturnPercent float64 `json:"inturnPercent"`
+ SigningStatus map[common.Address]int `json:"sealerActivity"`
+ NumBlocks uint64 `json:"numBlocks"`
+}
+
+// Status returns the status of the last N blocks,
+// - the number of active signers,
+// - the number of signers,
+// - the percentage of in-turn blocks
+func (api *API) Status() (*status, error) {
+ var (
+ numBlocks = uint64(64)
+ header = api.chain.CurrentHeader()
+ diff = uint64(0)
+ optimals = 0
+ )
+ snap, err := api.clique.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil)
+ if err != nil {
+ return nil, err
+ }
+ var (
+ signers = snap.signers()
+ end = header.Number.Uint64()
+ start = end - numBlocks
+ )
+ if numBlocks > end {
+ start = 1
+ numBlocks = end - start
+ }
+ signStatus := make(map[common.Address]int)
+ for _, s := range signers {
+ signStatus[s] = 0
+ }
+ for n := start; n < end; n++ {
+ h := api.chain.GetHeaderByNumber(n)
+ if h == nil {
+ return nil, fmt.Errorf("missing block %d", n)
+ }
+ if h.Difficulty.Cmp(diffInTurn) == 0 {
+ optimals++
+ }
+ diff += h.Difficulty.Uint64()
+ sealer, err := api.clique.Author(h)
+ if err != nil {
+ return nil, err
+ }
+ signStatus[sealer]++
+ }
+ return &status{
+ InturnPercent: float64(100*optimals) / float64(numBlocks),
+ SigningStatus: signStatus,
+ NumBlocks: numBlocks,
+ }, nil
+}