mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-04 08:44:28 +00:00
sharding: collation header hash and shard receiver methods
Former-commit-id: 4cbacc539c2ef7c273c926d989449def39bf7b9a [formerly 7930332c151ad370317590556169411f875c84f9] Former-commit-id: 7533fcba8e6c6739ccb8ade408654e2b18e50c83
This commit is contained in:
parent
887b72ff11
commit
84a2cb08d7
@ -4,6 +4,8 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/crypto/sha3"
|
||||||
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Collation struct {
|
type Collation struct {
|
||||||
@ -19,6 +21,14 @@ type CollationHeader struct {
|
|||||||
proposerSignature []byte //the proposer's signature for calculating collation hash
|
proposerSignature []byte //the proposer's signature for calculating collation hash
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hash takes the keccak256 of the collation header's contents.
|
||||||
|
func (h *CollationHeader) Hash() (hash common.Hash) {
|
||||||
|
hw := sha3.NewKeccak256()
|
||||||
|
rlp.Encode(hw, h)
|
||||||
|
hw.Sum(hash[:0])
|
||||||
|
return hash
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Collation) Header() *CollationHeader { return c.header }
|
func (c *Collation) Header() *CollationHeader { return c.header }
|
||||||
func (c *Collation) ShardID() *big.Int { return c.header.shardID }
|
func (c *Collation) ShardID() *big.Int { return c.header.shardID }
|
||||||
func (c *Collation) Period() *big.Int { return c.header.period }
|
func (c *Collation) Period() *big.Int { return c.header.period }
|
||||||
|
@ -1,21 +1,29 @@
|
|||||||
package sharding
|
package sharding
|
||||||
|
|
||||||
import "github.com/ethereum/go-ethereum/common"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
)
|
||||||
|
|
||||||
type shardBackend struct {
|
type shardBackend struct {
|
||||||
kv map[*common.Hash][]byte
|
kv map[common.Hash][]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sb *shardBackend) Get(k *common.Hash) []byte {
|
func (sb *shardBackend) Get(k common.Hash) ([]byte, error) {
|
||||||
return sb.kv[k]
|
v := sb.kv[k]
|
||||||
|
if v == nil {
|
||||||
|
return nil, fmt.Errorf("Key Not Found")
|
||||||
|
}
|
||||||
|
return v, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sb *shardBackend) Put(k *common.Hash, v []byte) {
|
func (sb *shardBackend) Put(k common.Hash, v []byte) {
|
||||||
sb.kv[k] = v
|
sb.kv[k] = v
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sb *shardBackend) Delete(k *common.Hash) {
|
func (sb *shardBackend) Delete(k common.Hash) {
|
||||||
delete(sb.kv, k)
|
delete(sb.kv, k)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -22,28 +22,39 @@ func (s *Shard) ValidateShardID(h *CollationHeader) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetHeader adds the collation header to shardDB
|
||||||
|
func (s *Shard) SetHeader(h *CollationHeader) error {
|
||||||
|
if err := s.ValidateShardID(h); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
encoded, err := rlp.EncodeToBytes(h)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Error: Cannot Encode Header")
|
||||||
|
}
|
||||||
|
s.shardDB.Put(h.Hash(), encoded)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetHeaderByHash of collation.
|
// GetHeaderByHash of collation.
|
||||||
func (s *Shard) GetHeaderByHash(hash *common.Hash) (*CollationHeader, error) {
|
func (s *Shard) GetHeaderByHash(hash common.Hash) (*CollationHeader, error) {
|
||||||
encoded := s.shardDB.Get(hash)
|
encoded, err := s.shardDB.Get(hash)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("Error: Header Not Found")
|
||||||
|
}
|
||||||
var header CollationHeader
|
var header CollationHeader
|
||||||
if err := rlp.DecodeBytes(encoded, &header); err != nil {
|
if err := rlp.DecodeBytes(encoded, &header); err != nil {
|
||||||
return nil, fmt.Errorf("Error Decoding Header: %v", err)
|
return nil, fmt.Errorf("Error: Problem Decoding Header: %v", err)
|
||||||
}
|
}
|
||||||
return &header, nil
|
return &header, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetHeaderByPeriod the header was added.
|
|
||||||
func (s *Shard) GetHeaderByPeriod(period *big.Int) *CollationHeader {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCollationByHash fetches full collation.
|
// GetCollationByHash fetches full collation.
|
||||||
func (s *Shard) GetCollationByHash(hash *common.Hash) (*Collation, error) {
|
func (s *Shard) GetCollationByHash(hash common.Hash) (*Collation, error) {
|
||||||
header, err := s.GetHeaderByHash(hash)
|
header, err := s.GetHeaderByHash(hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
body, err := s.GetBodyByChunkRoot(header.chunkRoot)
|
body, err := s.GetBodyByChunkRoot(*header.chunkRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -51,9 +62,9 @@ func (s *Shard) GetCollationByHash(hash *common.Hash) (*Collation, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetBodyByChunkRoot fetches a collation body
|
// GetBodyByChunkRoot fetches a collation body
|
||||||
func (s *Shard) GetBodyByChunkRoot(chunkRoot *common.Hash) ([]byte, error) {
|
func (s *Shard) GetBodyByChunkRoot(chunkRoot common.Hash) ([]byte, error) {
|
||||||
body := s.shardDB.Get(chunkRoot)
|
body, err := s.shardDB.Get(chunkRoot)
|
||||||
if body == nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error: No Corresponding Body With Chunk Root Found")
|
return nil, fmt.Errorf("Error: No Corresponding Body With Chunk Root Found")
|
||||||
}
|
}
|
||||||
return body, nil
|
return body, nil
|
||||||
@ -68,11 +79,3 @@ func (s *Shard) CheckAvailability(header *CollationHeader) bool {
|
|||||||
func (s *Shard) SetUnavailable(header *CollationHeader) error {
|
func (s *Shard) SetUnavailable(header *CollationHeader) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetCanonical is called after >= 2/3 notaries vote on header and period ends.
|
|
||||||
func (s *Shard) SetCanonical(header *CollationHeader) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set Header and Set Body Methods
|
|
||||||
// TODO: error in Get from the kv store
|
|
||||||
|
Loading…
Reference in New Issue
Block a user