mirror of https://github.com/poanetwork/quorum.git
Merge pull request #297 from getamis/consensus_failed
In this PR, we fixed https://github.com/jpmorganchase/quorum/issues/289. The root cause is we change the block header timestamp in Seal(). It will cause different root hash in proposer and validators' side. We did the following updates: 1. remove `BlockPauseTime` 2. set block header timestamp in Prepare()
This commit is contained in:
commit
362ecfe528
|
@ -122,7 +122,6 @@ var (
|
||||||
utils.EmitCheckpointsFlag,
|
utils.EmitCheckpointsFlag,
|
||||||
utils.IstanbulRequestTimeoutFlag,
|
utils.IstanbulRequestTimeoutFlag,
|
||||||
utils.IstanbulBlockPeriodFlag,
|
utils.IstanbulBlockPeriodFlag,
|
||||||
utils.IstanbulBlockPauseTimeFlag,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rpcFlags = []cli.Flag{
|
rpcFlags = []cli.Flag{
|
||||||
|
|
|
@ -22,6 +22,8 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/cmd/utils"
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||||
"github.com/ethereum/go-ethereum/internal/debug"
|
"github.com/ethereum/go-ethereum/internal/debug"
|
||||||
"gopkg.in/urfave/cli.v1"
|
"gopkg.in/urfave/cli.v1"
|
||||||
|
@ -225,7 +227,6 @@ var AppHelpFlagGroups = []flagGroup{
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
utils.IstanbulRequestTimeoutFlag,
|
utils.IstanbulRequestTimeoutFlag,
|
||||||
utils.IstanbulBlockPeriodFlag,
|
utils.IstanbulBlockPeriodFlag,
|
||||||
utils.IstanbulBlockPauseTimeFlag,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -534,11 +534,6 @@ var (
|
||||||
Usage: "Default minimum difference between two consecutive block's timestamps in seconds",
|
Usage: "Default minimum difference between two consecutive block's timestamps in seconds",
|
||||||
Value: eth.DefaultConfig.Istanbul.BlockPeriod,
|
Value: eth.DefaultConfig.Istanbul.BlockPeriod,
|
||||||
}
|
}
|
||||||
IstanbulBlockPauseTimeFlag = cli.Uint64Flag{
|
|
||||||
Name: "istanbul.blockpausetime",
|
|
||||||
Usage: "Pause time when zero tx in previous block, values should be larger than istanbul.blockperiod",
|
|
||||||
Value: eth.DefaultConfig.Istanbul.BlockPauseTime,
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// MakeDataDir retrieves the currently requested data directory, terminating
|
// MakeDataDir retrieves the currently requested data directory, terminating
|
||||||
|
@ -967,9 +962,6 @@ func setIstanbul(ctx *cli.Context, cfg *eth.Config) {
|
||||||
if ctx.GlobalIsSet(IstanbulBlockPeriodFlag.Name) {
|
if ctx.GlobalIsSet(IstanbulBlockPeriodFlag.Name) {
|
||||||
cfg.Istanbul.BlockPeriod = ctx.GlobalUint64(IstanbulBlockPeriodFlag.Name)
|
cfg.Istanbul.BlockPeriod = ctx.GlobalUint64(IstanbulBlockPeriodFlag.Name)
|
||||||
}
|
}
|
||||||
if ctx.GlobalIsSet(IstanbulBlockPauseTimeFlag.Name) {
|
|
||||||
cfg.Istanbul.BlockPauseTime = ctx.GlobalUint64(IstanbulBlockPauseTimeFlag.Name)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkExclusive(ctx *cli.Context, flags ...cli.Flag) {
|
func checkExclusive(ctx *cli.Context, flags ...cli.Flag) {
|
||||||
|
|
|
@ -364,6 +364,12 @@ func (sb *backend) Prepare(chain consensus.ChainReader, header *types.Header) er
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
header.Extra = extra
|
header.Extra = extra
|
||||||
|
|
||||||
|
// set header's timestamp
|
||||||
|
header.Time = new(big.Int).Add(parent.Time, new(big.Int).SetUint64(sb.config.BlockPeriod))
|
||||||
|
if header.Time.Int64() < time.Now().Unix() {
|
||||||
|
header.Time = big.NewInt(time.Now().Unix())
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,21 +451,7 @@ func (sb *backend) Seal(chain consensus.ChainReader, block *types.Block, stop <-
|
||||||
|
|
||||||
// update timestamp and signature of the block based on its number of transactions
|
// update timestamp and signature of the block based on its number of transactions
|
||||||
func (sb *backend) updateBlock(parent *types.Header, block *types.Block) (*types.Block, error) {
|
func (sb *backend) updateBlock(parent *types.Header, block *types.Block) (*types.Block, error) {
|
||||||
// set block period based the number of tx
|
|
||||||
var period uint64
|
|
||||||
if len(block.Transactions()) == 0 {
|
|
||||||
period = sb.config.BlockPauseTime
|
|
||||||
} else {
|
|
||||||
period = sb.config.BlockPeriod
|
|
||||||
}
|
|
||||||
|
|
||||||
// set header timestamp
|
|
||||||
header := block.Header()
|
header := block.Header()
|
||||||
header.Time = new(big.Int).Add(parent.Time, new(big.Int).SetUint64(period))
|
|
||||||
time := now().Unix()
|
|
||||||
if header.Time.Int64() < time {
|
|
||||||
header.Time = big.NewInt(time)
|
|
||||||
}
|
|
||||||
// sign the hash
|
// sign the hash
|
||||||
seal, err := sb.Sign(sigHash(header).Bytes())
|
seal, err := sb.Sign(sigHash(header).Bytes())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -352,7 +352,7 @@ func TestVoting(t *testing.T) {
|
||||||
for j, vote := range tt.votes {
|
for j, vote := range tt.votes {
|
||||||
headers[j] = &types.Header{
|
headers[j] = &types.Header{
|
||||||
Number: big.NewInt(int64(j) + 1),
|
Number: big.NewInt(int64(j) + 1),
|
||||||
Time: big.NewInt(int64(j) * int64(config.BlockPauseTime)),
|
Time: big.NewInt(int64(j) * int64(config.BlockPeriod)),
|
||||||
Coinbase: accounts.address(vote.voted),
|
Coinbase: accounts.address(vote.voted),
|
||||||
Difficulty: defaultDifficulty,
|
Difficulty: defaultDifficulty,
|
||||||
MixDigest: types.IstanbulDigest,
|
MixDigest: types.IstanbulDigest,
|
||||||
|
|
|
@ -24,9 +24,8 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
RequestTimeout uint64 `toml:",omitempty"` // The timeout for each Istanbul round in milliseconds. This timeout should be larger than BlockPauseTime
|
RequestTimeout uint64 `toml:",omitempty"` // The timeout for each Istanbul round in milliseconds.
|
||||||
BlockPeriod uint64 `toml:",omitempty"` // Default minimum difference between two consecutive block's timestamps in second
|
BlockPeriod uint64 `toml:",omitempty"` // Default minimum difference between two consecutive block's timestamps in second
|
||||||
BlockPauseTime uint64 `toml:",omitempty"` // Delay time if no tx in block, the value should be larger than BlockPeriod
|
|
||||||
ProposerPolicy ProposerPolicy `toml:",omitempty"` // The policy for proposer selection
|
ProposerPolicy ProposerPolicy `toml:",omitempty"` // The policy for proposer selection
|
||||||
Epoch uint64 `toml:",omitempty"` // The number of blocks after which to checkpoint and reset the pending votes
|
Epoch uint64 `toml:",omitempty"` // The number of blocks after which to checkpoint and reset the pending votes
|
||||||
}
|
}
|
||||||
|
@ -34,7 +33,6 @@ type Config struct {
|
||||||
var DefaultConfig = &Config{
|
var DefaultConfig = &Config{
|
||||||
RequestTimeout: 10000,
|
RequestTimeout: 10000,
|
||||||
BlockPeriod: 1,
|
BlockPeriod: 1,
|
||||||
BlockPauseTime: 2,
|
|
||||||
ProposerPolicy: RoundRobin,
|
ProposerPolicy: RoundRobin,
|
||||||
Epoch: 30000,
|
Epoch: 30000,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue