package store_test import ( "bytes" "context" "io" "testing" datastore "github.com/ipfs/go-datastore" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/gen" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/lib/blockstore" "github.com/filecoin-project/lotus/node/repo" ) func init() { policy.SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg2KiBV1) policy.SetConsensusMinerMinPower(abi.NewStoragePower(2048)) policy.SetMinVerifiedDealSize(abi.NewStoragePower(256)) } func BenchmarkGetRandomness(b *testing.B) { cg, err := gen.NewGenerator() if err != nil { b.Fatal(err) } var last *types.TipSet for i := 0; i < 2000; i++ { ts, err := cg.NextTipSet() if err != nil { b.Fatal(err) } last = ts.TipSet.TipSet() } r, err := cg.YieldRepo() if err != nil { b.Fatal(err) } lr, err := r.Lock(repo.FullNode) if err != nil { b.Fatal(err) } bs, err := lr.Blockstore(context.TODO(), repo.BlockstoreChain) if err != nil { b.Fatal(err) } defer func() { if c, ok := bs.(io.Closer); ok { if err := c.Close(); err != nil { b.Logf("WARN: failed to close blockstore: %s", err) } } }() mds, err := lr.Datastore(context.Background(), "/metadata") if err != nil { b.Fatal(err) } cs := store.NewChainStore(bs, bs, mds, nil, nil) defer cs.Close() //nolint:errcheck b.ResetTimer() for i := 0; i < b.N; i++ { _, err := cs.GetChainRandomness(context.TODO(), last.Cids(), crypto.DomainSeparationTag_SealRandomness, 500, nil) if err != nil { b.Fatal(err) } } } func TestChainExportImport(t *testing.T) { cg, err := gen.NewGenerator() if err != nil { t.Fatal(err) } var last *types.TipSet for i := 0; i < 100; i++ { ts, err := cg.NextTipSet() if err != nil { t.Fatal(err) } last = ts.TipSet.TipSet() } buf := new(bytes.Buffer) if err := cg.ChainStore().Export(context.TODO(), last, 0, false, buf); err != nil { t.Fatal(err) } nbs := blockstore.NewTemporary() cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), nil, nil) defer cs.Close() //nolint:errcheck root, err := cs.Import(buf) if err != nil { t.Fatal(err) } if !root.Equals(last) { t.Fatal("imported chain differed from exported chain") } } func TestChainExportImportFull(t *testing.T) { cg, err := gen.NewGenerator() if err != nil { t.Fatal(err) } var last *types.TipSet for i := 0; i < 100; i++ { ts, err := cg.NextTipSet() if err != nil { t.Fatal(err) } last = ts.TipSet.TipSet() } buf := new(bytes.Buffer) if err := cg.ChainStore().Export(context.TODO(), last, last.Height(), false, buf); err != nil { t.Fatal(err) } nbs := blockstore.NewTemporary() cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), nil, nil) defer cs.Close() //nolint:errcheck root, err := cs.Import(buf) if err != nil { t.Fatal(err) } err = cs.SetHead(last) if err != nil { t.Fatal(err) } if !root.Equals(last) { t.Fatal("imported chain differed from exported chain") } sm := stmgr.NewStateManager(cs) for i := 0; i < 100; i++ { ts, err := cs.GetTipsetByHeight(context.TODO(), abi.ChainEpoch(i), nil, false) if err != nil { t.Fatal(err) } st, err := sm.ParentState(ts) if err != nil { t.Fatal(err) } // touches a bunch of actors _, err = sm.GetCirculatingSupply(context.TODO(), abi.ChainEpoch(i), st) if err != nil { t.Fatal(err) } } }