/
header.go
101 lines (85 loc) · 3.68 KB
/
header.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package header
import (
"context"
libhead "github.com/furyaxyz/go-header"
"github.com/furyaxyz/go-header/sync"
"github.com/furyaxyz/elysium-node/header"
)
// Module exposes the functionality needed for querying headers from the network.
// Any method signature changed here needs to also be changed in the API struct.
//
//go:generate mockgen -destination=mocks/api.go -package=mocks . Module
type Module interface {
// LocalHead returns the ExtendedHeader of the chain head.
LocalHead(context.Context) (*header.ExtendedHeader, error)
// GetByHash returns the header of the given hash from the node's header store.
GetByHash(ctx context.Context, hash libhead.Hash) (*header.ExtendedHeader, error)
// GetVerifiedRangeByHeight returns the given range [from:to) of ExtendedHeaders
// from the node's header store and verifies that the returned headers are
// adjacent to each other.
GetVerifiedRangeByHeight(
ctx context.Context,
from *header.ExtendedHeader,
to uint64,
) ([]*header.ExtendedHeader, error)
// GetByHeight returns the ExtendedHeader at the given height, blocking
// until header has been processed by the store or context deadline is exceeded.
GetByHeight(context.Context, uint64) (*header.ExtendedHeader, error)
// SyncState returns the current state of the header Syncer.
SyncState(context.Context) (sync.State, error)
// SyncWait blocks until the header Syncer is synced to network head.
SyncWait(ctx context.Context) error
// NetworkHead provides the Syncer's view of the current network head.
NetworkHead(ctx context.Context) (*header.ExtendedHeader, error)
// Subscribe to recent ExtendedHeaders from the network.
Subscribe(ctx context.Context) (<-chan *header.ExtendedHeader, error)
}
// API is a wrapper around Module for the RPC.
// TODO(@distractedm1nd): These structs need to be autogenerated.
type API struct {
Internal struct {
LocalHead func(context.Context) (*header.ExtendedHeader, error) `perm:"read"`
GetByHash func(
ctx context.Context,
hash libhead.Hash,
) (*header.ExtendedHeader, error) `perm:"public"`
GetVerifiedRangeByHeight func(
context.Context,
*header.ExtendedHeader,
uint64,
) ([]*header.ExtendedHeader, error) `perm:"public"`
GetByHeight func(context.Context, uint64) (*header.ExtendedHeader, error) `perm:"public"`
SyncState func(ctx context.Context) (sync.State, error) `perm:"read"`
SyncWait func(ctx context.Context) error `perm:"read"`
NetworkHead func(ctx context.Context) (*header.ExtendedHeader, error) `perm:"public"`
Subscribe func(ctx context.Context) (<-chan *header.ExtendedHeader, error) `perm:"public"`
}
}
func (api *API) GetByHash(ctx context.Context, hash libhead.Hash) (*header.ExtendedHeader, error) {
return api.Internal.GetByHash(ctx, hash)
}
func (api *API) GetVerifiedRangeByHeight(
ctx context.Context,
from *header.ExtendedHeader,
to uint64,
) ([]*header.ExtendedHeader, error) {
return api.Internal.GetVerifiedRangeByHeight(ctx, from, to)
}
func (api *API) GetByHeight(ctx context.Context, u uint64) (*header.ExtendedHeader, error) {
return api.Internal.GetByHeight(ctx, u)
}
func (api *API) LocalHead(ctx context.Context) (*header.ExtendedHeader, error) {
return api.Internal.LocalHead(ctx)
}
func (api *API) SyncState(ctx context.Context) (sync.State, error) {
return api.Internal.SyncState(ctx)
}
func (api *API) SyncWait(ctx context.Context) error {
return api.Internal.SyncWait(ctx)
}
func (api *API) NetworkHead(ctx context.Context) (*header.ExtendedHeader, error) {
return api.Internal.NetworkHead(ctx)
}
func (api *API) Subscribe(ctx context.Context) (<-chan *header.ExtendedHeader, error) {
return api.Internal.Subscribe(ctx)
}