diff --git a/app/node/builder.go b/app/node/builder.go index c8473b83a0..441cb0cc05 100644 --- a/app/node/builder.go +++ b/app/node/builder.go @@ -84,8 +84,7 @@ func (b *Builder) build(ctx context.Context) (*Node, error) { b.journal = journal.NewNoopJournal() } - // fetch genesis block id - b.genBlk, err = readGenesisCid(ctx, b.repo.ChainDatastore(), b.repo.Datastore()) + b.genBlk, err = chain2.GenesisBlock(ctx, b.repo.ChainDatastore(), b.repo.Datastore()) if err != nil { return nil, err } diff --git a/app/node/helpers.go b/app/node/helpers.go deleted file mode 100644 index fc0bff1895..0000000000 --- a/app/node/helpers.go +++ /dev/null @@ -1,42 +0,0 @@ -package node - -import ( - "bytes" - "context" - "encoding/json" - - "github.com/ipfs/go-cid" - "github.com/ipfs/go-datastore" - "github.com/pkg/errors" - - "github.com/filecoin-project/venus/pkg/chain" - blockstoreutil "github.com/filecoin-project/venus/venus-shared/blockstore" - "github.com/filecoin-project/venus/venus-shared/types" -) - -// readGenesisCid is a helper function that queries the provided datastore for -// an entry with the genesisKey cid, returning if found. -func readGenesisCid(ctx context.Context, chainDs datastore.Datastore, bs blockstoreutil.Blockstore) (types.BlockHeader, error) { - bb, err := chainDs.Get(ctx, chain.GenesisKey) - if err != nil { - return types.BlockHeader{}, errors.Wrap(err, "failed to read genesisKey") - } - - var c cid.Cid - err = json.Unmarshal(bb, &c) - if err != nil { - return types.BlockHeader{}, errors.Wrap(err, "failed to cast genesisCid") - } - - blkRawData, err := bs.Get(ctx, c) - if err != nil { - return types.BlockHeader{}, errors.Wrap(err, "failed to read genesis block") - } - - var blk types.BlockHeader - err = blk.UnmarshalCBOR(bytes.NewReader(blkRawData.RawData())) - if err != nil { - return types.BlockHeader{}, errors.Wrap(err, "failed to unmarshal genesis block") - } - return blk, nil -} diff --git a/cmd/import.go b/cmd/import.go index 188b61e89a..e76453c282 100644 --- a/cmd/import.go +++ b/cmd/import.go @@ -105,6 +105,14 @@ func importChain(ctx context.Context, r repo.Repo, fname string) error { } logImport.Infof("accepting %s as new head", tip.Key().String()) + genesis, err := chainStore.GetTipSetByHeight(ctx, tip, 0, false) + if err != nil { + return fmt.Errorf("got genesis failed: %v", err) + } + if err := chainStore.PersistGenesisCID(ctx, genesis.Blocks()[0]); err != nil { + return fmt.Errorf("persist genesis failed: %v", err) + } + err = chainStore.WriteCheckPoint(context.TODO(), tip.Key()) if err != nil { logImport.Errorf("set check point error: %s", err.Error()) diff --git a/pkg/chain/store.go b/pkg/chain/store.go index 372d6a399f..2e9fce8204 100644 --- a/pkg/chain/store.go +++ b/pkg/chain/store.go @@ -3,6 +3,7 @@ package chain import ( "bytes" "context" + "encoding/json" "fmt" "io" "os" @@ -413,6 +414,36 @@ func (store *Store) GetGenesisBlock(ctx context.Context) (*types.BlockHeader, er return store.GetBlock(ctx, store.GenesisCid()) } +func (store *Store) PersistGenesisCID(ctx context.Context, blk *types.BlockHeader) error { + data, err := json.Marshal(blk.Cid()) + if err != nil { + return fmt.Errorf("failed to marshal genesis cid: %v", err) + } + + return store.ds.Put(ctx, GenesisKey, data) +} + +func GenesisBlock(ctx context.Context, chainDs datastore.Datastore, bs blockstoreutil.Blockstore) (types.BlockHeader, error) { + bb, err := chainDs.Get(ctx, GenesisKey) + if err != nil { + return types.BlockHeader{}, fmt.Errorf("failed to read genesisKey: %v", err) + } + + var c cid.Cid + err = json.Unmarshal(bb, &c) + if err != nil { + return types.BlockHeader{}, fmt.Errorf("failed to cast genesisCid: %v", err) + } + + var blk types.BlockHeader + err = cbor.NewCborStore(bs).Get(ctx, c, &blk) + if err != nil { + return types.BlockHeader{}, fmt.Errorf("failed to read genesis block: %v", err) + } + + return blk, nil +} + // GetTipSetStateRoot returns the aggregate state root CID of the tipset identified by `key`. func (store *Store) GetTipSetStateRoot(ctx context.Context, key *types.TipSet) (cid.Cid, error) { return store.tipIndex.GetTipSetStateRoot(ctx, key) diff --git a/pkg/genesis/init.go b/pkg/genesis/init.go index 0a09f4fe00..d1f19c36f2 100644 --- a/pkg/genesis/init.go +++ b/pkg/genesis/init.go @@ -2,7 +2,6 @@ package genesis import ( "context" - "encoding/json" "github.com/filecoin-project/venus/pkg/chain" "github.com/filecoin-project/venus/pkg/config" @@ -44,13 +43,8 @@ func Init(ctx context.Context, r repo.Repo, bs blockstoreutil.Blockstore, cst cb if err = chainStore.SetHead(ctx, genTipSet); err != nil { return nil, errors.Wrap(err, "failed to persist genesis block in chain store") } - // Persist the genesis cid to the repo. - val, err := json.Marshal(genesis.Cid()) - if err != nil { - return nil, errors.Wrap(err, "failed to marshal genesis cid") - } - if err = r.ChainDatastore().Put(ctx, chain.GenesisKey, val); err != nil { + if err := chainStore.PersistGenesisCID(ctx, genesis); err != nil { return nil, errors.Wrap(err, "failed to persist genesis cid") }