Save Attestation and AttestationHashes to DB (#472)

This commit is contained in:
terence tsao
2018-09-08 18:52:18 -07:00
committed by GitHub
parent d4209b7357
commit b0f5ef0da0
10 changed files with 680 additions and 108 deletions

View File

@@ -482,6 +482,7 @@ func (b *BeaconChain) stateRecalc(
recentBlockHashes = append(recentBlockHashes, blockHashes[:])
// Drop the oldest block hash if the recent block hashes length is more than 2 * cycle length.
for len(recentBlockHashes) > 2*params.CycleLength {
// Delete attestation hash list that's corresponding to the block hash.
recentBlockHashes = recentBlockHashes[1:]
}
}
@@ -640,3 +641,123 @@ func (b *BeaconChain) getCanonicalBlockForSlot(slotNumber uint64) (*types.Block,
return block, err
}
func (b *BeaconChain) hasAttestation(attestationHash [32]byte) (bool, error) {
return b.db.Has(attestationKey(attestationHash))
}
// saveAttestation puts the attestation record into the beacon chain db.
func (b *BeaconChain) saveAttestation(attestation *types.Attestation) error {
hash := attestation.Key()
key := attestationKey(hash)
encodedState, err := attestation.Marshal()
if err != nil {
return err
}
return b.db.Put(key, encodedState)
}
// getAttestation retrieves an attestation record from the db using its hash.
func (b *BeaconChain) getAttestation(hash [32]byte) (*types.Attestation, error) {
key := attestationKey(hash)
enc, err := b.db.Get(key)
if err != nil {
return nil, err
}
attestation := &pb.AttestationRecord{}
err = proto.Unmarshal(enc, attestation)
return types.NewAttestation(attestation), err
}
// removeAttestation removes the attestation from the db.
func (b *BeaconChain) removeAttestation(blockHash [32]byte) error {
return b.db.Delete(attestationKey(blockHash))
}
// hasAttestationHash checks if the beacon block has the attestation.
func (b *BeaconChain) hasAttestationHash(blockHash [32]byte, attestationHash [32]byte) (bool, error) {
enc, err := b.db.Get(attestationHashListKey(blockHash))
if err != nil {
return false, err
}
attestationHashes := &pb.AttestationHashes{}
if err := proto.Unmarshal(enc, attestationHashes); err != nil {
return false, err
}
for _, hash := range attestationHashes.AttestationHash {
if bytes.Equal(hash, attestationHash[:]) {
return true, nil
}
}
return false, nil
}
// hasAttestationHashList checks if the attestation hash list is available.
func (b *BeaconChain) hasAttestationHashList(blockHash [32]byte) (bool, error) {
key := attestationHashListKey(blockHash)
hasKey, err := b.db.Has(key)
if err != nil {
return false, err
}
if !hasKey {
return false, nil
}
return true, nil
}
// getAttestationHashList gets the attestation hash list of the beacon block from the db.
func (b *BeaconChain) getAttestationHashList(blockHash [32]byte) ([][]byte, error) {
key := attestationHashListKey(blockHash)
hasList, err := b.hasAttestationHashList(blockHash)
if err != nil {
return [][]byte{}, err
}
if !hasList {
if err := b.db.Put(key, []byte{}); err != nil {
return [][]byte{}, err
}
}
enc, err := b.db.Get(key)
if err != nil {
return [][]byte{}, err
}
attestationHashes := &pb.AttestationHashes{}
if err := proto.Unmarshal(enc, attestationHashes); err != nil {
return [][]byte{}, err
}
return attestationHashes.AttestationHash, nil
}
// removeAttestationHashList removes the attestation hash list of the beacon block from the db.
func (b *BeaconChain) removeAttestationHashList(blockHash [32]byte) error {
return b.db.Delete(attestationHashListKey(blockHash))
}
// saveAttestationHash saves the attestation hash into the attestation hash list of the corresponding beacon block.
func (b *BeaconChain) saveAttestationHash(blockHash [32]byte, attestationHash [32]byte) error {
key := attestationHashListKey(blockHash)
hashes, err := b.getAttestationHashList(blockHash)
if err != nil {
return err
}
hashes = append(hashes, attestationHash[:])
attestationHashes := &pb.AttestationHashes{}
attestationHashes.AttestationHash = hashes
encodedState, err := proto.Marshal(attestationHashes)
if err != nil {
return err
}
return b.db.Put(key, encodedState)
}

View File

@@ -689,6 +689,14 @@ func NewBlock(t *testing.T, b *pb.BeaconBlock) *types.Block {
return types.NewBlock(b)
}
// NewAttestation is a helper method to create attestation with valid defaults.
func NewAttestation(t *testing.T, b *pb.AttestationRecord) *types.Attestation {
if b == nil {
b = &pb.AttestationRecord{}
}
return types.NewAttestation(b)
}
func TestSaveAndRemoveBlocks(t *testing.T) {
b, db := startInMemoryBeaconChain(t)
defer db.Close()
@@ -854,6 +862,120 @@ func TestGetBlockBySlotNumber(t *testing.T) {
}
}
func TestSaveAndRemoveAttestations(t *testing.T) {
b, db := startInMemoryBeaconChain(t)
defer db.Close()
attestation := NewAttestation(t, &pb.AttestationRecord{
Slot: 1,
ShardId: 1,
AttesterBitfield: []byte{'A'},
})
hash := attestation.Key()
if err := b.saveAttestation(attestation); err != nil {
t.Fatalf("unable to save attestation %v", err)
}
exist, err := b.hasAttestation(hash)
if err != nil {
t.Fatalf("unable to check attestation %v", err)
}
if !exist {
t.Fatal("saved attestation does not exist")
}
// Adding a different attestation with the same key
newAttestation := NewAttestation(t, &pb.AttestationRecord{
Slot: 2,
ShardId: 2,
AttesterBitfield: []byte{'B'},
})
key := blockKey(hash)
marshalled, err := proto.Marshal(newAttestation.Proto())
if err != nil {
t.Fatal(err)
}
if err := b.db.Put(key, marshalled); err != nil {
t.Fatal(err)
}
returnedAttestation, err := b.getAttestation(hash)
if err != nil {
t.Fatalf("attestation is unable to be retrieved")
}
if returnedAttestation.SlotNumber() != newAttestation.SlotNumber() {
t.Errorf("slotnumber does not match for saved and retrieved attestation")
}
if !bytes.Equal(returnedAttestation.AttesterBitfield(), newAttestation.AttesterBitfield()) {
t.Errorf("attester bitfield does not match for saved and retrieved attester")
}
if err := b.removeAttestation(hash); err != nil {
t.Fatalf("error removing attestation %v", err)
}
if _, err := b.getAttestation(hash); err == nil {
t.Fatalf("attestation is able to be retrieved")
}
}
func TestSaveAndRemoveAttestationHashList(t *testing.T) {
b, db := startInMemoryBeaconChain(t)
defer db.Close()
block := NewBlock(t, &pb.BeaconBlock{
SlotNumber: 0,
})
blockHash, err := block.Hash()
if err != nil {
t.Error(err)
}
attestation := NewAttestation(t, &pb.AttestationRecord{
Slot: 1,
ShardId: 1,
AttesterBitfield: []byte{'A'},
})
attestationHash := attestation.Key()
if err := b.saveAttestationHash(blockHash, attestationHash); err != nil {
t.Fatalf("unable to save attestation hash %v", err)
}
exist, err := b.hasAttestationHash(blockHash, attestationHash)
if err != nil {
t.Fatalf("unable to check for attestation hash %v", err)
}
if !exist {
t.Error("saved attestation hash does not exist")
}
// Negative test case: try with random attestation, exist should be false.
exist, err = b.hasAttestationHash(blockHash, [32]byte{'A'})
if err != nil {
t.Fatalf("unable to check for attestation hash %v", err)
}
if exist {
t.Error("attestation hash shouldn't have existed")
}
// Remove attestation list by deleting the block hash key.
if err := b.removeAttestationHashList(blockHash); err != nil {
t.Fatalf("remove attestation hash list failed %v", err)
}
// Negative test case: try with deleted block hash, this should fail.
_, err = b.hasAttestationHash(blockHash, attestationHash)
if err == nil {
t.Error("attestation hash should't have existed in DB")
}
}
func TestProcessCrosslinks(t *testing.T) {
beaconChain, db := startInMemoryBeaconChain(t)
defer db.Close()

View File

@@ -28,9 +28,10 @@ var (
genesisLookupKey = []byte("genesis")
// Data item prefixes.
blockPrefix = []byte("block-") // blockPrefix + blockhash -> block
canonicalPrefix = []byte("canonical-") // canonicalPrefix + num(uint64 big endian) -> blockhash
blockPrefix = []byte("block-") // blockPrefix + blockhash -> block
canonicalPrefix = []byte("canonical-") // canonicalPrefix + num(uint64 big endian) -> blockhash
attestationPrefix = []byte("attestation-") // attestationPrefix + attestationHash -> attestation
attestationHashesPrefix = []byte("attestationHashes-") // attestationHashesPrefix + blockHash -> attestationHashes
)
// encodeSlotNumber encodes a slot number as big endian uint64.
@@ -40,7 +41,7 @@ func encodeSlotNumber(number uint64) []byte {
return enc
}
// blockKey = blockPrefix + hash.
// blockKey = blockPrefix + blockHash.
func blockKey(hash [32]byte) []byte {
return append(blockPrefix, hash[:]...)
}
@@ -49,3 +50,13 @@ func blockKey(hash [32]byte) []byte {
func canonicalBlockKey(slotnumber uint64) []byte {
return append(canonicalPrefix, encodeSlotNumber(slotnumber)...)
}
// attestationKey = attestationPrefix + attestationHash.
func attestationKey(hash [32]byte) []byte {
return append(attestationPrefix, hash[:]...)
}
// attestationHashListKey = attestationHashesPrefix + blockHash.
func attestationHashListKey(hash [32]byte) []byte {
return append(attestationHashesPrefix, hash[:]...)
}

View File

@@ -284,6 +284,18 @@ func (c *ChainService) blockProcessing(done <-chan struct{}) {
log.Errorf("could not process attestation for block %d because %v", block.SlotNumber(), err)
} else {
canProcessAttestations = true
// Save processed attestation to local db.
if err := c.chain.saveAttestation(types.NewAttestation(attestation)); err != nil {
log.Errorf("Can not save attestation: %v", err)
}
attestationHash, err := types.NewAttestation(attestation).Hash()
if err != nil {
log.Errorf("Can not hash attestation: %v", err)
}
if err := c.chain.saveAttestationHash(h, attestationHash); err != nil {
log.Errorf("Can not save attesstation hash: %v", err)
}
processedAttestations = append(processedAttestations, attestation)
}
}
@@ -334,6 +346,7 @@ func (c *ChainService) blockProcessing(done <-chan struct{}) {
activeState := c.chain.ActiveState()
crystallizedState := c.chain.CrystallizedState()
if isTransition {
log.Info("Entering cycle transition")
crystallizedState, activeState, err = c.chain.stateRecalc(crystallizedState, activeState, block)
if err != nil {
log.Errorf("Initialize new cycle transition failed: %v", err)

View File

@@ -618,3 +618,83 @@ func TestProcessAttestationBadBlock(t *testing.T) {
testutil.AssertLogsContain(t, hook, "could not process attestation for block")
}
func TestEnterCycleTransition(t *testing.T) {
hook := logTest.NewGlobal()
ctx := context.Background()
config := &database.DBConfig{DataDir: "", Name: "", InMemory: true}
db, err := database.NewDB(config)
if err != nil {
t.Fatalf("could not setup beaconDB: %v", err)
}
endpoint := "ws://127.0.0.1"
client := &mockClient{}
web3Service, err := powchain.NewWeb3Service(ctx, &powchain.Web3ServiceConfig{Endpoint: endpoint, Pubkey: "", VrcAddr: common.Address{}}, client, client, client)
if err != nil {
t.Fatalf("unable to set up web3 service: %v", err)
}
beaconChain, err := NewBeaconChain(db.DB())
if err != nil {
t.Fatalf("could not register blockchain service: %v", err)
}
cfg := &Config{
BeaconBlockBuf: 0,
BeaconDB: db.DB(),
Chain: beaconChain,
Web3Service: web3Service,
}
chainService, _ := NewChainService(ctx, cfg)
active, crystallized, err := types.NewGenesisStates()
if err != nil {
t.Fatalf("Can't generate genesis state: %v", err)
}
activeStateHash, _ := active.Hash()
crystallizedStateHash, _ := crystallized.Hash()
genesis, err := beaconChain.GenesisBlock()
if err != nil {
t.Fatalf("unable to get canonical head: %v", err)
}
if err := chainService.SaveBlock(genesis); err != nil {
t.Fatalf("save block should failed")
}
parentHash, err := genesis.Hash()
if err != nil {
t.Fatalf("unable to get hash of canonical head: %v", err)
}
block1 := NewBlock(t, &pb.BeaconBlock{
ParentHash: parentHash[:],
SlotNumber: 64,
ActiveStateHash: activeStateHash[:],
CrystallizedStateHash: crystallizedStateHash[:],
Attestations: []*pb.AttestationRecord{{
Slot: 0,
AttesterBitfield: []byte{0, 0},
ShardId: 0,
}},
})
exitRoutine := make(chan bool)
go func() {
chainService.blockProcessing(chainService.ctx.Done())
<-exitRoutine
}()
if err := chainService.SaveBlock(block1); err != nil {
t.Fatal(err)
}
chainService.incomingBlockChan <- block1
chainService.cancel()
exitRoutine <- true
testutil.AssertLogsContain(t, hook, "Entering cycle transition")
}

View File

@@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
name = "go_default_library",
srcs = [
"attestation.go",
"block.go",
"interfaces.go",
"state.go",
@@ -28,6 +29,7 @@ go_library(
go_test(
name = "go_default_test",
srcs = [
"attestation_test.go",
"block_test.go",
"state_test.go",
],

View File

@@ -0,0 +1,123 @@
// Package types defines the essential types used throughout the beacon-chain.
package types
import (
"encoding/binary"
"fmt"
"github.com/golang/protobuf/proto"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"golang.org/x/crypto/blake2b"
)
// Attestation is the primary source of load on the beacon chain, it's used to
// attest to some parent block in the chain and block hash in a shard.
type Attestation struct {
data *pb.AttestationRecord
}
// NewAttestation explicitly sets the data field of a attestation.
// Return attestation with default fields if data is nil.
func NewAttestation(data *pb.AttestationRecord) *Attestation {
if data == nil {
return &Attestation{
data: &pb.AttestationRecord{
Slot: 0,
ShardId: 0,
JustifiedSlot: 0,
JustifiedBlockHash: []byte{},
ShardBlockHash: []byte{},
AttesterBitfield: []byte{},
ObliqueParentHashes: [][]byte{{}},
AggregateSig: []uint64{},
},
}
}
return &Attestation{data: data}
}
// Proto returns the underlying protobuf data.
func (a *Attestation) Proto() *pb.AttestationRecord {
return a.data
}
// Marshal encodes block object into the wire format.
func (a *Attestation) Marshal() ([]byte, error) {
return proto.Marshal(a.data)
}
// Hash generates the blake2b hash of the attestation.
func (a *Attestation) Hash() ([32]byte, error) {
data, err := proto.Marshal(a.data)
if err != nil {
return [32]byte{}, fmt.Errorf("could not marshal attestation proto data: %v", err)
}
var hash [32]byte
h := blake2b.Sum512(data)
copy(hash[:], h[:32])
return hash, nil
}
// Key generates the blake2b hash of the following attestation fields:
// slotNumber + shardID + blockHash + obliqueParentHash
// This is used for attestation table look up in localDB.
func (a *Attestation) Key() [32]byte {
key := make([]byte, binary.MaxVarintLen64)
binary.PutUvarint(key, a.SlotNumber())
binary.PutUvarint(key, a.ShardID())
key = append(key, a.ShardBlockHash()...)
for _, pHash := range a.ObliqueParentHashes() {
key = append(key, pHash[:]...)
}
var hash [32]byte
h := blake2b.Sum512(key)
copy(hash[:], h[:32])
return hash
}
// SlotNumber of the block, which this attestation is attesting to.
func (a *Attestation) SlotNumber() uint64 {
return a.data.Slot
}
// ShardID of the block, which this attestation is attesting to.
func (a *Attestation) ShardID() uint64 {
return a.data.ShardId
}
// ShardBlockHash of the block, which this attestation is attesting to.
func (a *Attestation) ShardBlockHash() []byte {
return a.data.ShardBlockHash
}
// JustifiedSlotNumber of the attestation should be earlier than the last justified slot in crystallized state.
func (a *Attestation) JustifiedSlotNumber() uint64 {
return a.data.Slot
}
// JustifiedBlockHash should be in the chain of the block being processed.
func (a *Attestation) JustifiedBlockHash() []byte {
return a.data.JustifiedBlockHash
}
// AttesterBitfield represents which validator in the committee has voted.
func (a *Attestation) AttesterBitfield() []byte {
return a.data.AttesterBitfield
}
// ObliqueParentHashes represents the block hashes this attestation is not attesting for.
func (a *Attestation) ObliqueParentHashes() [][32]byte {
var obliqueParentHashes [][32]byte
for _, hash := range a.data.ObliqueParentHashes {
var h [32]byte
copy(h[:], hash)
obliqueParentHashes = append(obliqueParentHashes, h)
}
return obliqueParentHashes
}
// AggregateSig represents the aggregated signature from all the validators attesting to this block.
func (a *Attestation) AggregateSig() []uint64 {
return a.data.AggregateSig
}

View File

@@ -0,0 +1,55 @@
package types
import (
"bytes"
"reflect"
"testing"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
)
func TestAttestation(t *testing.T) {
data := &pb.AttestationRecord{
Slot: 0,
ShardId: 0,
JustifiedSlot: 0,
JustifiedBlockHash: []byte{0},
ShardBlockHash: []byte{0},
AttesterBitfield: []byte{0},
ObliqueParentHashes: [][]byte{{0}},
AggregateSig: []uint64{0},
}
attestation := NewAttestation(data)
attestation.SlotNumber()
attestation.ShardID()
attestation.JustifiedSlotNumber()
attestation.JustifiedBlockHash()
attestation.AttesterBitfield()
attestation.ObliqueParentHashes()
attestation.AggregateSig()
attestation.Key()
emptyAttestation := &Attestation{}
if _, err := emptyAttestation.Marshal(); err == nil {
t.Error("marshal with empty data should fail")
}
if _, err := emptyAttestation.Hash(); err == nil {
t.Error("hash with empty data should fail")
}
if _, err := attestation.Hash(); err != nil {
t.Errorf("hashing with data should not fail, received %v", err)
}
if !reflect.DeepEqual(attestation.data, attestation.Proto()) {
t.Errorf("inner block data did not match proto: received %v, wanted %v", attestation.Proto(), attestation.data)
}
if attestation.SlotNumber() != 0 {
t.Errorf("mismatched attestation slot number: wanted 0, received %v", attestation.SlotNumber())
}
attestationWithNilData := NewAttestation(nil)
if attestationWithNilData.ShardID() != 0 {
t.Errorf("mismatched attestation shard id: wanted 0, received %v", attestation.ShardID())
}
if !bytes.Equal(attestation.ShardBlockHash(), []byte{0}) {
t.Errorf("mismatched shard block hash")
}
}

View File

@@ -66,7 +66,7 @@ func (x Topic) String() string {
return proto.EnumName(Topic_name, int32(x))
}
func (Topic) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{0}
return fileDescriptor_messages_290630aaea57f115, []int{0}
}
type BeaconBlockHashAnnounce struct {
@@ -80,7 +80,7 @@ func (m *BeaconBlockHashAnnounce) Reset() { *m = BeaconBlockHashAnnounce
func (m *BeaconBlockHashAnnounce) String() string { return proto.CompactTextString(m) }
func (*BeaconBlockHashAnnounce) ProtoMessage() {}
func (*BeaconBlockHashAnnounce) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{0}
return fileDescriptor_messages_290630aaea57f115, []int{0}
}
func (m *BeaconBlockHashAnnounce) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeaconBlockHashAnnounce.Unmarshal(m, b)
@@ -118,7 +118,7 @@ func (m *BeaconBlockRequest) Reset() { *m = BeaconBlockRequest{} }
func (m *BeaconBlockRequest) String() string { return proto.CompactTextString(m) }
func (*BeaconBlockRequest) ProtoMessage() {}
func (*BeaconBlockRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{1}
return fileDescriptor_messages_290630aaea57f115, []int{1}
}
func (m *BeaconBlockRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeaconBlockRequest.Unmarshal(m, b)
@@ -156,7 +156,7 @@ func (m *BeaconBlockRequestBySlotNumber) Reset() { *m = BeaconBlockReque
func (m *BeaconBlockRequestBySlotNumber) String() string { return proto.CompactTextString(m) }
func (*BeaconBlockRequestBySlotNumber) ProtoMessage() {}
func (*BeaconBlockRequestBySlotNumber) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{2}
return fileDescriptor_messages_290630aaea57f115, []int{2}
}
func (m *BeaconBlockRequestBySlotNumber) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeaconBlockRequestBySlotNumber.Unmarshal(m, b)
@@ -194,7 +194,7 @@ func (m *BeaconBlockResponse) Reset() { *m = BeaconBlockResponse{} }
func (m *BeaconBlockResponse) String() string { return proto.CompactTextString(m) }
func (*BeaconBlockResponse) ProtoMessage() {}
func (*BeaconBlockResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{3}
return fileDescriptor_messages_290630aaea57f115, []int{3}
}
func (m *BeaconBlockResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeaconBlockResponse.Unmarshal(m, b)
@@ -239,7 +239,7 @@ func (m *BeaconBlock) Reset() { *m = BeaconBlock{} }
func (m *BeaconBlock) String() string { return proto.CompactTextString(m) }
func (*BeaconBlock) ProtoMessage() {}
func (*BeaconBlock) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{4}
return fileDescriptor_messages_290630aaea57f115, []int{4}
}
func (m *BeaconBlock) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeaconBlock.Unmarshal(m, b)
@@ -326,7 +326,7 @@ func (m *CrystallizedStateHashAnnounce) Reset() { *m = CrystallizedState
func (m *CrystallizedStateHashAnnounce) String() string { return proto.CompactTextString(m) }
func (*CrystallizedStateHashAnnounce) ProtoMessage() {}
func (*CrystallizedStateHashAnnounce) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{5}
return fileDescriptor_messages_290630aaea57f115, []int{5}
}
func (m *CrystallizedStateHashAnnounce) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CrystallizedStateHashAnnounce.Unmarshal(m, b)
@@ -364,7 +364,7 @@ func (m *CrystallizedStateRequest) Reset() { *m = CrystallizedStateReque
func (m *CrystallizedStateRequest) String() string { return proto.CompactTextString(m) }
func (*CrystallizedStateRequest) ProtoMessage() {}
func (*CrystallizedStateRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{6}
return fileDescriptor_messages_290630aaea57f115, []int{6}
}
func (m *CrystallizedStateRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CrystallizedStateRequest.Unmarshal(m, b)
@@ -402,7 +402,7 @@ func (m *CrystallizedStateResponse) Reset() { *m = CrystallizedStateResp
func (m *CrystallizedStateResponse) String() string { return proto.CompactTextString(m) }
func (*CrystallizedStateResponse) ProtoMessage() {}
func (*CrystallizedStateResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{7}
return fileDescriptor_messages_290630aaea57f115, []int{7}
}
func (m *CrystallizedStateResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CrystallizedStateResponse.Unmarshal(m, b)
@@ -451,7 +451,7 @@ func (m *CrystallizedState) Reset() { *m = CrystallizedState{} }
func (m *CrystallizedState) String() string { return proto.CompactTextString(m) }
func (*CrystallizedState) ProtoMessage() {}
func (*CrystallizedState) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{8}
return fileDescriptor_messages_290630aaea57f115, []int{8}
}
func (m *CrystallizedState) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CrystallizedState.Unmarshal(m, b)
@@ -566,7 +566,7 @@ func (m *ShardAndCommitteeArray) Reset() { *m = ShardAndCommitteeArray{}
func (m *ShardAndCommitteeArray) String() string { return proto.CompactTextString(m) }
func (*ShardAndCommitteeArray) ProtoMessage() {}
func (*ShardAndCommitteeArray) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{9}
return fileDescriptor_messages_290630aaea57f115, []int{9}
}
func (m *ShardAndCommitteeArray) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShardAndCommitteeArray.Unmarshal(m, b)
@@ -604,7 +604,7 @@ func (m *ActiveStateHashAnnounce) Reset() { *m = ActiveStateHashAnnounce
func (m *ActiveStateHashAnnounce) String() string { return proto.CompactTextString(m) }
func (*ActiveStateHashAnnounce) ProtoMessage() {}
func (*ActiveStateHashAnnounce) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{10}
return fileDescriptor_messages_290630aaea57f115, []int{10}
}
func (m *ActiveStateHashAnnounce) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ActiveStateHashAnnounce.Unmarshal(m, b)
@@ -642,7 +642,7 @@ func (m *ActiveStateRequest) Reset() { *m = ActiveStateRequest{} }
func (m *ActiveStateRequest) String() string { return proto.CompactTextString(m) }
func (*ActiveStateRequest) ProtoMessage() {}
func (*ActiveStateRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{11}
return fileDescriptor_messages_290630aaea57f115, []int{11}
}
func (m *ActiveStateRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ActiveStateRequest.Unmarshal(m, b)
@@ -681,7 +681,7 @@ func (m *ShardAndCommittee) Reset() { *m = ShardAndCommittee{} }
func (m *ShardAndCommittee) String() string { return proto.CompactTextString(m) }
func (*ShardAndCommittee) ProtoMessage() {}
func (*ShardAndCommittee) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{12}
return fileDescriptor_messages_290630aaea57f115, []int{12}
}
func (m *ShardAndCommittee) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShardAndCommittee.Unmarshal(m, b)
@@ -726,7 +726,7 @@ func (m *ActiveStateResponse) Reset() { *m = ActiveStateResponse{} }
func (m *ActiveStateResponse) String() string { return proto.CompactTextString(m) }
func (*ActiveStateResponse) ProtoMessage() {}
func (*ActiveStateResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{13}
return fileDescriptor_messages_290630aaea57f115, []int{13}
}
func (m *ActiveStateResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ActiveStateResponse.Unmarshal(m, b)
@@ -765,7 +765,7 @@ func (m *ActiveState) Reset() { *m = ActiveState{} }
func (m *ActiveState) String() string { return proto.CompactTextString(m) }
func (*ActiveState) ProtoMessage() {}
func (*ActiveState) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{14}
return fileDescriptor_messages_290630aaea57f115, []int{14}
}
func (m *ActiveState) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ActiveState.Unmarshal(m, b)
@@ -816,7 +816,7 @@ func (m *ValidatorRecord) Reset() { *m = ValidatorRecord{} }
func (m *ValidatorRecord) String() string { return proto.CompactTextString(m) }
func (*ValidatorRecord) ProtoMessage() {}
func (*ValidatorRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{15}
return fileDescriptor_messages_290630aaea57f115, []int{15}
}
func (m *ValidatorRecord) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ValidatorRecord.Unmarshal(m, b)
@@ -903,7 +903,7 @@ func (m *AttestationRecord) Reset() { *m = AttestationRecord{} }
func (m *AttestationRecord) String() string { return proto.CompactTextString(m) }
func (*AttestationRecord) ProtoMessage() {}
func (*AttestationRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{16}
return fileDescriptor_messages_290630aaea57f115, []int{16}
}
func (m *AttestationRecord) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AttestationRecord.Unmarshal(m, b)
@@ -992,7 +992,7 @@ func (m *CrosslinkRecord) Reset() { *m = CrosslinkRecord{} }
func (m *CrosslinkRecord) String() string { return proto.CompactTextString(m) }
func (*CrosslinkRecord) ProtoMessage() {}
func (*CrosslinkRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_de8ea270ba5b06e0, []int{17}
return fileDescriptor_messages_290630aaea57f115, []int{17}
}
func (m *CrosslinkRecord) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CrosslinkRecord.Unmarshal(m, b)
@@ -1033,6 +1033,44 @@ func (m *CrosslinkRecord) GetSlot() uint64 {
return 0
}
type AttestationHashes struct {
AttestationHash [][]byte `protobuf:"bytes,1,rep,name=attestation_hash,json=attestationHash,proto3" json:"attestation_hash,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *AttestationHashes) Reset() { *m = AttestationHashes{} }
func (m *AttestationHashes) String() string { return proto.CompactTextString(m) }
func (*AttestationHashes) ProtoMessage() {}
func (*AttestationHashes) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_290630aaea57f115, []int{18}
}
func (m *AttestationHashes) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AttestationHashes.Unmarshal(m, b)
}
func (m *AttestationHashes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_AttestationHashes.Marshal(b, m, deterministic)
}
func (dst *AttestationHashes) XXX_Merge(src proto.Message) {
xxx_messageInfo_AttestationHashes.Merge(dst, src)
}
func (m *AttestationHashes) XXX_Size() int {
return xxx_messageInfo_AttestationHashes.Size(m)
}
func (m *AttestationHashes) XXX_DiscardUnknown() {
xxx_messageInfo_AttestationHashes.DiscardUnknown(m)
}
var xxx_messageInfo_AttestationHashes proto.InternalMessageInfo
func (m *AttestationHashes) GetAttestationHash() [][]byte {
if m != nil {
return m.AttestationHash
}
return nil
}
func init() {
proto.RegisterType((*BeaconBlockHashAnnounce)(nil), "ethereum.beacon.p2p.v1.BeaconBlockHashAnnounce")
proto.RegisterType((*BeaconBlockRequest)(nil), "ethereum.beacon.p2p.v1.BeaconBlockRequest")
@@ -1052,93 +1090,96 @@ func init() {
proto.RegisterType((*ValidatorRecord)(nil), "ethereum.beacon.p2p.v1.ValidatorRecord")
proto.RegisterType((*AttestationRecord)(nil), "ethereum.beacon.p2p.v1.AttestationRecord")
proto.RegisterType((*CrosslinkRecord)(nil), "ethereum.beacon.p2p.v1.CrosslinkRecord")
proto.RegisterType((*AttestationHashes)(nil), "ethereum.beacon.p2p.v1.AttestationHashes")
proto.RegisterEnum("ethereum.beacon.p2p.v1.Topic", Topic_name, Topic_value)
}
func init() { proto.RegisterFile("messages.proto", fileDescriptor_messages_de8ea270ba5b06e0) }
func init() { proto.RegisterFile("messages.proto", fileDescriptor_messages_290630aaea57f115) }
var fileDescriptor_messages_de8ea270ba5b06e0 = []byte{
// 1308 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x5f, 0x73, 0xd3, 0x46,
0x10, 0x6f, 0x1c, 0x87, 0x24, 0x6b, 0x27, 0xb6, 0x2f, 0x21, 0x28, 0xb4, 0x90, 0xd4, 0x94, 0x21,
0xc0, 0x60, 0xda, 0x30, 0xed, 0xd0, 0x47, 0xdb, 0x98, 0x42, 0x09, 0x4e, 0x2a, 0x39, 0xb4, 0x30,
0x65, 0x34, 0x67, 0x69, 0x6d, 0x8b, 0xc8, 0x3a, 0x73, 0x77, 0x4e, 0xc6, 0x7d, 0xe8, 0x5b, 0x3f,
0x43, 0x1f, 0xfa, 0x09, 0xfa, 0x59, 0x3a, 0xd3, 0xcf, 0xd4, 0xb9, 0xd3, 0x59, 0x96, 0xff, 0x24,
0x4c, 0xdf, 0xa4, 0xdf, 0xef, 0xb7, 0x7b, 0xbb, 0xb7, 0x7b, 0x7b, 0x07, 0x9b, 0x7d, 0x14, 0x82,
0x76, 0x51, 0x54, 0x06, 0x9c, 0x49, 0x46, 0x76, 0x50, 0xf6, 0x90, 0xe3, 0xb0, 0x5f, 0x69, 0x23,
0xf5, 0x58, 0x54, 0x19, 0x1c, 0x0e, 0x2a, 0xe7, 0xdf, 0xdc, 0xdc, 0xeb, 0x32, 0xd6, 0x0d, 0xf1,
0xb1, 0x56, 0xb5, 0x87, 0x9d, 0xc7, 0x32, 0xe8, 0xa3, 0x90, 0xb4, 0x3f, 0x88, 0x0d, 0xcb, 0x8f,
0xe0, 0x46, 0x4d, 0x5b, 0xd4, 0x42, 0xe6, 0x9d, 0xbd, 0xa0, 0xa2, 0x57, 0x8d, 0x22, 0x36, 0x8c,
0x3c, 0x24, 0x04, 0xb2, 0x3d, 0x2a, 0x7a, 0xd6, 0xd2, 0xfe, 0xd2, 0x41, 0xde, 0xd6, 0xdf, 0xe5,
0x03, 0x20, 0x29, 0xb9, 0x8d, 0x1f, 0x87, 0x28, 0xe4, 0x42, 0x65, 0x15, 0x6e, 0xcf, 0x2b, 0x6b,
0x23, 0x27, 0x64, 0xb2, 0x39, 0xec, 0xb7, 0x91, 0x93, 0x3d, 0xc8, 0x89, 0x90, 0x49, 0x37, 0xd2,
0xbf, 0xda, 0x38, 0x6b, 0x83, 0x48, 0x04, 0xe5, 0x13, 0xd8, 0x9a, 0x72, 0x21, 0x06, 0x2c, 0x12,
0x48, 0xbe, 0x87, 0x95, 0xb6, 0x02, 0xb4, 0x45, 0xee, 0xf0, 0x4e, 0x65, 0x71, 0xee, 0x95, 0xb4,
0x6d, 0x6c, 0x51, 0xfe, 0x63, 0x19, 0x72, 0x29, 0x58, 0x85, 0x30, 0xa0, 0x1c, 0x23, 0xe9, 0xa6,
0xe2, 0x87, 0x18, 0x52, 0x7b, 0x31, 0x1b, 0x63, 0x66, 0x36, 0x46, 0x72, 0x07, 0x36, 0x38, 0x8d,
0x7c, 0xca, 0x5c, 0x8e, 0xe7, 0x48, 0x43, 0x6b, 0x59, 0xfb, 0xc8, 0xc7, 0xa0, 0xad, 0x31, 0x52,
0x86, 0x8d, 0x01, 0xbb, 0x70, 0xbd, 0x1e, 0x0d, 0x22, 0x97, 0x63, 0xc7, 0xca, 0x6a, 0x51, 0x6e,
0xc0, 0x2e, 0xea, 0x0a, 0xb3, 0xb1, 0x43, 0x1e, 0x40, 0x89, 0x7a, 0x32, 0x38, 0x47, 0x57, 0x48,
0x2a, 0x31, 0x0e, 0x68, 0x45, 0xeb, 0x0a, 0x31, 0xe1, 0x28, 0x5c, 0x47, 0xf5, 0x1d, 0xdc, 0xf0,
0xf8, 0x48, 0x48, 0x1a, 0x86, 0xc1, 0x6f, 0xe8, 0xa7, 0x2d, 0xae, 0x69, 0x8b, 0xeb, 0x69, 0x7a,
0x62, 0xf7, 0x14, 0xd6, 0x93, 0xfa, 0x5b, 0xab, 0x7a, 0xf7, 0x6e, 0x56, 0xe2, 0x0e, 0xa9, 0x8c,
0x3b, 0xa4, 0xd2, 0x1a, 0x2b, 0xec, 0x89, 0x98, 0xbc, 0x86, 0x3c, 0x95, 0x52, 0xfd, 0xc8, 0x80,
0x45, 0xc2, 0x5a, 0xdb, 0x5f, 0x3e, 0xc8, 0x1d, 0xde, 0xbf, 0x6c, 0xeb, 0xab, 0x13, 0xad, 0x8d,
0x1e, 0xe3, 0xbe, 0x3d, 0x65, 0x5e, 0x7e, 0x02, 0xb7, 0xea, 0x8b, 0x22, 0xbc, 0xb2, 0xf7, 0x2a,
0x60, 0xcd, 0x19, 0x5d, 0xd5, 0x81, 0x43, 0xd8, 0x5d, 0xa0, 0x37, 0x4d, 0xf4, 0x0b, 0x90, 0xf9,
0x2d, 0x34, 0x1d, 0x75, 0x69, 0x5a, 0xf3, 0xee, 0x4a, 0x73, 0x1b, 0x5d, 0xfe, 0x7b, 0x05, 0x4a,
0x73, 0x42, 0x55, 0xde, 0x90, 0x0a, 0x69, 0x4a, 0xc5, 0xd1, 0xa3, 0xa1, 0x67, 0x5a, 0xbe, 0xa0,
0x08, 0x13, 0x9d, 0x82, 0xc9, 0x7d, 0x28, 0x7e, 0x18, 0x0a, 0x19, 0x74, 0x02, 0x1d, 0x18, 0x47,
0x7a, 0x66, 0x3a, 0xaf, 0x90, 0xe0, 0x8e, 0x86, 0x49, 0x05, 0xb6, 0xb4, 0xdb, 0x94, 0x3e, 0x64,
0x52, 0x37, 0x61, 0xd6, 0xd6, 0x2b, 0xfe, 0x98, 0x58, 0x84, 0x4c, 0x26, 0xfa, 0x4e, 0x10, 0x51,
0x93, 0xb8, 0xd2, 0x67, 0x27, 0xfa, 0xe7, 0x63, 0x46, 0xeb, 0xef, 0x41, 0xc1, 0x1b, 0x72, 0x7d,
0x42, 0xfc, 0x51, 0x44, 0x85, 0x1c, 0xe9, 0x9e, 0xcc, 0xda, 0x9b, 0x06, 0x7e, 0x16, 0xa3, 0xe4,
0x29, 0x58, 0x1e, 0x67, 0x42, 0x84, 0x41, 0x74, 0x16, 0x44, 0x5d, 0x95, 0x27, 0x97, 0xae, 0xe8,
0x51, 0xee, 0xeb, 0x9e, 0xcc, 0xda, 0x3b, 0x69, 0xde, 0x51, 0xb4, 0xa3, 0x58, 0x72, 0x17, 0x36,
0x25, 0x93, 0x34, 0x74, 0x7d, 0x1c, 0x30, 0x11, 0x48, 0xa1, 0x3b, 0x33, 0x6b, 0x6f, 0x68, 0xf4,
0x99, 0x01, 0xc9, 0x97, 0x90, 0x37, 0x11, 0xb8, 0x02, 0xd1, 0xb7, 0xd6, 0xe2, 0x23, 0x64, 0x30,
0x07, 0xd1, 0x27, 0xdf, 0xc2, 0x8d, 0xb4, 0xc4, 0xd5, 0x99, 0x72, 0x14, 0x28, 0xad, 0x75, 0xed,
0x72, 0x3b, 0xa5, 0x3e, 0xa2, 0x42, 0xda, 0x8a, 0x23, 0x2d, 0x28, 0x25, 0xa1, 0xa9, 0xca, 0x30,
0xee, 0x0b, 0x0b, 0x74, 0x83, 0xdf, 0xbb, 0xbc, 0x13, 0x8c, 0x81, 0x69, 0xef, 0xa2, 0x37, 0x0d,
0x08, 0xf2, 0x03, 0xc0, 0x39, 0x0d, 0x03, 0x9f, 0x4a, 0xc6, 0x85, 0x95, 0xbb, 0xda, 0xdd, 0x9b,
0xb1, 0xd2, 0xb8, 0x4b, 0x99, 0x92, 0x77, 0x50, 0x0a, 0x22, 0x3f, 0xf0, 0x50, 0xb8, 0x1d, 0xc6,
0x75, 0xbd, 0x84, 0x95, 0xd7, 0xfe, 0x2a, 0x97, 0xf9, 0xd3, 0x3b, 0x5b, 0x8d, 0xfc, 0x3a, 0xeb,
0xf7, 0x03, 0x29, 0x11, 0xab, 0x9c, 0xd3, 0x91, 0x5d, 0x30, 0x8e, 0x9e, 0x33, 0xae, 0xaa, 0x2b,
0xca, 0xbf, 0xc3, 0xce, 0x62, 0x29, 0xf1, 0x61, 0x97, 0xaa, 0x8f, 0xb8, 0x84, 0x2e, 0x8d, 0x7c,
0xd7, 0x1b, 0x2b, 0xac, 0xa5, 0xab, 0x4f, 0xff, 0x9c, 0x4b, 0x7b, 0x47, 0xfb, 0x9a, 0xc3, 0xd5,
0xed, 0x53, 0x9d, 0x9e, 0x6d, 0x9f, 0xba, 0x7d, 0x52, 0xf2, 0xab, 0xce, 0xfe, 0x11, 0x94, 0xe6,
0x56, 0x23, 0xbb, 0xb0, 0x16, 0x67, 0x13, 0xf8, 0xe6, 0xe8, 0xad, 0xea, 0xff, 0x97, 0x3e, 0xf9,
0x02, 0xd6, 0x27, 0xe9, 0x65, 0xf6, 0x97, 0x0f, 0x36, 0xec, 0x09, 0x50, 0x7e, 0x0f, 0x5b, 0x53,
0xeb, 0x9a, 0x19, 0xf2, 0x1c, 0xf2, 0xe9, 0x91, 0xfd, 0xa9, 0xfb, 0x28, 0xed, 0x22, 0x97, 0x1a,
0xe9, 0xe5, 0xbf, 0x96, 0x20, 0x97, 0x22, 0xc9, 0xaf, 0xb0, 0x3d, 0xc0, 0xc8, 0x57, 0xc7, 0x68,
0x6a, 0xe8, 0x2e, 0xfd, 0xdf, 0xa1, 0xbb, 0x65, 0xdc, 0xa4, 0x18, 0xa1, 0x46, 0x00, 0x47, 0x4f,
0x9d, 0x68, 0x7d, 0x27, 0xea, 0x6b, 0x03, 0x85, 0x4e, 0x3a, 0x6f, 0x97, 0x62, 0x2a, 0x79, 0x0c,
0xa0, 0x28, 0xff, 0x99, 0x81, 0xc2, 0x4c, 0x7f, 0x92, 0x5b, 0x00, 0x83, 0x61, 0x3b, 0x0c, 0x3c,
0xf7, 0x0c, 0x47, 0x66, 0x2f, 0xd7, 0x63, 0xe4, 0x15, 0x8e, 0xd4, 0x00, 0xbb, 0x08, 0x64, 0xcf,
0xe7, 0xf4, 0x82, 0x86, 0x66, 0x08, 0x98, 0x01, 0x36, 0xc1, 0xe3, 0xd3, 0xff, 0x08, 0x48, 0x4a,
0x4a, 0x7d, 0x9f, 0xa3, 0x10, 0xe6, 0x12, 0x2d, 0x4d, 0x98, 0x6a, 0x4c, 0x90, 0x87, 0x50, 0x32,
0xd7, 0x6d, 0x5c, 0x9d, 0x3e, 0x46, 0xd2, 0xdc, 0xa6, 0xc5, 0x98, 0xa8, 0x27, 0x38, 0xb1, 0x60,
0xb5, 0x4d, 0x43, 0x1a, 0x79, 0x68, 0x86, 0xd6, 0xf8, 0x57, 0xdd, 0xda, 0xf1, 0x80, 0x1a, 0x0f,
0xb5, 0x78, 0x44, 0xe5, 0x35, 0x38, 0x1e, 0x69, 0x7b, 0x90, 0xc3, 0xc8, 0x4f, 0x24, 0xf1, 0x54,
0x02, 0x8c, 0x7c, 0x23, 0x28, 0xff, 0x93, 0x81, 0xd2, 0xdc, 0xa6, 0xab, 0x76, 0xd4, 0x33, 0x35,
0xde, 0x15, 0xfd, 0x3d, 0xd5, 0x79, 0x99, 0xe9, 0xce, 0xbb, 0x0b, 0x9b, 0x0b, 0x87, 0xf7, 0xc6,
0x87, 0xa9, 0xc1, 0xfd, 0x35, 0x6c, 0x4f, 0x64, 0x93, 0xc2, 0x99, 0xdc, 0x49, 0xc2, 0x25, 0x95,
0x23, 0x07, 0x50, 0x8c, 0xd7, 0x4c, 0xa9, 0xe3, 0xf7, 0xc4, 0xa6, 0xc6, 0x27, 0xca, 0x87, 0x50,
0x8a, 0xfb, 0x0c, 0xb9, 0xdb, 0x0e, 0x64, 0x27, 0xc0, 0xd0, 0x37, 0x0f, 0x89, 0xe2, 0x98, 0xa8,
0x19, 0x9c, 0x1c, 0xc2, 0x75, 0xd6, 0x0e, 0x83, 0x8f, 0x43, 0x74, 0x53, 0x4f, 0x27, 0x54, 0x53,
0x5b, 0x35, 0xd0, 0x96, 0x21, 0x4f, 0x92, 0x37, 0x14, 0x0a, 0xb5, 0xdd, 0xb4, 0xdb, 0xe5, 0xd8,
0x55, 0x77, 0x9f, 0x08, 0xba, 0xfa, 0xf9, 0x90, 0xb5, 0xf3, 0x09, 0xe8, 0x04, 0xdd, 0xf2, 0x7b,
0x28, 0xcc, 0x4c, 0x55, 0x55, 0xc0, 0xf1, 0xee, 0x9b, 0xf3, 0x6a, 0x7e, 0xd5, 0x79, 0xd5, 0x69,
0xe9, 0xac, 0x32, 0x3a, 0xd4, 0x09, 0x90, 0x94, 0x60, 0x79, 0x52, 0x82, 0x07, 0xff, 0x66, 0x60,
0xa5, 0xc5, 0x06, 0x81, 0x47, 0x72, 0xb0, 0x7a, 0xda, 0x7c, 0xd5, 0x3c, 0xfe, 0xb9, 0x59, 0xfc,
0x8c, 0xdc, 0x86, 0x9b, 0xb5, 0x46, 0xb5, 0x7e, 0xdc, 0x74, 0x6b, 0x47, 0xc7, 0xf5, 0x57, 0xee,
0x8b, 0xaa, 0xf3, 0xc2, 0xad, 0x36, 0x9b, 0xc7, 0xa7, 0xcd, 0x7a, 0xa3, 0xb8, 0x44, 0x2c, 0xd8,
0x9e, 0xe2, 0xed, 0xc6, 0x4f, 0xa7, 0x0d, 0xa7, 0x55, 0xcc, 0x90, 0x7b, 0x70, 0x67, 0x11, 0xe3,
0xd6, 0xde, 0xba, 0xce, 0xd1, 0x71, 0xcb, 0x6d, 0x9e, 0xbe, 0xae, 0x35, 0xec, 0xe2, 0x32, 0xd9,
0x85, 0xeb, 0x33, 0x42, 0xe7, 0xe4, 0xb8, 0xe9, 0x34, 0x8a, 0x59, 0xf2, 0x15, 0xec, 0xd7, 0xed,
0xb7, 0x4e, 0xab, 0x7a, 0x74, 0xf4, 0xf2, 0x5d, 0xe3, 0x99, 0xeb, 0xb4, 0xaa, 0xad, 0xc6, 0x4c,
0x0c, 0x2b, 0x2a, 0xc6, 0x05, 0xaa, 0x71, 0x24, 0xd7, 0xc8, 0x1e, 0x7c, 0xbe, 0x90, 0x37, 0xcb,
0xac, 0x2a, 0x07, 0xd5, 0x7a, 0xeb, 0xe5, 0x9b, 0xc6, 0xc2, 0x05, 0xd6, 0x54, 0x92, 0x53, 0xfc,
0xd8, 0xf5, 0xba, 0x8a, 0x7d, 0x86, 0x31, 0x4e, 0xa1, 0x7d, 0x4d, 0xbf, 0x18, 0x9f, 0xfc, 0x17,
0x00, 0x00, 0xff, 0xff, 0x78, 0x29, 0xd6, 0xdd, 0x8b, 0x0c, 0x00, 0x00,
var fileDescriptor_messages_290630aaea57f115 = []byte{
// 1331 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xdd, 0x72, 0x13, 0xc7,
0x12, 0x3e, 0x96, 0x64, 0x6c, 0xb7, 0x64, 0x4b, 0x1a, 0x1b, 0xb3, 0xe6, 0x1c, 0xb0, 0xcf, 0x72,
0x28, 0x0c, 0x14, 0xe2, 0xc4, 0x54, 0x52, 0xe4, 0x26, 0x55, 0x92, 0x10, 0x81, 0x60, 0x64, 0xb2,
0x2b, 0x93, 0x40, 0x85, 0xda, 0x1a, 0xed, 0x8e, 0xa4, 0xc5, 0xab, 0x1d, 0x31, 0x33, 0xb2, 0x4b,
0xb9, 0xc8, 0x5d, 0x9e, 0x21, 0x17, 0x79, 0x82, 0x3c, 0x4b, 0xaa, 0xf2, 0x4c, 0xa9, 0x99, 0x9d,
0xfd, 0x93, 0x64, 0x53, 0xb9, 0xdb, 0xfd, 0xbe, 0xaf, 0x7b, 0xba, 0xa7, 0x7b, 0x7a, 0x06, 0xb6,
0xc6, 0x84, 0x73, 0x3c, 0x24, 0xbc, 0x31, 0x61, 0x54, 0x50, 0xb4, 0x4b, 0xc4, 0x88, 0x30, 0x32,
0x1d, 0x37, 0xfa, 0x04, 0xbb, 0x34, 0x6c, 0x4c, 0x8e, 0x26, 0x8d, 0xf3, 0x2f, 0x6e, 0xee, 0x0f,
0x29, 0x1d, 0x06, 0xe4, 0xb1, 0x52, 0xf5, 0xa7, 0x83, 0xc7, 0xc2, 0x1f, 0x13, 0x2e, 0xf0, 0x78,
0x12, 0x19, 0x9a, 0x8f, 0xe0, 0x46, 0x4b, 0x59, 0xb4, 0x02, 0xea, 0x9e, 0xbd, 0xc0, 0x7c, 0xd4,
0x0c, 0x43, 0x3a, 0x0d, 0x5d, 0x82, 0x10, 0x94, 0x46, 0x98, 0x8f, 0x8c, 0x95, 0x83, 0x95, 0xc3,
0x8a, 0xa5, 0xbe, 0xcd, 0x43, 0x40, 0x19, 0xb9, 0x45, 0x3e, 0x4d, 0x09, 0x17, 0x4b, 0x95, 0x4d,
0xb8, 0xbd, 0xa8, 0x6c, 0xcd, 0xec, 0x80, 0x8a, 0xee, 0x74, 0xdc, 0x27, 0x0c, 0xed, 0x43, 0x99,
0x07, 0x54, 0x38, 0xa1, 0xfa, 0x55, 0xc6, 0x25, 0x0b, 0x78, 0x22, 0x30, 0xdf, 0xc0, 0x76, 0xce,
0x05, 0x9f, 0xd0, 0x90, 0x13, 0xf4, 0x35, 0xac, 0xf6, 0x25, 0xa0, 0x2c, 0xca, 0x47, 0x77, 0x1a,
0xcb, 0x73, 0x6f, 0x64, 0x6d, 0x23, 0x0b, 0xf3, 0xd7, 0x22, 0x94, 0x33, 0xb0, 0x0c, 0x61, 0x82,
0x19, 0x09, 0x85, 0x93, 0x89, 0x1f, 0x22, 0x48, 0xee, 0xc5, 0x7c, 0x8c, 0x85, 0xf9, 0x18, 0xd1,
0x1d, 0xd8, 0x64, 0x38, 0xf4, 0x30, 0x75, 0x18, 0x39, 0x27, 0x38, 0x30, 0x8a, 0xca, 0x47, 0x25,
0x02, 0x2d, 0x85, 0x21, 0x13, 0x36, 0x27, 0xf4, 0xc2, 0x71, 0x47, 0xd8, 0x0f, 0x1d, 0x46, 0x06,
0x46, 0x49, 0x89, 0xca, 0x13, 0x7a, 0xd1, 0x96, 0x98, 0x45, 0x06, 0xe8, 0x01, 0xd4, 0xb1, 0x2b,
0xfc, 0x73, 0xe2, 0x70, 0x81, 0x05, 0x89, 0x02, 0x5a, 0x55, 0xba, 0x6a, 0x44, 0xd8, 0x12, 0x57,
0x51, 0x7d, 0x05, 0x37, 0x5c, 0x36, 0xe3, 0x02, 0x07, 0x81, 0xff, 0x33, 0xf1, 0xb2, 0x16, 0xd7,
0x94, 0xc5, 0xf5, 0x2c, 0x9d, 0xda, 0x3d, 0x85, 0x8d, 0xa4, 0xfe, 0xc6, 0x9a, 0xda, 0xbd, 0x9b,
0x8d, 0xa8, 0x43, 0x1a, 0x71, 0x87, 0x34, 0x7a, 0xb1, 0xc2, 0x4a, 0xc5, 0xe8, 0x35, 0x54, 0xb0,
0x10, 0xf2, 0x47, 0xf8, 0x34, 0xe4, 0xc6, 0xfa, 0x41, 0xf1, 0xb0, 0x7c, 0x74, 0xff, 0xb2, 0xad,
0x6f, 0xa6, 0x5a, 0x8b, 0xb8, 0x94, 0x79, 0x56, 0xce, 0xdc, 0x7c, 0x02, 0xb7, 0xda, 0xcb, 0x22,
0xbc, 0xb2, 0xf7, 0x1a, 0x60, 0x2c, 0x18, 0x5d, 0xd5, 0x81, 0x53, 0xd8, 0x5b, 0xa2, 0xd7, 0x4d,
0xf4, 0x23, 0xa0, 0xc5, 0x2d, 0xd4, 0x1d, 0x75, 0x69, 0x5a, 0x8b, 0xee, 0xea, 0x0b, 0x1b, 0x6d,
0xfe, 0xb1, 0x0a, 0xf5, 0x05, 0xa1, 0x2c, 0x6f, 0x80, 0xb9, 0xd0, 0xa5, 0x62, 0xc4, 0xc5, 0x81,
0xab, 0x5b, 0xbe, 0x2a, 0x09, 0x1d, 0x9d, 0x84, 0xd1, 0x7d, 0xa8, 0x7d, 0x9c, 0x72, 0xe1, 0x0f,
0x7c, 0x15, 0x18, 0x23, 0xf8, 0x4c, 0x77, 0x5e, 0x35, 0xc1, 0x6d, 0x05, 0xa3, 0x06, 0x6c, 0x2b,
0xb7, 0x19, 0x7d, 0x40, 0x85, 0x6a, 0xc2, 0x92, 0xa5, 0x56, 0xfc, 0x2e, 0xb1, 0x08, 0xa8, 0x48,
0xf4, 0x03, 0x3f, 0xc4, 0x3a, 0x71, 0xa9, 0x2f, 0xa5, 0xfa, 0xe7, 0x31, 0xa3, 0xf4, 0xf7, 0xa0,
0xea, 0x4e, 0x99, 0x3a, 0x21, 0xde, 0x2c, 0xc4, 0x5c, 0xcc, 0x54, 0x4f, 0x96, 0xac, 0x2d, 0x0d,
0x3f, 0x8b, 0x50, 0xf4, 0x14, 0x0c, 0x97, 0x51, 0xce, 0x03, 0x3f, 0x3c, 0xf3, 0xc3, 0xa1, 0xcc,
0x93, 0x09, 0x87, 0x8f, 0x30, 0xf3, 0x54, 0x4f, 0x96, 0xac, 0xdd, 0x2c, 0x6f, 0x4b, 0xda, 0x96,
0x2c, 0xba, 0x0b, 0x5b, 0x82, 0x0a, 0x1c, 0x38, 0x1e, 0x99, 0x50, 0xee, 0x0b, 0xae, 0x3a, 0xb3,
0x64, 0x6d, 0x2a, 0xf4, 0x99, 0x06, 0xd1, 0x7f, 0xa1, 0xa2, 0x23, 0x70, 0x38, 0x21, 0x9e, 0xb1,
0x1e, 0x1d, 0x21, 0x8d, 0xd9, 0x84, 0x78, 0xe8, 0x4b, 0xb8, 0x91, 0x95, 0x38, 0x2a, 0x53, 0x46,
0x38, 0x11, 0xc6, 0x86, 0x72, 0xb9, 0x93, 0x51, 0x1f, 0x63, 0x2e, 0x2c, 0xc9, 0xa1, 0x1e, 0xd4,
0x93, 0xd0, 0x64, 0x65, 0x28, 0xf3, 0xb8, 0x01, 0xaa, 0xc1, 0xef, 0x5d, 0xde, 0x09, 0xda, 0x40,
0xb7, 0x77, 0xcd, 0xcd, 0x03, 0x1c, 0x7d, 0x0b, 0x70, 0x8e, 0x03, 0xdf, 0xc3, 0x82, 0x32, 0x6e,
0x94, 0xaf, 0x76, 0xf7, 0x36, 0x56, 0x6a, 0x77, 0x19, 0x53, 0xf4, 0x1e, 0xea, 0x7e, 0xe8, 0xf9,
0x2e, 0xe1, 0xce, 0x80, 0x32, 0x55, 0x2f, 0x6e, 0x54, 0x94, 0xbf, 0xc6, 0x65, 0xfe, 0xd4, 0xce,
0x36, 0x43, 0xaf, 0x4d, 0xc7, 0x63, 0x5f, 0x08, 0x42, 0x9a, 0x8c, 0xe1, 0x99, 0x55, 0xd5, 0x8e,
0x9e, 0x53, 0x26, 0xab, 0xcb, 0xcd, 0x5f, 0x60, 0x77, 0xb9, 0x14, 0x79, 0xb0, 0x87, 0xe5, 0x47,
0x54, 0x42, 0x07, 0x87, 0x9e, 0xe3, 0xc6, 0x0a, 0x63, 0xe5, 0xea, 0xd3, 0xbf, 0xe0, 0xd2, 0xda,
0x55, 0xbe, 0x16, 0x70, 0x79, 0xfb, 0x34, 0xf3, 0xb3, 0xed, 0x73, 0xb7, 0x4f, 0x46, 0x7e, 0xd5,
0xd9, 0x3f, 0x86, 0xfa, 0xc2, 0x6a, 0x68, 0x0f, 0xd6, 0xa3, 0x6c, 0x7c, 0x4f, 0x1f, 0xbd, 0x35,
0xf5, 0xff, 0xd2, 0x43, 0xff, 0x81, 0x8d, 0x34, 0xbd, 0xc2, 0x41, 0xf1, 0x70, 0xd3, 0x4a, 0x01,
0xf3, 0x03, 0x6c, 0xe7, 0xd6, 0xd5, 0x33, 0xe4, 0x39, 0x54, 0xb2, 0x23, 0xfb, 0x73, 0xf7, 0x51,
0xd6, 0x45, 0x39, 0x33, 0xd2, 0xcd, 0xdf, 0x57, 0xa0, 0x9c, 0x21, 0xd1, 0x4f, 0xb0, 0x33, 0x21,
0xa1, 0x27, 0x8f, 0x51, 0x6e, 0xe8, 0xae, 0xfc, 0xd3, 0xa1, 0xbb, 0xad, 0xdd, 0x64, 0x18, 0x2e,
0x47, 0x00, 0x23, 0xae, 0x3c, 0xd1, 0xea, 0x4e, 0x54, 0xd7, 0x06, 0xe1, 0x2a, 0xe9, 0x8a, 0x55,
0x8f, 0xa8, 0xe4, 0x31, 0x40, 0xb8, 0xf9, 0x5b, 0x01, 0xaa, 0x73, 0xfd, 0x89, 0x6e, 0x01, 0x4c,
0xa6, 0xfd, 0xc0, 0x77, 0x9d, 0x33, 0x32, 0xd3, 0x7b, 0xb9, 0x11, 0x21, 0xaf, 0xc8, 0x4c, 0x0e,
0xb0, 0x0b, 0x5f, 0x8c, 0x3c, 0x86, 0x2f, 0x70, 0xa0, 0x87, 0x80, 0x1e, 0x60, 0x29, 0x1e, 0x9d,
0xfe, 0x47, 0x80, 0x32, 0x52, 0xec, 0x79, 0x8c, 0x70, 0xae, 0x2f, 0xd1, 0x7a, 0xca, 0x34, 0x23,
0x02, 0x3d, 0x84, 0xba, 0xbe, 0x6e, 0xa3, 0xea, 0x8c, 0x49, 0x28, 0xf4, 0x6d, 0x5a, 0x8b, 0x88,
0x76, 0x82, 0x23, 0x03, 0xd6, 0xfa, 0x38, 0xc0, 0xa1, 0x4b, 0xf4, 0xd0, 0x8a, 0x7f, 0xe5, 0xad,
0x1d, 0x0d, 0xa8, 0x78, 0xa8, 0x45, 0x23, 0xaa, 0xa2, 0xc0, 0x78, 0xa4, 0xed, 0x43, 0x99, 0x84,
0x5e, 0x22, 0x89, 0xa6, 0x12, 0x90, 0xd0, 0xd3, 0x02, 0xf3, 0xcf, 0x02, 0xd4, 0x17, 0x36, 0x5d,
0xb6, 0xa3, 0x9a, 0xa9, 0xd1, 0xae, 0xa8, 0xef, 0x5c, 0xe7, 0x15, 0xf2, 0x9d, 0x77, 0x17, 0xb6,
0x96, 0x0e, 0xef, 0xcd, 0x8f, 0xb9, 0xc1, 0xfd, 0x7f, 0xd8, 0x49, 0x65, 0x69, 0xe1, 0x74, 0xee,
0x28, 0xe1, 0x92, 0xca, 0xa1, 0x43, 0xa8, 0x45, 0x6b, 0x66, 0xd4, 0xd1, 0x7b, 0x62, 0x4b, 0xe1,
0xa9, 0xf2, 0x21, 0xd4, 0xa3, 0x3e, 0x23, 0xcc, 0xe9, 0xfb, 0x62, 0xe0, 0x93, 0xc0, 0xd3, 0x0f,
0x89, 0x5a, 0x4c, 0xb4, 0x34, 0x8e, 0x8e, 0xe0, 0x3a, 0xed, 0x07, 0xfe, 0xa7, 0x29, 0x71, 0x32,
0x4f, 0x27, 0x22, 0xa7, 0xb6, 0x6c, 0xa0, 0x6d, 0x4d, 0xbe, 0x49, 0xde, 0x50, 0x84, 0xcb, 0xed,
0xc6, 0xc3, 0x21, 0x23, 0x43, 0x79, 0xf7, 0x71, 0x7f, 0xa8, 0x9e, 0x0f, 0x25, 0xab, 0x92, 0x80,
0xb6, 0x3f, 0x34, 0x3f, 0x40, 0x75, 0x6e, 0xaa, 0xca, 0x02, 0xc6, 0xbb, 0xaf, 0xcf, 0xab, 0xfe,
0x95, 0xe7, 0x55, 0xa5, 0xa5, 0xb2, 0x2a, 0xa8, 0x50, 0x53, 0x20, 0x29, 0x41, 0x31, 0x2d, 0x81,
0xf9, 0x4d, 0xae, 0x56, 0x3a, 0xb0, 0xfb, 0x50, 0xcb, 0x9c, 0xb0, 0xf8, 0x11, 0x58, 0x54, 0x6f,
0xae, 0xbc, 0xf8, 0xc1, 0x5f, 0x05, 0x58, 0xed, 0xd1, 0x89, 0xef, 0xa2, 0x32, 0xac, 0x9d, 0x76,
0x5f, 0x75, 0x4f, 0x7e, 0xe8, 0xd6, 0xfe, 0x85, 0x6e, 0xc3, 0xcd, 0x56, 0xa7, 0xd9, 0x3e, 0xe9,
0x3a, 0xad, 0xe3, 0x93, 0xf6, 0x2b, 0xe7, 0x45, 0xd3, 0x7e, 0xe1, 0x34, 0xbb, 0xdd, 0x93, 0xd3,
0x6e, 0xbb, 0x53, 0x5b, 0x41, 0x06, 0xec, 0xe4, 0x78, 0xab, 0xf3, 0xfd, 0x69, 0xc7, 0xee, 0xd5,
0x0a, 0xe8, 0x1e, 0xdc, 0x59, 0xc6, 0x38, 0xad, 0x77, 0x8e, 0x7d, 0x7c, 0xd2, 0x73, 0xba, 0xa7,
0xaf, 0x5b, 0x1d, 0xab, 0x56, 0x44, 0x7b, 0x70, 0x7d, 0x4e, 0x68, 0xbf, 0x39, 0xe9, 0xda, 0x9d,
0x5a, 0x09, 0xfd, 0x0f, 0x0e, 0xda, 0xd6, 0x3b, 0xbb, 0xd7, 0x3c, 0x3e, 0x7e, 0xf9, 0xbe, 0xf3,
0xcc, 0xb1, 0x7b, 0xcd, 0x5e, 0x67, 0x2e, 0x86, 0x55, 0x19, 0xe3, 0x12, 0x55, 0x1c, 0xc9, 0x35,
0xb4, 0x0f, 0xff, 0x5e, 0xca, 0xeb, 0x65, 0xd6, 0xa4, 0x83, 0x66, 0xbb, 0xf7, 0xf2, 0x6d, 0x67,
0xe9, 0x02, 0xeb, 0x32, 0xc9, 0x1c, 0x1f, 0xbb, 0xde, 0x90, 0xb1, 0xcf, 0x31, 0xda, 0x29, 0xf4,
0xaf, 0xa9, 0x17, 0xe7, 0x93, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x82, 0x79, 0xd1, 0xca, 0xcb,
0x0c, 0x00, 0x00,
}

View File

@@ -124,3 +124,7 @@ message CrosslinkRecord {
bytes blockhash = 2;
uint64 slot = 3;
}
message AttestationHashes {
repeated bytes attestation_hash = 1;
}