Fetch the Correct Chain Head During AttestHead (#1596)

* correct attester view of chain head and prioritize proposer

* fix attempt not working

* revise with correct logic

* attester fixess to root fetching, spec did not make sense

* comments to match code

* fix attester responsibility

* comments
This commit is contained in:
Raul Jordan 2019-02-18 23:49:56 -06:00 committed by GitHub
parent bd7567e200
commit 3e46381b3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 122 additions and 181 deletions

View File

@ -39,13 +39,10 @@ func (as *AttesterServer) AttestHead(ctx context.Context, att *pbp2p.Attestation
func (as *AttesterServer) AttestationInfoAtSlot(ctx context.Context, req *pb.AttestationInfoRequest) (*pb.AttestationInfoResponse, error) {
// Set the attestation data's beacon block root = hash_tree_root(head) where head
// is the validator's view of the head block of the beacon chain during the slot.
head, err := as.beaconDB.BlockBySlot(req.Slot)
head, err := as.beaconDB.ChainHead()
if err != nil {
return nil, fmt.Errorf("failed to retrieve chain head: %v", err)
}
if head == nil {
return nil, fmt.Errorf("no block found at slot %d", req.Slot)
}
blockRoot, err := ssz.TreeHash(head)
if err != nil {
return nil, fmt.Errorf("could not tree hash beacon block: %v", err)

View File

@ -34,30 +34,16 @@ func TestAttestHead(t *testing.T) {
}
}
func TestAttestationInfoAtSlot_NilHeadAtSlot(t *testing.T) {
db := internal.SetupDB(t)
defer internal.TeardownDB(t, db)
attesterServer := &AttesterServer{
beaconDB: db,
}
want := "no block found at slot 5"
req := &pb.AttestationInfoRequest{
Slot: 5,
}
if _, err := attesterServer.AttestationInfoAtSlot(context.Background(), req); !strings.Contains(err.Error(), want) {
t.Errorf("Expected %v, received %v", want, err)
}
}
func TestAttestationInfoAtSlot_EpochBoundaryFailure(t *testing.T) {
db := internal.SetupDB(t)
defer internal.TeardownDB(t, db)
beaconState := &pbp2p.BeaconState{
Slot: 5,
Slot: params.BeaconConfig().GenesisSlot + 3*params.BeaconConfig().GenesisEpoch,
LatestBlockRootHash32S: make([][]byte, 20),
JustifiedEpoch: params.BeaconConfig().GenesisEpoch,
}
block := blocks.NewGenesisBlock([]byte("stateroot"))
block.Slot = 100
block.Slot = params.BeaconConfig().GenesisSlot
attesterServer := &AttesterServer{
beaconDB: db,
}
@ -68,9 +54,7 @@ func TestAttestationInfoAtSlot_EpochBoundaryFailure(t *testing.T) {
t.Fatalf("Could not update chain head in test db: %v", err)
}
want := "could not get epoch boundary block"
req := &pb.AttestationInfoRequest{
Slot: 100,
}
req := &pb.AttestationInfoRequest{}
if _, err := attesterServer.AttestationInfoAtSlot(context.Background(), req); !strings.Contains(err.Error(), want) {
t.Errorf("Expected %v, received %v", want, err)
}
@ -105,9 +89,7 @@ func TestAttestationInfoAtSlot_JustifiedBlockFailure(t *testing.T) {
t.Fatalf("Could not update chain head in test db: %v", err)
}
want := "could not get justified block"
req := &pb.AttestationInfoRequest{
Slot: params.BeaconConfig().GenesisSlot + 1,
}
req := &pb.AttestationInfoRequest{}
if _, err := attesterServer.AttestationInfoAtSlot(context.Background(), req); !strings.Contains(err.Error(), want) {
t.Errorf("Expected %v, received %v", want, err)
}
@ -153,12 +135,6 @@ func TestAttestationInfoAtSlot_Ok(t *testing.T) {
attesterServer := &AttesterServer{
beaconDB: db,
}
if err := attesterServer.beaconDB.SaveBlock(block); err != nil {
t.Fatalf("Could not save block in test db: %v", err)
}
if err := attesterServer.beaconDB.UpdateChainHead(block, beaconState); err != nil {
t.Fatalf("Could not update chain head in test db: %v", err)
}
if err := attesterServer.beaconDB.SaveBlock(epochBoundaryBlock); err != nil {
t.Fatalf("Could not save block in test db: %v", err)
}
@ -171,8 +147,13 @@ func TestAttestationInfoAtSlot_Ok(t *testing.T) {
if err := attesterServer.beaconDB.UpdateChainHead(justifiedBlock, beaconState); err != nil {
t.Fatalf("Could not update chain head in test db: %v", err)
}
if err := attesterServer.beaconDB.SaveBlock(block); err != nil {
t.Fatalf("Could not save block in test db: %v", err)
}
if err := attesterServer.beaconDB.UpdateChainHead(block, beaconState); err != nil {
t.Fatalf("Could not update chain head in test db: %v", err)
}
req := &pb.AttestationInfoRequest{
Slot: 1 + params.BeaconConfig().GenesisSlot,
Shard: 0,
}
res, err := attesterServer.AttestationInfoAtSlot(context.Background(), req)

View File

@ -53,7 +53,7 @@ func (x ValidatorRole) String() string {
return proto.EnumName(ValidatorRole_name, int32(x))
}
func (ValidatorRole) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{0}
return fileDescriptor_services_646990b9daed6402, []int{0}
}
type CommitteeRequest struct {
@ -68,7 +68,7 @@ func (m *CommitteeRequest) Reset() { *m = CommitteeRequest{} }
func (m *CommitteeRequest) String() string { return proto.CompactTextString(m) }
func (*CommitteeRequest) ProtoMessage() {}
func (*CommitteeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{0}
return fileDescriptor_services_646990b9daed6402, []int{0}
}
func (m *CommitteeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -123,7 +123,7 @@ func (m *CommitteeResponse) Reset() { *m = CommitteeResponse{} }
func (m *CommitteeResponse) String() string { return proto.CompactTextString(m) }
func (*CommitteeResponse) ProtoMessage() {}
func (*CommitteeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{1}
return fileDescriptor_services_646990b9daed6402, []int{1}
}
func (m *CommitteeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -167,8 +167,7 @@ func (m *CommitteeResponse) GetShard() uint64 {
}
type AttestationInfoRequest struct {
Slot uint64 `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty"`
Shard uint64 `protobuf:"varint,2,opt,name=shard,proto3" json:"shard,omitempty"`
Shard uint64 `protobuf:"varint,1,opt,name=shard,proto3" json:"shard,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -178,7 +177,7 @@ func (m *AttestationInfoRequest) Reset() { *m = AttestationInfoRequest{}
func (m *AttestationInfoRequest) String() string { return proto.CompactTextString(m) }
func (*AttestationInfoRequest) ProtoMessage() {}
func (*AttestationInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{2}
return fileDescriptor_services_646990b9daed6402, []int{2}
}
func (m *AttestationInfoRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -207,13 +206,6 @@ func (m *AttestationInfoRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_AttestationInfoRequest proto.InternalMessageInfo
func (m *AttestationInfoRequest) GetSlot() uint64 {
if m != nil {
return m.Slot
}
return 0
}
func (m *AttestationInfoRequest) GetShard() uint64 {
if m != nil {
return m.Shard
@ -236,7 +228,7 @@ func (m *AttestationInfoResponse) Reset() { *m = AttestationInfoResponse
func (m *AttestationInfoResponse) String() string { return proto.CompactTextString(m) }
func (*AttestationInfoResponse) ProtoMessage() {}
func (*AttestationInfoResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{3}
return fileDescriptor_services_646990b9daed6402, []int{3}
}
func (m *AttestationInfoResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -311,7 +303,7 @@ func (m *PendingAttestationsResponse) Reset() { *m = PendingAttestations
func (m *PendingAttestationsResponse) String() string { return proto.CompactTextString(m) }
func (*PendingAttestationsResponse) ProtoMessage() {}
func (*PendingAttestationsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{4}
return fileDescriptor_services_646990b9daed6402, []int{4}
}
func (m *PendingAttestationsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -358,7 +350,7 @@ func (m *CrosslinkCommitteeRequest) Reset() { *m = CrosslinkCommitteeReq
func (m *CrosslinkCommitteeRequest) String() string { return proto.CompactTextString(m) }
func (*CrosslinkCommitteeRequest) ProtoMessage() {}
func (*CrosslinkCommitteeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{5}
return fileDescriptor_services_646990b9daed6402, []int{5}
}
func (m *CrosslinkCommitteeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -406,7 +398,7 @@ func (m *CrosslinkCommitteeResponse) Reset() { *m = CrosslinkCommitteeRe
func (m *CrosslinkCommitteeResponse) String() string { return proto.CompactTextString(m) }
func (*CrosslinkCommitteeResponse) ProtoMessage() {}
func (*CrosslinkCommitteeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{6}
return fileDescriptor_services_646990b9daed6402, []int{6}
}
func (m *CrosslinkCommitteeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -461,7 +453,7 @@ func (m *ChainStartResponse) Reset() { *m = ChainStartResponse{} }
func (m *ChainStartResponse) String() string { return proto.CompactTextString(m) }
func (*ChainStartResponse) ProtoMessage() {}
func (*ChainStartResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{7}
return fileDescriptor_services_646990b9daed6402, []int{7}
}
func (m *ChainStartResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -520,7 +512,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_ef2608cec90967d6, []int{8}
return fileDescriptor_services_646990b9daed6402, []int{8}
}
func (m *ProposeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -602,7 +594,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_ef2608cec90967d6, []int{9}
return fileDescriptor_services_646990b9daed6402, []int{9}
}
func (m *ProposeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -649,7 +641,7 @@ func (m *ProposerIndexRequest) Reset() { *m = ProposerIndexRequest{} }
func (m *ProposerIndexRequest) String() string { return proto.CompactTextString(m) }
func (*ProposerIndexRequest) ProtoMessage() {}
func (*ProposerIndexRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{10}
return fileDescriptor_services_646990b9daed6402, []int{10}
}
func (m *ProposerIndexRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -696,7 +688,7 @@ func (m *ProposerIndexResponse) Reset() { *m = ProposerIndexResponse{} }
func (m *ProposerIndexResponse) String() string { return proto.CompactTextString(m) }
func (*ProposerIndexResponse) ProtoMessage() {}
func (*ProposerIndexResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{11}
return fileDescriptor_services_646990b9daed6402, []int{11}
}
func (m *ProposerIndexResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -743,7 +735,7 @@ func (m *StateRootResponse) Reset() { *m = StateRootResponse{} }
func (m *StateRootResponse) String() string { return proto.CompactTextString(m) }
func (*StateRootResponse) ProtoMessage() {}
func (*StateRootResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{12}
return fileDescriptor_services_646990b9daed6402, []int{12}
}
func (m *StateRootResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -790,7 +782,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_ef2608cec90967d6, []int{13}
return fileDescriptor_services_646990b9daed6402, []int{13}
}
func (m *AttestResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -840,7 +832,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_ef2608cec90967d6, []int{14}
return fileDescriptor_services_646990b9daed6402, []int{14}
}
func (m *Assignment) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -908,7 +900,7 @@ func (m *ValidatorIndexRequest) Reset() { *m = ValidatorIndexRequest{} }
func (m *ValidatorIndexRequest) String() string { return proto.CompactTextString(m) }
func (*ValidatorIndexRequest) ProtoMessage() {}
func (*ValidatorIndexRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{15}
return fileDescriptor_services_646990b9daed6402, []int{15}
}
func (m *ValidatorIndexRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -955,7 +947,7 @@ func (m *ValidatorIndexResponse) Reset() { *m = ValidatorIndexResponse{}
func (m *ValidatorIndexResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorIndexResponse) ProtoMessage() {}
func (*ValidatorIndexResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{16}
return fileDescriptor_services_646990b9daed6402, []int{16}
}
func (m *ValidatorIndexResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1003,7 +995,7 @@ func (m *ValidatorEpochAssignmentsRequest) Reset() { *m = ValidatorEpoch
func (m *ValidatorEpochAssignmentsRequest) String() string { return proto.CompactTextString(m) }
func (*ValidatorEpochAssignmentsRequest) ProtoMessage() {}
func (*ValidatorEpochAssignmentsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{17}
return fileDescriptor_services_646990b9daed6402, []int{17}
}
func (m *ValidatorEpochAssignmentsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1057,7 +1049,7 @@ func (m *ValidatorEpochAssignmentsResponse) Reset() { *m = ValidatorEpoc
func (m *ValidatorEpochAssignmentsResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorEpochAssignmentsResponse) ProtoMessage() {}
func (*ValidatorEpochAssignmentsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{18}
return fileDescriptor_services_646990b9daed6402, []int{18}
}
func (m *ValidatorEpochAssignmentsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1104,7 +1096,7 @@ func (m *PendingDepositsResponse) Reset() { *m = PendingDepositsResponse
func (m *PendingDepositsResponse) String() string { return proto.CompactTextString(m) }
func (*PendingDepositsResponse) ProtoMessage() {}
func (*PendingDepositsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{19}
return fileDescriptor_services_646990b9daed6402, []int{19}
}
func (m *PendingDepositsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1151,7 +1143,7 @@ func (m *Eth1DataResponse) Reset() { *m = Eth1DataResponse{} }
func (m *Eth1DataResponse) String() string { return proto.CompactTextString(m) }
func (*Eth1DataResponse) ProtoMessage() {}
func (*Eth1DataResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_services_ef2608cec90967d6, []int{20}
return fileDescriptor_services_646990b9daed6402, []int{20}
}
func (m *Eth1DataResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1950,13 +1942,8 @@ func (m *AttestationInfoRequest) MarshalTo(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.Slot != 0 {
dAtA[i] = 0x8
i++
i = encodeVarintServices(dAtA, i, uint64(m.Slot))
}
if m.Shard != 0 {
dAtA[i] = 0x10
dAtA[i] = 0x8
i++
i = encodeVarintServices(dAtA, i, uint64(m.Shard))
}
@ -2639,9 +2626,6 @@ func (m *AttestationInfoRequest) Size() (n int) {
}
var l int
_ = l
if m.Slot != 0 {
n += 1 + sovServices(uint64(m.Slot))
}
if m.Shard != 0 {
n += 1 + sovServices(uint64(m.Shard))
}
@ -3271,25 +3255,6 @@ func (m *AttestationInfoRequest) Unmarshal(dAtA []byte) error {
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Slot", wireType)
}
m.Slot = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowServices
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Slot |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType)
}
@ -5314,90 +5279,90 @@ var (
)
func init() {
proto.RegisterFile("proto/beacon/rpc/v1/services.proto", fileDescriptor_services_ef2608cec90967d6)
proto.RegisterFile("proto/beacon/rpc/v1/services.proto", fileDescriptor_services_646990b9daed6402)
}
var fileDescriptor_services_ef2608cec90967d6 = []byte{
var fileDescriptor_services_646990b9daed6402 = []byte{
// 1289 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xcd, 0x6e, 0xdb, 0x46,
0x10, 0x2e, 0x25, 0x39, 0xb1, 0x47, 0x92, 0x25, 0x6f, 0xfc, 0xa3, 0x28, 0x6d, 0xec, 0x30, 0x40,
0xe3, 0x04, 0x0d, 0x65, 0x33, 0x40, 0x93, 0x36, 0xc8, 0x41, 0x72, 0xd4, 0x26, 0x8d, 0x61, 0x3b,
0x94, 0x9a, 0xa0, 0x45, 0x01, 0x62, 0x25, 0x6d, 0x24, 0xd6, 0x12, 0x97, 0xe5, 0xae, 0x84, 0xf8,
0x09, 0x7a, 0xe8, 0xa5, 0x2f, 0xd1, 0x53, 0xef, 0x7d, 0x83, 0x02, 0x3d, 0xf6, 0x11, 0x8a, 0x1c,
0xfa, 0x1c, 0x05, 0x77, 0x97, 0x14, 0x45, 0x89, 0x8e, 0xda, 0xde, 0xc4, 0xf9, 0xf9, 0x76, 0xe6,
0x9b, 0xd9, 0x99, 0x15, 0xe8, 0x9e, 0x4f, 0x39, 0xad, 0x75, 0x08, 0xee, 0x52, 0xb7, 0xe6, 0x7b,
0xdd, 0xda, 0xe4, 0xb0, 0xc6, 0x88, 0x3f, 0x71, 0xba, 0x84, 0x19, 0x42, 0x89, 0xb6, 0x09, 0x1f,
0x10, 0x9f, 0x8c, 0x47, 0x86, 0x34, 0x33, 0x7c, 0xaf, 0x6b, 0x4c, 0x0e, 0xab, 0xbb, 0x33, 0xbe,
0x9e, 0xe9, 0x05, 0xbe, 0xfc, 0xc2, 0x0b, 0x1d, 0xab, 0x37, 0xfa, 0x94, 0xf6, 0x87, 0xa4, 0x26,
0xbe, 0x3a, 0xe3, 0x37, 0x35, 0x32, 0xf2, 0xf8, 0x85, 0x52, 0xee, 0x26, 0x95, 0xdc, 0x19, 0x11,
0xc6, 0xf1, 0xc8, 0x93, 0x06, 0xfa, 0x29, 0x94, 0x8f, 0xe8, 0x68, 0xe4, 0x70, 0x4e, 0x88, 0x45,
0x7e, 0x18, 0x13, 0xc6, 0x11, 0x82, 0x1c, 0x1b, 0x52, 0x5e, 0xd1, 0xf6, 0xb4, 0xfd, 0x9c, 0x25,
0x7e, 0xa3, 0x3b, 0x50, 0x9a, 0xe0, 0xa1, 0xd3, 0xc3, 0x9c, 0xfa, 0xb6, 0xe3, 0xf6, 0xc8, 0xdb,
0x4a, 0x46, 0xa8, 0xd7, 0x23, 0xf1, 0xf3, 0x40, 0xaa, 0x7f, 0x09, 0x1b, 0x31, 0x40, 0xe6, 0x51,
0x97, 0x11, 0xf4, 0x21, 0xac, 0x75, 0x43, 0x61, 0x45, 0xdb, 0xcb, 0xee, 0xe7, 0xac, 0xa9, 0x00,
0x6d, 0xc2, 0x0a, 0x1b, 0x60, 0xbf, 0xa7, 0x10, 0xe5, 0x87, 0xde, 0x80, 0xed, 0x3a, 0xe7, 0x41,
0xb0, 0xdc, 0xa1, 0xee, 0x73, 0xf7, 0x0d, 0xbd, 0x2c, 0xbe, 0xc5, 0x18, 0xbf, 0x67, 0x60, 0x67,
0x0e, 0x44, 0xc5, 0xf4, 0x10, 0x2a, 0x92, 0x54, 0xbb, 0x33, 0xa4, 0xdd, 0x73, 0xdb, 0xa7, 0x94,
0xdb, 0x03, 0xcc, 0x06, 0x0f, 0x4c, 0x81, 0x5c, 0xb0, 0xb6, 0xa4, 0xbe, 0x11, 0xa8, 0x2d, 0x4a,
0xf9, 0x33, 0xa1, 0x44, 0x8f, 0xa1, 0x4a, 0x3c, 0xda, 0x1d, 0xd8, 0x1d, 0x3a, 0x76, 0x7b, 0xd8,
0xbf, 0x98, 0x71, 0xcd, 0x08, 0xd7, 0x1d, 0x61, 0xd1, 0x50, 0x06, 0x31, 0xe7, 0x3b, 0x50, 0xfa,
0x7e, 0xcc, 0xb8, 0xf3, 0xc6, 0x21, 0x3d, 0x5b, 0x18, 0x55, 0xb2, 0x92, 0xc7, 0x48, 0xdc, 0x0c,
0xa4, 0xe8, 0x09, 0xdc, 0x98, 0x1a, 0xce, 0x47, 0x98, 0x13, 0xc7, 0x54, 0x22, 0x93, 0x64, 0x90,
0xc7, 0x50, 0x1e, 0xe2, 0x20, 0x71, 0xbb, 0xeb, 0x53, 0xc6, 0x86, 0x8e, 0x7b, 0x5e, 0x59, 0xd9,
0xd3, 0xf6, 0xf3, 0xe6, 0x2d, 0x23, 0xd9, 0x69, 0x9e, 0xe9, 0x19, 0x93, 0x43, 0xe3, 0x28, 0x34,
0xb4, 0x4a, 0xd2, 0x35, 0x12, 0xe8, 0x63, 0xb8, 0x71, 0x46, 0xdc, 0x9e, 0xe3, 0xf6, 0x63, 0x6c,
0xb2, 0x88, 0xca, 0x57, 0xb0, 0xe9, 0x49, 0xb5, 0x8d, 0x63, 0x7a, 0x51, 0xe9, 0xbc, 0x79, 0x3b,
0xed, 0xc0, 0x18, 0x96, 0x75, 0xcd, 0x9b, 0xc7, 0xd7, 0x6b, 0x70, 0x3d, 0x8a, 0x61, 0x99, 0x2e,
0xd5, 0xcf, 0xa0, 0xba, 0xc8, 0xe1, 0x7f, 0x74, 0xe1, 0x4b, 0x40, 0x47, 0x03, 0xec, 0xb8, 0x2d,
0x8e, 0x7d, 0x1e, 0x21, 0x55, 0xe0, 0x2a, 0x0b, 0x04, 0xa4, 0x27, 0x8e, 0x5f, 0xb5, 0xc2, 0x4f,
0x74, 0x0b, 0x0a, 0x7d, 0xe2, 0x12, 0xe6, 0x30, 0x3b, 0xb8, 0x6a, 0x0a, 0x2c, 0xaf, 0x64, 0x6d,
0x67, 0x44, 0xf4, 0x5f, 0x33, 0xb0, 0x7e, 0xe6, 0x53, 0x8f, 0xb2, 0x28, 0x97, 0x5d, 0xc8, 0x7b,
0xd8, 0x27, 0xae, 0x2c, 0xaf, 0x6a, 0x3f, 0x90, 0xa2, 0xa0, 0xa0, 0x81, 0x41, 0x90, 0xa0, 0xed,
0x8e, 0x47, 0x1d, 0xe2, 0x2b, 0x54, 0x08, 0x44, 0x27, 0x42, 0x82, 0x0e, 0x60, 0xd3, 0xc7, 0x6e,
0x0f, 0x53, 0xdb, 0x27, 0x13, 0x82, 0x87, 0x61, 0x9f, 0x64, 0x05, 0x14, 0x92, 0x3a, 0x4b, 0xa8,
0x54, 0x87, 0xd4, 0xe0, 0x5a, 0xac, 0x58, 0x76, 0xc7, 0xe1, 0x23, 0xcc, 0xce, 0x55, 0x63, 0xa1,
0x98, 0xaa, 0x21, 0x35, 0xe8, 0x73, 0xb8, 0x1e, 0x77, 0xc0, 0xfd, 0xbe, 0x4f, 0xfa, 0x98, 0x13,
0x9b, 0x39, 0xfd, 0xca, 0x8a, 0xa0, 0x73, 0x27, 0x66, 0x50, 0x0f, 0xf5, 0x2d, 0xa7, 0x8f, 0x1e,
0xc1, 0x5a, 0x34, 0x79, 0x2a, 0x57, 0x44, 0x1f, 0x56, 0x0d, 0x39, 0x9b, 0x8c, 0x70, 0x36, 0x19,
0xed, 0xd0, 0xc2, 0x9a, 0x1a, 0xeb, 0x07, 0x50, 0x8a, 0xc8, 0x52, 0xec, 0x7f, 0x04, 0x20, 0x2f,
0x44, 0x8c, 0xac, 0x35, 0x21, 0x09, 0x52, 0xd3, 0x1f, 0xc2, 0xa6, 0xf2, 0x90, 0x23, 0x29, 0x46,
0x72, 0x9c, 0x43, 0x2d, 0xc9, 0xa1, 0x7e, 0x1f, 0xb6, 0x12, 0x8e, 0xea, 0xc0, 0x4d, 0x58, 0x91,
0x23, 0x4f, 0xfa, 0xc8, 0x0f, 0xdd, 0x84, 0x8d, 0x16, 0xc7, 0x9c, 0x04, 0xb7, 0x2e, 0x1e, 0x5b,
0x90, 0x3f, 0x11, 0x97, 0x35, 0x8c, 0x8d, 0x85, 0x66, 0xfa, 0x63, 0x58, 0x97, 0x1d, 0x1e, 0x39,
0xdc, 0x85, 0x72, 0x9c, 0xd5, 0x58, 0x4a, 0xa5, 0x98, 0x5c, 0x24, 0xf6, 0x93, 0x06, 0x50, 0x67,
0xcc, 0xe9, 0xbb, 0x23, 0xe2, 0xf2, 0xe0, 0x28, 0x6f, 0xdc, 0x19, 0x3a, 0x5d, 0xfb, 0x9c, 0x5c,
0x84, 0x47, 0x49, 0xc9, 0x0b, 0x72, 0xb1, 0xb8, 0x9f, 0xd1, 0x6d, 0x28, 0x4a, 0x58, 0xe2, 0xdb,
0xe2, 0xfa, 0xc8, 0xe9, 0x53, 0x08, 0x85, 0xad, 0x60, 0x98, 0xde, 0x86, 0xa2, 0xa7, 0x88, 0x90,
0x46, 0x39, 0x69, 0x14, 0x0a, 0x03, 0x23, 0xfd, 0x53, 0xd8, 0x7a, 0x35, 0x33, 0xfa, 0x43, 0x9e,
0x2f, 0x8f, 0x4b, 0x37, 0x60, 0x3b, 0xe9, 0x77, 0x29, 0xcd, 0x1d, 0xd8, 0x8b, 0xec, 0xc5, 0x68,
0x9c, 0x52, 0xc0, 0x62, 0xa5, 0x95, 0x23, 0x59, 0x5c, 0xc3, 0xb0, 0xb4, 0x42, 0x24, 0x2e, 0x6e,
0x22, 0xa6, 0x4c, 0x32, 0xa6, 0x3e, 0xdc, 0xba, 0xe4, 0x0c, 0x15, 0x5e, 0x03, 0x00, 0x47, 0x62,
0x81, 0x91, 0x37, 0x75, 0x63, 0xf1, 0xda, 0x36, 0xa6, 0x00, 0x56, 0xcc, 0x4b, 0x27, 0xb0, 0xa3,
0x06, 0xe9, 0x53, 0xe2, 0x51, 0xe6, 0xc4, 0xe0, 0xbf, 0x82, 0x72, 0x38, 0x44, 0x7b, 0x4a, 0xa7,
0x06, 0xe8, 0x6e, 0xda, 0x00, 0x55, 0x18, 0x56, 0xc9, 0x9b, 0xc5, 0xd4, 0x5f, 0x42, 0xb9, 0xc9,
0x07, 0x87, 0x4f, 0x31, 0xc7, 0x11, 0xfe, 0x13, 0x58, 0x23, 0x7c, 0x70, 0x68, 0xf7, 0x30, 0xc7,
0x82, 0xa1, 0xbc, 0xb9, 0x97, 0x06, 0x1c, 0x39, 0xaf, 0x12, 0xf5, 0xeb, 0x5e, 0x03, 0x8a, 0x11,
0x45, 0x16, 0x1d, 0x12, 0x94, 0x87, 0xab, 0x5f, 0x9f, 0xbc, 0x38, 0x39, 0x7d, 0x7d, 0x52, 0xfe,
0x00, 0x15, 0x60, 0xb5, 0xde, 0x6e, 0x37, 0x5b, 0xed, 0xa6, 0x55, 0xd6, 0x82, 0xaf, 0x33, 0xeb,
0xf4, 0xec, 0xb4, 0xd5, 0xb4, 0xca, 0x19, 0xb4, 0x0a, 0xb9, 0xc6, 0x69, 0xfb, 0x59, 0x39, 0x6b,
0xfe, 0x96, 0x85, 0x62, 0x43, 0x1c, 0xd4, 0x92, 0x8f, 0x1f, 0xf4, 0x0d, 0x6c, 0xbc, 0xc6, 0x0e,
0xff, 0x82, 0xfa, 0xd3, 0x29, 0x8b, 0xb6, 0xe7, 0x26, 0x43, 0x33, 0x78, 0xd2, 0x54, 0xef, 0xa5,
0x91, 0x3d, 0x3f, 0xa1, 0x0f, 0x34, 0x74, 0x0c, 0xc5, 0x23, 0xec, 0x52, 0xd7, 0xe9, 0xe2, 0xe1,
0x33, 0x82, 0x7b, 0xa9, 0xb0, 0xa9, 0xfb, 0xa9, 0x31, 0x5d, 0xff, 0xc8, 0x82, 0x8d, 0x63, 0xb1,
0x14, 0x63, 0x0b, 0xea, 0xdf, 0x23, 0xc6, 0x9c, 0x0f, 0x34, 0xf4, 0x2d, 0x94, 0x12, 0xcd, 0x90,
0x8a, 0x58, 0x4b, 0x4b, 0x3d, 0xad, 0x9b, 0x8e, 0x61, 0x35, 0x2c, 0x62, 0x2a, 0xe8, 0x7e, 0x1a,
0x68, 0xb2, 0x77, 0xcc, 0xbf, 0x35, 0x28, 0xd5, 0xc3, 0x09, 0x11, 0x95, 0x0e, 0xa4, 0x48, 0x90,
0xbb, 0x4c, 0xca, 0xd5, 0x8f, 0x53, 0x6f, 0xcb, 0xec, 0x4c, 0x7c, 0x0b, 0x5b, 0x89, 0x57, 0x5b,
0x9d, 0x8b, 0xc1, 0x64, 0x5c, 0x0e, 0x90, 0x7c, 0x29, 0xa6, 0xd3, 0x96, 0xf2, 0x28, 0x34, 0x7f,
0xc9, 0x46, 0xeb, 0x26, 0x4a, 0x74, 0x08, 0xc5, 0x99, 0xb5, 0x80, 0x3e, 0x49, 0x2d, 0xc6, 0x82,
0xb5, 0x53, 0xbd, 0xbf, 0xa4, 0xb5, 0xca, 0xbd, 0x03, 0xd7, 0x16, 0x3c, 0xb5, 0x52, 0x6b, 0xf8,
0xe0, 0x3d, 0x8d, 0xb1, 0xf0, 0xbd, 0xf6, 0x1d, 0x14, 0xd4, 0xe1, 0xb2, 0xb9, 0x97, 0xb9, 0x01,
0xd5, 0x3b, 0xef, 0xc9, 0x23, 0x96, 0x41, 0xf0, 0x97, 0xc2, 0x1b, 0x73, 0x12, 0xad, 0xc7, 0xe5,
0x4e, 0xb8, 0x9b, 0x76, 0xc2, 0xdc, 0x9a, 0x35, 0x7f, 0xcc, 0x42, 0x39, 0x1a, 0x47, 0x61, 0xa1,
0x28, 0xac, 0xcf, 0x6e, 0x16, 0x94, 0xca, 0xfd, 0xc2, 0xcd, 0x55, 0x35, 0x96, 0x35, 0x57, 0x99,
0xfe, 0xac, 0xc1, 0xf5, 0xd4, 0xbd, 0x81, 0x1e, 0xbd, 0x17, 0x2d, 0x65, 0x9d, 0x55, 0x3f, 0xfb,
0x0f, 0x9e, 0x2a, 0x24, 0x0a, 0x95, 0xc8, 0x28, 0x7a, 0x01, 0xab, 0xdb, 0x93, 0x7a, 0xdf, 0x93,
0x6f, 0xeb, 0xf4, 0x4a, 0xcc, 0x3d, 0xaa, 0x1b, 0x85, 0x3f, 0xde, 0xdd, 0xd4, 0xfe, 0x7c, 0x77,
0x53, 0xfb, 0xeb, 0xdd, 0x4d, 0xad, 0x73, 0x45, 0xb4, 0xe7, 0x83, 0x7f, 0x02, 0x00, 0x00, 0xff,
0xff, 0xdd, 0xcd, 0x8f, 0xef, 0xf2, 0x0e, 0x00, 0x00,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xcf, 0x6e, 0x1b, 0x45,
0x18, 0x67, 0xe3, 0xa4, 0x4d, 0x3e, 0x27, 0xb1, 0x33, 0x4d, 0x1a, 0xd7, 0x85, 0x26, 0xdd, 0x4a,
0x34, 0xad, 0xe8, 0x3a, 0xd9, 0x4a, 0xb4, 0x50, 0xf5, 0x60, 0xa7, 0x86, 0x96, 0x46, 0x49, 0xba,
0x36, 0xad, 0x40, 0x48, 0xab, 0xb1, 0x3d, 0xb5, 0x97, 0xd8, 0x3b, 0xcb, 0xce, 0xd8, 0x6a, 0x9e,
0x80, 0x03, 0x17, 0x5e, 0x82, 0x13, 0x77, 0xde, 0x00, 0x89, 0x23, 0x8f, 0x80, 0x7a, 0xe0, 0x39,
0xd0, 0xce, 0xcc, 0x8e, 0xd7, 0x6b, 0x6f, 0x62, 0xe0, 0xe6, 0xfd, 0xfe, 0xfc, 0xe6, 0xfb, 0x37,
0xbf, 0x6f, 0x0c, 0x66, 0x10, 0x52, 0x4e, 0x2b, 0x2d, 0x82, 0xdb, 0xd4, 0xaf, 0x84, 0x41, 0xbb,
0x32, 0x3a, 0xa8, 0x30, 0x12, 0x8e, 0xbc, 0x36, 0x61, 0x96, 0x50, 0xa2, 0xeb, 0x84, 0xf7, 0x48,
0x48, 0x86, 0x03, 0x4b, 0x9a, 0x59, 0x61, 0xd0, 0xb6, 0x46, 0x07, 0xe5, 0x9d, 0x09, 0xdf, 0xc0,
0x0e, 0x22, 0x5f, 0x7e, 0x1e, 0xc4, 0x8e, 0xe5, 0x9b, 0x5d, 0x4a, 0xbb, 0x7d, 0x52, 0x11, 0x5f,
0xad, 0xe1, 0xdb, 0x0a, 0x19, 0x04, 0xfc, 0x5c, 0x29, 0x77, 0xd2, 0x4a, 0xee, 0x0d, 0x08, 0xe3,
0x78, 0x10, 0x48, 0x03, 0xf3, 0x04, 0x8a, 0x87, 0x74, 0x30, 0xf0, 0x38, 0x27, 0xc4, 0x21, 0x3f,
0x0c, 0x09, 0xe3, 0x08, 0xc1, 0x22, 0xeb, 0x53, 0x5e, 0x32, 0x76, 0x8d, 0xbd, 0x45, 0x47, 0xfc,
0x46, 0x77, 0xa1, 0x30, 0xc2, 0x7d, 0xaf, 0x83, 0x39, 0x0d, 0x5d, 0xcf, 0xef, 0x90, 0x77, 0xa5,
0x05, 0xa1, 0x5e, 0xd7, 0xe2, 0x17, 0x91, 0xd4, 0xfc, 0x12, 0x36, 0x12, 0x80, 0x2c, 0xa0, 0x3e,
0x23, 0xe8, 0x43, 0x58, 0x69, 0xc7, 0xc2, 0x92, 0xb1, 0x9b, 0xdb, 0x5b, 0x74, 0xc6, 0x02, 0xb4,
0x09, 0x4b, 0xac, 0x87, 0xc3, 0x8e, 0x42, 0x94, 0x1f, 0xa6, 0x05, 0xd7, 0xab, 0x9c, 0x47, 0xc1,
0x72, 0x8f, 0xfa, 0x2f, 0xfc, 0xb7, 0x34, 0x8e, 0x4f, 0xdb, 0x1b, 0x49, 0xfb, 0xdf, 0x17, 0x60,
0x7b, 0xca, 0x41, 0x9d, 0xff, 0x08, 0x4a, 0xb2, 0x80, 0x6e, 0xab, 0x4f, 0xdb, 0x67, 0x6e, 0x48,
0x29, 0x77, 0x7b, 0x98, 0xf5, 0x1e, 0xda, 0x02, 0x64, 0xd5, 0xd9, 0x92, 0xfa, 0x5a, 0xa4, 0x76,
0x28, 0xe5, 0xcf, 0x85, 0x12, 0x3d, 0x81, 0x32, 0x09, 0x68, 0xbb, 0xe7, 0xb6, 0xe8, 0xd0, 0xef,
0xe0, 0xf0, 0x7c, 0xc2, 0x75, 0x41, 0xb8, 0x6e, 0x0b, 0x8b, 0x9a, 0x32, 0x48, 0x38, 0xdf, 0x85,
0xc2, 0xf7, 0x43, 0xc6, 0xbd, 0xb7, 0x1e, 0xe9, 0xb8, 0xc2, 0xa8, 0x94, 0x93, 0x35, 0xd3, 0xe2,
0x7a, 0x24, 0x45, 0x4f, 0xe1, 0xe6, 0xd8, 0x70, 0x3a, 0xc2, 0x45, 0x71, 0x4c, 0x49, 0x9b, 0xa4,
0x83, 0x3c, 0x82, 0x62, 0x1f, 0x47, 0x89, 0xbb, 0xed, 0x90, 0x32, 0xd6, 0xf7, 0xfc, 0xb3, 0xd2,
0xd2, 0xae, 0xb1, 0x97, 0xb7, 0x6f, 0x5b, 0xe9, 0xa9, 0x0a, 0xec, 0xc0, 0x1a, 0x1d, 0x58, 0x87,
0xb1, 0xa1, 0x53, 0x90, 0xae, 0x5a, 0x60, 0x0e, 0xe1, 0xe6, 0x29, 0xf1, 0x3b, 0x9e, 0xdf, 0x4d,
0x54, 0x93, 0xe9, 0x52, 0xbe, 0x86, 0xcd, 0x40, 0xaa, 0x5d, 0x9c, 0xd0, 0x8b, 0xae, 0xe6, 0xed,
0x3b, 0x59, 0x07, 0x26, 0xb0, 0x9c, 0x6b, 0xc1, 0x34, 0xbe, 0x59, 0x81, 0x1b, 0x3a, 0x86, 0x79,
0x26, 0xd2, 0x3c, 0x85, 0xf2, 0x2c, 0x87, 0xff, 0x31, 0x71, 0xaf, 0x00, 0x1d, 0xf6, 0xb0, 0xe7,
0x37, 0x38, 0x0e, 0xb9, 0x46, 0x2a, 0xc1, 0x55, 0x16, 0x09, 0x88, 0x9c, 0xb7, 0x65, 0x27, 0xfe,
0x44, 0xb7, 0x61, 0xb5, 0x4b, 0x7c, 0xc2, 0x3c, 0xe6, 0x46, 0xd7, 0x4a, 0x81, 0xe5, 0x95, 0xac,
0xe9, 0x0d, 0x88, 0xf9, 0xeb, 0x02, 0xac, 0x9f, 0x86, 0x34, 0xa0, 0x4c, 0xe7, 0xb2, 0x03, 0xf9,
0x00, 0x87, 0xc4, 0x97, 0xed, 0x55, 0xe3, 0x07, 0x52, 0x14, 0x35, 0x34, 0x32, 0x88, 0x12, 0x74,
0xfd, 0xe1, 0xa0, 0x45, 0x42, 0x85, 0x0a, 0x91, 0xe8, 0x58, 0x48, 0xd0, 0x3e, 0x6c, 0x86, 0xd8,
0xef, 0x60, 0xea, 0x86, 0x64, 0x44, 0x70, 0x3f, 0x9e, 0x93, 0x9c, 0x80, 0x42, 0x52, 0xe7, 0x08,
0x95, 0x9a, 0x90, 0x0a, 0x5c, 0x4b, 0x34, 0xcb, 0x6d, 0x79, 0x7c, 0x80, 0xd9, 0x99, 0x1a, 0x2c,
0x94, 0x50, 0xd5, 0xa4, 0x06, 0x7d, 0x0e, 0x37, 0x92, 0x0e, 0xb8, 0xdb, 0x0d, 0x49, 0x17, 0x73,
0xe2, 0x32, 0xaf, 0x5b, 0x5a, 0x12, 0xe5, 0xdc, 0x4e, 0x18, 0x54, 0x63, 0x7d, 0xc3, 0xeb, 0xa2,
0xc7, 0xb0, 0xa2, 0x59, 0xa6, 0x74, 0x45, 0xcc, 0x61, 0xd9, 0x92, 0x3c, 0x64, 0xc5, 0x3c, 0x64,
0x35, 0x63, 0x0b, 0x67, 0x6c, 0x6c, 0xee, 0x43, 0x41, 0x17, 0x4b, 0x55, 0xff, 0x23, 0x00, 0x79,
0x21, 0x12, 0xc5, 0x5a, 0x11, 0x92, 0x28, 0x35, 0xf3, 0x11, 0x6c, 0x2a, 0x0f, 0x49, 0x3f, 0x89,
0x22, 0x27, 0x6b, 0x68, 0xa4, 0x6b, 0x68, 0x3e, 0x80, 0xad, 0x94, 0xa3, 0x3a, 0x70, 0x13, 0x96,
0x24, 0xbd, 0x29, 0x72, 0x11, 0x1f, 0xa6, 0x0d, 0x1b, 0x0d, 0x8e, 0x39, 0x89, 0x6e, 0x5d, 0x32,
0xb6, 0x28, 0x7f, 0x22, 0x2e, 0x6b, 0x1c, 0x1b, 0x8b, 0xcd, 0xcc, 0x27, 0xb0, 0x2e, 0x27, 0x5c,
0x3b, 0xdc, 0x83, 0x62, 0xb2, 0xaa, 0x89, 0x94, 0x0a, 0x09, 0xb9, 0x48, 0xec, 0x27, 0x03, 0xa0,
0xca, 0x98, 0xd7, 0xf5, 0x07, 0xc4, 0xe7, 0xd1, 0x51, 0xc1, 0xb0, 0xd5, 0xf7, 0xda, 0xee, 0x19,
0x39, 0x8f, 0x8f, 0x92, 0x92, 0x97, 0xe4, 0x7c, 0xf6, 0x3c, 0xa3, 0x3b, 0xb0, 0x26, 0x61, 0x49,
0xe8, 0x8a, 0xeb, 0x23, 0xd9, 0x67, 0x35, 0x16, 0x36, 0x22, 0x62, 0xbf, 0x03, 0x6b, 0x81, 0x2a,
0x84, 0x34, 0x5a, 0x94, 0x46, 0xb1, 0x30, 0x32, 0x32, 0x3f, 0x85, 0xad, 0xd7, 0x13, 0x34, 0x1f,
0xd7, 0xf9, 0xe2, 0xb8, 0x22, 0x0e, 0x4f, 0xfb, 0x5d, 0x58, 0xe6, 0x16, 0xec, 0x6a, 0x7b, 0x41,
0x8d, 0xe3, 0x12, 0xb0, 0x44, 0x6b, 0x25, 0x25, 0x8b, 0x6b, 0x18, 0xb7, 0x56, 0x88, 0xc4, 0xc5,
0x4d, 0xc5, 0xb4, 0x90, 0x8e, 0xa9, 0x0b, 0xb7, 0x2f, 0x38, 0x43, 0x85, 0x57, 0x03, 0xc0, 0x5a,
0x2c, 0x30, 0xf2, 0xb6, 0x69, 0xcd, 0x5e, 0xd1, 0xd6, 0x18, 0xc0, 0x49, 0x78, 0x99, 0x04, 0xb6,
0x15, 0x91, 0x3e, 0x23, 0x01, 0x65, 0x5e, 0x02, 0xfe, 0x2b, 0x28, 0xc6, 0x24, 0xda, 0x51, 0x3a,
0x45, 0xa0, 0x3b, 0x59, 0x04, 0xaa, 0x30, 0x9c, 0x42, 0x30, 0x89, 0x69, 0xbe, 0x82, 0x62, 0x9d,
0xf7, 0x0e, 0x9e, 0x61, 0x8e, 0x35, 0xfe, 0x53, 0x58, 0x21, 0xbc, 0x77, 0xe0, 0x76, 0x30, 0xc7,
0xa2, 0x42, 0x79, 0x7b, 0x37, 0x0b, 0x58, 0x3b, 0x2f, 0x13, 0xf5, 0xeb, 0x7e, 0x0d, 0xd6, 0x74,
0x89, 0x1c, 0xda, 0x27, 0x28, 0x0f, 0x57, 0xbf, 0x3e, 0x7e, 0x79, 0x7c, 0xf2, 0xe6, 0xb8, 0xf8,
0x01, 0x5a, 0x85, 0xe5, 0x6a, 0xb3, 0x59, 0x6f, 0x34, 0xeb, 0x4e, 0xd1, 0x88, 0xbe, 0x4e, 0x9d,
0x93, 0xd3, 0x93, 0x46, 0xdd, 0x29, 0x2e, 0xa0, 0x65, 0x58, 0xac, 0x9d, 0x34, 0x9f, 0x17, 0x73,
0xf6, 0x6f, 0x39, 0x58, 0xab, 0x89, 0x83, 0x1a, 0xf2, 0xa1, 0x83, 0xbe, 0x81, 0x8d, 0x37, 0xd8,
0xe3, 0x5f, 0xd0, 0x70, 0xcc, 0xb2, 0xe8, 0xfa, 0x14, 0x33, 0xd4, 0xa3, 0xe7, 0x4b, 0xf9, 0x7e,
0x56, 0xb1, 0xa7, 0x19, 0x7a, 0xdf, 0x40, 0x47, 0xb0, 0x76, 0x88, 0x7d, 0xea, 0x7b, 0x6d, 0xdc,
0x7f, 0x4e, 0x70, 0x27, 0x13, 0x36, 0x73, 0x3f, 0xd5, 0xc6, 0xeb, 0x1f, 0x39, 0xb0, 0x71, 0x24,
0x96, 0x62, 0x62, 0x41, 0xfd, 0x7b, 0xc4, 0x84, 0xf3, 0xbe, 0x81, 0xbe, 0x85, 0x42, 0x6a, 0x18,
0x32, 0x11, 0x2b, 0x59, 0xa9, 0x67, 0x4d, 0xd3, 0x11, 0x2c, 0xc7, 0x4d, 0xcc, 0x04, 0xdd, 0xcb,
0x02, 0x4d, 0xcf, 0x8e, 0xfd, 0xb7, 0x01, 0x85, 0x6a, 0xcc, 0x10, 0xba, 0x75, 0x20, 0x45, 0xa2,
0xb8, 0xf3, 0xa4, 0x5c, 0xfe, 0x38, 0xf3, 0xb6, 0x4c, 0x72, 0xe2, 0x3b, 0xd8, 0x4a, 0xbd, 0xda,
0xaa, 0x5c, 0x10, 0x93, 0x75, 0x31, 0x40, 0xfa, 0x55, 0x98, 0x5d, 0xb6, 0x8c, 0x47, 0xa1, 0xfd,
0x4b, 0x4e, 0xaf, 0x1b, 0x9d, 0x68, 0x1f, 0xd6, 0x26, 0xd6, 0x02, 0xfa, 0x24, 0xb3, 0x19, 0x33,
0xd6, 0x4e, 0xf9, 0xc1, 0x9c, 0xd6, 0x2a, 0xf7, 0x16, 0x5c, 0x9b, 0xf1, 0xd4, 0xca, 0xec, 0xe1,
0xc3, 0x4b, 0x06, 0x63, 0xe6, 0x7b, 0xed, 0x3b, 0x58, 0x55, 0x87, 0xcb, 0xe1, 0x9e, 0xe7, 0x06,
0x94, 0xef, 0x5e, 0x92, 0x47, 0x22, 0x83, 0xe8, 0xef, 0x43, 0x30, 0xe4, 0x44, 0xaf, 0xc7, 0xf9,
0x4e, 0xb8, 0x97, 0x75, 0xc2, 0xd4, 0x9a, 0xb5, 0x7f, 0xcc, 0x41, 0x51, 0xd3, 0x51, 0xdc, 0x28,
0x0a, 0xeb, 0x93, 0x9b, 0x05, 0x65, 0xd6, 0x7e, 0xe6, 0xe6, 0x2a, 0x5b, 0xf3, 0x9a, 0xab, 0x4c,
0x7f, 0x36, 0xe0, 0x46, 0xe6, 0xde, 0x40, 0x8f, 0x2f, 0x45, 0xcb, 0x58, 0x67, 0xe5, 0xcf, 0xfe,
0x83, 0xa7, 0x0a, 0x89, 0x42, 0x49, 0x1b, 0xe9, 0x17, 0xb0, 0xba, 0x3d, 0x99, 0xf7, 0x3d, 0xfd,
0xb6, 0xce, 0xee, 0xc4, 0xd4, 0xa3, 0xba, 0xb6, 0xfa, 0xc7, 0xfb, 0x5b, 0xc6, 0x9f, 0xef, 0x6f,
0x19, 0x7f, 0xbd, 0xbf, 0x65, 0xb4, 0xae, 0x88, 0xf1, 0x7c, 0xf8, 0x4f, 0x00, 0x00, 0x00, 0xff,
0xff, 0xa2, 0xff, 0x62, 0xb4, 0xde, 0x0e, 0x00, 0x00,
}

View File

@ -45,8 +45,7 @@ message CommitteeResponse {
}
message AttestationInfoRequest {
uint64 slot = 1;
uint64 shard = 2;
uint64 shard = 1;
}
message AttestationInfoResponse {

View File

@ -134,10 +134,10 @@ func (v *validator) RoleAt(slot uint64) pb.ValidatorRole {
}
if v.assignment.AttesterSlot == slot && v.assignment.ProposerSlot == slot {
return pb.ValidatorRole_BOTH
} else if v.assignment.AttesterSlot == slot {
return pb.ValidatorRole_ATTESTER
} else if v.assignment.ProposerSlot == slot {
return pb.ValidatorRole_PROPOSER
} else if v.assignment.AttesterSlot == slot {
return pb.ValidatorRole_ATTESTER
}
return pb.ValidatorRole_UNKNOWN
}

View File

@ -54,7 +54,6 @@ func (v *validator) AttestToBlockHead(ctx context.Context, slot uint64) {
// Fetch other necessary information from the beacon node in order to attest
// including the justified epoch, epoch boundary information, and more.
infoReq := &pb.AttestationInfoRequest{
Slot: slot,
Shard: resp.Shard,
}
infoRes, err := v.attesterClient.AttestationInfoAtSlot(ctx, infoReq)