Skip to content

Commit 2b7f595

Browse files
authored
test(chain): test forking before/after finality (#12652)
1 parent c402b5b commit 2b7f595

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

chain/gen/gen.go

+16-5
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ type ChainGen struct {
7777

7878
GetMessages func(*ChainGen) ([]*types.SignedMessage, error)
7979

80+
// Set to false to allow the chain to advance without updating the state-tree (e.g., this
81+
// allows one to keep the power without having to post).
82+
AdvanceState bool
83+
8084
w *wallet.LocalWallet
8185

8286
eppProvs map[address.Address]WinningPoStProver
@@ -272,11 +276,12 @@ func NewGeneratorWithSectorsAndUpgradeSchedule(numSectors int, us stmgr.UpgradeS
272276
beacon: beac,
273277
w: w,
274278

275-
GetMessages: getRandomMessages,
276-
Miners: miners,
277-
eppProvs: mgen,
278-
banker: banker,
279-
receivers: receievers,
279+
GetMessages: getRandomMessages,
280+
AdvanceState: true,
281+
Miners: miners,
282+
eppProvs: mgen,
283+
banker: banker,
284+
receivers: receievers,
280285

281286
CurTipset: gents,
282287

@@ -355,6 +360,8 @@ func (cg *ChainGen) nextBlockProof(ctx context.Context, pts *types.TipSet, m add
355360
mbi, err := mc.MinerGetBaseInfo(ctx, m, round, pts.Key())
356361
if err != nil {
357362
return nil, nil, nil, xerrors.Errorf("get miner base info: %w", err)
363+
} else if mbi == nil {
364+
return nil, nil, nil, nil
358365
}
359366

360367
entries := mbi.BeaconEntries
@@ -523,6 +530,10 @@ func (cg *ChainGen) makeBlock(parents *types.TipSet, m address.Address, vrfticke
523530
return nil, err
524531
}
525532

533+
if !cg.AdvanceState {
534+
fblk.Header.ParentStateRoot = parents.ParentState()
535+
}
536+
526537
return fblk, err
527538
}
528539

chain/store/checkpoint_test.go

+39
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/stretchr/testify/require"
99

10+
"github.com/filecoin-project/lotus/chain/actors/policy"
1011
"github.com/filecoin-project/lotus/chain/gen"
1112
)
1213

@@ -20,6 +21,7 @@ func TestChainCheckpoint(t *testing.T) {
2021
if err != nil {
2122
t.Fatal(err)
2223
}
24+
cg.AdvanceState = false
2325

2426
// Let the first miner mine some blocks.
2527
last := cg.CurTipset.TipSet()
@@ -83,4 +85,41 @@ func TestChainCheckpoint(t *testing.T) {
8385

8486
head = cs.GetHeaviestTipSet()
8587
require.True(t, head.Equals(checkpoint))
88+
89+
// Now extend the fork 900 epochs into the future.
90+
for i := 0; i < int(policy.ChainFinality)+10; i++ {
91+
ts, err := cg.NextTipSetFromMiners(last, cg.Miners[1:], 0)
92+
require.NoError(t, err)
93+
94+
last = ts.TipSet.TipSet()
95+
}
96+
97+
// Try to re-checkpoint to the long fork. This will work because we only have to revert a
98+
// single epoch.
99+
err = cs.SetCheckpoint(ctx, last)
100+
require.NoError(t, err)
101+
102+
head = cs.GetHeaviestTipSet()
103+
require.True(t, head.Equals(last))
104+
105+
// Now try to go back to the checkpoint. This should fail because it's too far in the past
106+
// on the wrong fork.
107+
err = cs.SetCheckpoint(ctx, checkpoint)
108+
require.Error(t, err)
109+
110+
// Now extend the checkpoint chain to the same tipset.
111+
for checkpoint.Height() < last.Height() {
112+
ts, err := cg.NextTipSetFromMiners(checkpoint, cg.Miners[1:], 0)
113+
require.NoError(t, err)
114+
115+
checkpoint = ts.TipSet.TipSet()
116+
}
117+
118+
// We should still refuse to switch.
119+
err = cs.SetCheckpoint(ctx, checkpoint)
120+
require.Error(t, err)
121+
122+
// But it should be possible to set a checkpoint on a common chain
123+
err = cs.SetCheckpoint(ctx, checkpointParents)
124+
require.NoError(t, err)
86125
}

0 commit comments

Comments
 (0)