Implement Proposer Attestation Check for Block Validity (#508)

This commit is contained in:
terence tsao
2018-09-15 07:51:17 -07:00
committed by GitHub
parent be11f2f103
commit ae84cfcfa2
31 changed files with 508 additions and 325 deletions

View File

@@ -300,7 +300,7 @@ func (b *BeaconChain) getAttestation(hash [32]byte) (*types.Attestation, error)
return nil, err return nil, err
} }
attestation := &pb.AttestationRecord{} attestation := &pb.AggregatedAttestation{}
err = proto.Unmarshal(enc, attestation) err = proto.Unmarshal(enc, attestation)

View File

@@ -151,7 +151,7 @@ func TestSetActiveState(t *testing.T) {
defer db.Close() defer db.Close()
data := &pb.ActiveState{ data := &pb.ActiveState{
PendingAttestations: []*pb.AttestationRecord{ PendingAttestations: []*pb.AggregatedAttestation{
{Slot: 0, ShardBlockHash: []byte{1}}, {Slot: 1, ShardBlockHash: []byte{2}}, {Slot: 0, ShardBlockHash: []byte{1}}, {Slot: 1, ShardBlockHash: []byte{2}},
}, },
RecentBlockHashes: [][]byte{ RecentBlockHashes: [][]byte{
@@ -370,7 +370,7 @@ func TestSaveAndRemoveAttestations(t *testing.T) {
b, db := startInMemoryBeaconChain(t) b, db := startInMemoryBeaconChain(t)
defer db.Close() defer db.Close()
attestation := types.NewAttestation(&pb.AttestationRecord{ attestation := types.NewAttestation(&pb.AggregatedAttestation{
Slot: 1, Slot: 1,
ShardId: 1, ShardId: 1,
AttesterBitfield: []byte{'A'}, AttesterBitfield: []byte{'A'},
@@ -390,7 +390,7 @@ func TestSaveAndRemoveAttestations(t *testing.T) {
} }
// Adding a different attestation with the same key // Adding a different attestation with the same key
newAttestation := types.NewAttestation(&pb.AttestationRecord{ newAttestation := types.NewAttestation(&pb.AggregatedAttestation{
Slot: 2, Slot: 2,
ShardId: 2, ShardId: 2,
AttesterBitfield: []byte{'B'}, AttesterBitfield: []byte{'B'},
@@ -440,7 +440,7 @@ func TestSaveAndRemoveAttestationHashList(t *testing.T) {
t.Error(err) t.Error(err)
} }
attestation := types.NewAttestation(&pb.AttestationRecord{ attestation := types.NewAttestation(&pb.AggregatedAttestation{
Slot: 1, Slot: 1,
ShardId: 1, ShardId: 1,
AttesterBitfield: []byte{'A'}, AttesterBitfield: []byte{'A'},

View File

@@ -127,6 +127,15 @@ func (c *ChainService) ContainsBlock(h [32]byte) (bool, error) {
return c.chain.hasBlock(h) return c.chain.hasBlock(h)
} }
// GetBlockSlotNumber returns the slot number of a block.
func (c *ChainService) GetBlockSlotNumber(h [32]byte) (uint64, error) {
block, err := c.chain.getBlock(h)
if err != nil {
return 0, fmt.Errorf("could not get block from DB: %v", err)
}
return block.SlotNumber(), nil
}
// CurrentCrystallizedState of the canonical chain. // CurrentCrystallizedState of the canonical chain.
func (c *ChainService) CurrentCrystallizedState() *types.CrystallizedState { func (c *ChainService) CurrentCrystallizedState() *types.CrystallizedState {
return c.chain.CrystallizedState() return c.chain.CrystallizedState()
@@ -228,14 +237,18 @@ func (c *ChainService) blockProcessing(done <-chan struct{}) {
case <-done: case <-done:
log.Debug("Chain service context closed, exiting goroutine") log.Debug("Chain service context closed, exiting goroutine")
return return
// Listen for a newly received incoming block from the sync service. // Listen for a newly received incoming attestation from the sync service.
case attestation := <-c.incomingAttestationChan: case attestation := <-c.incomingAttestationChan:
h, err := attestation.Hash() h, err := attestation.Hash()
if err != nil { if err != nil {
log.Debugf("Could not hash incoming attestation: %v", err) log.Debugf("Could not hash incoming attestation: %v", err)
} }
log.Info("Relaying attestation 0x%v to p2p service", h) if err := c.chain.saveAttestation(attestation); err != nil {
log.Errorf("Could not save attestation: %v", err)
continue
}
log.Infof("Relaying attestation 0x%x to subscriber", h)
// TODO: Send attestation to P2P and broadcast attestation to rest of the peers. // TODO: Send attestation to P2P and broadcast attestation to rest of the peers.
// Listen for a newly received incoming block from the sync service. // Listen for a newly received incoming block from the sync service.
@@ -260,7 +273,7 @@ func (c *ChainService) blockProcessing(done <-chan struct{}) {
log.Errorf("Could not check existence of parent: %v", err) log.Errorf("Could not check existence of parent: %v", err)
continue continue
} }
// Get parent slot number.
parentBlock, err := c.chain.getBlock(block.ParentHash()) parentBlock, err := c.chain.getBlock(block.ParentHash())
if err != nil { if err != nil {
log.Errorf("Could not get parent block: %v", err) log.Errorf("Could not get parent block: %v", err)
@@ -271,7 +284,7 @@ func (c *ChainService) blockProcessing(done <-chan struct{}) {
continue continue
} }
// If a candidate block exists and it is a lower slot, run theh fork choice rule. // If a candidate block exists and it is a lower slot, run the fork choice rule.
if c.candidateBlock != nilBlock && block.SlotNumber() > c.candidateBlock.SlotNumber() { if c.candidateBlock != nilBlock && block.SlotNumber() > c.candidateBlock.SlotNumber() {
c.updateHead() c.updateHead()
} }

View File

@@ -264,9 +264,9 @@ func TestRunningChainService(t *testing.T) {
CrystallizedStateHash: crystallizedStateHash[:], CrystallizedStateHash: crystallizedStateHash[:],
ParentHash: parentHash[:], ParentHash: parentHash[:],
PowChainRef: []byte("a"), PowChainRef: []byte("a"),
Attestations: []*pb.AttestationRecord{{ Attestations: []*pb.AggregatedAttestation{{
Slot: 0, Slot: 0,
AttesterBitfield: []byte{'A', 'B'}, AttesterBitfield: []byte{128, 0},
ShardId: 0, ShardId: 0,
}}, }},
}) })
@@ -284,6 +284,21 @@ func TestRunningChainService(t *testing.T) {
chainService.cancel() chainService.cancel()
exitRoutine <- true exitRoutine <- true
hash, err := block.Hash()
if err != nil {
t.Fatal("Can not hash the block")
}
slot, err := chainService.GetBlockSlotNumber(hash)
if err != nil {
t.Fatal("Can not get block slot number")
}
if slot != block.SlotNumber() {
t.Errorf("Block slot number mismatched, wanted 1, got slot %d", block.SlotNumber())
}
if _, err := chainService.GetBlockSlotNumber([32]byte{}); err == nil {
t.Fatal("Get block slot number should have failed with nil hash")
}
testutil.AssertLogsContain(t, hook, "Finished processing state for candidate block") testutil.AssertLogsContain(t, hook, "Finished processing state for candidate block")
} }
@@ -345,69 +360,6 @@ func TestUpdateHead(t *testing.T) {
} }
} }
func TestProcessingBlockWithAttestations(t *testing.T) {
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)
}
active := beaconChain.ActiveState()
activeHash, _ := active.Hash()
crystallized := beaconChain.CrystallizedState()
crystallizedHash, _ := crystallized.Hash()
cfg := &Config{
BeaconBlockBuf: 0,
BeaconDB: db.DB(),
Chain: beaconChain,
Web3Service: web3Service,
}
chainService, _ := NewChainService(ctx, cfg)
exitRoutine := make(chan bool)
go func() {
chainService.blockProcessing(chainService.ctx.Done())
<-exitRoutine
}()
parentBlock := types.NewBlock(nil)
if err := chainService.SaveBlock(parentBlock); err != nil {
t.Fatal(err)
}
parentHash, _ := parentBlock.Hash()
block := types.NewBlock(&pb.BeaconBlock{
SlotNumber: 2,
ActiveStateHash: activeHash[:],
CrystallizedStateHash: crystallizedHash[:],
ParentHash: parentHash[:],
PowChainRef: []byte("a"),
Attestations: []*pb.AttestationRecord{
{Slot: 0, ShardId: 0, AttesterBitfield: []byte{'0'}},
},
})
chainService.incomingBlockChan <- block
chainService.cancel()
exitRoutine <- true
}
func TestProcessingBlocks(t *testing.T) { func TestProcessingBlocks(t *testing.T) {
ctx := context.Background() ctx := context.Background()
config := &database.DBConfig{DataDir: "", Name: "", InMemory: true} config := &database.DBConfig{DataDir: "", Name: "", InMemory: true}
@@ -467,9 +419,9 @@ func TestProcessingBlocks(t *testing.T) {
SlotNumber: 4, SlotNumber: 4,
ActiveStateHash: activeStateHash[:], ActiveStateHash: activeStateHash[:],
CrystallizedStateHash: crystallizedStateHash[:], CrystallizedStateHash: crystallizedStateHash[:],
Attestations: []*pb.AttestationRecord{{ Attestations: []*pb.AggregatedAttestation{{
Slot: 0, Slot: 0,
AttesterBitfield: []byte{0, 0}, AttesterBitfield: []byte{16, 0},
ShardId: 0, ShardId: 0,
}}, }},
}) })
@@ -482,9 +434,9 @@ func TestProcessingBlocks(t *testing.T) {
block2 := types.NewBlock(&pb.BeaconBlock{ block2 := types.NewBlock(&pb.BeaconBlock{
ParentHash: block1Hash[:], ParentHash: block1Hash[:],
SlotNumber: 5, SlotNumber: 5,
Attestations: []*pb.AttestationRecord{ Attestations: []*pb.AggregatedAttestation{
{Slot: 0, AttesterBitfield: []byte{0, 0}, ShardId: 0}, {Slot: 0, AttesterBitfield: []byte{8, 0}, ShardId: 0},
{Slot: 1, AttesterBitfield: []byte{0, 0}, ShardId: 0}, {Slot: 1, AttesterBitfield: []byte{8, 0}, ShardId: 0},
}}) }})
block2Hash, err := block2.Hash() block2Hash, err := block2.Hash()
if err != nil { if err != nil {
@@ -495,10 +447,10 @@ func TestProcessingBlocks(t *testing.T) {
block3 := types.NewBlock(&pb.BeaconBlock{ block3 := types.NewBlock(&pb.BeaconBlock{
ParentHash: block2Hash[:], ParentHash: block2Hash[:],
SlotNumber: 6, SlotNumber: 6,
Attestations: []*pb.AttestationRecord{ Attestations: []*pb.AggregatedAttestation{
{Slot: 0, AttesterBitfield: []byte{0, 0}, ShardId: 0}, {Slot: 0, AttesterBitfield: []byte{4, 0}, ShardId: 0},
{Slot: 1, AttesterBitfield: []byte{0, 0}, ShardId: 0}, {Slot: 1, AttesterBitfield: []byte{4, 0}, ShardId: 0},
{Slot: 2, AttesterBitfield: []byte{0, 0}, ShardId: 0}, {Slot: 2, AttesterBitfield: []byte{4, 0}, ShardId: 0},
}}) }})
chainService.incomingBlockChan <- block1 chainService.incomingBlockChan <- block1
@@ -573,7 +525,7 @@ func TestProcessAttestationBadBlock(t *testing.T) {
SlotNumber: 1, SlotNumber: 1,
ActiveStateHash: activeStateHash[:], ActiveStateHash: activeStateHash[:],
CrystallizedStateHash: crystallizedStateHash[:], CrystallizedStateHash: crystallizedStateHash[:],
Attestations: []*pb.AttestationRecord{{ Attestations: []*pb.AggregatedAttestation{{
Slot: 10, Slot: 10,
AttesterBitfield: []byte{}, AttesterBitfield: []byte{},
ShardId: 0, ShardId: 0,
@@ -636,9 +588,9 @@ func TestEnterCycleTransition(t *testing.T) {
SlotNumber: 64, SlotNumber: 64,
ActiveStateHash: activeStateHash[:], ActiveStateHash: activeStateHash[:],
CrystallizedStateHash: crystallizedStateHash[:], CrystallizedStateHash: crystallizedStateHash[:],
Attestations: []*pb.AttestationRecord{{ Attestations: []*pb.AggregatedAttestation{{
Slot: 0, Slot: 0,
AttesterBitfield: []byte{0, 0}, AttesterBitfield: []byte{128, 0},
ShardId: 0, ShardId: 0,
}}, }},
}) })
@@ -708,6 +660,7 @@ func TestEnterDynastyTransition(t *testing.T) {
LastFinalizedSlot: 2, LastFinalizedSlot: 2,
ShardAndCommitteesForSlots: shardCommitteeForSlots, ShardAndCommitteesForSlots: shardCommitteeForSlots,
Validators: validators, Validators: validators,
LastStateRecalc: 150,
CrosslinkRecords: []*pb.CrosslinkRecord{ CrosslinkRecords: []*pb.CrosslinkRecord{
{Slot: 2}, {Slot: 2},
{Slot: 2}, {Slot: 2},
@@ -724,7 +677,7 @@ func TestEnterDynastyTransition(t *testing.T) {
active := types.NewActiveState( active := types.NewActiveState(
&pb.ActiveState{ &pb.ActiveState{
RecentBlockHashes: recentBlockhashes, RecentBlockHashes: recentBlockhashes,
PendingAttestations: []*pb.AttestationRecord{ PendingAttestations: []*pb.AggregatedAttestation{
{Slot: 100, AttesterBitfield: []byte{0}}, {Slot: 100, AttesterBitfield: []byte{0}},
{Slot: 101, AttesterBitfield: []byte{0}}, {Slot: 101, AttesterBitfield: []byte{0}},
{Slot: 102, AttesterBitfield: []byte{0}}, {Slot: 102, AttesterBitfield: []byte{0}},
@@ -758,9 +711,9 @@ func TestEnterDynastyTransition(t *testing.T) {
SlotNumber: params.MinDynastyLength + 1, SlotNumber: params.MinDynastyLength + 1,
ActiveStateHash: activeStateHash[:], ActiveStateHash: activeStateHash[:],
CrystallizedStateHash: crystallizedStateHash[:], CrystallizedStateHash: crystallizedStateHash[:],
Attestations: []*pb.AttestationRecord{{ Attestations: []*pb.AggregatedAttestation{{
Slot: 200, Slot: 200,
AttesterBitfield: []byte{0}, AttesterBitfield: []byte{32},
ShardId: 0, ShardId: 0,
}}, }},
}) })
@@ -778,3 +731,52 @@ func TestEnterDynastyTransition(t *testing.T) {
testutil.AssertLogsContain(t, hook, "Entering dynasty transition") testutil.AssertLogsContain(t, hook, "Entering dynasty transition")
} }
func TestIncomingAttestation(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)
exitRoutine := make(chan bool)
go func() {
chainService.blockProcessing(chainService.ctx.Done())
<-exitRoutine
}()
attestation := types.NewAttestation(
&pb.AggregatedAttestation{
Slot: 1,
ShardId: 1,
ShardBlockHash: []byte{'A'},
})
chainService.incomingAttestationChan <- attestation
chainService.cancel()
exitRoutine <- true
testutil.AssertLogsContain(t, hook, "Relaying attestation")
}

View File

@@ -11,7 +11,7 @@ var log = logrus.WithField("prefix", "casper")
// CalculateRewards adjusts validators balances by applying rewards or penalties // CalculateRewards adjusts validators balances by applying rewards or penalties
// based on FFG incentive structure. // based on FFG incentive structure.
func CalculateRewards(attestations []*pb.AttestationRecord, validators []*pb.ValidatorRecord, dynasty uint64, totalDeposit uint64) ([]*pb.ValidatorRecord, error) { func CalculateRewards(attestations []*pb.AggregatedAttestation, validators []*pb.ValidatorRecord, dynasty uint64, totalDeposit uint64) ([]*pb.ValidatorRecord, error) {
activeValidators := ActiveValidatorIndices(validators, dynasty) activeValidators := ActiveValidatorIndices(validators, dynasty)
attesterDeposits := GetAttestersTotalDeposit(attestations) attesterDeposits := GetAttestersTotalDeposit(attestations)

View File

@@ -22,7 +22,7 @@ func TestComputeValidatorRewardsAndPenalties(t *testing.T) {
} }
// Binary representation of bitfield: 11001000 10010100 10010010 10110011 00110001 // Binary representation of bitfield: 11001000 10010100 10010010 10110011 00110001
testAttesterBitfield := []*pb.AttestationRecord{{AttesterBitfield: []byte{200, 148, 146, 179, 49}}} testAttesterBitfield := []*pb.AggregatedAttestation{{AttesterBitfield: []byte{200, 148, 146, 179, 49}}}
rewardedValidators, err := CalculateRewards( rewardedValidators, err := CalculateRewards(
testAttesterBitfield, testAttesterBitfield,
data.Validators, data.Validators,

View File

@@ -92,12 +92,10 @@ func SampleAttestersAndProposers(seed common.Hash, validators []*pb.ValidatorRec
} }
// GetAttestersTotalDeposit from the pending attestations. // GetAttestersTotalDeposit from the pending attestations.
func GetAttestersTotalDeposit(attestations []*pb.AttestationRecord) uint64 { func GetAttestersTotalDeposit(attestations []*pb.AggregatedAttestation) uint64 {
var numOfBits int var numOfBits int
for _, attestation := range attestations { for _, attestation := range attestations {
for _, byte := range attestation.AttesterBitfield { numOfBits += int(utils.BitSetCount(attestation.AttesterBitfield))
numOfBits += int(utils.BitSetCount(byte))
}
} }
// Assume there's no slashing condition, the following logic will change later phase. // Assume there's no slashing condition, the following logic will change later phase.
return uint64(numOfBits) * params.DefaultBalance return uint64(numOfBits) * params.DefaultBalance
@@ -113,7 +111,7 @@ func GetShardAndCommitteesForSlot(shardCommittees []*pb.ShardAndCommitteeArray,
// AreAttesterBitfieldsValid validates that the length of the attester bitfield matches the attester indices // AreAttesterBitfieldsValid validates that the length of the attester bitfield matches the attester indices
// defined in the Crystallized State. // defined in the Crystallized State.
func AreAttesterBitfieldsValid(attestation *pb.AttestationRecord, attesterIndices []uint32) bool { func AreAttesterBitfieldsValid(attestation *pb.AggregatedAttestation, attesterIndices []uint32) bool {
// Validate attester bit field has the correct length. // Validate attester bit field has the correct length.
if utils.BitLength(len(attesterIndices)) != len(attestation.AttesterBitfield) { if utils.BitLength(len(attesterIndices)) != len(attestation.AttesterBitfield) {
log.Debugf("attestation has incorrect bitfield length. Found %v, expected %v", log.Debugf("attestation has incorrect bitfield length. Found %v, expected %v",
@@ -137,3 +135,24 @@ func AreAttesterBitfieldsValid(attestation *pb.AttestationRecord, attesterIndice
return true return true
} }
// GetProposerIndexAndShard returns the index and the shardID of a proposer from a given slot.
func GetProposerIndexAndShard(shardCommittees []*pb.ShardAndCommitteeArray, lcs uint64, slot uint64) (uint64, uint64, error) {
if lcs < params.CycleLength {
lcs = 0
} else {
lcs = lcs - params.CycleLength
}
slotCommittees, err := GetShardAndCommitteesForSlot(
shardCommittees,
lcs,
slot)
if err != nil {
return 0, 0, err
}
proposerShardID := slotCommittees.ArrayShardAndCommittee[0].ShardId
proposerIndex := slot % uint64(len(slotCommittees.ArrayShardAndCommittee[0].Committee))
return proposerShardID, proposerIndex, nil
}

View File

@@ -67,7 +67,7 @@ func TestRotateValidatorSet(t *testing.T) {
func TestHasVoted(t *testing.T) { func TestHasVoted(t *testing.T) {
// Setting bit field to 11111111. // Setting bit field to 11111111.
pendingAttestation := &pb.AttestationRecord{ pendingAttestation := &pb.AggregatedAttestation{
AttesterBitfield: []byte{255}, AttesterBitfield: []byte{255},
} }
@@ -79,7 +79,7 @@ func TestHasVoted(t *testing.T) {
} }
// Setting bit field to 01010101. // Setting bit field to 01010101.
pendingAttestation = &pb.AttestationRecord{ pendingAttestation = &pb.AggregatedAttestation{
AttesterBitfield: []byte{85}, AttesterBitfield: []byte{85},
} }
@@ -141,7 +141,7 @@ func TestValidatorIndices(t *testing.T) {
} }
func TestAreAttesterBitfieldsValid(t *testing.T) { func TestAreAttesterBitfieldsValid(t *testing.T) {
attestation := &pb.AttestationRecord{ attestation := &pb.AggregatedAttestation{
AttesterBitfield: []byte{'F'}, AttesterBitfield: []byte{'F'},
} }
@@ -154,7 +154,7 @@ func TestAreAttesterBitfieldsValid(t *testing.T) {
} }
func TestAreAttesterBitfieldsValidFalse(t *testing.T) { func TestAreAttesterBitfieldsValidFalse(t *testing.T) {
attestation := &pb.AttestationRecord{ attestation := &pb.AggregatedAttestation{
AttesterBitfield: []byte{'F', 'F'}, AttesterBitfield: []byte{'F', 'F'},
} }
@@ -167,7 +167,7 @@ func TestAreAttesterBitfieldsValidFalse(t *testing.T) {
} }
func TestAreAttesterBitfieldsValidZerofill(t *testing.T) { func TestAreAttesterBitfieldsValidZerofill(t *testing.T) {
attestation := &pb.AttestationRecord{ attestation := &pb.AggregatedAttestation{
AttesterBitfield: []byte{'F'}, AttesterBitfield: []byte{'F'},
} }
@@ -180,7 +180,7 @@ func TestAreAttesterBitfieldsValidZerofill(t *testing.T) {
} }
func TestAreAttesterBitfieldsValidNoZerofill(t *testing.T) { func TestAreAttesterBitfieldsValidNoZerofill(t *testing.T) {
attestation := &pb.AttestationRecord{ attestation := &pb.AggregatedAttestation{
AttesterBitfield: []byte{'E'}, AttesterBitfield: []byte{'E'},
} }
@@ -191,3 +191,24 @@ func TestAreAttesterBitfieldsValidNoZerofill(t *testing.T) {
t.Fatalf("expected validation to fail for bitfield %v and indices %v", attestation, indices) t.Fatalf("expected validation to fail for bitfield %v and indices %v", attestation, indices)
} }
} }
func TestGetProposerIndexAndShard(t *testing.T) {
shardCommittees := []*pb.ShardAndCommitteeArray{
{ArrayShardAndCommittee: []*pb.ShardAndCommittee{
{ShardId: 99, Committee: []uint32{0, 1, 2, 3, 4}},
}},
}
if _, _, err := GetProposerIndexAndShard(shardCommittees, 100, 0); err == nil {
t.Error("GetProposerIndexAndShard should have failed with invalid lcs")
}
shardID, index, err := GetProposerIndexAndShard(shardCommittees, 0, 0)
if err != nil {
t.Fatalf("GetProposerIndexAndShard failed with %v", err)
}
if shardID != 99 {
t.Errorf("Invalid shard ID. Wanted 99, got %d", shardID)
}
if index != 0 {
t.Errorf("Invalid proposer index. Wanted 0, got %d", index)
}
}

View File

@@ -254,7 +254,7 @@ func TestAttestHead(t *testing.T) {
ChainService: mockChain, ChainService: mockChain,
}) })
req := &pb.AttestRequest{ req := &pb.AttestRequest{
Attestation: &pbp2p.AttestationRecord{ Attestation: &pbp2p.AggregatedAttestation{
Slot: 999, Slot: 999,
ShardId: 1, ShardId: 1,
ShardBlockHash: []byte{'a'}, ShardBlockHash: []byte{'a'},

View File

@@ -214,7 +214,7 @@ func (sim *Simulator) run(delayChan <-chan time.Time, done <-chan struct{}) {
} }
log.Debugf("Responding to full block request for hash: 0x%x", h) log.Debugf("Responding to full block request for hash: 0x%x", h)
// Sends the full block body to the requester. // Sends the full block body to the requester.
res := &pb.BeaconBlockResponse{Block: block.Proto()} res := &pb.BeaconBlockResponse{Block: block.Proto(), Attestation: nil}
sim.p2p.Send(res, msg.Peer) sim.p2p.Send(res, msg.Peer)
} }
} }

View File

@@ -6,6 +6,7 @@ go_library(
importpath = "github.com/prysmaticlabs/prysm/beacon-chain/sync", importpath = "github.com/prysmaticlabs/prysm/beacon-chain/sync",
visibility = ["//beacon-chain:__subpackages__"], visibility = ["//beacon-chain:__subpackages__"],
deps = [ deps = [
"//beacon-chain/casper:go_default_library",
"//beacon-chain/types:go_default_library", "//beacon-chain/types:go_default_library",
"//proto/beacon/p2p/v1:go_default_library", "//proto/beacon/p2p/v1:go_default_library",
"//shared/p2p:go_default_library", "//shared/p2p:go_default_library",

View File

@@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/event"
"github.com/prysmaticlabs/prysm/beacon-chain/casper"
"github.com/prysmaticlabs/prysm/beacon-chain/types" "github.com/prysmaticlabs/prysm/beacon-chain/types"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/p2p" "github.com/prysmaticlabs/prysm/shared/p2p"
@@ -18,8 +19,11 @@ type chainService interface {
ContainsBlock(h [32]byte) (bool, error) ContainsBlock(h [32]byte) (bool, error)
HasStoredState() (bool, error) HasStoredState() (bool, error)
IncomingBlockFeed() *event.Feed IncomingBlockFeed() *event.Feed
IncomingAttestationFeed() *event.Feed
CheckForCanonicalBlockBySlot(slotnumber uint64) (bool, error) CheckForCanonicalBlockBySlot(slotnumber uint64) (bool, error)
GetCanonicalBlockBySlotNumber(slotnumber uint64) (*types.Block, error) GetCanonicalBlockBySlotNumber(slotnumber uint64) (*types.Block, error)
GetBlockSlotNumber(h [32]byte) (uint64, error)
CurrentCrystallizedState() *types.CrystallizedState
} }
// Service is the gateway and the bridge between the p2p network and the local beacon chain. // Service is the gateway and the bridge between the p2p network and the local beacon chain.
@@ -158,12 +162,14 @@ func (ss *Service) run() {
log.Error("Received malformed beacon block p2p message") log.Error("Received malformed beacon block p2p message")
continue continue
} }
block := types.NewBlock(response.Block) block := types.NewBlock(response.Block)
h, err := block.Hash() blockHash, err := block.Hash()
if err != nil { if err != nil {
log.Errorf("Could not hash received block: %v", err) log.Errorf("Could not hash received block: %v", err)
} }
blockExists, err := ss.chainService.ContainsBlock(h)
blockExists, err := ss.chainService.ContainsBlock(blockHash)
if err != nil { if err != nil {
log.Errorf("Can not check for block in DB: %v", err) log.Errorf("Can not check for block in DB: %v", err)
continue continue
@@ -171,9 +177,30 @@ func (ss *Service) run() {
if blockExists { if blockExists {
continue continue
} }
log.WithField("blockHash", fmt.Sprintf("0x%x", h)).Debug("Sending newly received block to subscribers")
// We send out a message over a feed. // Verify attestation coming from proposer then forward block to the subscribers.
attestation := types.NewAttestation(response.Attestation)
cState := ss.chainService.CurrentCrystallizedState()
parentSlot, err := ss.chainService.GetBlockSlotNumber(block.ParentHash())
if err != nil {
log.Errorf("Failed to get parent slot: %v", err)
continue
}
proposerShardID, _, err := casper.GetProposerIndexAndShard(cState.ShardAndCommitteesForSlots(), cState.LastStateRecalc(), parentSlot)
if err != nil {
log.Errorf("Failed to get proposer shard ID: %v", err)
continue
}
if err := attestation.VerifyAttestation(proposerShardID); err != nil {
log.Errorf("Failed to verify proposer attestation: %v", err)
continue
}
log.WithField("blockHash", fmt.Sprintf("0x%x", blockHash)).Debug("Sending newly received block to subscribers")
ss.chainService.IncomingBlockFeed().Send(block) ss.chainService.IncomingBlockFeed().Send(block)
log.WithField("attestationHash", fmt.Sprintf("0x%x", attestation.Key())).Debug("Sending newly received attestation to subscribers")
ss.chainService.IncomingAttestationFeed().Send(attestation)
case msg := <-ss.blockRequestBySlot: case msg := <-ss.blockRequestBySlot:
request, ok := msg.Data.(*pb.BeaconBlockRequestBySlotNumber) request, ok := msg.Data.(*pb.BeaconBlockRequestBySlotNumber)
if !ok { if !ok {

View File

@@ -3,6 +3,7 @@ package sync
import ( import (
"context" "context"
"errors" "errors"
"fmt"
"io/ioutil" "io/ioutil"
"testing" "testing"
@@ -52,6 +53,22 @@ func (ms *mockChainService) IncomingBlockFeed() *event.Feed {
return new(event.Feed) return new(event.Feed)
} }
func (ms *mockChainService) IncomingAttestationFeed() *event.Feed {
return new(event.Feed)
}
func (ms *mockChainService) CurrentCrystallizedState() *types.CrystallizedState {
cState, err := types.NewGenesisCrystallizedState()
if err != nil {
fmt.Println(err)
}
return cState
}
func (ms *mockChainService) GetBlockSlotNumber(h [32]byte) (uint64, error) {
return 0, nil
}
func (ms *mockChainService) CheckForCanonicalBlockBySlot(slotnumber uint64) (bool, error) { func (ms *mockChainService) CheckForCanonicalBlockBySlot(slotnumber uint64) (bool, error) {
if ms.checkError { if ms.checkError {
return ms.slotExists, errors.New("mock check canonical block error") return ms.slotExists, errors.New("mock check canonical block error")
@@ -121,9 +138,15 @@ func TestProcessBlock(t *testing.T) {
PowChainRef: []byte{1, 2, 3, 4, 5}, PowChainRef: []byte{1, 2, 3, 4, 5},
ParentHash: make([]byte, 32), ParentHash: make([]byte, 32),
} }
attestation := &pb.AggregatedAttestation{
Slot: 0,
ShardId: 0,
ShardBlockHash: []byte{'A'},
}
responseBlock := &pb.BeaconBlockResponse{ responseBlock := &pb.BeaconBlockResponse{
Block: data, Block: data,
Attestation: attestation,
} }
msg := p2p.Message{ msg := p2p.Message{
@@ -316,6 +339,10 @@ func (ms *mockEmptyChainService) IncomingBlockFeed() *event.Feed {
return new(event.Feed) return new(event.Feed)
} }
func (ms *mockEmptyChainService) IncomingAttestationFeed() *event.Feed {
return new(event.Feed)
}
func (ms *mockEmptyChainService) setState(flag bool) { func (ms *mockEmptyChainService) setState(flag bool) {
ms.hasStoredState = flag ms.hasStoredState = flag
} }
@@ -328,6 +355,14 @@ func (ms *mockEmptyChainService) GetCanonicalBlockBySlotNumber(slotnumber uint64
return nil, nil return nil, nil
} }
func (ms *mockEmptyChainService) CurrentCrystallizedState() *types.CrystallizedState {
return types.NewCrystallizedState(nil)
}
func (ms *mockEmptyChainService) GetBlockSlotNumber(h [32]byte) (uint64, error) {
return 0, nil
}
func TestStartEmptyState(t *testing.T) { func TestStartEmptyState(t *testing.T) {
hook := logTest.NewGlobal() hook := logTest.NewGlobal()
cfg := DefaultConfig() cfg := DefaultConfig()

View File

@@ -29,7 +29,7 @@ func NewGenesisActiveState() *ActiveState {
return &ActiveState{ return &ActiveState{
data: &pb.ActiveState{ data: &pb.ActiveState{
PendingAttestations: []*pb.AttestationRecord{}, PendingAttestations: []*pb.AggregatedAttestation{},
RecentBlockHashes: recentBlockHashes, RecentBlockHashes: recentBlockHashes,
}, },
blockVoteCache: make(map[[32]byte]*VoteCache), blockVoteCache: make(map[[32]byte]*VoteCache),
@@ -65,7 +65,7 @@ func (a *ActiveState) Hash() ([32]byte, error) {
} }
// PendingAttestations returns attestations that have not yet been processed. // PendingAttestations returns attestations that have not yet been processed.
func (a *ActiveState) PendingAttestations() []*pb.AttestationRecord { func (a *ActiveState) PendingAttestations() []*pb.AggregatedAttestation {
return a.data.PendingAttestations return a.data.PendingAttestations
} }
@@ -89,9 +89,9 @@ func (a *ActiveState) GetBlockVoteCache() map[[32]byte]*VoteCache {
return a.blockVoteCache return a.blockVoteCache
} }
func (a *ActiveState) calculateNewAttestations(add []*pb.AttestationRecord, lastStateRecalc uint64) []*pb.AttestationRecord { func (a *ActiveState) calculateNewAttestations(add []*pb.AggregatedAttestation, lastStateRecalc uint64) []*pb.AggregatedAttestation {
existing := a.data.PendingAttestations existing := a.data.PendingAttestations
update := []*pb.AttestationRecord{} update := []*pb.AggregatedAttestation{}
for i := 0; i < len(existing); i++ { for i := 0; i < len(existing); i++ {
if existing[i].GetSlot() >= lastStateRecalc { if existing[i].GetSlot() >= lastStateRecalc {
update = append(update, existing[i]) update = append(update, existing[i])
@@ -198,7 +198,7 @@ func (a *ActiveState) CalculateNewActiveState(block *Block, cState *Crystallized
} }
// getSignedParentHashes returns all the parent hashes stored in active state up to last cycle length. // getSignedParentHashes returns all the parent hashes stored in active state up to last cycle length.
func (a *ActiveState) getSignedParentHashes(block *Block, attestation *pb.AttestationRecord) [][32]byte { func (a *ActiveState) getSignedParentHashes(block *Block, attestation *pb.AggregatedAttestation) [][32]byte {
var signedParentHashes [][32]byte var signedParentHashes [][32]byte
start := block.SlotNumber() - attestation.Slot start := block.SlotNumber() - attestation.Slot
end := block.SlotNumber() - attestation.Slot - uint64(len(attestation.ObliqueParentHashes)) + params.CycleLength end := block.SlotNumber() - attestation.Slot - uint64(len(attestation.ObliqueParentHashes)) + params.CycleLength

View File

@@ -26,7 +26,7 @@ func TestGenesisActiveState(t *testing.T) {
func TestUpdateAttestations(t *testing.T) { func TestUpdateAttestations(t *testing.T) {
aState := NewGenesisActiveState() aState := NewGenesisActiveState()
newAttestations := []*pb.AttestationRecord{ newAttestations := []*pb.AggregatedAttestation{
{ {
Slot: 0, Slot: 0,
ShardId: 0, ShardId: 0,
@@ -45,7 +45,7 @@ func TestUpdateAttestations(t *testing.T) {
func TestUpdateAttestationsAfterRecalc(t *testing.T) { func TestUpdateAttestationsAfterRecalc(t *testing.T) {
aState := NewActiveState(&pb.ActiveState{ aState := NewActiveState(&pb.ActiveState{
PendingAttestations: []*pb.AttestationRecord{ PendingAttestations: []*pb.AggregatedAttestation{
{ {
Slot: 0, Slot: 0,
ShardId: 0, ShardId: 0,
@@ -57,7 +57,7 @@ func TestUpdateAttestationsAfterRecalc(t *testing.T) {
}, },
}, nil) }, nil)
newAttestations := []*pb.AttestationRecord{ newAttestations := []*pb.AggregatedAttestation{
{ {
Slot: 10, Slot: 10,
ShardId: 2, ShardId: 2,
@@ -138,7 +138,7 @@ func TestBlockVoteCache(t *testing.T) {
} }
block := NewBlock(&pb.BeaconBlock{ block := NewBlock(&pb.BeaconBlock{
SlotNumber: 1, SlotNumber: 1,
Attestations: []*pb.AttestationRecord{ Attestations: []*pb.AggregatedAttestation{
{ {
Slot: 0, Slot: 0,
ShardId: 0, ShardId: 0,
@@ -185,7 +185,7 @@ func TestCalculateNewActiveState(t *testing.T) {
} }
aState := NewActiveState(&pb.ActiveState{ aState := NewActiveState(&pb.ActiveState{
PendingAttestations: []*pb.AttestationRecord{ PendingAttestations: []*pb.AggregatedAttestation{
{ {
Slot: 0, Slot: 0,
ShardId: 0, ShardId: 0,

View File

@@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/prysmaticlabs/prysm/beacon-chain/params"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"golang.org/x/crypto/blake2b" "golang.org/x/crypto/blake2b"
) )
@@ -13,15 +14,15 @@ import (
// Attestation is the primary source of load on the beacon chain, it's used to // 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. // attest to some parent block in the chain and block hash in a shard.
type Attestation struct { type Attestation struct {
data *pb.AttestationRecord data *pb.AggregatedAttestation
} }
// NewAttestation explicitly sets the data field of a attestation. // NewAttestation explicitly sets the data field of a attestation.
// Return attestation with default fields if data is nil. // Return attestation with default fields if data is nil.
func NewAttestation(data *pb.AttestationRecord) *Attestation { func NewAttestation(data *pb.AggregatedAttestation) *Attestation {
if data == nil { if data == nil {
return &Attestation{ return &Attestation{
data: &pb.AttestationRecord{ data: &pb.AggregatedAttestation{
Slot: 0, Slot: 0,
ShardId: 0, ShardId: 0,
JustifiedSlot: 0, JustifiedSlot: 0,
@@ -37,7 +38,7 @@ func NewAttestation(data *pb.AttestationRecord) *Attestation {
} }
// Proto returns the underlying protobuf data. // Proto returns the underlying protobuf data.
func (a *Attestation) Proto() *pb.AttestationRecord { func (a *Attestation) Proto() *pb.AggregatedAttestation {
return a.data return a.data
} }
@@ -121,3 +122,43 @@ func (a *Attestation) ObliqueParentHashes() [][32]byte {
func (a *Attestation) AggregateSig() []uint64 { func (a *Attestation) AggregateSig() []uint64 {
return a.data.AggregateSig return a.data.AggregateSig
} }
// VerifyAttestation verifies the proposer's attestation of the block.
// Proposers broadcast the attestation along with the block to its peers.
func (a *Attestation) VerifyAttestation(proposerShardID uint64) error {
// Verify the attestation attached with block response.
// Get proposer index and shardID.
attestationMsg := AttestationMsg(
a.ObliqueParentHashes(),
a.ShardBlockHash(),
a.SlotNumber(),
proposerShardID,
a.JustifiedSlotNumber())
log.Infof("Constructed attestation message for incoming block 0x%x", attestationMsg)
// TODO(#258): use attestationMsg to verify against signature and public key. Return error if incorrect.
log.Info("successfully verified attestation with incoming block")
return nil
}
// AttestationMsg hashes parentHashes + shardID + slotNumber + shardBlockHash + justifiedSlot
// into a message to use for verifying with aggregated public key and signature.
func AttestationMsg(parentHashes [][32]byte, blockHash []byte, slot uint64, shardID uint64, justifiedSlot uint64) [32]byte {
msg := make([]byte, binary.MaxVarintLen64)
binary.PutUvarint(msg, slot%params.CycleLength)
for _, parentHash := range parentHashes {
msg = append(msg, parentHash[:]...)
}
binary.PutUvarint(msg, shardID)
msg = append(msg, blockHash...)
binary.PutUvarint(msg, justifiedSlot)
var hashMsg [32]byte
h := blake2b.Sum512(msg)
copy(hashMsg[:], h[:32])
return hashMsg
}

View File

@@ -9,7 +9,7 @@ import (
) )
func TestAttestation(t *testing.T) { func TestAttestation(t *testing.T) {
data := &pb.AttestationRecord{ data := &pb.AggregatedAttestation{
Slot: 0, Slot: 0,
ShardId: 0, ShardId: 0,
JustifiedSlot: 0, JustifiedSlot: 0,
@@ -52,4 +52,7 @@ func TestAttestation(t *testing.T) {
if !bytes.Equal(attestation.ShardBlockHash(), []byte{0}) { if !bytes.Equal(attestation.ShardBlockHash(), []byte{0}) {
t.Errorf("mismatched shard block hash") t.Errorf("mismatched shard block hash")
} }
if err := attestation.VerifyAttestation(0); err != nil {
t.Errorf("verify attestation failed: %v", err)
}
} }

View File

@@ -2,7 +2,6 @@
package types package types
import ( import (
"encoding/binary"
"fmt" "fmt"
"time" "time"
@@ -125,7 +124,7 @@ func (b *Block) AttestationCount() int {
} }
// Attestations returns an array of attestations in the block. // Attestations returns an array of attestations in the block.
func (b *Block) Attestations() []*pb.AttestationRecord { func (b *Block) Attestations() []*pb.AggregatedAttestation {
return b.data.Attestations return b.data.Attestations
} }
@@ -142,34 +141,49 @@ func (b *Block) isSlotValid() bool {
return clock.Now().After(validTimeThreshold) return clock.Now().After(validTimeThreshold)
} }
// IsValid is called to decide if an incoming p2p block can be processed. // IsValid is called to decide if an incoming p2p block can be processed. It checks for following conditions:
// It checks the slot against the system clock, and the validity of the included attestations. // 1.) Ensure parent processed.
// Existence of the parent block and the PoW chain block is checked outside of this function because they require additional dependencies. // 2.) Ensure pow_chain_ref processed.
// 3.) Ensure local time is large enough to process this block's slot.
// 4.) Verify that the parent block's proposer's attestation is included.
func (b *Block) IsValid(aState *ActiveState, cState *CrystallizedState, parentSlot uint64) bool { func (b *Block) IsValid(aState *ActiveState, cState *CrystallizedState, parentSlot uint64) bool {
_, err := b.Hash() _, err := b.Hash()
if err != nil { if err != nil {
log.Debugf("Could not hash incoming block: %v", err) log.Errorf("Could not hash incoming block: %v", err)
return false return false
} }
if b.SlotNumber() == 0 { if b.SlotNumber() == 0 {
log.Debug("Can not process a genesis block") log.Error("Can not process a genesis block")
return false return false
} }
if !b.isSlotValid() { if !b.isSlotValid() {
log.Debugf("slot of block is too high: %d", b.SlotNumber()) log.Errorf("Slot of block is too high: %d", b.SlotNumber())
return false return false
} }
// verify proposer from last slot is in one of the AggregatedAttestation.
var proposerAttested bool
_, proposerIndex, err := casper.GetProposerIndexAndShard(
cState.ShardAndCommitteesForSlots(),
cState.LastStateRecalc(),
parentSlot)
if err != nil {
log.Errorf("Can not get proposer index %v", err)
return false
}
for index, attestation := range b.Attestations() { for index, attestation := range b.Attestations() {
if !b.isAttestationValid(index, aState, cState, parentSlot) { if !b.isAttestationValid(index, aState, cState, parentSlot) {
log.Debugf("attestation invalid: %v", attestation) log.Debugf("attestation invalid: %v", attestation)
return false return false
} }
if utils.BitSetCount(attestation.AttesterBitfield) == 1 && utils.CheckBit(attestation.AttesterBitfield, int(proposerIndex)) {
proposerAttested = true
}
} }
return true return proposerAttested
} }
// isAttestationValid validates an attestation in a block. // isAttestationValid validates an attestation in a block.
@@ -207,26 +221,18 @@ func (b *Block) isAttestationValid(attestationIndex int, aState *ActiveState, cS
// TODO(#258): Generate validators aggregated pub key. // TODO(#258): Generate validators aggregated pub key.
// Hash parentHashes + shardID + slotNumber + shardBlockHash into a message to use to attestationMsg := AttestationMsg(
// to verify with aggregated public key and aggregated attestation signature. parentHashes,
msg := make([]byte, binary.MaxVarintLen64) attestation.ShardBlockHash,
var signedHashesStr []byte attestation.Slot,
for _, parentHash := range parentHashes { attestation.ShardId,
signedHashesStr = append(signedHashesStr, parentHash[:]...) attestation.JustifiedSlot)
signedHashesStr = append(signedHashesStr, byte(' '))
}
binary.PutUvarint(msg, attestation.Slot%params.CycleLength)
msg = append(msg, signedHashesStr...)
binary.PutUvarint(msg, attestation.ShardId)
msg = append(msg, attestation.ShardBlockHash...)
binary.PutUvarint(msg, attestation.JustifiedSlot)
msgHash := blake2b.Sum512(msg)
log.Debugf("Attestation message for shard: %v, slot %v, block hash %v is: %v", log.Debugf("Attestation message for shard: %v, slot %v, block hash %v is: %v",
attestation.ShardId, attestation.Slot, attestation.ShardBlockHash, msgHash) attestation.ShardId, attestation.Slot, attestation.ShardBlockHash, attestationMsg)
// TODO(#258): Verify msgHash against aggregated pub key and aggregated signature. // TODO(#258): Verify msgHash against aggregated pub key and aggregated signature.
return true return true
} }

View File

@@ -76,12 +76,12 @@ func TestBlockValidity(t *testing.T) {
b := NewBlock(&pb.BeaconBlock{ b := NewBlock(&pb.BeaconBlock{
SlotNumber: 1, SlotNumber: 1,
Attestations: []*pb.AttestationRecord{ Attestations: []*pb.AggregatedAttestation{
{ {
Slot: 0, Slot: 0,
ShardId: 0, ShardId: 0,
JustifiedSlot: 0, JustifiedSlot: 0,
AttesterBitfield: []byte{8, 8}, AttesterBitfield: []byte{64, 0},
}, },
}, },
}) })

View File

@@ -205,7 +205,7 @@ func (c *CrystallizedState) isDynastyTransition(slotNumber uint64) bool {
} }
// getAttesterIndices fetches the attesters for a given attestation record. // getAttesterIndices fetches the attesters for a given attestation record.
func (c *CrystallizedState) getAttesterIndices(attestation *pb.AttestationRecord) ([]uint32, error) { func (c *CrystallizedState) getAttesterIndices(attestation *pb.AggregatedAttestation) ([]uint32, error) {
slotsStart := int64(c.LastStateRecalc()) - params.CycleLength slotsStart := int64(c.LastStateRecalc()) - params.CycleLength
slotIndex := (int64(attestation.Slot) - slotsStart) % params.CycleLength slotIndex := (int64(attestation.Slot) - slotsStart) % params.CycleLength
// TODO(#267): ShardAndCommitteesForSlots will return default value because the spec for dynasty transition is not finalized. // TODO(#267): ShardAndCommitteesForSlots will return default value because the spec for dynasty transition is not finalized.
@@ -351,7 +351,7 @@ func copyCrosslinks(existing []*pb.CrosslinkRecord) []*pb.CrosslinkRecord {
// processCrosslinks checks if the proposed shard block has recevied // processCrosslinks checks if the proposed shard block has recevied
// 2/3 of the votes. If yes, we update crosslink record to point to // 2/3 of the votes. If yes, we update crosslink record to point to
// the proposed shard block with latest dynasty and slot numbers. // the proposed shard block with latest dynasty and slot numbers.
func (c *CrystallizedState) processCrosslinks(pendingAttestations []*pb.AttestationRecord, slot uint64) ([]*pb.CrosslinkRecord, error) { func (c *CrystallizedState) processCrosslinks(pendingAttestations []*pb.AggregatedAttestation, slot uint64) ([]*pb.CrosslinkRecord, error) {
validators := c.data.Validators validators := c.data.Validators
dynasty := c.data.CurrentDynasty dynasty := c.data.CurrentDynasty
crosslinkRecords := copyCrosslinks(c.data.CrosslinkRecords) crosslinkRecords := copyCrosslinks(c.data.CrosslinkRecords)

View File

@@ -144,7 +144,7 @@ func TestProcessCrosslinks(t *testing.T) {
} }
// Set up pending attestations. // Set up pending attestations.
pAttestations := []*pb.AttestationRecord{ pAttestations := []*pb.AggregatedAttestation{
{ {
Slot: 0, Slot: 0,
ShardId: 0, ShardId: 0,

View File

@@ -38,6 +38,7 @@ type BlockChainService interface {
HasStoredState() (bool, error) HasStoredState() (bool, error)
ContainsBlock(h [32]byte) (bool, error) ContainsBlock(h [32]byte) (bool, error)
SaveBlock(b *Block) error SaveBlock(b *Block) error
GetBlockSlotNumber(h [32]byte) (uint64, error)
} }
// CrystallizedStateChainService is the interface for crystallized state related functions in local beacon chain. // CrystallizedStateChainService is the interface for crystallized state related functions in local beacon chain.

View File

@@ -16,13 +16,17 @@ func CheckBit(bitfield []byte, index int) bool {
// BitSetCount counts the number of 1s in a byte using the following algo: // BitSetCount counts the number of 1s in a byte using the following algo:
// https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel // https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
func BitSetCount(v byte) byte { func BitSetCount(bytes []byte) int {
v = (v & 0x55) + ((v >> 1) & 0x55) var total int
v = (v & 0x33) + ((v >> 2) & 0x33) for _, b := range bytes {
return (v + (v >> 4)) & 0xF b = (b & 0x55) + ((b >> 1) & 0x55)
b = (b & 0x33) + ((b >> 2) & 0x33)
total += int((b + (b >> 4)) & 0xF)
}
return total
} }
// BitLength returns the length of the bitfield for a given number of attesters in bytes. // BitLength returns the length of the bitfield for a giben number of attesters in bytes.
func BitLength(b int) int { func BitLength(b int) int {
return (b + 7) / 8 return (b + 7) / 8
} }

View File

@@ -36,8 +36,8 @@ func TestBitSetCount(t *testing.T) {
{a: 49, b: 3}, //00110001 {a: 49, b: 3}, //00110001
} }
for _, tt := range tests { for _, tt := range tests {
if int(BitSetCount(tt.a)) != tt.b { if int(BitSetCount([]byte{tt.a})) != tt.b {
t.Errorf("BitSetCount(%d) = %v, want = %d", tt.a, int(BitSetCount(tt.a)), tt.b) t.Errorf("BitSetCount(%d) = %v, want = %d", tt.a, int(BitSetCount([]byte{tt.a})), tt.b)
} }
} }
} }

View File

@@ -26,4 +26,4 @@ For example, when we build the testing go proto library
generated at generated at
`bazel-bin/proto/testing/linux_amd64_stripped/ethereum_testing_go_proto\~/github.com/prysmaticlabs/prysm/proto/testing/test.pb.go`. `bazel-bin/proto/testing/linux_amd64_stripped/ethereum_testing_go_proto\~/github.com/prysmaticlabs/prysm/proto/testing/test.pb.go`.
This generated file can be copied, or you can use you protoc locally if you This generated file can be copied, or you can use you protoc locally if you
prefer. prefer.

View File

@@ -66,7 +66,7 @@ func (x Topic) String() string {
return proto.EnumName(Topic_name, int32(x)) return proto.EnumName(Topic_name, int32(x))
} }
func (Topic) EnumDescriptor() ([]byte, []int) { func (Topic) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{0} return fileDescriptor_messages_facf6369f1deca1c, []int{0}
} }
type BeaconBlockHashAnnounce struct { type BeaconBlockHashAnnounce struct {
@@ -80,7 +80,7 @@ func (m *BeaconBlockHashAnnounce) Reset() { *m = BeaconBlockHashAnnounce
func (m *BeaconBlockHashAnnounce) String() string { return proto.CompactTextString(m) } func (m *BeaconBlockHashAnnounce) String() string { return proto.CompactTextString(m) }
func (*BeaconBlockHashAnnounce) ProtoMessage() {} func (*BeaconBlockHashAnnounce) ProtoMessage() {}
func (*BeaconBlockHashAnnounce) Descriptor() ([]byte, []int) { func (*BeaconBlockHashAnnounce) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{0} return fileDescriptor_messages_facf6369f1deca1c, []int{0}
} }
func (m *BeaconBlockHashAnnounce) XXX_Unmarshal(b []byte) error { func (m *BeaconBlockHashAnnounce) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeaconBlockHashAnnounce.Unmarshal(m, b) 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 (m *BeaconBlockRequest) String() string { return proto.CompactTextString(m) }
func (*BeaconBlockRequest) ProtoMessage() {} func (*BeaconBlockRequest) ProtoMessage() {}
func (*BeaconBlockRequest) Descriptor() ([]byte, []int) { func (*BeaconBlockRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{1} return fileDescriptor_messages_facf6369f1deca1c, []int{1}
} }
func (m *BeaconBlockRequest) XXX_Unmarshal(b []byte) error { func (m *BeaconBlockRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeaconBlockRequest.Unmarshal(m, b) 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 (m *BeaconBlockRequestBySlotNumber) String() string { return proto.CompactTextString(m) }
func (*BeaconBlockRequestBySlotNumber) ProtoMessage() {} func (*BeaconBlockRequestBySlotNumber) ProtoMessage() {}
func (*BeaconBlockRequestBySlotNumber) Descriptor() ([]byte, []int) { func (*BeaconBlockRequestBySlotNumber) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{2} return fileDescriptor_messages_facf6369f1deca1c, []int{2}
} }
func (m *BeaconBlockRequestBySlotNumber) XXX_Unmarshal(b []byte) error { func (m *BeaconBlockRequestBySlotNumber) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeaconBlockRequestBySlotNumber.Unmarshal(m, b) return xxx_messageInfo_BeaconBlockRequestBySlotNumber.Unmarshal(m, b)
@@ -184,17 +184,18 @@ func (m *BeaconBlockRequestBySlotNumber) GetSlotNumber() uint64 {
} }
type BeaconBlockResponse struct { type BeaconBlockResponse struct {
Block *BeaconBlock `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` Block *BeaconBlock `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` Attestation *AggregatedAttestation `protobuf:"bytes,2,opt,name=attestation,proto3" json:"attestation,omitempty"`
XXX_unrecognized []byte `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *BeaconBlockResponse) Reset() { *m = BeaconBlockResponse{} } func (m *BeaconBlockResponse) Reset() { *m = BeaconBlockResponse{} }
func (m *BeaconBlockResponse) String() string { return proto.CompactTextString(m) } func (m *BeaconBlockResponse) String() string { return proto.CompactTextString(m) }
func (*BeaconBlockResponse) ProtoMessage() {} func (*BeaconBlockResponse) ProtoMessage() {}
func (*BeaconBlockResponse) Descriptor() ([]byte, []int) { func (*BeaconBlockResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{3} return fileDescriptor_messages_facf6369f1deca1c, []int{3}
} }
func (m *BeaconBlockResponse) XXX_Unmarshal(b []byte) error { func (m *BeaconBlockResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeaconBlockResponse.Unmarshal(m, b) return xxx_messageInfo_BeaconBlockResponse.Unmarshal(m, b)
@@ -221,25 +222,32 @@ func (m *BeaconBlockResponse) GetBlock() *BeaconBlock {
return nil return nil
} }
func (m *BeaconBlockResponse) GetAttestation() *AggregatedAttestation {
if m != nil {
return m.Attestation
}
return nil
}
type BeaconBlock struct { type BeaconBlock struct {
ParentHash []byte `protobuf:"bytes,1,opt,name=parent_hash,json=parentHash,proto3" json:"parent_hash,omitempty"` ParentHash []byte `protobuf:"bytes,1,opt,name=parent_hash,json=parentHash,proto3" json:"parent_hash,omitempty"`
SlotNumber uint64 `protobuf:"varint,2,opt,name=slot_number,json=slotNumber,proto3" json:"slot_number,omitempty"` SlotNumber uint64 `protobuf:"varint,2,opt,name=slot_number,json=slotNumber,proto3" json:"slot_number,omitempty"`
RandaoReveal []byte `protobuf:"bytes,3,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty"` RandaoReveal []byte `protobuf:"bytes,3,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty"`
PowChainRef []byte `protobuf:"bytes,4,opt,name=pow_chain_ref,json=powChainRef,proto3" json:"pow_chain_ref,omitempty"` PowChainRef []byte `protobuf:"bytes,4,opt,name=pow_chain_ref,json=powChainRef,proto3" json:"pow_chain_ref,omitempty"`
ActiveStateHash []byte `protobuf:"bytes,5,opt,name=active_state_hash,json=activeStateHash,proto3" json:"active_state_hash,omitempty"` ActiveStateHash []byte `protobuf:"bytes,5,opt,name=active_state_hash,json=activeStateHash,proto3" json:"active_state_hash,omitempty"`
CrystallizedStateHash []byte `protobuf:"bytes,6,opt,name=crystallized_state_hash,json=crystallizedStateHash,proto3" json:"crystallized_state_hash,omitempty"` CrystallizedStateHash []byte `protobuf:"bytes,6,opt,name=crystallized_state_hash,json=crystallizedStateHash,proto3" json:"crystallized_state_hash,omitempty"`
Timestamp *timestamp.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Timestamp *timestamp.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
Attestations []*AttestationRecord `protobuf:"bytes,8,rep,name=attestations,proto3" json:"attestations,omitempty"` Attestations []*AggregatedAttestation `protobuf:"bytes,8,rep,name=attestations,proto3" json:"attestations,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *BeaconBlock) Reset() { *m = BeaconBlock{} } func (m *BeaconBlock) Reset() { *m = BeaconBlock{} }
func (m *BeaconBlock) String() string { return proto.CompactTextString(m) } func (m *BeaconBlock) String() string { return proto.CompactTextString(m) }
func (*BeaconBlock) ProtoMessage() {} func (*BeaconBlock) ProtoMessage() {}
func (*BeaconBlock) Descriptor() ([]byte, []int) { func (*BeaconBlock) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{4} return fileDescriptor_messages_facf6369f1deca1c, []int{4}
} }
func (m *BeaconBlock) XXX_Unmarshal(b []byte) error { func (m *BeaconBlock) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BeaconBlock.Unmarshal(m, b) return xxx_messageInfo_BeaconBlock.Unmarshal(m, b)
@@ -308,7 +316,7 @@ func (m *BeaconBlock) GetTimestamp() *timestamp.Timestamp {
return nil return nil
} }
func (m *BeaconBlock) GetAttestations() []*AttestationRecord { func (m *BeaconBlock) GetAttestations() []*AggregatedAttestation {
if m != nil { if m != nil {
return m.Attestations return m.Attestations
} }
@@ -326,7 +334,7 @@ func (m *CrystallizedStateHashAnnounce) Reset() { *m = CrystallizedState
func (m *CrystallizedStateHashAnnounce) String() string { return proto.CompactTextString(m) } func (m *CrystallizedStateHashAnnounce) String() string { return proto.CompactTextString(m) }
func (*CrystallizedStateHashAnnounce) ProtoMessage() {} func (*CrystallizedStateHashAnnounce) ProtoMessage() {}
func (*CrystallizedStateHashAnnounce) Descriptor() ([]byte, []int) { func (*CrystallizedStateHashAnnounce) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{5} return fileDescriptor_messages_facf6369f1deca1c, []int{5}
} }
func (m *CrystallizedStateHashAnnounce) XXX_Unmarshal(b []byte) error { func (m *CrystallizedStateHashAnnounce) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CrystallizedStateHashAnnounce.Unmarshal(m, b) return xxx_messageInfo_CrystallizedStateHashAnnounce.Unmarshal(m, b)
@@ -364,7 +372,7 @@ func (m *CrystallizedStateRequest) Reset() { *m = CrystallizedStateReque
func (m *CrystallizedStateRequest) String() string { return proto.CompactTextString(m) } func (m *CrystallizedStateRequest) String() string { return proto.CompactTextString(m) }
func (*CrystallizedStateRequest) ProtoMessage() {} func (*CrystallizedStateRequest) ProtoMessage() {}
func (*CrystallizedStateRequest) Descriptor() ([]byte, []int) { func (*CrystallizedStateRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{6} return fileDescriptor_messages_facf6369f1deca1c, []int{6}
} }
func (m *CrystallizedStateRequest) XXX_Unmarshal(b []byte) error { func (m *CrystallizedStateRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CrystallizedStateRequest.Unmarshal(m, b) return xxx_messageInfo_CrystallizedStateRequest.Unmarshal(m, b)
@@ -402,7 +410,7 @@ func (m *CrystallizedStateResponse) Reset() { *m = CrystallizedStateResp
func (m *CrystallizedStateResponse) String() string { return proto.CompactTextString(m) } func (m *CrystallizedStateResponse) String() string { return proto.CompactTextString(m) }
func (*CrystallizedStateResponse) ProtoMessage() {} func (*CrystallizedStateResponse) ProtoMessage() {}
func (*CrystallizedStateResponse) Descriptor() ([]byte, []int) { func (*CrystallizedStateResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{7} return fileDescriptor_messages_facf6369f1deca1c, []int{7}
} }
func (m *CrystallizedStateResponse) XXX_Unmarshal(b []byte) error { func (m *CrystallizedStateResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CrystallizedStateResponse.Unmarshal(m, b) return xxx_messageInfo_CrystallizedStateResponse.Unmarshal(m, b)
@@ -450,7 +458,7 @@ func (m *CrystallizedState) Reset() { *m = CrystallizedState{} }
func (m *CrystallizedState) String() string { return proto.CompactTextString(m) } func (m *CrystallizedState) String() string { return proto.CompactTextString(m) }
func (*CrystallizedState) ProtoMessage() {} func (*CrystallizedState) ProtoMessage() {}
func (*CrystallizedState) Descriptor() ([]byte, []int) { func (*CrystallizedState) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{8} return fileDescriptor_messages_facf6369f1deca1c, []int{8}
} }
func (m *CrystallizedState) XXX_Unmarshal(b []byte) error { func (m *CrystallizedState) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CrystallizedState.Unmarshal(m, b) return xxx_messageInfo_CrystallizedState.Unmarshal(m, b)
@@ -558,7 +566,7 @@ func (m *ShardAndCommitteeArray) Reset() { *m = ShardAndCommitteeArray{}
func (m *ShardAndCommitteeArray) String() string { return proto.CompactTextString(m) } func (m *ShardAndCommitteeArray) String() string { return proto.CompactTextString(m) }
func (*ShardAndCommitteeArray) ProtoMessage() {} func (*ShardAndCommitteeArray) ProtoMessage() {}
func (*ShardAndCommitteeArray) Descriptor() ([]byte, []int) { func (*ShardAndCommitteeArray) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{9} return fileDescriptor_messages_facf6369f1deca1c, []int{9}
} }
func (m *ShardAndCommitteeArray) XXX_Unmarshal(b []byte) error { func (m *ShardAndCommitteeArray) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShardAndCommitteeArray.Unmarshal(m, b) return xxx_messageInfo_ShardAndCommitteeArray.Unmarshal(m, b)
@@ -596,7 +604,7 @@ func (m *ActiveStateHashAnnounce) Reset() { *m = ActiveStateHashAnnounce
func (m *ActiveStateHashAnnounce) String() string { return proto.CompactTextString(m) } func (m *ActiveStateHashAnnounce) String() string { return proto.CompactTextString(m) }
func (*ActiveStateHashAnnounce) ProtoMessage() {} func (*ActiveStateHashAnnounce) ProtoMessage() {}
func (*ActiveStateHashAnnounce) Descriptor() ([]byte, []int) { func (*ActiveStateHashAnnounce) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{10} return fileDescriptor_messages_facf6369f1deca1c, []int{10}
} }
func (m *ActiveStateHashAnnounce) XXX_Unmarshal(b []byte) error { func (m *ActiveStateHashAnnounce) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ActiveStateHashAnnounce.Unmarshal(m, b) return xxx_messageInfo_ActiveStateHashAnnounce.Unmarshal(m, b)
@@ -634,7 +642,7 @@ func (m *ActiveStateRequest) Reset() { *m = ActiveStateRequest{} }
func (m *ActiveStateRequest) String() string { return proto.CompactTextString(m) } func (m *ActiveStateRequest) String() string { return proto.CompactTextString(m) }
func (*ActiveStateRequest) ProtoMessage() {} func (*ActiveStateRequest) ProtoMessage() {}
func (*ActiveStateRequest) Descriptor() ([]byte, []int) { func (*ActiveStateRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{11} return fileDescriptor_messages_facf6369f1deca1c, []int{11}
} }
func (m *ActiveStateRequest) XXX_Unmarshal(b []byte) error { func (m *ActiveStateRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ActiveStateRequest.Unmarshal(m, b) return xxx_messageInfo_ActiveStateRequest.Unmarshal(m, b)
@@ -673,7 +681,7 @@ func (m *ShardAndCommittee) Reset() { *m = ShardAndCommittee{} }
func (m *ShardAndCommittee) String() string { return proto.CompactTextString(m) } func (m *ShardAndCommittee) String() string { return proto.CompactTextString(m) }
func (*ShardAndCommittee) ProtoMessage() {} func (*ShardAndCommittee) ProtoMessage() {}
func (*ShardAndCommittee) Descriptor() ([]byte, []int) { func (*ShardAndCommittee) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{12} return fileDescriptor_messages_facf6369f1deca1c, []int{12}
} }
func (m *ShardAndCommittee) XXX_Unmarshal(b []byte) error { func (m *ShardAndCommittee) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShardAndCommittee.Unmarshal(m, b) return xxx_messageInfo_ShardAndCommittee.Unmarshal(m, b)
@@ -718,7 +726,7 @@ func (m *ActiveStateResponse) Reset() { *m = ActiveStateResponse{} }
func (m *ActiveStateResponse) String() string { return proto.CompactTextString(m) } func (m *ActiveStateResponse) String() string { return proto.CompactTextString(m) }
func (*ActiveStateResponse) ProtoMessage() {} func (*ActiveStateResponse) ProtoMessage() {}
func (*ActiveStateResponse) Descriptor() ([]byte, []int) { func (*ActiveStateResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{13} return fileDescriptor_messages_facf6369f1deca1c, []int{13}
} }
func (m *ActiveStateResponse) XXX_Unmarshal(b []byte) error { func (m *ActiveStateResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ActiveStateResponse.Unmarshal(m, b) return xxx_messageInfo_ActiveStateResponse.Unmarshal(m, b)
@@ -746,18 +754,18 @@ func (m *ActiveStateResponse) GetActiveState() *ActiveState {
} }
type ActiveState struct { type ActiveState struct {
PendingAttestations []*AttestationRecord `protobuf:"bytes,1,rep,name=pending_attestations,json=pendingAttestations,proto3" json:"pending_attestations,omitempty"` PendingAttestations []*AggregatedAttestation `protobuf:"bytes,1,rep,name=pending_attestations,json=pendingAttestations,proto3" json:"pending_attestations,omitempty"`
RecentBlockHashes [][]byte `protobuf:"bytes,2,rep,name=recent_block_hashes,json=recentBlockHashes,proto3" json:"recent_block_hashes,omitempty"` RecentBlockHashes [][]byte `protobuf:"bytes,2,rep,name=recent_block_hashes,json=recentBlockHashes,proto3" json:"recent_block_hashes,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *ActiveState) Reset() { *m = ActiveState{} } func (m *ActiveState) Reset() { *m = ActiveState{} }
func (m *ActiveState) String() string { return proto.CompactTextString(m) } func (m *ActiveState) String() string { return proto.CompactTextString(m) }
func (*ActiveState) ProtoMessage() {} func (*ActiveState) ProtoMessage() {}
func (*ActiveState) Descriptor() ([]byte, []int) { func (*ActiveState) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{14} return fileDescriptor_messages_facf6369f1deca1c, []int{14}
} }
func (m *ActiveState) XXX_Unmarshal(b []byte) error { func (m *ActiveState) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ActiveState.Unmarshal(m, b) return xxx_messageInfo_ActiveState.Unmarshal(m, b)
@@ -777,7 +785,7 @@ func (m *ActiveState) XXX_DiscardUnknown() {
var xxx_messageInfo_ActiveState proto.InternalMessageInfo var xxx_messageInfo_ActiveState proto.InternalMessageInfo
func (m *ActiveState) GetPendingAttestations() []*AttestationRecord { func (m *ActiveState) GetPendingAttestations() []*AggregatedAttestation {
if m != nil { if m != nil {
return m.PendingAttestations return m.PendingAttestations
} }
@@ -808,7 +816,7 @@ func (m *ValidatorRecord) Reset() { *m = ValidatorRecord{} }
func (m *ValidatorRecord) String() string { return proto.CompactTextString(m) } func (m *ValidatorRecord) String() string { return proto.CompactTextString(m) }
func (*ValidatorRecord) ProtoMessage() {} func (*ValidatorRecord) ProtoMessage() {}
func (*ValidatorRecord) Descriptor() ([]byte, []int) { func (*ValidatorRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{15} return fileDescriptor_messages_facf6369f1deca1c, []int{15}
} }
func (m *ValidatorRecord) XXX_Unmarshal(b []byte) error { func (m *ValidatorRecord) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ValidatorRecord.Unmarshal(m, b) return xxx_messageInfo_ValidatorRecord.Unmarshal(m, b)
@@ -877,7 +885,7 @@ func (m *ValidatorRecord) GetEndDynasty() uint64 {
return 0 return 0
} }
type AttestationRecord struct { type AggregatedAttestation struct {
Slot uint64 `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty"` Slot uint64 `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty"`
ShardId uint64 `protobuf:"varint,2,opt,name=shard_id,json=shardId,proto3" json:"shard_id,omitempty"` ShardId uint64 `protobuf:"varint,2,opt,name=shard_id,json=shardId,proto3" json:"shard_id,omitempty"`
JustifiedSlot uint64 `protobuf:"varint,3,opt,name=justified_slot,json=justifiedSlot,proto3" json:"justified_slot,omitempty"` JustifiedSlot uint64 `protobuf:"varint,3,opt,name=justified_slot,json=justifiedSlot,proto3" json:"justified_slot,omitempty"`
@@ -891,80 +899,80 @@ type AttestationRecord struct {
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *AttestationRecord) Reset() { *m = AttestationRecord{} } func (m *AggregatedAttestation) Reset() { *m = AggregatedAttestation{} }
func (m *AttestationRecord) String() string { return proto.CompactTextString(m) } func (m *AggregatedAttestation) String() string { return proto.CompactTextString(m) }
func (*AttestationRecord) ProtoMessage() {} func (*AggregatedAttestation) ProtoMessage() {}
func (*AttestationRecord) Descriptor() ([]byte, []int) { func (*AggregatedAttestation) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{16} return fileDescriptor_messages_facf6369f1deca1c, []int{16}
} }
func (m *AttestationRecord) XXX_Unmarshal(b []byte) error { func (m *AggregatedAttestation) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AttestationRecord.Unmarshal(m, b) return xxx_messageInfo_AggregatedAttestation.Unmarshal(m, b)
} }
func (m *AttestationRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { func (m *AggregatedAttestation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_AttestationRecord.Marshal(b, m, deterministic) return xxx_messageInfo_AggregatedAttestation.Marshal(b, m, deterministic)
} }
func (dst *AttestationRecord) XXX_Merge(src proto.Message) { func (dst *AggregatedAttestation) XXX_Merge(src proto.Message) {
xxx_messageInfo_AttestationRecord.Merge(dst, src) xxx_messageInfo_AggregatedAttestation.Merge(dst, src)
} }
func (m *AttestationRecord) XXX_Size() int { func (m *AggregatedAttestation) XXX_Size() int {
return xxx_messageInfo_AttestationRecord.Size(m) return xxx_messageInfo_AggregatedAttestation.Size(m)
} }
func (m *AttestationRecord) XXX_DiscardUnknown() { func (m *AggregatedAttestation) XXX_DiscardUnknown() {
xxx_messageInfo_AttestationRecord.DiscardUnknown(m) xxx_messageInfo_AggregatedAttestation.DiscardUnknown(m)
} }
var xxx_messageInfo_AttestationRecord proto.InternalMessageInfo var xxx_messageInfo_AggregatedAttestation proto.InternalMessageInfo
func (m *AttestationRecord) GetSlot() uint64 { func (m *AggregatedAttestation) GetSlot() uint64 {
if m != nil { if m != nil {
return m.Slot return m.Slot
} }
return 0 return 0
} }
func (m *AttestationRecord) GetShardId() uint64 { func (m *AggregatedAttestation) GetShardId() uint64 {
if m != nil { if m != nil {
return m.ShardId return m.ShardId
} }
return 0 return 0
} }
func (m *AttestationRecord) GetJustifiedSlot() uint64 { func (m *AggregatedAttestation) GetJustifiedSlot() uint64 {
if m != nil { if m != nil {
return m.JustifiedSlot return m.JustifiedSlot
} }
return 0 return 0
} }
func (m *AttestationRecord) GetJustifiedBlockHash() []byte { func (m *AggregatedAttestation) GetJustifiedBlockHash() []byte {
if m != nil { if m != nil {
return m.JustifiedBlockHash return m.JustifiedBlockHash
} }
return nil return nil
} }
func (m *AttestationRecord) GetShardBlockHash() []byte { func (m *AggregatedAttestation) GetShardBlockHash() []byte {
if m != nil { if m != nil {
return m.ShardBlockHash return m.ShardBlockHash
} }
return nil return nil
} }
func (m *AttestationRecord) GetAttesterBitfield() []byte { func (m *AggregatedAttestation) GetAttesterBitfield() []byte {
if m != nil { if m != nil {
return m.AttesterBitfield return m.AttesterBitfield
} }
return nil return nil
} }
func (m *AttestationRecord) GetObliqueParentHashes() [][]byte { func (m *AggregatedAttestation) GetObliqueParentHashes() [][]byte {
if m != nil { if m != nil {
return m.ObliqueParentHashes return m.ObliqueParentHashes
} }
return nil return nil
} }
func (m *AttestationRecord) GetAggregateSig() []uint64 { func (m *AggregatedAttestation) GetAggregateSig() []uint64 {
if m != nil { if m != nil {
return m.AggregateSig return m.AggregateSig
} }
@@ -984,7 +992,7 @@ func (m *CrosslinkRecord) Reset() { *m = CrosslinkRecord{} }
func (m *CrosslinkRecord) String() string { return proto.CompactTextString(m) } func (m *CrosslinkRecord) String() string { return proto.CompactTextString(m) }
func (*CrosslinkRecord) ProtoMessage() {} func (*CrosslinkRecord) ProtoMessage() {}
func (*CrosslinkRecord) Descriptor() ([]byte, []int) { func (*CrosslinkRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{17} return fileDescriptor_messages_facf6369f1deca1c, []int{17}
} }
func (m *CrosslinkRecord) XXX_Unmarshal(b []byte) error { func (m *CrosslinkRecord) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CrosslinkRecord.Unmarshal(m, b) return xxx_messageInfo_CrosslinkRecord.Unmarshal(m, b)
@@ -1036,7 +1044,7 @@ func (m *AttestationHashes) Reset() { *m = AttestationHashes{} }
func (m *AttestationHashes) String() string { return proto.CompactTextString(m) } func (m *AttestationHashes) String() string { return proto.CompactTextString(m) }
func (*AttestationHashes) ProtoMessage() {} func (*AttestationHashes) ProtoMessage() {}
func (*AttestationHashes) Descriptor() ([]byte, []int) { func (*AttestationHashes) Descriptor() ([]byte, []int) {
return fileDescriptor_messages_e19f4492e67c7db5, []int{18} return fileDescriptor_messages_facf6369f1deca1c, []int{18}
} }
func (m *AttestationHashes) XXX_Unmarshal(b []byte) error { func (m *AttestationHashes) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AttestationHashes.Unmarshal(m, b) return xxx_messageInfo_AttestationHashes.Unmarshal(m, b)
@@ -1080,96 +1088,97 @@ func init() {
proto.RegisterType((*ActiveStateResponse)(nil), "ethereum.beacon.p2p.v1.ActiveStateResponse") proto.RegisterType((*ActiveStateResponse)(nil), "ethereum.beacon.p2p.v1.ActiveStateResponse")
proto.RegisterType((*ActiveState)(nil), "ethereum.beacon.p2p.v1.ActiveState") proto.RegisterType((*ActiveState)(nil), "ethereum.beacon.p2p.v1.ActiveState")
proto.RegisterType((*ValidatorRecord)(nil), "ethereum.beacon.p2p.v1.ValidatorRecord") proto.RegisterType((*ValidatorRecord)(nil), "ethereum.beacon.p2p.v1.ValidatorRecord")
proto.RegisterType((*AttestationRecord)(nil), "ethereum.beacon.p2p.v1.AttestationRecord") proto.RegisterType((*AggregatedAttestation)(nil), "ethereum.beacon.p2p.v1.AggregatedAttestation")
proto.RegisterType((*CrosslinkRecord)(nil), "ethereum.beacon.p2p.v1.CrosslinkRecord") proto.RegisterType((*CrosslinkRecord)(nil), "ethereum.beacon.p2p.v1.CrosslinkRecord")
proto.RegisterType((*AttestationHashes)(nil), "ethereum.beacon.p2p.v1.AttestationHashes") proto.RegisterType((*AttestationHashes)(nil), "ethereum.beacon.p2p.v1.AttestationHashes")
proto.RegisterEnum("ethereum.beacon.p2p.v1.Topic", Topic_name, Topic_value) proto.RegisterEnum("ethereum.beacon.p2p.v1.Topic", Topic_name, Topic_value)
} }
func init() { proto.RegisterFile("messages.proto", fileDescriptor_messages_e19f4492e67c7db5) } func init() { proto.RegisterFile("messages.proto", fileDescriptor_messages_facf6369f1deca1c) }
var fileDescriptor_messages_e19f4492e67c7db5 = []byte{ var fileDescriptor_messages_facf6369f1deca1c = []byte{
// 1297 bytes of a gzipped FileDescriptorProto // 1315 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x5f, 0x6f, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x5f, 0x73, 0xd3, 0xc6,
0x10, 0x5f, 0x6c, 0xa7, 0x4e, 0xce, 0x4e, 0x62, 0x33, 0xfd, 0xa3, 0x64, 0x6b, 0x93, 0xa9, 0x2b, 0x16, 0xbf, 0xfe, 0x13, 0x9c, 0x1c, 0x3b, 0x89, 0xbd, 0x21, 0xa0, 0xe4, 0x5e, 0x48, 0xae, 0xb8,
0x9a, 0xb6, 0xa8, 0xbb, 0xa5, 0xc0, 0xb0, 0xbd, 0x0c, 0xb0, 0x5d, 0x77, 0xed, 0x9a, 0x3a, 0x99, 0x0c, 0x09, 0x0c, 0xe6, 0x16, 0x66, 0x3a, 0xed, 0x4b, 0x67, 0x64, 0x63, 0x0a, 0x25, 0xb5, 0x41,
0xe4, 0x74, 0xeb, 0xb0, 0x42, 0xa0, 0x25, 0xda, 0x56, 0x23, 0x8b, 0x2e, 0x49, 0x27, 0xf0, 0x1e, 0x72, 0x68, 0xe9, 0x0c, 0xa3, 0xae, 0xa5, 0xb5, 0x2d, 0x22, 0x6b, 0xcd, 0xee, 0x3a, 0x19, 0xf7,
0xf6, 0xb6, 0xcf, 0xb0, 0x87, 0x7d, 0xa4, 0x01, 0xfb, 0x36, 0x7b, 0x1f, 0x48, 0x51, 0xff, 0x6c, 0xa1, 0xef, 0xfd, 0x04, 0x7d, 0xec, 0xf4, 0x0b, 0xb5, 0x9f, 0xa6, 0xef, 0x9d, 0x5d, 0xad, 0x64,
0x27, 0xc5, 0xde, 0xa4, 0xdf, 0xfd, 0xee, 0x78, 0xbc, 0xfb, 0xf1, 0x48, 0xd8, 0x1c, 0x13, 0xce, 0xf9, 0x4f, 0x42, 0xdb, 0x37, 0xe9, 0x77, 0x7e, 0xe7, 0xec, 0xf9, 0xbf, 0x0b, 0x5b, 0x23, 0xc2,
0xf1, 0x90, 0xf0, 0xc6, 0x84, 0x51, 0x41, 0xd1, 0x4d, 0x22, 0x46, 0x84, 0x91, 0xe9, 0xb8, 0xd1, 0x39, 0x1e, 0x10, 0x5e, 0x1f, 0x33, 0x2a, 0x28, 0xba, 0x41, 0xc4, 0x90, 0x30, 0x32, 0x19, 0xd5,
0x27, 0xd8, 0xa5, 0x61, 0x63, 0x72, 0x38, 0x69, 0x9c, 0x7f, 0xb5, 0xbb, 0x37, 0xa4, 0x74, 0x18, 0x7b, 0x04, 0x7b, 0x34, 0xaa, 0x8f, 0x1f, 0x8f, 0xeb, 0xe7, 0x9f, 0xec, 0x1f, 0x0c, 0x28, 0x1d,
0x90, 0x27, 0x8a, 0xd5, 0x9f, 0x0e, 0x9e, 0x08, 0x7f, 0x4c, 0xb8, 0xc0, 0xe3, 0x49, 0xe4, 0x68, 0x84, 0xe4, 0x91, 0x62, 0xf5, 0x26, 0xfd, 0x47, 0x22, 0x18, 0x11, 0x2e, 0xf0, 0x68, 0x1c, 0x2b,
0x3e, 0x86, 0x5b, 0x2d, 0xe5, 0xd1, 0x0a, 0xa8, 0x7b, 0xf6, 0x02, 0xf3, 0x51, 0x33, 0x0c, 0xe9, 0x9a, 0x0f, 0xe1, 0x66, 0x43, 0x69, 0x34, 0x42, 0xea, 0x9d, 0x3d, 0xc7, 0x7c, 0x68, 0x45, 0x11,
0x34, 0x74, 0x09, 0x42, 0x50, 0x1a, 0x61, 0x3e, 0x32, 0x56, 0xf6, 0x57, 0x0e, 0xaa, 0x96, 0xfa, 0x9d, 0x44, 0x1e, 0x41, 0x08, 0x8a, 0x43, 0xcc, 0x87, 0x46, 0xee, 0x30, 0x77, 0x54, 0xb1, 0xd5,
0x36, 0x0f, 0x00, 0x65, 0xe8, 0x16, 0xf9, 0x30, 0x25, 0x5c, 0x2c, 0x65, 0x36, 0xe1, 0xce, 0x22, 0xb7, 0x79, 0x04, 0x28, 0x43, 0xb7, 0xc9, 0x87, 0x09, 0xe1, 0x62, 0x25, 0xd3, 0x82, 0xdb, 0xcb,
0xb3, 0x35, 0xb3, 0x03, 0x2a, 0xba, 0xd3, 0x71, 0x9f, 0x30, 0xb4, 0x07, 0x15, 0x1e, 0x50, 0xe1, 0xcc, 0xc6, 0xd4, 0x09, 0xa9, 0x68, 0x4f, 0x46, 0x3d, 0xc2, 0xd0, 0x01, 0x94, 0x79, 0x48, 0x85,
0x84, 0xea, 0x57, 0x39, 0x97, 0x2c, 0xe0, 0x09, 0xc1, 0x3c, 0x81, 0xed, 0x5c, 0x08, 0x3e, 0xa1, 0x1b, 0xa9, 0x5f, 0xa5, 0x5c, 0xb4, 0x81, 0xa7, 0x04, 0xf3, 0xd7, 0x1c, 0xec, 0xcc, 0xd9, 0xe0,
0x21, 0x27, 0xe8, 0x5b, 0x58, 0xed, 0x4b, 0x40, 0x79, 0x54, 0x0e, 0xef, 0x36, 0x96, 0xef, 0xbd, 0x63, 0x1a, 0x71, 0x82, 0x3e, 0x87, 0xb5, 0x9e, 0x04, 0x94, 0x4a, 0xf9, 0xf1, 0x9d, 0xfa, 0xea,
0x91, 0xf5, 0x8d, 0x3c, 0xcc, 0x3f, 0x8a, 0x50, 0xc9, 0xc0, 0x32, 0x85, 0x09, 0x66, 0x24, 0x14, 0xe0, 0xeb, 0x59, 0xdd, 0x58, 0x03, 0x75, 0xa0, 0x8c, 0x85, 0x90, 0x19, 0x10, 0x01, 0x8d, 0x8c,
0x4e, 0x26, 0x7f, 0x88, 0x20, 0x59, 0x8b, 0xf9, 0x1c, 0x0b, 0xf3, 0x39, 0xa2, 0xbb, 0xb0, 0xc1, 0xbc, 0x32, 0xf0, 0xf0, 0x32, 0x03, 0xd6, 0x60, 0xc0, 0xc8, 0x00, 0x0b, 0xe2, 0x5b, 0x33, 0x25,
0x70, 0xe8, 0x61, 0xea, 0x30, 0x72, 0x4e, 0x70, 0x60, 0x14, 0x55, 0x8c, 0x6a, 0x04, 0x5a, 0x0a, 0x3b, 0x6b, 0xc1, 0xfc, 0xa9, 0x00, 0xe5, 0xcc, 0x39, 0x32, 0xa8, 0x31, 0x66, 0x24, 0x12, 0x6e,
0x43, 0x26, 0x6c, 0x4c, 0xe8, 0x85, 0xe3, 0x8e, 0xb0, 0x1f, 0x3a, 0x8c, 0x0c, 0x8c, 0x92, 0x22, 0x26, 0x23, 0x10, 0x43, 0x32, 0xbb, 0x8b, 0x51, 0xe7, 0x17, 0xa3, 0x46, 0x77, 0x60, 0x93, 0xe1,
0x55, 0x26, 0xf4, 0xa2, 0x2d, 0x31, 0x8b, 0x0c, 0xd0, 0x43, 0xa8, 0x63, 0x57, 0xf8, 0xe7, 0xc4, 0xc8, 0xc7, 0xd4, 0x65, 0xe4, 0x9c, 0xe0, 0xd0, 0x28, 0x28, 0x1b, 0x95, 0x18, 0xb4, 0x15, 0x86,
0xe1, 0x02, 0x0b, 0x12, 0x25, 0xb4, 0xaa, 0x78, 0x5b, 0x91, 0xc1, 0x96, 0xb8, 0xca, 0xea, 0x6b, 0x4c, 0xd8, 0x1c, 0xd3, 0x0b, 0xd7, 0x1b, 0xe2, 0x20, 0x72, 0x19, 0xe9, 0x1b, 0x45, 0x45, 0x2a,
0xb8, 0xe5, 0xb2, 0x19, 0x17, 0x38, 0x08, 0xfc, 0xdf, 0x88, 0x97, 0xf5, 0xb8, 0xa6, 0x3c, 0x6e, 0x8f, 0xe9, 0x45, 0x53, 0x62, 0x36, 0xe9, 0xa3, 0xfb, 0x50, 0xc3, 0x9e, 0x08, 0xce, 0x89, 0x2b,
0x64, 0xcd, 0xa9, 0xdf, 0x37, 0xb0, 0x9e, 0xf4, 0xdf, 0x28, 0xab, 0xea, 0xed, 0x36, 0x22, 0x85, 0x9d, 0x25, 0xb1, 0x43, 0x6b, 0x8a, 0xb7, 0x1d, 0x0b, 0x1c, 0x89, 0x2b, 0xaf, 0x3e, 0x85, 0x9b,
0x34, 0x62, 0x85, 0x34, 0x7a, 0x31, 0xc3, 0x4a, 0xc9, 0xe8, 0x35, 0x54, 0xb1, 0x10, 0xf2, 0x47, 0x1e, 0x9b, 0x72, 0x81, 0xc3, 0x30, 0xf8, 0x81, 0xf8, 0x59, 0x8d, 0x6b, 0x4a, 0x63, 0x37, 0x2b,
0xf8, 0x34, 0xe4, 0xc6, 0xda, 0x7e, 0xf1, 0xa0, 0x72, 0xf8, 0xe0, 0xb2, 0xd2, 0x37, 0x53, 0xae, 0x9e, 0xe9, 0x7d, 0x06, 0x1b, 0x69, 0x47, 0x19, 0x25, 0x95, 0xcd, 0xfd, 0x7a, 0xdc, 0x73, 0xf5,
0x45, 0x5c, 0xca, 0x3c, 0x2b, 0xe7, 0x6e, 0x3e, 0x85, 0xdb, 0xed, 0x65, 0x19, 0x5e, 0xa9, 0xbd, 0xa4, 0xe7, 0xea, 0xdd, 0x84, 0x61, 0xcf, 0xc8, 0xe8, 0x35, 0x54, 0x32, 0x79, 0xe4, 0xc6, 0xfa,
0x06, 0x18, 0x0b, 0x4e, 0x57, 0x29, 0x70, 0x0a, 0x3b, 0x4b, 0xf8, 0x5a, 0x44, 0x3f, 0x03, 0x5a, 0x61, 0xe1, 0xef, 0x97, 0x62, 0xce, 0x84, 0xf9, 0x04, 0x6e, 0x35, 0x57, 0x79, 0x79, 0x65, 0x47,
0x2c, 0xa1, 0x56, 0xd4, 0xa5, 0xdb, 0x5a, 0x0c, 0x57, 0x5f, 0x28, 0xb4, 0xf9, 0x6f, 0x09, 0xea, 0xd7, 0xc1, 0x58, 0x52, 0xba, 0xaa, 0xaf, 0x27, 0xb0, 0xb7, 0x82, 0xaf, 0x3b, 0xf3, 0x5b, 0x40,
0x0b, 0x44, 0xd9, 0xde, 0x00, 0x73, 0xa1, 0x5b, 0xc5, 0x88, 0x8b, 0x03, 0x57, 0x4b, 0x7e, 0x4b, 0xcb, 0x69, 0xd4, 0x6d, 0x7a, 0x7c, 0x59, 0x68, 0xcb, 0xe6, 0x6a, 0x4b, 0xc9, 0x36, 0xff, 0x28,
0x1a, 0x74, 0x76, 0x12, 0x46, 0x0f, 0xa0, 0xf6, 0x7e, 0xca, 0x85, 0x3f, 0xf0, 0x55, 0x62, 0x8c, 0x42, 0x6d, 0x89, 0x28, 0x4b, 0x1c, 0x62, 0x2e, 0x74, 0xb9, 0x18, 0xf1, 0x70, 0xe8, 0xe9, 0x41,
0xe0, 0x33, 0xad, 0xbc, 0xad, 0x04, 0xb7, 0x15, 0x8c, 0x1a, 0xb0, 0xad, 0xc2, 0x66, 0xf8, 0x01, 0xda, 0x96, 0x02, 0xed, 0x9d, 0x84, 0xd1, 0x31, 0x54, 0xdf, 0x4f, 0xb8, 0x08, 0xfa, 0x81, 0x72,
0x15, 0x4a, 0x84, 0x25, 0x4b, 0xad, 0xf8, 0x43, 0xe2, 0x11, 0x50, 0x91, 0xf0, 0x07, 0x7e, 0x88, 0x8c, 0x11, 0x7c, 0xa6, 0xbb, 0x6f, 0x3b, 0xc5, 0x1d, 0x05, 0xa3, 0x3a, 0xec, 0x28, 0xb3, 0x19,
0xf5, 0xc6, 0x25, 0xbf, 0x94, 0xf2, 0x9f, 0xc7, 0x16, 0xc5, 0xbf, 0x0f, 0x5b, 0xee, 0x94, 0xa9, 0x7e, 0x48, 0x85, 0x6a, 0xc4, 0xa2, 0xad, 0x4e, 0xfc, 0x2a, 0xd5, 0x08, 0xa9, 0x48, 0xf9, 0xfd,
0x13, 0xe2, 0xcd, 0x42, 0xcc, 0xc5, 0x4c, 0x69, 0xb2, 0x64, 0x6d, 0x6a, 0xf8, 0x59, 0x84, 0xa2, 0x20, 0xc2, 0x3a, 0x70, 0xc9, 0x2f, 0xce, 0xf8, 0xcf, 0x12, 0x89, 0xe2, 0xdf, 0x83, 0x6d, 0x6f,
0x7b, 0xb0, 0x29, 0xa8, 0xc0, 0x81, 0xe3, 0x91, 0x09, 0xe5, 0xbe, 0xe0, 0x4a, 0x89, 0x25, 0x6b, 0xc2, 0xd4, 0x94, 0xf8, 0xd3, 0x08, 0x73, 0x31, 0x55, 0x7d, 0x59, 0xb4, 0xb7, 0x34, 0xfc, 0x34,
0x43, 0xa1, 0xcf, 0x34, 0x88, 0x3e, 0x87, 0xaa, 0x8e, 0xe3, 0x70, 0x42, 0x3c, 0x25, 0xc2, 0xaa, 0x46, 0xd1, 0x5d, 0xd8, 0x12, 0x54, 0xe0, 0xd0, 0xf5, 0xc9, 0x98, 0xf2, 0x40, 0x70, 0xd5, 0x8d,
0x55, 0xd1, 0x98, 0x4d, 0x88, 0x27, 0x4f, 0x54, 0x42, 0x11, 0x98, 0x09, 0x63, 0x4d, 0x05, 0x8a, 0x45, 0x7b, 0x53, 0xa1, 0x4f, 0x35, 0x88, 0xfe, 0x0b, 0x15, 0x6d, 0xc7, 0xe5, 0x84, 0xf8, 0xaa,
0xfd, 0x6c, 0x89, 0xa1, 0x1e, 0xd4, 0x5d, 0x46, 0x39, 0x0f, 0xfc, 0xf0, 0x4c, 0x56, 0x93, 0x32, 0x11, 0x2b, 0x76, 0x59, 0x63, 0x0e, 0x21, 0xbe, 0x9c, 0xaa, 0x94, 0x22, 0x30, 0x13, 0xc6, 0xba,
0x8f, 0x1b, 0xeb, 0x4a, 0x94, 0xf7, 0x2f, 0xef, 0x9e, 0x76, 0xd0, 0x92, 0xac, 0xb9, 0x79, 0x80, 0x32, 0x94, 0xe8, 0x39, 0x12, 0x43, 0x5d, 0xa8, 0x79, 0x8c, 0x72, 0x1e, 0x06, 0xd1, 0x99, 0xcc,
0xa3, 0xef, 0x01, 0xce, 0x71, 0xe0, 0x7b, 0x58, 0x50, 0xc6, 0x0d, 0xb8, 0x3a, 0xdc, 0x9b, 0x98, 0x26, 0x65, 0x3e, 0x37, 0x36, 0x54, 0x63, 0xde, 0xbb, 0xbc, 0x7a, 0x5a, 0xc1, 0x56, 0x7c, 0xbb,
0xa9, 0xc3, 0x65, 0x5c, 0x11, 0x83, 0x3b, 0x7c, 0x84, 0x99, 0xe7, 0xe0, 0xd0, 0x73, 0x5c, 0x3a, 0xea, 0xcd, 0x03, 0x1c, 0x7d, 0x09, 0x70, 0x8e, 0xc3, 0xc0, 0xc7, 0x82, 0x32, 0x6e, 0xc0, 0xd5,
0x1e, 0xfb, 0x42, 0x10, 0xc2, 0x9d, 0x01, 0x65, 0xaa, 0xe0, 0xdc, 0xa8, 0xa8, 0xe0, 0x8d, 0xcb, 0xe6, 0xde, 0x24, 0x4c, 0x6d, 0x2e, 0xa3, 0x8a, 0x18, 0xdc, 0xe6, 0x43, 0xcc, 0x7c, 0x17, 0x47,
0x82, 0xdb, 0xd2, 0xbb, 0x19, 0x7a, 0xed, 0xd8, 0xb7, 0xc9, 0x18, 0x9e, 0x59, 0xbb, 0x7c, 0x1e, 0xbe, 0xeb, 0xd1, 0xd1, 0x28, 0x10, 0x82, 0x10, 0xee, 0xf6, 0x29, 0x53, 0x09, 0xe7, 0x46, 0x59,
0xe7, 0xcf, 0x29, 0x93, 0x9d, 0xe2, 0xe6, 0xef, 0x70, 0x73, 0xb9, 0x17, 0xf2, 0x60, 0x07, 0xcb, 0x19, 0xaf, 0x5f, 0x66, 0xdc, 0x91, 0xda, 0x56, 0xe4, 0x37, 0x13, 0x5d, 0x8b, 0x31, 0x3c, 0xb5,
0x0f, 0x67, 0x49, 0x4e, 0xc6, 0xca, 0xd5, 0x27, 0x79, 0x21, 0xa4, 0x75, 0x53, 0xc5, 0x5a, 0xc0, 0xf7, 0xf9, 0x22, 0xce, 0x9f, 0x51, 0x26, 0x2b, 0xc5, 0xcd, 0x1f, 0xe1, 0xc6, 0x6a, 0x2d, 0xe4,
0xe5, 0x4d, 0xd2, 0xcc, 0xcf, 0xa9, 0x8f, 0xdd, 0x24, 0x19, 0xfa, 0x55, 0xe7, 0xf8, 0x08, 0xea, 0xc3, 0x1e, 0x96, 0x1f, 0xee, 0x0a, 0x9f, 0x8c, 0x9c, 0x72, 0xe4, 0xf8, 0x2f, 0x3b, 0x62, 0xdf,
0x0b, 0xab, 0xa1, 0x1d, 0x58, 0x8b, 0x76, 0xe3, 0x7b, 0xfa, 0x18, 0x95, 0xd5, 0xff, 0x4b, 0x0f, 0x50, 0xb6, 0x96, 0x70, 0x79, 0x3f, 0x59, 0xf3, 0xbb, 0xea, 0x63, 0xf7, 0x53, 0x86, 0x7e, 0xd5,
0x7d, 0x06, 0xeb, 0xe9, 0xf6, 0x0a, 0xfb, 0xc5, 0x83, 0x0d, 0x2b, 0x05, 0xcc, 0x77, 0xb0, 0x9d, 0x1c, 0x9f, 0x40, 0x6d, 0xe9, 0x34, 0xb4, 0x07, 0xeb, 0x71, 0x34, 0x81, 0xaf, 0xc7, 0xa8, 0xa4,
0x5b, 0x57, 0xcf, 0x83, 0xe7, 0x50, 0xcd, 0x8e, 0xdf, 0x8f, 0xdd, 0x2d, 0xd9, 0x10, 0x95, 0xcc, 0xfe, 0x5f, 0xf8, 0xe8, 0x3f, 0xb0, 0x31, 0x0b, 0x2f, 0x7f, 0x58, 0x38, 0xda, 0xb4, 0x67, 0x80,
0x78, 0x36, 0xff, 0x5a, 0x81, 0x4a, 0xc6, 0x88, 0x7e, 0x85, 0xeb, 0x13, 0x12, 0x7a, 0x7e, 0x38, 0xf9, 0x0e, 0x76, 0xe6, 0xce, 0xd5, 0xfb, 0xe0, 0x19, 0x54, 0xb2, 0x2b, 0xf8, 0x63, 0x17, 0x56,
0x74, 0x72, 0x03, 0x74, 0xe5, 0xff, 0x0e, 0xd0, 0x6d, 0x1d, 0x26, 0x63, 0xe1, 0xf2, 0x38, 0x33, 0xd6, 0x44, 0x39, 0xb3, 0xa2, 0xcd, 0x5f, 0x72, 0x50, 0xce, 0x08, 0xd1, 0xf7, 0x70, 0x7d, 0x4c,
0xe2, 0xca, 0xd3, 0xa9, 0xee, 0x37, 0x75, 0x05, 0x10, 0xae, 0x36, 0x5d, 0xb5, 0xea, 0x91, 0x29, 0x22, 0x3f, 0x88, 0x06, 0xee, 0xdc, 0x12, 0xcd, 0xfd, 0x93, 0x25, 0xba, 0xa3, 0x4d, 0x65, 0x30,
0xb9, 0xd8, 0x09, 0x37, 0xff, 0x2c, 0xc0, 0xd6, 0x9c, 0x6e, 0xd1, 0x6d, 0x80, 0xc9, 0xb4, 0x1f, 0x2e, 0x47, 0x9a, 0x11, 0x4f, 0x4e, 0xa8, 0xba, 0x38, 0xd5, 0x55, 0x40, 0xb8, 0x0a, 0xbc, 0x62,
0xf8, 0xae, 0x73, 0x46, 0x66, 0xba, 0x96, 0xeb, 0x11, 0xf2, 0x8a, 0xcc, 0xe4, 0x30, 0xba, 0xf0, 0xd7, 0x62, 0x51, 0xfa, 0x64, 0x20, 0xdc, 0xfc, 0x39, 0x0f, 0xdb, 0x0b, 0xbd, 0x8b, 0x6e, 0x01,
0xc5, 0xc8, 0x63, 0xf8, 0x02, 0x07, 0x91, 0x82, 0xe2, 0x61, 0x94, 0xe2, 0xaa, 0x3f, 0xe8, 0x31, 0x8c, 0x27, 0xbd, 0x30, 0xf0, 0xdc, 0x33, 0x32, 0xd5, 0xf9, 0xdc, 0x88, 0x91, 0x97, 0x64, 0x2a,
0xa0, 0x0c, 0x15, 0x7b, 0x1e, 0x23, 0x9c, 0xeb, 0x0b, 0xb1, 0x9e, 0x5a, 0x9a, 0x91, 0x01, 0x3d, 0x17, 0xd2, 0x45, 0x20, 0x86, 0x3e, 0xc3, 0x17, 0x38, 0x8c, 0xbb, 0x28, 0x59, 0x48, 0x33, 0x5c,
0x82, 0xba, 0xbe, 0x3a, 0xa3, 0xee, 0x8c, 0x49, 0x28, 0xf4, 0xcd, 0x58, 0x8b, 0x0c, 0xed, 0x04, 0xd5, 0x08, 0x3d, 0x04, 0x94, 0xa1, 0x62, 0xdf, 0x67, 0x84, 0x73, 0x7d, 0x31, 0xd6, 0x66, 0x12,
0x47, 0x06, 0x94, 0xfb, 0x38, 0xc0, 0xa1, 0x4b, 0xf4, 0x00, 0x8a, 0x7f, 0xe5, 0xbc, 0x50, 0x73, 0x2b, 0x16, 0xa0, 0x07, 0x50, 0xd3, 0x57, 0x68, 0x5c, 0xa1, 0x11, 0x89, 0x84, 0xbe, 0x21, 0xab,
0x22, 0x19, 0x50, 0xd1, 0xe0, 0xa9, 0x2a, 0x30, 0x1e, 0x4f, 0x7b, 0x50, 0x21, 0xa1, 0x97, 0x50, 0xb1, 0xa0, 0x99, 0xe2, 0xc8, 0x80, 0x52, 0x0f, 0x87, 0x38, 0xf2, 0x88, 0x5e, 0x42, 0xc9, 0xaf,
0xca, 0xd1, 0x3d, 0x4e, 0x42, 0x4f, 0x13, 0xcc, 0xbf, 0x0b, 0x50, 0x5f, 0x28, 0xba, 0x94, 0xa3, 0xdc, 0x19, 0x6a, 0x57, 0xa4, 0x4b, 0x2a, 0x5e, 0x3e, 0x15, 0x05, 0x26, 0x2b, 0xea, 0x00, 0xca,
0x9a, 0x8f, 0x51, 0x55, 0xd4, 0x77, 0x4e, 0x79, 0x85, 0xbc, 0xf2, 0xee, 0xc1, 0xe6, 0xd2, 0x41, 0x24, 0xf2, 0x53, 0x4a, 0x29, 0xbe, 0xcf, 0x49, 0xe4, 0x6b, 0x82, 0xf9, 0x7b, 0x1e, 0x76, 0x57,
0xbc, 0xf1, 0x3e, 0x37, 0x84, 0xbf, 0x84, 0xeb, 0x29, 0x2d, 0x6d, 0x9c, 0xde, 0x3b, 0x4a, 0x6c, 0x26, 0x5e, 0xb6, 0xa5, 0xda, 0x93, 0x71, 0x66, 0xd4, 0xf7, 0x5c, 0x07, 0xe6, 0xe7, 0x3b, 0xf0,
0x49, 0xe7, 0xd0, 0x01, 0xd4, 0xa2, 0x35, 0x33, 0xec, 0xe8, 0x6d, 0xb0, 0xa9, 0xf0, 0x94, 0xf9, 0x2e, 0x6c, 0xad, 0x5c, 0xc8, 0x9b, 0xef, 0xe7, 0x96, 0xf1, 0xff, 0xe1, 0xfa, 0x8c, 0x36, 0x2b,
0x08, 0xea, 0x91, 0xce, 0x08, 0x73, 0xfa, 0xbe, 0x18, 0xf8, 0x24, 0xf0, 0xf4, 0xa3, 0xa0, 0x16, 0x9e, 0x8e, 0x1f, 0xa5, 0xb2, 0xb4, 0x7a, 0xe8, 0x08, 0xaa, 0xf1, 0x99, 0x19, 0x76, 0xfc, 0x4e,
0x1b, 0x5a, 0x1a, 0x47, 0x87, 0x70, 0x83, 0xf6, 0x03, 0xff, 0xc3, 0x94, 0x38, 0x99, 0x67, 0x10, 0xd8, 0x52, 0xf8, 0x8c, 0xf9, 0x00, 0x6a, 0x71, 0xbf, 0x11, 0xe6, 0xf6, 0x02, 0xd1, 0x0f, 0x48,
0xe1, 0x46, 0x59, 0x09, 0x68, 0x5b, 0x1b, 0x4f, 0x92, 0xf7, 0x10, 0xe1, 0xb2, 0xdc, 0x78, 0x38, 0xe8, 0xeb, 0x07, 0x42, 0x35, 0x11, 0x34, 0x34, 0x8e, 0x1e, 0xc3, 0x2e, 0xed, 0x85, 0xc1, 0x87,
0x64, 0x64, 0x28, 0xef, 0x31, 0xee, 0x0f, 0xd5, 0x53, 0xa0, 0x64, 0x55, 0x13, 0xd0, 0xf6, 0x87, 0x09, 0x71, 0x33, 0x4f, 0x22, 0xc2, 0x8d, 0x92, 0x6a, 0xa2, 0x1d, 0x2d, 0x7c, 0x95, 0xbe, 0x8d,
0xe6, 0x3b, 0xd8, 0x9a, 0x9b, 0xb6, 0xb2, 0x81, 0x71, 0xf5, 0xf5, 0x79, 0xd5, 0xbf, 0xf2, 0xbc, 0x08, 0x97, 0x29, 0xc7, 0x49, 0xae, 0x5c, 0x1e, 0x0c, 0xd4, 0xb3, 0xa0, 0x68, 0x57, 0x52, 0xd0,
0xaa, 0x6d, 0xa9, 0x5d, 0x15, 0x54, 0xaa, 0x29, 0x90, 0xb4, 0xa0, 0x98, 0xb6, 0xc0, 0xfc, 0x2e, 0x09, 0x06, 0xe6, 0x3b, 0xd8, 0x5e, 0xd8, 0xba, 0xb2, 0x88, 0x49, 0x05, 0xf4, 0xdc, 0xea, 0x5f,
0xd7, 0x2b, 0x9d, 0xd8, 0x03, 0xa8, 0x65, 0x4e, 0x58, 0xfc, 0xa0, 0x2b, 0xaa, 0xf7, 0x53, 0x9e, 0x39, 0xb7, 0x2a, 0x2c, 0x15, 0x55, 0x5e, 0xb9, 0x3a, 0x03, 0xd2, 0x12, 0x14, 0x66, 0x25, 0x30,
0xfc, 0xf0, 0x9f, 0x02, 0xac, 0xf6, 0xe8, 0xc4, 0x77, 0x51, 0x05, 0xca, 0xa7, 0xdd, 0x57, 0xdd, 0xbf, 0x80, 0x5a, 0xa6, 0x4a, 0xda, 0xb1, 0x63, 0xa8, 0x66, 0x26, 0x2d, 0x79, 0xdc, 0x15, 0xd4,
0xe3, 0x9f, 0xba, 0xb5, 0x4f, 0xd0, 0x1d, 0xd8, 0x6d, 0x75, 0x9a, 0xed, 0xe3, 0xae, 0xd3, 0x3a, 0x5b, 0x6a, 0x9e, 0x7c, 0xff, 0xb7, 0x3c, 0xac, 0x75, 0xe9, 0x38, 0xf0, 0x50, 0x19, 0x4a, 0xa7,
0x3a, 0x6e, 0xbf, 0x72, 0x5e, 0x34, 0xed, 0x17, 0x4e, 0xb3, 0xdb, 0x3d, 0x3e, 0xed, 0xb6, 0x3b, 0xed, 0x97, 0xed, 0xce, 0x37, 0xed, 0xea, 0xbf, 0xd0, 0x6d, 0xd8, 0x6f, 0xb4, 0xac, 0x66, 0xa7,
0xb5, 0x15, 0x64, 0xc0, 0xf5, 0x9c, 0xdd, 0xea, 0xfc, 0x78, 0xda, 0xb1, 0x7b, 0xb5, 0x02, 0xba, 0xed, 0x36, 0x4e, 0x3a, 0xcd, 0x97, 0xee, 0x73, 0xcb, 0x79, 0xee, 0x5a, 0xed, 0x76, 0xe7, 0xb4,
0x0f, 0x77, 0x97, 0x59, 0x9c, 0xd6, 0x5b, 0xc7, 0x3e, 0x3a, 0xee, 0x39, 0xdd, 0xd3, 0xd7, 0xad, 0xdd, 0x6c, 0x55, 0x73, 0xc8, 0x80, 0xeb, 0x73, 0x72, 0xbb, 0xf5, 0xfa, 0xb4, 0xe5, 0x74, 0xab,
0x8e, 0x55, 0x2b, 0xa2, 0x1d, 0xb8, 0x31, 0x47, 0xb4, 0x4f, 0x8e, 0xbb, 0x76, 0xa7, 0x56, 0x42, 0x79, 0x74, 0x0f, 0xee, 0xac, 0x92, 0xb8, 0x8d, 0xb7, 0xae, 0x73, 0xd2, 0xe9, 0xba, 0xed, 0xd3,
0x5f, 0xc0, 0x7e, 0xdb, 0x7a, 0x6b, 0xf7, 0x9a, 0x47, 0x47, 0x2f, 0x7f, 0xe9, 0x3c, 0x73, 0xec, 0xaf, 0x1b, 0x2d, 0xbb, 0x5a, 0x40, 0x7b, 0xb0, 0xbb, 0x40, 0x74, 0x5e, 0x75, 0xda, 0x4e, 0xab,
0x5e, 0xb3, 0xd7, 0x99, 0xcb, 0x61, 0x55, 0xe6, 0xb8, 0x84, 0x15, 0x67, 0x72, 0x0d, 0xed, 0xc1, 0x5a, 0x44, 0xff, 0x83, 0xc3, 0xa6, 0xfd, 0xd6, 0xe9, 0x5a, 0x27, 0x27, 0x2f, 0xbe, 0x6b, 0x3d,
0xa7, 0x4b, 0xed, 0x7a, 0x99, 0xb2, 0x0c, 0xd0, 0x6c, 0xf7, 0x5e, 0xbe, 0xe9, 0x2c, 0x5d, 0x60, 0x75, 0x9d, 0xae, 0xd5, 0x6d, 0x2d, 0xf8, 0xb0, 0x26, 0x7d, 0x5c, 0xc1, 0x4a, 0x3c, 0xb9, 0x86,
0x4d, 0x6e, 0x32, 0x67, 0x8f, 0x43, 0xaf, 0xcb, 0xdc, 0xe7, 0x2c, 0x3a, 0x28, 0xf4, 0xaf, 0xa9, 0x0e, 0xe0, 0xdf, 0x2b, 0xe5, 0xfa, 0x98, 0x92, 0x34, 0x60, 0x35, 0xbb, 0x2f, 0xde, 0xb4, 0x56,
0xd7, 0xe3, 0xd3, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x87, 0x6c, 0x40, 0x97, 0x0c, 0x00, 0x1e, 0xb0, 0x2e, 0x83, 0x9c, 0x93, 0x27, 0xa6, 0x37, 0xa4, 0xef, 0x0b, 0x12, 0x6d, 0x14, 0x7a,
0x00, 0xd7, 0xd4, 0x4b, 0xf2, 0xc9, 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x69, 0x3b, 0xfd, 0xf5,
0x0c, 0x00, 0x00,
} }

View File

@@ -32,6 +32,7 @@ message BeaconBlockRequestBySlotNumber{
message BeaconBlockResponse { message BeaconBlockResponse {
BeaconBlock block = 1; BeaconBlock block = 1;
AggregatedAttestation attestation = 2;
} }
message BeaconBlock { message BeaconBlock {
@@ -42,7 +43,7 @@ message BeaconBlock {
bytes active_state_hash = 5; bytes active_state_hash = 5;
bytes crystallized_state_hash = 6; bytes crystallized_state_hash = 6;
google.protobuf.Timestamp timestamp = 7; google.protobuf.Timestamp timestamp = 7;
repeated AttestationRecord attestations = 8; repeated AggregatedAttestation attestations = 8;
} }
message CrystallizedStateHashAnnounce { message CrystallizedStateHashAnnounce {
@@ -93,7 +94,7 @@ message ActiveStateResponse {
} }
message ActiveState { message ActiveState {
repeated AttestationRecord pending_attestations = 1; repeated AggregatedAttestation pending_attestations = 1;
repeated bytes recent_block_hashes = 2; repeated bytes recent_block_hashes = 2;
} }
@@ -107,7 +108,7 @@ message ValidatorRecord {
uint64 end_dynasty = 7; uint64 end_dynasty = 7;
} }
message AttestationRecord { message AggregatedAttestation {
uint64 slot = 1; uint64 slot = 1;
uint64 shard_id = 2; uint64 shard_id = 2;
uint64 justified_slot = 3; uint64 justified_slot = 3;

View File

@@ -235,10 +235,10 @@ func (m *ProposeResponse) GetBlockHash() []byte {
} }
type AttestRequest struct { type AttestRequest struct {
Attestation *v1.AttestationRecord `protobuf:"bytes,1,opt,name=attestation,proto3" json:"attestation,omitempty"` Attestation *v1.AggregatedAttestation `protobuf:"bytes,1,opt,name=attestation,proto3" json:"attestation,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *AttestRequest) Reset() { *m = AttestRequest{} } func (m *AttestRequest) Reset() { *m = AttestRequest{} }
@@ -265,7 +265,7 @@ func (m *AttestRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_AttestRequest proto.InternalMessageInfo var xxx_messageInfo_AttestRequest proto.InternalMessageInfo
func (m *AttestRequest) GetAttestation() *v1.AttestationRecord { func (m *AttestRequest) GetAttestation() *v1.AggregatedAttestation {
if m != nil { if m != nil {
return m.Attestation return m.Attestation
} }

View File

@@ -44,7 +44,7 @@ message ProposeResponse {
} }
message AttestRequest { message AttestRequest {
ethereum.beacon.p2p.v1.AttestationRecord attestation = 1; ethereum.beacon.p2p.v1.AggregatedAttestation attestation = 1;
} }
message AttestResponse { message AttestResponse {

View File

@@ -10,4 +10,4 @@ message TestMessage {
message Puzzle { message Puzzle {
string challenge = 1; string challenge = 1;
string answer = 2; string answer = 2;
} }

View File

@@ -89,7 +89,7 @@ func (a *Attester) run(done <-chan struct{}, client pb.AttesterServiceClient) {
latestBlockHash := blake2b.Sum512(data) latestBlockHash := blake2b.Sum512(data)
req := &pb.AttestRequest{ req := &pb.AttestRequest{
Attestation: &pbp2p.AttestationRecord{ Attestation: &pbp2p.AggregatedAttestation{
Slot: latestBeaconBlock.GetSlotNumber(), Slot: latestBeaconBlock.GetSlotNumber(),
ShardId: a.shardID, ShardId: a.shardID,
ShardBlockHash: latestBlockHash[:], ShardBlockHash: latestBlockHash[:],