2021-02-28 22:48:36 +00:00
|
|
|
package modules
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
2021-12-13 12:26:59 +00:00
|
|
|
"context"
|
2021-02-28 22:48:36 +00:00
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/ipfs/go-datastore"
|
|
|
|
"github.com/ipld/go-car"
|
|
|
|
"golang.org/x/xerrors"
|
|
|
|
|
|
|
|
"github.com/filecoin-project/lotus/chain/store"
|
|
|
|
"github.com/filecoin-project/lotus/chain/types"
|
|
|
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
|
|
|
)
|
|
|
|
|
|
|
|
func ErrorGenesis() Genesis {
|
|
|
|
return func() (header *types.BlockHeader, e error) {
|
|
|
|
return nil, xerrors.New("No genesis block provided, provide the file with 'lotus daemon --genesis=[genesis file]'")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func LoadGenesis(genBytes []byte) func(dtypes.ChainBlockstore) Genesis {
|
|
|
|
return func(bs dtypes.ChainBlockstore) Genesis {
|
|
|
|
return func() (header *types.BlockHeader, e error) {
|
2021-12-13 12:26:59 +00:00
|
|
|
c, err := car.LoadCar(context.Background(), bs, bytes.NewReader(genBytes))
|
2021-02-28 22:48:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, xerrors.Errorf("loading genesis car file failed: %w", err)
|
|
|
|
}
|
|
|
|
if len(c.Roots) != 1 {
|
|
|
|
return nil, xerrors.New("expected genesis file to have one root")
|
|
|
|
}
|
2021-12-13 12:26:59 +00:00
|
|
|
root, err := bs.Get(context.Background(), c.Roots[0])
|
2021-02-28 22:48:36 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
h, err := types.DecodeBlock(root.RawData())
|
|
|
|
if err != nil {
|
|
|
|
return nil, xerrors.Errorf("decoding block failed: %w", err)
|
|
|
|
}
|
|
|
|
return h, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func DoSetGenesis(_ dtypes.AfterGenesisSet) {}
|
|
|
|
|
|
|
|
func SetGenesis(cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) {
|
2021-12-13 12:26:59 +00:00
|
|
|
genFromRepo, err := cs.GetGenesis(context.Background())
|
2021-02-28 22:48:36 +00:00
|
|
|
if err == nil {
|
|
|
|
if os.Getenv("LOTUS_SKIP_GENESIS_CHECK") != "_yes_" {
|
|
|
|
expectedGenesis, err := g()
|
|
|
|
if err != nil {
|
|
|
|
return dtypes.AfterGenesisSet{}, xerrors.Errorf("getting expected genesis failed: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if genFromRepo.Cid() != expectedGenesis.Cid() {
|
|
|
|
return dtypes.AfterGenesisSet{}, xerrors.Errorf("genesis in the repo is not the one expected by this version of Lotus!")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return dtypes.AfterGenesisSet{}, nil // already set, noop
|
|
|
|
}
|
|
|
|
if err != datastore.ErrNotFound {
|
|
|
|
return dtypes.AfterGenesisSet{}, xerrors.Errorf("getting genesis block failed: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
genesis, err := g()
|
|
|
|
if err != nil {
|
|
|
|
return dtypes.AfterGenesisSet{}, xerrors.Errorf("genesis func failed: %w", err)
|
|
|
|
}
|
|
|
|
|
2021-12-13 12:26:59 +00:00
|
|
|
return dtypes.AfterGenesisSet{}, cs.SetGenesis(context.Background(), genesis)
|
2021-02-28 22:48:36 +00:00
|
|
|
}
|