Simplify validation process of beacon entries
This commit is contained in:
parent
ad45e0c554
commit
ac2bf637a8
@ -4,9 +4,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/Secured-Finance/dione/lib"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/Secured-Finance/dione/types"
|
"github.com/Secured-Finance/dione/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -42,70 +39,13 @@ type BeaconAPI interface {
|
|||||||
LatestBeaconRound() uint64
|
LatestBeaconRound() uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidateTaskBeacons is a function that verifies dione task randomness
|
// ValidateBlockBeacons is a function that verifies block randomness
|
||||||
func ValidateTaskBeacons(beaconNetworks BeaconNetworks, t *types.DioneTask, prevEntry types.BeaconEntry) error {
|
func (bn BeaconNetworks) ValidateBlockBeacons(beaconNetworks BeaconNetworks, curEntry, prevEntry types.BeaconEntry) error {
|
||||||
parentBeacon := beaconNetworks.BeaconNetworkForRound(t.DrandRound - 1)
|
defaultBeacon := beaconNetworks.BeaconNetworkForRound(0)
|
||||||
currBeacon := beaconNetworks.BeaconNetworkForRound(t.DrandRound)
|
|
||||||
if parentBeacon != currBeacon {
|
|
||||||
if len(t.BeaconEntries) != 2 {
|
|
||||||
return fmt.Errorf("expected two beacon entries at beacon fork, got %d", len(t.BeaconEntries))
|
|
||||||
}
|
|
||||||
err := currBeacon.VerifyEntry(t.BeaconEntries[1], t.BeaconEntries[0])
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("beacon at fork point invalid: (%v, %v): %w",
|
|
||||||
t.BeaconEntries[1], t.BeaconEntries[0], err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: fork logic
|
if err := defaultBeacon.VerifyEntry(curEntry, prevEntry); err != nil {
|
||||||
bNetwork := beaconNetworks.BeaconNetworkForRound(t.DrandRound)
|
return fmt.Errorf("beacon entry was invalid: %w", err)
|
||||||
if uint64(t.DrandRound) == prevEntry.Round {
|
|
||||||
if len(t.BeaconEntries) != 0 {
|
|
||||||
return fmt.Errorf("expected not to have any beacon entries in this task, got %d", len(t.BeaconEntries))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(t.BeaconEntries) == 0 {
|
|
||||||
return fmt.Errorf("expected to have beacon entries in this task, but didn't find any")
|
|
||||||
}
|
|
||||||
|
|
||||||
last := t.BeaconEntries[len(t.BeaconEntries)-1]
|
|
||||||
if last.Round != uint64(t.DrandRound) {
|
|
||||||
return fmt.Errorf("expected final beacon entry in task to be at round %d, got %d", uint64(t.DrandRound), last.Round)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, e := range t.BeaconEntries {
|
|
||||||
if err := bNetwork.VerifyEntry(e, prevEntry); err != nil {
|
|
||||||
return fmt.Errorf("beacon entry %d (%d - %x (%d)) was invalid: %w", i, e.Round, e.Data, len(e.Data), err)
|
|
||||||
}
|
|
||||||
prevEntry = e
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func BeaconEntriesForTask(ctx context.Context, beaconNetworks BeaconNetworks) ([]types.BeaconEntry, error) {
|
|
||||||
beacon := beaconNetworks.BeaconNetworkForRound(0)
|
|
||||||
round := beacon.LatestBeaconRound()
|
|
||||||
|
|
||||||
start := lib.Clock.Now()
|
|
||||||
|
|
||||||
out := make([]types.BeaconEntry, 2)
|
|
||||||
prevBeaconEntry := beacon.Entry(ctx, round-1)
|
|
||||||
res := <-prevBeaconEntry
|
|
||||||
if res.Err != nil {
|
|
||||||
return nil, fmt.Errorf("getting entry %d returned error: %w", round-1, res.Err)
|
|
||||||
}
|
|
||||||
out[0] = res.Entry
|
|
||||||
curBeaconEntry := beacon.Entry(ctx, round)
|
|
||||||
res = <-curBeaconEntry
|
|
||||||
if res.Err != nil {
|
|
||||||
return nil, fmt.Errorf("getting entry %d returned error: %w", round, res.Err)
|
|
||||||
}
|
|
||||||
out[1] = res.Entry
|
|
||||||
|
|
||||||
logrus.Debugf("fetching beacon entries: took %v, count of entries: %v", lib.Clock.Since(start), len(out))
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
@ -3,6 +3,8 @@ package types
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/Secured-Finance/dione/types"
|
||||||
|
|
||||||
"github.com/libp2p/go-libp2p-core/crypto"
|
"github.com/libp2p/go-libp2p-core/crypto"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
@ -27,6 +29,8 @@ type BlockHeader struct {
|
|||||||
Proposer peer.ID
|
Proposer peer.ID
|
||||||
ProposerEth common.Address
|
ProposerEth common.Address
|
||||||
Signature []byte
|
Signature []byte
|
||||||
|
BeaconEntry types.BeaconEntry
|
||||||
|
ElectionProof *types.ElectionProof
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenesisBlock() *Block {
|
func GenesisBlock() *Block {
|
||||||
|
@ -12,7 +12,6 @@ import (
|
|||||||
|
|
||||||
types2 "github.com/Secured-Finance/dione/blockchain/types"
|
types2 "github.com/Secured-Finance/dione/blockchain/types"
|
||||||
|
|
||||||
"github.com/Secured-Finance/dione/beacon"
|
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
"github.com/libp2p/go-libp2p-core/peer"
|
||||||
|
|
||||||
"github.com/Secured-Finance/dione/ethclient"
|
"github.com/Secured-Finance/dione/ethclient"
|
||||||
@ -24,7 +23,6 @@ type Miner struct {
|
|||||||
address peer.ID
|
address peer.ID
|
||||||
ethAddress common.Address
|
ethAddress common.Address
|
||||||
mutex sync.Mutex
|
mutex sync.Mutex
|
||||||
beacon beacon.BeaconNetworks
|
|
||||||
ethClient *ethclient.EthereumClient
|
ethClient *ethclient.EthereumClient
|
||||||
minerStake *big.Int
|
minerStake *big.Int
|
||||||
networkStake *big.Int
|
networkStake *big.Int
|
||||||
@ -35,7 +33,6 @@ type Miner struct {
|
|||||||
func NewMiner(
|
func NewMiner(
|
||||||
address peer.ID,
|
address peer.ID,
|
||||||
ethAddress common.Address,
|
ethAddress common.Address,
|
||||||
beacon beacon.BeaconNetworks,
|
|
||||||
ethClient *ethclient.EthereumClient,
|
ethClient *ethclient.EthereumClient,
|
||||||
privateKey crypto.PrivKey,
|
privateKey crypto.PrivKey,
|
||||||
mempool *pool.Mempool,
|
mempool *pool.Mempool,
|
||||||
@ -43,7 +40,6 @@ func NewMiner(
|
|||||||
return &Miner{
|
return &Miner{
|
||||||
address: address,
|
address: address,
|
||||||
ethAddress: ethAddress,
|
ethAddress: ethAddress,
|
||||||
beacon: beacon,
|
|
||||||
ethClient: ethClient,
|
ethClient: ethClient,
|
||||||
privateKey: privateKey,
|
privateKey: privateKey,
|
||||||
mempool: mempool,
|
mempool: mempool,
|
||||||
@ -112,16 +108,6 @@ func (m *Miner) MineBlock(randomness []byte, drandRound uint64, lastBlockHeader
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO get rpc responses for oracle requests
|
|
||||||
//rpcMethod := rpc.GetRPCMethod(event.OriginChain, event.RequestType)
|
|
||||||
//if rpcMethod == nil {
|
|
||||||
// return nil, xerrors.Errorf("invalid rpc method name/type")
|
|
||||||
//}
|
|
||||||
//res, err := rpcMethod(event.RequestParams)
|
|
||||||
//if err != nil {
|
|
||||||
// return nil, xerrors.Errorf("couldn't do rpc request: %w", err)
|
|
||||||
//}
|
|
||||||
|
|
||||||
txs := m.mempool.GetAllTransactions()
|
txs := m.mempool.GetAllTransactions()
|
||||||
if txs == nil {
|
if txs == nil {
|
||||||
return nil, fmt.Errorf("there is no txes for processing") // skip new consensus round because there is no transaction for processing
|
return nil, fmt.Errorf("there is no txes for processing") // skip new consensus round because there is no transaction for processing
|
||||||
|
@ -158,14 +158,14 @@ func NewNode(config *config.Config, prvKey crypto.PrivKey, pexDiscoveryUpdateTim
|
|||||||
logrus.Info("Blockchain synchronization subsystem has been successfully initialized!")
|
logrus.Info("Blockchain synchronization subsystem has been successfully initialized!")
|
||||||
|
|
||||||
// initialize mining subsystem
|
// initialize mining subsystem
|
||||||
miner := provideMiner(n.Host.ID(), *n.Ethereum.GetEthAddress(), n.Beacon, n.Ethereum, prvKey, mp)
|
miner := provideMiner(n.Host.ID(), *n.Ethereum.GetEthAddress(), n.Ethereum, prvKey, mp)
|
||||||
n.Miner = miner
|
n.Miner = miner
|
||||||
logrus.Info("Mining subsystem has initialized!")
|
logrus.Info("Mining subsystem has been initialized!")
|
||||||
|
|
||||||
// initialize consensus subsystem
|
// initialize consensus subsystem
|
||||||
consensusManager := provideConsensusManager(psb, miner, ethClient, prvKey, n.Config.ConsensusMinApprovals)
|
consensusManager := provideConsensusManager(psb, miner, ethClient, prvKey, n.Config.ConsensusMinApprovals)
|
||||||
n.ConsensusManager = consensusManager
|
n.ConsensusManager = consensusManager
|
||||||
logrus.Info("Consensus subsystem has initialized!")
|
logrus.Info("Consensus subsystem has been initialized!")
|
||||||
|
|
||||||
// initialize random beacon network subsystem
|
// initialize random beacon network subsystem
|
||||||
randomBeaconNetwork, err := provideBeacon(psb.Pubsub, consensusManager)
|
randomBeaconNetwork, err := provideBeacon(psb.Pubsub, consensusManager)
|
||||||
@ -181,7 +181,7 @@ func NewNode(config *config.Config, prvKey crypto.PrivKey, pexDiscoveryUpdateTim
|
|||||||
logrus.Fatal(err)
|
logrus.Fatal(err)
|
||||||
}
|
}
|
||||||
n.DisputeManager = disputeManager
|
n.DisputeManager = disputeManager
|
||||||
logrus.Info("Dispute subsystem has initialized!")
|
logrus.Info("Dispute subsystem has been initialized!")
|
||||||
|
|
||||||
// initialize internal eth wallet
|
// initialize internal eth wallet
|
||||||
//w, err := provideWallet(n.Host.ID(), rawPrivKey)
|
//w, err := provideWallet(n.Host.ID(), rawPrivKey)
|
||||||
|
@ -58,8 +58,8 @@ func provideDisputeManager(ctx context.Context, ethClient *ethclient.EthereumCli
|
|||||||
return consensus.NewDisputeManager(ctx, ethClient, pcm, cfg.Ethereum.DisputeVoteWindow)
|
return consensus.NewDisputeManager(ctx, ethClient, pcm, cfg.Ethereum.DisputeVoteWindow)
|
||||||
}
|
}
|
||||||
|
|
||||||
func provideMiner(peerID peer.ID, ethAddress common.Address, beacon beacon.BeaconNetworks, ethClient *ethclient.EthereumClient, privateKey crypto.PrivKey, mempool *pool.Mempool) *consensus.Miner {
|
func provideMiner(peerID peer.ID, ethAddress common.Address, ethClient *ethclient.EthereumClient, privateKey crypto.PrivKey, mempool *pool.Mempool) *consensus.Miner {
|
||||||
return consensus.NewMiner(peerID, ethAddress, beacon, ethClient, privateKey, mempool)
|
return consensus.NewMiner(peerID, ethAddress, ethClient, privateKey, mempool)
|
||||||
}
|
}
|
||||||
|
|
||||||
func provideBeacon(ps *pubsub2.PubSub, pcm *consensus.PBFTConsensusManager) (beacon.BeaconNetworks, error) {
|
func provideBeacon(ps *pubsub2.PubSub, pcm *consensus.PBFTConsensusManager) (beacon.BeaconNetworks, error) {
|
||||||
|
@ -6,8 +6,6 @@ type BeaconEntry struct {
|
|||||||
Metadata map[string]interface{}
|
Metadata map[string]interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Randomness []byte
|
|
||||||
|
|
||||||
func NewBeaconEntry(round uint64, data []byte, metadata map[string]interface{}) BeaconEntry {
|
func NewBeaconEntry(round uint64, data []byte, metadata map[string]interface{}) BeaconEntry {
|
||||||
return BeaconEntry{
|
return BeaconEntry{
|
||||||
Round: round,
|
Round: round,
|
||||||
|
Loading…
Reference in New Issue
Block a user