modified testcase, modified producer delay

This commit is contained in:
Arpit Temani 2022-10-18 00:44:48 +05:30
parent 69e2a22819
commit e39da65458
14 changed files with 116 additions and 67 deletions

View file

@ -18,7 +18,9 @@
"period": { "period": {
"0": 2 "0": 2
}, },
"producerDelay": 6, "producerDelay": {
"0": 6
},
"sprint": { "sprint": {
"0": 64 "0": 64
}, },

View file

@ -19,7 +19,9 @@
"0": 2, "0": 2,
"25275000": 5 "25275000": 5
}, },
"producerDelay": 6, "producerDelay": {
"0": 6
},
"sprint": { "sprint": {
"0": 64 "0": 64
}, },

View file

@ -186,7 +186,7 @@ func CalcProducerDelay(number uint64, succession int, c *params.BorConfig) uint6
// That is to allow time for block propagation in the last sprint // That is to allow time for block propagation in the last sprint
delay := c.CalculatePeriod(number) delay := c.CalculatePeriod(number)
if number%c.CalculateSprint(number) == 0 { if number%c.CalculateSprint(number) == 0 {
delay = c.ProducerDelay delay = c.CalculateProducerDelay(number)
} }
if succession > 0 { if succession > 0 {

View file

@ -33,7 +33,9 @@ var mainnetBor = &Chain{
Period: map[string]uint64{ Period: map[string]uint64{
"0": 2, "0": 2,
}, },
ProducerDelay: 6, ProducerDelay: map[string]uint64{
"0": 6,
},
Sprint: map[string]uint64{ Sprint: map[string]uint64{
"0": 64, "0": 64,
}, },

View file

@ -34,7 +34,9 @@ var mumbaiTestnet = &Chain{
"0": 2, "0": 2,
"25275000": 5, "25275000": 5,
}, },
ProducerDelay: 6, ProducerDelay: map[string]uint64{
"0": 6,
},
Sprint: map[string]uint64{ Sprint: map[string]uint64{
"0": 64, "0": 64,
}, },

View file

@ -18,7 +18,9 @@
"period": { "period": {
"0": 2 "0": 2
}, },
"producerDelay": 6, "producerDelay": {
"0": 6
},
"sprint": { "sprint": {
"0": 64 "0": 64
}, },

View file

@ -20,7 +20,9 @@
"period":{ "period":{
"0":2 "0":2
}, },
"producerDelay":6, "producerDelay":{
"0": 6
},
"sprint":{ "sprint":{
"0": 64 "0": 64
}, },

View file

@ -278,7 +278,9 @@ var (
Period: map[string]uint64{ Period: map[string]uint64{
"0": 2, "0": 2,
}, },
ProducerDelay: 6, ProducerDelay: map[string]uint64{
"0": 6,
},
Sprint: map[string]uint64{ Sprint: map[string]uint64{
"0": 64, "0": 64,
}, },
@ -312,7 +314,9 @@ var (
Period: map[string]uint64{ Period: map[string]uint64{
"0": 1, "0": 1,
}, },
ProducerDelay: 3, ProducerDelay: map[string]uint64{
"0": 3,
},
Sprint: map[string]uint64{ Sprint: map[string]uint64{
"0": 32, "0": 32,
}, },
@ -350,7 +354,9 @@ var (
"0": 2, "0": 2,
"25275000": 5, "25275000": 5,
}, },
ProducerDelay: 6, ProducerDelay: map[string]uint64{
"0": 6,
},
Sprint: map[string]uint64{ Sprint: map[string]uint64{
"0": 64, "0": 64,
}, },
@ -396,7 +402,9 @@ var (
Period: map[string]uint64{ Period: map[string]uint64{
"0": 2, "0": 2,
}, },
ProducerDelay: 6, ProducerDelay: map[string]uint64{
"0": 6,
},
Sprint: map[string]uint64{ Sprint: map[string]uint64{
"0": 64, "0": 64,
}, },
@ -560,7 +568,7 @@ func (c *CliqueConfig) String() string {
// BorConfig is the consensus engine configs for Matic bor based sealing. // BorConfig is the consensus engine configs for Matic bor based sealing.
type BorConfig struct { type BorConfig struct {
Period map[string]uint64 `json:"period"` // Number of seconds between blocks to enforce Period map[string]uint64 `json:"period"` // Number of seconds between blocks to enforce
ProducerDelay uint64 `json:"producerDelay"` // Number of seconds delay between two producer interval ProducerDelay map[string]uint64 `json:"producerDelay"` // Number of seconds delay between two producer interval
Sprint map[string]uint64 `json:"sprint"` // Epoch length to proposer Sprint map[string]uint64 `json:"sprint"` // Epoch length to proposer
BackupMultiplier map[string]uint64 `json:"backupMultiplier"` // Backup multiplier to determine the wiggle time BackupMultiplier map[string]uint64 `json:"backupMultiplier"` // Backup multiplier to determine the wiggle time
ValidatorContract string `json:"validatorContract"` // Validator set contract ValidatorContract string `json:"validatorContract"` // Validator set contract
@ -576,6 +584,10 @@ func (b *BorConfig) String() string {
return "bor" return "bor"
} }
func (c *BorConfig) CalculateProducerDelay(number uint64) uint64 {
return c.calculateBorConfigHelper(c.ProducerDelay, number)
}
func (c *BorConfig) CalculateSprint(number uint64) uint64 { func (c *BorConfig) CalculateSprint(number uint64) uint64 {
return c.calculateBorConfigHelper(c.Sprint, number) return c.calculateBorConfigHelper(c.Sprint, number)
} }

View file

@ -8,7 +8,6 @@ import (
"io/ioutil" "io/ioutil"
_log "log" _log "log"
"math/big" "math/big"
"math/rand"
"os" "os"
"testing" "testing"
"time" "time"
@ -182,7 +181,17 @@ func TestSprintLengths(t *testing.T) {
assert.Equal(t, testBorConfig.CalculateSprint(0), uint64(16)) assert.Equal(t, testBorConfig.CalculateSprint(0), uint64(16))
assert.Equal(t, testBorConfig.CalculateSprint(8), uint64(4)) assert.Equal(t, testBorConfig.CalculateSprint(8), uint64(4))
assert.Equal(t, testBorConfig.CalculateSprint(9), uint64(4)) assert.Equal(t, testBorConfig.CalculateSprint(9), uint64(4))
}
func TestProducerDelay(t *testing.T) {
testBorConfig := params.TestChainConfig.Bor
testBorConfig.ProducerDelay = map[string]uint64{
"0": 16,
"8": 4,
}
assert.Equal(t, testBorConfig.CalculateProducerDelay(0), uint64(16))
assert.Equal(t, testBorConfig.CalculateProducerDelay(8), uint64(4))
assert.Equal(t, testBorConfig.CalculateProducerDelay(9), uint64(4))
} }
var keys_21val = []map[string]string{ var keys_21val = []map[string]string{
@ -225,37 +234,33 @@ var keys_21val = []map[string]string{
func getTestSprintLengthReorgCases(t *testing.T) []map[string]uint64 { func getTestSprintLengthReorgCases(t *testing.T) []map[string]uint64 {
// sprintSizes := []uint64{64} // sprintSizes := []uint64{64}
sprintSizes := []uint64{4, 8, 16, 32, 64} sprintSizes := []uint64{8, 16, 32, 64}
faultyNode := uint64(1) faultyNode := uint64(1)
reorgsLengthTests := make([]map[string]uint64, 1000) reorgsLengthTests := make([]map[string]uint64, 0)
for j := 0; j < len(sprintSizes); j++ { for i := uint64(0); i < uint64(len(sprintSizes)); i++ {
for i := 0; i < len(reorgsLengthTests)/len(sprintSizes); i++ { maxReorgLength := sprintSizes[i] * 3
rand.Seed(time.Now().UnixNano()) for j := uint64(3); j <= maxReorgLength; j++ {
minReorg := 1 maxStartBlock := sprintSizes[i] - 1
maxReorg := int(3*sprintSizes[j] - 1) for k := sprintSizes[i] / 2; k <= maxStartBlock; k++ {
minStartBlock := 1 reorgsLengthTest := map[string]uint64{
maxStartBlock := int(sprintSizes[j]) "reorgLength": j,
// reorgsLengthTests[i*j+i] = map[string]uint64{ "startBlock": k,
// "reorgLength": 10, "sprintSize": sprintSizes[i],
// "startBlock": 1,
// "sprintSize": 64,
// "faultyNode": 1, // node 1(index) is primary validator of the first sprint
// }
reorgsLengthTests[i*j+i] = map[string]uint64{
"reorgLength": uint64(rand.Intn(maxReorg-minReorg+1) + minReorg),
"startBlock": uint64(rand.Intn(maxStartBlock-minStartBlock+1) + minStartBlock),
"sprintSize": sprintSizes[j],
"faultyNode": faultyNode, // node 1(index) is primary validator of the first sprint "faultyNode": faultyNode, // node 1(index) is primary validator of the first sprint
} }
reorgsLengthTests = append(reorgsLengthTests, reorgsLengthTest)
}
} }
} }
return reorgsLengthTests return reorgsLengthTests
} }
func SprintLengthReorgIndividual(t *testing.T, index int, tt map[string]uint64) (uint64, uint64, uint64, uint64, uint64, uint64) { func SprintLengthReorgIndividual(t *testing.T, index int, tt map[string]uint64) (uint64, uint64, uint64, uint64, uint64, uint64, *big.Int, *big.Int) {
log.Warn("Case ----- ", "Index", index, "InducedReorgLength", tt["reorgLength"], "BlockStart", tt["startBlock"], "SprintSize", tt["sprintSize"], "DisconnectedNode", tt["faultyNode"]) t.Helper()
// log.Warn("Case ----- ", "Index", index, "InducedReorgLength", tt["reorgLength"], "BlockStart", tt["startBlock"], "SprintSize", tt["sprintSize"], "DisconnectedNode", tt["faultyNode"])
// observerNewChainLength, observerOldChainLength, faultyNewChainLength, faultyOldChainLength, validReorg, oldTD, newTD := SetupValidatorsAndTest(t, tt) // observerNewChainLength, observerOldChainLength, faultyNewChainLength, faultyOldChainLength, validReorg, oldTD, newTD := SetupValidatorsAndTest(t, tt)
_, observerOldChainLength, _, faultyOldChainLength, validReorg, _, _ := SetupValidatorsAndTest(t, tt) _, observerOldChainLength, _, faultyOldChainLength, _, oldTD, newTD := SetupValidatorsAndTest(t, tt)
// if observerNewChainLength > 0 { // if observerNewChainLength > 0 {
// log.Warn("Observer", "New Chain length", observerNewChainLength, "Old Chain length", observerOldChainLength) // log.Warn("Observer", "New Chain length", observerNewChainLength, "Old Chain length", observerOldChainLength)
@ -267,9 +272,9 @@ func SprintLengthReorgIndividual(t *testing.T, index int, tt map[string]uint64)
// log.Warn("Valid Reorg", "Valid Reorg", validReorg, "Old TD", oldTD, "New TD", newTD) // log.Warn("Valid Reorg", "Valid Reorg", validReorg, "Old TD", oldTD, "New TD", newTD)
// reorg should be valid :: New TD > Old TD // reorg should be valid :: New TD > Old TD
assert.Equal(t, validReorg, true) // assert.Equal(t, validReorg, true)
return tt["reorgLength"], tt["startBlock"], tt["sprintSize"], tt["faultyNode"], faultyOldChainLength, observerOldChainLength return tt["reorgLength"], tt["startBlock"], tt["sprintSize"], tt["faultyNode"], faultyOldChainLength, observerOldChainLength, oldTD, newTD
} }
func TestSprintLengthReorg(t *testing.T) { func TestSprintLengthReorg(t *testing.T) {
@ -278,17 +283,16 @@ func TestSprintLengthReorg(t *testing.T) {
defer f.Close() defer f.Close()
if err != nil { if err != nil {
_log.Fatalln("failed to open file", err) _log.Fatalln("failed to open file", err)
} }
w := csv.NewWriter(f) w := csv.NewWriter(f)
w.Write([]string{"Induced Reorg Length", "Start Block", "Sprint Size", "Disconnected Node Id", "Disconnected Node Id's Reorg Length", "Observer Node Id's Reorg Length", "Old Chain TD", "New Chain TD"})
w.Flush() w.Flush()
w.Write([]string{"InducedReorgLength", "BlockStart", "SprintSize", "DisconnectedNode", "DisconnectedNode'sReorgLength", "Observer'sReorgLength"})
w.Flush()
for index, tt := range reorgsLengthTests { for index, tt := range reorgsLengthTests {
r1, r2, r3, r4, r5, r6 := SprintLengthReorgIndividual(t, index, tt) r1, r2, r3, r4, r5, r6, r7, r8 := SprintLengthReorgIndividual(t, index, tt)
w.Write([]string{fmt.Sprint(r1), fmt.Sprint(r2), fmt.Sprint(r3), fmt.Sprint(r4), fmt.Sprint(r5), fmt.Sprint(r6)}) w.Write([]string{fmt.Sprint(r1), fmt.Sprint(r2), fmt.Sprint(r3), fmt.Sprint(r4), fmt.Sprint(r5), fmt.Sprint(r6), fmt.Sprint(r7), fmt.Sprint(r8)})
w.Flush() w.Flush()
} }
} }
@ -334,6 +338,7 @@ func SetupValidatorsAndTest(t *testing.T, tt map[string]uint64) (uint64, uint64,
// Iterate over all the nodes and start mining // Iterate over all the nodes and start mining
time.Sleep(3 * time.Second) time.Sleep(3 * time.Second)
for _, node := range nodes { for _, node := range nodes {
if err := node.StartMining(1); err != nil { if err := node.StartMining(1); err != nil {
panic(err) panic(err)
@ -344,6 +349,7 @@ func SetupValidatorsAndTest(t *testing.T, tt map[string]uint64) (uint64, uint64,
chain2HeadChFaulty := make(chan core.Chain2HeadEvent, 64) chain2HeadChFaulty := make(chan core.Chain2HeadEvent, 64)
var observerNewChainLength, observerOldChainLength, faultyNewChainLength, faultyOldChainLength uint64 var observerNewChainLength, observerOldChainLength, faultyNewChainLength, faultyOldChainLength uint64
var validReorg bool // if true, the newchain TD > oldchain TD var validReorg bool // if true, the newchain TD > oldchain TD
faultyProducerIndex := tt["faultyNode"] // node causing reorg :: faulty :: faultyProducerIndex := tt["faultyNode"] // node causing reorg :: faulty ::
@ -355,7 +361,6 @@ func SetupValidatorsAndTest(t *testing.T, tt map[string]uint64) (uint64, uint64,
stacks[faultyProducerIndex].Server().NoDiscovery = true stacks[faultyProducerIndex].Server().NoDiscovery = true
for { for {
blockHeaderObserver := nodes[subscribedNodeIndex].BlockChain().CurrentHeader() blockHeaderObserver := nodes[subscribedNodeIndex].BlockChain().CurrentHeader()
blockHeaderFaulty := nodes[faultyProducerIndex].BlockChain().CurrentHeader() blockHeaderFaulty := nodes[faultyProducerIndex].BlockChain().CurrentHeader()
@ -364,6 +369,7 @@ func SetupValidatorsAndTest(t *testing.T, tt map[string]uint64) (uint64, uint64,
if blockHeaderFaulty.Number.Uint64() == tt["startBlock"] { if blockHeaderFaulty.Number.Uint64() == tt["startBlock"] {
stacks[faultyProducerIndex].Server().MaxPeers = 0 stacks[faultyProducerIndex].Server().MaxPeers = 0
for _, enode := range enodes { for _, enode := range enodes {
stacks[faultyProducerIndex].Server().RemovePeer(enode) stacks[faultyProducerIndex].Server().RemovePeer(enode)
} }
@ -375,60 +381,65 @@ func SetupValidatorsAndTest(t *testing.T, tt map[string]uint64) (uint64, uint64,
} }
} }
if blockHeaderObserver.Number.Uint64() == tt["startBlock"]+tt["reorgLength"]+1 { if blockHeaderObserver.Number.Uint64() == tt["startBlock"]+tt["reorgLength"] {
stacks[faultyProducerIndex].Server().NoDiscovery = false stacks[faultyProducerIndex].Server().NoDiscovery = false
stacks[faultyProducerIndex].Server().MaxPeers = 100 stacks[faultyProducerIndex].Server().MaxPeers = 100
for _, enode := range enodes { for _, enode := range enodes {
stacks[faultyProducerIndex].Server().AddPeer(enode) stacks[faultyProducerIndex].Server().AddPeer(enode)
} }
}
if blockHeaderFaulty.Number.Uint64() >= 255 {
break
} }
select { select {
case ev := <-chain2HeadChObserver: case ev := <-chain2HeadChObserver:
// var newAuthor, oldAuthor common.Address
var newAuthor, oldAuthor common.Address
var newTD, oldTD *big.Int var newTD, oldTD *big.Int
if ev.Type == core.Chain2HeadReorgEvent { if ev.Type == core.Chain2HeadReorgEvent {
if len(ev.NewChain) > 0 { if len(ev.NewChain) > 0 {
newAuthor, _ = nodes[subscribedNodeIndex].Engine().Author(ev.NewChain[0].Header()) nodes[subscribedNodeIndex].Engine().Author(ev.NewChain[0].Header())
// newAuthor, _ = nodes[subscribedNodeIndex].Engine().Author(ev.NewChain[0].Header())
newTD = nodes[faultyProducerIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64()) newTD = nodes[faultyProducerIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64())
if newTD == nil { if newTD == nil {
newTD = nodes[subscribedNodeIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64()) newTD = nodes[subscribedNodeIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64())
} }
} }
if len(ev.OldChain) > 0 { if len(ev.OldChain) > 0 {
oldAuthor, _ = nodes[subscribedNodeIndex].Engine().Author(ev.OldChain[0].Header()) nodes[subscribedNodeIndex].Engine().Author(ev.OldChain[0].Header())
// oldAuthor, _ = nodes[subscribedNodeIndex].Engine().Author(ev.OldChain[0].Header())
oldTD = nodes[subscribedNodeIndex].BlockChain().GetTd(ev.OldChain[0].Hash(), ev.OldChain[0].NumberU64()) oldTD = nodes[subscribedNodeIndex].BlockChain().GetTd(ev.OldChain[0].Hash(), ev.OldChain[0].NumberU64())
if oldTD == nil { if oldTD == nil {
oldTD = nodes[faultyProducerIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64()) oldTD = nodes[faultyProducerIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64())
} }
} }
log.Warn("Observer Reorg", "newAuthor", newAuthor, "oldAuthor", oldAuthor) // log.Warn("Observer Reorg", "newAuthor", newAuthor, "oldAuthor", oldAuthor)
log.Warn("Reorgs lengths", "old chain length", len(ev.OldChain), "new chain length", len(ev.NewChain)) // log.Warn("Reorgs lengths", "old chain length", len(ev.OldChain), "new chain length", len(ev.NewChain))
if newTD.Cmp(oldTD) == 1 { if newTD.Cmp(oldTD) == 1 {
validReorg = true validReorg = true
} }
if len(ev.OldChain) > 1 { if len(ev.OldChain) > 1 {
observerOldChainLength = uint64(len(ev.OldChain)) observerOldChainLength = uint64(len(ev.OldChain))
observerNewChainLength = uint64(len(ev.NewChain)) observerNewChainLength = uint64(len(ev.NewChain))
return observerNewChainLength, observerOldChainLength, faultyNewChainLength, faultyOldChainLength, validReorg, oldTD, newTD return observerNewChainLength, observerOldChainLength, faultyNewChainLength, faultyOldChainLength, validReorg, oldTD, newTD
} }
} }
case ev := <-chain2HeadChFaulty: case ev := <-chain2HeadChFaulty:
// var newAuthor, oldAuthor common.Address
var newAuthor, oldAuthor common.Address
var newTD, oldTD *big.Int var newTD, oldTD *big.Int
if ev.Type == core.Chain2HeadReorgEvent { if ev.Type == core.Chain2HeadReorgEvent {
if len(ev.NewChain) > 0 { if len(ev.NewChain) > 0 {
newAuthor, _ = nodes[subscribedNodeIndex].Engine().Author(ev.NewChain[0].Header()) nodes[subscribedNodeIndex].Engine().Author(ev.NewChain[0].Header())
// newAuthor, _ = nodes[subscribedNodeIndex].Engine().Author(ev.NewChain[0].Header())
newTD = nodes[subscribedNodeIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64()) newTD = nodes[subscribedNodeIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64())
if newTD == nil { if newTD == nil {
newTD = nodes[faultyProducerIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64()) newTD = nodes[faultyProducerIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64())
@ -436,31 +447,34 @@ func SetupValidatorsAndTest(t *testing.T, tt map[string]uint64) (uint64, uint64,
} }
if len(ev.OldChain) > 0 { if len(ev.OldChain) > 0 {
oldAuthor, _ = nodes[subscribedNodeIndex].Engine().Author(ev.OldChain[0].Header()) nodes[subscribedNodeIndex].Engine().Author(ev.OldChain[0].Header())
// oldAuthor, _ = nodes[subscribedNodeIndex].Engine().Author(ev.OldChain[0].Header())
oldTD = nodes[faultyProducerIndex].BlockChain().GetTd(ev.OldChain[0].Hash(), ev.OldChain[0].NumberU64()) oldTD = nodes[faultyProducerIndex].BlockChain().GetTd(ev.OldChain[0].Hash(), ev.OldChain[0].NumberU64())
if oldTD == nil { if oldTD == nil {
oldTD = nodes[subscribedNodeIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64()) oldTD = nodes[subscribedNodeIndex].BlockChain().GetTd(ev.NewChain[0].Hash(), ev.NewChain[0].NumberU64())
} }
} }
log.Warn("Reorg on Faulty Node", "newAuthor", newAuthor, "oldAuthor", oldAuthor) // log.Warn("Reorg on Faulty Node", "newAuthor", newAuthor, "oldAuthor", oldAuthor)
log.Warn("Reorg on Faulty Node", "newTD", newTD, "oldTD", oldTD) // log.Warn("Reorg on Faulty Node", "newTD", newTD, "oldTD", oldTD)
if newTD.Cmp(oldTD) == 1 { if newTD.Cmp(oldTD) == 1 {
validReorg = true validReorg = true
} }
if len(ev.OldChain) > 1 { if len(ev.OldChain) > 1 {
faultyOldChainLength = uint64(len(ev.OldChain)) faultyOldChainLength = uint64(len(ev.OldChain))
faultyNewChainLength = uint64(len(ev.NewChain)) faultyNewChainLength = uint64(len(ev.NewChain))
return observerNewChainLength, observerOldChainLength, faultyNewChainLength, faultyOldChainLength, validReorg, oldTD, newTD return observerNewChainLength, observerOldChainLength, faultyNewChainLength, faultyOldChainLength, validReorg, oldTD, newTD
} }
} }
default: default:
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
} }
} }
return 0, 0, 0, 0, false, big.NewInt(0), big.NewInt(0)
} }
func InitMiner1(genesis *core.Genesis, privKey *ecdsa.PrivateKey, withoutHeimdall bool) (*node.Node, *eth.Ethereum, error) { func InitMiner1(genesis *core.Genesis, privKey *ecdsa.PrivateKey, withoutHeimdall bool) (*node.Node, *eth.Ethereum, error) {
@ -483,6 +497,7 @@ func InitMiner1(genesis *core.Genesis, privKey *ecdsa.PrivateKey, withoutHeimdal
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
ethBackend, err := eth.New(stack, &ethconfig.Config{ ethBackend, err := eth.New(stack, &ethconfig.Config{
Genesis: genesis, Genesis: genesis,
NetworkId: genesis.Config.ChainID.Uint64(), NetworkId: genesis.Config.ChainID.Uint64(),
@ -500,6 +515,7 @@ func InitMiner1(genesis *core.Genesis, privKey *ecdsa.PrivateKey, withoutHeimdal
}, },
WithoutHeimdall: withoutHeimdall, WithoutHeimdall: withoutHeimdall,
}) })
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -518,13 +534,13 @@ func InitMiner1(genesis *core.Genesis, privKey *ecdsa.PrivateKey, withoutHeimdal
// ethBackend.AccountManager().AddBackend() // ethBackend.AccountManager().AddBackend()
err = stack.Start() err = stack.Start()
return stack, ethBackend, err return stack, ethBackend, err
} }
func InitGenesisWithSprint(t *testing.T, faucets []*ecdsa.PrivateKey, fileLocation string, sprintSize uint64) *core.Genesis { func InitGenesisWithSprint(t *testing.T, faucets []*ecdsa.PrivateKey, fileLocation string, sprintSize uint64) *core.Genesis {
// sprint size = 8 in genesis // sprint size = 8 in genesis
genesisData, err := ioutil.ReadFile(fileLocation) genesisData, err := os.ReadFile(fileLocation)
if err != nil { if err != nil {
t.Fatalf("%s", err) t.Fatalf("%s", err)
} }

View file

@ -18,7 +18,9 @@
"period": { "period": {
"0": 1 "0": 1
}, },
"producerDelay": 4, "producerDelay": {
"0": 6
},
"sprint": { "sprint": {
"0": 4, "0": 4,
"32": 2 "32": 2

View file

@ -18,7 +18,9 @@
"period": { "period": {
"0": 1 "0": 1
}, },
"producerDelay": 6, "producerDelay": {
"0": 6
},
"sprint": { "sprint": {
"0": 32, "0": 32,
"200": 8 "200": 8

View file

@ -18,7 +18,9 @@
"period": { "period": {
"0": 1 "0": 1
}, },
"producerDelay": 4, "producerDelay": {
"0": 4
},
"sprint": { "sprint": {
"0": 8 "0": 8
}, },

View file

@ -18,7 +18,9 @@
"period": { "period": {
"0": 1 "0": 1
}, },
"producerDelay": 6, "producerDelay": {
"0": 6
},
"sprint": { "sprint": {
"0": 32 "0": 32
}, },
@ -78,4 +80,3 @@
"gasUsed": "0x0", "gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
} }

View file

@ -18,7 +18,9 @@
"period": { "period": {
"0": 1 "0": 1
}, },
"producerDelay": 4, "producerDelay": {
"0": 6
},
"sprint": { "sprint": {
"0": 8, "0": 8,
"16": 4 "16": 4