10 "chain/protocol/bc/legacy"
11 "chain/protocol/prottest/memstore"
12 "chain/protocol/state"
16 func TestRecoverSnapshotNoAdditionalBlocks(t *testing.T) {
17 store := memstore.New()
18 b, err := NewInitialBlock(nil, 0, time.Now().Add(-time.Minute))
20 testutil.FatalErr(t, err)
22 c1, err := NewChain(context.Background(), b.Hash(), store, nil)
26 err = c1.CommitAppliedBlock(context.Background(), b, state.Empty())
28 testutil.FatalErr(t, err)
31 // Snapshots are applied asynchronously. This loops waits
32 // until the snapshot is created.
34 _, height, _ := store.LatestSnapshot(context.Background())
40 ctx := context.Background()
42 c2, err := NewChain(context.Background(), b.Hash(), store, nil)
46 block, snapshot, err := c2.Recover(ctx)
50 if block.Height != 1 {
51 t.Fatalf("block.Height = %d, want %d", block.Height, 1)
54 err = c2.ValidateBlockForSig(ctx, createEmptyBlock(block, snapshot))
60 func createEmptyBlock(block *legacy.Block, snapshot *state.Snapshot) *legacy.Block {
61 root, err := bc.MerkleRoot(nil)
63 log.Fatalf("calculating empty merkle root: %s", err)
67 BlockHeader: legacy.BlockHeader{
69 Height: block.Height + 1,
70 PreviousBlockHash: block.Hash(),
71 TimestampMS: bc.Millis(time.Now()),
72 BlockCommitment: legacy.BlockCommitment{
73 TransactionsMerkleRoot: root,
74 AssetsMerkleRoot: snapshot.Tree.RootHash(),
75 ConsensusProgram: block.ConsensusProgram,