Define BeaconState Core Type and Protobuf Definition (#863)

* define protos for beacon state

* tests pass

* address feedback
This commit is contained in:
Raul Jordan
2018-11-20 11:43:07 -08:00
committed by GitHub
parent 451238d504
commit 891dc2e2de
13 changed files with 1532 additions and 1143 deletions

View File

@@ -73,16 +73,14 @@ func ApplyCrosslinkRewardsAndPenalties(
for _, attesterIndex := range attesterIndices {
timeSinceLastConfirmation := slot - crosslinkRecords[attestation.Shard].GetSlot()
if !crosslinkRecords[attestation.Shard].GetRecentlyChanged() {
checkBit, err := bitutil.CheckBit(attestation.AttesterBitfield, int(attesterIndex))
if err != nil {
return err
}
if checkBit {
RewardValidatorCrosslink(totalBalance, voteBalance, rewardQuotient, validators[attesterIndex])
} else {
PenaliseValidatorCrosslink(timeSinceLastConfirmation, rewardQuotient, validators[attesterIndex])
}
checkBit, err := bitutil.CheckBit(attestation.AttesterBitfield, int(attesterIndex))
if err != nil {
return err
}
if checkBit {
RewardValidatorCrosslink(totalBalance, voteBalance, rewardQuotient, validators[attesterIndex])
} else {
PenaliseValidatorCrosslink(timeSinceLastConfirmation, rewardQuotient, validators[attesterIndex])
}
}
return nil
@@ -96,11 +94,10 @@ func ProcessCrosslink(slot uint64, voteBalance uint64, totalBalance uint64,
// if 2/3 of committee voted on this crosslink, update the crosslink
// with latest dynasty number, shard block hash, and slot number.
voteMajority := 3*voteBalance >= 2*totalBalance
if voteMajority && !crosslinkRecords[attestation.Shard].RecentlyChanged {
if voteMajority {
crosslinkRecords[attestation.Shard] = &pb.CrosslinkRecord{
RecentlyChanged: true,
ShardBlockHash: attestation.ShardBlockHash,
Slot: slot,
ShardBlockHash: attestation.ShardBlockHash,
Slot: slot,
}
}
return crosslinkRecords

View File

@@ -140,24 +140,20 @@ func TestApplyCrosslinkRewardsAndPenalties(t *testing.T) {
crossLinks := []*pb.CrosslinkRecord{
{
RecentlyChanged: false,
ShardBlockHash: []byte{'A'},
Slot: 10,
ShardBlockHash: []byte{'A'},
Slot: 10,
},
{
RecentlyChanged: false,
ShardBlockHash: []byte{'B'},
Slot: 10,
ShardBlockHash: []byte{'B'},
Slot: 10,
},
{
RecentlyChanged: false,
ShardBlockHash: []byte{'C'},
Slot: 10,
ShardBlockHash: []byte{'C'},
Slot: 10,
},
{
RecentlyChanged: false,
ShardBlockHash: []byte{'D'},
Slot: 10,
ShardBlockHash: []byte{'D'},
Slot: 10,
},
}
@@ -189,14 +185,12 @@ func TestCrosslinks(t *testing.T) {
crossLinks := []*pb.CrosslinkRecord{
{
RecentlyChanged: false,
ShardBlockHash: []byte{'A'},
Slot: 10,
ShardBlockHash: []byte{'A'},
Slot: 10,
},
{
RecentlyChanged: true,
ShardBlockHash: []byte{'A'},
Slot: 10,
ShardBlockHash: []byte{'A'},
Slot: 10,
},
}
@@ -208,13 +202,6 @@ func TestCrosslinks(t *testing.T) {
}
crossLinks = ProcessCrosslink(10, voteBalance, totalBalance, attestation, crossLinks)
if bytes.Equal(crossLinks[1].GetShardBlockHash(), []byte{'B'}) {
t.Fatal("crosslink updated when it was not supposed to")
}
crossLinks[1].RecentlyChanged = false
crossLinks = ProcessCrosslink(10, voteBalance, totalBalance, attestation, crossLinks)
if !bytes.Equal(crossLinks[1].GetShardBlockHash(), []byte{'B'}) {

View File

@@ -0,0 +1,13 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = ["state.go"],
importpath = "github.com/prysmaticlabs/prysm/beacon-chain/core/types",
visibility = ["//beacon-chain:__subpackages__"],
deps = [
"//proto/beacon/p2p/v1:go_default_library",
"//shared/hashutil:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
],
)

View File

@@ -0,0 +1,34 @@
package types
import (
"github.com/gogo/protobuf/proto"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/hashutil"
)
// BeaconState defines the core beacon chain's single
// state containing items pertaining to the validator
// set, recent block hashes, finalized slots, and more.
type BeaconState struct {
data *pb.BeaconState
}
// Proto returns the underlying protobuf data within a state primitive.
func (b *BeaconState) Proto() *pb.BeaconState {
return b.data
}
// Marshal encodes state object into the wire format.
func (b *BeaconState) Marshal() ([]byte, error) {
return proto.Marshal(b.data)
}
// Hash serializes the state object then uses
// blake2b to hash the serialized object.
func (b *BeaconState) Hash() ([32]byte, error) {
data, err := proto.Marshal(b.data)
if err != nil {
return [32]byte{}, err
}
return hashutil.Hash(data), nil
}

View File

@@ -42,9 +42,8 @@ func NewGenesisCrystallizedState(genesisValidators []*pb.ValidatorRecord) (*Crys
var crosslinks []*pb.CrosslinkRecord
for i := uint64(0); i < shardCount; i++ {
crosslinks = append(crosslinks, &pb.CrosslinkRecord{
RecentlyChanged: false,
ShardBlockHash: make([]byte, 0, 32),
Slot: 0,
ShardBlockHash: make([]byte, 0, 32),
Slot: 0,
})
}
@@ -91,9 +90,8 @@ func (c *CrystallizedState) CopyState() *CrystallizedState {
crosslinks := make([]*pb.CrosslinkRecord, len(c.Crosslinks()))
for index, crossLink := range c.Crosslinks() {
crosslinks[index] = &pb.CrosslinkRecord{
RecentlyChanged: crossLink.GetRecentlyChanged(),
ShardBlockHash: crossLink.GetShardBlockHash(),
Slot: crossLink.GetSlot(),
ShardBlockHash: crossLink.GetShardBlockHash(),
Slot: crossLink.GetSlot(),
}
}
@@ -341,8 +339,6 @@ func (c *CrystallizedState) NewStateRecalculations(aState *ActiveState, block *B
period := uint32(block.SlotNumber() / params.BeaconConfig().WithdrawalPeriod)
totalPenalties := newState.penalizedETH(period)
newState.data.Validators = casper.ChangeValidators(block.SlotNumber(), totalPenalties, newState.Validators())
newState.resetCrosslinks()
}
printCommittee(newState.data.ShardAndCommitteesForSlots)
@@ -350,12 +346,6 @@ func (c *CrystallizedState) NewStateRecalculations(aState *ActiveState, block *B
return newState, nil
}
func (c *CrystallizedState) resetCrosslinks() {
for _, cl := range c.data.Crosslinks {
cl.RecentlyChanged = false
}
}
func printCommittee(shardAndCommittees []*pb.ShardAndCommitteeArray) {
log.Debug("Dumping shard committees")
for slot, shardCommittees := range shardAndCommittees {

View File

@@ -83,9 +83,8 @@ func TestCopyCrystallizedState(t *testing.T) {
var crosslinks []*pb.CrosslinkRecord
for i := uint64(0); i < shardCount; i++ {
crosslinks = append(crosslinks, &pb.CrosslinkRecord{
RecentlyChanged: false,
ShardBlockHash: make([]byte, 2, 34),
Slot: 2,
ShardBlockHash: make([]byte, 2, 34),
Slot: 2,
})
}
cState1.data.Crosslinks = crosslinks
@@ -268,7 +267,7 @@ func TestProcessCrosslinks(t *testing.T) {
// Set up crosslink record for every shard.
var clRecords []*pb.CrosslinkRecord
for i := uint64(0); i < params.BeaconConfig().ShardCount; i++ {
clRecord := &pb.CrosslinkRecord{RecentlyChanged: false, ShardBlockHash: []byte{'A'}, Slot: 1}
clRecord := &pb.CrosslinkRecord{ShardBlockHash: []byte{'A'}, Slot: 1}
clRecords = append(clRecords, clRecord)
}

View File

@@ -18,7 +18,7 @@ go_library(
proto_library(
name = "v1_proto",
srcs = ["messages.proto"],
srcs = ["messages.proto", "types.proto"],
visibility = ["//visibility:public"],
deps = ["@com_google_protobuf//:timestamp_proto"],
)

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@ syntax = "proto3";
package ethereum.beacon.p2p.v1;
import "google/protobuf/timestamp.proto";
import "proto/beacon/p2p/v1/types.proto";
enum Topic {
UNKNOWN = 0;
@@ -37,21 +37,7 @@ message BeaconBlockResponse {
AggregatedAttestation attestation = 2;
}
message BeaconBlock {
repeated bytes ancestor_hashes = 1;
uint64 slot = 2;
bytes randao_reveal = 3;
bytes pow_chain_ref = 4;
bytes active_state_root = 5;
bytes crystallized_state_root = 6;
google.protobuf.Timestamp timestamp = 7;
repeated AggregatedAttestation attestations = 8;
repeated SpecialRecord specials = 9;
}
message ChainHeadRequest {
}
message ChainHeadRequest {}
message ChainHeadResponse {
bytes hash = 1;
@@ -71,26 +57,6 @@ message CrystallizedStateResponse {
CrystallizedState crystallized_state = 1;
}
message CrystallizedState {
uint64 last_state_recalculation_slot = 1;
uint64 justified_streak = 2;
uint64 last_justified_slot = 3;
uint64 last_finalized_slot = 4;
uint64 validator_set_change_slot = 5;
repeated CrosslinkRecord crosslinks = 6;
repeated ValidatorRecord validators = 7;
repeated ShardAndCommitteeArray shard_and_committees_for_slots = 8;
repeated uint32 deposits_penalized_in_period = 9;
bytes validator_set_delta_hash_chain = 10;
uint32 pre_fork_version = 11;
uint32 post_fork_version = 12;
uint64 fork_slot_number =13;
}
message ShardAndCommitteeArray {
repeated ShardAndCommittee array_shard_and_committee = 1;
}
message ActiveStateHashAnnounce {
bytes hash = 1;
}
@@ -99,64 +65,6 @@ message ActiveStateRequest {
bytes hash = 1;
}
message ShardAndCommittee {
uint64 shard = 1;
repeated uint32 committee = 2;
}
message ActiveStateResponse {
ActiveState active_state = 1;
}
message ActiveState {
repeated AggregatedAttestation pending_attestations = 1;
repeated bytes recent_block_hashes = 2;
repeated SpecialRecord pending_specials = 3;
bytes randao_mix = 4;
}
message ValidatorRecord {
bytes pubkey = 1;
uint64 withdrawal_shard = 2;
bytes withdrawal_address = 3;
bytes randao_commitment = 4;
uint64 balance = 5;
uint64 status = 6;
uint64 exit_slot = 7;
uint64 randao_last_change = 8;
}
message AggregatedAttestation {
uint64 slot = 1;
uint64 shard = 2;
uint64 justified_slot = 3;
bytes justified_block_hash = 4;
bytes shard_block_hash = 5;
bytes attester_bitfield = 6;
repeated bytes oblique_parent_hashes = 7;
repeated uint64 aggregate_sig = 8;
}
message AttestationSignedData {
uint64 fork_version = 1;
uint64 slot = 2;
uint64 shard = 3;
repeated bytes parent_hashes = 4;
bytes shard_block_hash = 5;
uint64 justified_slot = 6;
}
message CrosslinkRecord {
bool recently_changed = 1;
bytes shard_block_hash = 2;
uint64 slot = 3;
}
message AttestationHashes {
repeated bytes attestation_hash = 1;
}
message SpecialRecord {
uint32 kind = 1;
repeated bytes data = 2;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,128 @@
syntax = "proto3";
package ethereum.beacon.p2p.v1;
import "google/protobuf/timestamp.proto";
message BeaconState {
uint64 validator_set_change_slot = 1;
repeated ValidatorRecord validators = 2;
repeated CrosslinkRecord crosslinks = 3;
uint64 last_state_recalculation_slot = 4;
uint64 last_finalized_slot = 5;
uint64 last_justified_slot = 6;
uint64 justified_streak = 7;
repeated ShardAndCommitteeArray shard_and_committees_for_slots = 8;
repeated uint32 persistent_committees = 9;
repeated ShardReassignmentRecord persistent_committee_reassignment = 10;
bytes next_shuffling_seed = 11;
repeated uint64 deposits_penalized_in_period = 12;
bytes validator_delta_hash_chain = 13;
uint64 current_exit_seq = 14;
uint64 genesis_time = 15;
bytes known_pow_receipt_root = 16;
bytes candidate_pow_receipt_root = 17;
uint64 candidate_pow_receipt_root_votes = 18;
uint64 pre_fork_version = 19;
uint64 post_fork_version = 20;
uint64 fork_slot_number = 21;
repeated AggregatedAttestation pending_attestations = 22;
repeated bytes recent_block_hashes = 23;
bytes randao_mix = 24;
}
message ValidatorRecord {
bytes pubkey = 1;
uint64 withdrawal_shard = 2;
bytes withdrawal_address = 3;
bytes randao_commitment = 4;
uint64 balance = 5;
uint64 status = 6;
uint64 exit_slot = 7;
uint64 randao_last_change = 8;
}
message ShardReassignmentRecord {
uint32 validator_index = 1;
uint64 shard = 2;
uint64 slot = 3;
}
message AggregatedAttestation {
uint64 slot = 1;
uint64 shard = 2;
uint64 justified_slot = 3;
bytes justified_block_hash = 4;
bytes shard_block_hash = 5;
bytes attester_bitfield = 6;
repeated bytes oblique_parent_hashes = 7;
repeated uint64 aggregate_sig = 8;
}
message AttestationSignedData {
uint64 fork_version = 1;
uint64 slot = 2;
uint64 shard = 3;
repeated bytes parent_hashes = 4;
bytes shard_block_hash = 5;
uint64 justified_slot = 6;
}
message AttestationHashes {
repeated bytes attestation_hash = 1;
}
message SpecialRecord {
uint32 kind = 1;
repeated bytes data = 2;
}
message CrosslinkRecord {
bytes shard_block_hash = 1;
uint64 slot = 2;
}
message ShardAndCommitteeArray {
repeated ShardAndCommittee array_shard_and_committee = 1;
}
message ShardAndCommittee {
uint64 shard = 1;
repeated uint32 committee = 2;
}
message BeaconBlock {
repeated bytes ancestor_hashes = 1;
uint64 slot = 2;
bytes randao_reveal = 3;
bytes pow_chain_ref = 4;
bytes active_state_root = 5;
bytes crystallized_state_root = 6;
google.protobuf.Timestamp timestamp = 7;
repeated AggregatedAttestation attestations = 8;
repeated SpecialRecord specials = 9;
}
message CrystallizedState {
uint64 last_state_recalculation_slot = 1;
uint64 justified_streak = 2;
uint64 last_justified_slot = 3;
uint64 last_finalized_slot = 4;
uint64 validator_set_change_slot = 5;
repeated CrosslinkRecord crosslinks = 6;
repeated ValidatorRecord validators = 7;
repeated ShardAndCommitteeArray shard_and_committees_for_slots = 8;
repeated uint32 deposits_penalized_in_period = 9;
bytes validator_set_delta_hash_chain = 10;
uint32 pre_fork_version = 11;
uint32 post_fork_version = 12;
uint64 fork_slot_number =13;
}
message ActiveState {
repeated AggregatedAttestation pending_attestations = 1;
repeated bytes recent_block_hashes = 2;
repeated SpecialRecord pending_specials = 3;
bytes randao_mix = 4;
}

View File

@@ -49,7 +49,7 @@ func (x ValidatorRole) String() string {
return proto.EnumName(ValidatorRole_name, int32(x))
}
func (ValidatorRole) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{0}
return fileDescriptor_services_6ea57c914c53b8cb, []int{0}
}
type ProposeRequest struct {
@@ -68,7 +68,7 @@ func (m *ProposeRequest) Reset() { *m = ProposeRequest{} }
func (m *ProposeRequest) String() string { return proto.CompactTextString(m) }
func (*ProposeRequest) ProtoMessage() {}
func (*ProposeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{0}
return fileDescriptor_services_6ea57c914c53b8cb, []int{0}
}
func (m *ProposeRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ProposeRequest.Unmarshal(m, b)
@@ -141,7 +141,7 @@ func (m *ProposeResponse) Reset() { *m = ProposeResponse{} }
func (m *ProposeResponse) String() string { return proto.CompactTextString(m) }
func (*ProposeResponse) ProtoMessage() {}
func (*ProposeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{1}
return fileDescriptor_services_6ea57c914c53b8cb, []int{1}
}
func (m *ProposeResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ProposeResponse.Unmarshal(m, b)
@@ -179,7 +179,7 @@ func (m *AttestRequest) Reset() { *m = AttestRequest{} }
func (m *AttestRequest) String() string { return proto.CompactTextString(m) }
func (*AttestRequest) ProtoMessage() {}
func (*AttestRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{2}
return fileDescriptor_services_6ea57c914c53b8cb, []int{2}
}
func (m *AttestRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AttestRequest.Unmarshal(m, b)
@@ -217,7 +217,7 @@ func (m *AttestResponse) Reset() { *m = AttestResponse{} }
func (m *AttestResponse) String() string { return proto.CompactTextString(m) }
func (*AttestResponse) ProtoMessage() {}
func (*AttestResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{3}
return fileDescriptor_services_6ea57c914c53b8cb, []int{3}
}
func (m *AttestResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AttestResponse.Unmarshal(m, b)
@@ -258,7 +258,7 @@ func (m *ValidatorAssignmentRequest) Reset() { *m = ValidatorAssignmentR
func (m *ValidatorAssignmentRequest) String() string { return proto.CompactTextString(m) }
func (*ValidatorAssignmentRequest) ProtoMessage() {}
func (*ValidatorAssignmentRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{4}
return fileDescriptor_services_6ea57c914c53b8cb, []int{4}
}
func (m *ValidatorAssignmentRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ValidatorAssignmentRequest.Unmarshal(m, b)
@@ -303,7 +303,7 @@ func (m *ValidatorAssignmentResponse) Reset() { *m = ValidatorAssignment
func (m *ValidatorAssignmentResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorAssignmentResponse) ProtoMessage() {}
func (*ValidatorAssignmentResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{5}
return fileDescriptor_services_6ea57c914c53b8cb, []int{5}
}
func (m *ValidatorAssignmentResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ValidatorAssignmentResponse.Unmarshal(m, b)
@@ -345,7 +345,7 @@ func (m *Assignment) Reset() { *m = Assignment{} }
func (m *Assignment) String() string { return proto.CompactTextString(m) }
func (*Assignment) ProtoMessage() {}
func (*Assignment) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{6}
return fileDescriptor_services_6ea57c914c53b8cb, []int{6}
}
func (m *Assignment) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Assignment.Unmarshal(m, b)
@@ -404,7 +404,7 @@ func (m *PublicKey) Reset() { *m = PublicKey{} }
func (m *PublicKey) String() string { return proto.CompactTextString(m) }
func (*PublicKey) ProtoMessage() {}
func (*PublicKey) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{7}
return fileDescriptor_services_6ea57c914c53b8cb, []int{7}
}
func (m *PublicKey) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PublicKey.Unmarshal(m, b)
@@ -443,7 +443,7 @@ func (m *SlotResponsibilityResponse) Reset() { *m = SlotResponsibilityRe
func (m *SlotResponsibilityResponse) String() string { return proto.CompactTextString(m) }
func (*SlotResponsibilityResponse) ProtoMessage() {}
func (*SlotResponsibilityResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{8}
return fileDescriptor_services_6ea57c914c53b8cb, []int{8}
}
func (m *SlotResponsibilityResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SlotResponsibilityResponse.Unmarshal(m, b)
@@ -488,7 +488,7 @@ func (m *IndexResponse) Reset() { *m = IndexResponse{} }
func (m *IndexResponse) String() string { return proto.CompactTextString(m) }
func (*IndexResponse) ProtoMessage() {}
func (*IndexResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{9}
return fileDescriptor_services_6ea57c914c53b8cb, []int{9}
}
func (m *IndexResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_IndexResponse.Unmarshal(m, b)
@@ -526,7 +526,7 @@ func (m *ShardIDResponse) Reset() { *m = ShardIDResponse{} }
func (m *ShardIDResponse) String() string { return proto.CompactTextString(m) }
func (*ShardIDResponse) ProtoMessage() {}
func (*ShardIDResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{10}
return fileDescriptor_services_6ea57c914c53b8cb, []int{10}
}
func (m *ShardIDResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShardIDResponse.Unmarshal(m, b)
@@ -565,7 +565,7 @@ func (m *CurrentAssignmentsResponse) Reset() { *m = CurrentAssignmentsRe
func (m *CurrentAssignmentsResponse) String() string { return proto.CompactTextString(m) }
func (*CurrentAssignmentsResponse) ProtoMessage() {}
func (*CurrentAssignmentsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_54e1be11fa7a94d4, []int{11}
return fileDescriptor_services_6ea57c914c53b8cb, []int{11}
}
func (m *CurrentAssignmentsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CurrentAssignmentsResponse.Unmarshal(m, b)
@@ -1122,68 +1122,67 @@ var _ValidatorService_serviceDesc = grpc.ServiceDesc{
}
func init() {
proto.RegisterFile("proto/beacon/rpc/v1/services.proto", fileDescriptor_services_54e1be11fa7a94d4)
proto.RegisterFile("proto/beacon/rpc/v1/services.proto", fileDescriptor_services_6ea57c914c53b8cb)
}
var fileDescriptor_services_54e1be11fa7a94d4 = []byte{
// 929 bytes of a gzipped FileDescriptorProto
var fileDescriptor_services_6ea57c914c53b8cb = []byte{
// 928 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x6f, 0x6f, 0xdb, 0x44,
0x1c, 0xc6, 0x69, 0xb6, 0xb5, 0xbf, 0xc4, 0x69, 0x76, 0x4c, 0x23, 0xf3, 0x04, 0x0b, 0x9e, 0x0a,
0x61, 0x02, 0xa7, 0xf5, 0xde, 0x0c, 0x78, 0x43, 0xba, 0x55, 0xdb, 0xb4, 0xa9, 0xad, 0x9c, 0x02,
0x12, 0x20, 0xcc, 0x25, 0x3e, 0x1c, 0xab, 0x8e, 0xcf, 0xdc, 0x5d, 0x02, 0x7d, 0xc9, 0x2b, 0x24,
0x3e, 0x04, 0x5f, 0x80, 0x0f, 0x82, 0x90, 0xf8, 0x50, 0xe8, 0xce, 0xf6, 0xd9, 0x69, 0x6b, 0xd2,
0x1c, 0xc6, 0x69, 0xb6, 0xb5, 0xbf, 0xc4, 0x69, 0x76, 0x4c, 0x23, 0xf3, 0x04, 0x0d, 0x9e, 0x0a,
0x61, 0x02, 0xa7, 0xf5, 0xde, 0x0c, 0x78, 0x43, 0xba, 0x55, 0xdb, 0xb4, 0xaa, 0xad, 0x9c, 0x02,
0x12, 0x20, 0xcc, 0x25, 0x3e, 0x1c, 0xab, 0x8e, 0xcf, 0xdc, 0x5d, 0x02, 0x79, 0xc9, 0x2b, 0x24,
0x3e, 0x04, 0x5f, 0x80, 0x0f, 0x82, 0x90, 0xf8, 0x50, 0xe8, 0xce, 0xf6, 0xc5, 0x69, 0x6b, 0xd2,
0xa2, 0xbd, 0xb3, 0x9f, 0xfb, 0xfd, 0x79, 0xee, 0xb9, 0xdf, 0x3d, 0x07, 0x76, 0xca, 0xa8, 0xa0,
0xc3, 0x09, 0xc1, 0x53, 0x9a, 0x0c, 0x59, 0x3a, 0x1d, 0x2e, 0xf7, 0x86, 0x9c, 0xb0, 0x65, 0x34,
0x25, 0xdc, 0x51, 0x8b, 0xe8, 0x2e, 0x11, 0x33, 0xc2, 0xc8, 0x62, 0xee, 0x64, 0x61, 0x0e, 0x4b,
0xa7, 0xce, 0x72, 0xcf, 0x5a, 0xcd, 0x4d, 0xdd, 0x54, 0xe6, 0xce, 0x09, 0xe7, 0x38, 0x2c, 0x72,
0xad, 0xfb, 0x21, 0xa5, 0x61, 0x4c, 0x86, 0xea, 0x6f, 0xb2, 0xf8, 0x71, 0x48, 0xe6, 0xa9, 0x38,
0xcb, 0x17, 0x1f, 0x9c, 0x5f, 0x14, 0xd1, 0x9c, 0x70, 0x81, 0xe7, 0x69, 0x16, 0x60, 0xff, 0xd1,
0x80, 0xce, 0x31, 0xa3, 0x29, 0xe5, 0xc4, 0x23, 0x3f, 0x2d, 0x08, 0x17, 0xe8, 0x01, 0xb4, 0x52,
0xcc, 0x48, 0x22, 0xfc, 0x19, 0xe6, 0xb3, 0x9e, 0xd1, 0x37, 0x06, 0x6d, 0x0f, 0x32, 0xe8, 0x05,
0xe6, 0x33, 0x19, 0xc0, 0x63, 0x2a, 0xfc, 0x64, 0x31, 0x9f, 0x10, 0xd6, 0x6b, 0xf4, 0x8d, 0x41,
0xd3, 0x03, 0x09, 0x1d, 0x2a, 0x04, 0x3d, 0x04, 0x93, 0xe1, 0x24, 0xc0, 0xd4, 0x67, 0x64, 0x49,
0x70, 0xdc, 0xdb, 0x50, 0x35, 0xda, 0x19, 0xe8, 0x29, 0x0c, 0x0d, 0xe1, 0x6d, 0x2c, 0x84, 0x24,
0x23, 0x22, 0x9a, 0xf8, 0x93, 0x48, 0xcc, 0x31, 0x3f, 0xed, 0x35, 0x55, 0x28, 0xaa, 0x2c, 0xed,
0x67, 0x2b, 0xe8, 0x33, 0xb8, 0x57, 0x4d, 0xc0, 0x61, 0xc8, 0x48, 0x88, 0x05, 0xf1, 0x79, 0x14,
0xf6, 0x6e, 0xf4, 0x37, 0x06, 0xa6, 0xf7, 0x4e, 0x25, 0x60, 0x54, 0xac, 0x8f, 0xa3, 0x10, 0x3d,
0x81, 0x2d, 0xbd, 0xf3, 0xde, 0xcd, 0xbe, 0x31, 0x68, 0xb9, 0x96, 0x93, 0x69, 0xe3, 0x14, 0xda,
0x38, 0x27, 0x45, 0x84, 0x57, 0x06, 0xdb, 0xbb, 0xb0, 0xad, 0xf5, 0xe1, 0x29, 0x4d, 0x38, 0x41,
0xef, 0x02, 0x4c, 0x62, 0x3a, 0x3d, 0xad, 0xea, 0xb3, 0xa5, 0x10, 0x29, 0x8f, 0xfd, 0x03, 0x98,
0x23, 0x45, 0xa3, 0x10, 0xf4, 0x08, 0x5a, 0x15, 0x5e, 0x2a, 0xa1, 0xe5, 0x7e, 0xe2, 0x9c, 0x3f,
0xf3, 0xd4, 0x4d, 0x9d, 0xe5, 0x9e, 0xa3, 0x79, 0x07, 0xa3, 0x32, 0xc9, 0xab, 0x56, 0xb0, 0x3f,
0x87, 0x4e, 0xd1, 0x21, 0xa7, 0xf4, 0x11, 0x74, 0xab, 0xda, 0x54, 0x88, 0x6d, 0x57, 0x70, 0x45,
0xef, 0x37, 0x03, 0xac, 0xaf, 0x70, 0x1c, 0x05, 0x58, 0x50, 0x36, 0xe2, 0x3c, 0x0a, 0x93, 0x39,
0x49, 0x34, 0xd9, 0x1d, 0xe8, 0xe0, 0x38, 0xf6, 0x97, 0x45, 0x04, 0x57, 0x75, 0x36, 0x3d, 0x13,
0xc7, 0xb1, 0x4e, 0xe3, 0x68, 0x1f, 0x5a, 0xe9, 0x62, 0x12, 0x47, 0x53, 0xff, 0x94, 0x9c, 0xf1,
0x5e, 0xa3, 0xbf, 0x31, 0x68, 0xb9, 0xef, 0x3b, 0x97, 0xcf, 0xb1, 0x73, 0xac, 0x42, 0x5f, 0x91,
0x33, 0x0f, 0xd2, 0xe2, 0x93, 0xdb, 0x53, 0xb8, 0x7f, 0x29, 0x91, 0x7c, 0x4f, 0xcf, 0xa0, 0x85,
0x35, 0x2a, 0x69, 0xc8, 0x16, 0x76, 0x5d, 0x8b, 0x4a, 0x81, 0x6a, 0x9a, 0xfd, 0xb7, 0x01, 0x50,
0xae, 0xa1, 0x2f, 0x00, 0x4a, 0xde, 0xf9, 0x51, 0x5c, 0x81, 0xf6, 0x96, 0xa6, 0x8d, 0xee, 0xc1,
0x26, 0x9f, 0x61, 0x16, 0xf8, 0x51, 0x90, 0x8f, 0xfe, 0x2d, 0xf5, 0xff, 0x32, 0x40, 0x9f, 0x42,
0x93, 0xd1, 0x98, 0xa8, 0x71, 0xef, 0xb8, 0x3b, 0x75, 0x65, 0xf5, 0xa6, 0x3d, 0x1a, 0x13, 0x4f,
0xa5, 0xc8, 0x2b, 0x93, 0xb1, 0x26, 0x81, 0x2f, 0x6f, 0x92, 0xba, 0x07, 0x4d, 0xaf, 0x5d, 0x80,
0xe3, 0x98, 0x0a, 0xfb, 0x11, 0x6c, 0x69, 0x4a, 0x72, 0x0a, 0xcf, 0xed, 0xa4, 0x5d, 0xa1, 0x69,
0x9f, 0x82, 0x25, 0x73, 0x72, 0x35, 0xa3, 0x49, 0x14, 0x47, 0xe2, 0x4c, 0x6b, 0x8b, 0xa0, 0xa9,
0xba, 0x18, 0xaa, 0x8b, 0xfa, 0xd6, 0xec, 0x1b, 0xd7, 0x66, 0x6f, 0xef, 0x80, 0xf9, 0x32, 0x09,
0xc8, 0x2f, 0xba, 0xfe, 0x1d, 0xb8, 0x11, 0x49, 0x40, 0x35, 0x30, 0xbd, 0xec, 0xc7, 0xfe, 0x18,
0xb6, 0xc7, 0x4a, 0xaa, 0x67, 0x3a, 0xb0, 0xaa, 0xa6, 0xb1, 0xa2, 0xa6, 0xfd, 0xa7, 0x01, 0xd6,
0xd3, 0x05, 0x93, 0xb6, 0x53, 0x1e, 0x20, 0x7f, 0xb3, 0xe3, 0x81, 0x9e, 0xc3, 0xed, 0x90, 0x24,
0x84, 0x47, 0xdc, 0x2f, 0x0d, 0xa2, 0xb1, 0xd6, 0x20, 0xba, 0x79, 0x92, 0x46, 0x1e, 0x3d, 0x01,
0x73, 0x45, 0x19, 0xd4, 0x82, 0x5b, 0x5f, 0x1e, 0xbe, 0x3a, 0x3c, 0xfa, 0xfa, 0xb0, 0xfb, 0x16,
0x6a, 0xc3, 0xe6, 0xe8, 0xe4, 0xe4, 0x60, 0x7c, 0x72, 0xe0, 0x75, 0x0d, 0xf9, 0x77, 0xec, 0x1d,
0x1d, 0x1f, 0x8d, 0x0f, 0xbc, 0x6e, 0xc3, 0xfd, 0x67, 0x03, 0xcc, 0x7d, 0x45, 0x76, 0x9c, 0xbd,
0x0a, 0xe8, 0x35, 0x98, 0x4f, 0x71, 0x42, 0x93, 0x68, 0x8a, 0xe3, 0x17, 0x04, 0x07, 0xe8, 0xee,
0x05, 0x2a, 0x07, 0xd2, 0xe4, 0xad, 0x87, 0x75, 0x26, 0x92, 0xd5, 0xdb, 0x97, 0x9e, 0x84, 0xbe,
0x83, 0xdb, 0xaf, 0xb1, 0xf4, 0x80, 0x8a, 0x9f, 0xd4, 0x56, 0xbc, 0x9e, 0x2d, 0xed, 0x1a, 0xe8,
0x77, 0x03, 0xfa, 0x17, 0x4f, 0x69, 0x94, 0x04, 0xcf, 0x4b, 0x85, 0x90, 0xbb, 0x76, 0x98, 0x2e,
0x18, 0x91, 0x55, 0x9b, 0xf3, 0x1f, 0x33, 0xf1, 0xab, 0x01, 0x77, 0x2e, 0x29, 0xc9, 0xff, 0x17,
0x81, 0xc7, 0xd7, 0xca, 0xc9, 0x18, 0xec, 0x1a, 0x6e, 0x02, 0xdb, 0x99, 0x42, 0x84, 0x15, 0xe7,
0xf9, 0x2d, 0x40, 0x06, 0xa9, 0xc3, 0xac, 0xbd, 0x59, 0x2b, 0xaf, 0x86, 0xf5, 0xc1, 0xba, 0xb0,
0xac, 0xa3, 0xcb, 0xf4, 0x03, 0xa5, 0xfb, 0xf9, 0xd0, 0xce, 0xa1, 0x6c, 0x02, 0x6a, 0x4b, 0xad,
0xbe, 0xfc, 0xd6, 0x87, 0x6b, 0xe3, 0xf2, 0x9e, 0x7f, 0x35, 0xa0, 0xab, 0x55, 0x28, 0xba, 0x7e,
0x5f, 0xc5, 0xb2, 0x6b, 0x8e, 0xd6, 0x5b, 0x6b, 0x7d, 0xd3, 0xf3, 0x56, 0xf1, 0x0d, 0x74, 0x74,
0x7d, 0xe5, 0x36, 0x57, 0xa9, 0x5e, 0x2b, 0xf6, 0xaa, 0x5f, 0xfd, 0x0c, 0xef, 0x95, 0xdc, 0x63,
0x2a, 0x46, 0x49, 0xb0, 0xea, 0x9c, 0x57, 0xe9, 0x55, 0x3b, 0x64, 0xf5, 0x46, 0x3c, 0xb9, 0xa9,
0xee, 0xdf, 0xe3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xd7, 0xae, 0x60, 0x87, 0x26, 0x0a, 0x00,
0x00,
0xfd, 0x11, 0xc1, 0x63, 0x9a, 0xf4, 0x59, 0x3a, 0xee, 0xcf, 0xf7, 0xfb, 0x9c, 0xb0, 0x79, 0x34,
0x26, 0xdc, 0x51, 0x8b, 0xe8, 0x3e, 0x11, 0x13, 0xc2, 0xc8, 0x6c, 0xea, 0x64, 0x61, 0x0e, 0x4b,
0xc7, 0xce, 0x7c, 0xdf, 0xda, 0x59, 0xc9, 0x4d, 0xdd, 0x54, 0xe6, 0x8a, 0x45, 0x5a, 0x24, 0x5a,
0x0f, 0x43, 0x4a, 0xc3, 0x98, 0xf4, 0xd5, 0xdf, 0x68, 0xf6, 0x63, 0x9f, 0x4c, 0x53, 0xb1, 0xc8,
0x17, 0x77, 0x2e, 0x2e, 0x8a, 0x68, 0x4a, 0xb8, 0xc0, 0xd3, 0x34, 0x0b, 0xb0, 0xff, 0xa8, 0x41,
0xeb, 0x94, 0xd1, 0x94, 0x72, 0xe2, 0x91, 0x9f, 0x66, 0x84, 0x0b, 0xb4, 0x03, 0x8d, 0x14, 0x33,
0x92, 0x08, 0x7f, 0x82, 0xf9, 0xa4, 0x63, 0x74, 0x8d, 0x5e, 0xd3, 0x83, 0x0c, 0x7a, 0x89, 0xf9,
0x44, 0x06, 0xf0, 0x98, 0x0a, 0x3f, 0x99, 0x4d, 0x47, 0x84, 0x75, 0x6a, 0x5d, 0xa3, 0x57, 0xf7,
0x40, 0x42, 0xc7, 0x0a, 0x41, 0x8f, 0xc0, 0x64, 0x38, 0x09, 0x30, 0xf5, 0x19, 0x99, 0x13, 0x1c,
0x77, 0x36, 0x54, 0x8d, 0x66, 0x06, 0x7a, 0x0a, 0x43, 0x7d, 0x78, 0x1b, 0x0b, 0x21, 0xc9, 0x88,
0x88, 0x26, 0xfe, 0x28, 0x12, 0x53, 0xcc, 0xcf, 0x3b, 0x75, 0x15, 0x8a, 0x4a, 0x4b, 0x07, 0xd9,
0x0a, 0xfa, 0x0c, 0x1e, 0x94, 0x13, 0x70, 0x18, 0x32, 0x12, 0x62, 0x41, 0x7c, 0x1e, 0x85, 0x9d,
0x5b, 0xdd, 0x8d, 0x9e, 0xe9, 0xbd, 0x53, 0x0a, 0x18, 0x14, 0xeb, 0xc3, 0x28, 0x44, 0x4f, 0x61,
0x4b, 0xef, 0xbc, 0x73, 0xbb, 0x6b, 0xf4, 0x1a, 0xae, 0xe5, 0x64, 0xda, 0x38, 0x85, 0x36, 0xce,
0x59, 0x11, 0xe1, 0x2d, 0x83, 0xed, 0x3d, 0xd8, 0xd6, 0xfa, 0xf0, 0x94, 0x26, 0x9c, 0xa0, 0x77,
0x01, 0x46, 0x31, 0x1d, 0x9f, 0x97, 0xf5, 0xd9, 0x52, 0x88, 0x94, 0xc7, 0xfe, 0x01, 0xcc, 0x81,
0xa2, 0x51, 0x08, 0x7a, 0x02, 0x8d, 0x12, 0x2f, 0x95, 0xd0, 0x70, 0x3f, 0x71, 0x2e, 0x1e, 0x78,
0xea, 0xa6, 0xce, 0x7c, 0xdf, 0xd1, 0xbc, 0x83, 0xc1, 0x32, 0xc9, 0x2b, 0x57, 0xb0, 0x3f, 0x87,
0x56, 0xd1, 0x21, 0xa7, 0xf4, 0x11, 0xb4, 0xcb, 0xda, 0x94, 0x88, 0x6d, 0x97, 0x70, 0x45, 0xef,
0x37, 0x03, 0xac, 0xaf, 0x70, 0x1c, 0x05, 0x58, 0x50, 0x36, 0xe0, 0x3c, 0x0a, 0x93, 0x29, 0x49,
0x34, 0xd9, 0x5d, 0x68, 0xe1, 0x38, 0xf6, 0xe7, 0x45, 0x04, 0x57, 0x75, 0x36, 0x3d, 0x13, 0xc7,
0xb1, 0x4e, 0xe3, 0xe8, 0x00, 0x1a, 0xe9, 0x6c, 0x14, 0x47, 0x63, 0xff, 0x9c, 0x2c, 0x78, 0xa7,
0xd6, 0xdd, 0xe8, 0x35, 0xdc, 0xf7, 0x9d, 0xab, 0x87, 0xd8, 0x39, 0x55, 0xa1, 0xaf, 0xc9, 0xc2,
0x83, 0xb4, 0xf8, 0xe4, 0xf6, 0x18, 0x1e, 0x5e, 0x49, 0x24, 0xdf, 0xd3, 0x73, 0x68, 0x60, 0x8d,
0x4a, 0x1a, 0xb2, 0x85, 0x5d, 0xd5, 0xa2, 0x54, 0xa0, 0x9c, 0x66, 0xff, 0x6d, 0x00, 0x2c, 0xd7,
0xd0, 0x17, 0x00, 0x4b, 0xde, 0xf9, 0x51, 0x5c, 0x83, 0xf6, 0x96, 0xa6, 0x8d, 0x1e, 0xc0, 0x26,
0x9f, 0x60, 0x16, 0xf8, 0x51, 0x90, 0x8f, 0xfe, 0x1d, 0xf5, 0xff, 0x2a, 0x40, 0x9f, 0x42, 0x9d,
0xd1, 0x98, 0xa8, 0x71, 0x6f, 0xb9, 0xbb, 0x55, 0x65, 0xf5, 0xa6, 0x3d, 0x1a, 0x13, 0x4f, 0xa5,
0xc8, 0x2b, 0x93, 0xb1, 0x26, 0x81, 0x2f, 0x6f, 0x92, 0xba, 0x07, 0x75, 0xaf, 0x59, 0x80, 0xc3,
0x98, 0x0a, 0xfb, 0x31, 0x6c, 0x69, 0x4a, 0x72, 0x0a, 0x2f, 0xec, 0xa4, 0x59, 0xa2, 0x69, 0x9f,
0x83, 0x25, 0x73, 0x72, 0x35, 0xa3, 0x51, 0x14, 0x47, 0x62, 0xa1, 0xb5, 0x45, 0x50, 0x57, 0x5d,
0x0c, 0xd5, 0x45, 0x7d, 0x6b, 0xf6, 0xb5, 0x1b, 0xb3, 0xb7, 0x77, 0xc1, 0x7c, 0x95, 0x04, 0xe4,
0x17, 0x5d, 0xff, 0x1e, 0xdc, 0x8a, 0x24, 0xa0, 0x1a, 0x98, 0x5e, 0xf6, 0x63, 0x7f, 0x0c, 0xdb,
0x43, 0x25, 0xd5, 0x73, 0x1d, 0x58, 0x56, 0xd3, 0x58, 0x51, 0xd3, 0xfe, 0xd3, 0x00, 0xeb, 0xd9,
0x8c, 0x49, 0xdb, 0x59, 0x1e, 0x20, 0x7f, 0xb3, 0xe3, 0x81, 0x5e, 0xc0, 0xdd, 0x90, 0x24, 0x84,
0x47, 0xdc, 0x5f, 0x1a, 0x44, 0x6d, 0xad, 0x41, 0xb4, 0xf3, 0x24, 0x8d, 0x3c, 0x7e, 0x0a, 0xe6,
0x8a, 0x32, 0xa8, 0x01, 0x77, 0xbe, 0x3c, 0x7e, 0x7d, 0x7c, 0xf2, 0xf5, 0x71, 0xfb, 0x2d, 0xd4,
0x84, 0xcd, 0xc1, 0xd9, 0xd9, 0xe1, 0xf0, 0xec, 0xd0, 0x6b, 0x1b, 0xf2, 0xef, 0xd4, 0x3b, 0x39,
0x3d, 0x19, 0x1e, 0x7a, 0xed, 0x9a, 0xfb, 0xcf, 0x06, 0x98, 0x07, 0x8a, 0xec, 0x30, 0x7b, 0x12,
0xd0, 0x11, 0x98, 0xcf, 0x70, 0x42, 0x93, 0x68, 0x8c, 0xe3, 0x97, 0x04, 0x07, 0xe8, 0xfe, 0x25,
0x2a, 0x87, 0xd2, 0xe4, 0xad, 0x47, 0x55, 0x26, 0x92, 0xd5, 0x3b, 0x90, 0x9e, 0x84, 0xbe, 0x83,
0xbb, 0x47, 0x58, 0x7a, 0x40, 0xc9, 0x4f, 0x2a, 0x2b, 0xde, 0xcc, 0x96, 0xf6, 0x0c, 0xf4, 0xbb,
0x01, 0xdd, 0xcb, 0xa7, 0x34, 0x48, 0x82, 0x17, 0x4b, 0x85, 0x90, 0xbb, 0x76, 0x98, 0x2e, 0x19,
0x91, 0x55, 0x99, 0xf3, 0x1f, 0x33, 0xf1, 0xab, 0x01, 0xf7, 0xae, 0x28, 0xc9, 0xff, 0x17, 0x81,
0x27, 0x37, 0xca, 0xc9, 0x18, 0xec, 0x19, 0x6e, 0x02, 0xdb, 0x99, 0x42, 0x84, 0x15, 0xe7, 0xf9,
0x2d, 0x40, 0x06, 0xa9, 0xc3, 0xac, 0xbc, 0x59, 0x2b, 0xaf, 0x86, 0xf5, 0xc1, 0xba, 0xb0, 0xac,
0xa3, 0xcb, 0xf4, 0x03, 0xa5, 0xfb, 0xf9, 0xd0, 0xcc, 0xa1, 0x6c, 0x02, 0x2a, 0x4b, 0xad, 0xbe,
0xfc, 0xd6, 0x87, 0x6b, 0xe3, 0xf2, 0x9e, 0x7f, 0xd5, 0xa0, 0xad, 0x55, 0x28, 0xba, 0x7e, 0x5f,
0xc6, 0xb2, 0x6b, 0x8e, 0xd6, 0x5b, 0x6b, 0x75, 0xd3, 0x8b, 0x56, 0xf1, 0x0d, 0xb4, 0x74, 0x7d,
0xe5, 0x36, 0xd7, 0xa9, 0x5e, 0x29, 0xf6, 0xaa, 0x5f, 0xfd, 0x0c, 0xef, 0x2d, 0xb9, 0xc7, 0x54,
0x0c, 0x92, 0x60, 0xd5, 0x39, 0xaf, 0xd3, 0xab, 0x72, 0xc8, 0xaa, 0x8d, 0x78, 0x74, 0x5b, 0xdd,
0xbf, 0x27, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x32, 0x73, 0x19, 0x17, 0x23, 0x0a, 0x00, 0x00,
}

View File

@@ -2,7 +2,7 @@ syntax = "proto3";
package ethereum.beacon.rpc.v1;
import "proto/beacon/p2p/v1/messages.proto";
import "proto/beacon/p2p/v1/types.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";