package attestations import ( "encoding/binary" pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" "github.com/prysmaticlabs/prysm/shared/hashutil" "github.com/prysmaticlabs/prysm/shared/params" ) // CreateAttestationMsg hashes parentHashes + shardID + slotNumber + // shardBlockHash + justifiedSlot into a message to use for verifying // with aggregated public key and signature. func CreateAttestationMsg( blockHash []byte, slot uint64, shardID uint64, justifiedSlot uint64, forkVersion uint64, ) [32]byte { msg := make([]byte, binary.MaxVarintLen64) binary.BigEndian.PutUint64(msg, forkVersion) binary.PutUvarint(msg, slot%params.BeaconConfig().CycleLength) binary.PutUvarint(msg, shardID) msg = append(msg, blockHash...) binary.PutUvarint(msg, justifiedSlot) return hashutil.Hash(msg) } // Key generates the blake2b hash of the following attestation fields: // slotNumber + shardID + blockHash + obliqueParentHash // This is used for attestation table look up in localDB. func Key(att *pb.AttestationData) [32]byte { key := make([]byte, binary.MaxVarintLen64) binary.PutUvarint(key, att.GetSlot()) binary.PutUvarint(key, att.GetShard()) key = append(key, att.GetShardBlockRootHash32()...) return hashutil.Hash(key) } // VerifyProposerAttestation verifies the proposer's attestation of the block. // Proposers broadcast the attestation along with the block to its peers. func VerifyProposerAttestation(att *pb.AttestationData, pubKey [32]byte, proposerShardID uint64) error { // Verify the attestation attached with block response. // Get proposer index and shardID. attestationMsg := CreateAttestationMsg( att.GetShardBlockRootHash32(), att.GetSlot(), proposerShardID, att.GetJustifiedSlot(), params.BeaconConfig().InitialForkVersion, ) _ = attestationMsg _ = pubKey // TODO(#258): use attestationMsg to verify against signature // and public key. Return error if incorrect. return nil } // ContainsValidator checks if the validator is included in the attestation. // TODO(#569): Modify method to accept a single index rather than a bitfield. func ContainsValidator(attesterBitfield []byte, bitfield []byte) bool { for i := 0; i < len(bitfield); i++ { if bitfield[i]&attesterBitfield[i] != 0 { return true } } return false }