Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds millisecond support to geth #41

Merged
merged 4 commits into from
Apr 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 10 additions & 12 deletions consensus/clique/clique.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,14 @@ import (
"bytes"
"errors"
"fmt"
"github.com/ethereum/go-ethereum/metrics"
"io"
"math/big"
"math/rand"
"sync"
"time"

"github.com/ethereum/go-ethereum/metrics"

"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
Expand All @@ -52,7 +53,7 @@ const (
inmemorySnapshots = 128 // Number of recent vote snapshots to keep in memory
inmemorySignatures = 4096 // Number of recent block signatures to keep in memory

wiggleTime = 500 * time.Millisecond // Random delay (per signer) to allow concurrent signers
wiggleTime = 100 * time.Millisecond // Random delay (per signer) to allow concurrent signers
)

// Clique proof-of-authority protocol constants.
Expand Down Expand Up @@ -255,7 +256,7 @@ func (c *Clique) verifyHeader(chain consensus.ChainHeaderReader, header *types.H
number := header.Number.Uint64()

// Don't waste time checking blocks from the future
if header.Time > uint64(time.Now().Unix()) {
if header.Time > uint64(time.Now().UnixMilli()) {
return consensus.ErrFutureBlock
}
// Checkpoint blocks need to enforce zero beneficiary
Expand Down Expand Up @@ -346,7 +347,7 @@ func (c *Clique) verifyCascadingFields(chain consensus.ChainHeaderReader, header
if parent == nil || parent.Number.Uint64() != number-1 || parent.Hash() != header.ParentHash {
return consensus.ErrUnknownAncestor
}
if parent.Time+c.config.PeriodMs/1000 > header.Time {
if parent.Time+c.config.PeriodMs > header.Time {
return errInvalidTimestamp
}
// Verify that the gasUsed is <= gasLimit
Expand Down Expand Up @@ -575,9 +576,10 @@ func (c *Clique) Prepare(chain consensus.ChainHeaderReader, header *types.Header
if parent == nil {
return consensus.ErrUnknownAncestor
}
header.Time = parent.Time + c.config.PeriodMs/1000
if header.Time < uint64(time.Now().Unix()) {
header.Time = uint64(time.Now().Unix())

header.Time = parent.Time + c.config.PeriodMs
if header.Time < uint64(time.Now().UnixMilli()) {
header.Time = uint64(time.Now().UnixMilli())
}
return nil
}
Expand Down Expand Up @@ -657,7 +659,7 @@ func (c *Clique) Seal(chain consensus.ChainHeaderReader, block *types.Block, res
}
}
// Sweet, the protocol permits us to sign the block, wait for our time
delay := time.Unix(int64(header.Time), 0).Sub(time.Now()) // nolint: gosimple
delay := time.UnixMilli(int64(header.Time)).Sub(time.Now()) // nolint: gosimple
if header.Difficulty.Cmp(diffNoTurn) == 0 {
// It's not our turn explicitly to sign, delay it a bit
wiggle := time.Duration(len(snap.Signers)/2+1) * wiggleTime
Expand All @@ -672,10 +674,6 @@ func (c *Clique) Seal(chain consensus.ChainHeaderReader, block *types.Block, res
}
copy(header.Extra[len(header.Extra)-extraSeal:], sighash)

// For now, hard code delay to 20ms less than block period.
// This may cause deadlocks with certain numbers of nodes, more testing is needed.
delay = time.Millisecond * (time.Duration(c.config.PeriodMs - 20))

// Wait until sealing is terminated or delay timeout.
log.Trace("Waiting for slot to sign and propagate", "delay", common.PrettyDuration(delay))
go func() {
Expand Down
8 changes: 4 additions & 4 deletions eth/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,10 +240,10 @@ func newHandler(config *handlerConfig) (*handler, error) {
// accept each others' blocks until a restart. Unfortunately we haven't figured
// out a way yet where nodes can decide unilaterally whether the network is new
// or not. This should be fixed if we figure out a solution.
if !h.synced.Load() && config.Sync != downloader.FullSync {
log.Warn("Syncing, discarded propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash())
return 0, nil
}
// if !h.synced.Load() && config.Sync != downloader.FullSync {
// log.Warn("Syncing, discarded propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash())
// return 0, nil
// }
if h.merger.TDDReached() {
// The blocks from the p2p network is regarded as untrusted
// after the transition. In theory block gossip should be disabled
Expand Down
2 changes: 1 addition & 1 deletion geth-poa/genesis.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
}
},
"nonce": "0x0",
"timestamp": "0x6546df6d",
"timestamp": "0x18E0A4E0D22",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000d9cd8E5DE6d55f796D980B818D350C0746C25b97788EBABe5c3dD422Ef92Ca6714A69e2eabcE1Ee4f6ba5bca9b489de3a4ac3a57823d5d97d608feb90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x1c9c380",
"difficulty": "0x1",
Expand Down
Loading