github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/ethapi/abft_api.go (about)

     1  package ethapi
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/unicornultrafoundation/go-helios/native/idx"
     7  
     8  	"github.com/unicornultrafoundation/go-u2u/common/hexutil"
     9  	"github.com/unicornultrafoundation/go-u2u/rpc"
    10  )
    11  
    12  // PublicAbftAPI provides an API to access consensus related information.
    13  // It offers only methods that operate on public data that is freely available to anyone.
    14  type PublicAbftAPI struct {
    15  	b Backend
    16  }
    17  
    18  // NewPublicAbftAPI creates a new SFC protocol API.
    19  func NewPublicAbftAPI(b Backend) *PublicAbftAPI {
    20  	return &PublicAbftAPI{b}
    21  }
    22  
    23  func (s *PublicAbftAPI) GetValidators(ctx context.Context, epoch rpc.BlockNumber) (map[hexutil.Uint64]interface{}, error) {
    24  	bs, es, err := s.b.GetEpochBlockState(ctx, epoch)
    25  	if err != nil {
    26  		return nil, err
    27  	}
    28  	if es == nil {
    29  		return nil, nil
    30  	}
    31  	res := map[hexutil.Uint64]interface{}{}
    32  	for _, vid := range es.Validators.IDs() {
    33  		profiles := es.ValidatorProfiles
    34  		if epoch == rpc.PendingBlockNumber {
    35  			profiles = bs.NextValidatorProfiles
    36  		}
    37  		res[hexutil.Uint64(vid)] = map[string]interface{}{
    38  			"weight": (*hexutil.Big)(profiles[vid].Weight),
    39  			"pubkey": profiles[vid].PubKey.String(),
    40  		}
    41  	}
    42  	return res, nil
    43  }
    44  
    45  // GetDowntime returns validator's downtime.
    46  func (s *PublicAbftAPI) GetDowntime(ctx context.Context, validatorID hexutil.Uint) (map[string]interface{}, error) {
    47  	blocks, period, err := s.b.GetDowntime(ctx, idx.ValidatorID(validatorID))
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  	return map[string]interface{}{
    52  		"offlineBlocks": hexutil.Uint64(blocks),
    53  		"offlineTime":   hexutil.Uint64(period),
    54  	}, nil
    55  }
    56  
    57  // GetEpochUptime returns validator's epoch uptime in nanoseconds.
    58  func (s *PublicAbftAPI) GetEpochUptime(ctx context.Context, validatorID hexutil.Uint) (hexutil.Uint64, error) {
    59  	v, err := s.b.GetUptime(ctx, idx.ValidatorID(validatorID))
    60  	if err != nil {
    61  		return 0, err
    62  	}
    63  	if v == nil {
    64  		return 0, nil
    65  	}
    66  	return hexutil.Uint64(v.Uint64()), nil
    67  }
    68  
    69  // GetOriginatedEpochFee returns validator's originated epoch fee.
    70  func (s *PublicAbftAPI) GetOriginatedEpochFee(ctx context.Context, validatorID hexutil.Uint) (*hexutil.Big, error) {
    71  	v, err := s.b.GetOriginatedFee(ctx, idx.ValidatorID(validatorID))
    72  	if err != nil {
    73  		return nil, err
    74  	}
    75  	return (*hexutil.Big)(v), nil
    76  }