mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-09 15:37:56 -05:00
Implement validator identities Beacon API endpoint (#15086)
* implementation * tests * changelog <3 * linter fix * test fix
This commit is contained in:
@@ -100,6 +100,12 @@ type GetValidatorBalancesResponse struct {
|
|||||||
Data []*ValidatorBalance `json:"data"`
|
Data []*ValidatorBalance `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GetValidatorIdentitiesResponse struct {
|
||||||
|
ExecutionOptimistic bool `json:"execution_optimistic"`
|
||||||
|
Finalized bool `json:"finalized"`
|
||||||
|
Data []*ValidatorIdentity `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
type ValidatorContainer struct {
|
type ValidatorContainer struct {
|
||||||
Index string `json:"index"`
|
Index string `json:"index"`
|
||||||
Balance string `json:"balance"`
|
Balance string `json:"balance"`
|
||||||
@@ -112,6 +118,12 @@ type ValidatorBalance struct {
|
|||||||
Balance string `json:"balance"`
|
Balance string `json:"balance"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ValidatorIdentity struct {
|
||||||
|
Index string `json:"index"`
|
||||||
|
Pubkey string `json:"pubkey"`
|
||||||
|
ActivationEpoch string `json:"activation_epoch"`
|
||||||
|
}
|
||||||
|
|
||||||
type GetBlockResponse struct {
|
type GetBlockResponse struct {
|
||||||
Data *SignedBlock `json:"data"`
|
Data *SignedBlock `json:"data"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -883,6 +883,16 @@ func (s *Service) beaconEndpoints(
|
|||||||
handler: server.GetValidatorBalances,
|
handler: server.GetValidatorBalances,
|
||||||
methods: []string{http.MethodGet, http.MethodPost},
|
methods: []string{http.MethodGet, http.MethodPost},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
template: "/eth/v1/beacon/states/{state_id}/validator_identities",
|
||||||
|
name: namespace + ".GetValidatorIdentities",
|
||||||
|
middleware: []middleware.Middleware{
|
||||||
|
middleware.ContentTypeHandler([]string{api.JsonMediaType}),
|
||||||
|
middleware.AcceptHeaderHandler([]string{api.JsonMediaType, api.OctetStreamMediaType}),
|
||||||
|
},
|
||||||
|
handler: server.GetValidatorIdentities,
|
||||||
|
methods: []string{http.MethodPost},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// Deprecated: no longer needed post Electra
|
// Deprecated: no longer needed post Electra
|
||||||
template: "/eth/v1/beacon/deposit_snapshot",
|
template: "/eth/v1/beacon/deposit_snapshot",
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ func Test_endpoints(t *testing.T) {
|
|||||||
"/eth/v1/beacon/states/{state_id}/validators": {http.MethodGet, http.MethodPost},
|
"/eth/v1/beacon/states/{state_id}/validators": {http.MethodGet, http.MethodPost},
|
||||||
"/eth/v1/beacon/states/{state_id}/validators/{validator_id}": {http.MethodGet},
|
"/eth/v1/beacon/states/{state_id}/validators/{validator_id}": {http.MethodGet},
|
||||||
"/eth/v1/beacon/states/{state_id}/validator_balances": {http.MethodGet, http.MethodPost},
|
"/eth/v1/beacon/states/{state_id}/validator_balances": {http.MethodGet, http.MethodPost},
|
||||||
|
"/eth/v1/beacon/states/{state_id}/validator_identities": {http.MethodPost},
|
||||||
"/eth/v1/beacon/states/{state_id}/committees": {http.MethodGet},
|
"/eth/v1/beacon/states/{state_id}/committees": {http.MethodGet},
|
||||||
"/eth/v1/beacon/states/{state_id}/sync_committees": {http.MethodGet},
|
"/eth/v1/beacon/states/{state_id}/sync_committees": {http.MethodGet},
|
||||||
"/eth/v1/beacon/states/{state_id}/randao": {http.MethodGet},
|
"/eth/v1/beacon/states/{state_id}/randao": {http.MethodGet},
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package beacon
|
package beacon
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -21,6 +22,7 @@ import (
|
|||||||
"github.com/prysmaticlabs/prysm/v5/encoding/bytesutil"
|
"github.com/prysmaticlabs/prysm/v5/encoding/bytesutil"
|
||||||
"github.com/prysmaticlabs/prysm/v5/monitoring/tracing/trace"
|
"github.com/prysmaticlabs/prysm/v5/monitoring/tracing/trace"
|
||||||
"github.com/prysmaticlabs/prysm/v5/network/httputil"
|
"github.com/prysmaticlabs/prysm/v5/network/httputil"
|
||||||
|
eth "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
||||||
"github.com/prysmaticlabs/prysm/v5/time/slots"
|
"github.com/prysmaticlabs/prysm/v5/time/slots"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -324,6 +326,152 @@ func (s *Server) GetValidatorBalances(w http.ResponseWriter, r *http.Request) {
|
|||||||
httputil.WriteJson(w, resp)
|
httputil.WriteJson(w, resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetValidatorIdentities returns a filterable list of validators identities.
|
||||||
|
func (s *Server) GetValidatorIdentities(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ctx, span := trace.StartSpan(r.Context(), "beacon.GetValidatorIdentities")
|
||||||
|
defer span.End()
|
||||||
|
|
||||||
|
stateId := r.PathValue("state_id")
|
||||||
|
if stateId == "" {
|
||||||
|
httputil.HandleError(w, "state_id is required in URL params", http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
st, err := s.Stater.State(ctx, []byte(stateId))
|
||||||
|
if err != nil {
|
||||||
|
shared.WriteStateFetchError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var rawIds []string
|
||||||
|
err = json.NewDecoder(r.Body).Decode(&rawIds)
|
||||||
|
switch {
|
||||||
|
case errors.Is(err, io.EOF):
|
||||||
|
httputil.HandleError(w, "No data submitted", http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
case err != nil:
|
||||||
|
httputil.HandleError(w, "Could not decode request body: "+err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ids, ok := decodeIds(w, st, rawIds, true /* ignore unknown */)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if httputil.RespondWithSsz(r) {
|
||||||
|
s.getValidatorIdentitiesSSZ(w, st, rawIds, ids)
|
||||||
|
} else {
|
||||||
|
s.getValidatorIdentitiesJSON(r.Context(), w, st, stateId, rawIds, ids)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) getValidatorIdentitiesSSZ(w http.ResponseWriter, st state.BeaconState, rawIds []string, ids []primitives.ValidatorIndex) {
|
||||||
|
// return no data if all IDs are ignored
|
||||||
|
if len(rawIds) > 0 && len(ids) == 0 {
|
||||||
|
httputil.WriteSsz(w, []byte{}, "validator_identities.ssz")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
vals := st.ValidatorsReadOnly()
|
||||||
|
var identities []*eth.ValidatorIdentity
|
||||||
|
if len(ids) == 0 {
|
||||||
|
identities = make([]*eth.ValidatorIdentity, len(vals))
|
||||||
|
for i, v := range vals {
|
||||||
|
pubkey := v.PublicKey()
|
||||||
|
identities[i] = ð.ValidatorIdentity{
|
||||||
|
Index: primitives.ValidatorIndex(i),
|
||||||
|
Pubkey: pubkey[:],
|
||||||
|
ActivationEpoch: v.ActivationEpoch(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
identities = make([]*eth.ValidatorIdentity, len(ids))
|
||||||
|
for i, id := range ids {
|
||||||
|
pubkey := vals[id].PublicKey()
|
||||||
|
identities[i] = ð.ValidatorIdentity{
|
||||||
|
Index: id,
|
||||||
|
Pubkey: pubkey[:],
|
||||||
|
ActivationEpoch: vals[id].ActivationEpoch(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sszLen := (ð.ValidatorIdentity{}).SizeSSZ()
|
||||||
|
resp := make([]byte, len(identities)*sszLen)
|
||||||
|
for i, vi := range identities {
|
||||||
|
ssz, err := vi.MarshalSSZ()
|
||||||
|
if err != nil {
|
||||||
|
httputil.HandleError(w, "Could not marshal validator identity to SSZ: "+err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
copy(resp[i*sszLen:(i+1)*sszLen], ssz)
|
||||||
|
}
|
||||||
|
httputil.WriteSsz(w, resp, "validator_identities.ssz")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) getValidatorIdentitiesJSON(
|
||||||
|
ctx context.Context,
|
||||||
|
w http.ResponseWriter,
|
||||||
|
st state.BeaconState,
|
||||||
|
stateId string,
|
||||||
|
rawIds []string,
|
||||||
|
ids []primitives.ValidatorIndex,
|
||||||
|
) {
|
||||||
|
isOptimistic, err := helpers.IsOptimistic(ctx, []byte(stateId), s.OptimisticModeFetcher, s.Stater, s.ChainInfoFetcher, s.BeaconDB)
|
||||||
|
if err != nil {
|
||||||
|
httputil.HandleError(w, "Could not check optimistic status: "+err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
blockRoot, err := st.LatestBlockHeader().HashTreeRoot()
|
||||||
|
if err != nil {
|
||||||
|
httputil.HandleError(w, "Could not calculate root of latest block header: "+err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
isFinalized := s.FinalizationFetcher.IsFinalized(ctx, blockRoot)
|
||||||
|
|
||||||
|
// return no data if all IDs are ignored
|
||||||
|
if len(rawIds) > 0 && len(ids) == 0 {
|
||||||
|
resp := &structs.GetValidatorIdentitiesResponse{
|
||||||
|
Data: []*structs.ValidatorIdentity{},
|
||||||
|
ExecutionOptimistic: isOptimistic,
|
||||||
|
Finalized: isFinalized,
|
||||||
|
}
|
||||||
|
httputil.WriteJson(w, resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
vals := st.ValidatorsReadOnly()
|
||||||
|
var identities []*structs.ValidatorIdentity
|
||||||
|
if len(ids) == 0 {
|
||||||
|
identities = make([]*structs.ValidatorIdentity, len(vals))
|
||||||
|
for i, v := range vals {
|
||||||
|
pubkey := v.PublicKey()
|
||||||
|
identities[i] = &structs.ValidatorIdentity{
|
||||||
|
Index: strconv.FormatUint(uint64(i), 10),
|
||||||
|
Pubkey: hexutil.Encode(pubkey[:]),
|
||||||
|
ActivationEpoch: strconv.FormatUint(uint64(v.ActivationEpoch()), 10),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
identities = make([]*structs.ValidatorIdentity, len(ids))
|
||||||
|
for i, id := range ids {
|
||||||
|
pubkey := vals[id].PublicKey()
|
||||||
|
identities[i] = &structs.ValidatorIdentity{
|
||||||
|
Index: strconv.FormatUint(uint64(id), 10),
|
||||||
|
Pubkey: hexutil.Encode(pubkey[:]),
|
||||||
|
ActivationEpoch: strconv.FormatUint(uint64(vals[id].ActivationEpoch()), 10),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := &structs.GetValidatorIdentitiesResponse{
|
||||||
|
Data: identities,
|
||||||
|
ExecutionOptimistic: isOptimistic,
|
||||||
|
Finalized: isFinalized,
|
||||||
|
}
|
||||||
|
httputil.WriteJson(w, resp)
|
||||||
|
}
|
||||||
|
|
||||||
// decodeIds takes in a list of validator ID strings (as either a pubkey or a validator index)
|
// decodeIds takes in a list of validator ID strings (as either a pubkey or a validator index)
|
||||||
// and returns the corresponding validator indices. It can be configured to ignore well-formed but unknown indices.
|
// and returns the corresponding validator indices. It can be configured to ignore well-formed but unknown indices.
|
||||||
func decodeIds(w http.ResponseWriter, st state.BeaconState, rawIds []string, ignoreUnknown bool) ([]primitives.ValidatorIndex, bool) {
|
func decodeIds(w http.ResponseWriter, st state.BeaconState, rawIds []string, ignoreUnknown bool) ([]primitives.ValidatorIndex, bool) {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
|
"github.com/prysmaticlabs/prysm/v5/api"
|
||||||
"github.com/prysmaticlabs/prysm/v5/api/server/structs"
|
"github.com/prysmaticlabs/prysm/v5/api/server/structs"
|
||||||
chainMock "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain/testing"
|
chainMock "github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain/testing"
|
||||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/rpc/lookup"
|
"github.com/prysmaticlabs/prysm/v5/beacon-chain/rpc/lookup"
|
||||||
@@ -946,16 +947,16 @@ func TestGetValidatorBalances(t *testing.T) {
|
|||||||
hexPubkey := hexutil.Encode(pubkey[:])
|
hexPubkey := hexutil.Encode(pubkey[:])
|
||||||
request := httptest.NewRequest(
|
request := httptest.NewRequest(
|
||||||
http.MethodGet,
|
http.MethodGet,
|
||||||
fmt.Sprintf("http://example.com/eth/v1/beacon/states/{state_id}/validators?id=%s&id=1", hexPubkey),
|
fmt.Sprintf("http://example.com/eth/v1/beacon/states/{state_id}/validator_balances?id=%s&id=1", hexPubkey),
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
request.SetPathValue("state_id", "head")
|
request.SetPathValue("state_id", "head")
|
||||||
writer := httptest.NewRecorder()
|
writer := httptest.NewRecorder()
|
||||||
writer.Body = &bytes.Buffer{}
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
s.GetValidators(writer, request)
|
s.GetValidatorBalances(writer, request)
|
||||||
assert.Equal(t, http.StatusOK, writer.Code)
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
resp := &structs.GetValidatorsResponse{}
|
resp := &structs.GetValidatorBalancesResponse{}
|
||||||
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
|
||||||
require.Equal(t, 2, len(resp.Data))
|
require.Equal(t, 2, len(resp.Data))
|
||||||
assert.Equal(t, "0", resp.Data[0].Index)
|
assert.Equal(t, "0", resp.Data[0].Index)
|
||||||
@@ -1025,7 +1026,7 @@ func TestGetValidatorBalances(t *testing.T) {
|
|||||||
writer := httptest.NewRecorder()
|
writer := httptest.NewRecorder()
|
||||||
writer.Body = &bytes.Buffer{}
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
s.GetValidator(writer, request)
|
s.GetValidatorBalances(writer, request)
|
||||||
assert.Equal(t, http.StatusBadRequest, writer.Code)
|
assert.Equal(t, http.StatusBadRequest, writer.Code)
|
||||||
e := &httputil.DefaultJsonError{}
|
e := &httputil.DefaultJsonError{}
|
||||||
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), e))
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), e))
|
||||||
@@ -1183,3 +1184,478 @@ func TestGetValidatorBalances(t *testing.T) {
|
|||||||
assert.StringContains(t, "Could not decode request body", e.Message)
|
assert.StringContains(t, "Could not decode request body", e.Message)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetValidatorIdentities(t *testing.T) {
|
||||||
|
count := uint64(4)
|
||||||
|
genesisState, _ := util.DeterministicGenesisState(t, count)
|
||||||
|
st := genesisState.ToProtoUnsafe().(*eth.BeaconState)
|
||||||
|
for i := uint64(0); i < count; i++ {
|
||||||
|
st.Validators[i].ActivationEpoch = primitives.Epoch(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("json", func(t *testing.T) {
|
||||||
|
t.Run("get all", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString("[]")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
resp := &structs.GetValidatorIdentitiesResponse{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
|
||||||
|
require.Equal(t, 4, len(resp.Data))
|
||||||
|
for i := uint64(0); i < count; i++ {
|
||||||
|
assert.Equal(t, fmt.Sprintf("%d", i), resp.Data[i].Index)
|
||||||
|
assert.DeepEqual(t, hexutil.Encode(st.Validators[i].PublicKey), resp.Data[i].Pubkey)
|
||||||
|
assert.Equal(t, fmt.Sprintf("%d", st.Validators[i].ActivationEpoch), resp.Data[i].ActivationEpoch)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
t.Run("get by index", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString("[\"0\",\"1\"]")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
resp := &structs.GetValidatorIdentitiesResponse{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
|
||||||
|
require.Equal(t, 2, len(resp.Data))
|
||||||
|
assert.Equal(t, "0", resp.Data[0].Index)
|
||||||
|
assert.Equal(t, "1", resp.Data[1].Index)
|
||||||
|
})
|
||||||
|
t.Run("get by pubkey", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
pubkey1 := st.Validators[0].PublicKey
|
||||||
|
pubkey2 := st.Validators[1].PublicKey
|
||||||
|
hexPubkey1 := hexutil.Encode(pubkey1)
|
||||||
|
hexPubkey2 := hexutil.Encode(pubkey2)
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString(fmt.Sprintf("[\"%s\",\"%s\"]", hexPubkey1, hexPubkey2))
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
resp := &structs.GetValidatorIdentitiesResponse{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
|
||||||
|
require.Equal(t, 2, len(resp.Data))
|
||||||
|
assert.Equal(t, "0", resp.Data[0].Index)
|
||||||
|
assert.Equal(t, "1", resp.Data[1].Index)
|
||||||
|
})
|
||||||
|
t.Run("get by both index and pubkey", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
pubkey := st.Validators[0].PublicKey
|
||||||
|
hexPubkey := hexutil.Encode(pubkey)
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString(fmt.Sprintf("[\"%s\",\"1\"]", hexPubkey))
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
resp := &structs.GetValidatorIdentitiesResponse{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
|
||||||
|
require.Equal(t, 2, len(resp.Data))
|
||||||
|
assert.Equal(t, "0", resp.Data[0].Index)
|
||||||
|
assert.Equal(t, "1", resp.Data[1].Index)
|
||||||
|
})
|
||||||
|
t.Run("unknown pubkey is ignored", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
pubkey := st.Validators[1].PublicKey
|
||||||
|
hexPubkey := hexutil.Encode(pubkey)
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString(fmt.Sprintf("[\"%s\",\"%s\"]", hexPubkey, hexutil.Encode([]byte(strings.Repeat("x", fieldparams.BLSPubkeyLength)))))
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
resp := &structs.GetValidatorIdentitiesResponse{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
|
||||||
|
require.Equal(t, 1, len(resp.Data))
|
||||||
|
assert.Equal(t, "1", resp.Data[0].Index)
|
||||||
|
})
|
||||||
|
t.Run("unknown index is ignored", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString("[\"1\",\"99999\"]")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
resp := &structs.GetValidatorIdentitiesResponse{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
|
||||||
|
require.Equal(t, 1, len(resp.Data))
|
||||||
|
assert.Equal(t, "1", resp.Data[0].Index)
|
||||||
|
})
|
||||||
|
t.Run("execution optimistic", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{Optimistic: true}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString("[]")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
resp := &structs.GetValidatorIdentitiesResponse{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
|
||||||
|
assert.Equal(t, true, resp.ExecutionOptimistic)
|
||||||
|
})
|
||||||
|
t.Run("finalized", func(t *testing.T) {
|
||||||
|
headerRoot, err := genesisState.LatestBlockHeader().HashTreeRoot()
|
||||||
|
require.NoError(t, err)
|
||||||
|
chainService := &chainMock.ChainService{
|
||||||
|
FinalizedRoots: map[[32]byte]bool{
|
||||||
|
headerRoot: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err = body.WriteString("[]")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
resp := &structs.GetValidatorIdentitiesResponse{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
|
||||||
|
assert.Equal(t, true, resp.Finalized)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
t.Run("ssz", func(t *testing.T) {
|
||||||
|
size := uint64((ð.ValidatorIdentity{}).SizeSSZ())
|
||||||
|
|
||||||
|
t.Run("get all", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString("[]")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.Header.Set("Accept", api.OctetStreamMediaType)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
assert.Equal(t, size*count, uint64(len(writer.Body.Bytes())))
|
||||||
|
})
|
||||||
|
t.Run("get by index", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString("[\"0\",\"1\"]")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.Header.Set("Accept", api.OctetStreamMediaType)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
assert.Equal(t, size*2, uint64(len(writer.Body.Bytes())))
|
||||||
|
})
|
||||||
|
t.Run("get by pubkey", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
pubkey1 := st.Validators[0].PublicKey
|
||||||
|
pubkey2 := st.Validators[1].PublicKey
|
||||||
|
hexPubkey1 := hexutil.Encode(pubkey1)
|
||||||
|
hexPubkey2 := hexutil.Encode(pubkey2)
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString(fmt.Sprintf("[\"%s\",\"%s\"]", hexPubkey1, hexPubkey2))
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.Header.Set("Accept", api.OctetStreamMediaType)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
assert.Equal(t, size*2, uint64(len(writer.Body.Bytes())))
|
||||||
|
})
|
||||||
|
t.Run("get by both index and pubkey", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
pubkey := st.Validators[0].PublicKey
|
||||||
|
hexPubkey := hexutil.Encode(pubkey)
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString(fmt.Sprintf("[\"%s\",\"1\"]", hexPubkey))
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.Header.Set("Accept", api.OctetStreamMediaType)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
assert.Equal(t, size*2, uint64(len(writer.Body.Bytes())))
|
||||||
|
})
|
||||||
|
t.Run("unknown pubkey is ignored", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
pubkey := st.Validators[1].PublicKey
|
||||||
|
hexPubkey := hexutil.Encode(pubkey)
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString(fmt.Sprintf("[\"%s\",\"%s\"]", hexPubkey, hexutil.Encode([]byte(strings.Repeat("x", fieldparams.BLSPubkeyLength)))))
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.Header.Set("Accept", api.OctetStreamMediaType)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
assert.Equal(t, size, uint64(len(writer.Body.Bytes())))
|
||||||
|
})
|
||||||
|
t.Run("unknown index is ignored", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString("[\"1\",\"99999\"]")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.Header.Set("Accept", api.OctetStreamMediaType)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusOK, writer.Code)
|
||||||
|
assert.Equal(t, size, uint64(len(writer.Body.Bytes())))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
t.Run("errors", func(t *testing.T) {
|
||||||
|
t.Run("state ID required", func(t *testing.T) {
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: &chainMock.ChainService{},
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString("[]")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusBadRequest, writer.Code)
|
||||||
|
e := &httputil.DefaultJsonError{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), e))
|
||||||
|
assert.Equal(t, http.StatusBadRequest, e.Code)
|
||||||
|
assert.StringContains(t, "state_id is required in URL params", e.Message)
|
||||||
|
})
|
||||||
|
t.Run("empty body", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString("")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", nil)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusBadRequest, writer.Code)
|
||||||
|
e := &httputil.DefaultJsonError{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), e))
|
||||||
|
assert.Equal(t, http.StatusBadRequest, e.Code)
|
||||||
|
assert.StringContains(t, "No data submitted", e.Message)
|
||||||
|
})
|
||||||
|
t.Run("invalid body", func(t *testing.T) {
|
||||||
|
chainService := &chainMock.ChainService{}
|
||||||
|
s := Server{
|
||||||
|
Stater: &testutil.MockStater{
|
||||||
|
BeaconState: genesisState,
|
||||||
|
},
|
||||||
|
HeadFetcher: chainService,
|
||||||
|
OptimisticModeFetcher: chainService,
|
||||||
|
FinalizationFetcher: chainService,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := bytes.Buffer{}
|
||||||
|
_, err := body.WriteString("foo")
|
||||||
|
require.NoError(t, err)
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "http://example.com/eth/v1/beacon/states/{state_id}/validator_identities", &body)
|
||||||
|
request.SetPathValue("state_id", "head")
|
||||||
|
writer := httptest.NewRecorder()
|
||||||
|
writer.Body = &bytes.Buffer{}
|
||||||
|
|
||||||
|
s.GetValidatorIdentities(writer, request)
|
||||||
|
assert.Equal(t, http.StatusBadRequest, writer.Code)
|
||||||
|
e := &httputil.DefaultJsonError{}
|
||||||
|
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), e))
|
||||||
|
assert.Equal(t, http.StatusBadRequest, e.Code)
|
||||||
|
assert.StringContains(t, "Could not decode request body", e.Message)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
3
changelog/radek_api-validator-identities.md
Normal file
3
changelog/radek_api-validator-identities.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
### Added
|
||||||
|
|
||||||
|
- Implemented validator identities Beacon API endpoint.
|
||||||
@@ -73,6 +73,7 @@ ssz_phase0_objs = [
|
|||||||
"Status",
|
"Status",
|
||||||
"Status",
|
"Status",
|
||||||
"Validator",
|
"Validator",
|
||||||
|
"ValidatorIdentity",
|
||||||
"VoluntaryExit",
|
"VoluntaryExit",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -188,7 +189,7 @@ ssz_fulu_objs = [
|
|||||||
"DataColumnSidecar",
|
"DataColumnSidecar",
|
||||||
"SignedBeaconBlockContentsFulu",
|
"SignedBeaconBlockContentsFulu",
|
||||||
"SignedBeaconBlockFulu",
|
"SignedBeaconBlockFulu",
|
||||||
"SignedBlindedBeaconBlockFulu"
|
"SignedBlindedBeaconBlockFulu",
|
||||||
]
|
]
|
||||||
|
|
||||||
ssz_gen_marshal(
|
ssz_gen_marshal(
|
||||||
@@ -337,9 +338,9 @@ go_library(
|
|||||||
srcs = [
|
srcs = [
|
||||||
"attestation.go",
|
"attestation.go",
|
||||||
"beacon_block.go",
|
"beacon_block.go",
|
||||||
"log.go",
|
|
||||||
"cloners.go",
|
"cloners.go",
|
||||||
"eip_7521.go",
|
"eip_7521.go",
|
||||||
|
"log.go",
|
||||||
"sync_committee_mainnet.go",
|
"sync_committee_mainnet.go",
|
||||||
"sync_committee_minimal.go", # keep
|
"sync_committee_minimal.go", # keep
|
||||||
"validator.go",
|
"validator.go",
|
||||||
|
|||||||
@@ -4048,3 +4048,83 @@ func (v *Validator) HashTreeRootWith(hh *ssz.Hasher) (err error) {
|
|||||||
hh.Merkleize(indx)
|
hh.Merkleize(indx)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MarshalSSZ ssz marshals the ValidatorIdentity object
|
||||||
|
func (v *ValidatorIdentity) MarshalSSZ() ([]byte, error) {
|
||||||
|
return ssz.MarshalSSZ(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalSSZTo ssz marshals the ValidatorIdentity object to a target array
|
||||||
|
func (v *ValidatorIdentity) MarshalSSZTo(buf []byte) (dst []byte, err error) {
|
||||||
|
dst = buf
|
||||||
|
|
||||||
|
// Field (0) 'Index'
|
||||||
|
dst = ssz.MarshalUint64(dst, uint64(v.Index))
|
||||||
|
|
||||||
|
// Field (1) 'Pubkey'
|
||||||
|
if size := len(v.Pubkey); size != 48 {
|
||||||
|
err = ssz.ErrBytesLengthFn("--.Pubkey", size, 48)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dst = append(dst, v.Pubkey...)
|
||||||
|
|
||||||
|
// Field (2) 'ActivationEpoch'
|
||||||
|
dst = ssz.MarshalUint64(dst, uint64(v.ActivationEpoch))
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalSSZ ssz unmarshals the ValidatorIdentity object
|
||||||
|
func (v *ValidatorIdentity) UnmarshalSSZ(buf []byte) error {
|
||||||
|
var err error
|
||||||
|
size := uint64(len(buf))
|
||||||
|
if size != 64 {
|
||||||
|
return ssz.ErrSize
|
||||||
|
}
|
||||||
|
|
||||||
|
// Field (0) 'Index'
|
||||||
|
v.Index = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[0:8]))
|
||||||
|
|
||||||
|
// Field (1) 'Pubkey'
|
||||||
|
if cap(v.Pubkey) == 0 {
|
||||||
|
v.Pubkey = make([]byte, 0, len(buf[8:56]))
|
||||||
|
}
|
||||||
|
v.Pubkey = append(v.Pubkey, buf[8:56]...)
|
||||||
|
|
||||||
|
// Field (2) 'ActivationEpoch'
|
||||||
|
v.ActivationEpoch = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch(ssz.UnmarshallUint64(buf[56:64]))
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// SizeSSZ returns the ssz encoded size in bytes for the ValidatorIdentity object
|
||||||
|
func (v *ValidatorIdentity) SizeSSZ() (size int) {
|
||||||
|
size = 64
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// HashTreeRoot ssz hashes the ValidatorIdentity object
|
||||||
|
func (v *ValidatorIdentity) HashTreeRoot() ([32]byte, error) {
|
||||||
|
return ssz.HashWithDefaultHasher(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HashTreeRootWith ssz hashes the ValidatorIdentity object with a hasher
|
||||||
|
func (v *ValidatorIdentity) HashTreeRootWith(hh *ssz.Hasher) (err error) {
|
||||||
|
indx := hh.Index()
|
||||||
|
|
||||||
|
// Field (0) 'Index'
|
||||||
|
hh.PutUint64(uint64(v.Index))
|
||||||
|
|
||||||
|
// Field (1) 'Pubkey'
|
||||||
|
if size := len(v.Pubkey); size != 48 {
|
||||||
|
err = ssz.ErrBytesLengthFn("--.Pubkey", size, 48)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
hh.PutBytes(v.Pubkey)
|
||||||
|
|
||||||
|
// Field (2) 'ActivationEpoch'
|
||||||
|
hh.PutUint64(uint64(v.ActivationEpoch))
|
||||||
|
|
||||||
|
hh.Merkleize(indx)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
265
proto/prysm/v1alpha1/validator.pb.go
generated
265
proto/prysm/v1alpha1/validator.pb.go
generated
@@ -2143,22 +2143,18 @@ func (x *ValidatorParticipation) GetPreviousEpochHeadAttestingGwei() uint64 {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
type ValidatorInfo struct {
|
type ValidatorIdentity struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
|
Index github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"`
|
||||||
Index github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"`
|
Pubkey []byte `protobuf:"bytes,2,opt,name=pubkey,proto3" json:"pubkey,omitempty" ssz-size:"48"`
|
||||||
Epoch github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch `protobuf:"varint,3,opt,name=epoch,proto3" json:"epoch,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Epoch"`
|
ActivationEpoch github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch `protobuf:"varint,3,opt,name=activation_epoch,json=activationEpoch,proto3" json:"activation_epoch,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Epoch"`
|
||||||
Status ValidatorStatus `protobuf:"varint,4,opt,name=status,proto3,enum=ethereum.eth.v1alpha1.ValidatorStatus" json:"status,omitempty"`
|
|
||||||
TransitionTimestamp uint64 `protobuf:"varint,5,opt,name=transition_timestamp,json=transitionTimestamp,proto3" json:"transition_timestamp,omitempty"`
|
|
||||||
Balance uint64 `protobuf:"varint,6,opt,name=balance,proto3" json:"balance,omitempty"`
|
|
||||||
EffectiveBalance uint64 `protobuf:"varint,7,opt,name=effective_balance,json=effectiveBalance,proto3" json:"effective_balance,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *ValidatorInfo) Reset() {
|
func (x *ValidatorIdentity) Reset() {
|
||||||
*x = ValidatorInfo{}
|
*x = ValidatorIdentity{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_proto_prysm_v1alpha1_validator_proto_msgTypes[34]
|
mi := &file_proto_prysm_v1alpha1_validator_proto_msgTypes[34]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
@@ -2166,13 +2162,13 @@ func (x *ValidatorInfo) Reset() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *ValidatorInfo) String() string {
|
func (x *ValidatorIdentity) String() string {
|
||||||
return protoimpl.X.MessageStringOf(x)
|
return protoimpl.X.MessageStringOf(x)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*ValidatorInfo) ProtoMessage() {}
|
func (*ValidatorIdentity) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *ValidatorInfo) ProtoReflect() protoreflect.Message {
|
func (x *ValidatorIdentity) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_proto_prysm_v1alpha1_validator_proto_msgTypes[34]
|
mi := &file_proto_prysm_v1alpha1_validator_proto_msgTypes[34]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
@@ -2184,60 +2180,32 @@ func (x *ValidatorInfo) ProtoReflect() protoreflect.Message {
|
|||||||
return mi.MessageOf(x)
|
return mi.MessageOf(x)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: Use ValidatorInfo.ProtoReflect.Descriptor instead.
|
// Deprecated: Use ValidatorIdentity.ProtoReflect.Descriptor instead.
|
||||||
func (*ValidatorInfo) Descriptor() ([]byte, []int) {
|
func (*ValidatorIdentity) Descriptor() ([]byte, []int) {
|
||||||
return file_proto_prysm_v1alpha1_validator_proto_rawDescGZIP(), []int{34}
|
return file_proto_prysm_v1alpha1_validator_proto_rawDescGZIP(), []int{34}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *ValidatorInfo) GetPublicKey() []byte {
|
func (x *ValidatorIdentity) GetIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex {
|
||||||
if x != nil {
|
|
||||||
return x.PublicKey
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ValidatorInfo) GetIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex {
|
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.Index
|
return x.Index
|
||||||
}
|
}
|
||||||
return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0)
|
return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *ValidatorInfo) GetEpoch() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch {
|
func (x *ValidatorIdentity) GetPubkey() []byte {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.Epoch
|
return x.Pubkey
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ValidatorIdentity) GetActivationEpoch() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch {
|
||||||
|
if x != nil {
|
||||||
|
return x.ActivationEpoch
|
||||||
}
|
}
|
||||||
return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch(0)
|
return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *ValidatorInfo) GetStatus() ValidatorStatus {
|
|
||||||
if x != nil {
|
|
||||||
return x.Status
|
|
||||||
}
|
|
||||||
return ValidatorStatus_UNKNOWN_STATUS
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ValidatorInfo) GetTransitionTimestamp() uint64 {
|
|
||||||
if x != nil {
|
|
||||||
return x.TransitionTimestamp
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ValidatorInfo) GetBalance() uint64 {
|
|
||||||
if x != nil {
|
|
||||||
return x.Balance
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ValidatorInfo) GetEffectiveBalance() uint64 {
|
|
||||||
if x != nil {
|
|
||||||
return x.EffectiveBalance
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
type DoppelGangerRequest struct {
|
type DoppelGangerRequest struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
@@ -3603,34 +3571,24 @@ var file_proto_prysm_v1alpha1_validator_proto_rawDesc = []byte{
|
|||||||
0x6f, 0x63, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69,
|
0x6f, 0x63, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69,
|
||||||
0x6e, 0x67, 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1e, 0x70,
|
0x6e, 0x67, 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1e, 0x70,
|
||||||
0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x48, 0x65, 0x61, 0x64,
|
0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x48, 0x65, 0x61, 0x64,
|
||||||
0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x77, 0x65, 0x69, 0x22, 0xad, 0x03,
|
0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x77, 0x65, 0x69, 0x22, 0x8d, 0x02,
|
||||||
0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12,
|
0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74,
|
||||||
0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
|
0x69, 0x74, 0x79, 0x12, 0x65, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01,
|
||||||
0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x65,
|
0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
|
||||||
0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82,
|
0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73,
|
||||||
0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72,
|
0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e,
|
||||||
0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73,
|
0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74,
|
||||||
0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74,
|
0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e,
|
||||||
0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e,
|
0x64, 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1e, 0x0a, 0x06, 0x70, 0x75,
|
||||||
0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x05,
|
0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02,
|
||||||
0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x5c, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03,
|
0x34, 0x38, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x71, 0x0a, 0x10, 0x61, 0x63,
|
||||||
|
0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03,
|
||||||
0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
|
0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
|
||||||
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61,
|
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61,
|
||||||
0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73,
|
0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73,
|
||||||
0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d,
|
0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d,
|
||||||
0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70,
|
0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x0f, 0x61, 0x63,
|
||||||
0x6f, 0x63, 0x68, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20,
|
0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0xce, 0x02,
|
||||||
0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65,
|
|
||||||
0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69,
|
|
||||||
0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61,
|
|
||||||
0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f,
|
|
||||||
0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28,
|
|
||||||
0x04, 0x52, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d,
|
|
||||||
0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63,
|
|
||||||
0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65,
|
|
||||||
0x12, 0x2b, 0x0a, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61,
|
|
||||||
0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x66, 0x66,
|
|
||||||
0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0xce, 0x02,
|
|
||||||
0x0a, 0x13, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65,
|
0x0a, 0x13, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65,
|
||||||
0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6a, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,
|
0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6a, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,
|
||||||
0x6f, 0x72, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
|
0x6f, 0x72, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
|
||||||
@@ -4137,7 +4095,7 @@ var file_proto_prysm_v1alpha1_validator_proto_goTypes = []interface{}{
|
|||||||
(*CommitteeSubnetsSubscribeRequest)(nil), // 32: ethereum.eth.v1alpha1.CommitteeSubnetsSubscribeRequest
|
(*CommitteeSubnetsSubscribeRequest)(nil), // 32: ethereum.eth.v1alpha1.CommitteeSubnetsSubscribeRequest
|
||||||
(*Validator)(nil), // 33: ethereum.eth.v1alpha1.Validator
|
(*Validator)(nil), // 33: ethereum.eth.v1alpha1.Validator
|
||||||
(*ValidatorParticipation)(nil), // 34: ethereum.eth.v1alpha1.ValidatorParticipation
|
(*ValidatorParticipation)(nil), // 34: ethereum.eth.v1alpha1.ValidatorParticipation
|
||||||
(*ValidatorInfo)(nil), // 35: ethereum.eth.v1alpha1.ValidatorInfo
|
(*ValidatorIdentity)(nil), // 35: ethereum.eth.v1alpha1.ValidatorIdentity
|
||||||
(*DoppelGangerRequest)(nil), // 36: ethereum.eth.v1alpha1.DoppelGangerRequest
|
(*DoppelGangerRequest)(nil), // 36: ethereum.eth.v1alpha1.DoppelGangerRequest
|
||||||
(*DoppelGangerResponse)(nil), // 37: ethereum.eth.v1alpha1.DoppelGangerResponse
|
(*DoppelGangerResponse)(nil), // 37: ethereum.eth.v1alpha1.DoppelGangerResponse
|
||||||
(*StreamSlotsRequest)(nil), // 38: ethereum.eth.v1alpha1.StreamSlotsRequest
|
(*StreamSlotsRequest)(nil), // 38: ethereum.eth.v1alpha1.StreamSlotsRequest
|
||||||
@@ -4195,81 +4153,80 @@ var file_proto_prysm_v1alpha1_validator_proto_depIdxs = []int32{
|
|||||||
60, // 14: ethereum.eth.v1alpha1.AggregateSelectionElectraResponse.aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.AggregateAttestationAndProofElectra
|
60, // 14: ethereum.eth.v1alpha1.AggregateSelectionElectraResponse.aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.AggregateAttestationAndProofElectra
|
||||||
61, // 15: ethereum.eth.v1alpha1.SignedAggregateSubmitRequest.signed_aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.SignedAggregateAttestationAndProof
|
61, // 15: ethereum.eth.v1alpha1.SignedAggregateSubmitRequest.signed_aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.SignedAggregateAttestationAndProof
|
||||||
62, // 16: ethereum.eth.v1alpha1.SignedAggregateSubmitElectraRequest.signed_aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.SignedAggregateAttestationAndProofElectra
|
62, // 16: ethereum.eth.v1alpha1.SignedAggregateSubmitElectraRequest.signed_aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.SignedAggregateAttestationAndProofElectra
|
||||||
0, // 17: ethereum.eth.v1alpha1.ValidatorInfo.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus
|
48, // 17: ethereum.eth.v1alpha1.DoppelGangerRequest.validator_requests:type_name -> ethereum.eth.v1alpha1.DoppelGangerRequest.ValidatorRequest
|
||||||
48, // 18: ethereum.eth.v1alpha1.DoppelGangerRequest.validator_requests:type_name -> ethereum.eth.v1alpha1.DoppelGangerRequest.ValidatorRequest
|
49, // 18: ethereum.eth.v1alpha1.DoppelGangerResponse.responses:type_name -> ethereum.eth.v1alpha1.DoppelGangerResponse.ValidatorResponse
|
||||||
49, // 19: ethereum.eth.v1alpha1.DoppelGangerResponse.responses:type_name -> ethereum.eth.v1alpha1.DoppelGangerResponse.ValidatorResponse
|
50, // 19: ethereum.eth.v1alpha1.PrepareBeaconProposerRequest.recipients:type_name -> ethereum.eth.v1alpha1.PrepareBeaconProposerRequest.FeeRecipientContainer
|
||||||
50, // 20: ethereum.eth.v1alpha1.PrepareBeaconProposerRequest.recipients:type_name -> ethereum.eth.v1alpha1.PrepareBeaconProposerRequest.FeeRecipientContainer
|
0, // 20: ethereum.eth.v1alpha1.AssignValidatorToSubnetRequest.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus
|
||||||
0, // 21: ethereum.eth.v1alpha1.AssignValidatorToSubnetRequest.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus
|
63, // 21: ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsRequest.msgs:type_name -> ethereum.eth.v1alpha1.SyncCommitteeMessage
|
||||||
63, // 22: ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsRequest.msgs:type_name -> ethereum.eth.v1alpha1.SyncCommitteeMessage
|
16, // 22: ethereum.eth.v1alpha1.ValidatorActivationResponse.Status.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatusResponse
|
||||||
16, // 23: ethereum.eth.v1alpha1.ValidatorActivationResponse.Status.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatusResponse
|
0, // 23: ethereum.eth.v1alpha1.DutiesResponse.Duty.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus
|
||||||
0, // 24: ethereum.eth.v1alpha1.DutiesResponse.Duty.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus
|
19, // 24: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:input_type -> ethereum.eth.v1alpha1.DutiesRequest
|
||||||
19, // 25: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:input_type -> ethereum.eth.v1alpha1.DutiesRequest
|
7, // 25: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:input_type -> ethereum.eth.v1alpha1.DomainRequest
|
||||||
7, // 26: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:input_type -> ethereum.eth.v1alpha1.DomainRequest
|
64, // 26: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:input_type -> google.protobuf.Empty
|
||||||
64, // 27: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:input_type -> google.protobuf.Empty
|
9, // 27: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:input_type -> ethereum.eth.v1alpha1.ValidatorActivationRequest
|
||||||
9, // 28: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:input_type -> ethereum.eth.v1alpha1.ValidatorActivationRequest
|
13, // 28: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:input_type -> ethereum.eth.v1alpha1.ValidatorIndexRequest
|
||||||
13, // 29: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:input_type -> ethereum.eth.v1alpha1.ValidatorIndexRequest
|
15, // 29: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:input_type -> ethereum.eth.v1alpha1.ValidatorStatusRequest
|
||||||
15, // 30: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:input_type -> ethereum.eth.v1alpha1.ValidatorStatusRequest
|
17, // 30: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:input_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusRequest
|
||||||
17, // 31: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:input_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusRequest
|
21, // 31: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBeaconBlock:input_type -> ethereum.eth.v1alpha1.BlockRequest
|
||||||
21, // 32: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBeaconBlock:input_type -> ethereum.eth.v1alpha1.BlockRequest
|
65, // 32: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBeaconBlock:input_type -> ethereum.eth.v1alpha1.GenericSignedBeaconBlock
|
||||||
65, // 33: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBeaconBlock:input_type -> ethereum.eth.v1alpha1.GenericSignedBeaconBlock
|
40, // 33: ethereum.eth.v1alpha1.BeaconNodeValidator.PrepareBeaconProposer:input_type -> ethereum.eth.v1alpha1.PrepareBeaconProposerRequest
|
||||||
40, // 34: ethereum.eth.v1alpha1.BeaconNodeValidator.PrepareBeaconProposer:input_type -> ethereum.eth.v1alpha1.PrepareBeaconProposerRequest
|
41, // 34: ethereum.eth.v1alpha1.BeaconNodeValidator.GetFeeRecipientByPubKey:input_type -> ethereum.eth.v1alpha1.FeeRecipientByPubKeyRequest
|
||||||
41, // 35: ethereum.eth.v1alpha1.BeaconNodeValidator.GetFeeRecipientByPubKey:input_type -> ethereum.eth.v1alpha1.FeeRecipientByPubKeyRequest
|
24, // 35: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:input_type -> ethereum.eth.v1alpha1.AttestationDataRequest
|
||||||
24, // 36: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:input_type -> ethereum.eth.v1alpha1.AttestationDataRequest
|
66, // 36: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:input_type -> ethereum.eth.v1alpha1.Attestation
|
||||||
66, // 37: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:input_type -> ethereum.eth.v1alpha1.Attestation
|
67, // 37: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestationElectra:input_type -> ethereum.eth.v1alpha1.SingleAttestation
|
||||||
67, // 38: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestationElectra:input_type -> ethereum.eth.v1alpha1.SingleAttestation
|
26, // 38: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.AggregateSelectionRequest
|
||||||
26, // 39: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.AggregateSelectionRequest
|
26, // 39: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProofElectra:input_type -> ethereum.eth.v1alpha1.AggregateSelectionRequest
|
||||||
26, // 40: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProofElectra:input_type -> ethereum.eth.v1alpha1.AggregateSelectionRequest
|
29, // 40: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitRequest
|
||||||
29, // 41: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitRequest
|
30, // 41: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProofElectra:input_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitElectraRequest
|
||||||
30, // 42: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProofElectra:input_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitElectraRequest
|
68, // 42: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:input_type -> ethereum.eth.v1alpha1.SignedVoluntaryExit
|
||||||
68, // 43: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:input_type -> ethereum.eth.v1alpha1.SignedVoluntaryExit
|
32, // 43: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:input_type -> ethereum.eth.v1alpha1.CommitteeSubnetsSubscribeRequest
|
||||||
32, // 44: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:input_type -> ethereum.eth.v1alpha1.CommitteeSubnetsSubscribeRequest
|
36, // 44: ethereum.eth.v1alpha1.BeaconNodeValidator.CheckDoppelGanger:input_type -> ethereum.eth.v1alpha1.DoppelGangerRequest
|
||||||
36, // 45: ethereum.eth.v1alpha1.BeaconNodeValidator.CheckDoppelGanger:input_type -> ethereum.eth.v1alpha1.DoppelGangerRequest
|
64, // 45: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncMessageBlockRoot:input_type -> google.protobuf.Empty
|
||||||
64, // 46: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncMessageBlockRoot:input_type -> google.protobuf.Empty
|
63, // 46: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSyncMessage:input_type -> ethereum.eth.v1alpha1.SyncCommitteeMessage
|
||||||
63, // 47: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSyncMessage:input_type -> ethereum.eth.v1alpha1.SyncCommitteeMessage
|
2, // 47: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncSubcommitteeIndex:input_type -> ethereum.eth.v1alpha1.SyncSubcommitteeIndexRequest
|
||||||
2, // 48: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncSubcommitteeIndex:input_type -> ethereum.eth.v1alpha1.SyncSubcommitteeIndexRequest
|
3, // 48: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncCommitteeContribution:input_type -> ethereum.eth.v1alpha1.SyncCommitteeContributionRequest
|
||||||
3, // 49: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncCommitteeContribution:input_type -> ethereum.eth.v1alpha1.SyncCommitteeContributionRequest
|
69, // 49: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedContributionAndProof:input_type -> ethereum.eth.v1alpha1.SignedContributionAndProof
|
||||||
69, // 50: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedContributionAndProof:input_type -> ethereum.eth.v1alpha1.SignedContributionAndProof
|
38, // 50: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamSlots:input_type -> ethereum.eth.v1alpha1.StreamSlotsRequest
|
||||||
38, // 51: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamSlots:input_type -> ethereum.eth.v1alpha1.StreamSlotsRequest
|
39, // 51: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamBlocksAltair:input_type -> ethereum.eth.v1alpha1.StreamBlocksRequest
|
||||||
39, // 52: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamBlocksAltair:input_type -> ethereum.eth.v1alpha1.StreamBlocksRequest
|
70, // 52: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitValidatorRegistrations:input_type -> ethereum.eth.v1alpha1.SignedValidatorRegistrationsV1
|
||||||
70, // 53: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitValidatorRegistrations:input_type -> ethereum.eth.v1alpha1.SignedValidatorRegistrationsV1
|
43, // 53: ethereum.eth.v1alpha1.BeaconNodeValidator.AssignValidatorToSubnet:input_type -> ethereum.eth.v1alpha1.AssignValidatorToSubnetRequest
|
||||||
43, // 54: ethereum.eth.v1alpha1.BeaconNodeValidator.AssignValidatorToSubnet:input_type -> ethereum.eth.v1alpha1.AssignValidatorToSubnetRequest
|
44, // 54: ethereum.eth.v1alpha1.BeaconNodeValidator.AggregatedSigAndAggregationBits:input_type -> ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsRequest
|
||||||
44, // 55: ethereum.eth.v1alpha1.BeaconNodeValidator.AggregatedSigAndAggregationBits:input_type -> ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsRequest
|
20, // 55: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:output_type -> ethereum.eth.v1alpha1.DutiesResponse
|
||||||
20, // 56: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:output_type -> ethereum.eth.v1alpha1.DutiesResponse
|
8, // 56: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:output_type -> ethereum.eth.v1alpha1.DomainResponse
|
||||||
8, // 57: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:output_type -> ethereum.eth.v1alpha1.DomainResponse
|
11, // 57: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:output_type -> ethereum.eth.v1alpha1.ChainStartResponse
|
||||||
11, // 58: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:output_type -> ethereum.eth.v1alpha1.ChainStartResponse
|
10, // 58: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:output_type -> ethereum.eth.v1alpha1.ValidatorActivationResponse
|
||||||
10, // 59: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:output_type -> ethereum.eth.v1alpha1.ValidatorActivationResponse
|
14, // 59: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:output_type -> ethereum.eth.v1alpha1.ValidatorIndexResponse
|
||||||
14, // 60: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:output_type -> ethereum.eth.v1alpha1.ValidatorIndexResponse
|
16, // 60: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:output_type -> ethereum.eth.v1alpha1.ValidatorStatusResponse
|
||||||
16, // 61: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:output_type -> ethereum.eth.v1alpha1.ValidatorStatusResponse
|
18, // 61: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:output_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusResponse
|
||||||
18, // 62: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:output_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusResponse
|
71, // 62: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBeaconBlock:output_type -> ethereum.eth.v1alpha1.GenericBeaconBlock
|
||||||
71, // 63: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBeaconBlock:output_type -> ethereum.eth.v1alpha1.GenericBeaconBlock
|
22, // 63: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBeaconBlock:output_type -> ethereum.eth.v1alpha1.ProposeResponse
|
||||||
22, // 64: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBeaconBlock:output_type -> ethereum.eth.v1alpha1.ProposeResponse
|
64, // 64: ethereum.eth.v1alpha1.BeaconNodeValidator.PrepareBeaconProposer:output_type -> google.protobuf.Empty
|
||||||
64, // 65: ethereum.eth.v1alpha1.BeaconNodeValidator.PrepareBeaconProposer:output_type -> google.protobuf.Empty
|
42, // 65: ethereum.eth.v1alpha1.BeaconNodeValidator.GetFeeRecipientByPubKey:output_type -> ethereum.eth.v1alpha1.FeeRecipientByPubKeyResponse
|
||||||
42, // 66: ethereum.eth.v1alpha1.BeaconNodeValidator.GetFeeRecipientByPubKey:output_type -> ethereum.eth.v1alpha1.FeeRecipientByPubKeyResponse
|
72, // 66: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:output_type -> ethereum.eth.v1alpha1.AttestationData
|
||||||
72, // 67: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:output_type -> ethereum.eth.v1alpha1.AttestationData
|
25, // 67: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:output_type -> ethereum.eth.v1alpha1.AttestResponse
|
||||||
25, // 68: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:output_type -> ethereum.eth.v1alpha1.AttestResponse
|
25, // 68: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestationElectra:output_type -> ethereum.eth.v1alpha1.AttestResponse
|
||||||
25, // 69: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestationElectra:output_type -> ethereum.eth.v1alpha1.AttestResponse
|
27, // 69: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.AggregateSelectionResponse
|
||||||
27, // 70: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.AggregateSelectionResponse
|
28, // 70: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProofElectra:output_type -> ethereum.eth.v1alpha1.AggregateSelectionElectraResponse
|
||||||
28, // 71: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProofElectra:output_type -> ethereum.eth.v1alpha1.AggregateSelectionElectraResponse
|
31, // 71: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitResponse
|
||||||
31, // 72: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitResponse
|
31, // 72: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProofElectra:output_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitResponse
|
||||||
31, // 73: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProofElectra:output_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitResponse
|
23, // 73: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:output_type -> ethereum.eth.v1alpha1.ProposeExitResponse
|
||||||
23, // 74: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:output_type -> ethereum.eth.v1alpha1.ProposeExitResponse
|
64, // 74: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:output_type -> google.protobuf.Empty
|
||||||
64, // 75: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:output_type -> google.protobuf.Empty
|
37, // 75: ethereum.eth.v1alpha1.BeaconNodeValidator.CheckDoppelGanger:output_type -> ethereum.eth.v1alpha1.DoppelGangerResponse
|
||||||
37, // 76: ethereum.eth.v1alpha1.BeaconNodeValidator.CheckDoppelGanger:output_type -> ethereum.eth.v1alpha1.DoppelGangerResponse
|
1, // 76: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncMessageBlockRoot:output_type -> ethereum.eth.v1alpha1.SyncMessageBlockRootResponse
|
||||||
1, // 77: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncMessageBlockRoot:output_type -> ethereum.eth.v1alpha1.SyncMessageBlockRootResponse
|
64, // 77: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSyncMessage:output_type -> google.protobuf.Empty
|
||||||
64, // 78: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSyncMessage:output_type -> google.protobuf.Empty
|
4, // 78: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncSubcommitteeIndex:output_type -> ethereum.eth.v1alpha1.SyncSubcommitteeIndexResponse
|
||||||
4, // 79: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncSubcommitteeIndex:output_type -> ethereum.eth.v1alpha1.SyncSubcommitteeIndexResponse
|
73, // 79: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncCommitteeContribution:output_type -> ethereum.eth.v1alpha1.SyncCommitteeContribution
|
||||||
73, // 80: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncCommitteeContribution:output_type -> ethereum.eth.v1alpha1.SyncCommitteeContribution
|
64, // 80: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedContributionAndProof:output_type -> google.protobuf.Empty
|
||||||
64, // 81: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedContributionAndProof:output_type -> google.protobuf.Empty
|
5, // 81: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamSlots:output_type -> ethereum.eth.v1alpha1.StreamSlotsResponse
|
||||||
5, // 82: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamSlots:output_type -> ethereum.eth.v1alpha1.StreamSlotsResponse
|
6, // 82: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamBlocksAltair:output_type -> ethereum.eth.v1alpha1.StreamBlocksResponse
|
||||||
6, // 83: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamBlocksAltair:output_type -> ethereum.eth.v1alpha1.StreamBlocksResponse
|
64, // 83: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitValidatorRegistrations:output_type -> google.protobuf.Empty
|
||||||
64, // 84: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitValidatorRegistrations:output_type -> google.protobuf.Empty
|
64, // 84: ethereum.eth.v1alpha1.BeaconNodeValidator.AssignValidatorToSubnet:output_type -> google.protobuf.Empty
|
||||||
64, // 85: ethereum.eth.v1alpha1.BeaconNodeValidator.AssignValidatorToSubnet:output_type -> google.protobuf.Empty
|
45, // 85: ethereum.eth.v1alpha1.BeaconNodeValidator.AggregatedSigAndAggregationBits:output_type -> ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsResponse
|
||||||
45, // 86: ethereum.eth.v1alpha1.BeaconNodeValidator.AggregatedSigAndAggregationBits:output_type -> ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsResponse
|
55, // [55:86] is the sub-list for method output_type
|
||||||
56, // [56:87] is the sub-list for method output_type
|
24, // [24:55] is the sub-list for method input_type
|
||||||
25, // [25:56] is the sub-list for method input_type
|
24, // [24:24] is the sub-list for extension type_name
|
||||||
25, // [25:25] is the sub-list for extension type_name
|
24, // [24:24] is the sub-list for extension extendee
|
||||||
25, // [25:25] is the sub-list for extension extendee
|
0, // [0:24] is the sub-list for field type_name
|
||||||
0, // [0:25] is the sub-list for field type_name
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_proto_prysm_v1alpha1_validator_proto_init() }
|
func init() { file_proto_prysm_v1alpha1_validator_proto_init() }
|
||||||
@@ -4690,7 +4647,7 @@ func file_proto_prysm_v1alpha1_validator_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_proto_prysm_v1alpha1_validator_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
|
file_proto_prysm_v1alpha1_validator_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*ValidatorInfo); i {
|
switch v := v.(*ValidatorIdentity); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
|
|||||||
@@ -875,46 +875,26 @@ message ValidatorParticipation {
|
|||||||
uint64 previous_epoch_head_attesting_gwei = 10;
|
uint64 previous_epoch_head_attesting_gwei = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidatorInfo gives information about the state of a validator at a certain
|
// ValidatorIdentity gives information about the state of a validator at a certain
|
||||||
// epoch.
|
// epoch.
|
||||||
message ValidatorInfo {
|
message ValidatorIdentity {
|
||||||
// The validator's 48 byte BLS public key.
|
|
||||||
bytes public_key = 1;
|
|
||||||
|
|
||||||
// The validator's index in the beacon state.
|
// The validator's index in the beacon state.
|
||||||
uint64 index = 2 [ (ethereum.eth.ext.cast_type) =
|
uint64 index = 1 [ (ethereum.eth.ext.cast_type) =
|
||||||
"github.com/prysmaticlabs/prysm/v5/consensus-types/"
|
"github.com/prysmaticlabs/prysm/v5/consensus-types/"
|
||||||
"primitives.ValidatorIndex" ];
|
"primitives.ValidatorIndex" ];
|
||||||
|
|
||||||
// The epoch for which the information pertains.
|
// The validator's 48 byte BLS public key.
|
||||||
uint64 epoch = 3 [
|
bytes pubkey = 2 [
|
||||||
|
(ethereum.eth.ext.ssz_size) = "48"
|
||||||
|
];
|
||||||
|
|
||||||
|
// Epoch when the validator was activated. This field may be zero if the
|
||||||
|
// validator was present in the Ethereum proof of stake genesis. This field is
|
||||||
|
// FAR_FUTURE_EPOCH if the validator has not been activated.
|
||||||
|
uint64 activation_epoch = 3 [
|
||||||
(ethereum.eth.ext.cast_type) =
|
(ethereum.eth.ext.cast_type) =
|
||||||
"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Epoch"
|
"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Epoch"
|
||||||
];
|
];
|
||||||
|
|
||||||
// The validator's current status.
|
|
||||||
ValidatorStatus status = 4;
|
|
||||||
|
|
||||||
// The unix timestamp when the validator enters the next state.
|
|
||||||
// This could be in the past. Some values depend on chain operation and so
|
|
||||||
// will vary from epoch to epoch. Specific times for each state are as
|
|
||||||
// follows:
|
|
||||||
// - state == DEPOSITED: time at which Ethereum 1 deposit will be stored
|
|
||||||
// on-chain by Ethereum (variable, can be 0).
|
|
||||||
// - state == PENDING: time at which validator will be activated (variable).
|
|
||||||
// - state == ACTIVE: no value (next transition depends on user and network
|
|
||||||
// actions).
|
|
||||||
// - state == EXITING: time at which validator will exit.
|
|
||||||
// - state == SLASHING: time at which validator will exit.
|
|
||||||
// - state == EXITED: time at which validator funds will be withdrawable.
|
|
||||||
uint64 transition_timestamp = 5;
|
|
||||||
|
|
||||||
// The validator's current balance in GWei.
|
|
||||||
uint64 balance = 6;
|
|
||||||
|
|
||||||
// The validator's current effective balance in GWei.
|
|
||||||
// Only valid for states ACTIVE, EXITING, SLASHING.
|
|
||||||
uint64 effective_balance = 7;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DoppelGangerRequest represents the request sent by the validator in order to
|
// DoppelGangerRequest represents the request sent by the validator in order to
|
||||||
|
|||||||
Reference in New Issue
Block a user