2022-08-29 14:25:30 +00:00
|
|
|
// stm: #unit
|
2019-12-16 19:22:56 +00:00
|
|
|
package store_test
|
|
|
|
|
|
|
|
import (
|
2020-03-21 01:15:31 +00:00
|
|
|
"bytes"
|
2019-12-16 19:22:56 +00:00
|
|
|
"context"
|
2020-11-01 13:03:21 +00:00
|
|
|
"io"
|
2019-12-16 19:22:56 +00:00
|
|
|
"testing"
|
|
|
|
|
2022-06-15 10:06:22 +00:00
|
|
|
"github.com/ipfs/go-datastore"
|
2023-01-18 16:22:05 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2020-05-12 17:58:12 +00:00
|
|
|
|
2023-07-27 14:34:44 +00:00
|
|
|
"github.com/filecoin-project/go-address"
|
2020-09-07 03:49:10 +00:00
|
|
|
"github.com/filecoin-project/go-state-types/abi"
|
|
|
|
"github.com/filecoin-project/go-state-types/crypto"
|
2020-03-21 01:15:31 +00:00
|
|
|
|
2021-01-29 20:01:00 +00:00
|
|
|
"github.com/filecoin-project/lotus/blockstore"
|
2020-09-23 19:24:51 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/actors/policy"
|
2022-09-27 10:21:42 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/consensus"
|
2021-09-02 16:07:23 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/consensus/filcns"
|
2020-05-12 17:58:12 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/gen"
|
2023-03-12 13:33:36 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/index"
|
2020-10-22 13:58:22 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/stmgr"
|
2020-05-12 17:58:12 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/store"
|
|
|
|
"github.com/filecoin-project/lotus/chain/types"
|
|
|
|
"github.com/filecoin-project/lotus/node/repo"
|
2019-12-16 19:22:56 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
2020-09-23 19:24:51 +00:00
|
|
|
policy.SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg2KiBV1)
|
|
|
|
policy.SetConsensusMinerMinPower(abi.NewStoragePower(2048))
|
|
|
|
policy.SetMinVerifiedDealSize(abi.NewStoragePower(256))
|
2019-12-16 19:22:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func BenchmarkGetRandomness(b *testing.B) {
|
feat: Add additional test annotations (#8272)
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate repub and selection tests
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
* Fix markset annotations
* doc: test annotations for the markets dagstore wrapper
* Annotate miner_api test in dagstore
* Annotate more test files
* Remove bad annotations from fsrepo
* Annotate wdpost system
* Remove bad annotations
* Renamce "conformance" to "chaos_actor" tests
* doc: stm annotations for blockheader & election proof tests
* Annotate remaining "A" tests
* annotate: stm for error_test
* memrepo_test.go
* Annotate "b" file tests
* message_test.go
* doc: stm annotate for fsrepo_test
* Annotate "c" file tests
* Annotate "D" test files
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate u,v,wl tests
* doc: stm annotations for various test files
* Annotate "T" test files
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add mempool unit tests
* Add two more memPool Add tests
* Update submodules
* Add check function tests
* Add stm annotations, refactor test helper
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
solving merge conflicts
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
solve merge conflict
* Fix markset annotations
* Annotate miner_api test in dagstore
* Annotate more test files
* doc: test annotations for the markets dagstore wrapper
* Annotate wdpost system
* Renamce "conformance" to "chaos_actor" tests
* Annotate remaining "A" tests
* doc: stm annotations for blockheader & election proof tests
* annotate: stm for error_test
* Annotate "b" file tests
* memrepo_test.go
* Annotate "c" file tests
* message_test.go
* Annotate "D" test files
* doc: stm annotate for fsrepo_test
* Annotate u,v,wl tests
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate "T" test files
* doc: stm annotations for various test files
* Add mempool unit tests
solve merge conflict
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add two more memPool Add tests
* Update submodules
* Add check function tests
solve conflict
* Add stm annotations, refactor test helper
solve merge conflict
* Change CLI test kinds to "unit"
* Fix double merged test
* Fix ccupgrade_test merge
* Fix lint issues
* Add stm annotation to types_Test
* Test vectors submodule
* Add file annotation to burn_test
Co-authored-by: Nikola Divic <divicnikola@gmail.com>
Co-authored-by: TheMenko <themenkoprojects@gmail.com>
2022-03-16 17:37:34 +00:00
|
|
|
//stm: @CHAIN_GEN_NEXT_TIPSET_001
|
|
|
|
//stm: @CHAIN_STATE_GET_RANDOMNESS_FROM_TICKETS_001
|
2019-12-16 19:22:56 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
2021-02-28 22:48:36 +00:00
|
|
|
bs, err := lr.Blockstore(context.TODO(), repo.UniversalBlockstore)
|
2019-12-16 19:22:56 +00:00
|
|
|
if err != nil {
|
|
|
|
b.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2020-11-01 13:03:21 +00:00
|
|
|
defer func() {
|
|
|
|
if c, ok := bs.(io.Closer); ok {
|
|
|
|
if err := c.Close(); err != nil {
|
|
|
|
b.Logf("WARN: failed to close blockstore: %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
2021-01-26 10:25:34 +00:00
|
|
|
mds, err := lr.Datastore(context.Background(), "/metadata")
|
2019-12-16 19:22:56 +00:00
|
|
|
if err != nil {
|
|
|
|
b.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2021-09-02 16:07:23 +00:00
|
|
|
cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil)
|
2020-11-16 22:22:08 +00:00
|
|
|
defer cs.Close() //nolint:errcheck
|
2019-12-16 19:22:56 +00:00
|
|
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
2021-09-18 17:57:04 +00:00
|
|
|
_, err := cg.StateManager().GetRandomnessFromTickets(context.TODO(), crypto.DomainSeparationTag_SealRandomness, 500, nil, last.Key())
|
2019-12-16 19:22:56 +00:00
|
|
|
if err != nil {
|
|
|
|
b.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-03-21 01:15:31 +00:00
|
|
|
|
|
|
|
func TestChainExportImport(t *testing.T) {
|
feat: Add additional test annotations (#8272)
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate repub and selection tests
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
* Fix markset annotations
* doc: test annotations for the markets dagstore wrapper
* Annotate miner_api test in dagstore
* Annotate more test files
* Remove bad annotations from fsrepo
* Annotate wdpost system
* Remove bad annotations
* Renamce "conformance" to "chaos_actor" tests
* doc: stm annotations for blockheader & election proof tests
* Annotate remaining "A" tests
* annotate: stm for error_test
* memrepo_test.go
* Annotate "b" file tests
* message_test.go
* doc: stm annotate for fsrepo_test
* Annotate "c" file tests
* Annotate "D" test files
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate u,v,wl tests
* doc: stm annotations for various test files
* Annotate "T" test files
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add mempool unit tests
* Add two more memPool Add tests
* Update submodules
* Add check function tests
* Add stm annotations, refactor test helper
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
solving merge conflicts
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
solve merge conflict
* Fix markset annotations
* Annotate miner_api test in dagstore
* Annotate more test files
* doc: test annotations for the markets dagstore wrapper
* Annotate wdpost system
* Renamce "conformance" to "chaos_actor" tests
* Annotate remaining "A" tests
* doc: stm annotations for blockheader & election proof tests
* annotate: stm for error_test
* Annotate "b" file tests
* memrepo_test.go
* Annotate "c" file tests
* message_test.go
* Annotate "D" test files
* doc: stm annotate for fsrepo_test
* Annotate u,v,wl tests
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate "T" test files
* doc: stm annotations for various test files
* Add mempool unit tests
solve merge conflict
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add two more memPool Add tests
* Update submodules
* Add check function tests
solve conflict
* Add stm annotations, refactor test helper
solve merge conflict
* Change CLI test kinds to "unit"
* Fix double merged test
* Fix ccupgrade_test merge
* Fix lint issues
* Add stm annotation to types_Test
* Test vectors submodule
* Add file annotation to burn_test
Co-authored-by: Nikola Divic <divicnikola@gmail.com>
Co-authored-by: TheMenko <themenkoprojects@gmail.com>
2022-03-16 17:37:34 +00:00
|
|
|
//stm: @CHAIN_GEN_NEXT_TIPSET_001
|
|
|
|
//stm: @CHAIN_STORE_IMPORT_001
|
2020-03-21 01:15:31 +00:00
|
|
|
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)
|
2020-09-11 00:28:25 +00:00
|
|
|
if err := cg.ChainStore().Export(context.TODO(), last, 0, false, buf); err != nil {
|
2020-03-21 01:15:31 +00:00
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2022-12-02 21:13:12 +00:00
|
|
|
nbs := blockstore.NewMemorySync()
|
2021-09-02 16:07:23 +00:00
|
|
|
cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), filcns.Weight, nil)
|
2020-11-16 22:22:08 +00:00
|
|
|
defer cs.Close() //nolint:errcheck
|
2020-03-21 01:15:31 +00:00
|
|
|
|
2023-11-25 21:29:57 +00:00
|
|
|
root, _, err := cs.Import(context.TODO(), buf)
|
2020-03-21 01:15:31 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !root.Equals(last) {
|
|
|
|
t.Fatal("imported chain differed from exported chain")
|
|
|
|
}
|
|
|
|
}
|
2020-10-22 13:58:22 +00:00
|
|
|
|
2023-01-18 16:22:05 +00:00
|
|
|
// Test to check if tipset key cids are being stored on snapshot
|
|
|
|
func TestChainImportTipsetKeyCid(t *testing.T) {
|
|
|
|
|
|
|
|
ctx := context.Background()
|
|
|
|
cg, err := gen.NewGenerator()
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
buf := new(bytes.Buffer)
|
|
|
|
var last *types.TipSet
|
|
|
|
var tsKeys []types.TipSetKey
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
ts, err := cg.NextTipSet()
|
|
|
|
require.NoError(t, err)
|
|
|
|
last = ts.TipSet.TipSet()
|
|
|
|
tsKeys = append(tsKeys, last.Key())
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := cg.ChainStore().Export(ctx, last, last.Height(), false, buf); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
nbs := blockstore.NewMemorySync()
|
|
|
|
cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), filcns.Weight, nil)
|
|
|
|
defer cs.Close() //nolint:errcheck
|
|
|
|
|
2023-11-25 21:29:57 +00:00
|
|
|
root, _, err := cs.Import(ctx, buf)
|
2023-01-18 16:22:05 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
require.Truef(t, root.Equals(last), "imported chain differed from exported chain")
|
|
|
|
|
|
|
|
err = cs.SetHead(ctx, last)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
for _, tsKey := range tsKeys {
|
|
|
|
_, err := cs.LoadTipSet(ctx, tsKey)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
tsCid, err := tsKey.Cid()
|
|
|
|
require.NoError(t, err)
|
|
|
|
_, err = cs.ChainLocalBlockstore().Get(ctx, tsCid)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-22 13:58:22 +00:00
|
|
|
func TestChainExportImportFull(t *testing.T) {
|
feat: Add additional test annotations (#8272)
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate repub and selection tests
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
* Fix markset annotations
* doc: test annotations for the markets dagstore wrapper
* Annotate miner_api test in dagstore
* Annotate more test files
* Remove bad annotations from fsrepo
* Annotate wdpost system
* Remove bad annotations
* Renamce "conformance" to "chaos_actor" tests
* doc: stm annotations for blockheader & election proof tests
* Annotate remaining "A" tests
* annotate: stm for error_test
* memrepo_test.go
* Annotate "b" file tests
* message_test.go
* doc: stm annotate for fsrepo_test
* Annotate "c" file tests
* Annotate "D" test files
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate u,v,wl tests
* doc: stm annotations for various test files
* Annotate "T" test files
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add mempool unit tests
* Add two more memPool Add tests
* Update submodules
* Add check function tests
* Add stm annotations, refactor test helper
* Annotate api,proxy_util,blockstore_badger, policy tests
* Annotate splitstore: bsbadger / markset
solving merge conflicts
* Annotate splitstore feature
* Annotate union/timed blockstore tests
* Annotate openrpc, diff_adt tests
* Annotate error,drand,events tests
* Annotate predicates_test
* Fix annotations
* Annotate tscache, gen tests
* Annotate fundmanager test
* Annotate statetree_test
* Annotate forks_test
* Annotate searchwait_test.go
* Fix duplicated @@ symbols
* Annotate chain stmgr/store tests
* Annotate more (types) tests
* More tests annotated
* Annotate conformance chaos actor tests
* Annotate more integration tests
* Annotate journal system tests
* Annotate more tests.
* Annotate gas,head buffer behaviors
solve merge conflict
* Fix markset annotations
* Annotate miner_api test in dagstore
* Annotate more test files
* doc: test annotations for the markets dagstore wrapper
* Annotate wdpost system
* Renamce "conformance" to "chaos_actor" tests
* Annotate remaining "A" tests
* doc: stm annotations for blockheader & election proof tests
* annotate: stm for error_test
* Annotate "b" file tests
* memrepo_test.go
* Annotate "c" file tests
* message_test.go
* Annotate "D" test files
* doc: stm annotate for fsrepo_test
* Annotate u,v,wl tests
* message_test.go
* doc: stm annotate for chain, node/config & client
* docs: stm annotate node_test
* Annotate "T" test files
* doc: stm annotations for various test files
* Add mempool unit tests
solve merge conflict
* doc: stm annotate for proxy_util_test & policy_test
* doc: stm annotate for various tests
* doc: final few stm annotations
* Add two more memPool Add tests
* Update submodules
* Add check function tests
solve conflict
* Add stm annotations, refactor test helper
solve merge conflict
* Change CLI test kinds to "unit"
* Fix double merged test
* Fix ccupgrade_test merge
* Fix lint issues
* Add stm annotation to types_Test
* Test vectors submodule
* Add file annotation to burn_test
Co-authored-by: Nikola Divic <divicnikola@gmail.com>
Co-authored-by: TheMenko <themenkoprojects@gmail.com>
2022-03-16 17:37:34 +00:00
|
|
|
//stm: @CHAIN_GEN_NEXT_TIPSET_001
|
|
|
|
//stm: @CHAIN_STORE_IMPORT_001, @CHAIN_STORE_EXPORT_001, @CHAIN_STORE_SET_HEAD_001
|
|
|
|
//stm: @CHAIN_STORE_GET_TIPSET_BY_HEIGHT_001
|
2020-10-22 13:58:22 +00:00
|
|
|
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)
|
2020-10-23 19:45:08 +00:00
|
|
|
if err := cg.ChainStore().Export(context.TODO(), last, last.Height(), false, buf); err != nil {
|
2020-10-22 13:58:22 +00:00
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2022-12-02 21:13:12 +00:00
|
|
|
nbs := blockstore.NewMemorySync()
|
2023-02-27 17:27:48 +00:00
|
|
|
ds := datastore.NewMapDatastore()
|
|
|
|
cs := store.NewChainStore(nbs, nbs, ds, filcns.Weight, nil)
|
2020-11-16 22:22:08 +00:00
|
|
|
defer cs.Close() //nolint:errcheck
|
|
|
|
|
2023-11-25 21:29:57 +00:00
|
|
|
root, _, err := cs.Import(context.TODO(), buf)
|
2020-10-22 13:58:22 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2021-12-14 15:45:38 +00:00
|
|
|
err = cs.SetHead(context.Background(), last)
|
2020-10-22 13:58:22 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !root.Equals(last) {
|
|
|
|
t.Fatal("imported chain differed from exported chain")
|
|
|
|
}
|
|
|
|
|
2023-03-12 13:33:36 +00:00
|
|
|
sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), nil, filcns.DefaultUpgradeSchedule(), cg.BeaconSchedule(), ds, index.DummyMsgIndex)
|
2021-09-02 16:07:23 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2020-10-22 13:58:22 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-07-27 14:34:44 +00:00
|
|
|
|
2023-08-09 23:40:53 +00:00
|
|
|
func TestEquivocations(t *testing.T) {
|
2023-07-27 14:34:44 +00:00
|
|
|
ctx := context.Background()
|
|
|
|
cg, err := gen.NewGenerator()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
var last *types.TipSet
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
ts, err := cg.NextTipSet()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
last = ts.TipSet.TipSet()
|
|
|
|
}
|
|
|
|
|
2023-08-10 00:50:13 +00:00
|
|
|
mTs, err := cg.NextTipSetFromMiners(last, []address.Address{last.Blocks()[0].Miner}, 0)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, 1, len(mTs.TipSet.TipSet().Cids()))
|
|
|
|
last = mTs.TipSet.TipSet()
|
|
|
|
|
2023-07-27 14:34:44 +00:00
|
|
|
require.NotEmpty(t, last.Blocks())
|
|
|
|
blk1 := *last.Blocks()[0]
|
|
|
|
|
|
|
|
// quick check: asking to form tipset at latest height just returns head
|
|
|
|
bestHead, bestHeadWeight, err := cg.ChainStore().FormHeaviestTipSetForHeight(ctx, last.Height())
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, last.Key(), bestHead.Key())
|
|
|
|
require.Contains(t, last.Cids(), blk1.Cid())
|
|
|
|
expectedWeight, err := cg.ChainStore().Weight(ctx, bestHead)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, expectedWeight, bestHeadWeight)
|
|
|
|
|
|
|
|
// add another block by a different miner -- it should get included in the best tipset
|
|
|
|
blk2 := blk1
|
|
|
|
blk1Miner, err := address.IDFromAddress(blk2.Miner)
|
|
|
|
require.NoError(t, err)
|
|
|
|
blk2.Miner, err = address.NewIDAddress(blk1Miner + 50)
|
|
|
|
require.NoError(t, err)
|
|
|
|
addBlockToTracker(t, cg.ChainStore(), &blk2)
|
|
|
|
|
|
|
|
bestHead, bestHeadWeight, err = cg.ChainStore().FormHeaviestTipSetForHeight(ctx, last.Height())
|
|
|
|
require.NoError(t, err)
|
|
|
|
for _, blkCid := range last.Cids() {
|
|
|
|
require.Contains(t, bestHead.Cids(), blkCid)
|
|
|
|
}
|
|
|
|
require.Contains(t, bestHead.Cids(), blk2.Cid())
|
|
|
|
expectedWeight, err = cg.ChainStore().Weight(ctx, bestHead)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, expectedWeight, bestHeadWeight)
|
|
|
|
|
|
|
|
// add another block by a different miner, but on a different tipset -- it should NOT get included
|
|
|
|
blk3 := blk1
|
|
|
|
blk3.Miner, err = address.NewIDAddress(blk1Miner + 100)
|
|
|
|
require.NoError(t, err)
|
2023-08-10 00:50:13 +00:00
|
|
|
blk1Parent, err := cg.ChainStore().GetBlock(ctx, blk3.Parents[0])
|
|
|
|
require.NoError(t, err)
|
|
|
|
blk3.Parents = blk1Parent.Parents
|
2023-07-27 14:34:44 +00:00
|
|
|
addBlockToTracker(t, cg.ChainStore(), &blk3)
|
|
|
|
|
|
|
|
bestHead, bestHeadWeight, err = cg.ChainStore().FormHeaviestTipSetForHeight(ctx, last.Height())
|
|
|
|
require.NoError(t, err)
|
|
|
|
for _, blkCid := range last.Cids() {
|
|
|
|
require.Contains(t, bestHead.Cids(), blkCid)
|
|
|
|
}
|
|
|
|
require.Contains(t, bestHead.Cids(), blk2.Cid())
|
|
|
|
require.NotContains(t, bestHead.Cids(), blk3.Cid())
|
|
|
|
expectedWeight, err = cg.ChainStore().Weight(ctx, bestHead)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, expectedWeight, bestHeadWeight)
|
|
|
|
|
|
|
|
// add another block by the same miner as blk1 -- it should NOT get included, and blk1 should be excluded too
|
|
|
|
blk4 := blk1
|
|
|
|
blk4.Timestamp = blk1.Timestamp + 1
|
|
|
|
addBlockToTracker(t, cg.ChainStore(), &blk4)
|
|
|
|
|
|
|
|
bestHead, bestHeadWeight, err = cg.ChainStore().FormHeaviestTipSetForHeight(ctx, last.Height())
|
|
|
|
require.NoError(t, err)
|
|
|
|
for _, blkCid := range last.Cids() {
|
|
|
|
if blkCid != blk1.Cid() {
|
|
|
|
require.Contains(t, bestHead.Cids(), blkCid)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
require.NotContains(t, bestHead.Cids(), blk4.Cid())
|
|
|
|
require.NotContains(t, bestHead.Cids(), blk1.Cid())
|
|
|
|
expectedWeight, err = cg.ChainStore().Weight(ctx, bestHead)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, expectedWeight, bestHeadWeight)
|
2023-08-09 23:40:53 +00:00
|
|
|
|
|
|
|
// check that after all of that, the chainstore's head has NOT changed
|
|
|
|
require.Equal(t, last.Key(), cg.ChainStore().GetHeaviestTipSet().Key())
|
|
|
|
|
|
|
|
// NOW, after all that, notify the chainstore to refresh its head
|
|
|
|
require.NoError(t, cg.ChainStore().RefreshHeaviestTipSet(ctx, blk1.Height+1))
|
|
|
|
|
2023-08-10 00:50:13 +00:00
|
|
|
originalHead := *last
|
2023-08-09 23:40:53 +00:00
|
|
|
newHead := cg.ChainStore().GetHeaviestTipSet()
|
2023-08-10 00:50:13 +00:00
|
|
|
// the newHead should be at the same height as the originalHead
|
|
|
|
require.Equal(t, originalHead.Height(), newHead.Height())
|
|
|
|
// the newHead should NOT be the same as the originalHead
|
|
|
|
require.NotEqual(t, originalHead.Key(), newHead.Key())
|
2023-08-09 23:40:53 +00:00
|
|
|
// specifically, it should not contain any blocks by blk1Miner
|
|
|
|
for _, b := range newHead.Blocks() {
|
|
|
|
require.NotEqual(t, blk1.Miner, b.Miner)
|
|
|
|
}
|
2023-08-10 00:50:13 +00:00
|
|
|
|
|
|
|
// now have blk2's Miner equivocate too! this causes us to switch to a tipset with a different parent!
|
|
|
|
blk5 := blk2
|
|
|
|
blk5.Timestamp = blk5.Timestamp + 1
|
|
|
|
addBlockToTracker(t, cg.ChainStore(), &blk5)
|
|
|
|
|
|
|
|
// notify the chainstore to refresh its head
|
|
|
|
require.NoError(t, cg.ChainStore().RefreshHeaviestTipSet(ctx, blk1.Height+1))
|
|
|
|
newHead = cg.ChainStore().GetHeaviestTipSet()
|
|
|
|
// the newHead should still be at the same height as the originalHead
|
|
|
|
require.Equal(t, originalHead.Height(), newHead.Height())
|
|
|
|
// BUT it should no longer have the same parents -- only blk3's miner is good, and they mined on a different tipset
|
|
|
|
require.Equal(t, 1, len(newHead.Blocks()))
|
|
|
|
require.Equal(t, blk3.Cid(), newHead.Cids()[0])
|
|
|
|
require.NotEqual(t, originalHead.Parents(), newHead.Parents())
|
|
|
|
|
|
|
|
// now have blk3's Miner equivocate too! this causes us to switch to a previous epoch entirely :(
|
|
|
|
blk6 := blk3
|
|
|
|
blk6.Timestamp = blk6.Timestamp + 1
|
|
|
|
addBlockToTracker(t, cg.ChainStore(), &blk6)
|
|
|
|
|
|
|
|
// trying to form a tipset at our previous height leads to emptiness
|
|
|
|
tryTs, tryTsWeight, err := cg.ChainStore().FormHeaviestTipSetForHeight(ctx, blk1.Height)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Nil(t, tryTs)
|
|
|
|
require.True(t, tryTsWeight.IsZero())
|
|
|
|
|
|
|
|
// notify the chainstore to refresh its head
|
|
|
|
require.NoError(t, cg.ChainStore().RefreshHeaviestTipSet(ctx, blk1.Height+1))
|
|
|
|
newHead = cg.ChainStore().GetHeaviestTipSet()
|
|
|
|
// the newHead should now be one epoch behind originalHead
|
|
|
|
require.Greater(t, originalHead.Height(), newHead.Height())
|
|
|
|
|
|
|
|
// next, we create a new tipset with only one block after many null rounds
|
|
|
|
headAfterNulls, err := cg.NextTipSetFromMiners(newHead, []address.Address{newHead.Blocks()[0].Miner}, 15)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, 1, len(headAfterNulls.TipSet.Blocks))
|
|
|
|
|
|
|
|
// now, we disqualify the block in this tipset because of equivocation
|
|
|
|
blkAfterNulls := headAfterNulls.TipSet.TipSet().Blocks()[0]
|
|
|
|
equivocatedBlkAfterNulls := *blkAfterNulls
|
|
|
|
equivocatedBlkAfterNulls.Timestamp = blkAfterNulls.Timestamp + 1
|
|
|
|
addBlockToTracker(t, cg.ChainStore(), &equivocatedBlkAfterNulls)
|
|
|
|
|
|
|
|
// try to form a tipset at this height -- it should be empty
|
|
|
|
tryTs2, tryTsWeight2, err := cg.ChainStore().FormHeaviestTipSetForHeight(ctx, blkAfterNulls.Height)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Nil(t, tryTs2)
|
|
|
|
require.True(t, tryTsWeight2.IsZero())
|
|
|
|
|
2023-08-11 20:46:56 +00:00
|
|
|
// now we "notify" at this height -- it should lead to no head change because there's no formable head in near epochs
|
|
|
|
require.NoError(t, cg.ChainStore().RefreshHeaviestTipSet(ctx, blkAfterNulls.Height))
|
|
|
|
require.True(t, headAfterNulls.TipSet.TipSet().Equals(cg.ChainStore().GetHeaviestTipSet()))
|
2023-07-27 14:34:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func addBlockToTracker(t *testing.T, cs *store.ChainStore, blk *types.BlockHeader) {
|
|
|
|
blk2Ts, err := types.NewTipSet([]*types.BlockHeader{blk})
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.NoError(t, cs.PersistTipsets(context.TODO(), []*types.TipSet{blk2Ts}))
|
|
|
|
require.NoError(t, cs.AddToTipSetTracker(context.TODO(), blk))
|
|
|
|
}
|