-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathvalidator.go
142 lines (117 loc) · 5.12 KB
/
validator.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package http
import (
"encoding/hex"
"fmt"
consensus "github.com/umbracle/go-eth-consensus"
)
type ValidatorEndpoint struct {
c *Client
}
func (c *Client) Validator() *ValidatorEndpoint {
return &ValidatorEndpoint{c: c}
}
type AttesterDuty struct {
PubKey string `json:"pubkey"`
ValidatorIndex uint `json:"validator_index"`
Slot uint64 `json:"slot"`
CommitteeIndex uint64 `json:"committee_index"`
CommitteeLength uint64 `json:"committee_length"`
CommitteeAtSlot uint64 `json:"committees_at_slot"`
ValidatorCommitteeIndex uint64 `json:"validator_committee_index"`
}
func (v *ValidatorEndpoint) GetAttesterDuties(epoch uint64, indexes []string) ([]*AttesterDuty, error) {
var out []*AttesterDuty
err := v.c.Post(fmt.Sprintf("/eth/v1/validator/duties/attester/%d", epoch), indexes, &out)
return out, err
}
type ProposerDuty struct {
PubKey string `json:"pubkey"`
ValidatorIndex uint `json:"validator_index"`
Slot uint64 `json:"slot"`
}
func (v *ValidatorEndpoint) GetProposerDuties(epoch uint64) ([]*ProposerDuty, error) {
var out []*ProposerDuty
err := v.c.Get(fmt.Sprintf("/eth/v1/validator/duties/proposer/%d", epoch), &out)
return out, err
}
type CommitteeSyncDuty struct {
PubKey string `json:"pubkey"`
ValidatorIndex uint `json:"validator_index"`
ValidatorSyncCommitteeIndices []string `json:"validator_sync_committee_indices"`
}
func (v *ValidatorEndpoint) GetCommitteeSyncDuties(epoch uint64, indexes []string) ([]*CommitteeSyncDuty, error) {
var out []*CommitteeSyncDuty
err := v.c.Post(fmt.Sprintf("/eth/v1/validator/duties/sync/%d", epoch), indexes, &out)
return out, err
}
func (v *ValidatorEndpoint) GetBlock(out consensus.BeaconBlock, slot uint64, randao [96]byte) error {
buf := "0x" + hex.EncodeToString(randao[:])
err := v.c.Get(fmt.Sprintf("/eth/v2/validator/blocks/%d?randao_reveal=%s", slot, buf), &out)
return err
}
func (v *ValidatorEndpoint) RequestAttestationData(slot uint64, committeeIndex uint64) (*consensus.AttestationData, error) {
var out *consensus.AttestationData
err := v.c.Get(fmt.Sprintf("/eth/v1/validator/attestation_data?slot=%d&committee_index=%d", slot, committeeIndex), &out)
return out, err
}
func (v *ValidatorEndpoint) AggregateAttestation(slot uint64, root [32]byte) (*consensus.Attestation, error) {
var out *consensus.Attestation
err := v.c.Get(fmt.Sprintf("/eth/v1/validator/aggregate_attestation?slot=%d&attestation_data_root=0x%s", slot, hex.EncodeToString(root[:])), &out)
return out, err
}
func (v *ValidatorEndpoint) PublishAggregateAndProof(data []*consensus.SignedAggregateAndProof) error {
err := v.c.Post("/eth/v1/validator/aggregate_and_proofs", data, nil)
return err
}
type BeaconCommitteeSubscription struct {
ValidatorIndex uint64 `json:"validator_index"`
Slot uint64 `json:"slot"`
CommitteeIndex uint64 `json:"committee_index"`
CommitteesAtSlot uint64 `json:"committee_at_slot"`
IsAggregator bool `json:"is_aggregator"`
}
func (v *ValidatorEndpoint) BeaconCommitteeSubscriptions(subs []*BeaconCommitteeSubscription) error {
err := v.c.Post("/eth/v1/validator/beacon_committee_subscriptions", subs, nil)
return err
}
type SyncCommitteeSubscription struct {
ValidatorIndex uint64 `json:"validator_index"`
SyncCommitteeIndices []uint64 `json:"sync_committee_indices"`
UntilEpoch uint64 `json:"until_epoch"`
}
func (v *ValidatorEndpoint) SyncCommitteeSubscriptions(subs []*SyncCommitteeSubscription) error {
err := v.c.Post("/eth/v1/validator/sync_committee_subscriptions", subs, nil)
return err
}
// produces a sync committee contribution
func (v *ValidatorEndpoint) SyncCommitteeContribution(slot uint64, subCommitteeIndex uint64, root [32]byte) (*consensus.SyncCommitteeContribution, error) {
var out *consensus.SyncCommitteeContribution
err := v.c.Get(fmt.Sprintf("/eth/v1/validator/sync_committee_contribution?slot=%d&subcommittee_index=%d&beacon_block_root=0x%s", slot, subCommitteeIndex, hex.EncodeToString(root[:])), &out)
return out, err
}
func (v *ValidatorEndpoint) SubmitSignedContributionAndProof(signedContribution []*consensus.SignedContributionAndProof) error {
err := v.c.Post("/eth/v1/validator/contribution_and_proofs", signedContribution, nil)
return err
}
type ProposalPreparation struct {
ValidatorIndex uint64
FeeRecipient [20]byte
}
func (v *ValidatorEndpoint) PrepareBeaconProposer(input []*ProposalPreparation) error {
err := v.c.Post("/eth/v1/validator/prepare_beacon_proposer", input, nil)
return err
}
type RegisterValidatorRequest struct {
FeeRecipient [20]byte `json:"fee_recipient" ssz-size:"20"`
GasLimit uint64 `json:"gas_limit,string"`
Timestamp uint64 `json:"timestamp,string"`
Pubkey [48]byte `json:"pubkey" ssz-size:"48"`
}
type SignedValidatorRegistration struct {
Message *RegisterValidatorRequest `json:"message"`
Signature [96]byte `json:"signature" ssz-size:"96"`
}
func (v *ValidatorEndpoint) RegisterValidator(msg []*SignedValidatorRegistration) error {
err := v.c.Post("/eth/v1/validator/register_validator", msg, nil)
return err
}