|
|
@@ -24,6 +24,7 @@ import (
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
|
|
"github.com/ethereum/go-ethereum/core"
|
|
|
+ "github.com/ethereum/go-ethereum/core/types"
|
|
|
"github.com/ethereum/go-ethereum/crypto"
|
|
|
"github.com/ethereum/go-ethereum/light"
|
|
|
"github.com/ethereum/go-ethereum/params"
|
|
|
@@ -53,7 +54,7 @@ func testCheckpointSyncing(t *testing.T, protocol int, syncMode int) {
|
|
|
time.Sleep(10 * time.Millisecond)
|
|
|
}
|
|
|
}
|
|
|
- // Generate 128+1 blocks (totally 1 CHT sections)
|
|
|
+ // Generate 128+1 blocks (totally 1 CHT section)
|
|
|
server, client, tearDown := newClientServerEnv(t, int(config.ChtSize+config.ChtConfirms), protocol, waitIndexers, nil, 0, false, false, true)
|
|
|
defer tearDown()
|
|
|
|
|
|
@@ -100,8 +101,7 @@ func testCheckpointSyncing(t *testing.T, protocol int, syncMode int) {
|
|
|
}
|
|
|
|
|
|
done := make(chan error)
|
|
|
- client.handler.syncDone = func() {
|
|
|
- header := client.handler.backend.blockchain.CurrentHeader()
|
|
|
+ client.handler.syncEnd = func(header *types.Header) {
|
|
|
if header.Number.Uint64() == expected {
|
|
|
done <- nil
|
|
|
} else {
|
|
|
@@ -144,7 +144,7 @@ func testMissOracleBackend(t *testing.T, hasCheckpoint bool) {
|
|
|
time.Sleep(10 * time.Millisecond)
|
|
|
}
|
|
|
}
|
|
|
- // Generate 512+4 blocks (totally 1 CHT sections)
|
|
|
+ // Generate 128+1 blocks (totally 1 CHT section)
|
|
|
server, client, tearDown := newClientServerEnv(t, int(config.ChtSize+config.ChtConfirms), 3, waitIndexers, nil, 0, false, false, true)
|
|
|
defer tearDown()
|
|
|
|
|
|
@@ -198,8 +198,7 @@ func testMissOracleBackend(t *testing.T, hasCheckpoint bool) {
|
|
|
}
|
|
|
|
|
|
done := make(chan error)
|
|
|
- client.handler.syncDone = func() {
|
|
|
- header := client.handler.backend.blockchain.CurrentHeader()
|
|
|
+ client.handler.syncEnd = func(header *types.Header) {
|
|
|
if header.Number.Uint64() == expected {
|
|
|
done <- nil
|
|
|
} else {
|
|
|
@@ -220,3 +219,144 @@ func testMissOracleBackend(t *testing.T, hasCheckpoint bool) {
|
|
|
t.Error("checkpoint syncing timeout")
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestSyncFromConfiguredCheckpoint(t *testing.T) {
|
|
|
+ config := light.TestServerIndexerConfig
|
|
|
+
|
|
|
+ waitIndexers := func(cIndexer, bIndexer, btIndexer *core.ChainIndexer) {
|
|
|
+ for {
|
|
|
+ cs, _, _ := cIndexer.Sections()
|
|
|
+ bts, _, _ := btIndexer.Sections()
|
|
|
+ if cs >= 2 && bts >= 2 {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ time.Sleep(10 * time.Millisecond)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Generate 256+1 blocks (totally 2 CHT sections)
|
|
|
+ server, client, tearDown := newClientServerEnv(t, int(2*config.ChtSize+config.ChtConfirms), 3, waitIndexers, nil, 0, false, false, true)
|
|
|
+ defer tearDown()
|
|
|
+
|
|
|
+ // Configure the local checkpoint(the first section)
|
|
|
+ head := server.handler.blockchain.GetHeaderByNumber(config.ChtSize - 1).Hash()
|
|
|
+ cp := ¶ms.TrustedCheckpoint{
|
|
|
+ SectionIndex: 0,
|
|
|
+ SectionHead: head,
|
|
|
+ CHTRoot: light.GetChtRoot(server.db, 0, head),
|
|
|
+ BloomRoot: light.GetBloomTrieRoot(server.db, 0, head),
|
|
|
+ }
|
|
|
+ client.handler.backend.config.SyncFromCheckpoint = true
|
|
|
+ client.handler.backend.config.Checkpoint = cp
|
|
|
+ client.handler.checkpoint = cp
|
|
|
+ client.handler.backend.blockchain.AddTrustedCheckpoint(cp)
|
|
|
+
|
|
|
+ var (
|
|
|
+ start = make(chan error, 1)
|
|
|
+ end = make(chan error, 1)
|
|
|
+ expectStart = config.ChtSize - 1
|
|
|
+ expectEnd = 2*config.ChtSize + config.ChtConfirms
|
|
|
+ )
|
|
|
+ client.handler.syncStart = func(header *types.Header) {
|
|
|
+ if header.Number.Uint64() == expectStart {
|
|
|
+ start <- nil
|
|
|
+ } else {
|
|
|
+ start <- fmt.Errorf("blockchain length mismatch, want %d, got %d", expectStart, header.Number)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ client.handler.syncEnd = func(header *types.Header) {
|
|
|
+ if header.Number.Uint64() == expectEnd {
|
|
|
+ end <- nil
|
|
|
+ } else {
|
|
|
+ end <- fmt.Errorf("blockchain length mismatch, want %d, got %d", expectEnd, header.Number)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Create connected peer pair.
|
|
|
+ if _, _, err := newTestPeerPair("peer", 2, server.handler, client.handler); err != nil {
|
|
|
+ t.Fatalf("Failed to connect testing peers %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ select {
|
|
|
+ case err := <-start:
|
|
|
+ if err != nil {
|
|
|
+ t.Error("sync failed", err)
|
|
|
+ }
|
|
|
+ return
|
|
|
+ case <-time.NewTimer(10 * time.Second).C:
|
|
|
+ t.Error("checkpoint syncing timeout")
|
|
|
+ }
|
|
|
+
|
|
|
+ select {
|
|
|
+ case err := <-end:
|
|
|
+ if err != nil {
|
|
|
+ t.Error("sync failed", err)
|
|
|
+ }
|
|
|
+ return
|
|
|
+ case <-time.NewTimer(10 * time.Second).C:
|
|
|
+ t.Error("checkpoint syncing timeout")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestSyncAll(t *testing.T) {
|
|
|
+ config := light.TestServerIndexerConfig
|
|
|
+
|
|
|
+ waitIndexers := func(cIndexer, bIndexer, btIndexer *core.ChainIndexer) {
|
|
|
+ for {
|
|
|
+ cs, _, _ := cIndexer.Sections()
|
|
|
+ bts, _, _ := btIndexer.Sections()
|
|
|
+ if cs >= 2 && bts >= 2 {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ time.Sleep(10 * time.Millisecond)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Generate 256+1 blocks (totally 2 CHT sections)
|
|
|
+ server, client, tearDown := newClientServerEnv(t, int(2*config.ChtSize+config.ChtConfirms), 3, waitIndexers, nil, 0, false, false, true)
|
|
|
+ defer tearDown()
|
|
|
+
|
|
|
+ client.handler.backend.config.SyncFromCheckpoint = true
|
|
|
+
|
|
|
+ var (
|
|
|
+ start = make(chan error, 1)
|
|
|
+ end = make(chan error, 1)
|
|
|
+ expectStart = uint64(0)
|
|
|
+ expectEnd = 2*config.ChtSize + config.ChtConfirms
|
|
|
+ )
|
|
|
+ client.handler.syncStart = func(header *types.Header) {
|
|
|
+ if header.Number.Uint64() == expectStart {
|
|
|
+ start <- nil
|
|
|
+ } else {
|
|
|
+ start <- fmt.Errorf("blockchain length mismatch, want %d, got %d", expectStart, header.Number)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ client.handler.syncEnd = func(header *types.Header) {
|
|
|
+ if header.Number.Uint64() == expectEnd {
|
|
|
+ end <- nil
|
|
|
+ } else {
|
|
|
+ end <- fmt.Errorf("blockchain length mismatch, want %d, got %d", expectEnd, header.Number)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Create connected peer pair.
|
|
|
+ if _, _, err := newTestPeerPair("peer", 2, server.handler, client.handler); err != nil {
|
|
|
+ t.Fatalf("Failed to connect testing peers %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ select {
|
|
|
+ case err := <-start:
|
|
|
+ if err != nil {
|
|
|
+ t.Error("sync failed", err)
|
|
|
+ }
|
|
|
+ return
|
|
|
+ case <-time.NewTimer(10 * time.Second).C:
|
|
|
+ t.Error("checkpoint syncing timeout")
|
|
|
+ }
|
|
|
+
|
|
|
+ select {
|
|
|
+ case err := <-end:
|
|
|
+ if err != nil {
|
|
|
+ t.Error("sync failed", err)
|
|
|
+ }
|
|
|
+ return
|
|
|
+ case <-time.NewTimer(10 * time.Second).C:
|
|
|
+ t.Error("checkpoint syncing timeout")
|
|
|
+ }
|
|
|
+}
|