use actors state-tree abstraction
Well, not fully, but this is enough to ensure we use the correct bitwidth and such.
This commit is contained in:
parent
9d2c430138
commit
1a790f5ee3
@ -21,11 +21,9 @@ import (
|
||||
"github.com/filecoin-project/lotus/chain/actors/adt"
|
||||
"github.com/filecoin-project/lotus/chain/types"
|
||||
|
||||
adt0 "github.com/filecoin-project/specs-actors/actors/util/adt"
|
||||
adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt"
|
||||
adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt"
|
||||
|
||||
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
|
||||
states0 "github.com/filecoin-project/specs-actors/actors/states"
|
||||
states2 "github.com/filecoin-project/specs-actors/v2/actors/states"
|
||||
states3 "github.com/filecoin-project/specs-actors/v3/actors/states"
|
||||
)
|
||||
|
||||
var log = logging.Logger("statetree")
|
||||
@ -165,15 +163,27 @@ func NewStateTree(cst cbor.IpldStore, ver types.StateTreeVersion) (*StateTree, e
|
||||
return nil, xerrors.Errorf("unsupported state tree version: %d", ver)
|
||||
}
|
||||
|
||||
var hamt adt.Map
|
||||
store := adt.WrapStore(context.TODO(), cst)
|
||||
var hamt adt.Map
|
||||
switch ver {
|
||||
case types.StateTreeVersion0:
|
||||
hamt = adt0.MakeEmptyMap(store)
|
||||
tree, err := states0.NewTree(store)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to create state tree: %w", err)
|
||||
}
|
||||
hamt = tree.Map
|
||||
case types.StateTreeVersion1:
|
||||
hamt = adt2.MakeEmptyMap(store)
|
||||
tree, err := states2.NewTree(store)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to create state tree: %w", err)
|
||||
}
|
||||
hamt = tree.Map
|
||||
case types.StateTreeVersion2:
|
||||
hamt = adt3.MakeEmptyMap(store, builtin3.DefaultHamtBitwidth)
|
||||
tree, err := states3.NewTree(store)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to create state tree: %w", err)
|
||||
}
|
||||
hamt = tree.Map
|
||||
default:
|
||||
return nil, xerrors.Errorf("unsupported state tree version: %d", ver)
|
||||
}
|
||||
@ -200,27 +210,30 @@ func LoadStateTree(cst cbor.IpldStore, c cid.Cid) (*StateTree, error) {
|
||||
|
||||
store := adt.WrapStore(context.TODO(), cst)
|
||||
|
||||
var (
|
||||
hamt adt.Map
|
||||
err error
|
||||
)
|
||||
|
||||
var hamt adt.Map
|
||||
switch root.Version {
|
||||
case types.StateTreeVersion0:
|
||||
hamt, err = adt0.AsMap(store, root.Actors)
|
||||
tree, err := states0.LoadTree(store, root.Actors)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to load state tree: %w", err)
|
||||
}
|
||||
hamt = tree.Map
|
||||
case types.StateTreeVersion1:
|
||||
hamt, err = adt2.AsMap(store, root.Actors)
|
||||
tree, err := states2.LoadTree(store, root.Actors)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to load state tree: %w", err)
|
||||
}
|
||||
hamt = tree.Map
|
||||
case types.StateTreeVersion2:
|
||||
hamt, err = adt3.AsMap(store, root.Actors, builtin3.DefaultHamtBitwidth)
|
||||
tree, err := states3.LoadTree(store, root.Actors)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to load state tree: %w", err)
|
||||
}
|
||||
hamt = tree.Map
|
||||
default:
|
||||
return nil, xerrors.Errorf("unsupported state tree version: %d", root.Version)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("loading hamt node %s failed: %s", c, err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s := &StateTree{
|
||||
root: hamt,
|
||||
info: root.Info,
|
||||
|
Loading…
Reference in New Issue
Block a user