2018-05-02 16:15:24 +00:00
|
|
|
package sharding
|
2018-05-03 15:22:28 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"math/big"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
|
"github.com/ethereum/go-ethereum/rlp"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Shard base struct.
|
|
|
|
type Shard struct {
|
|
|
|
shardDB *shardBackend
|
|
|
|
shardID *big.Int
|
|
|
|
}
|
|
|
|
|
|
|
|
// ValidateShardID checks if header belongs to shard.
|
|
|
|
func (s *Shard) ValidateShardID(h *CollationHeader) error {
|
|
|
|
if s.shardID.Cmp(h.shardID) != 0 {
|
|
|
|
return fmt.Errorf("Error: Collation Does Not Belong to Shard %d but Instead Has ShardID %d", h.shardID, s.shardID)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetHeaderByHash of collation.
|
|
|
|
func (s *Shard) GetHeaderByHash(hash *common.Hash) (*CollationHeader, error) {
|
|
|
|
encoded := s.shardDB.Get(hash)
|
|
|
|
var header CollationHeader
|
|
|
|
if err := rlp.DecodeBytes(encoded, &header); err != nil {
|
|
|
|
return nil, fmt.Errorf("Error Decoding Header: %v", err)
|
|
|
|
}
|
|
|
|
return &header, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetHeaderByPeriod the header was added.
|
|
|
|
func (s *Shard) GetHeaderByPeriod(period *big.Int) *CollationHeader {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetCollationByHash fetches full collation.
|
|
|
|
func (s *Shard) GetCollationByHash(hash *common.Hash) (*Collation, error) {
|
|
|
|
header, err := s.GetHeaderByHash(hash)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
body, err := s.GetBodyByChunkRoot(header.chunkRoot)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &Collation{header: header, body: body}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetBodyByChunkRoot fetches a collation body
|
|
|
|
func (s *Shard) GetBodyByChunkRoot(chunkRoot *common.Hash) ([]byte, error) {
|
|
|
|
body := s.shardDB.Get(chunkRoot)
|
|
|
|
if body == nil {
|
|
|
|
return nil, fmt.Errorf("Error: No Corresponding Body With Chunk Root Found")
|
|
|
|
}
|
|
|
|
return body, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// CheckAvailability is used by notaries to confirm a header's data availability.
|
|
|
|
func (s *Shard) CheckAvailability(header *CollationHeader) bool {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetUnavailable ensures to set a collation as unavailable in the shardDB.
|
|
|
|
func (s *Shard) SetUnavailable(header *CollationHeader) error {
|
|
|
|
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
|