Skip to content

Commit

Permalink
Merge pull request #78 from lukso-network/consensus/pand-interface-im…
Browse files Browse the repository at this point in the history
…plement

Consensus/pand interface implement
  • Loading branch information
atif-konasl authored Jul 30, 2021
2 parents 7e792fd + 5ed628c commit 7f7d11d
Show file tree
Hide file tree
Showing 8 changed files with 288 additions and 69 deletions.
28 changes: 3 additions & 25 deletions consensus/pandora/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ import (
)

var (
errPandoraStopped = errors.New("pandora stopped")
errInvalidParentHash = errors.New("invalid parent hash")
errInvalidBlockNumber = errors.New("invalid block number")
errPandoraStopped = errors.New("pandora stopped")
)

// API is a user facing RPC API to allow controlling the signer and voting
Expand All @@ -32,8 +30,8 @@ func (api *API) GetShardingWork(parentHash common.Hash, blockNumber uint64, slot
}

var (
shardingInfoCh = make(chan [4]string)
errorCh = make(chan error)
shardingInfoCh = make(chan [4]string, 1)
errorCh = make(chan error, 1)
)

select {
Expand All @@ -45,26 +43,6 @@ func (api *API) GetShardingWork(parentHash common.Hash, blockNumber uint64, slot
select {
case shardingInfo := <-shardingInfoCh:
log.Debug("Sending current sharding info to validator", "shardingInfo", fmt.Sprintf("%+v", shardingInfo))
curBlockHeader := api.pandora.currentBlock.Header()
if curBlockHeader != nil {
log.Debug("Current Block Header Data", "time", curBlockHeader.Time, "block number", curBlockHeader.Number)
// When producing block #1, validator does not know about hash of block #0
// so do not check the parent hash and block number 1
if blockNumber == 1 {
return shardingInfo, nil
}
if curBlockHeader.ParentHash != parentHash {
log.Error("Mis-match in parentHash",
"blockNumber", curBlockHeader.Number.Uint64(),
"remoteParentHash", curBlockHeader.ParentHash, "receivedParentHash", parentHash)
return emptyRes, errInvalidParentHash
}
if curBlockHeader.Number.Uint64() != blockNumber {
log.Error("Mis-match in block number",
"remoteBlockNumber", curBlockHeader.Number.Uint64(), "receivedBlockNumber", blockNumber)
return emptyRes, errInvalidBlockNumber
}
}
return shardingInfo, nil
case err := <-errorCh:
return emptyRes, err
Expand Down
64 changes: 39 additions & 25 deletions consensus/pandora/consensus.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package pandora

import (
"math/big"
"runtime"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/core/state"
Expand All @@ -9,8 +12,6 @@ import (
"github.com/ethereum/go-ethereum/trie"
"github.com/pkg/errors"
"golang.org/x/crypto/sha3"
"math/big"
"runtime"
)

var (
Expand All @@ -22,6 +23,42 @@ func (pan *Pandora) Author(header *types.Header) (common.Address, error) {
return header.Coinbase, nil
}

// SealHash returns the hash of a block prior to it being sealed.
func (p *Pandora) SealHash(header *types.Header) (hash common.Hash) {
hasher := sha3.NewLegacyKeccak256()

extraData := header.Extra
extraDataLen := len(extraData)

// Bls signature is 96 bytes long and will be inserted at the bottom of the extraData field
if extraDataLen > signatureSize {
//extraData = extraData[:extraDataLen-signatureSize]
pandoraExtraData := new(ExtraDataSealed)
pandoraExtraData.FromHeader(header)
headerExtra := new(ExtraData)
headerExtra.Epoch = pandoraExtraData.Epoch
headerExtra.Turn = pandoraExtraData.Turn
headerExtra.Slot = pandoraExtraData.Slot
extraData, _ = rlp.EncodeToBytes(headerExtra)
}
rlp.Encode(hasher, []interface{}{
header.ParentHash,
header.UncleHash,
header.Coinbase,
header.Root,
header.TxHash,
header.ReceiptHash,
header.Bloom,
header.Difficulty,
header.Number,
header.GasLimit,
header.GasUsed,
header.Time,
extraData,
})
hasher.Sum(hash[:0])
return hash
}
func (p *Pandora) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header, seal bool) error {
number := header.Number.Uint64()
if chain.GetHeader(header.Hash(), number) != nil {
Expand Down Expand Up @@ -125,29 +162,6 @@ func (p *Pandora) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header
return types.NewBlock(header, txs, uncles, receipts, trie.NewStackTrie(nil)), nil
}

// SealHash returns the hash of a block prior to it being sealed.
func (p *Pandora) SealHash(header *types.Header) (hash common.Hash) {
hasher := sha3.NewLegacyKeccak256()
extraData := header.Extra
rlp.Encode(hasher, []interface{}{
header.ParentHash,
header.UncleHash,
header.Coinbase,
header.Root,
header.TxHash,
header.ReceiptHash,
header.Bloom,
header.Difficulty,
header.Number,
header.GasLimit,
header.GasUsed,
header.Time,
extraData,
})
hasher.Sum(hash[:0])
return hash
}

func (p *Pandora) CalcDifficulty(chain consensus.ChainHeaderReader, time uint64, parent *types.Header) *big.Int {
return calcDifficulty()
}
46 changes: 45 additions & 1 deletion consensus/pandora/helpers.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
package pandora

import (
"math/big"
"math/bits"

"fmt"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rlp"
"github.com/pkg/errors"
common2 "github.com/silesiacoin/bls/common"
"github.com/silesiacoin/bls/herumi"
"math/big"
)

// copyEpochInfo
Expand Down Expand Up @@ -61,6 +66,45 @@ func getDummyHeader() *types.Header {
}
}

func Mul64(a, b uint64) (uint64, error) {
overflows, val := bits.Mul64(a, b)
if overflows > 0 {
return 0, errors.New("multiplication overflows")
}
return val, nil
}

func (p *Pandora) StartSlot(epoch uint64) (uint64, error) {
slot, err := Mul64(p.config.SlotsPerEpoch, epoch)
if err != nil {
return slot, errors.Errorf("start slot calculation overflows: %v", err)
}
return slot, nil
}

func (pandoraExtraDataSealed *ExtraDataSealed) FromHeader(header *types.Header) {
err := rlp.DecodeBytes(header.Extra, pandoraExtraDataSealed)

if nil != err {
panic(err.Error())
}
}

func (pandoraExtraDataSealed *ExtraDataSealed) FromExtraDataAndSignature(
pandoraExtraData ExtraData,
signature common2.Signature,
) {
var blsSignatureBytes BlsSignatureBytes
signatureBytes := signature.Marshal()

if len(signatureBytes) != signatureSize {
panic("Incompatible bls mode detected")
}

copy(blsSignatureBytes[:], signatureBytes[:])
pandoraExtraDataSealed.ExtraData = pandoraExtraData
pandoraExtraDataSealed.BlsSignatureBytes = &blsSignatureBytes
}
func (p *Pandora) verifyHeaderWorker(chain consensus.ChainHeaderReader, headers []*types.Header, index int) error {
var parent *types.Header
if index == 0 {
Expand Down
Loading

0 comments on commit 7f7d11d

Please sign in to comment.