From 3370847f3e98ed1c4c6c247a01db863b5bddd4a9 Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 28 Feb 2022 22:57:40 -0500 Subject: [PATCH 001/228] Implement FIP-0031 --- build/params_2k.go | 2 + build/params_butterfly.go | 2 + build/params_calibnet.go | 2 + build/params_interop.go | 4 + build/params_mainnet.go | 2 + build/params_shared_vals.go | 2 +- build/params_testground.go | 1 + chain/actors/builtin/account/account.go | 15 + chain/actors/builtin/account/v8.go | 40 ++ chain/actors/builtin/builtin.go | 62 +- chain/actors/builtin/cron/cron.go | 12 +- chain/actors/builtin/cron/v8.go | 35 ++ chain/actors/builtin/init/init.go | 19 +- chain/actors/builtin/init/v8.go | 114 ++++ chain/actors/builtin/market/market.go | 22 +- chain/actors/builtin/market/v8.go | 252 ++++++++ chain/actors/builtin/miner/miner.go | 17 +- chain/actors/builtin/miner/v8.go | 571 ++++++++++++++++++ chain/actors/builtin/multisig/message8.go | 71 +++ chain/actors/builtin/multisig/multisig.go | 32 +- chain/actors/builtin/multisig/v8.go | 119 ++++ chain/actors/builtin/paych/message8.go | 76 +++ chain/actors/builtin/paych/paych.go | 20 +- chain/actors/builtin/paych/v8.go | 130 ++++ chain/actors/builtin/power/power.go | 19 +- chain/actors/builtin/power/v8.go | 187 ++++++ chain/actors/builtin/reward/reward.go | 19 +- chain/actors/builtin/reward/v8.go | 98 +++ chain/actors/builtin/system/system.go | 10 +- chain/actors/builtin/system/v8.go | 35 ++ .../actors/builtin/verifreg/actor.go.template | 2 +- chain/actors/builtin/verifreg/v8.go | 83 +++ chain/actors/builtin/verifreg/verifreg.go | 31 +- chain/actors/policy/policy.go | 84 ++- chain/actors/version.go | 7 +- chain/consensus/filcns/compute_state.go | 2 + chain/consensus/filcns/upgrades.go | 107 ++++ chain/state/statetree.go | 2 +- chain/sync_test.go | 8 + chain/vm/mkactor.go | 3 + chain/vm/runtime.go | 2 + chain/vm/vmi.go | 8 +- documentation/en/api-v0-methods-miner.md | 2 +- documentation/en/api-v0-methods.md | 2 +- documentation/en/api-v1-unstable-methods.md | 2 +- gen/inlinegen-data.json | 8 +- go.mod | 1 + go.sum | 4 + itests/kit/ensemble_opts_nv.go | 6 +- lotuspond/front/src/chain/methods.json | 108 ++++ 50 files changed, 2391 insertions(+), 71 deletions(-) create mode 100644 chain/actors/builtin/account/v8.go create mode 100644 chain/actors/builtin/cron/v8.go create mode 100644 chain/actors/builtin/init/v8.go create mode 100644 chain/actors/builtin/market/v8.go create mode 100644 chain/actors/builtin/miner/v8.go create mode 100644 chain/actors/builtin/multisig/message8.go create mode 100644 chain/actors/builtin/multisig/v8.go create mode 100644 chain/actors/builtin/paych/message8.go create mode 100644 chain/actors/builtin/paych/v8.go create mode 100644 chain/actors/builtin/power/v8.go create mode 100644 chain/actors/builtin/reward/v8.go create mode 100644 chain/actors/builtin/system/v8.go create mode 100644 chain/actors/builtin/verifreg/v8.go diff --git a/build/params_2k.go b/build/params_2k.go index aa1beed36..19d70282b 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -48,6 +48,7 @@ var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) var UpgradeOhSnapHeight = abi.ChainEpoch(-18) +var UpgradeFVM1Height = abi.ChainEpoch(-19) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, @@ -91,6 +92,7 @@ func init() { UpgradeHyperdriveHeight = getUpgradeHeight("LOTUS_HYPERDRIVE_HEIGHT", UpgradeHyperdriveHeight) UpgradeChocolateHeight = getUpgradeHeight("LOTUS_CHOCOLATE_HEIGHT", UpgradeChocolateHeight) UpgradeOhSnapHeight = getUpgradeHeight("LOTUS_OHSNAP_HEIGHT", UpgradeOhSnapHeight) + UpgradeFVM1Height = getUpgradeHeight("LOTUS_FVM1_HEIGHT", UpgradeFVM1Height) BuildType |= Build2k diff --git a/build/params_butterfly.go b/build/params_butterfly.go index 804bdde93..2fe758e72 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -44,6 +44,8 @@ const UpgradeChocolateHeight = -17 const UpgradeOhSnapHeight = 240 +var UpgradeFVM1Height = abi.ChainEpoch(99999999999999) + func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) policy.SetSupportedProofTypes( diff --git a/build/params_calibnet.go b/build/params_calibnet.go index a8f5b4720..462e03de1 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -57,6 +57,8 @@ const UpgradeChocolateHeight = 312746 // 2022-02-10T19:23:00Z const UpgradeOhSnapHeight = 682006 +var UpgradeFVM1Height = abi.ChainEpoch(99999999999999) + func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(32 << 30)) policy.SetSupportedProofTypes( diff --git a/build/params_interop.go b/build/params_interop.go index a483e7188..14c63d1dc 100644 --- a/build/params_interop.go +++ b/build/params_interop.go @@ -48,6 +48,7 @@ var UpgradeTurboHeight = abi.ChainEpoch(-15) var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) var UpgradeOhSnapHeight = abi.ChainEpoch(-18) +var UpgradeFVM1Height = abi.ChainEpoch(-19) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, @@ -93,6 +94,9 @@ func init() { UpgradeNorwegianHeight = getUpgradeHeight("LOTUS_NORWEGIAN_HEIGHT", UpgradeNorwegianHeight) UpgradeTurboHeight = getUpgradeHeight("LOTUS_ACTORSV4_HEIGHT", UpgradeTurboHeight) UpgradeHyperdriveHeight = getUpgradeHeight("LOTUS_HYPERDRIVE_HEIGHT", UpgradeHyperdriveHeight) + UpgradeChocolateHeight = getUpgradeHeight("LOTUS_CHOCOLATE_HEIGHT", UpgradeChocolateHeight) + UpgradeOhSnapHeight = getUpgradeHeight("LOTUS_OHSNAP_HEIGHT", UpgradeOhSnapHeight) + UpgradeFVM1Height = getUpgradeHeight("LOTUS_FVM1_HEIGHT", UpgradeFVM1Height) BuildType |= BuildInteropnet SetAddressNetwork(address.Testnet) diff --git a/build/params_mainnet.go b/build/params_mainnet.go index 0a9f6e775..80051e0d1 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -70,6 +70,8 @@ const UpgradeChocolateHeight = 1231620 // 2022-03-01T15:00:00Z var UpgradeOhSnapHeight = abi.ChainEpoch(1594680) +var UpgradeFVM1Height = abi.ChainEpoch(99999999999999) + func init() { if os.Getenv("LOTUS_USE_TEST_ADDRESSES") != "1" { SetAddressNetwork(address.Mainnet) diff --git a/build/params_shared_vals.go b/build/params_shared_vals.go index 704c84639..d8d0a5382 100644 --- a/build/params_shared_vals.go +++ b/build/params_shared_vals.go @@ -34,7 +34,7 @@ const NewestNetworkVersion = network.Version{{.latestNetworkVersion}} /* inline-gen start */ -const NewestNetworkVersion = network.Version15 +const NewestNetworkVersion = network.Version16 /* inline-gen end */ diff --git a/build/params_testground.go b/build/params_testground.go index 41c46d41e..6718053e6 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -100,6 +100,7 @@ var ( UpgradeHyperdriveHeight abi.ChainEpoch = -15 UpgradeChocolateHeight abi.ChainEpoch = -16 UpgradeOhSnapHeight abi.ChainEpoch = -17 + UpgradeFVM1Height abi.ChainEpoch = -18 DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/chain/actors/builtin/account/account.go b/chain/actors/builtin/account/account.go index 57ea510bb..9fb92d88d 100644 --- a/chain/actors/builtin/account/account.go +++ b/chain/actors/builtin/account/account.go @@ -25,6 +25,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" ) func init() { @@ -56,6 +58,10 @@ func init() { builtin.RegisterActorState(builtin7.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + + builtin.RegisterActorState(builtin8.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) } var Methods = builtin4.MethodsAccount @@ -84,6 +90,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin7.AccountActorCodeID: return load7(store, act.Head) + case builtin8.AccountActorCodeID: + return load8(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -112,6 +121,9 @@ func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, case actors.Version7: return make7(store, addr) + case actors.Version8: + return make8(store, addr) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -140,6 +152,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.AccountActorCodeID, nil + case actors.Version8: + return builtin8.AccountActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/account/v8.go b/chain/actors/builtin/account/v8.go new file mode 100644 index 000000000..5404b3262 --- /dev/null +++ b/chain/actors/builtin/account/v8.go @@ -0,0 +1,40 @@ +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + account8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/account" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store, addr address.Address) (State, error) { + out := state8{store: store} + out.State = account8.State{Address: addr} + return &out, nil +} + +type state8 struct { + account8.State + store adt.Store +} + +func (s *state8) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state8) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index febbca479..079918c50 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -26,47 +26,50 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + smoothing8 "github.com/filecoin-project/specs-actors/v8/actors/util/smoothing" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" - miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + miner8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/miner" + proof8 "github.com/filecoin-project/specs-actors/v8/actors/runtime/proof" ) -var SystemActorAddr = builtin7.SystemActorAddr -var BurntFundsActorAddr = builtin7.BurntFundsActorAddr -var CronActorAddr = builtin7.CronActorAddr +var SystemActorAddr = builtin8.SystemActorAddr +var BurntFundsActorAddr = builtin8.BurntFundsActorAddr +var CronActorAddr = builtin8.CronActorAddr var SaftAddress = makeAddress("t0122") var ReserveAddress = makeAddress("t090") var RootVerifierAddress = makeAddress("t080") var ( - ExpectedLeadersPerEpoch = builtin7.ExpectedLeadersPerEpoch + ExpectedLeadersPerEpoch = builtin8.ExpectedLeadersPerEpoch ) const ( - EpochDurationSeconds = builtin7.EpochDurationSeconds - EpochsInDay = builtin7.EpochsInDay - SecondsInDay = builtin7.SecondsInDay + EpochDurationSeconds = builtin8.EpochDurationSeconds + EpochsInDay = builtin8.EpochsInDay + SecondsInDay = builtin8.SecondsInDay ) const ( - MethodSend = builtin7.MethodSend - MethodConstructor = builtin7.MethodConstructor + MethodSend = builtin8.MethodSend + MethodConstructor = builtin8.MethodConstructor ) // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. -type SectorInfo = proof7.SectorInfo -type ExtendedSectorInfo = proof7.ExtendedSectorInfo -type PoStProof = proof7.PoStProof +type SectorInfo = proof8.SectorInfo +type ExtendedSectorInfo = proof8.ExtendedSectorInfo +type PoStProof = proof8.PoStProof type FilterEstimate = smoothing0.FilterEstimate func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { - return miner7.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) + return miner8.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { @@ -111,6 +114,12 @@ func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { } +func FromV8FilterEstimate(v8 smoothing8.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v8) + +} + type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) var ActorStateLoaders = make(map[cid.Cid]ActorStateLoader) @@ -151,6 +160,9 @@ func ActorNameByCode(c cid.Cid) string { case builtin7.IsBuiltinActor(c): return builtin7.ActorNameByCode(c) + case builtin8.IsBuiltinActor(c): + return builtin8.ActorNameByCode(c) + default: return "" } @@ -186,6 +198,10 @@ func IsBuiltinActor(c cid.Cid) bool { return true } + if builtin8.IsBuiltinActor(c) { + return true + } + return false } @@ -219,6 +235,10 @@ func IsAccountActor(c cid.Cid) bool { return true } + if c == builtin8.AccountActorCodeID { + return true + } + return false } @@ -252,6 +272,10 @@ func IsStorageMinerActor(c cid.Cid) bool { return true } + if c == builtin8.StorageMinerActorCodeID { + return true + } + return false } @@ -285,6 +309,10 @@ func IsMultisigActor(c cid.Cid) bool { return true } + if c == builtin8.MultisigActorCodeID { + return true + } + return false } @@ -318,6 +346,10 @@ func IsPaymentChannelActor(c cid.Cid) bool { return true } + if c == builtin8.PaymentChannelActorCodeID { + return true + } + return false } diff --git a/chain/actors/builtin/cron/cron.go b/chain/actors/builtin/cron/cron.go index f27a14ac7..e0a08408b 100644 --- a/chain/actors/builtin/cron/cron.go +++ b/chain/actors/builtin/cron/cron.go @@ -19,6 +19,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" ) func MakeState(store adt.Store, av actors.Version) (State, error) { @@ -45,6 +47,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) + case actors.Version8: + return make8(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -73,14 +78,17 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.CronActorCodeID, nil + case actors.Version8: + return builtin8.CronActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) } var ( - Address = builtin7.CronActorAddr - Methods = builtin7.MethodsCron + Address = builtin8.CronActorAddr + Methods = builtin8.MethodsCron ) type State interface { diff --git a/chain/actors/builtin/cron/v8.go b/chain/actors/builtin/cron/v8.go new file mode 100644 index 000000000..97c0aa980 --- /dev/null +++ b/chain/actors/builtin/cron/v8.go @@ -0,0 +1,35 @@ +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + cron8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/cron" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store) (State, error) { + out := state8{store: store} + out.State = *cron8.ConstructState(cron8.BuiltInEntries()) + return &out, nil +} + +type state8 struct { + cron8.State + store adt.Store +} + +func (s *state8) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/init/init.go b/chain/actors/builtin/init/init.go index 737241ffe..cdae9b503 100644 --- a/chain/actors/builtin/init/init.go +++ b/chain/actors/builtin/init/init.go @@ -27,6 +27,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" ) func init() { @@ -58,11 +60,15 @@ func init() { builtin.RegisterActorState(builtin7.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + + builtin.RegisterActorState(builtin8.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) } var ( - Address = builtin7.InitActorAddr - Methods = builtin7.MethodsInit + Address = builtin8.InitActorAddr + Methods = builtin8.MethodsInit ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -89,6 +95,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin7.InitActorCodeID: return load7(store, act.Head) + case builtin8.InitActorCodeID: + return load8(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -117,6 +126,9 @@ func MakeState(store adt.Store, av actors.Version, networkName string) (State, e case actors.Version7: return make7(store, networkName) + case actors.Version8: + return make8(store, networkName) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -145,6 +157,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.InitActorCodeID, nil + case actors.Version8: + return builtin8.InitActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/init/v8.go b/chain/actors/builtin/init/v8.go new file mode 100644 index 000000000..1fc2859a0 --- /dev/null +++ b/chain/actors/builtin/init/v8.go @@ -0,0 +1,114 @@ +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + + init8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/init" + adt8 "github.com/filecoin-project/specs-actors/v8/actors/util/adt" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store, networkName string) (State, error) { + out := state8{store: store} + + s, err := init8.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state8 struct { + init8.State + store adt.Store +} + +func (s *state8) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state8) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state8) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt8.AsMap(s.store, s.State.AddressMap, builtin8.DefaultHamtBitwidth) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state8) NetworkName() (dtypes.NetworkName, error) { + return dtypes.NetworkName(s.State.NetworkName), nil +} + +func (s *state8) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state8) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state8) Remove(addrs ...address.Address) (err error) { + m, err := adt8.AsMap(s.store, s.State.AddressMap, builtin8.DefaultHamtBitwidth) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state8) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state8) AddressMap() (adt.Map, error) { + return adt8.AsMap(s.store, s.State.AddressMap, builtin8.DefaultHamtBitwidth) +} + +func (s *state8) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index 6781b55e3..00524f0cb 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -27,6 +27,8 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -62,11 +64,15 @@ func init() { builtin.RegisterActorState(builtin7.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + + builtin.RegisterActorState(builtin8.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) } var ( - Address = builtin7.StorageMarketActorAddr - Methods = builtin7.MethodsMarket + Address = builtin8.StorageMarketActorAddr + Methods = builtin8.MethodsMarket ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -93,6 +99,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin7.StorageMarketActorCodeID: return load7(store, act.Head) + case builtin8.StorageMarketActorCodeID: + return load8(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -121,6 +130,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) + case actors.Version8: + return make8(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -149,6 +161,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.StorageMarketActorCodeID, nil + case actors.Version8: + return builtin8.StorageMarketActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -229,6 +244,9 @@ func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStora case actors.Version7: return decodePublishStorageDealsReturn7(b) + case actors.Version8: + return decodePublishStorageDealsReturn8(b) + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/chain/actors/builtin/market/v8.go b/chain/actors/builtin/market/v8.go new file mode 100644 index 000000000..d2e6f9189 --- /dev/null +++ b/chain/actors/builtin/market/v8.go @@ -0,0 +1,252 @@ +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/types" + + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" + adt8 "github.com/filecoin-project/specs-actors/v8/actors/util/adt" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store) (State, error) { + out := state8{store: store} + + s, err := market8.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state8 struct { + market8.State + store adt.Store +} + +func (s *state8) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state8) BalancesChanged(otherState State) (bool, error) { + otherState8, ok := otherState.(*state8) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState8.State.EscrowTable) || !s.State.LockedTable.Equals(otherState8.State.LockedTable), nil +} + +func (s *state8) StatesChanged(otherState State) (bool, error) { + otherState8, ok := otherState.(*state8) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState8.State.States), nil +} + +func (s *state8) States() (DealStates, error) { + stateArray, err := adt8.AsArray(s.store, s.State.States, market8.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates8{stateArray}, nil +} + +func (s *state8) ProposalsChanged(otherState State) (bool, error) { + otherState8, ok := otherState.(*state8) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState8.State.Proposals), nil +} + +func (s *state8) Proposals() (DealProposals, error) { + proposalArray, err := adt8.AsArray(s.store, s.State.Proposals, market8.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals8{proposalArray}, nil +} + +func (s *state8) EscrowTable() (BalanceTable, error) { + bt, err := adt8.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable8{bt}, nil +} + +func (s *state8) LockedTable() (BalanceTable, error) { + bt, err := adt8.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable8{bt}, nil +} + +func (s *state8) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market8.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state8) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable8 struct { + *adt8.BalanceTable +} + +func (bt *balanceTable8) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt8.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates8 struct { + adt.Array +} + +func (s *dealStates8) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal8 market8.DealState + found, err := s.Array.Get(uint64(dealID), &deal8) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV8DealState(deal8) + return &deal, true, nil +} + +func (s *dealStates8) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds8 market8.DealState + return s.Array.ForEach(&ds8, func(idx int64) error { + return cb(abi.DealID(idx), fromV8DealState(ds8)) + }) +} + +func (s *dealStates8) decode(val *cbg.Deferred) (*DealState, error) { + var ds8 market8.DealState + if err := ds8.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV8DealState(ds8) + return &ds, nil +} + +func (s *dealStates8) array() adt.Array { + return s.Array +} + +func fromV8DealState(v8 market8.DealState) DealState { + return (DealState)(v8) +} + +type dealProposals8 struct { + adt.Array +} + +func (s *dealProposals8) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal8 market8.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal8) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV8DealProposal(proposal8) + return &proposal, true, nil +} + +func (s *dealProposals8) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp8 market8.DealProposal + return s.Array.ForEach(&dp8, func(idx int64) error { + return cb(abi.DealID(idx), fromV8DealProposal(dp8)) + }) +} + +func (s *dealProposals8) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp8 market8.DealProposal + if err := dp8.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV8DealProposal(dp8) + return &dp, nil +} + +func (s *dealProposals8) array() adt.Array { + return s.Array +} + +func fromV8DealProposal(v8 market8.DealProposal) DealProposal { + return (DealProposal)(v8) +} + +func (s *state8) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn8)(nil) + +func decodePublishStorageDealsReturn8(b []byte) (PublishStorageDealsReturn, error) { + var retval market8.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn8{retval}, nil +} + +type publishStorageDealsReturn8 struct { + market8.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn8) IsDealValid(index uint64) (bool, error) { + + return r.ValidDeals.IsSet(index) + +} + +func (r *publishStorageDealsReturn8) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index 7889d7a4d..1e0c46183 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -38,6 +38,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" ) func init() { @@ -70,9 +72,13 @@ func init() { return load7(store, root) }) + builtin.RegisterActorState(builtin8.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } -var Methods = builtin7.MethodsMiner +var Methods = builtin8.MethodsMiner // Unchanged between v0, v2, v3, v4, and v5 actors var WPoStProvingPeriod = miner0.WPoStProvingPeriod @@ -112,6 +118,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin7.StorageMinerActorCodeID: return load7(store, act.Head) + case builtin8.StorageMinerActorCodeID: + return load8(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -140,6 +149,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) + case actors.Version8: + return make8(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -168,6 +180,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.StorageMinerActorCodeID, nil + case actors.Version8: + return builtin8.StorageMinerActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/miner/v8.go b/chain/actors/builtin/miner/v8.go new file mode 100644 index 000000000..82b8d0e20 --- /dev/null +++ b/chain/actors/builtin/miner/v8.go @@ -0,0 +1,571 @@ +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + + miner8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/miner" + adt8 "github.com/filecoin-project/specs-actors/v8/actors/util/adt" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store) (State, error) { + out := state8{store: store} + out.State = miner8.State{} + return &out, nil +} + +type state8 struct { + miner8.State + store adt.Store +} + +type deadline8 struct { + miner8.Deadline + store adt.Store +} + +type partition8 struct { + miner8.Partition + store adt.Store +} + +func (s *state8) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state8) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state8) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state8) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state8) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state8) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state8) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV8SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state8) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state8) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner8.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state8) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will expire on-time (can be + // learned from the sector info). + // 2. If it's faulty, it will expire early within the first 42 entries + // of the expiration queue. + + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner8.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner8.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner8.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner8.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner8.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state8) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV8SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state8) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt8.AsMap(s.store, s.State.PreCommittedSectors, builtin8.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner8.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV8SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state8) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner8.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info8 miner8.SectorOnChainInfo + if err := sectors.ForEach(&info8, func(_ int64) error { + info := fromV8SectorOnChainInfo(info8) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos8, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos8)) + for i, info8 := range infos8 { + info := fromV8SectorOnChainInfo(*info8) + infos[i] = &info + } + return infos, nil +} + +func (s *state8) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state8) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state8) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state8) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state8) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state8) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline8{*dl, s.store}, nil +} + +func (s *state8) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner8.Deadline) error { + return cb(i, &deadline8{*dl, s.store}) + }) +} + +func (s *state8) NumDeadlines() (uint64, error) { + return miner8.WPoStPeriodDeadlines, nil +} + +func (s *state8) DeadlinesChanged(other State) (bool, error) { + other8, ok := other.(*state8) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other8.Deadlines), nil +} + +func (s *state8) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state8) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state8) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state8) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.RecordedDeadlineInfo(epoch), nil +} + +func (s *state8) DeadlineCronActive() (bool, error) { + return s.State.DeadlineCronActive, nil +} + +func (s *state8) sectors() (adt.Array, error) { + return adt8.AsArray(s.store, s.Sectors, miner8.SectorsAmtBitwidth) +} + +func (s *state8) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner8.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV8SectorOnChainInfo(si), nil +} + +func (s *state8) precommits() (adt.Map, error) { + return adt8.AsMap(s.store, s.PreCommittedSectors, builtin8.DefaultHamtBitwidth) +} + +func (s *state8) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner8.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV8SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state8) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner8.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner8.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline8) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition8{*p, d.store}, nil +} + +func (d *deadline8) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner8.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition8{part, d.store}) + }) +} + +func (d *deadline8) PartitionsChanged(other Deadline) (bool, error) { + other8, ok := other.(*deadline8) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other8.Deadline.Partitions), nil +} + +func (d *deadline8) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline8) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition8) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition8) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition8) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition8) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV8SectorOnChainInfo(v8 miner8.SectorOnChainInfo) SectorOnChainInfo { + info := SectorOnChainInfo{ + SectorNumber: v8.SectorNumber, + SealProof: v8.SealProof, + SealedCID: v8.SealedCID, + DealIDs: v8.DealIDs, + Activation: v8.Activation, + Expiration: v8.Expiration, + DealWeight: v8.DealWeight, + VerifiedDealWeight: v8.VerifiedDealWeight, + InitialPledge: v8.InitialPledge, + ExpectedDayReward: v8.ExpectedDayReward, + ExpectedStoragePledge: v8.ExpectedStoragePledge, + + SectorKeyCID: v8.SectorKeyCID, + } + return info +} + +func fromV8SectorPreCommitOnChainInfo(v8 miner8.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v8.Info), + PreCommitDeposit: v8.PreCommitDeposit, + PreCommitEpoch: v8.PreCommitEpoch, + DealWeight: v8.DealWeight, + VerifiedDealWeight: v8.VerifiedDealWeight, + } + +} + +func (s *state8) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/multisig/message8.go b/chain/actors/builtin/multisig/message8.go new file mode 100644 index 000000000..9852af105 --- /dev/null +++ b/chain/actors/builtin/multisig/message8.go @@ -0,0 +1,71 @@ +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + init8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/init" + multisig8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/multisig" + + "github.com/filecoin-project/lotus/chain/actors" + init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" + "github.com/filecoin-project/lotus/chain/types" +) + +type message8 struct{ message0 } + +func (m message8) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig8.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init8.ExecParams{ + CodeCID: builtin8.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin8.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/chain/actors/builtin/multisig/multisig.go b/chain/actors/builtin/multisig/multisig.go index f1b50475a..0ccce071c 100644 --- a/chain/actors/builtin/multisig/multisig.go +++ b/chain/actors/builtin/multisig/multisig.go @@ -13,7 +13,7 @@ import ( "github.com/ipfs/go-cid" msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" + msig8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/multisig" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -29,6 +29,8 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -64,6 +66,10 @@ func init() { builtin.RegisterActorState(builtin7.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + + builtin.RegisterActorState(builtin8.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) } func Load(store adt.Store, act *types.Actor) (State, error) { @@ -90,6 +96,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin7.MultisigActorCodeID: return load7(store, act.Head) + case builtin8.MultisigActorCodeID: + return load8(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -118,6 +127,9 @@ func MakeState(store adt.Store, av actors.Version, signers []address.Address, th case actors.Version7: return make7(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + case actors.Version8: + return make8(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -146,6 +158,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.MultisigActorCodeID, nil + case actors.Version8: + return builtin8.MultisigActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -171,7 +186,7 @@ type State interface { type Transaction = msig0.Transaction -var Methods = builtin7.MethodsMultisig +var Methods = builtin8.MethodsMultisig func Message(version actors.Version, from address.Address) MessageBuilder { switch version { @@ -196,6 +211,9 @@ func Message(version actors.Version, from address.Address) MessageBuilder { case actors.Version7: return message7{message0{from}} + + case actors.Version8: + return message8{message0{from}} default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } @@ -219,13 +237,13 @@ type MessageBuilder interface { } // this type is the same between v0 and v2 -type ProposalHashData = msig7.ProposalHashData -type ProposeReturn = msig7.ProposeReturn -type ProposeParams = msig7.ProposeParams -type ApproveReturn = msig7.ApproveReturn +type ProposalHashData = msig8.ProposalHashData +type ProposeReturn = msig8.ProposeReturn +type ProposeParams = msig8.ProposeParams +type ApproveReturn = msig8.ApproveReturn func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { - params := msig7.TxnIDParams{ID: msig7.TxnID(id)} + params := msig8.TxnIDParams{ID: msig8.TxnID(id)} if data != nil { if data.Requester.Protocol() != address.ID { return nil, xerrors.Errorf("proposer address must be an ID address, was %s", data.Requester) diff --git a/chain/actors/builtin/multisig/v8.go b/chain/actors/builtin/multisig/v8.go new file mode 100644 index 000000000..9ac8224da --- /dev/null +++ b/chain/actors/builtin/multisig/v8.go @@ -0,0 +1,119 @@ +package multisig + +import ( + "bytes" + "encoding/binary" + + adt8 "github.com/filecoin-project/specs-actors/v8/actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + + msig8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/multisig" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state8{store: store} + out.State = msig8.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt8.StoreEmptyMap(store, builtin8.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state8 struct { + msig8.State + store adt.Store +} + +func (s *state8) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state8) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state8) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state8) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state8) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state8) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state8) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt8.AsMap(s.store, s.State.PendingTxns, builtin8.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig8.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state8) PendingTxnChanged(other State) (bool, error) { + other8, ok := other.(*state8) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other8.PendingTxns), nil +} + +func (s *state8) transactions() (adt.Map, error) { + return adt8.AsMap(s.store, s.PendingTxns, builtin8.DefaultHamtBitwidth) +} + +func (s *state8) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig8.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state8) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/paych/message8.go b/chain/actors/builtin/paych/message8.go new file mode 100644 index 000000000..f49f457e8 --- /dev/null +++ b/chain/actors/builtin/paych/message8.go @@ -0,0 +1,76 @@ +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + init8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/init" + paych8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/paych" + + "github.com/filecoin-project/lotus/chain/actors" + init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" + "github.com/filecoin-project/lotus/chain/types" +) + +type message8 struct{ from address.Address } + +func (m message8) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych8.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init8.ExecParams{ + CodeCID: builtin8.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin8.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message8) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych8.UpdateChannelStateParams{ + + Sv: toV8SignedVoucher(*sv), + + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin8.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message8) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin8.MethodsPaych.Settle, + }, nil +} + +func (m message8) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin8.MethodsPaych.Collect, + }, nil +} diff --git a/chain/actors/builtin/paych/paych.go b/chain/actors/builtin/paych/paych.go index f807b33ed..2e0c932cd 100644 --- a/chain/actors/builtin/paych/paych.go +++ b/chain/actors/builtin/paych/paych.go @@ -29,6 +29,8 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -64,6 +66,10 @@ func init() { builtin.RegisterActorState(builtin7.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + + builtin.RegisterActorState(builtin8.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) } // Load returns an abstract copy of payment channel state, irregardless of actor version @@ -91,6 +97,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin7.PaymentChannelActorCodeID: return load7(store, act.Head) + case builtin8.PaymentChannelActorCodeID: + return load8(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -119,6 +128,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) + case actors.Version8: + return make8(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -147,6 +159,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.PaymentChannelActorCodeID, nil + case actors.Version8: + return builtin8.PaymentChannelActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -200,7 +215,7 @@ func DecodeSignedVoucher(s string) (*SignedVoucher, error) { return &sv, nil } -var Methods = builtin7.MethodsPaych +var Methods = builtin8.MethodsPaych func Message(version actors.Version, from address.Address) MessageBuilder { switch version { @@ -226,6 +241,9 @@ func Message(version actors.Version, from address.Address) MessageBuilder { case actors.Version7: return message7{from} + case actors.Version8: + return message8{from} + default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } diff --git a/chain/actors/builtin/paych/v8.go b/chain/actors/builtin/paych/v8.go new file mode 100644 index 000000000..06e724e4c --- /dev/null +++ b/chain/actors/builtin/paych/v8.go @@ -0,0 +1,130 @@ +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + paych8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/paych" + adt8 "github.com/filecoin-project/specs-actors/v8/actors/util/adt" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store) (State, error) { + out := state8{store: store} + out.State = paych8.State{} + return &out, nil +} + +type state8 struct { + paych8.State + store adt.Store + lsAmt *adt8.Array +} + +// Channel owner, who has funded the actor +func (s *state8) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state8) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state8) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state8) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state8) getOrLoadLsAmt() (*adt8.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt8.AsArray(s.store, s.State.LaneStates, paych8.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state8) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state8) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state8) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych8.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState8{ls}) + }) +} + +type laneState8 struct { + paych8.LaneState +} + +func (ls *laneState8) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState8) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} + +func toV8SignedVoucher(sv SignedVoucher) paych8.SignedVoucher { + return paych8.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretPreimage, + Extra: sv.Extra, + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: sv.Merges, + Signature: sv.Signature, + } +} diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go index 9b73cdd60..ffc5cd702 100644 --- a/chain/actors/builtin/power/power.go +++ b/chain/actors/builtin/power/power.go @@ -28,6 +28,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" ) func init() { @@ -59,11 +61,15 @@ func init() { builtin.RegisterActorState(builtin7.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + + builtin.RegisterActorState(builtin8.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) } var ( - Address = builtin7.StoragePowerActorAddr - Methods = builtin7.MethodsPower + Address = builtin8.StoragePowerActorAddr + Methods = builtin8.MethodsPower ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -90,6 +96,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin7.StoragePowerActorCodeID: return load7(store, act.Head) + case builtin8.StoragePowerActorCodeID: + return load8(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -118,6 +127,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) + case actors.Version8: + return make8(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -146,6 +158,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.StoragePowerActorCodeID, nil + case actors.Version8: + return builtin8.StoragePowerActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/power/v8.go b/chain/actors/builtin/power/v8.go new file mode 100644 index 000000000..622dd96ba --- /dev/null +++ b/chain/actors/builtin/power/v8.go @@ -0,0 +1,187 @@ +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + + power8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/power" + adt8 "github.com/filecoin-project/specs-actors/v8/actors/util/adt" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store) (State, error) { + out := state8{store: store} + + s, err := power8.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state8 struct { + power8.State + store adt.Store +} + +func (s *state8) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state8) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state8) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state8) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power8.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state8) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state8) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV8FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state8) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state8) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state8) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power8.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state8) ClaimsChanged(other State) (bool, error) { + other8, ok := other.(*state8) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other8.State.Claims), nil +} + +func (s *state8) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state8) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state8) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state8) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state8) GetState() interface{} { + return &s.State +} + +func (s *state8) claims() (adt.Map, error) { + return adt8.AsMap(s.store, s.Claims, builtin8.DefaultHamtBitwidth) +} + +func (s *state8) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power8.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV8Claim(ci), nil +} + +func fromV8Claim(v8 power8.Claim) Claim { + return Claim{ + RawBytePower: v8.RawBytePower, + QualityAdjPower: v8.QualityAdjPower, + } +} diff --git a/chain/actors/builtin/reward/reward.go b/chain/actors/builtin/reward/reward.go index b6ee2f146..a83a3362e 100644 --- a/chain/actors/builtin/reward/reward.go +++ b/chain/actors/builtin/reward/reward.go @@ -23,6 +23,8 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" @@ -57,11 +59,15 @@ func init() { builtin.RegisterActorState(builtin7.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + + builtin.RegisterActorState(builtin8.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) } var ( - Address = builtin7.RewardActorAddr - Methods = builtin7.MethodsReward + Address = builtin8.RewardActorAddr + Methods = builtin8.MethodsReward ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -88,6 +94,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin7.RewardActorCodeID: return load7(store, act.Head) + case builtin8.RewardActorCodeID: + return load8(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -116,6 +125,9 @@ func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.Storage case actors.Version7: return make7(store, currRealizedPower) + case actors.Version8: + return make8(store, currRealizedPower) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -144,6 +156,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.RewardActorCodeID, nil + case actors.Version8: + return builtin8.RewardActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/reward/v8.go b/chain/actors/builtin/reward/v8.go new file mode 100644 index 000000000..23ebf6f57 --- /dev/null +++ b/chain/actors/builtin/reward/v8.go @@ -0,0 +1,98 @@ +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/miner" + reward8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/reward" + smoothing8 "github.com/filecoin-project/specs-actors/v8/actors/util/smoothing" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state8{store: store} + out.State = *reward8.ConstructState(currRealizedPower) + return &out, nil +} + +type state8 struct { + reward8.State + store adt.Store +} + +func (s *state8) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state8) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state8) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state8) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state8) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state8) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state8) CumsumBaseline() (reward8.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state8) CumsumRealized() (reward8.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state8) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner8.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing8.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state8) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner8.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing8.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state8) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/system/system.go b/chain/actors/builtin/system/system.go index fb7515f35..c4d00e8f1 100644 --- a/chain/actors/builtin/system/system.go +++ b/chain/actors/builtin/system/system.go @@ -19,10 +19,12 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" ) var ( - Address = builtin7.SystemActorAddr + Address = builtin8.SystemActorAddr ) func MakeState(store adt.Store, av actors.Version) (State, error) { @@ -49,6 +51,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version7: return make7(store) + case actors.Version8: + return make8(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -77,6 +82,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.SystemActorCodeID, nil + case actors.Version8: + return builtin8.SystemActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/system/v8.go b/chain/actors/builtin/system/v8.go new file mode 100644 index 000000000..b218c7a52 --- /dev/null +++ b/chain/actors/builtin/system/v8.go @@ -0,0 +1,35 @@ +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + system8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/system" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store) (State, error) { + out := state8{store: store} + out.State = system8.State{} + return &out, nil +} + +type state8 struct { + system8.State + store adt.Store +} + +func (s *state8) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/verifreg/actor.go.template b/chain/actors/builtin/verifreg/actor.go.template index adc156948..715dd6d61 100644 --- a/chain/actors/builtin/verifreg/actor.go.template +++ b/chain/actors/builtin/verifreg/actor.go.template @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/types" - verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" + verifreg{{.latestVersion}} "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" ) func init() { diff --git a/chain/actors/builtin/verifreg/v8.go b/chain/actors/builtin/verifreg/v8.go new file mode 100644 index 000000000..bb0b19909 --- /dev/null +++ b/chain/actors/builtin/verifreg/v8.go @@ -0,0 +1,83 @@ +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + verifreg8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/verifreg" + adt8 "github.com/filecoin-project/specs-actors/v8/actors/util/adt" +) + +var _ State = (*state8)(nil) + +func load8(store adt.Store, root cid.Cid) (State, error) { + out := state8{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make8(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state8{store: store} + + s, err := verifreg8.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state8 struct { + verifreg8.State + store adt.Store +} + +func (s *state8) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state8) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version8, s.verifiedClients, addr) +} + +func (s *state8) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version8, s.verifiers, addr) +} + +func (s *state8) RemoveDataCapProposalID(verifier address.Address, client address.Address) (bool, uint64, error) { + return getRemoveDataCapProposalID(s.store, actors.Version8, s.removeDataCapProposalIDs, verifier, client) +} + +func (s *state8) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version8, s.verifiers, cb) +} + +func (s *state8) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version8, s.verifiedClients, cb) +} + +func (s *state8) verifiedClients() (adt.Map, error) { + return adt8.AsMap(s.store, s.VerifiedClients, builtin8.DefaultHamtBitwidth) +} + +func (s *state8) verifiers() (adt.Map, error) { + return adt8.AsMap(s.store, s.Verifiers, builtin8.DefaultHamtBitwidth) +} + +func (s *state8) removeDataCapProposalIDs() (adt.Map, error) { + return adt8.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin8.DefaultHamtBitwidth) +} + +func (s *state8) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go index cb26e324b..35f9db21c 100644 --- a/chain/actors/builtin/verifreg/verifreg.go +++ b/chain/actors/builtin/verifreg/verifreg.go @@ -23,11 +23,13 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" - verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" + verifreg8 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" ) func init() { @@ -60,11 +62,15 @@ func init() { return load7(store, root) }) + builtin.RegisterActorState(builtin8.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } var ( - Address = builtin7.VerifiedRegistryActorAddr - Methods = builtin7.MethodsVerifiedRegistry + Address = builtin8.VerifiedRegistryActorAddr + Methods = builtin8.MethodsVerifiedRegistry ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -91,6 +97,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin7.VerifiedRegistryActorCodeID: return load7(store, act.Head) + case builtin8.VerifiedRegistryActorCodeID: + return load8(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -119,6 +128,9 @@ func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Addres case actors.Version7: return make7(store, rootKeyAddress) + case actors.Version8: + return make8(store, rootKeyAddress) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -147,17 +159,20 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version7: return builtin7.VerifiedRegistryActorCodeID, nil + case actors.Version8: + return builtin8.VerifiedRegistryActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) } -type RemoveDataCapProposal = verifreg7.RemoveDataCapProposal -type RemoveDataCapRequest = verifreg7.RemoveDataCapRequest -type RemoveDataCapParams = verifreg7.RemoveDataCapParams -type RmDcProposalID = verifreg7.RmDcProposalID +type RemoveDataCapProposal = verifreg8.RemoveDataCapProposal +type RemoveDataCapRequest = verifreg8.RemoveDataCapRequest +type RemoveDataCapParams = verifreg8.RemoveDataCapParams +type RmDcProposalID = verifreg8.RmDcProposalID -const SignatureDomainSeparation_RemoveDataCap = verifreg7.SignatureDomainSeparation_RemoveDataCap +const SignatureDomainSeparation_RemoveDataCap = verifreg8.SignatureDomainSeparation_RemoveDataCap type State interface { cbor.Marshaler diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index f51da7aa7..673bbf57c 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -45,14 +45,19 @@ import ( miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" - paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" + miner8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/miner" + verifreg8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/verifreg" + + paych8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/paych" ) const ( - ChainFinality = miner7.ChainFinality + ChainFinality = miner8.ChainFinality SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych7.SettleDelay - MaxPreCommitRandomnessLookback = builtin7.EpochsInDay + SealRandomnessLookback + PaychSettleDelay = paych8.SettleDelay + MaxPreCommitRandomnessLookback = builtin8.EpochsInDay + SealRandomnessLookback ) // SetSupportedProofTypes sets supported proof types, across all actor versions. @@ -79,6 +84,8 @@ func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner8.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + AddSupportedProofTypes(types...) } @@ -135,6 +142,15 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { miner7.WindowPoStProofTypes[wpp] = struct{}{} + miner8.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner8.WindowPoStProofTypes[wpp] = struct{}{} + } } @@ -157,11 +173,13 @@ func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { miner7.PreCommitChallengeDelay = delay + miner8.PreCommitChallengeDelay = delay + } // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. func GetPreCommitChallengeDelay() abi.ChainEpoch { - return miner7.PreCommitChallengeDelay + return miner8.PreCommitChallengeDelay } // SetConsensusMinerMinPower sets the minimum power of an individual miner must @@ -195,6 +213,10 @@ func SetConsensusMinerMinPower(p abi.StoragePower) { policy.ConsensusMinerMinPower = p } + for _, policy := range builtin8.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + } // SetMinVerifiedDealSize sets the minimum size of a verified deal. This should @@ -215,6 +237,8 @@ func SetMinVerifiedDealSize(size abi.StoragePower) { verifreg7.MinVerifiedDealSize = size + verifreg8.MinVerifiedDealSize = size + } func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { @@ -248,6 +272,10 @@ func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (a return miner7.MaxProveCommitDuration[t], nil + case actors.Version8: + + return miner8.MaxProveCommitDuration[t], nil + default: return 0, xerrors.Errorf("unsupported actors version") } @@ -288,6 +316,11 @@ func SetProviderCollateralSupplyTarget(num, denom big.Int) { Denominator: denom, } + market8.ProviderCollateralSupplyTarget = builtin8.BigFrac{ + Numerator: num, + Denominator: denom, + } + } func DealProviderCollateralBounds( @@ -336,13 +369,18 @@ func DealProviderCollateralBounds( min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil + case actors.Version8: + + min, max := market8.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + default: return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") } } func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { - return market7.DealDurationBounds(pieceSize) + return market8.DealDurationBounds(pieceSize) } // Sets the challenge window and scales the proving period to match (such that @@ -390,6 +428,13 @@ func SetWPoStChallengeWindow(period abi.ChainEpoch) { // scale it if we're scaling the challenge period. miner7.WPoStDisputeWindow = period * 30 + miner8.WPoStChallengeWindow = period + miner8.WPoStProvingPeriod = period * abi.ChainEpoch(miner8.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner8.WPoStDisputeWindow = period * 30 + } func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { @@ -402,15 +447,15 @@ func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { } func GetMaxSectorExpirationExtension() abi.ChainEpoch { - return miner7.MaxSectorExpirationExtension + return miner8.MaxSectorExpirationExtension } func GetMinSectorExpiration() abi.ChainEpoch { - return miner7.MinSectorExpiration + return miner8.MinSectorExpiration } func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { - sectorsPerPart, err := builtin7.PoStProofWindowPoStPartitionSectors(p) + sectorsPerPart, err := builtin8.PoStProofWindowPoStPartitionSectors(p) if err != nil { return 0, err } @@ -423,8 +468,8 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e func GetDefaultSectorSize() abi.SectorSize { // supported sector sizes are the same across versions. - szs := make([]abi.SectorSize, 0, len(miner7.PreCommitSealProofTypesV8)) - for spt := range miner7.PreCommitSealProofTypesV8 { + szs := make([]abi.SectorSize, 0, len(miner8.PreCommitSealProofTypesV8)) + for spt := range miner8.PreCommitSealProofTypesV8 { ss, err := spt.SectorSize() if err != nil { panic(err) @@ -449,7 +494,7 @@ func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime } - return builtin7.SealProofPoliciesV11[proof].SectorMaxLifetime + return builtin8.SealProofPoliciesV11[proof].SectorMaxLifetime } func GetAddressedSectorsMax(nwVer network.Version) (int, error) { @@ -480,6 +525,9 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) { case actors.Version7: return miner7.AddressedSectorsMax, nil + case actors.Version8: + return miner8.AddressedSectorsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -521,6 +569,10 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) { return miner7.DeclarationsMax, nil + case actors.Version8: + + return miner8.DeclarationsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -561,6 +613,10 @@ func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, ba return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + case actors.Version8: + + return miner8.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } @@ -601,6 +657,10 @@ func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, base return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + case actors.Version8: + + return miner8.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } diff --git a/chain/actors/version.go b/chain/actors/version.go index af51161c9..1a17a6972 100644 --- a/chain/actors/version.go +++ b/chain/actors/version.go @@ -20,9 +20,9 @@ const ({{range .actorVersions}} /* inline-gen start */ -var LatestVersion = 7 +var LatestVersion = 8 -var Versions = []int{0, 2, 3, 4, 5, 6, 7} +var Versions = []int{0, 2, 3, 4, 5, 6, 7, 8} const ( Version0 Version = 0 @@ -32,6 +32,7 @@ const ( Version5 Version = 5 Version6 Version = 6 Version7 Version = 7 + Version8 Version = 8 ) /* inline-gen end */ @@ -53,6 +54,8 @@ func VersionForNetwork(version network.Version) (Version, error) { return Version6, nil case network.Version15: return Version7, nil + case network.Version16: + return Version8, nil default: return -1, fmt.Errorf("unsupported network version %d", version) } diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 9b2183a59..25d709cc6 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -30,6 +30,7 @@ import ( exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported" + exported8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/exported" /* inline-gen end */ @@ -63,6 +64,7 @@ func NewActorRegistry() *vm.ActorRegistry { inv.Register(vm.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...) inv.Register(vm.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...) inv.Register(vm.ActorsVersionPredicate(actors.Version7), exported7.BuiltinActors()...) + inv.Register(vm.ActorsVersionPredicate(actors.Version8), exported8.BuiltinActors()...) /* inline-gen end */ diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 116684b9f..83a36cfa3 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -5,6 +5,8 @@ import ( "runtime" "time" + "github.com/filecoin-project/specs-actors/v8/actors/migration/nv16" + "github.com/docker/go-units" "github.com/filecoin-project/specs-actors/v6/actors/migration/nv14" @@ -170,6 +172,17 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { StopWithin: 5, }}, Expensive: true, + }, { + Height: build.UpgradeFVM1Height, + Network: network.Version16, + Migration: UpgradeActorsV8, + PreMigrations: []stmgr.PreMigration{{ + PreMigration: PreUpgradeActorsV8, + StartWithin: 180, + DontStartWithin: 60, + StopWithin: 5, + }}, + Expensive: true, }, } @@ -1304,6 +1317,100 @@ func upgradeActorsV7Common( return newRoot, nil } +func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + // Use all the CPUs except 3. + workerCount := runtime.NumCPU() - 3 + if workerCount <= 0 { + workerCount = 1 + } + + config := nv16.Config{ + MaxWorkers: uint(workerCount), + JobQueueSize: 1000, + ResultQueueSize: 100, + ProgressLogPeriod: 10 * time.Second, + } + + newRoot, err := upgradeActorsV8Common(ctx, sm, cache, root, epoch, ts, config) + if err != nil { + return cid.Undef, xerrors.Errorf("migrating actors v6 state: %w", err) + } + + return newRoot, nil +} + +func PreUpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error { + // Use half the CPUs for pre-migration, but leave at least 3. + workerCount := runtime.NumCPU() + if workerCount <= 4 { + workerCount = 1 + } else { + workerCount /= 2 + } + + lbts, lbRoot, err := stmgr.GetLookbackTipSetForRound(ctx, sm, ts, epoch) + if err != nil { + return xerrors.Errorf("error getting lookback ts for premigration: %w", err) + } + + config := nv16.Config{MaxWorkers: uint(workerCount), + ProgressLogPeriod: time.Minute * 5} + + _, err = upgradeActorsV8Common(ctx, sm, cache, lbRoot, epoch, lbts, config) + return err +} + +func upgradeActorsV8Common( + ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, + root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, + config nv16.Config, +) (cid.Cid, error) { + buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync()) + store := store.ActorStore(ctx, buf) + + // Load the state root. + var stateRoot types.StateRoot + if err := store.Get(ctx, root, &stateRoot); err != nil { + return cid.Undef, xerrors.Errorf("failed to decode state root: %w", err) + } + + if stateRoot.Version != types.StateTreeVersion4 { + return cid.Undef, xerrors.Errorf( + "expected state root version 4 for actors v8 upgrade, got %d", + stateRoot.Version, + ) + } + + // Perform the migration + newHamtRoot, err := nv16.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) + if err != nil { + return cid.Undef, xerrors.Errorf("upgrading to actors v8: %w", err) + } + + // Persist the result. + newRoot, err := store.Put(ctx, &types.StateRoot{ + Version: types.StateTreeVersion4, + Actors: newHamtRoot, + Info: stateRoot.Info, + }) + if err != nil { + return cid.Undef, xerrors.Errorf("failed to persist new state root: %w", err) + } + + // Persist the new tree. + + { + from := buf + to := buf.Read() + + if err := vm.Copy(ctx, from, to, newRoot); err != nil { + return cid.Undef, xerrors.Errorf("copying migrated tree: %w", err) + } + } + + return newRoot, nil +} + type migrationLogger struct{} func (ml migrationLogger) Log(level rt.LogLevel, msg string, args ...interface{}) { diff --git a/chain/state/statetree.go b/chain/state/statetree.go index 9a518a622..7d6876c3c 100644 --- a/chain/state/statetree.go +++ b/chain/state/statetree.go @@ -159,7 +159,7 @@ func VersionForNetwork(ver network.Version) (types.StateTreeVersion, error) { /* inline-gen start */ - case network.Version13, network.Version14, network.Version15: + case network.Version13, network.Version14, network.Version15, network.Version16: /* inline-gen end */ return types.StateTreeVersion4, nil diff --git a/chain/sync_test.go b/chain/sync_test.go index 96ed1440e..e97645fe9 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -143,6 +143,14 @@ func prepSyncTestWithV5Height(t testing.TB, h int, v5height abi.ChainEpoch) *syn Network: network.Version14, Height: v5height + 10, Migration: filcns.UpgradeActorsV6, + }, { + Network: network.Version15, + Height: v5height + 15, + Migration: filcns.UpgradeActorsV7, + }, { + Network: network.Version16, + Height: v5height + 20, + Migration: filcns.UpgradeActorsV8, }} g, err := gen.NewGeneratorWithUpgradeSchedule(sched) diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go index 6666f16ad..1c91288c7 100644 --- a/chain/vm/mkactor.go +++ b/chain/vm/mkactor.go @@ -27,6 +27,7 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" /* inline-gen end */ @@ -133,6 +134,8 @@ func newAccountActor(ver actors.Version) *types.Actor { code = builtin6.AccountActorCodeID case actors.Version7: code = builtin7.AccountActorCodeID + case actors.Version8: + code = builtin8.AccountActorCodeID /* inline-gen end */ default: panic("unsupported actors version") diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index c27c45371..9c4344a02 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -23,6 +23,7 @@ import ( rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" rt6 "github.com/filecoin-project/specs-actors/v6/actors/runtime" rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + rt8 "github.com/filecoin-project/specs-actors/v8/actors/runtime" "github.com/ipfs/go-cid" ipldcbor "github.com/ipfs/go-ipld-cbor" "go.opencensus.io/trace" @@ -153,6 +154,7 @@ var _ rt4.Runtime = (*Runtime)(nil) var _ rt5.Runtime = (*Runtime)(nil) var _ rt6.Runtime = (*Runtime)(nil) var _ rt7.Runtime = (*Runtime)(nil) +var _ rt8.Runtime = (*Runtime)(nil) func (rt *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.ActorError) { defer func() { diff --git a/chain/vm/vmi.go b/chain/vm/vmi.go index 9ffd8d830..f3d522a7c 100644 --- a/chain/vm/vmi.go +++ b/chain/vm/vmi.go @@ -4,6 +4,7 @@ import ( "context" "os" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/chain/types" "github.com/ipfs/go-cid" ) @@ -18,7 +19,12 @@ type Interface interface { Flush(ctx context.Context) (cid.Cid, error) } -func NewVM(ctx context.Context, opts *VMOpts) (Interface, error) { +func NewVM(ctx context.Context, opts *VMOpts) (VMI, error) { + if opts.NetworkVersion >= network.Version16 { + return NewFVM(ctx, opts) + } + + // Remove after v16 upgrade, this is only to support testing and validation of the FVM if os.Getenv("LOTUS_USE_FVM_EXPERIMENTAL") == "1" { return NewFVM(ctx, opts) } diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 64d09971b..c0e913ca7 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -381,7 +381,7 @@ Inputs: ], "Bw==", 10101, - 15 + 16 ] ``` diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 6973a6651..a1e50836a 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -6078,7 +6078,7 @@ Inputs: ] ``` -Response: `15` +Response: `16` ### StateReadState StateReadState returns the indicated actor's state. diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index c72483e9d..6d24e915f 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -6494,7 +6494,7 @@ Inputs: ] ``` -Response: `15` +Response: `16` ### StateReadState StateReadState returns the indicated actor's state. diff --git a/gen/inlinegen-data.json b/gen/inlinegen-data.json index ef97db651..8b8081ac4 100644 --- a/gen/inlinegen-data.json +++ b/gen/inlinegen-data.json @@ -1,7 +1,7 @@ { - "actorVersions": [0, 2, 3, 4, 5, 6, 7], - "latestActorsVersion": 7, + "actorVersions": [0, 2, 3, 4, 5, 6, 7, 8], + "latestActorsVersion": 8, - "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], - "latestNetworkVersion": 15 + "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], + "latestNetworkVersion": 16 } diff --git a/go.mod b/go.mod index 2026adcff..b89c29811 100644 --- a/go.mod +++ b/go.mod @@ -56,6 +56,7 @@ require ( github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0 github.com/filecoin-project/specs-storage v0.2.2 + github.com/filecoin-project/specs-actors/v8 v8.0.0-20220301040630-7465555c2e22 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index 523c180ea..6a18398c0 100644 --- a/go.sum +++ b/go.sum @@ -396,6 +396,10 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0 h1:FQN7tjt3o68hfb3qLFSJBoLMuO github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.2.2 h1:6ugbtKQ6LTcTEnEIX9HkeCtTp1PCYO497P/bokF5tF4= github.com/filecoin-project/specs-storage v0.2.2/go.mod h1:6cc/lncmAxMUocPi0z1EPCX63beIX7F7UnlmUZ3hLQo= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220301040630-7465555c2e22 h1:zf32sRuUQUDGZ8gc50CFFibzAboWleLW4EwR4apgpAw= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220301040630-7465555c2e22/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= +github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= +github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/storetheindex v0.3.5 h1:KoS9TvjPm6zIZfUH8atAHJbVHOO7GTP1MdTG+v0eE+Q= github.com/filecoin-project/storetheindex v0.3.5/go.mod h1:0r3d0kSpK63O6AvLr1CjAINLi+nWD49clzcnKV+GLpI= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/itests/kit/ensemble_opts_nv.go b/itests/kit/ensemble_opts_nv.go index 45ed51443..b51b82bd5 100644 --- a/itests/kit/ensemble_opts_nv.go +++ b/itests/kit/ensemble_opts_nv.go @@ -49,12 +49,12 @@ func LatestActorsAt(upgradeHeight abi.ChainEpoch) EnsembleOpt { }) /* inline-gen start */ return UpgradeSchedule(stmgr.Upgrade{ - Network: network.Version14, + Network: network.Version15, Height: -1, }, stmgr.Upgrade{ - Network: network.Version15, + Network: network.Version16, Height: upgradeHeight, - Migration: filcns.UpgradeActorsV7, + Migration: filcns.UpgradeActorsV8, }) /* inline-gen end */ } diff --git a/lotuspond/front/src/chain/methods.json b/lotuspond/front/src/chain/methods.json index 15c04ca28..938105528 100644 --- a/lotuspond/front/src/chain/methods.json +++ b/lotuspond/front/src/chain/methods.json @@ -730,5 +730,113 @@ "UseBytes", "RestoreBytes", "RemoveVerifiedClientDataCap" + ], + "fil/8/account": [ + "Send", + "Constructor", + "PubkeyAddress" + ], + "fil/8/cron": [ + "Send", + "Constructor", + "EpochTick" + ], + "fil/8/init": [ + "Send", + "Constructor", + "Exec" + ], + "fil/8/multisig": [ + "Send", + "Constructor", + "Propose", + "Approve", + "Cancel", + "AddSigner", + "RemoveSigner", + "SwapSigner", + "ChangeNumApprovalsThreshold", + "LockBalance" + ], + "fil/8/paymentchannel": [ + "Send", + "Constructor", + "UpdateChannelState", + "Settle", + "Collect" + ], + "fil/8/reward": [ + "Send", + "Constructor", + "AwardBlockReward", + "ThisEpochReward", + "UpdateNetworkKPI" + ], + "fil/8/storagemarket": [ + "Send", + "Constructor", + "AddBalance", + "WithdrawBalance", + "PublishStorageDeals", + "VerifyDealsForActivation", + "ActivateDeals", + "OnMinerSectorsTerminate", + "ComputeDataCommitment", + "CronTick" + ], + "fil/8/storageminer": [ + "Send", + "Constructor", + "ControlAddresses", + "ChangeWorkerAddress", + "ChangePeerID", + "SubmitWindowedPoSt", + "PreCommitSector", + "ProveCommitSector", + "ExtendSectorExpiration", + "TerminateSectors", + "DeclareFaults", + "DeclareFaultsRecovered", + "OnDeferredCronEvent", + "CheckSectorProven", + "ApplyRewards", + "ReportConsensusFault", + "WithdrawBalance", + "ConfirmSectorProofsValid", + "ChangeMultiaddrs", + "CompactPartitions", + "CompactSectorNumbers", + "ConfirmUpdateWorkerKey", + "RepayDebt", + "ChangeOwnerAddress", + "DisputeWindowedPoSt", + "PreCommitSectorBatch", + "ProveCommitAggregate", + "ProveReplicaUpdates" + ], + "fil/8/storagepower": [ + "Send", + "Constructor", + "CreateMiner", + "UpdateClaimedPower", + "EnrollCronEvent", + "CronTick", + "UpdatePledgeTotal", + "SubmitPoRepForBulkVerify", + "CurrentTotalPower" + ], + "fil/8/system": [ + "Send", + "Constructor" + ], + "fil/8/verifiedregistry": [ + "Send", + "Constructor", + "AddVerifier", + "RemoveVerifier", + "AddVerifiedClient", + "UseBytes", + "RestoreBytes", + "RemoveVerifiedClientDataCap" ] } \ No newline at end of file From 13a4602806105fa2b868d441b106e17b5e3bbdf2 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 12:02:18 +0300 Subject: [PATCH 002/228] gomod: update specs-actors@v8 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index b89c29811..d87d4bb6b 100644 --- a/go.mod +++ b/go.mod @@ -56,7 +56,7 @@ require ( github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0 github.com/filecoin-project/specs-storage v0.2.2 - github.com/filecoin-project/specs-actors/v8 v8.0.0-20220301040630-7465555c2e22 + github.com/filecoin-project/specs-actors/v8 v8.0.0-20220404082322-5f5089f6e8bd github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index 6a18398c0..bc9a9342c 100644 --- a/go.sum +++ b/go.sum @@ -398,6 +398,8 @@ github.com/filecoin-project/specs-storage v0.2.2 h1:6ugbtKQ6LTcTEnEIX9HkeCtTp1PC github.com/filecoin-project/specs-storage v0.2.2/go.mod h1:6cc/lncmAxMUocPi0z1EPCX63beIX7F7UnlmUZ3hLQo= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220301040630-7465555c2e22 h1:zf32sRuUQUDGZ8gc50CFFibzAboWleLW4EwR4apgpAw= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220301040630-7465555c2e22/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220404082322-5f5089f6e8bd h1:Ogyyz6Eh1CPoD1U4lT208vNS0UlMcl/C3UlqPLkkRqw= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220404082322-5f5089f6e8bd/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/storetheindex v0.3.5 h1:KoS9TvjPm6zIZfUH8atAHJbVHOO7GTP1MdTG+v0eE+Q= From a9ae38a1cedf1f3a9a91e1b47b14ea48052a4fb3 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 12:03:48 +0300 Subject: [PATCH 003/228] wire in nv16 migration signature and manifests --- chain/consensus/filcns/upgrades.go | 109 ++++++++++++++++++++++------- chain/stmgr/forks.go | 21 +++--- chain/stmgr/stmgr.go | 8 ++- 3 files changed, 102 insertions(+), 36 deletions(-) diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 83a36cfa3..ba1d7736b 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -45,132 +45,189 @@ import ( "github.com/filecoin-project/lotus/chain/vm" ) +type LegacyMigrationFunc = func( + ctx context.Context, + sm *stmgr.StateManager, cache stmgr.MigrationCache, + cb stmgr.ExecMonitor, + oldState cid.Cid, + height abi.ChainEpoch, ts *types.TipSet, +) (newState cid.Cid, err error) + +type LegacyPreMigrationFunc = func( + ctx context.Context, + sm *stmgr.StateManager, cache stmgr.MigrationCache, + oldState cid.Cid, + height abi.ChainEpoch, ts *types.TipSet, +) error + +func legacyMigration(f LegacyMigrationFunc) stmgr.MigrationFunc { + return func( + ctx context.Context, + sm *stmgr.StateManager, cache stmgr.MigrationCache, + cb stmgr.ExecMonitor, + manifest cid.Cid, + oldState cid.Cid, + height abi.ChainEpoch, ts *types.TipSet, + ) (newState cid.Cid, err error) { + return f(ctx, sm, cache, cb, oldState, height, ts) + } +} + +func legacyPreMigration(f LegacyPreMigrationFunc) stmgr.PreMigrationFunc { + return func( + ctx context.Context, + sm *stmgr.StateManager, cache stmgr.MigrationCache, + manifest cid.Cid, + oldState cid.Cid, + height abi.ChainEpoch, ts *types.TipSet, + ) error { + return f(ctx, sm, cache, oldState, height, ts) + } +} + func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { var us stmgr.UpgradeSchedule updates := []stmgr.Upgrade{{ Height: build.UpgradeBreezeHeight, Network: network.Version1, - Migration: UpgradeFaucetBurnRecovery, + Migration: legacyMigration(UpgradeFaucetBurnRecovery), + Manifest: cid.Undef, }, { Height: build.UpgradeSmokeHeight, Network: network.Version2, Migration: nil, + Manifest: cid.Undef, }, { Height: build.UpgradeIgnitionHeight, Network: network.Version3, - Migration: UpgradeIgnition, + Migration: legacyMigration(UpgradeIgnition), + Manifest: cid.Undef, }, { Height: build.UpgradeRefuelHeight, Network: network.Version3, - Migration: UpgradeRefuel, + Migration: legacyMigration(UpgradeRefuel), + Manifest: cid.Undef, }, { Height: build.UpgradeAssemblyHeight, Network: network.Version4, Expensive: true, - Migration: UpgradeActorsV2, + Migration: legacyMigration(UpgradeActorsV2), + Manifest: cid.Undef, }, { Height: build.UpgradeTapeHeight, Network: network.Version5, Migration: nil, + Manifest: cid.Undef, }, { Height: build.UpgradeLiftoffHeight, Network: network.Version5, - Migration: UpgradeLiftoff, + Migration: legacyMigration(UpgradeLiftoff), + Manifest: cid.Undef, }, { Height: build.UpgradeKumquatHeight, Network: network.Version6, Migration: nil, + Manifest: cid.Undef, }, { Height: build.UpgradeCalicoHeight, Network: network.Version7, - Migration: UpgradeCalico, + Migration: legacyMigration(UpgradeCalico), + Manifest: cid.Undef, }, { Height: build.UpgradePersianHeight, Network: network.Version8, Migration: nil, + Manifest: cid.Undef, }, { Height: build.UpgradeOrangeHeight, Network: network.Version9, Migration: nil, + Manifest: cid.Undef, }, { Height: build.UpgradeTrustHeight, Network: network.Version10, - Migration: UpgradeActorsV3, + Migration: legacyMigration(UpgradeActorsV3), PreMigrations: []stmgr.PreMigration{{ - PreMigration: PreUpgradeActorsV3, + PreMigration: legacyPreMigration(PreUpgradeActorsV3), StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: PreUpgradeActorsV3, + PreMigration: legacyPreMigration(PreUpgradeActorsV3), StartWithin: 30, DontStartWithin: 15, StopWithin: 5, }}, + Manifest: cid.Undef, Expensive: true, }, { Height: build.UpgradeNorwegianHeight, Network: network.Version11, Migration: nil, + Manifest: cid.Undef, }, { Height: build.UpgradeTurboHeight, Network: network.Version12, - Migration: UpgradeActorsV4, + Migration: legacyMigration(UpgradeActorsV4), PreMigrations: []stmgr.PreMigration{{ - PreMigration: PreUpgradeActorsV4, + PreMigration: legacyPreMigration(PreUpgradeActorsV4), StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: PreUpgradeActorsV4, + PreMigration: legacyPreMigration(PreUpgradeActorsV4), StartWithin: 30, DontStartWithin: 15, StopWithin: 5, }}, + Manifest: cid.Undef, Expensive: true, }, { Height: build.UpgradeHyperdriveHeight, Network: network.Version13, - Migration: UpgradeActorsV5, + Migration: legacyMigration(UpgradeActorsV5), PreMigrations: []stmgr.PreMigration{{ - PreMigration: PreUpgradeActorsV5, + PreMigration: legacyPreMigration(PreUpgradeActorsV5), StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: PreUpgradeActorsV5, + PreMigration: legacyPreMigration(PreUpgradeActorsV5), StartWithin: 30, DontStartWithin: 15, StopWithin: 5, }}, + Manifest: cid.Undef, Expensive: true, }, { Height: build.UpgradeChocolateHeight, Network: network.Version14, - Migration: UpgradeActorsV6, + Migration: legacyMigration(UpgradeActorsV6), PreMigrations: []stmgr.PreMigration{{ - PreMigration: PreUpgradeActorsV6, + PreMigration: legacyPreMigration(PreUpgradeActorsV6), StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: PreUpgradeActorsV6, + PreMigration: legacyPreMigration(PreUpgradeActorsV6), StartWithin: 30, DontStartWithin: 15, StopWithin: 5, }}, + Manifest: cid.Undef, Expensive: true, }, { Height: build.UpgradeOhSnapHeight, Network: network.Version15, - Migration: UpgradeActorsV7, + Migration: legacyMigration(UpgradeActorsV7), PreMigrations: []stmgr.PreMigration{{ - PreMigration: PreUpgradeActorsV7, + PreMigration: legacyPreMigration(PreUpgradeActorsV7), StartWithin: 180, DontStartWithin: 60, StopWithin: 5, }}, + Manifest: cid.Undef, Expensive: true, }, { Height: build.UpgradeFVM1Height, @@ -182,6 +239,7 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { DontStartWithin: 60, StopWithin: 5, }}, + Manifest: cid.Undef, // TODO this should be the real manifest CID Expensive: true, }, } @@ -1317,7 +1375,7 @@ func upgradeActorsV7Common( return newRoot, nil } -func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { +func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, manifest cid.Cid, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { // Use all the CPUs except 3. workerCount := runtime.NumCPU() - 3 if workerCount <= 0 { @@ -1331,7 +1389,7 @@ func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi ProgressLogPeriod: 10 * time.Second, } - newRoot, err := upgradeActorsV8Common(ctx, sm, cache, root, epoch, ts, config) + newRoot, err := upgradeActorsV8Common(ctx, sm, cache, manifest, root, epoch, ts, config) if err != nil { return cid.Undef, xerrors.Errorf("migrating actors v6 state: %w", err) } @@ -1339,7 +1397,7 @@ func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi return newRoot, nil } -func PreUpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error { +func PreUpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, manifest cid.Cid, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error { // Use half the CPUs for pre-migration, but leave at least 3. workerCount := runtime.NumCPU() if workerCount <= 4 { @@ -1356,12 +1414,13 @@ func PreUpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr config := nv16.Config{MaxWorkers: uint(workerCount), ProgressLogPeriod: time.Minute * 5} - _, err = upgradeActorsV8Common(ctx, sm, cache, lbRoot, epoch, lbts, config) + _, err = upgradeActorsV8Common(ctx, sm, cache, manifest, lbRoot, epoch, lbts, config) return err } func upgradeActorsV8Common( ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, + manifest cid.Cid, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, config nv16.Config, ) (cid.Cid, error) { @@ -1382,7 +1441,7 @@ func upgradeActorsV8Common( } // Perform the migration - newHamtRoot, err := nv16.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) + newHamtRoot, err := nv16.MigrateStateTree(ctx, store, manifest, stateRoot.Actors, epoch, config, migrationLogger{}, cache) if err != nil { return cid.Undef, xerrors.Errorf("upgrading to actors v8: %w", err) } diff --git a/chain/stmgr/forks.go b/chain/stmgr/forks.go index 9aa3f7e53..8a600f6cf 100644 --- a/chain/stmgr/forks.go +++ b/chain/stmgr/forks.go @@ -8,9 +8,7 @@ import ( "sync" "time" - "github.com/filecoin-project/lotus/build" - - "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" + "github.com/filecoin-project/specs-actors/v8/actors/migration/nv16" "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -49,7 +47,9 @@ type MigrationCache interface { type MigrationFunc func( ctx context.Context, sm *StateManager, cache MigrationCache, - cb ExecMonitor, oldState cid.Cid, + cb ExecMonitor, + manifest cid.Cid, + oldState cid.Cid, height abi.ChainEpoch, ts *types.TipSet, ) (newState cid.Cid, err error) @@ -58,6 +58,7 @@ type MigrationFunc func( type PreMigrationFunc func( ctx context.Context, sm *StateManager, cache MigrationCache, + manifest cid.Cid, oldState cid.Cid, height abi.ChainEpoch, ts *types.TipSet, ) error @@ -94,6 +95,10 @@ type Upgrade struct { // These functions should fill the given cache with information that can speed up the // eventual full migration at the upgrade epoch. PreMigrations []PreMigration + + // Manifest is the migration manifest CID, starting with nv16; for older migrations it is + // undefined + Manifest cid.Cid } type UpgradeSchedule []Upgrade @@ -177,7 +182,7 @@ func (sm *StateManager) HandleStateForks(ctx context.Context, root cid.Cid, heig // Yes, we clone the cache, even for the final upgrade epoch. Why? Reverts. We may // have to migrate multiple times. tmpCache := u.cache.Clone() - retCid, err = u.upgrade(ctx, sm, tmpCache, cb, root, height, ts) + retCid, err = u.upgrade(ctx, sm, tmpCache, cb, u.manifest, root, height, ts) if err != nil { log.Errorw("FAILED migration", "height", height, "from", root, "error", err) return cid.Undef, err @@ -214,7 +219,7 @@ func (sm *StateManager) hasExpensiveFork(height abi.ChainEpoch) bool { return ok } -func runPreMigration(ctx context.Context, sm *StateManager, fn PreMigrationFunc, cache *nv15.MemMigrationCache, ts *types.TipSet) { +func runPreMigration(ctx context.Context, sm *StateManager, manifest cid.Cid, fn PreMigrationFunc, cache *nv16.MemMigrationCache, ts *types.TipSet) { height := ts.Height() parent := ts.ParentState() @@ -226,7 +231,7 @@ func runPreMigration(ctx context.Context, sm *StateManager, fn PreMigrationFunc, // migration to use the cache may assume that // certain blocks exist, even if they don't. tmpCache := cache.Clone() - err := fn(ctx, sm, tmpCache, parent, height, ts) + err := fn(ctx, sm, tmpCache, manifest, parent, height, ts) if err != nil { log.Errorw("FAILED pre-migration", "error", err) return @@ -277,7 +282,7 @@ func (sm *StateManager) preMigrationWorker(ctx context.Context) { wg.Add(1) go func() { defer wg.Done() - runPreMigration(preCtx, sm, migrationFunc, cache, ts) + runPreMigration(preCtx, sm, migration.manifest, migrationFunc, cache, ts) }() }, }) diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index d0bdd73e9..f6d8582e2 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -4,7 +4,7 @@ import ( "context" "sync" - "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" + "github.com/filecoin-project/specs-actors/v8/actors/migration/nv16" "github.com/filecoin-project/lotus/chain/rand" @@ -54,7 +54,8 @@ type versionSpec struct { type migration struct { upgrade MigrationFunc preMigrations []PreMigration - cache *nv15.MemMigrationCache + cache *nv16.MemMigrationCache + manifest cid.Cid } type Executor interface { @@ -122,7 +123,8 @@ func NewStateManager(cs *store.ChainStore, exec Executor, sys vm.SyscallBuilder, migration := &migration{ upgrade: upgrade.Migration, preMigrations: upgrade.PreMigrations, - cache: nv15.NewMemMigrationCache(), + cache: nv16.NewMemMigrationCache(), + manifest: upgrade.Manifest, } stateMigrations[upgrade.Height] = migration } From 08a5950863edab34b2769813d05251d407a19a0a Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 14:14:27 +0300 Subject: [PATCH 004/228] actor manifests and metadata --- chain/actors/manifest.go | 72 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 chain/actors/manifest.go diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go new file mode 100644 index 000000000..ac3733737 --- /dev/null +++ b/chain/actors/manifest.go @@ -0,0 +1,72 @@ +package actors + +import ( + "context" + + "golang.org/x/xerrors" + + cid "github.com/ipfs/go-cid" + cbor "github.com/ipfs/go-ipld-cbor" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/specs-actors/v8/actors/builtin/manifest" +) + +var manifestCids map[Version]cid.Cid = map[Version]cid.Cid{ + // TODO manifest CIDs for v8 and upwards +} + +var manifests map[Version]*manifest.Manifest +var actorMeta map[cid.Cid]actorEntry + +type actorEntry struct { + name string + version Version +} + +func LoadManifests(ctx context.Context, store cbor.IpldStore) error { + adtStore := adt.WrapStore(ctx, store) + + manifests = make(map[Version]*manifest.Manifest) + actorMeta = make(map[cid.Cid]actorEntry) + + for av, mfCid := range manifestCids { + mf := &manifest.Manifest{} + if err := adtStore.Get(ctx, mfCid, mf); err != nil { + return xerrors.Errorf("error reading manifest for network version %d (cid: %s): %w", av, mfCid, err) + } + + if err := mf.Load(ctx, adtStore); err != nil { + return xerrors.Errorf("error loading manifest for network version %d: %w", av, err) + } + + manifests[av] = mf + + for _, name := range []string{"system", "init", "cron", "account", "storagepower", "storageminer", "storagemarket", "paymentchannel", "multisig", "reward", "verifiedregistry"} { + c, ok := mf.Get(name) + if ok { + actorMeta[c] = actorEntry{name: name, version: av} + } + } + } + + return nil +} + +func GetActorCodeID(av Version, name string) (cid.Cid, bool) { + mf, ok := manifests[av] + if ok { + return mf.Get(name) + } + + return cid.Undef, false +} + +func GetActorMetaByCode(c cid.Cid) (string, Version, bool) { + entry, ok := actorMeta[c] + if !ok { + return "", -1, false + } + + return entry.name, entry.version, true +} From 770608aef14de882894db05d9aa9c0806688a6ea Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 14:23:13 +0300 Subject: [PATCH 005/228] update templates for actor shims --- .../actors/builtin/account/actor.go.template | 25 +++++++++++++++ chain/actors/builtin/builtin.go.template | 31 +++++++++++++++++++ chain/actors/builtin/cron/actor.go.template | 4 +++ chain/actors/builtin/init/actor.go.template | 25 +++++++++++++++ chain/actors/builtin/market/actor.go.template | 25 +++++++++++++++ chain/actors/builtin/miner/actor.go.template | 25 +++++++++++++++ .../actors/builtin/multisig/actor.go.template | 25 +++++++++++++++ chain/actors/builtin/paych/actor.go.template | 25 +++++++++++++++ chain/actors/builtin/power/actor.go.template | 25 +++++++++++++++ chain/actors/builtin/reward/actor.go.template | 25 +++++++++++++++ chain/actors/builtin/system/actor.go.template | 4 +++ .../actors/builtin/verifreg/actor.go.template | 25 +++++++++++++++ 12 files changed, 264 insertions(+) diff --git a/chain/actors/builtin/account/actor.go.template b/chain/actors/builtin/account/actor.go.template index 53962cc94..603d7c0ae 100644 --- a/chain/actors/builtin/account/actor.go.template +++ b/chain/actors/builtin/account/actor.go.template @@ -21,11 +21,32 @@ func init() { builtin.RegisterActorState(builtin{{.}}.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "account"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) + } {{end}}} var Methods = builtin4.MethodsAccount func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "account" { + return nil, xerrors.Errorf("actor code is not account: %s", name) + } + + switch av { + {{range .versions}} + case actors.Version{{.}}: + return load{{.}}(store, act.Head) + {{end}} + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { {{range .versions}} case builtin{{.}}.AccountActorCodeID: @@ -46,6 +67,10 @@ func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "account"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: diff --git a/chain/actors/builtin/builtin.go.template b/chain/actors/builtin/builtin.go.template index f5d5eb77b..bee8e1363 100644 --- a/chain/actors/builtin/builtin.go.template +++ b/chain/actors/builtin/builtin.go.template @@ -13,6 +13,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" @@ -80,6 +81,11 @@ func Load(store adt.Store, act *types.Actor) (cbor.Marshaler, error) { } func ActorNameByCode(c cid.Cid) string { + name, _, ok := actors.GetActorMetaByCode(c) + if ok { + return name + } + switch { {{range .versions}} case builtin{{.}}.IsBuiltinActor(c): @@ -91,6 +97,11 @@ func ActorNameByCode(c cid.Cid) string { } func IsBuiltinActor(c cid.Cid) bool { + _, _, ok := actors.GetActorMetaByCode(c) + if ok { + return true + } + {{range .versions}} if builtin{{.}}.IsBuiltinActor(c) { return true @@ -100,6 +111,11 @@ func IsBuiltinActor(c cid.Cid) bool { } func IsAccountActor(c cid.Cid) bool { + name, _, ok := actors.GetActorMetaByCode(c) + if ok { + return name == "account" + } + {{range .versions}} if c == builtin{{.}}.AccountActorCodeID { return true @@ -109,6 +125,11 @@ func IsAccountActor(c cid.Cid) bool { } func IsStorageMinerActor(c cid.Cid) bool { + name, _, ok := actors.GetActorMetaByCode(c) + if ok { + return name == "storageminer" + } + {{range .versions}} if c == builtin{{.}}.StorageMinerActorCodeID { return true @@ -118,6 +139,11 @@ func IsStorageMinerActor(c cid.Cid) bool { } func IsMultisigActor(c cid.Cid) bool { + name, _, ok := actors.GetActorMetaByCode(c) + if ok { + return name == "multisig" + } + {{range .versions}} if c == builtin{{.}}.MultisigActorCodeID { return true @@ -127,6 +153,11 @@ func IsMultisigActor(c cid.Cid) bool { } func IsPaymentChannelActor(c cid.Cid) bool { + name, _, ok := actors.GetActorMetaByCode(c) + if ok { + return name == "paymentchannel" + } + {{range .versions}} if c == builtin{{.}}.PaymentChannelActorCodeID { return true diff --git a/chain/actors/builtin/cron/actor.go.template b/chain/actors/builtin/cron/actor.go.template index d73808556..6d15f693e 100644 --- a/chain/actors/builtin/cron/actor.go.template +++ b/chain/actors/builtin/cron/actor.go.template @@ -21,6 +21,10 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "cron"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: diff --git a/chain/actors/builtin/init/actor.go.template b/chain/actors/builtin/init/actor.go.template index f825eb9fa..3c1457fdf 100644 --- a/chain/actors/builtin/init/actor.go.template +++ b/chain/actors/builtin/init/actor.go.template @@ -23,6 +23,12 @@ func init() { builtin.RegisterActorState(builtin{{.}}.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "init"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) + } {{end}}} var ( @@ -31,6 +37,21 @@ var ( ) func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "init" { + return nil, xerrors.Errorf("actor code is not init: %s", name) + } + + switch av { + {{range .versions}} + case actors.Version{{.}}: + return load{{.}}(store, act.Head) + {{end}} + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { {{range .versions}} case builtin{{.}}.InitActorCodeID: @@ -51,6 +72,10 @@ func MakeState(store adt.Store, av actors.Version, networkName string) (State, e } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "init"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: diff --git a/chain/actors/builtin/market/actor.go.template b/chain/actors/builtin/market/actor.go.template index 72b0bd322..cf618bd73 100644 --- a/chain/actors/builtin/market/actor.go.template +++ b/chain/actors/builtin/market/actor.go.template @@ -27,6 +27,12 @@ func init() { builtin.RegisterActorState(builtin{{.}}.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "storagemarket"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) + } {{end}}} var ( @@ -35,6 +41,21 @@ var ( ) func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "storagemarket" { + return nil, xerrors.Errorf("actor code is not storagemarket: %s", name) + } + + switch av { + {{range .versions}} + case actors.Version{{.}}: + return load{{.}}(store, act.Head) + {{end}} + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { {{range .versions}} case builtin{{.}}.StorageMarketActorCodeID: @@ -55,6 +76,10 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "storagemarket"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: diff --git a/chain/actors/builtin/miner/actor.go.template b/chain/actors/builtin/miner/actor.go.template index 74c16be36..278213237 100644 --- a/chain/actors/builtin/miner/actor.go.template +++ b/chain/actors/builtin/miner/actor.go.template @@ -34,6 +34,12 @@ func init() { builtin.RegisterActorState(builtin{{.}}.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "storageminer"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) + } {{end}} } @@ -54,6 +60,21 @@ var DeclarationsMax = miner2.DeclarationsMax var AddressedSectorsMax = miner2.AddressedSectorsMax func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "storageminer" { + return nil, xerrors.Errorf("actor code is not storageminer: %s", name) + } + + switch av { + {{range .versions}} + case actors.Version{{.}}: + return load{{.}}(store, act.Head) + {{end}} + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { {{range .versions}} case builtin{{.}}.StorageMinerActorCodeID: @@ -74,6 +95,10 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "storageminer"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: diff --git a/chain/actors/builtin/multisig/actor.go.template b/chain/actors/builtin/multisig/actor.go.template index b899815a6..6a4062900 100644 --- a/chain/actors/builtin/multisig/actor.go.template +++ b/chain/actors/builtin/multisig/actor.go.template @@ -29,9 +29,30 @@ func init() { builtin.RegisterActorState(builtin{{.}}.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "multisig"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) + } {{end}}} func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "multisig" { + return nil, xerrors.Errorf("actor code is not multisig: %s", name) + } + + switch av { + {{range .versions}} + case actors.Version{{.}}: + return load{{.}}(store, act.Head) + {{end}} + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { {{range .versions}} case builtin{{.}}.MultisigActorCodeID: @@ -52,6 +73,10 @@ func MakeState(store adt.Store, av actors.Version, signers []address.Address, th } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "multisig"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: diff --git a/chain/actors/builtin/paych/actor.go.template b/chain/actors/builtin/paych/actor.go.template index 7699e76b6..7f39eb8c6 100644 --- a/chain/actors/builtin/paych/actor.go.template +++ b/chain/actors/builtin/paych/actor.go.template @@ -29,10 +29,31 @@ func init() { builtin.RegisterActorState(builtin{{.}}.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "paymentchannel"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) + } {{end}}} // Load returns an abstract copy of payment channel state, irregardless of actor version func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "paymentchannel" { + return nil, xerrors.Errorf("actor code is not paymentchannel: %s", name) + } + + switch av { + {{range .versions}} + case actors.Version{{.}}: + return load{{.}}(store, act.Head) + {{end}} + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { {{range .versions}} case builtin{{.}}.PaymentChannelActorCodeID: @@ -53,6 +74,10 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "paymentchannel"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: diff --git a/chain/actors/builtin/power/actor.go.template b/chain/actors/builtin/power/actor.go.template index fe11fc160..2feb764e5 100644 --- a/chain/actors/builtin/power/actor.go.template +++ b/chain/actors/builtin/power/actor.go.template @@ -24,6 +24,12 @@ func init() { builtin.RegisterActorState(builtin{{.}}.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "storagepower"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) + } {{end}}} var ( @@ -32,6 +38,21 @@ var ( ) func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "storagepower" { + return nil, xerrors.Errorf("actor code is not storagepower: %s", name) + } + + switch av { + {{range .versions}} + case actors.Version{{.}}: + return load{{.}}(store, act.Head) + {{end}} + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { {{range .versions}} case builtin{{.}}.StoragePowerActorCodeID: @@ -52,6 +73,10 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "storagepower"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: diff --git a/chain/actors/builtin/reward/actor.go.template b/chain/actors/builtin/reward/actor.go.template index 89cdddaec..dbd69d937 100644 --- a/chain/actors/builtin/reward/actor.go.template +++ b/chain/actors/builtin/reward/actor.go.template @@ -22,6 +22,12 @@ func init() { builtin.RegisterActorState(builtin{{.}}.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "reward"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) + } {{end}}} var ( @@ -30,6 +36,21 @@ var ( ) func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "reward" { + return nil, xerrors.Errorf("actor code is not reward: %s", name) + } + + switch av { + {{range .versions}} + case actors.Version{{.}}: + return load{{.}}(store, act.Head) + {{end}} + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { {{range .versions}} case builtin{{.}}.RewardActorCodeID: @@ -50,6 +71,10 @@ func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.Storage } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "reward"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: diff --git a/chain/actors/builtin/system/actor.go.template b/chain/actors/builtin/system/actor.go.template index 925319970..1b25e45af 100644 --- a/chain/actors/builtin/system/actor.go.template +++ b/chain/actors/builtin/system/actor.go.template @@ -26,6 +26,10 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "system"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: diff --git a/chain/actors/builtin/verifreg/actor.go.template b/chain/actors/builtin/verifreg/actor.go.template index 715dd6d61..d2f212fff 100644 --- a/chain/actors/builtin/verifreg/actor.go.template +++ b/chain/actors/builtin/verifreg/actor.go.template @@ -24,6 +24,12 @@ func init() { builtin.RegisterActorState(builtin{{.}}.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "verifiedregistry"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load{{.}}(store, root) + }) + } {{end}} } @@ -33,6 +39,21 @@ var ( ) func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "verifiedregistry" { + return nil, xerrors.Errorf("actor code is not verifiedregistry: %s", name) + } + + switch av { + {{range .versions}} + case actors.Version{{.}}: + return load{{.}}(store, act.Head) + {{end}} + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { {{range .versions}} case builtin{{.}}.VerifiedRegistryActorCodeID: @@ -53,6 +74,10 @@ func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Addres } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "verifiedregistry"); ok { + return c, nil + } + switch av { {{range .versions}} case actors.Version{{.}}: From cdd5420e0c93d60731de2238464bb8d628350256 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 14:25:03 +0300 Subject: [PATCH 006/228] agen --- chain/actors/builtin/account/account.go | 91 ++- chain/actors/builtin/account/v0.go | 4 +- chain/actors/builtin/account/v2.go | 4 +- chain/actors/builtin/account/v3.go | 4 +- chain/actors/builtin/account/v4.go | 4 +- chain/actors/builtin/account/v5.go | 4 +- chain/actors/builtin/account/v6.go | 4 +- chain/actors/builtin/account/v7.go | 4 +- chain/actors/builtin/account/v8.go | 4 +- chain/actors/builtin/builtin.go | 517 ++++++------ chain/actors/builtin/cron/cron.go | 10 +- chain/actors/builtin/cron/v0.go | 2 +- chain/actors/builtin/cron/v2.go | 2 +- chain/actors/builtin/cron/v3.go | 2 +- chain/actors/builtin/cron/v4.go | 2 +- chain/actors/builtin/cron/v5.go | 2 +- chain/actors/builtin/cron/v6.go | 2 +- chain/actors/builtin/cron/v7.go | 2 +- chain/actors/builtin/cron/v8.go | 2 +- chain/actors/builtin/init/init.go | 91 ++- chain/actors/builtin/init/v0.go | 18 +- chain/actors/builtin/init/v2.go | 18 +- chain/actors/builtin/init/v3.go | 18 +- chain/actors/builtin/init/v4.go | 18 +- chain/actors/builtin/init/v5.go | 18 +- chain/actors/builtin/init/v6.go | 18 +- chain/actors/builtin/init/v7.go | 18 +- chain/actors/builtin/init/v8.go | 18 +- chain/actors/builtin/market/market.go | 151 +++- chain/actors/builtin/market/v0.go | 32 +- chain/actors/builtin/market/v2.go | 32 +- chain/actors/builtin/market/v3.go | 24 +- chain/actors/builtin/market/v4.go | 24 +- chain/actors/builtin/market/v5.go | 24 +- chain/actors/builtin/market/v6.go | 22 +- chain/actors/builtin/market/v7.go | 22 +- chain/actors/builtin/market/v8.go | 22 +- chain/actors/builtin/miner/miner.go | 97 ++- chain/actors/builtin/miner/v0.go | 18 +- chain/actors/builtin/miner/v2.go | 64 +- chain/actors/builtin/miner/v3.go | 64 +- chain/actors/builtin/miner/v4.go | 64 +- chain/actors/builtin/miner/v5.go | 64 +- chain/actors/builtin/miner/v6.go | 64 +- chain/actors/builtin/miner/v7.go | 66 +- chain/actors/builtin/miner/v8.go | 66 +- chain/actors/builtin/multisig/message0.go | 3 + chain/actors/builtin/multisig/message2.go | 2 + chain/actors/builtin/multisig/message3.go | 2 + chain/actors/builtin/multisig/message4.go | 2 + chain/actors/builtin/multisig/message5.go | 2 + chain/actors/builtin/multisig/message6.go | 2 + chain/actors/builtin/multisig/message7.go | 2 + chain/actors/builtin/multisig/message8.go | 2 + chain/actors/builtin/multisig/multisig.go | 91 ++- chain/actors/builtin/multisig/v0.go | 15 +- chain/actors/builtin/multisig/v2.go | 15 +- chain/actors/builtin/multisig/v3.go | 15 +- chain/actors/builtin/multisig/v4.go | 15 +- chain/actors/builtin/multisig/v5.go | 15 +- chain/actors/builtin/multisig/v6.go | 15 +- chain/actors/builtin/multisig/v7.go | 15 +- chain/actors/builtin/multisig/v8.go | 15 +- chain/actors/builtin/paych/message0.go | 6 +- chain/actors/builtin/paych/message2.go | 6 +- chain/actors/builtin/paych/message3.go | 6 +- chain/actors/builtin/paych/message4.go | 6 +- chain/actors/builtin/paych/message5.go | 6 +- chain/actors/builtin/paych/message6.go | 6 +- chain/actors/builtin/paych/message7.go | 6 +- chain/actors/builtin/paych/message8.go | 6 +- chain/actors/builtin/paych/paych.go | 91 ++- chain/actors/builtin/paych/v0.go | 1 + chain/actors/builtin/paych/v2.go | 1 + chain/actors/builtin/paych/v3.go | 1 + chain/actors/builtin/paych/v4.go | 1 + chain/actors/builtin/paych/v5.go | 1 + chain/actors/builtin/paych/v6.go | 1 + chain/actors/builtin/paych/v7.go | 1 + chain/actors/builtin/paych/v8.go | 1 + chain/actors/builtin/power/power.go | 91 ++- chain/actors/builtin/power/v0.go | 22 +- chain/actors/builtin/power/v2.go | 22 +- chain/actors/builtin/power/v3.go | 14 +- chain/actors/builtin/power/v4.go | 14 +- chain/actors/builtin/power/v5.go | 14 +- chain/actors/builtin/power/v6.go | 14 +- chain/actors/builtin/power/v7.go | 14 +- chain/actors/builtin/power/v8.go | 14 +- chain/actors/builtin/reward/reward.go | 93 ++- chain/actors/builtin/reward/v2.go | 2 +- chain/actors/builtin/reward/v3.go | 2 +- chain/actors/builtin/reward/v4.go | 2 +- chain/actors/builtin/reward/v5.go | 2 +- chain/actors/builtin/reward/v6.go | 2 +- chain/actors/builtin/reward/v7.go | 2 +- chain/actors/builtin/reward/v8.go | 2 +- chain/actors/builtin/system/system.go | 12 +- chain/actors/builtin/system/v0.go | 2 +- chain/actors/builtin/system/v2.go | 2 +- chain/actors/builtin/system/v3.go | 2 +- chain/actors/builtin/system/v4.go | 2 +- chain/actors/builtin/system/v5.go | 2 +- chain/actors/builtin/system/v6.go | 2 +- chain/actors/builtin/system/v7.go | 2 +- chain/actors/builtin/system/v8.go | 2 +- chain/actors/builtin/verifreg/v0.go | 20 +- chain/actors/builtin/verifreg/v2.go | 20 +- chain/actors/builtin/verifreg/v3.go | 20 +- chain/actors/builtin/verifreg/v4.go | 20 +- chain/actors/builtin/verifreg/v5.go | 20 +- chain/actors/builtin/verifreg/v6.go | 20 +- chain/actors/builtin/verifreg/v7.go | 18 +- chain/actors/builtin/verifreg/v8.go | 18 +- chain/actors/builtin/verifreg/verifreg.go | 94 ++- chain/actors/policy/policy.go | 926 ++++++++++++---------- 116 files changed, 2389 insertions(+), 1337 deletions(-) diff --git a/chain/actors/builtin/account/account.go b/chain/actors/builtin/account/account.go index 9fb92d88d..d530ed6c5 100644 --- a/chain/actors/builtin/account/account.go +++ b/chain/actors/builtin/account/account.go @@ -27,6 +27,7 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + ) func init() { @@ -35,38 +36,122 @@ func init() { return load0(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version0, "account"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + } + builtin.RegisterActorState(builtin2.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version2, "account"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + } + builtin.RegisterActorState(builtin3.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version3, "account"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + } + builtin.RegisterActorState(builtin4.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version4, "account"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + } + builtin.RegisterActorState(builtin5.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version5, "account"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + } + builtin.RegisterActorState(builtin6.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version6, "account"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + } + builtin.RegisterActorState(builtin7.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version7, "account"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } + builtin.RegisterActorState(builtin8.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version8, "account"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } } var Methods = builtin4.MethodsAccount func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "account" { + return nil, xerrors.Errorf("actor code is not account: %s", name) + } + + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { case builtin0.AccountActorCodeID: @@ -124,11 +209,15 @@ func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, case actors.Version8: return make8(store, addr) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "account"); ok { + return c, nil + } + switch av { case actors.Version0: diff --git a/chain/actors/builtin/account/v0.go b/chain/actors/builtin/account/v0.go index bdfca2fd7..2e14abbe0 100644 --- a/chain/actors/builtin/account/v0.go +++ b/chain/actors/builtin/account/v0.go @@ -22,7 +22,7 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, addr address.Address) (State, error) { out := state0{store: store} - out.State = account0.State{Address: addr} + out.State = account0.State{Address:addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state0) PubkeyAddress() (address.Address, error) { func (s *state0) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/account/v2.go b/chain/actors/builtin/account/v2.go index 66618e06a..0f570587f 100644 --- a/chain/actors/builtin/account/v2.go +++ b/chain/actors/builtin/account/v2.go @@ -22,7 +22,7 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, addr address.Address) (State, error) { out := state2{store: store} - out.State = account2.State{Address: addr} + out.State = account2.State{Address:addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state2) PubkeyAddress() (address.Address, error) { func (s *state2) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/account/v3.go b/chain/actors/builtin/account/v3.go index dbe100a4f..7a293fb62 100644 --- a/chain/actors/builtin/account/v3.go +++ b/chain/actors/builtin/account/v3.go @@ -22,7 +22,7 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, addr address.Address) (State, error) { out := state3{store: store} - out.State = account3.State{Address: addr} + out.State = account3.State{Address:addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state3) PubkeyAddress() (address.Address, error) { func (s *state3) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/account/v4.go b/chain/actors/builtin/account/v4.go index 53f71dcc5..1c71eb536 100644 --- a/chain/actors/builtin/account/v4.go +++ b/chain/actors/builtin/account/v4.go @@ -22,7 +22,7 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, addr address.Address) (State, error) { out := state4{store: store} - out.State = account4.State{Address: addr} + out.State = account4.State{Address:addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state4) PubkeyAddress() (address.Address, error) { func (s *state4) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/account/v5.go b/chain/actors/builtin/account/v5.go index 538f56987..5ebdee61c 100644 --- a/chain/actors/builtin/account/v5.go +++ b/chain/actors/builtin/account/v5.go @@ -22,7 +22,7 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, addr address.Address) (State, error) { out := state5{store: store} - out.State = account5.State{Address: addr} + out.State = account5.State{Address:addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state5) PubkeyAddress() (address.Address, error) { func (s *state5) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/account/v6.go b/chain/actors/builtin/account/v6.go index a0d157ae5..895eeb9fe 100644 --- a/chain/actors/builtin/account/v6.go +++ b/chain/actors/builtin/account/v6.go @@ -22,7 +22,7 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, addr address.Address) (State, error) { out := state6{store: store} - out.State = account6.State{Address: addr} + out.State = account6.State{Address:addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state6) PubkeyAddress() (address.Address, error) { func (s *state6) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/account/v7.go b/chain/actors/builtin/account/v7.go index 883776cf8..e4e58b667 100644 --- a/chain/actors/builtin/account/v7.go +++ b/chain/actors/builtin/account/v7.go @@ -22,7 +22,7 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store, addr address.Address) (State, error) { out := state7{store: store} - out.State = account7.State{Address: addr} + out.State = account7.State{Address:addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state7) PubkeyAddress() (address.Address, error) { func (s *state7) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/account/v8.go b/chain/actors/builtin/account/v8.go index 5404b3262..4d2a24157 100644 --- a/chain/actors/builtin/account/v8.go +++ b/chain/actors/builtin/account/v8.go @@ -22,7 +22,7 @@ func load8(store adt.Store, root cid.Cid) (State, error) { func make8(store adt.Store, addr address.Address) (State, error) { out := state8{store: store} - out.State = account8.State{Address: addr} + out.State = account8.State{Address:addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state8) PubkeyAddress() (address.Address, error) { func (s *state8) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index 079918c50..467f63651 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -5,33 +5,36 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" - - builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - smoothing8 "github.com/filecoin-project/specs-actors/v8/actors/util/smoothing" + + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + smoothing8 "github.com/filecoin-project/specs-actors/v8/actors/util/smoothing" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" @@ -72,53 +75,55 @@ func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, return miner8.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } -func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { - return (FilterEstimate)(v0) //nolint:unconvert + func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v0) //nolint:unconvert + + } -} + func FromV2FilterEstimate(v2 smoothing2.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v2) + + } -func FromV2FilterEstimate(v2 smoothing2.FilterEstimate) FilterEstimate { + func FromV3FilterEstimate(v3 smoothing3.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v3) + + } - return (FilterEstimate)(v2) + func FromV4FilterEstimate(v4 smoothing4.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v4) + + } -} + func FromV5FilterEstimate(v5 smoothing5.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v5) + + } -func FromV3FilterEstimate(v3 smoothing3.FilterEstimate) FilterEstimate { + func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v6) + + } - return (FilterEstimate)(v3) + func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v7) + + } -} + func FromV8FilterEstimate(v8 smoothing8.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v8) + + } -func FromV4FilterEstimate(v4 smoothing4.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v4) - -} - -func FromV5FilterEstimate(v5 smoothing5.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v5) - -} - -func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v6) - -} - -func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v7) - -} - -func FromV8FilterEstimate(v8 smoothing8.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v8) - -} type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) @@ -137,219 +142,249 @@ func Load(store adt.Store, act *types.Actor) (cbor.Marshaler, error) { } func ActorNameByCode(c cid.Cid) string { + name, _, ok := actors.GetActorMetaByCode(c) + if ok { + return name + } + switch { - - case builtin0.IsBuiltinActor(c): - return builtin0.ActorNameByCode(c) - - case builtin2.IsBuiltinActor(c): - return builtin2.ActorNameByCode(c) - - case builtin3.IsBuiltinActor(c): - return builtin3.ActorNameByCode(c) - - case builtin4.IsBuiltinActor(c): - return builtin4.ActorNameByCode(c) - - case builtin5.IsBuiltinActor(c): - return builtin5.ActorNameByCode(c) - - case builtin6.IsBuiltinActor(c): - return builtin6.ActorNameByCode(c) - - case builtin7.IsBuiltinActor(c): - return builtin7.ActorNameByCode(c) - - case builtin8.IsBuiltinActor(c): - return builtin8.ActorNameByCode(c) - + + case builtin0.IsBuiltinActor(c): + return builtin0.ActorNameByCode(c) + + case builtin2.IsBuiltinActor(c): + return builtin2.ActorNameByCode(c) + + case builtin3.IsBuiltinActor(c): + return builtin3.ActorNameByCode(c) + + case builtin4.IsBuiltinActor(c): + return builtin4.ActorNameByCode(c) + + case builtin5.IsBuiltinActor(c): + return builtin5.ActorNameByCode(c) + + case builtin6.IsBuiltinActor(c): + return builtin6.ActorNameByCode(c) + + case builtin7.IsBuiltinActor(c): + return builtin7.ActorNameByCode(c) + + case builtin8.IsBuiltinActor(c): + return builtin8.ActorNameByCode(c) + default: return "" } } func IsBuiltinActor(c cid.Cid) bool { - - if builtin0.IsBuiltinActor(c) { - return true - } - - if builtin2.IsBuiltinActor(c) { - return true - } - - if builtin3.IsBuiltinActor(c) { - return true - } - - if builtin4.IsBuiltinActor(c) { - return true - } - - if builtin5.IsBuiltinActor(c) { - return true - } - - if builtin6.IsBuiltinActor(c) { - return true - } - - if builtin7.IsBuiltinActor(c) { - return true - } - - if builtin8.IsBuiltinActor(c) { - return true + _, _, ok := actors.GetActorMetaByCode(c) + if ok { + return true } + + if builtin0.IsBuiltinActor(c) { + return true + } + + if builtin2.IsBuiltinActor(c) { + return true + } + + if builtin3.IsBuiltinActor(c) { + return true + } + + if builtin4.IsBuiltinActor(c) { + return true + } + + if builtin5.IsBuiltinActor(c) { + return true + } + + if builtin6.IsBuiltinActor(c) { + return true + } + + if builtin7.IsBuiltinActor(c) { + return true + } + + if builtin8.IsBuiltinActor(c) { + return true + } + return false } func IsAccountActor(c cid.Cid) bool { - - if c == builtin0.AccountActorCodeID { - return true - } - - if c == builtin2.AccountActorCodeID { - return true - } - - if c == builtin3.AccountActorCodeID { - return true - } - - if c == builtin4.AccountActorCodeID { - return true - } - - if c == builtin5.AccountActorCodeID { - return true - } - - if c == builtin6.AccountActorCodeID { - return true - } - - if c == builtin7.AccountActorCodeID { - return true - } - - if c == builtin8.AccountActorCodeID { - return true + name, _, ok := actors.GetActorMetaByCode(c) + if ok { + return name == "account" } + + if c == builtin0.AccountActorCodeID { + return true + } + + if c == builtin2.AccountActorCodeID { + return true + } + + if c == builtin3.AccountActorCodeID { + return true + } + + if c == builtin4.AccountActorCodeID { + return true + } + + if c == builtin5.AccountActorCodeID { + return true + } + + if c == builtin6.AccountActorCodeID { + return true + } + + if c == builtin7.AccountActorCodeID { + return true + } + + if c == builtin8.AccountActorCodeID { + return true + } + return false } func IsStorageMinerActor(c cid.Cid) bool { - - if c == builtin0.StorageMinerActorCodeID { - return true - } - - if c == builtin2.StorageMinerActorCodeID { - return true - } - - if c == builtin3.StorageMinerActorCodeID { - return true - } - - if c == builtin4.StorageMinerActorCodeID { - return true - } - - if c == builtin5.StorageMinerActorCodeID { - return true - } - - if c == builtin6.StorageMinerActorCodeID { - return true - } - - if c == builtin7.StorageMinerActorCodeID { - return true - } - - if c == builtin8.StorageMinerActorCodeID { - return true + name, _, ok := actors.GetActorMetaByCode(c) + if ok { + return name == "storageminer" } + + if c == builtin0.StorageMinerActorCodeID { + return true + } + + if c == builtin2.StorageMinerActorCodeID { + return true + } + + if c == builtin3.StorageMinerActorCodeID { + return true + } + + if c == builtin4.StorageMinerActorCodeID { + return true + } + + if c == builtin5.StorageMinerActorCodeID { + return true + } + + if c == builtin6.StorageMinerActorCodeID { + return true + } + + if c == builtin7.StorageMinerActorCodeID { + return true + } + + if c == builtin8.StorageMinerActorCodeID { + return true + } + return false } func IsMultisigActor(c cid.Cid) bool { - - if c == builtin0.MultisigActorCodeID { - return true - } - - if c == builtin2.MultisigActorCodeID { - return true - } - - if c == builtin3.MultisigActorCodeID { - return true - } - - if c == builtin4.MultisigActorCodeID { - return true - } - - if c == builtin5.MultisigActorCodeID { - return true - } - - if c == builtin6.MultisigActorCodeID { - return true - } - - if c == builtin7.MultisigActorCodeID { - return true - } - - if c == builtin8.MultisigActorCodeID { - return true + name, _, ok := actors.GetActorMetaByCode(c) + if ok { + return name == "multisig" } + + if c == builtin0.MultisigActorCodeID { + return true + } + + if c == builtin2.MultisigActorCodeID { + return true + } + + if c == builtin3.MultisigActorCodeID { + return true + } + + if c == builtin4.MultisigActorCodeID { + return true + } + + if c == builtin5.MultisigActorCodeID { + return true + } + + if c == builtin6.MultisigActorCodeID { + return true + } + + if c == builtin7.MultisigActorCodeID { + return true + } + + if c == builtin8.MultisigActorCodeID { + return true + } + return false } func IsPaymentChannelActor(c cid.Cid) bool { - - if c == builtin0.PaymentChannelActorCodeID { - return true - } - - if c == builtin2.PaymentChannelActorCodeID { - return true - } - - if c == builtin3.PaymentChannelActorCodeID { - return true - } - - if c == builtin4.PaymentChannelActorCodeID { - return true - } - - if c == builtin5.PaymentChannelActorCodeID { - return true - } - - if c == builtin6.PaymentChannelActorCodeID { - return true - } - - if c == builtin7.PaymentChannelActorCodeID { - return true - } - - if c == builtin8.PaymentChannelActorCodeID { - return true + name, _, ok := actors.GetActorMetaByCode(c) + if ok { + return name == "paymentchannel" } + + if c == builtin0.PaymentChannelActorCodeID { + return true + } + + if c == builtin2.PaymentChannelActorCodeID { + return true + } + + if c == builtin3.PaymentChannelActorCodeID { + return true + } + + if c == builtin4.PaymentChannelActorCodeID { + return true + } + + if c == builtin5.PaymentChannelActorCodeID { + return true + } + + if c == builtin6.PaymentChannelActorCodeID { + return true + } + + if c == builtin7.PaymentChannelActorCodeID { + return true + } + + if c == builtin8.PaymentChannelActorCodeID { + return true + } + return false } diff --git a/chain/actors/builtin/cron/cron.go b/chain/actors/builtin/cron/cron.go index e0a08408b..c4d194176 100644 --- a/chain/actors/builtin/cron/cron.go +++ b/chain/actors/builtin/cron/cron.go @@ -3,8 +3,8 @@ package cron import ( "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/ipfs/go-cid" "golang.org/x/xerrors" + "github.com/ipfs/go-cid" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -21,6 +21,7 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + ) func MakeState(store adt.Store, av actors.Version) (State, error) { @@ -50,11 +51,15 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "cron"); ok { + return c, nil + } + switch av { case actors.Version0: @@ -91,6 +96,7 @@ var ( Methods = builtin8.MethodsCron ) + type State interface { GetState() interface{} } diff --git a/chain/actors/builtin/cron/v0.go b/chain/actors/builtin/cron/v0.go index 6147b858c..7b6b26e05 100644 --- a/chain/actors/builtin/cron/v0.go +++ b/chain/actors/builtin/cron/v0.go @@ -32,4 +32,4 @@ type state0 struct { func (s *state0) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/cron/v2.go b/chain/actors/builtin/cron/v2.go index 51ca179d9..032435b96 100644 --- a/chain/actors/builtin/cron/v2.go +++ b/chain/actors/builtin/cron/v2.go @@ -32,4 +32,4 @@ type state2 struct { func (s *state2) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/cron/v3.go b/chain/actors/builtin/cron/v3.go index ff74d511d..62c670b68 100644 --- a/chain/actors/builtin/cron/v3.go +++ b/chain/actors/builtin/cron/v3.go @@ -32,4 +32,4 @@ type state3 struct { func (s *state3) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/cron/v4.go b/chain/actors/builtin/cron/v4.go index 1cff8cc28..b13ea78ac 100644 --- a/chain/actors/builtin/cron/v4.go +++ b/chain/actors/builtin/cron/v4.go @@ -32,4 +32,4 @@ type state4 struct { func (s *state4) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/cron/v5.go b/chain/actors/builtin/cron/v5.go index 2bb00dc21..a60269d83 100644 --- a/chain/actors/builtin/cron/v5.go +++ b/chain/actors/builtin/cron/v5.go @@ -32,4 +32,4 @@ type state5 struct { func (s *state5) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/cron/v6.go b/chain/actors/builtin/cron/v6.go index 8bbadd79f..be9ee00c9 100644 --- a/chain/actors/builtin/cron/v6.go +++ b/chain/actors/builtin/cron/v6.go @@ -32,4 +32,4 @@ type state6 struct { func (s *state6) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/cron/v7.go b/chain/actors/builtin/cron/v7.go index e5538c89f..67a46f3ff 100644 --- a/chain/actors/builtin/cron/v7.go +++ b/chain/actors/builtin/cron/v7.go @@ -32,4 +32,4 @@ type state7 struct { func (s *state7) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/cron/v8.go b/chain/actors/builtin/cron/v8.go index 97c0aa980..2eec8b47a 100644 --- a/chain/actors/builtin/cron/v8.go +++ b/chain/actors/builtin/cron/v8.go @@ -32,4 +32,4 @@ type state8 struct { func (s *state8) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/init/init.go b/chain/actors/builtin/init/init.go index cdae9b503..3174b3675 100644 --- a/chain/actors/builtin/init/init.go +++ b/chain/actors/builtin/init/init.go @@ -29,6 +29,7 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + ) func init() { @@ -37,33 +38,81 @@ func init() { return load0(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version0, "init"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + } + builtin.RegisterActorState(builtin2.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version2, "init"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + } + builtin.RegisterActorState(builtin3.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version3, "init"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + } + builtin.RegisterActorState(builtin4.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version4, "init"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + } + builtin.RegisterActorState(builtin5.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version5, "init"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + } + builtin.RegisterActorState(builtin6.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version6, "init"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + } + builtin.RegisterActorState(builtin7.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version7, "init"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } + builtin.RegisterActorState(builtin8.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version8, "init"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } } var ( @@ -72,6 +121,42 @@ var ( ) func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "init" { + return nil, xerrors.Errorf("actor code is not init: %s", name) + } + + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { case builtin0.InitActorCodeID: @@ -129,11 +214,15 @@ func MakeState(store adt.Store, av actors.Version, networkName string) (State, e case actors.Version8: return make8(store, networkName) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "init"); ok { + return c, nil + } + switch av { case actors.Version0: diff --git a/chain/actors/builtin/init/v0.go b/chain/actors/builtin/init/v0.go index ddd2dab94..a5edff01a 100644 --- a/chain/actors/builtin/init/v0.go +++ b/chain/actors/builtin/init/v0.go @@ -10,6 +10,8 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + + init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) @@ -27,14 +29,14 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, networkName string) (State, error) { out := state0{store: store} + + mr, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - mr, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *init0.ConstructState(mr, networkName) - + out.State = *init0.ConstructState(mr, networkName) + return &out, nil } @@ -109,4 +111,4 @@ func (s *state0) AddressMap() (adt.Map, error) { func (s *state0) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/init/v2.go b/chain/actors/builtin/init/v2.go index 72e2d56a5..5bbd778f9 100644 --- a/chain/actors/builtin/init/v2.go +++ b/chain/actors/builtin/init/v2.go @@ -10,6 +10,8 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + + init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) @@ -27,14 +29,14 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, networkName string) (State, error) { out := state2{store: store} + + mr, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - mr, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *init2.ConstructState(mr, networkName) - + out.State = *init2.ConstructState(mr, networkName) + return &out, nil } @@ -109,4 +111,4 @@ func (s *state2) AddressMap() (adt.Map, error) { func (s *state2) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/init/v3.go b/chain/actors/builtin/init/v3.go index 4609c94a3..c1141ba88 100644 --- a/chain/actors/builtin/init/v3.go +++ b/chain/actors/builtin/init/v3.go @@ -10,8 +10,10 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" ) @@ -29,14 +31,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, networkName string) (State, error) { out := state3{store: store} + + s, err := init3.ConstructState(store, networkName) + if err != nil { + return nil, err + } - s, err := init3.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -111,4 +113,4 @@ func (s *state3) AddressMap() (adt.Map, error) { func (s *state3) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/init/v4.go b/chain/actors/builtin/init/v4.go index dc56d1f19..17bf03830 100644 --- a/chain/actors/builtin/init/v4.go +++ b/chain/actors/builtin/init/v4.go @@ -10,8 +10,10 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" ) @@ -29,14 +31,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, networkName string) (State, error) { out := state4{store: store} + + s, err := init4.ConstructState(store, networkName) + if err != nil { + return nil, err + } - s, err := init4.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -111,4 +113,4 @@ func (s *state4) AddressMap() (adt.Map, error) { func (s *state4) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/init/v5.go b/chain/actors/builtin/init/v5.go index 107366de5..3d61513c5 100644 --- a/chain/actors/builtin/init/v5.go +++ b/chain/actors/builtin/init/v5.go @@ -10,8 +10,10 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" ) @@ -29,14 +31,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, networkName string) (State, error) { out := state5{store: store} + + s, err := init5.ConstructState(store, networkName) + if err != nil { + return nil, err + } - s, err := init5.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -111,4 +113,4 @@ func (s *state5) AddressMap() (adt.Map, error) { func (s *state5) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/init/v6.go b/chain/actors/builtin/init/v6.go index a5bd9edfb..a91c8fda0 100644 --- a/chain/actors/builtin/init/v6.go +++ b/chain/actors/builtin/init/v6.go @@ -10,8 +10,10 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) @@ -29,14 +31,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, networkName string) (State, error) { out := state6{store: store} + + s, err := init6.ConstructState(store, networkName) + if err != nil { + return nil, err + } - s, err := init6.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -111,4 +113,4 @@ func (s *state6) AddressMap() (adt.Map, error) { func (s *state6) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/init/v7.go b/chain/actors/builtin/init/v7.go index 341aa52cd..4cba8f695 100644 --- a/chain/actors/builtin/init/v7.go +++ b/chain/actors/builtin/init/v7.go @@ -10,8 +10,10 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" ) @@ -29,14 +31,14 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store, networkName string) (State, error) { out := state7{store: store} + + s, err := init7.ConstructState(store, networkName) + if err != nil { + return nil, err + } - s, err := init7.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -111,4 +113,4 @@ func (s *state7) AddressMap() (adt.Map, error) { func (s *state7) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/init/v8.go b/chain/actors/builtin/init/v8.go index 1fc2859a0..493aae4cf 100644 --- a/chain/actors/builtin/init/v8.go +++ b/chain/actors/builtin/init/v8.go @@ -10,8 +10,10 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + init8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/init" adt8 "github.com/filecoin-project/specs-actors/v8/actors/util/adt" ) @@ -29,14 +31,14 @@ func load8(store adt.Store, root cid.Cid) (State, error) { func make8(store adt.Store, networkName string) (State, error) { out := state8{store: store} + + s, err := init8.ConstructState(store, networkName) + if err != nil { + return nil, err + } - s, err := init8.ConstructState(store, networkName) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -111,4 +113,4 @@ func (s *state8) AddressMap() (adt.Map, error) { func (s *state8) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index 00524f0cb..d17cd6290 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -29,8 +29,9 @@ import ( builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" ) @@ -41,33 +42,81 @@ func init() { return load0(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version0, "storagemarket"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + } + builtin.RegisterActorState(builtin2.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version2, "storagemarket"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + } + builtin.RegisterActorState(builtin3.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version3, "storagemarket"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + } + builtin.RegisterActorState(builtin4.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version4, "storagemarket"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + } + builtin.RegisterActorState(builtin5.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version5, "storagemarket"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + } + builtin.RegisterActorState(builtin6.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version6, "storagemarket"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + } + builtin.RegisterActorState(builtin7.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version7, "storagemarket"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } + builtin.RegisterActorState(builtin8.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version8, "storagemarket"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } } var ( @@ -76,6 +125,42 @@ var ( ) func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "storagemarket" { + return nil, xerrors.Errorf("actor code is not storagemarket: %s", name) + } + + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { case builtin0.StorageMarketActorCodeID: @@ -133,11 +218,15 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "storagemarket"); ok { + return c, nil + } + switch av { case actors.Version0: @@ -210,7 +299,7 @@ type DealProposals interface { type PublishStorageDealsParams = market0.PublishStorageDealsParams type PublishStorageDealsReturn interface { - DealIDs() ([]abi.DealID, error) + DealIDs() ([]abi.DealID, error) // Note that this index is based on the batch of deals that were published, NOT the DealID IsDealValid(index uint64) (bool, error) } @@ -247,7 +336,7 @@ func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStora case actors.Version8: return decodePublishStorageDealsReturn8(b) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -263,67 +352,67 @@ type DealState struct { } type DealProposal struct { - PieceCID cid.Cid - PieceSize abi.PaddedPieceSize - VerifiedDeal bool - Client address.Address - Provider address.Address - Label string - StartEpoch abi.ChainEpoch - EndEpoch abi.ChainEpoch + PieceCID cid.Cid + PieceSize abi.PaddedPieceSize + VerifiedDeal bool + Client address.Address + Provider address.Address + Label string + StartEpoch abi.ChainEpoch + EndEpoch abi.ChainEpoch StoragePricePerEpoch abi.TokenAmount - ProviderCollateral abi.TokenAmount - ClientCollateral abi.TokenAmount + ProviderCollateral abi.TokenAmount + ClientCollateral abi.TokenAmount } type DealStateChanges struct { - Added []DealIDState + Added []DealIDState Modified []DealStateChange - Removed []DealIDState + Removed []DealIDState } type DealIDState struct { - ID abi.DealID + ID abi.DealID Deal DealState } // DealStateChange is a change in deal state from -> to type DealStateChange struct { - ID abi.DealID + ID abi.DealID From *DealState - To *DealState + To *DealState } type DealProposalChanges struct { - Added []ProposalIDState + Added []ProposalIDState Removed []ProposalIDState } type ProposalIDState struct { - ID abi.DealID + ID abi.DealID Proposal DealProposal } func EmptyDealState() *DealState { return &DealState{ SectorStartEpoch: -1, - SlashEpoch: -1, + SlashEpoch: -1, LastUpdatedEpoch: -1, } } // returns the earned fees and pending fees for a given deal func (deal DealProposal) GetDealFees(height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { - tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) + tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) - ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) - if ef.LessThan(big.Zero()) { - ef = big.Zero() - } + ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) + if ef.LessThan(big.Zero()) { + ef = big.Zero() + } - if ef.GreaterThan(tf) { - ef = tf - } + if ef.GreaterThan(tf) { + ef = tf + } - return ef, big.Sub(tf, ef) + return ef, big.Sub(tf, ef) } diff --git a/chain/actors/builtin/market/v0.go b/chain/actors/builtin/market/v0.go index f5a60b229..e883f9b8f 100644 --- a/chain/actors/builtin/market/v0.go +++ b/chain/actors/builtin/market/v0.go @@ -29,19 +29,19 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store) (State, error) { out := state0{store: store} + + ea, err := adt0.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } - ea, err := adt0.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *market0.ConstructState(ea, em, em) + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + out.State = *market0.ConstructState(ea, em, em) + return &out, nil } @@ -247,12 +247,12 @@ type publishStorageDealsReturn0 struct { } func (r *publishStorageDealsReturn0) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn0) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v2.go b/chain/actors/builtin/market/v2.go index 3c6914d0c..731f48d50 100644 --- a/chain/actors/builtin/market/v2.go +++ b/chain/actors/builtin/market/v2.go @@ -29,19 +29,19 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store) (State, error) { out := state2{store: store} + + ea, err := adt2.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } - ea, err := adt2.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *market2.ConstructState(ea, em, em) + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + out.State = *market2.ConstructState(ea, em, em) + return &out, nil } @@ -247,12 +247,12 @@ type publishStorageDealsReturn2 struct { } func (r *publishStorageDealsReturn2) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn2) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v3.go b/chain/actors/builtin/market/v3.go index 2409bb05b..c47b0ff52 100644 --- a/chain/actors/builtin/market/v3.go +++ b/chain/actors/builtin/market/v3.go @@ -29,14 +29,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store) (State, error) { out := state3{store: store} + + s, err := market3.ConstructState(store) + if err != nil { + return nil, err + } - s, err := market3.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -242,12 +242,12 @@ type publishStorageDealsReturn3 struct { } func (r *publishStorageDealsReturn3) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn3) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v4.go b/chain/actors/builtin/market/v4.go index 4e9011d10..4904e74a9 100644 --- a/chain/actors/builtin/market/v4.go +++ b/chain/actors/builtin/market/v4.go @@ -29,14 +29,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store) (State, error) { out := state4{store: store} + + s, err := market4.ConstructState(store) + if err != nil { + return nil, err + } - s, err := market4.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -242,12 +242,12 @@ type publishStorageDealsReturn4 struct { } func (r *publishStorageDealsReturn4) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn4) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v5.go b/chain/actors/builtin/market/v5.go index 139a32247..b1199c188 100644 --- a/chain/actors/builtin/market/v5.go +++ b/chain/actors/builtin/market/v5.go @@ -29,14 +29,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store) (State, error) { out := state5{store: store} + + s, err := market5.ConstructState(store) + if err != nil { + return nil, err + } - s, err := market5.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -242,12 +242,12 @@ type publishStorageDealsReturn5 struct { } func (r *publishStorageDealsReturn5) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn5) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v6.go b/chain/actors/builtin/market/v6.go index 8230f3cf1..b50b8cb4d 100644 --- a/chain/actors/builtin/market/v6.go +++ b/chain/actors/builtin/market/v6.go @@ -29,14 +29,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store) (State, error) { out := state6{store: store} + + s, err := market6.ConstructState(store) + if err != nil { + return nil, err + } - s, err := market6.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -242,11 +242,11 @@ type publishStorageDealsReturn6 struct { } func (r *publishStorageDealsReturn6) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - + + return r.ValidDeals.IsSet(index) + } func (r *publishStorageDealsReturn6) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go index 553913146..057e8df7f 100644 --- a/chain/actors/builtin/market/v7.go +++ b/chain/actors/builtin/market/v7.go @@ -29,14 +29,14 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store) (State, error) { out := state7{store: store} + + s, err := market7.ConstructState(store) + if err != nil { + return nil, err + } - s, err := market7.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -242,11 +242,11 @@ type publishStorageDealsReturn7 struct { } func (r *publishStorageDealsReturn7) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - + + return r.ValidDeals.IsSet(index) + } func (r *publishStorageDealsReturn7) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v8.go b/chain/actors/builtin/market/v8.go index d2e6f9189..284536dbd 100644 --- a/chain/actors/builtin/market/v8.go +++ b/chain/actors/builtin/market/v8.go @@ -29,14 +29,14 @@ func load8(store adt.Store, root cid.Cid) (State, error) { func make8(store adt.Store) (State, error) { out := state8{store: store} + + s, err := market8.ConstructState(store) + if err != nil { + return nil, err + } - s, err := market8.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -242,11 +242,11 @@ type publishStorageDealsReturn8 struct { } func (r *publishStorageDealsReturn8) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - + + return r.ValidDeals.IsSet(index) + } func (r *publishStorageDealsReturn8) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index 1e0c46183..a3e367aeb 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -40,6 +40,7 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + ) func init() { @@ -48,34 +49,82 @@ func init() { return load0(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version0, "storageminer"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + } + builtin.RegisterActorState(builtin2.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version2, "storageminer"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + } + builtin.RegisterActorState(builtin3.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version3, "storageminer"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + } + builtin.RegisterActorState(builtin4.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version4, "storageminer"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + } + builtin.RegisterActorState(builtin5.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version5, "storageminer"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + } + builtin.RegisterActorState(builtin6.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version6, "storageminer"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + } + builtin.RegisterActorState(builtin7.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version7, "storageminer"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } + builtin.RegisterActorState(builtin8.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version8, "storageminer"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } + } var Methods = builtin8.MethodsMiner @@ -95,6 +144,42 @@ var DeclarationsMax = miner2.DeclarationsMax var AddressedSectorsMax = miner2.AddressedSectorsMax func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "storageminer" { + return nil, xerrors.Errorf("actor code is not storageminer: %s", name) + } + + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { case builtin0.StorageMinerActorCodeID: @@ -121,7 +206,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin8.StorageMinerActorCodeID: return load8(store, act.Head) - } +} return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -152,11 +237,15 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "storageminer"); ok { + return c, nil + } + switch av { case actors.Version0: @@ -207,8 +296,8 @@ type State interface { LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error) NumLiveSectors() (uint64, error) IsAllocated(abi.SectorNumber) (bool, error) - // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than - // count if there aren't enough). + // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than + // count if there aren't enough). UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) GetAllocatedSectors() (*bitfield.BitField, error) diff --git a/chain/actors/builtin/miner/v0.go b/chain/actors/builtin/miner/v0.go index 8bde8bf73..9f59188f6 100644 --- a/chain/actors/builtin/miner/v0.go +++ b/chain/actors/builtin/miner/v0.go @@ -18,6 +18,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) @@ -135,10 +136,10 @@ func (s *state0) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -209,7 +210,7 @@ func (s *state0) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state0) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors) +precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors) if err != nil { return err } @@ -288,7 +289,7 @@ func (s *state0) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -443,10 +444,10 @@ func (s *state0) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state0) EraseAllUnproven() error { - - // field doesn't exist until v2 - return nil - + + // field doesn't exist until v2 + return nil + } func (d *deadline0) LoadPartition(idx uint64) (Partition, error) { @@ -518,6 +519,7 @@ func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v0.InitialPledge, ExpectedDayReward: v0.ExpectedDayReward, ExpectedStoragePledge: v0.ExpectedStoragePledge, + } return info } diff --git a/chain/actors/builtin/miner/v2.go b/chain/actors/builtin/miner/v2.go index bbfdd403e..d04db9cd6 100644 --- a/chain/actors/builtin/miner/v2.go +++ b/chain/actors/builtin/miner/v2.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) @@ -133,10 +134,10 @@ func (s *state2) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -207,7 +208,7 @@ func (s *state2) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state2) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors) +precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors) if err != nil { return err } @@ -286,7 +287,7 @@ func (s *state2) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -441,42 +442,42 @@ func (s *state2) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state2) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner2.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner2.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil + err = dls.ForEach(s.store, func(dindx uint64, dl *miner2.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner2.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) }) - if err != nil { return err } - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline2) LoadPartition(idx uint64) (Partition, error) { @@ -548,6 +549,7 @@ func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v2.InitialPledge, ExpectedDayReward: v2.ExpectedDayReward, ExpectedStoragePledge: v2.ExpectedStoragePledge, + } return info } diff --git a/chain/actors/builtin/miner/v3.go b/chain/actors/builtin/miner/v3.go index 68505918a..7b4ec4e24 100644 --- a/chain/actors/builtin/miner/v3.go +++ b/chain/actors/builtin/miner/v3.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" @@ -135,10 +136,10 @@ func (s *state3) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -209,7 +210,7 @@ func (s *state3) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state3) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth) +precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth) if err != nil { return err } @@ -288,7 +289,7 @@ func (s *state3) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -438,42 +439,42 @@ func (s *state3) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state3) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner3.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner3.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil + err = dls.ForEach(s.store, func(dindx uint64, dl *miner3.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner3.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) }) - if err != nil { return err } - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline3) LoadPartition(idx uint64) (Partition, error) { @@ -549,6 +550,7 @@ func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v3.InitialPledge, ExpectedDayReward: v3.ExpectedDayReward, ExpectedStoragePledge: v3.ExpectedStoragePledge, + } return info } diff --git a/chain/actors/builtin/miner/v4.go b/chain/actors/builtin/miner/v4.go index 5c40d4189..f4042bdea 100644 --- a/chain/actors/builtin/miner/v4.go +++ b/chain/actors/builtin/miner/v4.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" @@ -135,10 +136,10 @@ func (s *state4) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -209,7 +210,7 @@ func (s *state4) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state4) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth) +precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth) if err != nil { return err } @@ -288,7 +289,7 @@ func (s *state4) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -438,42 +439,42 @@ func (s *state4) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state4) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner4.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner4.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil + err = dls.ForEach(s.store, func(dindx uint64, dl *miner4.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner4.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) }) - if err != nil { return err } - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline4) LoadPartition(idx uint64) (Partition, error) { @@ -549,6 +550,7 @@ func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v4.InitialPledge, ExpectedDayReward: v4.ExpectedDayReward, ExpectedStoragePledge: v4.ExpectedStoragePledge, + } return info } diff --git a/chain/actors/builtin/miner/v5.go b/chain/actors/builtin/miner/v5.go index f717934f4..847bf2419 100644 --- a/chain/actors/builtin/miner/v5.go +++ b/chain/actors/builtin/miner/v5.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" @@ -135,10 +136,10 @@ func (s *state5) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries +// 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -209,7 +210,7 @@ func (s *state5) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state5) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth) +precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth) if err != nil { return err } @@ -288,7 +289,7 @@ func (s *state5) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -438,42 +439,42 @@ func (s *state5) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state5) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner5.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner5.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil + err = dls.ForEach(s.store, func(dindx uint64, dl *miner5.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner5.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) }) - if err != nil { return err } - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline5) LoadPartition(idx uint64) (Partition, error) { @@ -549,6 +550,7 @@ func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v5.InitialPledge, ExpectedDayReward: v5.ExpectedDayReward, ExpectedStoragePledge: v5.ExpectedStoragePledge, + } return info } diff --git a/chain/actors/builtin/miner/v6.go b/chain/actors/builtin/miner/v6.go index 7a9dfb0df..6af030cf7 100644 --- a/chain/actors/builtin/miner/v6.go +++ b/chain/actors/builtin/miner/v6.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" @@ -135,10 +136,10 @@ func (s *state6) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +// 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 42 entries +// 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. stopErr := errors.New("stop") @@ -209,7 +210,7 @@ func (s *state6) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state6) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth) +precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth) if err != nil { return err } @@ -288,7 +289,7 @@ func (s *state6) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -438,42 +439,42 @@ func (s *state6) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state6) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner6.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner6.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil + err = dls.ForEach(s.store, func(dindx uint64, dl *miner6.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner6.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) }) - if err != nil { return err } - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline6) LoadPartition(idx uint64) (Partition, error) { @@ -549,6 +550,7 @@ func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v6.InitialPledge, ExpectedDayReward: v6.ExpectedDayReward, ExpectedStoragePledge: v6.ExpectedStoragePledge, + } return info } diff --git a/chain/actors/builtin/miner/v7.go b/chain/actors/builtin/miner/v7.go index e1b2520e4..0e56f215e 100644 --- a/chain/actors/builtin/miner/v7.go +++ b/chain/actors/builtin/miner/v7.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" @@ -135,9 +136,9 @@ func (s *state7) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will expire on-time (can be +// 1. If the sector is non-faulty, it will expire on-time (can be // learned from the sector info). - // 2. If it's faulty, it will expire early within the first 42 entries +// 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. stopErr := errors.New("stop") @@ -208,7 +209,7 @@ func (s *state7) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state7) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) +precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) if err != nil { return err } @@ -287,7 +288,7 @@ func (s *state7) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -437,42 +438,42 @@ func (s *state7) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state7) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner7.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil + err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner7.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) }) - if err != nil { return err } - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline7) LoadPartition(idx uint64) (Partition, error) { @@ -548,8 +549,9 @@ func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v7.InitialPledge, ExpectedDayReward: v7.ExpectedDayReward, ExpectedStoragePledge: v7.ExpectedStoragePledge, - + SectorKeyCID: v7.SectorKeyCID, + } return info } diff --git a/chain/actors/builtin/miner/v8.go b/chain/actors/builtin/miner/v8.go index 82b8d0e20..3752af257 100644 --- a/chain/actors/builtin/miner/v8.go +++ b/chain/actors/builtin/miner/v8.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" miner8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/miner" @@ -135,9 +136,9 @@ func (s *state8) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will expire on-time (can be +// 1. If the sector is non-faulty, it will expire on-time (can be // learned from the sector info). - // 2. If it's faulty, it will expire early within the first 42 entries +// 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. stopErr := errors.New("stop") @@ -208,7 +209,7 @@ func (s *state8) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state8) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { - precommitted, err := adt8.AsMap(s.store, s.State.PreCommittedSectors, builtin8.DefaultHamtBitwidth) +precommitted, err := adt8.AsMap(s.store, s.State.PreCommittedSectors, builtin8.DefaultHamtBitwidth) if err != nil { return err } @@ -287,7 +288,7 @@ func (s *state8) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, allocatedRuns, ) if err != nil { @@ -437,42 +438,42 @@ func (s *state8) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state8) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) - if err != nil { - return err - } - - err = dls.ForEach(s.store, func(dindx uint64, dl *miner8.Deadline) error { - ps, err := dl.PartitionsArray(s.store) + + dls, err := s.State.LoadDeadlines(s.store) if err != nil { return err } - var part miner8.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil + err = dls.ForEach(s.store, func(dindx uint64, dl *miner8.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner8.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) }) - if err != nil { return err } - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) - }) - if err != nil { - return err - } - - return s.State.SaveDeadlines(s.store, dls) - + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline8) LoadPartition(idx uint64) (Partition, error) { @@ -548,8 +549,9 @@ func fromV8SectorOnChainInfo(v8 miner8.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v8.InitialPledge, ExpectedDayReward: v8.ExpectedDayReward, ExpectedStoragePledge: v8.ExpectedStoragePledge, - + SectorKeyCID: v8.SectorKeyCID, + } return info } diff --git a/chain/actors/builtin/multisig/message0.go b/chain/actors/builtin/multisig/message0.go index dc43a9d5d..2849d4bb9 100644 --- a/chain/actors/builtin/multisig/message0.go +++ b/chain/actors/builtin/multisig/message0.go @@ -73,6 +73,8 @@ func (m message0) Create( }, nil } + + func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, method abi.MethodNum, params []byte) (*types.Message, error) { @@ -140,3 +142,4 @@ func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHa Params: enc, }, nil } + diff --git a/chain/actors/builtin/multisig/message2.go b/chain/actors/builtin/multisig/message2.go index da2700d06..8715fa6c0 100644 --- a/chain/actors/builtin/multisig/message2.go +++ b/chain/actors/builtin/multisig/message2.go @@ -69,3 +69,5 @@ func (m message2) Create( Value: initialAmount, }, nil } + + diff --git a/chain/actors/builtin/multisig/message3.go b/chain/actors/builtin/multisig/message3.go index f5f6d8cdf..b58591a96 100644 --- a/chain/actors/builtin/multisig/message3.go +++ b/chain/actors/builtin/multisig/message3.go @@ -69,3 +69,5 @@ func (m message3) Create( Value: initialAmount, }, nil } + + diff --git a/chain/actors/builtin/multisig/message4.go b/chain/actors/builtin/multisig/message4.go index 90885aa07..601657985 100644 --- a/chain/actors/builtin/multisig/message4.go +++ b/chain/actors/builtin/multisig/message4.go @@ -69,3 +69,5 @@ func (m message4) Create( Value: initialAmount, }, nil } + + diff --git a/chain/actors/builtin/multisig/message5.go b/chain/actors/builtin/multisig/message5.go index 9a8110f2c..ec74f4c5a 100644 --- a/chain/actors/builtin/multisig/message5.go +++ b/chain/actors/builtin/multisig/message5.go @@ -69,3 +69,5 @@ func (m message5) Create( Value: initialAmount, }, nil } + + diff --git a/chain/actors/builtin/multisig/message6.go b/chain/actors/builtin/multisig/message6.go index b2b95245e..259fe71ee 100644 --- a/chain/actors/builtin/multisig/message6.go +++ b/chain/actors/builtin/multisig/message6.go @@ -69,3 +69,5 @@ func (m message6) Create( Value: initialAmount, }, nil } + + diff --git a/chain/actors/builtin/multisig/message7.go b/chain/actors/builtin/multisig/message7.go index e7fb83e9b..1d6bd2f18 100644 --- a/chain/actors/builtin/multisig/message7.go +++ b/chain/actors/builtin/multisig/message7.go @@ -69,3 +69,5 @@ func (m message7) Create( Value: initialAmount, }, nil } + + diff --git a/chain/actors/builtin/multisig/message8.go b/chain/actors/builtin/multisig/message8.go index 9852af105..1a97eb074 100644 --- a/chain/actors/builtin/multisig/message8.go +++ b/chain/actors/builtin/multisig/message8.go @@ -69,3 +69,5 @@ func (m message8) Create( Value: initialAmount, }, nil } + + diff --git a/chain/actors/builtin/multisig/multisig.go b/chain/actors/builtin/multisig/multisig.go index 0ccce071c..9fd29a6da 100644 --- a/chain/actors/builtin/multisig/multisig.go +++ b/chain/actors/builtin/multisig/multisig.go @@ -31,6 +31,7 @@ import ( builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -43,36 +44,120 @@ func init() { return load0(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version0, "multisig"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + } + builtin.RegisterActorState(builtin2.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version2, "multisig"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + } + builtin.RegisterActorState(builtin3.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version3, "multisig"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + } + builtin.RegisterActorState(builtin4.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version4, "multisig"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + } + builtin.RegisterActorState(builtin5.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version5, "multisig"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + } + builtin.RegisterActorState(builtin6.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version6, "multisig"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + } + builtin.RegisterActorState(builtin7.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version7, "multisig"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } + builtin.RegisterActorState(builtin8.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version8, "multisig"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } } func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "multisig" { + return nil, xerrors.Errorf("actor code is not multisig: %s", name) + } + + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { case builtin0.MultisigActorCodeID: @@ -130,11 +215,15 @@ func MakeState(store adt.Store, av actors.Version, signers []address.Address, th case actors.Version8: return make8(store, signers, threshold, startEpoch, unlockDuration, initialBalance) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "multisig"); ok { + return c, nil + } + switch av { case actors.Version0: diff --git a/chain/actors/builtin/multisig/v0.go b/chain/actors/builtin/multisig/v0.go index 973ac9209..26b4f7d28 100644 --- a/chain/actors/builtin/multisig/v0.go +++ b/chain/actors/builtin/multisig/v0.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" ) @@ -36,14 +37,14 @@ func make0(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v2.go b/chain/actors/builtin/multisig/v2.go index 5b830e695..44e83643a 100644 --- a/chain/actors/builtin/multisig/v2.go +++ b/chain/actors/builtin/multisig/v2.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" ) @@ -36,14 +37,14 @@ func make2(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v3.go b/chain/actors/builtin/multisig/v3.go index c4a2791b7..d721744fe 100644 --- a/chain/actors/builtin/multisig/v3.go +++ b/chain/actors/builtin/multisig/v3.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" msig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" @@ -38,14 +39,14 @@ func make3(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt3.StoreEmptyMap(store, builtin3.DefaultHamtBitwidth) + if err != nil { + return nil, err + } - em, err := adt3.StoreEmptyMap(store, builtin3.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v4.go b/chain/actors/builtin/multisig/v4.go index a35a890f8..9473daa6e 100644 --- a/chain/actors/builtin/multisig/v4.go +++ b/chain/actors/builtin/multisig/v4.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" msig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" @@ -38,14 +39,14 @@ func make4(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt4.StoreEmptyMap(store, builtin4.DefaultHamtBitwidth) + if err != nil { + return nil, err + } - em, err := adt4.StoreEmptyMap(store, builtin4.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v5.go b/chain/actors/builtin/multisig/v5.go index 4ad9aea94..08ef1dcb5 100644 --- a/chain/actors/builtin/multisig/v5.go +++ b/chain/actors/builtin/multisig/v5.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" @@ -38,14 +39,14 @@ func make5(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt5.StoreEmptyMap(store, builtin5.DefaultHamtBitwidth) + if err != nil { + return nil, err + } - em, err := adt5.StoreEmptyMap(store, builtin5.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v6.go b/chain/actors/builtin/multisig/v6.go index fa16494f8..cff943701 100644 --- a/chain/actors/builtin/multisig/v6.go +++ b/chain/actors/builtin/multisig/v6.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" @@ -38,14 +39,14 @@ func make6(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt6.StoreEmptyMap(store, builtin6.DefaultHamtBitwidth) + if err != nil { + return nil, err + } - em, err := adt6.StoreEmptyMap(store, builtin6.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v7.go b/chain/actors/builtin/multisig/v7.go index bbe41f3db..ee1d6e131 100644 --- a/chain/actors/builtin/multisig/v7.go +++ b/chain/actors/builtin/multisig/v7.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" @@ -38,14 +39,14 @@ func make7(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) + if err != nil { + return nil, err + } - em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v8.go b/chain/actors/builtin/multisig/v8.go index 9ac8224da..d768a0385 100644 --- a/chain/actors/builtin/multisig/v8.go +++ b/chain/actors/builtin/multisig/v8.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" msig8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/multisig" @@ -38,14 +39,14 @@ func make8(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance + + em, err := adt8.StoreEmptyMap(store, builtin8.DefaultHamtBitwidth) + if err != nil { + return nil, err + } - em, err := adt8.StoreEmptyMap(store, builtin8.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - - out.State.PendingTxns = em - + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/paych/message0.go b/chain/actors/builtin/paych/message0.go index 7cba977e3..95e0120d9 100644 --- a/chain/actors/builtin/paych/message0.go +++ b/chain/actors/builtin/paych/message0.go @@ -39,9 +39,9 @@ func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych0.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message2.go b/chain/actors/builtin/paych/message2.go index 60c7fe16e..f1b7dc8eb 100644 --- a/chain/actors/builtin/paych/message2.go +++ b/chain/actors/builtin/paych/message2.go @@ -39,9 +39,9 @@ func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych2.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message3.go b/chain/actors/builtin/paych/message3.go index 04fb35b57..ba82939d1 100644 --- a/chain/actors/builtin/paych/message3.go +++ b/chain/actors/builtin/paych/message3.go @@ -39,9 +39,9 @@ func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych3.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message4.go b/chain/actors/builtin/paych/message4.go index 9f5e000d9..e285edd4b 100644 --- a/chain/actors/builtin/paych/message4.go +++ b/chain/actors/builtin/paych/message4.go @@ -39,9 +39,9 @@ func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych4.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message5.go b/chain/actors/builtin/paych/message5.go index 71e6b6799..00e3b1dcd 100644 --- a/chain/actors/builtin/paych/message5.go +++ b/chain/actors/builtin/paych/message5.go @@ -39,9 +39,9 @@ func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych5.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message6.go b/chain/actors/builtin/paych/message6.go index 7f80bc4a6..05e690449 100644 --- a/chain/actors/builtin/paych/message6.go +++ b/chain/actors/builtin/paych/message6.go @@ -39,9 +39,9 @@ func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych6.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message7.go b/chain/actors/builtin/paych/message7.go index e3ee0d77b..3930c8074 100644 --- a/chain/actors/builtin/paych/message7.go +++ b/chain/actors/builtin/paych/message7.go @@ -39,9 +39,9 @@ func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ - - Sv: toV7SignedVoucher(*sv), - + + Sv: toV7SignedVoucher(*sv), + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message8.go b/chain/actors/builtin/paych/message8.go index f49f457e8..620c6850b 100644 --- a/chain/actors/builtin/paych/message8.go +++ b/chain/actors/builtin/paych/message8.go @@ -39,9 +39,9 @@ func (m message8) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message8) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych8.UpdateChannelStateParams{ - - Sv: toV8SignedVoucher(*sv), - + + Sv: toV8SignedVoucher(*sv), + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/paych.go b/chain/actors/builtin/paych/paych.go index 2e0c932cd..e9a5ebfba 100644 --- a/chain/actors/builtin/paych/paych.go +++ b/chain/actors/builtin/paych/paych.go @@ -31,6 +31,7 @@ import ( builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -43,37 +44,121 @@ func init() { return load0(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version0, "paymentchannel"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + } + builtin.RegisterActorState(builtin2.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version2, "paymentchannel"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + } + builtin.RegisterActorState(builtin3.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version3, "paymentchannel"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + } + builtin.RegisterActorState(builtin4.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version4, "paymentchannel"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + } + builtin.RegisterActorState(builtin5.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version5, "paymentchannel"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + } + builtin.RegisterActorState(builtin6.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version6, "paymentchannel"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + } + builtin.RegisterActorState(builtin7.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version7, "paymentchannel"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } + builtin.RegisterActorState(builtin8.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version8, "paymentchannel"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } } // Load returns an abstract copy of payment channel state, irregardless of actor version func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "paymentchannel" { + return nil, xerrors.Errorf("actor code is not paymentchannel: %s", name) + } + + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { case builtin0.PaymentChannelActorCodeID: @@ -131,11 +216,15 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "paymentchannel"); ok { + return c, nil + } + switch av { case actors.Version0: diff --git a/chain/actors/builtin/paych/v0.go b/chain/actors/builtin/paych/v0.go index e9bc30e3d..4da111619 100644 --- a/chain/actors/builtin/paych/v0.go +++ b/chain/actors/builtin/paych/v0.go @@ -112,3 +112,4 @@ func (ls *laneState0) Redeemed() (big.Int, error) { func (ls *laneState0) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + diff --git a/chain/actors/builtin/paych/v2.go b/chain/actors/builtin/paych/v2.go index 400305e2f..a38563cbf 100644 --- a/chain/actors/builtin/paych/v2.go +++ b/chain/actors/builtin/paych/v2.go @@ -112,3 +112,4 @@ func (ls *laneState2) Redeemed() (big.Int, error) { func (ls *laneState2) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + diff --git a/chain/actors/builtin/paych/v3.go b/chain/actors/builtin/paych/v3.go index 1d7c2f94b..41fccf77b 100644 --- a/chain/actors/builtin/paych/v3.go +++ b/chain/actors/builtin/paych/v3.go @@ -112,3 +112,4 @@ func (ls *laneState3) Redeemed() (big.Int, error) { func (ls *laneState3) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + diff --git a/chain/actors/builtin/paych/v4.go b/chain/actors/builtin/paych/v4.go index b7d1e52a5..b98582fc9 100644 --- a/chain/actors/builtin/paych/v4.go +++ b/chain/actors/builtin/paych/v4.go @@ -112,3 +112,4 @@ func (ls *laneState4) Redeemed() (big.Int, error) { func (ls *laneState4) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + diff --git a/chain/actors/builtin/paych/v5.go b/chain/actors/builtin/paych/v5.go index b331a1500..51ce6966b 100644 --- a/chain/actors/builtin/paych/v5.go +++ b/chain/actors/builtin/paych/v5.go @@ -112,3 +112,4 @@ func (ls *laneState5) Redeemed() (big.Int, error) { func (ls *laneState5) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + diff --git a/chain/actors/builtin/paych/v6.go b/chain/actors/builtin/paych/v6.go index 0d60b1f03..51d27df42 100644 --- a/chain/actors/builtin/paych/v6.go +++ b/chain/actors/builtin/paych/v6.go @@ -112,3 +112,4 @@ func (ls *laneState6) Redeemed() (big.Int, error) { func (ls *laneState6) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + diff --git a/chain/actors/builtin/paych/v7.go b/chain/actors/builtin/paych/v7.go index 19c801c82..57b78fc02 100644 --- a/chain/actors/builtin/paych/v7.go +++ b/chain/actors/builtin/paych/v7.go @@ -113,6 +113,7 @@ func (ls *laneState7) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + func toV7SignedVoucher(sv SignedVoucher) paych7.SignedVoucher { return paych7.SignedVoucher{ ChannelAddr: sv.ChannelAddr, diff --git a/chain/actors/builtin/paych/v8.go b/chain/actors/builtin/paych/v8.go index 06e724e4c..752a160e0 100644 --- a/chain/actors/builtin/paych/v8.go +++ b/chain/actors/builtin/paych/v8.go @@ -113,6 +113,7 @@ func (ls *laneState8) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + func toV8SignedVoucher(sv SignedVoucher) paych8.SignedVoucher { return paych8.SignedVoucher{ ChannelAddr: sv.ChannelAddr, diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go index ffc5cd702..b995d9086 100644 --- a/chain/actors/builtin/power/power.go +++ b/chain/actors/builtin/power/power.go @@ -30,6 +30,7 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + ) func init() { @@ -38,33 +39,81 @@ func init() { return load0(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version0, "storagepower"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + } + builtin.RegisterActorState(builtin2.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version2, "storagepower"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + } + builtin.RegisterActorState(builtin3.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version3, "storagepower"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + } + builtin.RegisterActorState(builtin4.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version4, "storagepower"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + } + builtin.RegisterActorState(builtin5.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version5, "storagepower"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + } + builtin.RegisterActorState(builtin6.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version6, "storagepower"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + } + builtin.RegisterActorState(builtin7.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version7, "storagepower"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } + builtin.RegisterActorState(builtin8.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version8, "storagepower"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } } var ( @@ -73,6 +122,42 @@ var ( ) func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "storagepower" { + return nil, xerrors.Errorf("actor code is not storagepower: %s", name) + } + + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { case builtin0.StoragePowerActorCodeID: @@ -130,11 +215,15 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "storagepower"); ok { + return c, nil + } + switch av { case actors.Version0: diff --git a/chain/actors/builtin/power/v0.go b/chain/actors/builtin/power/v0.go index 465d16c5c..dd62f48ef 100644 --- a/chain/actors/builtin/power/v0.go +++ b/chain/actors/builtin/power/v0.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) @@ -28,18 +29,19 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store) (State, error) { out := state0{store: store} + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } + emm, err := adt0.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } - emm, err := adt0.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } - - out.State = *power0.ConstructState(em, emm) + out.State = *power0.ConstructState(em, emm) + return &out, nil } diff --git a/chain/actors/builtin/power/v2.go b/chain/actors/builtin/power/v2.go index 606534cef..54674c5db 100644 --- a/chain/actors/builtin/power/v2.go +++ b/chain/actors/builtin/power/v2.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) @@ -28,18 +29,19 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store) (State, error) { out := state2{store: store} + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } + emm, err := adt2.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } - emm, err := adt2.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } - - out.State = *power2.ConstructState(em, emm) + out.State = *power2.ConstructState(em, emm) + return &out, nil } diff --git a/chain/actors/builtin/power/v3.go b/chain/actors/builtin/power/v3.go index 3dec3c63e..ecc5efa82 100644 --- a/chain/actors/builtin/power/v3.go +++ b/chain/actors/builtin/power/v3.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" @@ -30,13 +31,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store) (State, error) { out := state3{store: store} + + s, err := power3.ConstructState(store) + if err != nil { + return nil, err + } - s, err := power3.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s + out.State = *s + return &out, nil } diff --git a/chain/actors/builtin/power/v4.go b/chain/actors/builtin/power/v4.go index b73eedf5a..ac5f87515 100644 --- a/chain/actors/builtin/power/v4.go +++ b/chain/actors/builtin/power/v4.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" @@ -30,13 +31,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store) (State, error) { out := state4{store: store} + + s, err := power4.ConstructState(store) + if err != nil { + return nil, err + } - s, err := power4.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s + out.State = *s + return &out, nil } diff --git a/chain/actors/builtin/power/v5.go b/chain/actors/builtin/power/v5.go index 84b23a577..408af81e5 100644 --- a/chain/actors/builtin/power/v5.go +++ b/chain/actors/builtin/power/v5.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power" @@ -30,13 +31,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store) (State, error) { out := state5{store: store} + + s, err := power5.ConstructState(store) + if err != nil { + return nil, err + } - s, err := power5.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s + out.State = *s + return &out, nil } diff --git a/chain/actors/builtin/power/v6.go b/chain/actors/builtin/power/v6.go index 4273c2c73..73ef6b69d 100644 --- a/chain/actors/builtin/power/v6.go +++ b/chain/actors/builtin/power/v6.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" @@ -30,13 +31,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store) (State, error) { out := state6{store: store} + + s, err := power6.ConstructState(store) + if err != nil { + return nil, err + } - s, err := power6.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s + out.State = *s + return &out, nil } diff --git a/chain/actors/builtin/power/v7.go b/chain/actors/builtin/power/v7.go index af1761cb2..128457248 100644 --- a/chain/actors/builtin/power/v7.go +++ b/chain/actors/builtin/power/v7.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" @@ -30,13 +31,14 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store) (State, error) { out := state7{store: store} + + s, err := power7.ConstructState(store) + if err != nil { + return nil, err + } - s, err := power7.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s + out.State = *s + return &out, nil } diff --git a/chain/actors/builtin/power/v8.go b/chain/actors/builtin/power/v8.go index 622dd96ba..17b7d52f7 100644 --- a/chain/actors/builtin/power/v8.go +++ b/chain/actors/builtin/power/v8.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" power8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/power" @@ -30,13 +31,14 @@ func load8(store adt.Store, root cid.Cid) (State, error) { func make8(store adt.Store) (State, error) { out := state8{store: store} + + s, err := power8.ConstructState(store) + if err != nil { + return nil, err + } - s, err := power8.ConstructState(store) - if err != nil { - return nil, err - } - - out.State = *s + out.State = *s + return &out, nil } diff --git a/chain/actors/builtin/reward/reward.go b/chain/actors/builtin/reward/reward.go index a83a3362e..27cd28e74 100644 --- a/chain/actors/builtin/reward/reward.go +++ b/chain/actors/builtin/reward/reward.go @@ -2,9 +2,9 @@ package reward import ( "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/lotus/chain/actors" reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" "github.com/ipfs/go-cid" + "github.com/filecoin-project/lotus/chain/actors" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/cbor" @@ -25,6 +25,7 @@ import ( builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" @@ -36,33 +37,81 @@ func init() { return load0(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version0, "reward"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + } + builtin.RegisterActorState(builtin2.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version2, "reward"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + } + builtin.RegisterActorState(builtin3.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version3, "reward"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + } + builtin.RegisterActorState(builtin4.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version4, "reward"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + } + builtin.RegisterActorState(builtin5.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version5, "reward"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + } + builtin.RegisterActorState(builtin6.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version6, "reward"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + } + builtin.RegisterActorState(builtin7.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version7, "reward"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } + builtin.RegisterActorState(builtin8.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) + + if c, ok := actors.GetActorCodeID(actors.Version8, "reward"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } } var ( @@ -71,6 +120,42 @@ var ( ) func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "reward" { + return nil, xerrors.Errorf("actor code is not reward: %s", name) + } + + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { case builtin0.RewardActorCodeID: @@ -128,11 +213,15 @@ func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.Storage case actors.Version8: return make8(store, currRealizedPower) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "reward"); ok { + return c, nil + } + switch av { case actors.Version0: diff --git a/chain/actors/builtin/reward/v2.go b/chain/actors/builtin/reward/v2.go index 08e9a7bc3..fc475782d 100644 --- a/chain/actors/builtin/reward/v2.go +++ b/chain/actors/builtin/reward/v2.go @@ -40,7 +40,7 @@ func (s *state2) ThisEpochReward() (abi.TokenAmount, error) { func (s *state2) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v3.go b/chain/actors/builtin/reward/v3.go index fd9fa56e2..0029f1e9b 100644 --- a/chain/actors/builtin/reward/v3.go +++ b/chain/actors/builtin/reward/v3.go @@ -40,7 +40,7 @@ func (s *state3) ThisEpochReward() (abi.TokenAmount, error) { func (s *state3) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v4.go b/chain/actors/builtin/reward/v4.go index 310ca04e8..721cafc3f 100644 --- a/chain/actors/builtin/reward/v4.go +++ b/chain/actors/builtin/reward/v4.go @@ -40,7 +40,7 @@ func (s *state4) ThisEpochReward() (abi.TokenAmount, error) { func (s *state4) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v5.go b/chain/actors/builtin/reward/v5.go index 7200f7d11..cb25b1fb2 100644 --- a/chain/actors/builtin/reward/v5.go +++ b/chain/actors/builtin/reward/v5.go @@ -40,7 +40,7 @@ func (s *state5) ThisEpochReward() (abi.TokenAmount, error) { func (s *state5) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v6.go b/chain/actors/builtin/reward/v6.go index 010a3a870..37841e6cf 100644 --- a/chain/actors/builtin/reward/v6.go +++ b/chain/actors/builtin/reward/v6.go @@ -40,7 +40,7 @@ func (s *state6) ThisEpochReward() (abi.TokenAmount, error) { func (s *state6) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v7.go b/chain/actors/builtin/reward/v7.go index 368bb3abd..66da5720a 100644 --- a/chain/actors/builtin/reward/v7.go +++ b/chain/actors/builtin/reward/v7.go @@ -40,7 +40,7 @@ func (s *state7) ThisEpochReward() (abi.TokenAmount, error) { func (s *state7) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v8.go b/chain/actors/builtin/reward/v8.go index 23ebf6f57..6fce0c06a 100644 --- a/chain/actors/builtin/reward/v8.go +++ b/chain/actors/builtin/reward/v8.go @@ -40,7 +40,7 @@ func (s *state8) ThisEpochReward() (abi.TokenAmount, error) { func (s *state8) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/system/system.go b/chain/actors/builtin/system/system.go index c4d00e8f1..f58711abb 100644 --- a/chain/actors/builtin/system/system.go +++ b/chain/actors/builtin/system/system.go @@ -1,10 +1,11 @@ package system import ( - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" - "github.com/ipfs/go-cid" + "github.com/filecoin-project/lotus/chain/actors" "golang.org/x/xerrors" + "github.com/ipfs/go-cid" + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -21,6 +22,7 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + ) var ( @@ -54,11 +56,15 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "system"); ok { + return c, nil + } + switch av { case actors.Version0: diff --git a/chain/actors/builtin/system/v0.go b/chain/actors/builtin/system/v0.go index 64c6f53d3..4dee475bd 100644 --- a/chain/actors/builtin/system/v0.go +++ b/chain/actors/builtin/system/v0.go @@ -32,4 +32,4 @@ type state0 struct { func (s *state0) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/system/v2.go b/chain/actors/builtin/system/v2.go index eb540891c..2389a5c22 100644 --- a/chain/actors/builtin/system/v2.go +++ b/chain/actors/builtin/system/v2.go @@ -32,4 +32,4 @@ type state2 struct { func (s *state2) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/system/v3.go b/chain/actors/builtin/system/v3.go index 5b04e189e..20e4dc9b2 100644 --- a/chain/actors/builtin/system/v3.go +++ b/chain/actors/builtin/system/v3.go @@ -32,4 +32,4 @@ type state3 struct { func (s *state3) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/system/v4.go b/chain/actors/builtin/system/v4.go index b6c924978..1d37b49f1 100644 --- a/chain/actors/builtin/system/v4.go +++ b/chain/actors/builtin/system/v4.go @@ -32,4 +32,4 @@ type state4 struct { func (s *state4) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/system/v5.go b/chain/actors/builtin/system/v5.go index 77d2a8478..255ae7b83 100644 --- a/chain/actors/builtin/system/v5.go +++ b/chain/actors/builtin/system/v5.go @@ -32,4 +32,4 @@ type state5 struct { func (s *state5) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/system/v6.go b/chain/actors/builtin/system/v6.go index 689620afb..c801985c7 100644 --- a/chain/actors/builtin/system/v6.go +++ b/chain/actors/builtin/system/v6.go @@ -32,4 +32,4 @@ type state6 struct { func (s *state6) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/system/v7.go b/chain/actors/builtin/system/v7.go index 813add5fb..ca33d0314 100644 --- a/chain/actors/builtin/system/v7.go +++ b/chain/actors/builtin/system/v7.go @@ -32,4 +32,4 @@ type state7 struct { func (s *state7) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/system/v8.go b/chain/actors/builtin/system/v8.go index b218c7a52..10f285bcc 100644 --- a/chain/actors/builtin/system/v8.go +++ b/chain/actors/builtin/system/v8.go @@ -32,4 +32,4 @@ type state8 struct { func (s *state8) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/verifreg/v0.go b/chain/actors/builtin/verifreg/v0.go index dcd34c72a..e3bf72b70 100644 --- a/chain/actors/builtin/verifreg/v0.go +++ b/chain/actors/builtin/verifreg/v0.go @@ -25,14 +25,14 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state0{store: store} + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *verifreg0.ConstructState(em, rootKeyAddress) - + out.State = *verifreg0.ConstructState(em, rootKeyAddress) + return &out, nil } @@ -74,10 +74,10 @@ func (s *state0) verifiers() (adt.Map, error) { } func (s *state0) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state0) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/verifreg/v2.go b/chain/actors/builtin/verifreg/v2.go index dfe25f054..557366ab6 100644 --- a/chain/actors/builtin/verifreg/v2.go +++ b/chain/actors/builtin/verifreg/v2.go @@ -25,14 +25,14 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state2{store: store} + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - - out.State = *verifreg2.ConstructState(em, rootKeyAddress) - + out.State = *verifreg2.ConstructState(em, rootKeyAddress) + return &out, nil } @@ -74,10 +74,10 @@ func (s *state2) verifiers() (adt.Map, error) { } func (s *state2) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state2) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/verifreg/v3.go b/chain/actors/builtin/verifreg/v3.go index c71c69f92..90075dcf3 100644 --- a/chain/actors/builtin/verifreg/v3.go +++ b/chain/actors/builtin/verifreg/v3.go @@ -26,14 +26,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state3{store: store} + + s, err := verifreg3.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } - s, err := verifreg3.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -75,10 +75,10 @@ func (s *state3) verifiers() (adt.Map, error) { } func (s *state3) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state3) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/verifreg/v4.go b/chain/actors/builtin/verifreg/v4.go index d3adc5169..dc730187d 100644 --- a/chain/actors/builtin/verifreg/v4.go +++ b/chain/actors/builtin/verifreg/v4.go @@ -26,14 +26,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state4{store: store} + + s, err := verifreg4.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } - s, err := verifreg4.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -75,10 +75,10 @@ func (s *state4) verifiers() (adt.Map, error) { } func (s *state4) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state4) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/verifreg/v5.go b/chain/actors/builtin/verifreg/v5.go index 2af501af3..9d5035ffd 100644 --- a/chain/actors/builtin/verifreg/v5.go +++ b/chain/actors/builtin/verifreg/v5.go @@ -26,14 +26,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state5{store: store} + + s, err := verifreg5.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } - s, err := verifreg5.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -75,10 +75,10 @@ func (s *state5) verifiers() (adt.Map, error) { } func (s *state5) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state5) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/verifreg/v6.go b/chain/actors/builtin/verifreg/v6.go index 454c9478f..30446d4b7 100644 --- a/chain/actors/builtin/verifreg/v6.go +++ b/chain/actors/builtin/verifreg/v6.go @@ -26,14 +26,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state6{store: store} + + s, err := verifreg6.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } - s, err := verifreg6.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -75,10 +75,10 @@ func (s *state6) verifiers() (adt.Map, error) { } func (s *state6) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state6) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/verifreg/v7.go b/chain/actors/builtin/verifreg/v7.go index 3bcfa10bd..01de7e5ab 100644 --- a/chain/actors/builtin/verifreg/v7.go +++ b/chain/actors/builtin/verifreg/v7.go @@ -26,14 +26,14 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state7{store: store} + + s, err := verifreg7.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } - s, err := verifreg7.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -75,9 +75,9 @@ func (s *state7) verifiers() (adt.Map, error) { } func (s *state7) removeDataCapProposalIDs() (adt.Map, error) { - return adt7.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin7.DefaultHamtBitwidth) + return adt7.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin7.DefaultHamtBitwidth) } func (s *state7) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/verifreg/v8.go b/chain/actors/builtin/verifreg/v8.go index bb0b19909..1903d0fe4 100644 --- a/chain/actors/builtin/verifreg/v8.go +++ b/chain/actors/builtin/verifreg/v8.go @@ -26,14 +26,14 @@ func load8(store adt.Store, root cid.Cid) (State, error) { func make8(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state8{store: store} + + s, err := verifreg8.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } - s, err := verifreg8.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - - out.State = *s - + out.State = *s + return &out, nil } @@ -75,9 +75,9 @@ func (s *state8) verifiers() (adt.Map, error) { } func (s *state8) removeDataCapProposalIDs() (adt.Map, error) { - return adt8.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin8.DefaultHamtBitwidth) + return adt8.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin8.DefaultHamtBitwidth) } func (s *state8) GetState() interface{} { return &s.State -} +} \ No newline at end of file diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go index 35f9db21c..c3d4f44a7 100644 --- a/chain/actors/builtin/verifreg/verifreg.go +++ b/chain/actors/builtin/verifreg/verifreg.go @@ -25,9 +25,10 @@ import ( builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/types" verifreg8 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" ) @@ -38,34 +39,82 @@ func init() { return load0(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version0, "verifiedregistry"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load0(store, root) + }) + } + builtin.RegisterActorState(builtin2.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version2, "verifiedregistry"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load2(store, root) + }) + } + builtin.RegisterActorState(builtin3.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version3, "verifiedregistry"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load3(store, root) + }) + } + builtin.RegisterActorState(builtin4.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version4, "verifiedregistry"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load4(store, root) + }) + } + builtin.RegisterActorState(builtin5.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version5, "verifiedregistry"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load5(store, root) + }) + } + builtin.RegisterActorState(builtin6.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version6, "verifiedregistry"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load6(store, root) + }) + } + builtin.RegisterActorState(builtin7.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version7, "verifiedregistry"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } + builtin.RegisterActorState(builtin8.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) + if c, ok := actors.GetActorCodeID(actors.Version8, "verifiedregistry"); ok { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load8(store, root) + }) + } + } var ( @@ -74,6 +123,42 @@ var ( ) func Load(store adt.Store, act *types.Actor) (State, error) { + if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { + if name != "verifiedregistry" { + return nil, xerrors.Errorf("actor code is not verifiedregistry: %s", name) + } + + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } + } + switch act.Code { case builtin0.VerifiedRegistryActorCodeID: @@ -131,11 +216,15 @@ func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Addres case actors.Version8: return make8(store, rootKeyAddress) - } +} return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { + if c, ok := actors.GetActorCodeID(av, "verifiedregistry"); ok { + return c, nil + } + switch av { case actors.Version0: @@ -171,7 +260,6 @@ type RemoveDataCapProposal = verifreg8.RemoveDataCapProposal type RemoveDataCapRequest = verifreg8.RemoveDataCapRequest type RemoveDataCapParams = verifreg8.RemoveDataCapParams type RmDcProposalID = verifreg8.RmDcProposalID - const SignatureDomainSeparation_RemoveDataCap = verifreg8.SignatureDomainSeparation_RemoveDataCap type State interface { diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index 673bbf57c..e48a79f24 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -10,45 +10,55 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/chain/actors" + + market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" - - builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" miner8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/miner" verifreg8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/verifreg" + + paych8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/paych" ) @@ -63,28 +73,45 @@ const ( // SetSupportedProofTypes sets supported proof types, across all actor versions. // This should only be used for testing. func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { - - miner0.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner2.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner2.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner2.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner3.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner3.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner3.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner4.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner4.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner4.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner5.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - miner8.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + miner0.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner2.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner2.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner2.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner3.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner3.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner3.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner4.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner4.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner4.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner5.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + + + miner8.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + AddSupportedProofTypes(types...) } @@ -98,59 +125,76 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { } // Set for all miner versions. - miner0.SupportedProofTypes[t] = struct{}{} + + + miner0.SupportedProofTypes[t] = struct{}{} + + + + miner2.PreCommitSealProofTypesV0[t] = struct{}{} + miner2.PreCommitSealProofTypesV7[t] = struct{}{} + miner2.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner2.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + + + miner3.PreCommitSealProofTypesV0[t] = struct{}{} + miner3.PreCommitSealProofTypesV7[t] = struct{}{} + miner3.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner3.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + + + miner4.PreCommitSealProofTypesV0[t] = struct{}{} + miner4.PreCommitSealProofTypesV7[t] = struct{}{} + miner4.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner4.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + + + miner5.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err := t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } - miner2.PreCommitSealProofTypesV0[t] = struct{}{} - miner2.PreCommitSealProofTypesV7[t] = struct{}{} - miner2.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner2.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner5.WindowPoStProofTypes[wpp] = struct{}{} + + + + miner6.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } - miner3.PreCommitSealProofTypesV0[t] = struct{}{} - miner3.PreCommitSealProofTypesV7[t] = struct{}{} - miner3.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner3.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner6.WindowPoStProofTypes[wpp] = struct{}{} + + + + miner7.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } - miner4.PreCommitSealProofTypesV0[t] = struct{}{} - miner4.PreCommitSealProofTypesV7[t] = struct{}{} - miner4.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner4.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - miner5.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err := t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner5.WindowPoStProofTypes[wpp] = struct{}{} - - miner6.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner6.WindowPoStProofTypes[wpp] = struct{}{} - - miner7.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner7.WindowPoStProofTypes[wpp] = struct{}{} - - miner8.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } - - miner8.WindowPoStProofTypes[wpp] = struct{}{} + miner7.WindowPoStProofTypes[wpp] = struct{}{} + + + + miner8.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + miner8.WindowPoStProofTypes[wpp] = struct{}{} + + } } @@ -158,23 +202,23 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { // actors versions. Use for testing. func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { // Set for all miner versions. - - miner0.PreCommitChallengeDelay = delay - - miner2.PreCommitChallengeDelay = delay - - miner3.PreCommitChallengeDelay = delay - - miner4.PreCommitChallengeDelay = delay - - miner5.PreCommitChallengeDelay = delay - - miner6.PreCommitChallengeDelay = delay - - miner7.PreCommitChallengeDelay = delay - - miner8.PreCommitChallengeDelay = delay - + + miner0.PreCommitChallengeDelay = delay + + miner2.PreCommitChallengeDelay = delay + + miner3.PreCommitChallengeDelay = delay + + miner4.PreCommitChallengeDelay = delay + + miner5.PreCommitChallengeDelay = delay + + miner6.PreCommitChallengeDelay = delay + + miner7.PreCommitChallengeDelay = delay + + miner8.PreCommitChallengeDelay = delay + } // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. @@ -186,96 +230,120 @@ func GetPreCommitChallengeDelay() abi.ChainEpoch { // meet for leader election, across all actor versions. This should only be used // for testing. func SetConsensusMinerMinPower(p abi.StoragePower) { - - power0.ConsensusMinerMinPower = p - - for _, policy := range builtin2.SealProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin3.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin4.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin5.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin6.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin7.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - for _, policy := range builtin8.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - + + + power0.ConsensusMinerMinPower = p + + + + for _, policy := range builtin2.SealProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin3.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin4.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin5.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin6.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin7.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + + + for _, policy := range builtin8.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + } // SetMinVerifiedDealSize sets the minimum size of a verified deal. This should // only be used for testing. func SetMinVerifiedDealSize(size abi.StoragePower) { - - verifreg0.MinVerifiedDealSize = size - - verifreg2.MinVerifiedDealSize = size - - verifreg3.MinVerifiedDealSize = size - - verifreg4.MinVerifiedDealSize = size - - verifreg5.MinVerifiedDealSize = size - - verifreg6.MinVerifiedDealSize = size - - verifreg7.MinVerifiedDealSize = size - - verifreg8.MinVerifiedDealSize = size - + + verifreg0.MinVerifiedDealSize = size + + verifreg2.MinVerifiedDealSize = size + + verifreg3.MinVerifiedDealSize = size + + verifreg4.MinVerifiedDealSize = size + + verifreg5.MinVerifiedDealSize = size + + verifreg6.MinVerifiedDealSize = size + + verifreg7.MinVerifiedDealSize = size + + verifreg8.MinVerifiedDealSize = size + } func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { switch ver { - - case actors.Version0: - - return miner0.MaxSealDuration[t], nil - - case actors.Version2: - - return miner2.MaxProveCommitDuration[t], nil - - case actors.Version3: - - return miner3.MaxProveCommitDuration[t], nil - - case actors.Version4: - - return miner4.MaxProveCommitDuration[t], nil - - case actors.Version5: - - return miner5.MaxProveCommitDuration[t], nil - - case actors.Version6: - - return miner6.MaxProveCommitDuration[t], nil - - case actors.Version7: - - return miner7.MaxProveCommitDuration[t], nil - - case actors.Version8: - - return miner8.MaxProveCommitDuration[t], nil - + + case actors.Version0: + + return miner0.MaxSealDuration[t], nil + + + case actors.Version2: + + return miner2.MaxProveCommitDuration[t], nil + + + case actors.Version3: + + return miner3.MaxProveCommitDuration[t], nil + + + case actors.Version4: + + return miner4.MaxProveCommitDuration[t], nil + + + case actors.Version5: + + return miner5.MaxProveCommitDuration[t], nil + + + case actors.Version6: + + return miner6.MaxProveCommitDuration[t], nil + + + case actors.Version7: + + return miner7.MaxProveCommitDuration[t], nil + + + case actors.Version8: + + return miner8.MaxProveCommitDuration[t], nil + + default: return 0, xerrors.Errorf("unsupported actors version") } @@ -286,40 +354,56 @@ func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (a // only be used for testing. func SetProviderCollateralSupplyTarget(num, denom big.Int) { + + + market2.ProviderCollateralSupplyTarget = builtin2.BigFrac{ Numerator: num, Denominator: denom, } + + market3.ProviderCollateralSupplyTarget = builtin3.BigFrac{ Numerator: num, Denominator: denom, } + + market4.ProviderCollateralSupplyTarget = builtin4.BigFrac{ Numerator: num, Denominator: denom, } + + market5.ProviderCollateralSupplyTarget = builtin5.BigFrac{ Numerator: num, Denominator: denom, } + + market6.ProviderCollateralSupplyTarget = builtin6.BigFrac{ Numerator: num, Denominator: denom, } + + market7.ProviderCollateralSupplyTarget = builtin7.BigFrac{ Numerator: num, Denominator: denom, } + + market8.ProviderCollateralSupplyTarget = builtin8.BigFrac{ Numerator: num, Denominator: denom, } + } @@ -333,47 +417,55 @@ func DealProviderCollateralBounds( return big.Zero(), big.Zero(), err } switch v { - - case actors.Version0: - - min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) - return min, max, nil - - case actors.Version2: - - min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version3: - - min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version4: - - min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version5: - - min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version6: - - min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version7: - - min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - case actors.Version8: - - min, max := market8.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - + + case actors.Version0: + + min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) + return min, max, nil + + + case actors.Version2: + + min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version3: + + min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version4: + + min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version5: + + min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version6: + + min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version7: + + min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + + case actors.Version8: + + min, max := market8.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + default: return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") } @@ -386,55 +478,63 @@ func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) // Sets the challenge window and scales the proving period to match (such that // there are always 48 challenge windows in a proving period). func SetWPoStChallengeWindow(period abi.ChainEpoch) { - - miner0.WPoStChallengeWindow = period - miner0.WPoStProvingPeriod = period * abi.ChainEpoch(miner0.WPoStPeriodDeadlines) - - miner2.WPoStChallengeWindow = period - miner2.WPoStProvingPeriod = period * abi.ChainEpoch(miner2.WPoStPeriodDeadlines) - - miner3.WPoStChallengeWindow = period - miner3.WPoStProvingPeriod = period * abi.ChainEpoch(miner3.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner3.WPoStDisputeWindow = period * 30 - - miner4.WPoStChallengeWindow = period - miner4.WPoStProvingPeriod = period * abi.ChainEpoch(miner4.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner4.WPoStDisputeWindow = period * 30 - - miner5.WPoStChallengeWindow = period - miner5.WPoStProvingPeriod = period * abi.ChainEpoch(miner5.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner5.WPoStDisputeWindow = period * 30 - - miner6.WPoStChallengeWindow = period - miner6.WPoStProvingPeriod = period * abi.ChainEpoch(miner6.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner6.WPoStDisputeWindow = period * 30 - - miner7.WPoStChallengeWindow = period - miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner7.WPoStDisputeWindow = period * 30 - - miner8.WPoStChallengeWindow = period - miner8.WPoStProvingPeriod = period * abi.ChainEpoch(miner8.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner8.WPoStDisputeWindow = period * 30 - + + miner0.WPoStChallengeWindow = period + miner0.WPoStProvingPeriod = period * abi.ChainEpoch(miner0.WPoStPeriodDeadlines) + + + miner2.WPoStChallengeWindow = period + miner2.WPoStProvingPeriod = period * abi.ChainEpoch(miner2.WPoStPeriodDeadlines) + + + miner3.WPoStChallengeWindow = period + miner3.WPoStProvingPeriod = period * abi.ChainEpoch(miner3.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner3.WPoStDisputeWindow = period * 30 + + + miner4.WPoStChallengeWindow = period + miner4.WPoStProvingPeriod = period * abi.ChainEpoch(miner4.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner4.WPoStDisputeWindow = period * 30 + + + miner5.WPoStChallengeWindow = period + miner5.WPoStProvingPeriod = period * abi.ChainEpoch(miner5.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner5.WPoStDisputeWindow = period * 30 + + + miner6.WPoStChallengeWindow = period + miner6.WPoStProvingPeriod = period * abi.ChainEpoch(miner6.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner6.WPoStDisputeWindow = period * 30 + + + miner7.WPoStChallengeWindow = period + miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner7.WPoStDisputeWindow = period * 30 + + + miner8.WPoStChallengeWindow = period + miner8.WPoStProvingPeriod = period * abi.ChainEpoch(miner8.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner8.WPoStDisputeWindow = period * 30 + + } func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { @@ -503,31 +603,31 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) { return 0, err } switch v { - - case actors.Version0: - return miner0.AddressedSectorsMax, nil - - case actors.Version2: - return miner2.AddressedSectorsMax, nil - - case actors.Version3: - return miner3.AddressedSectorsMax, nil - - case actors.Version4: - return miner4.AddressedSectorsMax, nil - - case actors.Version5: - return miner5.AddressedSectorsMax, nil - - case actors.Version6: - return miner6.AddressedSectorsMax, nil - - case actors.Version7: - return miner7.AddressedSectorsMax, nil - - case actors.Version8: - return miner8.AddressedSectorsMax, nil - + + case actors.Version0: + return miner0.AddressedSectorsMax, nil + + case actors.Version2: + return miner2.AddressedSectorsMax, nil + + case actors.Version3: + return miner3.AddressedSectorsMax, nil + + case actors.Version4: + return miner4.AddressedSectorsMax, nil + + case actors.Version5: + return miner5.AddressedSectorsMax, nil + + case actors.Version6: + return miner6.AddressedSectorsMax, nil + + case actors.Version7: + return miner7.AddressedSectorsMax, nil + + case actors.Version8: + return miner8.AddressedSectorsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -539,128 +639,152 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) { return 0, err } switch v { - - case actors.Version0: - - // TODO: Should we instead error here since the concept doesn't exist yet? - return miner0.AddressedPartitionsMax, nil - - case actors.Version2: - - return miner2.DeclarationsMax, nil - - case actors.Version3: - - return miner3.DeclarationsMax, nil - - case actors.Version4: - - return miner4.DeclarationsMax, nil - - case actors.Version5: - - return miner5.DeclarationsMax, nil - - case actors.Version6: - - return miner6.DeclarationsMax, nil - - case actors.Version7: - - return miner7.DeclarationsMax, nil - - case actors.Version8: - - return miner8.DeclarationsMax, nil - + + case actors.Version0: + + // TODO: Should we instead error here since the concept doesn't exist yet? + return miner0.AddressedPartitionsMax, nil + + + case actors.Version2: + + return miner2.DeclarationsMax, nil + + + case actors.Version3: + + return miner3.DeclarationsMax, nil + + + case actors.Version4: + + return miner4.DeclarationsMax, nil + + + case actors.Version5: + + return miner5.DeclarationsMax, nil + + + case actors.Version6: + + return miner6.DeclarationsMax, nil + + + case actors.Version7: + + return miner7.DeclarationsMax, nil + + + case actors.Version8: + + return miner8.DeclarationsMax, nil + + default: return 0, xerrors.Errorf("unsupported network version") } } func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actors.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { - - case actors.Version0: - - return big.Zero(), nil - - case actors.Version2: - - return big.Zero(), nil - - case actors.Version3: - - return big.Zero(), nil - - case actors.Version4: - - return big.Zero(), nil - - case actors.Version5: - - return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil - - case actors.Version6: - - return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - - case actors.Version7: - - return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - - case actors.Version8: - - return miner8.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - + + case actors.Version0: + + return big.Zero(), nil + + + case actors.Version2: + + return big.Zero(), nil + + + case actors.Version3: + + return big.Zero(), nil + + + case actors.Version4: + + return big.Zero(), nil + + + case actors.Version5: + + return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil + + + case actors.Version6: + + return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + + + case actors.Version7: + + return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + + + case actors.Version8: + + return miner8.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + + default: return big.Zero(), xerrors.Errorf("unsupported network version") } } func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actors.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { - - case actors.Version0: - - return big.Zero(), nil - - case actors.Version2: - - return big.Zero(), nil - - case actors.Version3: - - return big.Zero(), nil - - case actors.Version4: - - return big.Zero(), nil - - case actors.Version5: - - return big.Zero(), nil - - case actors.Version6: - - return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - - case actors.Version7: - - return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - - case actors.Version8: - - return miner8.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - + + case actors.Version0: + + return big.Zero(), nil + + + case actors.Version2: + + return big.Zero(), nil + + + case actors.Version3: + + return big.Zero(), nil + + + case actors.Version4: + + return big.Zero(), nil + + + case actors.Version5: + + return big.Zero(), nil + + + case actors.Version6: + + return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + + + case actors.Version7: + + return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + + + case actors.Version8: + + return miner8.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + + default: return big.Zero(), xerrors.Errorf("unsupported network version") } From efa57bbd1f2ea79f634edb312aff43e2743bb090 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 14:29:52 +0300 Subject: [PATCH 007/228] make agen gofmt --- chain/actors/agen/main.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/chain/actors/agen/main.go b/chain/actors/agen/main.go index 9a3b8fd20..d07c039dd 100644 --- a/chain/actors/agen/main.go +++ b/chain/actors/agen/main.go @@ -3,6 +3,7 @@ package main import ( "bytes" "fmt" + "go/format" "io/ioutil" "os" "path/filepath" @@ -77,7 +78,12 @@ func generateAdapters() error { return err } - if err := ioutil.WriteFile(filepath.Join(actDir, fmt.Sprintf("%s.go", act)), b.Bytes(), 0666); err != nil { + fmted, err := format.Source(b.Bytes()) + if err != nil { + return err + } + + if err := ioutil.WriteFile(filepath.Join(actDir, fmt.Sprintf("%s.go", act)), fmted, 0666); err != nil { return err } } From 7712fc044e487193492e1612c21dad379e56c8ad Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 14:30:42 +0300 Subject: [PATCH 008/228] rerun agen to gofmt --- chain/actors/builtin/account/account.go | 89 +++++++------ chain/actors/builtin/cron/cron.go | 12 +- chain/actors/builtin/init/init.go | 89 +++++++------ chain/actors/builtin/market/market.go | 149 +++++++++++----------- chain/actors/builtin/miner/miner.go | 95 +++++++------- chain/actors/builtin/multisig/multisig.go | 89 +++++++------ chain/actors/builtin/paych/paych.go | 89 +++++++------ chain/actors/builtin/power/power.go | 89 +++++++------ chain/actors/builtin/reward/reward.go | 91 +++++++------ chain/actors/builtin/system/system.go | 14 +- chain/actors/builtin/verifreg/verifreg.go | 92 ++++++------- 11 files changed, 443 insertions(+), 455 deletions(-) diff --git a/chain/actors/builtin/account/account.go b/chain/actors/builtin/account/account.go index d530ed6c5..f40f846c8 100644 --- a/chain/actors/builtin/account/account.go +++ b/chain/actors/builtin/account/account.go @@ -27,7 +27,6 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - ) func init() { @@ -37,7 +36,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version0, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load0(store, root) }) } @@ -47,7 +46,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version2, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) } @@ -57,7 +56,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version3, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) } @@ -67,7 +66,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version4, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) } @@ -77,7 +76,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version5, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) } @@ -87,7 +86,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version6, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) } @@ -97,7 +96,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version7, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) } @@ -107,7 +106,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version8, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) } @@ -117,39 +116,39 @@ var Methods = builtin4.MethodsAccount func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { - if name != "account" { - return nil, xerrors.Errorf("actor code is not account: %s", name) - } + if name != "account" { + return nil, xerrors.Errorf("actor code is not account: %s", name) + } - switch av { - - case actors.Version0: - return load0(store, act.Head) - - case actors.Version2: - return load2(store, act.Head) - - case actors.Version3: - return load3(store, act.Head) - - case actors.Version4: - return load4(store, act.Head) - - case actors.Version5: - return load5(store, act.Head) - - case actors.Version6: - return load6(store, act.Head) - - case actors.Version7: - return load7(store, act.Head) - - case actors.Version8: - return load8(store, act.Head) - - default: - return nil, xerrors.Errorf("unknown actor version: %d", av) - } + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } } switch act.Code { @@ -209,14 +208,14 @@ func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, case actors.Version8: return make8(store, addr) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "account"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "account"); ok { + return c, nil + } switch av { diff --git a/chain/actors/builtin/cron/cron.go b/chain/actors/builtin/cron/cron.go index c4d194176..268d28569 100644 --- a/chain/actors/builtin/cron/cron.go +++ b/chain/actors/builtin/cron/cron.go @@ -3,8 +3,8 @@ package cron import ( "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" - "golang.org/x/xerrors" "github.com/ipfs/go-cid" + "golang.org/x/xerrors" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -21,7 +21,6 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - ) func MakeState(store adt.Store, av actors.Version) (State, error) { @@ -51,14 +50,14 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "cron"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "cron"); ok { + return c, nil + } switch av { @@ -96,7 +95,6 @@ var ( Methods = builtin8.MethodsCron ) - type State interface { GetState() interface{} } diff --git a/chain/actors/builtin/init/init.go b/chain/actors/builtin/init/init.go index 3174b3675..8ef377b07 100644 --- a/chain/actors/builtin/init/init.go +++ b/chain/actors/builtin/init/init.go @@ -29,7 +29,6 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - ) func init() { @@ -39,7 +38,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version0, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load0(store, root) }) } @@ -49,7 +48,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version2, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) } @@ -59,7 +58,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version3, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) } @@ -69,7 +68,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version4, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) } @@ -79,7 +78,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version5, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) } @@ -89,7 +88,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version6, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) } @@ -99,7 +98,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version7, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) } @@ -109,7 +108,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version8, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) } @@ -122,39 +121,39 @@ var ( func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { - if name != "init" { - return nil, xerrors.Errorf("actor code is not init: %s", name) - } + if name != "init" { + return nil, xerrors.Errorf("actor code is not init: %s", name) + } - switch av { - - case actors.Version0: - return load0(store, act.Head) - - case actors.Version2: - return load2(store, act.Head) - - case actors.Version3: - return load3(store, act.Head) - - case actors.Version4: - return load4(store, act.Head) - - case actors.Version5: - return load5(store, act.Head) - - case actors.Version6: - return load6(store, act.Head) - - case actors.Version7: - return load7(store, act.Head) - - case actors.Version8: - return load8(store, act.Head) - - default: - return nil, xerrors.Errorf("unknown actor version: %d", av) - } + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } } switch act.Code { @@ -214,14 +213,14 @@ func MakeState(store adt.Store, av actors.Version, networkName string) (State, e case actors.Version8: return make8(store, networkName) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "init"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "init"); ok { + return c, nil + } switch av { diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index d17cd6290..5f21a376a 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -29,9 +29,8 @@ import ( builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" ) @@ -43,7 +42,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version0, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load0(store, root) }) } @@ -53,7 +52,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version2, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) } @@ -63,7 +62,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version3, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) } @@ -73,7 +72,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version4, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) } @@ -83,7 +82,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version5, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) } @@ -93,7 +92,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version6, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) } @@ -103,7 +102,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version7, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) } @@ -113,7 +112,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version8, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) } @@ -126,39 +125,39 @@ var ( func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { - if name != "storagemarket" { - return nil, xerrors.Errorf("actor code is not storagemarket: %s", name) - } + if name != "storagemarket" { + return nil, xerrors.Errorf("actor code is not storagemarket: %s", name) + } - switch av { - - case actors.Version0: - return load0(store, act.Head) - - case actors.Version2: - return load2(store, act.Head) - - case actors.Version3: - return load3(store, act.Head) - - case actors.Version4: - return load4(store, act.Head) - - case actors.Version5: - return load5(store, act.Head) - - case actors.Version6: - return load6(store, act.Head) - - case actors.Version7: - return load7(store, act.Head) - - case actors.Version8: - return load8(store, act.Head) - - default: - return nil, xerrors.Errorf("unknown actor version: %d", av) - } + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } } switch act.Code { @@ -218,14 +217,14 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "storagemarket"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "storagemarket"); ok { + return c, nil + } switch av { @@ -299,7 +298,7 @@ type DealProposals interface { type PublishStorageDealsParams = market0.PublishStorageDealsParams type PublishStorageDealsReturn interface { - DealIDs() ([]abi.DealID, error) + DealIDs() ([]abi.DealID, error) // Note that this index is based on the batch of deals that were published, NOT the DealID IsDealValid(index uint64) (bool, error) } @@ -336,7 +335,7 @@ func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStora case actors.Version8: return decodePublishStorageDealsReturn8(b) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -352,67 +351,67 @@ type DealState struct { } type DealProposal struct { - PieceCID cid.Cid - PieceSize abi.PaddedPieceSize - VerifiedDeal bool - Client address.Address - Provider address.Address - Label string - StartEpoch abi.ChainEpoch - EndEpoch abi.ChainEpoch + PieceCID cid.Cid + PieceSize abi.PaddedPieceSize + VerifiedDeal bool + Client address.Address + Provider address.Address + Label string + StartEpoch abi.ChainEpoch + EndEpoch abi.ChainEpoch StoragePricePerEpoch abi.TokenAmount - ProviderCollateral abi.TokenAmount - ClientCollateral abi.TokenAmount + ProviderCollateral abi.TokenAmount + ClientCollateral abi.TokenAmount } type DealStateChanges struct { - Added []DealIDState + Added []DealIDState Modified []DealStateChange - Removed []DealIDState + Removed []DealIDState } type DealIDState struct { - ID abi.DealID + ID abi.DealID Deal DealState } // DealStateChange is a change in deal state from -> to type DealStateChange struct { - ID abi.DealID + ID abi.DealID From *DealState - To *DealState + To *DealState } type DealProposalChanges struct { - Added []ProposalIDState + Added []ProposalIDState Removed []ProposalIDState } type ProposalIDState struct { - ID abi.DealID + ID abi.DealID Proposal DealProposal } func EmptyDealState() *DealState { return &DealState{ SectorStartEpoch: -1, - SlashEpoch: -1, + SlashEpoch: -1, LastUpdatedEpoch: -1, } } // returns the earned fees and pending fees for a given deal func (deal DealProposal) GetDealFees(height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) { - tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) + tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch))) - ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) - if ef.LessThan(big.Zero()) { - ef = big.Zero() - } + ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch))) + if ef.LessThan(big.Zero()) { + ef = big.Zero() + } - if ef.GreaterThan(tf) { - ef = tf - } + if ef.GreaterThan(tf) { + ef = tf + } - return ef, big.Sub(tf, ef) + return ef, big.Sub(tf, ef) } diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index a3e367aeb..eb339c33f 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -40,7 +40,6 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - ) func init() { @@ -50,7 +49,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version0, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load0(store, root) }) } @@ -60,7 +59,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version2, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) } @@ -70,7 +69,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version3, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) } @@ -80,7 +79,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version4, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) } @@ -90,7 +89,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version5, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) } @@ -100,7 +99,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version6, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) } @@ -110,7 +109,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version7, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) } @@ -120,7 +119,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version8, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) } @@ -145,39 +144,39 @@ var AddressedSectorsMax = miner2.AddressedSectorsMax func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { - if name != "storageminer" { - return nil, xerrors.Errorf("actor code is not storageminer: %s", name) - } + if name != "storageminer" { + return nil, xerrors.Errorf("actor code is not storageminer: %s", name) + } - switch av { - - case actors.Version0: - return load0(store, act.Head) - - case actors.Version2: - return load2(store, act.Head) - - case actors.Version3: - return load3(store, act.Head) - - case actors.Version4: - return load4(store, act.Head) - - case actors.Version5: - return load5(store, act.Head) - - case actors.Version6: - return load6(store, act.Head) - - case actors.Version7: - return load7(store, act.Head) - - case actors.Version8: - return load8(store, act.Head) - - default: - return nil, xerrors.Errorf("unknown actor version: %d", av) - } + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } } switch act.Code { @@ -206,7 +205,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin8.StorageMinerActorCodeID: return load8(store, act.Head) -} + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -237,14 +236,14 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "storageminer"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "storageminer"); ok { + return c, nil + } switch av { @@ -296,8 +295,8 @@ type State interface { LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error) NumLiveSectors() (uint64, error) IsAllocated(abi.SectorNumber) (bool, error) - // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than - // count if there aren't enough). + // UnallocatedSectorNumbers returns up to count unallocated sector numbers (or less than + // count if there aren't enough). UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) GetAllocatedSectors() (*bitfield.BitField, error) diff --git a/chain/actors/builtin/multisig/multisig.go b/chain/actors/builtin/multisig/multisig.go index 9fd29a6da..34d3083c6 100644 --- a/chain/actors/builtin/multisig/multisig.go +++ b/chain/actors/builtin/multisig/multisig.go @@ -31,7 +31,6 @@ import ( builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -45,7 +44,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version0, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load0(store, root) }) } @@ -55,7 +54,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version2, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) } @@ -65,7 +64,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version3, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) } @@ -75,7 +74,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version4, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) } @@ -85,7 +84,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version5, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) } @@ -95,7 +94,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version6, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) } @@ -105,7 +104,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version7, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) } @@ -115,7 +114,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version8, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) } @@ -123,39 +122,39 @@ func init() { func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { - if name != "multisig" { - return nil, xerrors.Errorf("actor code is not multisig: %s", name) - } + if name != "multisig" { + return nil, xerrors.Errorf("actor code is not multisig: %s", name) + } - switch av { - - case actors.Version0: - return load0(store, act.Head) - - case actors.Version2: - return load2(store, act.Head) - - case actors.Version3: - return load3(store, act.Head) - - case actors.Version4: - return load4(store, act.Head) - - case actors.Version5: - return load5(store, act.Head) - - case actors.Version6: - return load6(store, act.Head) - - case actors.Version7: - return load7(store, act.Head) - - case actors.Version8: - return load8(store, act.Head) - - default: - return nil, xerrors.Errorf("unknown actor version: %d", av) - } + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } } switch act.Code { @@ -215,14 +214,14 @@ func MakeState(store adt.Store, av actors.Version, signers []address.Address, th case actors.Version8: return make8(store, signers, threshold, startEpoch, unlockDuration, initialBalance) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "multisig"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "multisig"); ok { + return c, nil + } switch av { diff --git a/chain/actors/builtin/paych/paych.go b/chain/actors/builtin/paych/paych.go index e9a5ebfba..75ff70a59 100644 --- a/chain/actors/builtin/paych/paych.go +++ b/chain/actors/builtin/paych/paych.go @@ -31,7 +31,6 @@ import ( builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -45,7 +44,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version0, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load0(store, root) }) } @@ -55,7 +54,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version2, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) } @@ -65,7 +64,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version3, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) } @@ -75,7 +74,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version4, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) } @@ -85,7 +84,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version5, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) } @@ -95,7 +94,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version6, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) } @@ -105,7 +104,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version7, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) } @@ -115,7 +114,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version8, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) } @@ -124,39 +123,39 @@ func init() { // Load returns an abstract copy of payment channel state, irregardless of actor version func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { - if name != "paymentchannel" { - return nil, xerrors.Errorf("actor code is not paymentchannel: %s", name) - } + if name != "paymentchannel" { + return nil, xerrors.Errorf("actor code is not paymentchannel: %s", name) + } - switch av { - - case actors.Version0: - return load0(store, act.Head) - - case actors.Version2: - return load2(store, act.Head) - - case actors.Version3: - return load3(store, act.Head) - - case actors.Version4: - return load4(store, act.Head) - - case actors.Version5: - return load5(store, act.Head) - - case actors.Version6: - return load6(store, act.Head) - - case actors.Version7: - return load7(store, act.Head) - - case actors.Version8: - return load8(store, act.Head) - - default: - return nil, xerrors.Errorf("unknown actor version: %d", av) - } + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } } switch act.Code { @@ -216,14 +215,14 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "paymentchannel"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "paymentchannel"); ok { + return c, nil + } switch av { diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go index b995d9086..be0774c86 100644 --- a/chain/actors/builtin/power/power.go +++ b/chain/actors/builtin/power/power.go @@ -30,7 +30,6 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - ) func init() { @@ -40,7 +39,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version0, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load0(store, root) }) } @@ -50,7 +49,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version2, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) } @@ -60,7 +59,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version3, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) } @@ -70,7 +69,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version4, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) } @@ -80,7 +79,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version5, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) } @@ -90,7 +89,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version6, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) } @@ -100,7 +99,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version7, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) } @@ -110,7 +109,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version8, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) } @@ -123,39 +122,39 @@ var ( func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { - if name != "storagepower" { - return nil, xerrors.Errorf("actor code is not storagepower: %s", name) - } + if name != "storagepower" { + return nil, xerrors.Errorf("actor code is not storagepower: %s", name) + } - switch av { - - case actors.Version0: - return load0(store, act.Head) - - case actors.Version2: - return load2(store, act.Head) - - case actors.Version3: - return load3(store, act.Head) - - case actors.Version4: - return load4(store, act.Head) - - case actors.Version5: - return load5(store, act.Head) - - case actors.Version6: - return load6(store, act.Head) - - case actors.Version7: - return load7(store, act.Head) - - case actors.Version8: - return load8(store, act.Head) - - default: - return nil, xerrors.Errorf("unknown actor version: %d", av) - } + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } } switch act.Code { @@ -215,14 +214,14 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "storagepower"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "storagepower"); ok { + return c, nil + } switch av { diff --git a/chain/actors/builtin/reward/reward.go b/chain/actors/builtin/reward/reward.go index 27cd28e74..86c1febe1 100644 --- a/chain/actors/builtin/reward/reward.go +++ b/chain/actors/builtin/reward/reward.go @@ -2,9 +2,9 @@ package reward import ( "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors" reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward" "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/cbor" @@ -25,7 +25,6 @@ import ( builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" @@ -38,7 +37,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version0, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load0(store, root) }) } @@ -48,7 +47,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version2, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) } @@ -58,7 +57,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version3, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) } @@ -68,7 +67,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version4, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) } @@ -78,7 +77,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version5, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) } @@ -88,7 +87,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version6, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) } @@ -98,7 +97,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version7, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) } @@ -108,7 +107,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version8, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) } @@ -121,39 +120,39 @@ var ( func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { - if name != "reward" { - return nil, xerrors.Errorf("actor code is not reward: %s", name) - } + if name != "reward" { + return nil, xerrors.Errorf("actor code is not reward: %s", name) + } - switch av { - - case actors.Version0: - return load0(store, act.Head) - - case actors.Version2: - return load2(store, act.Head) - - case actors.Version3: - return load3(store, act.Head) - - case actors.Version4: - return load4(store, act.Head) - - case actors.Version5: - return load5(store, act.Head) - - case actors.Version6: - return load6(store, act.Head) - - case actors.Version7: - return load7(store, act.Head) - - case actors.Version8: - return load8(store, act.Head) - - default: - return nil, xerrors.Errorf("unknown actor version: %d", av) - } + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } } switch act.Code { @@ -213,14 +212,14 @@ func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.Storage case actors.Version8: return make8(store, currRealizedPower) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "reward"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "reward"); ok { + return c, nil + } switch av { diff --git a/chain/actors/builtin/system/system.go b/chain/actors/builtin/system/system.go index f58711abb..1b653e6fc 100644 --- a/chain/actors/builtin/system/system.go +++ b/chain/actors/builtin/system/system.go @@ -1,11 +1,10 @@ package system import ( - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors" - "golang.org/x/xerrors" + "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/ipfs/go-cid" - + "golang.org/x/xerrors" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -22,7 +21,6 @@ import ( builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - ) var ( @@ -56,14 +54,14 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version8: return make8(store) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "system"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "system"); ok { + return c, nil + } switch av { diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go index c3d4f44a7..aef6a855d 100644 --- a/chain/actors/builtin/verifreg/verifreg.go +++ b/chain/actors/builtin/verifreg/verifreg.go @@ -25,10 +25,9 @@ import ( builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/types" verifreg8 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" ) @@ -40,7 +39,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version0, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load0(store, root) }) } @@ -50,7 +49,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version2, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) } @@ -60,7 +59,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version3, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) } @@ -70,7 +69,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version4, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) } @@ -80,7 +79,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version5, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) } @@ -90,7 +89,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version6, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) } @@ -100,7 +99,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version7, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) } @@ -110,7 +109,7 @@ func init() { }) if c, ok := actors.GetActorCodeID(actors.Version8, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) } @@ -124,39 +123,39 @@ var ( func Load(store adt.Store, act *types.Actor) (State, error) { if name, av, ok := actors.GetActorMetaByCode(act.Code); ok { - if name != "verifiedregistry" { - return nil, xerrors.Errorf("actor code is not verifiedregistry: %s", name) - } + if name != "verifiedregistry" { + return nil, xerrors.Errorf("actor code is not verifiedregistry: %s", name) + } - switch av { - - case actors.Version0: - return load0(store, act.Head) - - case actors.Version2: - return load2(store, act.Head) - - case actors.Version3: - return load3(store, act.Head) - - case actors.Version4: - return load4(store, act.Head) - - case actors.Version5: - return load5(store, act.Head) - - case actors.Version6: - return load6(store, act.Head) - - case actors.Version7: - return load7(store, act.Head) - - case actors.Version8: - return load8(store, act.Head) - - default: - return nil, xerrors.Errorf("unknown actor version: %d", av) - } + switch av { + + case actors.Version0: + return load0(store, act.Head) + + case actors.Version2: + return load2(store, act.Head) + + case actors.Version3: + return load3(store, act.Head) + + case actors.Version4: + return load4(store, act.Head) + + case actors.Version5: + return load5(store, act.Head) + + case actors.Version6: + return load6(store, act.Head) + + case actors.Version7: + return load7(store, act.Head) + + case actors.Version8: + return load8(store, act.Head) + + default: + return nil, xerrors.Errorf("unknown actor version: %d", av) + } } switch act.Code { @@ -216,14 +215,14 @@ func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Addres case actors.Version8: return make8(store, rootKeyAddress) -} + } return nil, xerrors.Errorf("unknown actor version %d", av) } func GetActorCodeID(av actors.Version) (cid.Cid, error) { - if c, ok := actors.GetActorCodeID(av, "verifiedregistry"); ok { - return c, nil - } + if c, ok := actors.GetActorCodeID(av, "verifiedregistry"); ok { + return c, nil + } switch av { @@ -260,6 +259,7 @@ type RemoveDataCapProposal = verifreg8.RemoveDataCapProposal type RemoveDataCapRequest = verifreg8.RemoveDataCapRequest type RemoveDataCapParams = verifreg8.RemoveDataCapParams type RmDcProposalID = verifreg8.RmDcProposalID + const SignatureDomainSeparation_RemoveDataCap = verifreg8.SignatureDomainSeparation_RemoveDataCap type State interface { From c3fb3301abb3917e80871407a561286522e45390 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 17:47:17 +0300 Subject: [PATCH 009/228] embed actors v8 bundle --- build/builtin-actors/README.md | 3 +++ build/builtin_actors.go | 12 ++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 build/builtin-actors/README.md create mode 100644 build/builtin_actors.go diff --git a/build/builtin-actors/README.md b/build/builtin-actors/README.md new file mode 100644 index 000000000..11625b261 --- /dev/null +++ b/build/builtin-actors/README.md @@ -0,0 +1,3 @@ +This directory contains the builtin actors v8 bundle, to be emdedded in the binary. +To change your actor bundle, prior to fixing for nv16 upgrade, generate a bundle using the actor +bundler and place it in this directory, in a file named builtin-actors-v8.car diff --git a/build/builtin_actors.go b/build/builtin_actors.go new file mode 100644 index 000000000..ea9c28ad3 --- /dev/null +++ b/build/builtin_actors.go @@ -0,0 +1,12 @@ +package build + +import ( + _ "embed" +) + +//go:embed builtin-actors/builtin-actors-v8.car +var actorsv8 []byte + +func BuiltinActorsV8Bundle() []byte { + return actorsv8 +} From f26d19ed7dc69adac463249b6598c13bc3bcfcca Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 17:48:13 +0300 Subject: [PATCH 010/228] load actor bundle at startup and initialize the manifest CID from the loaded file --- chain/actors/manifest.go | 6 ++--- chain/consensus/filcns/upgrades.go | 8 +++++- node/builder.go | 1 + node/builder_chain.go | 7 ++++++ node/modules/builtin_actors.go | 40 ++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 node/modules/builtin_actors.go diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go index ac3733737..3c600ecf2 100644 --- a/chain/actors/manifest.go +++ b/chain/actors/manifest.go @@ -12,8 +12,8 @@ import ( "github.com/filecoin-project/specs-actors/v8/actors/builtin/manifest" ) -var manifestCids map[Version]cid.Cid = map[Version]cid.Cid{ - // TODO manifest CIDs for v8 and upwards +var ManifestCids map[Version]cid.Cid = map[Version]cid.Cid{ + // TODO fill in manifest CIDs for v8 and upwards once these are fixed } var manifests map[Version]*manifest.Manifest @@ -30,7 +30,7 @@ func LoadManifests(ctx context.Context, store cbor.IpldStore) error { manifests = make(map[Version]*manifest.Manifest) actorMeta = make(map[cid.Cid]actorEntry) - for av, mfCid := range manifestCids { + for av, mfCid := range ManifestCids { mf := &manifest.Manifest{} if err := adtStore.Get(ctx, mfCid, mf); err != nil { return xerrors.Errorf("error reading manifest for network version %d (cid: %s): %w", av, mfCid, err) diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index ba1d7736b..cced0c0f9 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -36,6 +36,7 @@ import ( "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/multisig" "github.com/filecoin-project/lotus/chain/state" @@ -88,6 +89,11 @@ func legacyPreMigration(f LegacyPreMigrationFunc) stmgr.PreMigrationFunc { func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { var us stmgr.UpgradeSchedule + v8ManifestCid, ok := actors.ManifestCids[actors.Version8] + if !ok { + v8ManifestCid = cid.Undef + } + updates := []stmgr.Upgrade{{ Height: build.UpgradeBreezeHeight, Network: network.Version1, @@ -239,7 +245,7 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { DontStartWithin: 60, StopWithin: 5, }}, - Manifest: cid.Undef, // TODO this should be the real manifest CID + Manifest: v8ManifestCid, Expensive: true, }, } diff --git a/node/builder.go b/node/builder.go index f0106ad97..759d04bbb 100644 --- a/node/builder.go +++ b/node/builder.go @@ -71,6 +71,7 @@ var ( ConnGaterKey = special{12} // libp2p option DAGStoreKey = special{13} // constructor returns multiple values ResourceManagerKey = special{14} // Libp2p option + BuiltinActorsKey = special{15} // builtin actors bundle loading ) type invoke int diff --git a/node/builder_chain.go b/node/builder_chain.go index 226ecac68..5581e5096 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -48,6 +48,13 @@ var ChainNode = Options( // Full node or lite node // TODO: Fix offline mode + // FVM: builtin actor bundle loading + // Note: this has to load before the upgrade schedule, so that we can patch in the + // right manifest cid. + // This restriction will be lifted once we have the final actors v8 bundle and we know + // the manifest cid. + Override(BuiltinActorsKey, modules.LoadBultinActors), + // Consensus settings Override(new(dtypes.DrandSchedule), modules.BuiltinDrandConfig), Override(new(stmgr.UpgradeSchedule), filcns.DefaultUpgradeSchedule()), diff --git a/node/modules/builtin_actors.go b/node/modules/builtin_actors.go new file mode 100644 index 000000000..88cb567d5 --- /dev/null +++ b/node/modules/builtin_actors.go @@ -0,0 +1,40 @@ +package modules + +import ( + "bytes" + + "go.uber.org/fx" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/lotus/node/modules/helpers" + + cbor "github.com/ipfs/go-ipld-cbor" + car "github.com/ipld/go-car" +) + +func LoadBultinActors(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.UniversalBlockstore) error { + ctx := helpers.LifecycleCtx(mctx, lc) + + // TODO eventually we want this to start with bundle/manifest CIDs and fetch them from IPFS if + // not already loaded. + // For now, we just embed the v8 bundle and adjust the manifest CIDs for the migration/actor + // metadata. + blobr := bytes.NewReader(build.BuiltinActorsV8Bundle()) + hdr, err := car.LoadCar(ctx, bs, blobr) + if err != nil { + return xerrors.Errorf("error loading builtin actors v8 bundle: %w", err) + } + + manifestCid := hdr.Roots[0] + actors.ManifestCids[actors.Version8] = manifestCid + + cborStore := cbor.NewCborStore(bs) + if err := actors.LoadManifests(ctx, cborStore); err != nil { + return xerrors.Errorf("error loading actor manifests: %w", err) + } + + return nil +} From 5e3112fa95824a755a93e30046c9d1490e6df430 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 20:06:49 +0300 Subject: [PATCH 011/228] introduce a marker type for builtin actor loading to make DI work --- node/builder_chain.go | 2 +- node/modules/builtin_actors.go | 8 ++++---- node/modules/chain.go | 5 +++++ node/modules/dtypes/chain.go | 1 + 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/node/builder_chain.go b/node/builder_chain.go index 5581e5096..b4e12e89a 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -57,7 +57,7 @@ var ChainNode = Options( // Consensus settings Override(new(dtypes.DrandSchedule), modules.BuiltinDrandConfig), - Override(new(stmgr.UpgradeSchedule), filcns.DefaultUpgradeSchedule()), + Override(new(stmgr.UpgradeSchedule), modules.UpgradeSchedule), Override(new(dtypes.NetworkName), modules.NetworkName), Override(new(modules.Genesis), modules.ErrorGenesis), Override(new(dtypes.AfterGenesisSet), modules.SetGenesis), diff --git a/node/modules/builtin_actors.go b/node/modules/builtin_actors.go index 88cb567d5..c65ae1a0a 100644 --- a/node/modules/builtin_actors.go +++ b/node/modules/builtin_actors.go @@ -15,7 +15,7 @@ import ( car "github.com/ipld/go-car" ) -func LoadBultinActors(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.UniversalBlockstore) error { +func LoadBultinActors(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.UniversalBlockstore) (result dtypes.BuiltinActorsLoaded, err error) { ctx := helpers.LifecycleCtx(mctx, lc) // TODO eventually we want this to start with bundle/manifest CIDs and fetch them from IPFS if @@ -25,7 +25,7 @@ func LoadBultinActors(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.Univer blobr := bytes.NewReader(build.BuiltinActorsV8Bundle()) hdr, err := car.LoadCar(ctx, bs, blobr) if err != nil { - return xerrors.Errorf("error loading builtin actors v8 bundle: %w", err) + return result, xerrors.Errorf("error loading builtin actors v8 bundle: %w", err) } manifestCid := hdr.Roots[0] @@ -33,8 +33,8 @@ func LoadBultinActors(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.Univer cborStore := cbor.NewCborStore(bs) if err := actors.LoadManifests(ctx, cborStore); err != nil { - return xerrors.Errorf("error loading actor manifests: %w", err) + return result, xerrors.Errorf("error loading actor manifests: %w", err) } - return nil + return result, nil } diff --git a/node/modules/chain.go b/node/modules/chain.go index ff957c9ad..ceb18f316 100644 --- a/node/modules/chain.go +++ b/node/modules/chain.go @@ -18,6 +18,7 @@ import ( "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/beacon" "github.com/filecoin-project/lotus/chain/consensus" + "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/exchange" "github.com/filecoin-project/lotus/chain/gen/slashfilter" "github.com/filecoin-project/lotus/chain/messagepool" @@ -176,3 +177,7 @@ func NewSyncer(params SyncerParams) (*chain.Syncer, error) { func NewSlashFilter(ds dtypes.MetadataDS) *slashfilter.SlashFilter { return slashfilter.New(ds) } + +func UpgradeSchedule(_ dtypes.BuiltinActorsLoaded) stmgr.UpgradeSchedule { + return filcns.DefaultUpgradeSchedule() +} diff --git a/node/modules/dtypes/chain.go b/node/modules/dtypes/chain.go index 0c924c12a..da18b8664 100644 --- a/node/modules/dtypes/chain.go +++ b/node/modules/dtypes/chain.go @@ -2,3 +2,4 @@ package dtypes type NetworkName string type AfterGenesisSet struct{} +type BuiltinActorsLoaded struct{} From 17d72f02a126b21ebaa87f9aef6808e4fec56bb9 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 4 Apr 2022 20:11:19 +0300 Subject: [PATCH 012/228] use a sync.Once for manifest loading to avoid interference from parallel test runs --- chain/actors/manifest.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go index 3c600ecf2..4eecab352 100644 --- a/chain/actors/manifest.go +++ b/chain/actors/manifest.go @@ -2,6 +2,7 @@ package actors import ( "context" + "sync" "golang.org/x/xerrors" @@ -19,12 +20,23 @@ var ManifestCids map[Version]cid.Cid = map[Version]cid.Cid{ var manifests map[Version]*manifest.Manifest var actorMeta map[cid.Cid]actorEntry +var ( + loadOnce sync.Once + loadError error +) + type actorEntry struct { name string version Version } func LoadManifests(ctx context.Context, store cbor.IpldStore) error { + // tests may invoke this concurrently, so we wrap it in a sync.Once + loadOnce.Do(func() { loadError = loadManifests(ctx, store) }) + return loadError +} + +func loadManifests(ctx context.Context, store cbor.IpldStore) error { adtStore := adt.WrapStore(ctx, store) manifests = make(map[Version]*manifest.Manifest) From 10b07ecd209031e0e941f569280c1691dd914d6e Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 6 Apr 2022 10:12:35 +0300 Subject: [PATCH 013/228] update filecoin-ffi --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 38f10cf6f..0c6d69861 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 38f10cf6fa078b989fc774081cd65ba5c53636d8 +Subproject commit 0c6d698610a98c9efcefc58d5277ee8813d80033 From ddede202a8580d0475356dec2bfd63f6ab304e41 Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 6 Apr 2022 10:38:53 +0300 Subject: [PATCH 014/228] update fvm construction --- chain/vm/fvm.go | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index 7c2c340d0..02f5e157e 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -3,6 +3,7 @@ package vm import ( "bytes" "context" + "os" "time" "github.com/ipfs/go-cid" @@ -29,6 +30,7 @@ import ( ffi "github.com/filecoin-project/filecoin-ffi" ffi_cgo "github.com/filecoin-project/filecoin-ffi/cgo" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" @@ -241,9 +243,15 @@ func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { } } - fvmOpts := ffi.FVMOpts{ - FVMVersion: 0, - Externs: &FvmExtern{Rand: opts.Rand, Blockstore: opts.Bstore, lbState: opts.LookbackState, base: opts.StateBase, epoch: opts.Epoch, nv: opts.NetworkVersion}, + fvmopts := &ffi.FVMOpts{ + FVMVersion: 0, + Externs: &FvmExtern{ + Rand: opts.Rand, + Blockstore: opts.Bstore, + lbState: opts.LookbackState, + base: opts.StateBase, + epoch: opts.Epoch, + }, Epoch: opts.Epoch, BaseFee: opts.BaseFee, BaseCircSupply: circToReport, @@ -251,7 +259,21 @@ func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { StateBase: opts.StateBase, } - fvm, err := ffi.CreateFVM(&fvmOpts) + if os.Getenv("LOTUS_USE_FVM_CUSTOM_BUNDLE") == "1" { + av, err := actors.VersionForNetwork(opts.NetworkVersion) + if err != nil { + return nil, xerrors.Errorf("mapping network version to actors version: %w", err) + } + + c, ok := actors.ManifestCids[av] + if !ok { + return nil, xerrors.Errorf("no manifest for custom bundle (actors version %d)", av) + } + + fvmopts.Manifest = c + } + + fvm, err := ffi.CreateFVM(fvmopts) if err != nil { return nil, err } From a8547ed84035a13415ecc29a3f9cba21c2a9d9ea Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 6 Apr 2022 11:25:46 +0300 Subject: [PATCH 015/228] make manifest cid access thread-safe --- chain/actors/manifest.go | 19 +++++++++++++++++-- chain/consensus/filcns/upgrades.go | 2 +- chain/vm/fvm.go | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go index 4eecab352..23caa184b 100644 --- a/chain/actors/manifest.go +++ b/chain/actors/manifest.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/specs-actors/v8/actors/builtin/manifest" ) -var ManifestCids map[Version]cid.Cid = map[Version]cid.Cid{ +var manifestCids map[Version]cid.Cid = map[Version]cid.Cid{ // TODO fill in manifest CIDs for v8 and upwards once these are fixed } @@ -30,6 +30,21 @@ type actorEntry struct { version Version } +func AddManifest(av Version, manifestCid cid.Cid) { + manifestMx.Lock() + defer manifestMx.Unlock() + + manifestCids[av] = manifestCid +} + +func GetManifest(av Version) (cid.Cid, bool) { + manifestMx.Lock() + defer manifestMx.Unlock() + + c, ok := manifestCids[av] + return c, ok +} + func LoadManifests(ctx context.Context, store cbor.IpldStore) error { // tests may invoke this concurrently, so we wrap it in a sync.Once loadOnce.Do(func() { loadError = loadManifests(ctx, store) }) @@ -42,7 +57,7 @@ func loadManifests(ctx context.Context, store cbor.IpldStore) error { manifests = make(map[Version]*manifest.Manifest) actorMeta = make(map[cid.Cid]actorEntry) - for av, mfCid := range ManifestCids { + for av, mfCid := range manifestCids { mf := &manifest.Manifest{} if err := adtStore.Get(ctx, mfCid, mf); err != nil { return xerrors.Errorf("error reading manifest for network version %d (cid: %s): %w", av, mfCid, err) diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index cced0c0f9..f580c0aeb 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -89,7 +89,7 @@ func legacyPreMigration(f LegacyPreMigrationFunc) stmgr.PreMigrationFunc { func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { var us stmgr.UpgradeSchedule - v8ManifestCid, ok := actors.ManifestCids[actors.Version8] + v8ManifestCid, ok := actors.GetManifest(actors.Version8) if !ok { v8ManifestCid = cid.Undef } diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index 02f5e157e..5b52dd24e 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -265,7 +265,7 @@ func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { return nil, xerrors.Errorf("mapping network version to actors version: %w", err) } - c, ok := actors.ManifestCids[av] + c, ok := actors.GetManifest(av) if !ok { return nil, xerrors.Errorf("no manifest for custom bundle (actors version %d)", av) } From ad00d5987d4a558bfeb59923e179dabe92b4968a Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 7 Apr 2022 16:23:15 +0300 Subject: [PATCH 016/228] gitignore actor bundles --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 33fbffa3c..b30b96310 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,5 @@ bin/ipget bin/tmp/* .idea scratchpad + +build/builtin-actors/*.car From 34022f3844c50f448ef05d28e650a83970ca3eca Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 7 Apr 2022 16:24:10 +0300 Subject: [PATCH 017/228] add script to fetch bundles --- build/builtin-actors/fetch-bundles.sh | 54 +++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100755 build/builtin-actors/fetch-bundles.sh diff --git a/build/builtin-actors/fetch-bundles.sh b/build/builtin-actors/fetch-bundles.sh new file mode 100755 index 000000000..2b3c9704b --- /dev/null +++ b/build/builtin-actors/fetch-bundles.sh @@ -0,0 +1,54 @@ +#!/bin/bash +set -e + +cd $(dirname "$0") + +actors7_cid="" +actors7_hash="" +actors8_cid="bafybeictmywrut5tprz5fnoti6adfwuvixvrfardhqwldxosmdsfavc56e" +actors8_hash="687b38f59b0c32800f55a8f1f303de214ec173c90e653984d67f393bc41c1416" + +die() { + echo "$1" + exit 1 +} + +check() { + file=$1 + hash=$2 + if [ -e "$file" ]; then + file_hash=$(sha256sum "$file" | cut -d ' ' -f 1) + if [ "$file_hash" == "$hash" ]; then + return 0 + else + return 1 + fi + else + return 1 + fi +} + +fetch() { + output=$1 + cid=$2 + hash=$3 + if (check $output $hash); then + return 0 + else + echo "fetching $cid to $output" + curl -k "https://dweb.link/ipfs/$cid" -o $output + check $output $hash || die "hash mismatch" + fi +} + +if [ ! -z "$actors7_cid" ]; then + fetch builtin-actors-v7.car "$actors7_cid" "$actors7_hash" +else + touch builtin-actors-v7.car +fi + +if [ ! -z "$actors8_cid" ]; then + fetch builtin-actors-v8.car "$actors8_cid" "$actors8_hash" +else + touch builtin-actors-v8.car +fi From a375d532f6c33dfe80d240b8bcd8c2567e46e91d Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 7 Apr 2022 16:34:18 +0300 Subject: [PATCH 018/228] add make rules to fetch actor bundles --- Makefile | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 12f67ca3e..d41763745 100644 --- a/Makefile +++ b/Makefile @@ -57,6 +57,14 @@ build/.update-modules: # end git modules +# builtin actor bundles +builtin-actor-bundles: + ./build/builtin-actors/fetch-bundles.sh + +BUILD_DEPS+=builtin-actor-bundles + +.PHONY: builtin-actor-bundles + ## MAIN BINARIES CLEAN+=build/.update-modules @@ -362,4 +370,4 @@ print-%: @echo $*=$($*) circleci: - go generate -x ./.circleci \ No newline at end of file + go generate -x ./.circleci From 71913521f9f524a8d65953687de5d8b21fe60bb0 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 7 Apr 2022 20:52:43 +0300 Subject: [PATCH 019/228] fix itest migrations --- chain/consensus/filcns/upgrades.go | 44 +++++++++++++++--------------- itests/kit/ensemble_opts_nv.go | 4 +-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index f580c0aeb..24bbc812b 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -61,7 +61,7 @@ type LegacyPreMigrationFunc = func( height abi.ChainEpoch, ts *types.TipSet, ) error -func legacyMigration(f LegacyMigrationFunc) stmgr.MigrationFunc { +func LegacyMigration(f LegacyMigrationFunc) stmgr.MigrationFunc { return func( ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, @@ -74,7 +74,7 @@ func legacyMigration(f LegacyMigrationFunc) stmgr.MigrationFunc { } } -func legacyPreMigration(f LegacyPreMigrationFunc) stmgr.PreMigrationFunc { +func LegacyPreMigration(f LegacyPreMigrationFunc) stmgr.PreMigrationFunc { return func( ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, @@ -97,7 +97,7 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { updates := []stmgr.Upgrade{{ Height: build.UpgradeBreezeHeight, Network: network.Version1, - Migration: legacyMigration(UpgradeFaucetBurnRecovery), + Migration: LegacyMigration(UpgradeFaucetBurnRecovery), Manifest: cid.Undef, }, { Height: build.UpgradeSmokeHeight, @@ -107,18 +107,18 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { }, { Height: build.UpgradeIgnitionHeight, Network: network.Version3, - Migration: legacyMigration(UpgradeIgnition), + Migration: LegacyMigration(UpgradeIgnition), Manifest: cid.Undef, }, { Height: build.UpgradeRefuelHeight, Network: network.Version3, - Migration: legacyMigration(UpgradeRefuel), + Migration: LegacyMigration(UpgradeRefuel), Manifest: cid.Undef, }, { Height: build.UpgradeAssemblyHeight, Network: network.Version4, Expensive: true, - Migration: legacyMigration(UpgradeActorsV2), + Migration: LegacyMigration(UpgradeActorsV2), Manifest: cid.Undef, }, { Height: build.UpgradeTapeHeight, @@ -128,7 +128,7 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { }, { Height: build.UpgradeLiftoffHeight, Network: network.Version5, - Migration: legacyMigration(UpgradeLiftoff), + Migration: LegacyMigration(UpgradeLiftoff), Manifest: cid.Undef, }, { Height: build.UpgradeKumquatHeight, @@ -138,7 +138,7 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { }, { Height: build.UpgradeCalicoHeight, Network: network.Version7, - Migration: legacyMigration(UpgradeCalico), + Migration: LegacyMigration(UpgradeCalico), Manifest: cid.Undef, }, { Height: build.UpgradePersianHeight, @@ -153,14 +153,14 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { }, { Height: build.UpgradeTrustHeight, Network: network.Version10, - Migration: legacyMigration(UpgradeActorsV3), + Migration: LegacyMigration(UpgradeActorsV3), PreMigrations: []stmgr.PreMigration{{ - PreMigration: legacyPreMigration(PreUpgradeActorsV3), + PreMigration: LegacyPreMigration(PreUpgradeActorsV3), StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: legacyPreMigration(PreUpgradeActorsV3), + PreMigration: LegacyPreMigration(PreUpgradeActorsV3), StartWithin: 30, DontStartWithin: 15, StopWithin: 5, @@ -175,14 +175,14 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { }, { Height: build.UpgradeTurboHeight, Network: network.Version12, - Migration: legacyMigration(UpgradeActorsV4), + Migration: LegacyMigration(UpgradeActorsV4), PreMigrations: []stmgr.PreMigration{{ - PreMigration: legacyPreMigration(PreUpgradeActorsV4), + PreMigration: LegacyPreMigration(PreUpgradeActorsV4), StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: legacyPreMigration(PreUpgradeActorsV4), + PreMigration: LegacyPreMigration(PreUpgradeActorsV4), StartWithin: 30, DontStartWithin: 15, StopWithin: 5, @@ -192,14 +192,14 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { }, { Height: build.UpgradeHyperdriveHeight, Network: network.Version13, - Migration: legacyMigration(UpgradeActorsV5), + Migration: LegacyMigration(UpgradeActorsV5), PreMigrations: []stmgr.PreMigration{{ - PreMigration: legacyPreMigration(PreUpgradeActorsV5), + PreMigration: LegacyPreMigration(PreUpgradeActorsV5), StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: legacyPreMigration(PreUpgradeActorsV5), + PreMigration: LegacyPreMigration(PreUpgradeActorsV5), StartWithin: 30, DontStartWithin: 15, StopWithin: 5, @@ -209,14 +209,14 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { }, { Height: build.UpgradeChocolateHeight, Network: network.Version14, - Migration: legacyMigration(UpgradeActorsV6), + Migration: LegacyMigration(UpgradeActorsV6), PreMigrations: []stmgr.PreMigration{{ - PreMigration: legacyPreMigration(PreUpgradeActorsV6), + PreMigration: LegacyPreMigration(PreUpgradeActorsV6), StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: legacyPreMigration(PreUpgradeActorsV6), + PreMigration: LegacyPreMigration(PreUpgradeActorsV6), StartWithin: 30, DontStartWithin: 15, StopWithin: 5, @@ -226,9 +226,9 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { }, { Height: build.UpgradeOhSnapHeight, Network: network.Version15, - Migration: legacyMigration(UpgradeActorsV7), + Migration: LegacyMigration(UpgradeActorsV7), PreMigrations: []stmgr.PreMigration{{ - PreMigration: legacyPreMigration(PreUpgradeActorsV7), + PreMigration: LegacyPreMigration(PreUpgradeActorsV7), StartWithin: 180, DontStartWithin: 60, StopWithin: 5, diff --git a/itests/kit/ensemble_opts_nv.go b/itests/kit/ensemble_opts_nv.go index b51b82bd5..1eeeb5611 100644 --- a/itests/kit/ensemble_opts_nv.go +++ b/itests/kit/ensemble_opts_nv.go @@ -30,7 +30,7 @@ func SDRUpgradeAt(calico, persian abi.ChainEpoch) EnsembleOpt { }, stmgr.Upgrade{ Network: network.Version7, Height: calico, - Migration: filcns.UpgradeCalico, + Migration: filcns.LegacyMigration(filcns.UpgradeCalico), }, stmgr.Upgrade{ Network: network.Version8, Height: persian, @@ -66,6 +66,6 @@ func TurboUpgradeAt(upgradeHeight abi.ChainEpoch) EnsembleOpt { }, stmgr.Upgrade{ Network: network.Version12, Height: upgradeHeight, - Migration: filcns.UpgradeActorsV4, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV4), }) } From c9ac0020d71cf76dff84e1bc9f0e39b8bb8f4143 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 7 Apr 2022 20:59:09 +0300 Subject: [PATCH 020/228] make gateway a variable --- build/builtin-actors/fetch-bundles.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build/builtin-actors/fetch-bundles.sh b/build/builtin-actors/fetch-bundles.sh index 2b3c9704b..49231cd4a 100755 --- a/build/builtin-actors/fetch-bundles.sh +++ b/build/builtin-actors/fetch-bundles.sh @@ -3,6 +3,9 @@ set -e cd $(dirname "$0") +# gateway to use +dweb="dweb.link" + actors7_cid="" actors7_hash="" actors8_cid="bafybeictmywrut5tprz5fnoti6adfwuvixvrfardhqwldxosmdsfavc56e" @@ -36,7 +39,7 @@ fetch() { return 0 else echo "fetching $cid to $output" - curl -k "https://dweb.link/ipfs/$cid" -o $output + curl -k "https://$dweb/ipfs/$cid" -o $output check $output $hash || die "hash mismatch" fi } From 1dbfb3bea90ebbb852f1285782bb2d6276c1e67e Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 7 Apr 2022 20:54:23 +0300 Subject: [PATCH 021/228] fetch builtin actor bundles as part of prepare workflow --- .circleci/config.yml | 20 +++++++++++++++++++- .circleci/template.yml | 20 +++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f863d6817..ca94d2a77 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -48,6 +48,7 @@ commands: - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev - run: git submodule sync - run: git submodule update --init + - fetch_builtin_actors download-params: steps: - restore_cache: @@ -83,6 +84,23 @@ commands: name: fetch all tags command: | git fetch --all + fetch_builtin_actors: + steps: + - restore_cache: + name: restore builtin actors bundle cache + keys: + - 'builtin-actors-v8.car' + paths: + - build/builtin-actors/ + - run: + name: fetch builtin actor bundles + command: | + build/builtin-actors/fetch-bundles.sh + - save_cache: + name: save builtin actors bundle cache + key: 'builtin-actors-v8.car' + paths: + - build/builtin-actors/ packer_build: description: "Run a packer build" @@ -224,7 +242,7 @@ jobs: test-conformance: description: | - Run tests using a corpus of interoperable test vectors for Filecoin + Run tests using a corpus of interoperable test vectors for Filecoin implementations to test their correctness and compliance with the Filecoin specifications. parameters: diff --git a/.circleci/template.yml b/.circleci/template.yml index 82e5bb8f6..0543b3676 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -48,6 +48,7 @@ commands: - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev - run: git submodule sync - run: git submodule update --init + - fetch_builtin_actors download-params: steps: - restore_cache: @@ -83,6 +84,23 @@ commands: name: fetch all tags command: | git fetch --all + fetch_builtin_actors: + steps: + - restore_cache: + name: restore builtin actors bundle cache + keys: + - 'builtin-actors-v8.car' + paths: + - build/builtin-actors/ + - run: + name: fetch builtin actor bundles + command: | + build/builtin-actors/fetch-bundles.sh + - save_cache: + name: save builtin actors bundle cache + key: 'builtin-actors-v8.car' + paths: + - build/builtin-actors/ packer_build: description: "Run a packer build" @@ -224,7 +242,7 @@ jobs: test-conformance: description: | - Run tests using a corpus of interoperable test vectors for Filecoin + Run tests using a corpus of interoperable test vectors for Filecoin implementations to test their correctness and compliance with the Filecoin specifications. parameters: From 44e42bfec8b9a7d69f55856becb4081c6c367761 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 7 Apr 2022 21:37:45 +0300 Subject: [PATCH 022/228] fix sync_test --- chain/sync_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/chain/sync_test.go b/chain/sync_test.go index e97645fe9..491f78090 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -126,27 +126,27 @@ func prepSyncTestWithV5Height(t testing.TB, h int, v5height abi.ChainEpoch) *syn // prepare for upgrade. Network: network.Version9, Height: 1, - Migration: filcns.UpgradeActorsV2, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV2), }, { Network: network.Version10, Height: 2, - Migration: filcns.UpgradeActorsV3, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV3), }, { Network: network.Version12, Height: 3, - Migration: filcns.UpgradeActorsV4, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV4), }, { Network: network.Version13, Height: v5height, - Migration: filcns.UpgradeActorsV5, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV5), }, { Network: network.Version14, Height: v5height + 10, - Migration: filcns.UpgradeActorsV6, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV6), }, { Network: network.Version15, Height: v5height + 15, - Migration: filcns.UpgradeActorsV7, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV7), }, { Network: network.Version16, Height: v5height + 20, From aba27d930ba11223bab9a780962c551f5a117998 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 7 Apr 2022 21:46:23 +0300 Subject: [PATCH 023/228] make gen --- chain/actors/builtin/account/v0.go | 4 +- chain/actors/builtin/account/v2.go | 4 +- chain/actors/builtin/account/v3.go | 4 +- chain/actors/builtin/account/v4.go | 4 +- chain/actors/builtin/account/v5.go | 4 +- chain/actors/builtin/account/v6.go | 4 +- chain/actors/builtin/account/v7.go | 4 +- chain/actors/builtin/account/v8.go | 4 +- chain/actors/builtin/builtin.go | 525 ++++++------ chain/actors/builtin/cron/v0.go | 2 +- chain/actors/builtin/cron/v2.go | 2 +- chain/actors/builtin/cron/v3.go | 2 +- chain/actors/builtin/cron/v4.go | 2 +- chain/actors/builtin/cron/v5.go | 2 +- chain/actors/builtin/cron/v6.go | 2 +- chain/actors/builtin/cron/v7.go | 2 +- chain/actors/builtin/cron/v8.go | 2 +- chain/actors/builtin/init/v0.go | 18 +- chain/actors/builtin/init/v2.go | 18 +- chain/actors/builtin/init/v3.go | 18 +- chain/actors/builtin/init/v4.go | 18 +- chain/actors/builtin/init/v5.go | 18 +- chain/actors/builtin/init/v6.go | 18 +- chain/actors/builtin/init/v7.go | 18 +- chain/actors/builtin/init/v8.go | 18 +- chain/actors/builtin/market/v0.go | 32 +- chain/actors/builtin/market/v2.go | 32 +- chain/actors/builtin/market/v3.go | 24 +- chain/actors/builtin/market/v4.go | 24 +- chain/actors/builtin/market/v5.go | 24 +- chain/actors/builtin/market/v6.go | 22 +- chain/actors/builtin/market/v7.go | 22 +- chain/actors/builtin/market/v8.go | 22 +- chain/actors/builtin/miner/v0.go | 18 +- chain/actors/builtin/miner/v2.go | 64 +- chain/actors/builtin/miner/v3.go | 64 +- chain/actors/builtin/miner/v4.go | 64 +- chain/actors/builtin/miner/v5.go | 64 +- chain/actors/builtin/miner/v6.go | 64 +- chain/actors/builtin/miner/v7.go | 66 +- chain/actors/builtin/miner/v8.go | 66 +- chain/actors/builtin/multisig/message0.go | 3 - chain/actors/builtin/multisig/message2.go | 2 - chain/actors/builtin/multisig/message3.go | 2 - chain/actors/builtin/multisig/message4.go | 2 - chain/actors/builtin/multisig/message5.go | 2 - chain/actors/builtin/multisig/message6.go | 2 - chain/actors/builtin/multisig/message7.go | 2 - chain/actors/builtin/multisig/message8.go | 2 - chain/actors/builtin/multisig/v0.go | 15 +- chain/actors/builtin/multisig/v2.go | 15 +- chain/actors/builtin/multisig/v3.go | 15 +- chain/actors/builtin/multisig/v4.go | 15 +- chain/actors/builtin/multisig/v5.go | 15 +- chain/actors/builtin/multisig/v6.go | 15 +- chain/actors/builtin/multisig/v7.go | 15 +- chain/actors/builtin/multisig/v8.go | 15 +- chain/actors/builtin/paych/message0.go | 6 +- chain/actors/builtin/paych/message2.go | 6 +- chain/actors/builtin/paych/message3.go | 6 +- chain/actors/builtin/paych/message4.go | 6 +- chain/actors/builtin/paych/message5.go | 6 +- chain/actors/builtin/paych/message6.go | 6 +- chain/actors/builtin/paych/message7.go | 6 +- chain/actors/builtin/paych/message8.go | 6 +- chain/actors/builtin/paych/v0.go | 1 - chain/actors/builtin/paych/v2.go | 1 - chain/actors/builtin/paych/v3.go | 1 - chain/actors/builtin/paych/v4.go | 1 - chain/actors/builtin/paych/v5.go | 1 - chain/actors/builtin/paych/v6.go | 1 - chain/actors/builtin/paych/v7.go | 1 - chain/actors/builtin/paych/v8.go | 1 - chain/actors/builtin/power/v0.go | 22 +- chain/actors/builtin/power/v2.go | 22 +- chain/actors/builtin/power/v3.go | 14 +- chain/actors/builtin/power/v4.go | 14 +- chain/actors/builtin/power/v5.go | 14 +- chain/actors/builtin/power/v6.go | 14 +- chain/actors/builtin/power/v7.go | 14 +- chain/actors/builtin/power/v8.go | 14 +- chain/actors/builtin/reward/v2.go | 2 +- chain/actors/builtin/reward/v3.go | 2 +- chain/actors/builtin/reward/v4.go | 2 +- chain/actors/builtin/reward/v5.go | 2 +- chain/actors/builtin/reward/v6.go | 2 +- chain/actors/builtin/reward/v7.go | 2 +- chain/actors/builtin/reward/v8.go | 2 +- chain/actors/builtin/system/v0.go | 2 +- chain/actors/builtin/system/v2.go | 2 +- chain/actors/builtin/system/v3.go | 2 +- chain/actors/builtin/system/v4.go | 2 +- chain/actors/builtin/system/v5.go | 2 +- chain/actors/builtin/system/v6.go | 2 +- chain/actors/builtin/system/v7.go | 2 +- chain/actors/builtin/system/v8.go | 2 +- chain/actors/builtin/verifreg/v0.go | 20 +- chain/actors/builtin/verifreg/v2.go | 20 +- chain/actors/builtin/verifreg/v3.go | 20 +- chain/actors/builtin/verifreg/v4.go | 20 +- chain/actors/builtin/verifreg/v5.go | 20 +- chain/actors/builtin/verifreg/v6.go | 20 +- chain/actors/builtin/verifreg/v7.go | 18 +- chain/actors/builtin/verifreg/v8.go | 18 +- chain/actors/policy/policy.go | 926 ++++++++++------------ 105 files changed, 1304 insertions(+), 1518 deletions(-) diff --git a/chain/actors/builtin/account/v0.go b/chain/actors/builtin/account/v0.go index 2e14abbe0..bdfca2fd7 100644 --- a/chain/actors/builtin/account/v0.go +++ b/chain/actors/builtin/account/v0.go @@ -22,7 +22,7 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, addr address.Address) (State, error) { out := state0{store: store} - out.State = account0.State{Address:addr} + out.State = account0.State{Address: addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state0) PubkeyAddress() (address.Address, error) { func (s *state0) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/account/v2.go b/chain/actors/builtin/account/v2.go index 0f570587f..66618e06a 100644 --- a/chain/actors/builtin/account/v2.go +++ b/chain/actors/builtin/account/v2.go @@ -22,7 +22,7 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, addr address.Address) (State, error) { out := state2{store: store} - out.State = account2.State{Address:addr} + out.State = account2.State{Address: addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state2) PubkeyAddress() (address.Address, error) { func (s *state2) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/account/v3.go b/chain/actors/builtin/account/v3.go index 7a293fb62..dbe100a4f 100644 --- a/chain/actors/builtin/account/v3.go +++ b/chain/actors/builtin/account/v3.go @@ -22,7 +22,7 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, addr address.Address) (State, error) { out := state3{store: store} - out.State = account3.State{Address:addr} + out.State = account3.State{Address: addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state3) PubkeyAddress() (address.Address, error) { func (s *state3) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/account/v4.go b/chain/actors/builtin/account/v4.go index 1c71eb536..53f71dcc5 100644 --- a/chain/actors/builtin/account/v4.go +++ b/chain/actors/builtin/account/v4.go @@ -22,7 +22,7 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, addr address.Address) (State, error) { out := state4{store: store} - out.State = account4.State{Address:addr} + out.State = account4.State{Address: addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state4) PubkeyAddress() (address.Address, error) { func (s *state4) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/account/v5.go b/chain/actors/builtin/account/v5.go index 5ebdee61c..538f56987 100644 --- a/chain/actors/builtin/account/v5.go +++ b/chain/actors/builtin/account/v5.go @@ -22,7 +22,7 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, addr address.Address) (State, error) { out := state5{store: store} - out.State = account5.State{Address:addr} + out.State = account5.State{Address: addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state5) PubkeyAddress() (address.Address, error) { func (s *state5) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/account/v6.go b/chain/actors/builtin/account/v6.go index 895eeb9fe..a0d157ae5 100644 --- a/chain/actors/builtin/account/v6.go +++ b/chain/actors/builtin/account/v6.go @@ -22,7 +22,7 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, addr address.Address) (State, error) { out := state6{store: store} - out.State = account6.State{Address:addr} + out.State = account6.State{Address: addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state6) PubkeyAddress() (address.Address, error) { func (s *state6) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/account/v7.go b/chain/actors/builtin/account/v7.go index e4e58b667..883776cf8 100644 --- a/chain/actors/builtin/account/v7.go +++ b/chain/actors/builtin/account/v7.go @@ -22,7 +22,7 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store, addr address.Address) (State, error) { out := state7{store: store} - out.State = account7.State{Address:addr} + out.State = account7.State{Address: addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state7) PubkeyAddress() (address.Address, error) { func (s *state7) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/account/v8.go b/chain/actors/builtin/account/v8.go index 4d2a24157..5404b3262 100644 --- a/chain/actors/builtin/account/v8.go +++ b/chain/actors/builtin/account/v8.go @@ -22,7 +22,7 @@ func load8(store adt.Store, root cid.Cid) (State, error) { func make8(store adt.Store, addr address.Address) (State, error) { out := state8{store: store} - out.State = account8.State{Address:addr} + out.State = account8.State{Address: addr} return &out, nil } @@ -37,4 +37,4 @@ func (s *state8) PubkeyAddress() (address.Address, error) { func (s *state8) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index 467f63651..62fb73053 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -5,31 +5,29 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" - - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" - smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" - - builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - smoothing8 "github.com/filecoin-project/specs-actors/v8/actors/util/smoothing" - + builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" + smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + smoothing8 "github.com/filecoin-project/specs-actors/v8/actors/util/smoothing" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" @@ -75,55 +73,53 @@ func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, return miner8.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } +func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { - func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v0) //nolint:unconvert - - } + return (FilterEstimate)(v0) //nolint:unconvert - func FromV2FilterEstimate(v2 smoothing2.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v2) - - } +} - func FromV3FilterEstimate(v3 smoothing3.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v3) - - } +func FromV2FilterEstimate(v2 smoothing2.FilterEstimate) FilterEstimate { - func FromV4FilterEstimate(v4 smoothing4.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v4) - - } + return (FilterEstimate)(v2) - func FromV5FilterEstimate(v5 smoothing5.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v5) - - } +} - func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v6) - - } +func FromV3FilterEstimate(v3 smoothing3.FilterEstimate) FilterEstimate { - func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v7) - - } + return (FilterEstimate)(v3) - func FromV8FilterEstimate(v8 smoothing8.FilterEstimate) FilterEstimate { - - return (FilterEstimate)(v8) - - } +} +func FromV4FilterEstimate(v4 smoothing4.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v4) + +} + +func FromV5FilterEstimate(v5 smoothing5.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v5) + +} + +func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v6) + +} + +func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v7) + +} + +func FromV8FilterEstimate(v8 smoothing8.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v8) + +} type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) @@ -143,36 +139,36 @@ func Load(store adt.Store, act *types.Actor) (cbor.Marshaler, error) { func ActorNameByCode(c cid.Cid) string { name, _, ok := actors.GetActorMetaByCode(c) - if ok { - return name + if ok { + return name } switch { - - case builtin0.IsBuiltinActor(c): - return builtin0.ActorNameByCode(c) - - case builtin2.IsBuiltinActor(c): - return builtin2.ActorNameByCode(c) - - case builtin3.IsBuiltinActor(c): - return builtin3.ActorNameByCode(c) - - case builtin4.IsBuiltinActor(c): - return builtin4.ActorNameByCode(c) - - case builtin5.IsBuiltinActor(c): - return builtin5.ActorNameByCode(c) - - case builtin6.IsBuiltinActor(c): - return builtin6.ActorNameByCode(c) - - case builtin7.IsBuiltinActor(c): - return builtin7.ActorNameByCode(c) - - case builtin8.IsBuiltinActor(c): - return builtin8.ActorNameByCode(c) - + + case builtin0.IsBuiltinActor(c): + return builtin0.ActorNameByCode(c) + + case builtin2.IsBuiltinActor(c): + return builtin2.ActorNameByCode(c) + + case builtin3.IsBuiltinActor(c): + return builtin3.ActorNameByCode(c) + + case builtin4.IsBuiltinActor(c): + return builtin4.ActorNameByCode(c) + + case builtin5.IsBuiltinActor(c): + return builtin5.ActorNameByCode(c) + + case builtin6.IsBuiltinActor(c): + return builtin6.ActorNameByCode(c) + + case builtin7.IsBuiltinActor(c): + return builtin7.ActorNameByCode(c) + + case builtin8.IsBuiltinActor(c): + return builtin8.ActorNameByCode(c) + default: return "" } @@ -180,211 +176,206 @@ func ActorNameByCode(c cid.Cid) string { func IsBuiltinActor(c cid.Cid) bool { _, _, ok := actors.GetActorMetaByCode(c) - if ok { - return true + if ok { + return true + } + + if builtin0.IsBuiltinActor(c) { + return true + } + + if builtin2.IsBuiltinActor(c) { + return true + } + + if builtin3.IsBuiltinActor(c) { + return true + } + + if builtin4.IsBuiltinActor(c) { + return true + } + + if builtin5.IsBuiltinActor(c) { + return true + } + + if builtin6.IsBuiltinActor(c) { + return true + } + + if builtin7.IsBuiltinActor(c) { + return true + } + + if builtin8.IsBuiltinActor(c) { + return true } - - if builtin0.IsBuiltinActor(c) { - return true - } - - if builtin2.IsBuiltinActor(c) { - return true - } - - if builtin3.IsBuiltinActor(c) { - return true - } - - if builtin4.IsBuiltinActor(c) { - return true - } - - if builtin5.IsBuiltinActor(c) { - return true - } - - if builtin6.IsBuiltinActor(c) { - return true - } - - if builtin7.IsBuiltinActor(c) { - return true - } - - if builtin8.IsBuiltinActor(c) { - return true - } - return false } func IsAccountActor(c cid.Cid) bool { name, _, ok := actors.GetActorMetaByCode(c) - if ok { - return name == "account" + if ok { + return name == "account" + } + + if c == builtin0.AccountActorCodeID { + return true + } + + if c == builtin2.AccountActorCodeID { + return true + } + + if c == builtin3.AccountActorCodeID { + return true + } + + if c == builtin4.AccountActorCodeID { + return true + } + + if c == builtin5.AccountActorCodeID { + return true + } + + if c == builtin6.AccountActorCodeID { + return true + } + + if c == builtin7.AccountActorCodeID { + return true + } + + if c == builtin8.AccountActorCodeID { + return true } - - if c == builtin0.AccountActorCodeID { - return true - } - - if c == builtin2.AccountActorCodeID { - return true - } - - if c == builtin3.AccountActorCodeID { - return true - } - - if c == builtin4.AccountActorCodeID { - return true - } - - if c == builtin5.AccountActorCodeID { - return true - } - - if c == builtin6.AccountActorCodeID { - return true - } - - if c == builtin7.AccountActorCodeID { - return true - } - - if c == builtin8.AccountActorCodeID { - return true - } - return false } func IsStorageMinerActor(c cid.Cid) bool { name, _, ok := actors.GetActorMetaByCode(c) - if ok { - return name == "storageminer" + if ok { + return name == "storageminer" + } + + if c == builtin0.StorageMinerActorCodeID { + return true + } + + if c == builtin2.StorageMinerActorCodeID { + return true + } + + if c == builtin3.StorageMinerActorCodeID { + return true + } + + if c == builtin4.StorageMinerActorCodeID { + return true + } + + if c == builtin5.StorageMinerActorCodeID { + return true + } + + if c == builtin6.StorageMinerActorCodeID { + return true + } + + if c == builtin7.StorageMinerActorCodeID { + return true + } + + if c == builtin8.StorageMinerActorCodeID { + return true } - - if c == builtin0.StorageMinerActorCodeID { - return true - } - - if c == builtin2.StorageMinerActorCodeID { - return true - } - - if c == builtin3.StorageMinerActorCodeID { - return true - } - - if c == builtin4.StorageMinerActorCodeID { - return true - } - - if c == builtin5.StorageMinerActorCodeID { - return true - } - - if c == builtin6.StorageMinerActorCodeID { - return true - } - - if c == builtin7.StorageMinerActorCodeID { - return true - } - - if c == builtin8.StorageMinerActorCodeID { - return true - } - return false } func IsMultisigActor(c cid.Cid) bool { name, _, ok := actors.GetActorMetaByCode(c) - if ok { - return name == "multisig" + if ok { + return name == "multisig" + } + + if c == builtin0.MultisigActorCodeID { + return true + } + + if c == builtin2.MultisigActorCodeID { + return true + } + + if c == builtin3.MultisigActorCodeID { + return true + } + + if c == builtin4.MultisigActorCodeID { + return true + } + + if c == builtin5.MultisigActorCodeID { + return true + } + + if c == builtin6.MultisigActorCodeID { + return true + } + + if c == builtin7.MultisigActorCodeID { + return true + } + + if c == builtin8.MultisigActorCodeID { + return true } - - if c == builtin0.MultisigActorCodeID { - return true - } - - if c == builtin2.MultisigActorCodeID { - return true - } - - if c == builtin3.MultisigActorCodeID { - return true - } - - if c == builtin4.MultisigActorCodeID { - return true - } - - if c == builtin5.MultisigActorCodeID { - return true - } - - if c == builtin6.MultisigActorCodeID { - return true - } - - if c == builtin7.MultisigActorCodeID { - return true - } - - if c == builtin8.MultisigActorCodeID { - return true - } - return false } func IsPaymentChannelActor(c cid.Cid) bool { name, _, ok := actors.GetActorMetaByCode(c) - if ok { - return name == "paymentchannel" + if ok { + return name == "paymentchannel" + } + + if c == builtin0.PaymentChannelActorCodeID { + return true + } + + if c == builtin2.PaymentChannelActorCodeID { + return true + } + + if c == builtin3.PaymentChannelActorCodeID { + return true + } + + if c == builtin4.PaymentChannelActorCodeID { + return true + } + + if c == builtin5.PaymentChannelActorCodeID { + return true + } + + if c == builtin6.PaymentChannelActorCodeID { + return true + } + + if c == builtin7.PaymentChannelActorCodeID { + return true + } + + if c == builtin8.PaymentChannelActorCodeID { + return true } - - if c == builtin0.PaymentChannelActorCodeID { - return true - } - - if c == builtin2.PaymentChannelActorCodeID { - return true - } - - if c == builtin3.PaymentChannelActorCodeID { - return true - } - - if c == builtin4.PaymentChannelActorCodeID { - return true - } - - if c == builtin5.PaymentChannelActorCodeID { - return true - } - - if c == builtin6.PaymentChannelActorCodeID { - return true - } - - if c == builtin7.PaymentChannelActorCodeID { - return true - } - - if c == builtin8.PaymentChannelActorCodeID { - return true - } - return false } diff --git a/chain/actors/builtin/cron/v0.go b/chain/actors/builtin/cron/v0.go index 7b6b26e05..6147b858c 100644 --- a/chain/actors/builtin/cron/v0.go +++ b/chain/actors/builtin/cron/v0.go @@ -32,4 +32,4 @@ type state0 struct { func (s *state0) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/cron/v2.go b/chain/actors/builtin/cron/v2.go index 032435b96..51ca179d9 100644 --- a/chain/actors/builtin/cron/v2.go +++ b/chain/actors/builtin/cron/v2.go @@ -32,4 +32,4 @@ type state2 struct { func (s *state2) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/cron/v3.go b/chain/actors/builtin/cron/v3.go index 62c670b68..ff74d511d 100644 --- a/chain/actors/builtin/cron/v3.go +++ b/chain/actors/builtin/cron/v3.go @@ -32,4 +32,4 @@ type state3 struct { func (s *state3) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/cron/v4.go b/chain/actors/builtin/cron/v4.go index b13ea78ac..1cff8cc28 100644 --- a/chain/actors/builtin/cron/v4.go +++ b/chain/actors/builtin/cron/v4.go @@ -32,4 +32,4 @@ type state4 struct { func (s *state4) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/cron/v5.go b/chain/actors/builtin/cron/v5.go index a60269d83..2bb00dc21 100644 --- a/chain/actors/builtin/cron/v5.go +++ b/chain/actors/builtin/cron/v5.go @@ -32,4 +32,4 @@ type state5 struct { func (s *state5) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/cron/v6.go b/chain/actors/builtin/cron/v6.go index be9ee00c9..8bbadd79f 100644 --- a/chain/actors/builtin/cron/v6.go +++ b/chain/actors/builtin/cron/v6.go @@ -32,4 +32,4 @@ type state6 struct { func (s *state6) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/cron/v7.go b/chain/actors/builtin/cron/v7.go index 67a46f3ff..e5538c89f 100644 --- a/chain/actors/builtin/cron/v7.go +++ b/chain/actors/builtin/cron/v7.go @@ -32,4 +32,4 @@ type state7 struct { func (s *state7) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/cron/v8.go b/chain/actors/builtin/cron/v8.go index 2eec8b47a..97c0aa980 100644 --- a/chain/actors/builtin/cron/v8.go +++ b/chain/actors/builtin/cron/v8.go @@ -32,4 +32,4 @@ type state8 struct { func (s *state8) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/init/v0.go b/chain/actors/builtin/init/v0.go index a5edff01a..ddd2dab94 100644 --- a/chain/actors/builtin/init/v0.go +++ b/chain/actors/builtin/init/v0.go @@ -10,8 +10,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" - - init0 "github.com/filecoin-project/specs-actors/actors/builtin/init" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) @@ -29,14 +27,14 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, networkName string) (State, error) { out := state0{store: store} - - mr, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - out.State = *init0.ConstructState(mr, networkName) - + mr, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *init0.ConstructState(mr, networkName) + return &out, nil } @@ -111,4 +109,4 @@ func (s *state0) AddressMap() (adt.Map, error) { func (s *state0) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/init/v2.go b/chain/actors/builtin/init/v2.go index 5bbd778f9..72e2d56a5 100644 --- a/chain/actors/builtin/init/v2.go +++ b/chain/actors/builtin/init/v2.go @@ -10,8 +10,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" - - init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) @@ -29,14 +27,14 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, networkName string) (State, error) { out := state2{store: store} - - mr, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - out.State = *init2.ConstructState(mr, networkName) - + mr, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *init2.ConstructState(mr, networkName) + return &out, nil } @@ -111,4 +109,4 @@ func (s *state2) AddressMap() (adt.Map, error) { func (s *state2) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/init/v3.go b/chain/actors/builtin/init/v3.go index c1141ba88..4609c94a3 100644 --- a/chain/actors/builtin/init/v3.go +++ b/chain/actors/builtin/init/v3.go @@ -10,10 +10,8 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" - init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init" adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt" ) @@ -31,14 +29,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, networkName string) (State, error) { out := state3{store: store} - - s, err := init3.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init3.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -113,4 +111,4 @@ func (s *state3) AddressMap() (adt.Map, error) { func (s *state3) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/init/v4.go b/chain/actors/builtin/init/v4.go index 17bf03830..dc56d1f19 100644 --- a/chain/actors/builtin/init/v4.go +++ b/chain/actors/builtin/init/v4.go @@ -10,10 +10,8 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" - init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init" adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" ) @@ -31,14 +29,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, networkName string) (State, error) { out := state4{store: store} - - s, err := init4.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init4.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -113,4 +111,4 @@ func (s *state4) AddressMap() (adt.Map, error) { func (s *state4) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/init/v5.go b/chain/actors/builtin/init/v5.go index 3d61513c5..107366de5 100644 --- a/chain/actors/builtin/init/v5.go +++ b/chain/actors/builtin/init/v5.go @@ -10,10 +10,8 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" - init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init" adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt" ) @@ -31,14 +29,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, networkName string) (State, error) { out := state5{store: store} - - s, err := init5.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init5.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -113,4 +111,4 @@ func (s *state5) AddressMap() (adt.Map, error) { func (s *state5) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/init/v6.go b/chain/actors/builtin/init/v6.go index a91c8fda0..a5bd9edfb 100644 --- a/chain/actors/builtin/init/v6.go +++ b/chain/actors/builtin/init/v6.go @@ -10,10 +10,8 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" - init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init" adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt" ) @@ -31,14 +29,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, networkName string) (State, error) { out := state6{store: store} - - s, err := init6.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init6.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -113,4 +111,4 @@ func (s *state6) AddressMap() (adt.Map, error) { func (s *state6) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/init/v7.go b/chain/actors/builtin/init/v7.go index 4cba8f695..341aa52cd 100644 --- a/chain/actors/builtin/init/v7.go +++ b/chain/actors/builtin/init/v7.go @@ -10,10 +10,8 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" - init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" ) @@ -31,14 +29,14 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store, networkName string) (State, error) { out := state7{store: store} - - s, err := init7.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init7.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -113,4 +111,4 @@ func (s *state7) AddressMap() (adt.Map, error) { func (s *state7) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/init/v8.go b/chain/actors/builtin/init/v8.go index 493aae4cf..1fc2859a0 100644 --- a/chain/actors/builtin/init/v8.go +++ b/chain/actors/builtin/init/v8.go @@ -10,10 +10,8 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/node/modules/dtypes" - builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" - init8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/init" adt8 "github.com/filecoin-project/specs-actors/v8/actors/util/adt" ) @@ -31,14 +29,14 @@ func load8(store adt.Store, root cid.Cid) (State, error) { func make8(store adt.Store, networkName string) (State, error) { out := state8{store: store} - - s, err := init8.ConstructState(store, networkName) - if err != nil { - return nil, err - } - out.State = *s - + s, err := init8.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -113,4 +111,4 @@ func (s *state8) AddressMap() (adt.Map, error) { func (s *state8) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/market/v0.go b/chain/actors/builtin/market/v0.go index e883f9b8f..f5a60b229 100644 --- a/chain/actors/builtin/market/v0.go +++ b/chain/actors/builtin/market/v0.go @@ -29,19 +29,19 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store) (State, error) { out := state0{store: store} - - ea, err := adt0.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } + ea, err := adt0.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } + + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *market0.ConstructState(ea, em, em) - out.State = *market0.ConstructState(ea, em, em) - return &out, nil } @@ -247,12 +247,12 @@ type publishStorageDealsReturn0 struct { } func (r *publishStorageDealsReturn0) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn0) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v2.go b/chain/actors/builtin/market/v2.go index 731f48d50..3c6914d0c 100644 --- a/chain/actors/builtin/market/v2.go +++ b/chain/actors/builtin/market/v2.go @@ -29,19 +29,19 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store) (State, error) { out := state2{store: store} - - ea, err := adt2.MakeEmptyArray(store).Root() - if err != nil { - return nil, err - } - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } + ea, err := adt2.MakeEmptyArray(store).Root() + if err != nil { + return nil, err + } + + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *market2.ConstructState(ea, em, em) - out.State = *market2.ConstructState(ea, em, em) - return &out, nil } @@ -247,12 +247,12 @@ type publishStorageDealsReturn2 struct { } func (r *publishStorageDealsReturn2) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn2) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v3.go b/chain/actors/builtin/market/v3.go index c47b0ff52..2409bb05b 100644 --- a/chain/actors/builtin/market/v3.go +++ b/chain/actors/builtin/market/v3.go @@ -29,14 +29,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store) (State, error) { out := state3{store: store} - - s, err := market3.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market3.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -242,12 +242,12 @@ type publishStorageDealsReturn3 struct { } func (r *publishStorageDealsReturn3) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn3) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v4.go b/chain/actors/builtin/market/v4.go index 4904e74a9..4e9011d10 100644 --- a/chain/actors/builtin/market/v4.go +++ b/chain/actors/builtin/market/v4.go @@ -29,14 +29,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store) (State, error) { out := state4{store: store} - - s, err := market4.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market4.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -242,12 +242,12 @@ type publishStorageDealsReturn4 struct { } func (r *publishStorageDealsReturn4) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn4) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v5.go b/chain/actors/builtin/market/v5.go index b1199c188..139a32247 100644 --- a/chain/actors/builtin/market/v5.go +++ b/chain/actors/builtin/market/v5.go @@ -29,14 +29,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store) (State, error) { out := state5{store: store} - - s, err := market5.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market5.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -242,12 +242,12 @@ type publishStorageDealsReturn5 struct { } func (r *publishStorageDealsReturn5) IsDealValid(index uint64) (bool, error) { - - // PublishStorageDeals only succeeded if all deals were valid in this version of actors - return true, nil - + + // PublishStorageDeals only succeeded if all deals were valid in this version of actors + return true, nil + } func (r *publishStorageDealsReturn5) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v6.go b/chain/actors/builtin/market/v6.go index b50b8cb4d..8230f3cf1 100644 --- a/chain/actors/builtin/market/v6.go +++ b/chain/actors/builtin/market/v6.go @@ -29,14 +29,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store) (State, error) { out := state6{store: store} - - s, err := market6.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market6.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -242,11 +242,11 @@ type publishStorageDealsReturn6 struct { } func (r *publishStorageDealsReturn6) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - + + return r.ValidDeals.IsSet(index) + } func (r *publishStorageDealsReturn6) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go index 057e8df7f..553913146 100644 --- a/chain/actors/builtin/market/v7.go +++ b/chain/actors/builtin/market/v7.go @@ -29,14 +29,14 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store) (State, error) { out := state7{store: store} - - s, err := market7.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -242,11 +242,11 @@ type publishStorageDealsReturn7 struct { } func (r *publishStorageDealsReturn7) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - + + return r.ValidDeals.IsSet(index) + } func (r *publishStorageDealsReturn7) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/market/v8.go b/chain/actors/builtin/market/v8.go index 284536dbd..d2e6f9189 100644 --- a/chain/actors/builtin/market/v8.go +++ b/chain/actors/builtin/market/v8.go @@ -29,14 +29,14 @@ func load8(store adt.Store, root cid.Cid) (State, error) { func make8(store adt.Store) (State, error) { out := state8{store: store} - - s, err := market8.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := market8.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -242,11 +242,11 @@ type publishStorageDealsReturn8 struct { } func (r *publishStorageDealsReturn8) IsDealValid(index uint64) (bool, error) { - - return r.ValidDeals.IsSet(index) - + + return r.ValidDeals.IsSet(index) + } func (r *publishStorageDealsReturn8) DealIDs() ([]abi.DealID, error) { - return r.IDs, nil + return r.IDs, nil } diff --git a/chain/actors/builtin/miner/v0.go b/chain/actors/builtin/miner/v0.go index 9f59188f6..8bde8bf73 100644 --- a/chain/actors/builtin/miner/v0.go +++ b/chain/actors/builtin/miner/v0.go @@ -18,7 +18,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) @@ -136,10 +135,10 @@ func (s *state0) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -210,7 +209,7 @@ func (s *state0) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state0) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors) + precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors) if err != nil { return err } @@ -289,7 +288,7 @@ func (s *state0) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -444,10 +443,10 @@ func (s *state0) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state0) EraseAllUnproven() error { - - // field doesn't exist until v2 - return nil - + + // field doesn't exist until v2 + return nil + } func (d *deadline0) LoadPartition(idx uint64) (Partition, error) { @@ -519,7 +518,6 @@ func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v0.InitialPledge, ExpectedDayReward: v0.ExpectedDayReward, ExpectedStoragePledge: v0.ExpectedStoragePledge, - } return info } diff --git a/chain/actors/builtin/miner/v2.go b/chain/actors/builtin/miner/v2.go index d04db9cd6..bbfdd403e 100644 --- a/chain/actors/builtin/miner/v2.go +++ b/chain/actors/builtin/miner/v2.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) @@ -134,10 +133,10 @@ func (s *state2) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -208,7 +207,7 @@ func (s *state2) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state2) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors) + precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors) if err != nil { return err } @@ -287,7 +286,7 @@ func (s *state2) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -442,42 +441,42 @@ func (s *state2) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state2) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner2.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner2.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner2.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) + var part miner2.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil }) + if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline2) LoadPartition(idx uint64) (Partition, error) { @@ -549,7 +548,6 @@ func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v2.InitialPledge, ExpectedDayReward: v2.ExpectedDayReward, ExpectedStoragePledge: v2.ExpectedStoragePledge, - } return info } diff --git a/chain/actors/builtin/miner/v3.go b/chain/actors/builtin/miner/v3.go index 7b4ec4e24..68505918a 100644 --- a/chain/actors/builtin/miner/v3.go +++ b/chain/actors/builtin/miner/v3.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" @@ -136,10 +135,10 @@ func (s *state3) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -210,7 +209,7 @@ func (s *state3) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state3) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth) + precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth) if err != nil { return err } @@ -289,7 +288,7 @@ func (s *state3) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -439,42 +438,42 @@ func (s *state3) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state3) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner3.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner3.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner3.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) + var part miner3.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil }) + if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline3) LoadPartition(idx uint64) (Partition, error) { @@ -550,7 +549,6 @@ func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v3.InitialPledge, ExpectedDayReward: v3.ExpectedDayReward, ExpectedStoragePledge: v3.ExpectedStoragePledge, - } return info } diff --git a/chain/actors/builtin/miner/v4.go b/chain/actors/builtin/miner/v4.go index f4042bdea..5c40d4189 100644 --- a/chain/actors/builtin/miner/v4.go +++ b/chain/actors/builtin/miner/v4.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" @@ -136,10 +135,10 @@ func (s *state4) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -210,7 +209,7 @@ func (s *state4) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state4) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth) + precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth) if err != nil { return err } @@ -289,7 +288,7 @@ func (s *state4) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -439,42 +438,42 @@ func (s *state4) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state4) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner4.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner4.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner4.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) + var part miner4.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil }) + if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline4) LoadPartition(idx uint64) (Partition, error) { @@ -550,7 +549,6 @@ func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v4.InitialPledge, ExpectedDayReward: v4.ExpectedDayReward, ExpectedStoragePledge: v4.ExpectedStoragePledge, - } return info } diff --git a/chain/actors/builtin/miner/v5.go b/chain/actors/builtin/miner/v5.go index 847bf2419..f717934f4 100644 --- a/chain/actors/builtin/miner/v5.go +++ b/chain/actors/builtin/miner/v5.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" @@ -136,10 +135,10 @@ func (s *state5) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. stopErr := errors.New("stop") @@ -210,7 +209,7 @@ func (s *state5) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state5) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth) + precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth) if err != nil { return err } @@ -289,7 +288,7 @@ func (s *state5) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -439,42 +438,42 @@ func (s *state5) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state5) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner5.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner5.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner5.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) + var part miner5.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil }) + if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline5) LoadPartition(idx uint64) (Partition, error) { @@ -550,7 +549,6 @@ func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v5.InitialPledge, ExpectedDayReward: v5.ExpectedDayReward, ExpectedStoragePledge: v5.ExpectedStoragePledge, - } return info } diff --git a/chain/actors/builtin/miner/v6.go b/chain/actors/builtin/miner/v6.go index 6af030cf7..7a9dfb0df 100644 --- a/chain/actors/builtin/miner/v6.go +++ b/chain/actors/builtin/miner/v6.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" @@ -136,10 +135,10 @@ func (s *state6) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will either expire on-time (can be + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. -// 2. If it's faulty, it will expire early within the first 42 entries + // 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. stopErr := errors.New("stop") @@ -210,7 +209,7 @@ func (s *state6) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state6) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth) + precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth) if err != nil { return err } @@ -289,7 +288,7 @@ func (s *state6) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -439,42 +438,42 @@ func (s *state6) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state6) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner6.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner6.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner6.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) + var part miner6.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil }) + if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline6) LoadPartition(idx uint64) (Partition, error) { @@ -550,7 +549,6 @@ func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v6.InitialPledge, ExpectedDayReward: v6.ExpectedDayReward, ExpectedStoragePledge: v6.ExpectedStoragePledge, - } return info } diff --git a/chain/actors/builtin/miner/v7.go b/chain/actors/builtin/miner/v7.go index 0e56f215e..e1b2520e4 100644 --- a/chain/actors/builtin/miner/v7.go +++ b/chain/actors/builtin/miner/v7.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" @@ -136,9 +135,9 @@ func (s *state7) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will expire on-time (can be + // 1. If the sector is non-faulty, it will expire on-time (can be // learned from the sector info). -// 2. If it's faulty, it will expire early within the first 42 entries + // 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. stopErr := errors.New("stop") @@ -209,7 +208,7 @@ func (s *state7) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state7) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) + precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) if err != nil { return err } @@ -288,7 +287,7 @@ func (s *state7) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -438,42 +437,42 @@ func (s *state7) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state7) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner7.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) + var part miner7.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil }) + if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline7) LoadPartition(idx uint64) (Partition, error) { @@ -549,9 +548,8 @@ func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v7.InitialPledge, ExpectedDayReward: v7.ExpectedDayReward, ExpectedStoragePledge: v7.ExpectedStoragePledge, - + SectorKeyCID: v7.SectorKeyCID, - } return info } diff --git a/chain/actors/builtin/miner/v8.go b/chain/actors/builtin/miner/v8.go index 3752af257..82b8d0e20 100644 --- a/chain/actors/builtin/miner/v8.go +++ b/chain/actors/builtin/miner/v8.go @@ -16,7 +16,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" miner8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/miner" @@ -136,9 +135,9 @@ func (s *state8) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. -// 1. If the sector is non-faulty, it will expire on-time (can be + // 1. If the sector is non-faulty, it will expire on-time (can be // learned from the sector info). -// 2. If it's faulty, it will expire early within the first 42 entries + // 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. stopErr := errors.New("stop") @@ -209,7 +208,7 @@ func (s *state8) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOn } func (s *state8) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { -precommitted, err := adt8.AsMap(s.store, s.State.PreCommittedSectors, builtin8.DefaultHamtBitwidth) + precommitted, err := adt8.AsMap(s.store, s.State.PreCommittedSectors, builtin8.DefaultHamtBitwidth) if err != nil { return err } @@ -288,7 +287,7 @@ func (s *state8) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) } unallocatedRuns, err := rle.Subtract( - &rle.RunSliceIterator{Runs: []rle.Run{ {Val: true, Len: abi.MaxSectorNumber} }}, + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, allocatedRuns, ) if err != nil { @@ -438,42 +437,42 @@ func (s *state8) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreC } func (s *state8) EraseAllUnproven() error { - - dls, err := s.State.LoadDeadlines(s.store) + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner8.Deadline) error { + ps, err := dl.PartitionsArray(s.store) if err != nil { return err } - err = dls.ForEach(s.store, func(dindx uint64, dl *miner8.Deadline) error { - ps, err := dl.PartitionsArray(s.store) - if err != nil { - return err - } - - var part miner8.Partition - err = ps.ForEach(&part, func(pindx int64) error { - _ = part.ActivateUnproven() - err = ps.Set(uint64(pindx), &part) - return nil - }) - - if err != nil { - return err - } - - dl.Partitions, err = ps.Root() - if err != nil { - return err - } - - return dls.UpdateDeadline(s.store, dindx, dl) + var part miner8.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil }) + if err != nil { return err } - return s.State.SaveDeadlines(s.store, dls) - + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + } func (d *deadline8) LoadPartition(idx uint64) (Partition, error) { @@ -549,9 +548,8 @@ func fromV8SectorOnChainInfo(v8 miner8.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v8.InitialPledge, ExpectedDayReward: v8.ExpectedDayReward, ExpectedStoragePledge: v8.ExpectedStoragePledge, - + SectorKeyCID: v8.SectorKeyCID, - } return info } diff --git a/chain/actors/builtin/multisig/message0.go b/chain/actors/builtin/multisig/message0.go index 2849d4bb9..dc43a9d5d 100644 --- a/chain/actors/builtin/multisig/message0.go +++ b/chain/actors/builtin/multisig/message0.go @@ -73,8 +73,6 @@ func (m message0) Create( }, nil } - - func (m message0) Propose(msig, to address.Address, amt abi.TokenAmount, method abi.MethodNum, params []byte) (*types.Message, error) { @@ -142,4 +140,3 @@ func (m message0) Cancel(msig address.Address, txID uint64, hashData *ProposalHa Params: enc, }, nil } - diff --git a/chain/actors/builtin/multisig/message2.go b/chain/actors/builtin/multisig/message2.go index 8715fa6c0..da2700d06 100644 --- a/chain/actors/builtin/multisig/message2.go +++ b/chain/actors/builtin/multisig/message2.go @@ -69,5 +69,3 @@ func (m message2) Create( Value: initialAmount, }, nil } - - diff --git a/chain/actors/builtin/multisig/message3.go b/chain/actors/builtin/multisig/message3.go index b58591a96..f5f6d8cdf 100644 --- a/chain/actors/builtin/multisig/message3.go +++ b/chain/actors/builtin/multisig/message3.go @@ -69,5 +69,3 @@ func (m message3) Create( Value: initialAmount, }, nil } - - diff --git a/chain/actors/builtin/multisig/message4.go b/chain/actors/builtin/multisig/message4.go index 601657985..90885aa07 100644 --- a/chain/actors/builtin/multisig/message4.go +++ b/chain/actors/builtin/multisig/message4.go @@ -69,5 +69,3 @@ func (m message4) Create( Value: initialAmount, }, nil } - - diff --git a/chain/actors/builtin/multisig/message5.go b/chain/actors/builtin/multisig/message5.go index ec74f4c5a..9a8110f2c 100644 --- a/chain/actors/builtin/multisig/message5.go +++ b/chain/actors/builtin/multisig/message5.go @@ -69,5 +69,3 @@ func (m message5) Create( Value: initialAmount, }, nil } - - diff --git a/chain/actors/builtin/multisig/message6.go b/chain/actors/builtin/multisig/message6.go index 259fe71ee..b2b95245e 100644 --- a/chain/actors/builtin/multisig/message6.go +++ b/chain/actors/builtin/multisig/message6.go @@ -69,5 +69,3 @@ func (m message6) Create( Value: initialAmount, }, nil } - - diff --git a/chain/actors/builtin/multisig/message7.go b/chain/actors/builtin/multisig/message7.go index 1d6bd2f18..e7fb83e9b 100644 --- a/chain/actors/builtin/multisig/message7.go +++ b/chain/actors/builtin/multisig/message7.go @@ -69,5 +69,3 @@ func (m message7) Create( Value: initialAmount, }, nil } - - diff --git a/chain/actors/builtin/multisig/message8.go b/chain/actors/builtin/multisig/message8.go index 1a97eb074..9852af105 100644 --- a/chain/actors/builtin/multisig/message8.go +++ b/chain/actors/builtin/multisig/message8.go @@ -69,5 +69,3 @@ func (m message8) Create( Value: initialAmount, }, nil } - - diff --git a/chain/actors/builtin/multisig/v0.go b/chain/actors/builtin/multisig/v0.go index 26b4f7d28..973ac9209 100644 --- a/chain/actors/builtin/multisig/v0.go +++ b/chain/actors/builtin/multisig/v0.go @@ -14,7 +14,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" ) @@ -37,14 +36,14 @@ func make0(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v2.go b/chain/actors/builtin/multisig/v2.go index 44e83643a..5b830e695 100644 --- a/chain/actors/builtin/multisig/v2.go +++ b/chain/actors/builtin/multisig/v2.go @@ -14,7 +14,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" ) @@ -37,14 +36,14 @@ func make2(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v3.go b/chain/actors/builtin/multisig/v3.go index d721744fe..c4a2791b7 100644 --- a/chain/actors/builtin/multisig/v3.go +++ b/chain/actors/builtin/multisig/v3.go @@ -14,7 +14,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" msig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig" @@ -39,14 +38,14 @@ func make3(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt3.StoreEmptyMap(store, builtin3.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt3.StoreEmptyMap(store, builtin3.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v4.go b/chain/actors/builtin/multisig/v4.go index 9473daa6e..a35a890f8 100644 --- a/chain/actors/builtin/multisig/v4.go +++ b/chain/actors/builtin/multisig/v4.go @@ -14,7 +14,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" msig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig" @@ -39,14 +38,14 @@ func make4(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt4.StoreEmptyMap(store, builtin4.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt4.StoreEmptyMap(store, builtin4.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v5.go b/chain/actors/builtin/multisig/v5.go index 08ef1dcb5..4ad9aea94 100644 --- a/chain/actors/builtin/multisig/v5.go +++ b/chain/actors/builtin/multisig/v5.go @@ -14,7 +14,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig" @@ -39,14 +38,14 @@ func make5(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt5.StoreEmptyMap(store, builtin5.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt5.StoreEmptyMap(store, builtin5.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v6.go b/chain/actors/builtin/multisig/v6.go index cff943701..fa16494f8 100644 --- a/chain/actors/builtin/multisig/v6.go +++ b/chain/actors/builtin/multisig/v6.go @@ -14,7 +14,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" @@ -39,14 +38,14 @@ func make6(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt6.StoreEmptyMap(store, builtin6.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt6.StoreEmptyMap(store, builtin6.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v7.go b/chain/actors/builtin/multisig/v7.go index ee1d6e131..bbe41f3db 100644 --- a/chain/actors/builtin/multisig/v7.go +++ b/chain/actors/builtin/multisig/v7.go @@ -14,7 +14,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" @@ -39,14 +38,14 @@ func make7(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/multisig/v8.go b/chain/actors/builtin/multisig/v8.go index d768a0385..9ac8224da 100644 --- a/chain/actors/builtin/multisig/v8.go +++ b/chain/actors/builtin/multisig/v8.go @@ -14,7 +14,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" - builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" msig8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/multisig" @@ -39,14 +38,14 @@ func make8(store adt.Store, signers []address.Address, threshold uint64, startEp out.State.StartEpoch = startEpoch out.State.UnlockDuration = unlockDuration out.State.InitialBalance = initialBalance - - em, err := adt8.StoreEmptyMap(store, builtin8.DefaultHamtBitwidth) - if err != nil { - return nil, err - } - out.State.PendingTxns = em - + em, err := adt8.StoreEmptyMap(store, builtin8.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + return &out, nil } diff --git a/chain/actors/builtin/paych/message0.go b/chain/actors/builtin/paych/message0.go index 95e0120d9..7cba977e3 100644 --- a/chain/actors/builtin/paych/message0.go +++ b/chain/actors/builtin/paych/message0.go @@ -39,9 +39,9 @@ func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych0.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message2.go b/chain/actors/builtin/paych/message2.go index f1b7dc8eb..60c7fe16e 100644 --- a/chain/actors/builtin/paych/message2.go +++ b/chain/actors/builtin/paych/message2.go @@ -39,9 +39,9 @@ func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych2.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message3.go b/chain/actors/builtin/paych/message3.go index ba82939d1..04fb35b57 100644 --- a/chain/actors/builtin/paych/message3.go +++ b/chain/actors/builtin/paych/message3.go @@ -39,9 +39,9 @@ func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych3.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message4.go b/chain/actors/builtin/paych/message4.go index e285edd4b..9f5e000d9 100644 --- a/chain/actors/builtin/paych/message4.go +++ b/chain/actors/builtin/paych/message4.go @@ -39,9 +39,9 @@ func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych4.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message5.go b/chain/actors/builtin/paych/message5.go index 00e3b1dcd..71e6b6799 100644 --- a/chain/actors/builtin/paych/message5.go +++ b/chain/actors/builtin/paych/message5.go @@ -39,9 +39,9 @@ func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych5.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message6.go b/chain/actors/builtin/paych/message6.go index 05e690449..7f80bc4a6 100644 --- a/chain/actors/builtin/paych/message6.go +++ b/chain/actors/builtin/paych/message6.go @@ -39,9 +39,9 @@ func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych6.UpdateChannelStateParams{ - - Sv: *sv, - + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message7.go b/chain/actors/builtin/paych/message7.go index 3930c8074..e3ee0d77b 100644 --- a/chain/actors/builtin/paych/message7.go +++ b/chain/actors/builtin/paych/message7.go @@ -39,9 +39,9 @@ func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ - - Sv: toV7SignedVoucher(*sv), - + + Sv: toV7SignedVoucher(*sv), + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message8.go b/chain/actors/builtin/paych/message8.go index 620c6850b..f49f457e8 100644 --- a/chain/actors/builtin/paych/message8.go +++ b/chain/actors/builtin/paych/message8.go @@ -39,9 +39,9 @@ func (m message8) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message8) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych8.UpdateChannelStateParams{ - - Sv: toV8SignedVoucher(*sv), - + + Sv: toV8SignedVoucher(*sv), + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/v0.go b/chain/actors/builtin/paych/v0.go index 4da111619..e9bc30e3d 100644 --- a/chain/actors/builtin/paych/v0.go +++ b/chain/actors/builtin/paych/v0.go @@ -112,4 +112,3 @@ func (ls *laneState0) Redeemed() (big.Int, error) { func (ls *laneState0) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } - diff --git a/chain/actors/builtin/paych/v2.go b/chain/actors/builtin/paych/v2.go index a38563cbf..400305e2f 100644 --- a/chain/actors/builtin/paych/v2.go +++ b/chain/actors/builtin/paych/v2.go @@ -112,4 +112,3 @@ func (ls *laneState2) Redeemed() (big.Int, error) { func (ls *laneState2) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } - diff --git a/chain/actors/builtin/paych/v3.go b/chain/actors/builtin/paych/v3.go index 41fccf77b..1d7c2f94b 100644 --- a/chain/actors/builtin/paych/v3.go +++ b/chain/actors/builtin/paych/v3.go @@ -112,4 +112,3 @@ func (ls *laneState3) Redeemed() (big.Int, error) { func (ls *laneState3) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } - diff --git a/chain/actors/builtin/paych/v4.go b/chain/actors/builtin/paych/v4.go index b98582fc9..b7d1e52a5 100644 --- a/chain/actors/builtin/paych/v4.go +++ b/chain/actors/builtin/paych/v4.go @@ -112,4 +112,3 @@ func (ls *laneState4) Redeemed() (big.Int, error) { func (ls *laneState4) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } - diff --git a/chain/actors/builtin/paych/v5.go b/chain/actors/builtin/paych/v5.go index 51ce6966b..b331a1500 100644 --- a/chain/actors/builtin/paych/v5.go +++ b/chain/actors/builtin/paych/v5.go @@ -112,4 +112,3 @@ func (ls *laneState5) Redeemed() (big.Int, error) { func (ls *laneState5) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } - diff --git a/chain/actors/builtin/paych/v6.go b/chain/actors/builtin/paych/v6.go index 51d27df42..0d60b1f03 100644 --- a/chain/actors/builtin/paych/v6.go +++ b/chain/actors/builtin/paych/v6.go @@ -112,4 +112,3 @@ func (ls *laneState6) Redeemed() (big.Int, error) { func (ls *laneState6) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } - diff --git a/chain/actors/builtin/paych/v7.go b/chain/actors/builtin/paych/v7.go index 57b78fc02..19c801c82 100644 --- a/chain/actors/builtin/paych/v7.go +++ b/chain/actors/builtin/paych/v7.go @@ -113,7 +113,6 @@ func (ls *laneState7) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } - func toV7SignedVoucher(sv SignedVoucher) paych7.SignedVoucher { return paych7.SignedVoucher{ ChannelAddr: sv.ChannelAddr, diff --git a/chain/actors/builtin/paych/v8.go b/chain/actors/builtin/paych/v8.go index 752a160e0..06e724e4c 100644 --- a/chain/actors/builtin/paych/v8.go +++ b/chain/actors/builtin/paych/v8.go @@ -113,7 +113,6 @@ func (ls *laneState8) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } - func toV8SignedVoucher(sv SignedVoucher) paych8.SignedVoucher { return paych8.SignedVoucher{ ChannelAddr: sv.ChannelAddr, diff --git a/chain/actors/builtin/power/v0.go b/chain/actors/builtin/power/v0.go index dd62f48ef..465d16c5c 100644 --- a/chain/actors/builtin/power/v0.go +++ b/chain/actors/builtin/power/v0.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" adt0 "github.com/filecoin-project/specs-actors/actors/util/adt" ) @@ -29,19 +28,18 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store) (State, error) { out := state0{store: store} - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - emm, err := adt0.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - out.State = *power0.ConstructState(em, emm) - + emm, err := adt0.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } + + out.State = *power0.ConstructState(em, emm) return &out, nil } diff --git a/chain/actors/builtin/power/v2.go b/chain/actors/builtin/power/v2.go index 54674c5db..606534cef 100644 --- a/chain/actors/builtin/power/v2.go +++ b/chain/actors/builtin/power/v2.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" ) @@ -29,19 +28,18 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store) (State, error) { out := state2{store: store} - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - emm, err := adt2.MakeEmptyMultimap(store).Root() - if err != nil { - return nil, err - } + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } - out.State = *power2.ConstructState(em, emm) - + emm, err := adt2.MakeEmptyMultimap(store).Root() + if err != nil { + return nil, err + } + + out.State = *power2.ConstructState(em, emm) return &out, nil } diff --git a/chain/actors/builtin/power/v3.go b/chain/actors/builtin/power/v3.go index ecc5efa82..3dec3c63e 100644 --- a/chain/actors/builtin/power/v3.go +++ b/chain/actors/builtin/power/v3.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" @@ -31,14 +30,13 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store) (State, error) { out := state3{store: store} - - s, err := power3.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power3.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/chain/actors/builtin/power/v4.go b/chain/actors/builtin/power/v4.go index ac5f87515..b73eedf5a 100644 --- a/chain/actors/builtin/power/v4.go +++ b/chain/actors/builtin/power/v4.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" @@ -31,14 +30,13 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store) (State, error) { out := state4{store: store} - - s, err := power4.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power4.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/chain/actors/builtin/power/v5.go b/chain/actors/builtin/power/v5.go index 408af81e5..84b23a577 100644 --- a/chain/actors/builtin/power/v5.go +++ b/chain/actors/builtin/power/v5.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power" @@ -31,14 +30,13 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store) (State, error) { out := state5{store: store} - - s, err := power5.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power5.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/chain/actors/builtin/power/v6.go b/chain/actors/builtin/power/v6.go index 73ef6b69d..4273c2c73 100644 --- a/chain/actors/builtin/power/v6.go +++ b/chain/actors/builtin/power/v6.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" @@ -31,14 +30,13 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store) (State, error) { out := state6{store: store} - - s, err := power6.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power6.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/chain/actors/builtin/power/v7.go b/chain/actors/builtin/power/v7.go index 128457248..af1761cb2 100644 --- a/chain/actors/builtin/power/v7.go +++ b/chain/actors/builtin/power/v7.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" @@ -31,14 +30,13 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store) (State, error) { out := state7{store: store} - - s, err := power7.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/chain/actors/builtin/power/v8.go b/chain/actors/builtin/power/v8.go index 17b7d52f7..622dd96ba 100644 --- a/chain/actors/builtin/power/v8.go +++ b/chain/actors/builtin/power/v8.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" - builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" power8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/power" @@ -31,14 +30,13 @@ func load8(store adt.Store, root cid.Cid) (State, error) { func make8(store adt.Store) (State, error) { out := state8{store: store} - - s, err := power8.ConstructState(store) - if err != nil { - return nil, err - } - out.State = *s - + s, err := power8.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s return &out, nil } diff --git a/chain/actors/builtin/reward/v2.go b/chain/actors/builtin/reward/v2.go index fc475782d..08e9a7bc3 100644 --- a/chain/actors/builtin/reward/v2.go +++ b/chain/actors/builtin/reward/v2.go @@ -40,7 +40,7 @@ func (s *state2) ThisEpochReward() (abi.TokenAmount, error) { func (s *state2) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v3.go b/chain/actors/builtin/reward/v3.go index 0029f1e9b..fd9fa56e2 100644 --- a/chain/actors/builtin/reward/v3.go +++ b/chain/actors/builtin/reward/v3.go @@ -40,7 +40,7 @@ func (s *state3) ThisEpochReward() (abi.TokenAmount, error) { func (s *state3) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v4.go b/chain/actors/builtin/reward/v4.go index 721cafc3f..310ca04e8 100644 --- a/chain/actors/builtin/reward/v4.go +++ b/chain/actors/builtin/reward/v4.go @@ -40,7 +40,7 @@ func (s *state4) ThisEpochReward() (abi.TokenAmount, error) { func (s *state4) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v5.go b/chain/actors/builtin/reward/v5.go index cb25b1fb2..7200f7d11 100644 --- a/chain/actors/builtin/reward/v5.go +++ b/chain/actors/builtin/reward/v5.go @@ -40,7 +40,7 @@ func (s *state5) ThisEpochReward() (abi.TokenAmount, error) { func (s *state5) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v6.go b/chain/actors/builtin/reward/v6.go index 37841e6cf..010a3a870 100644 --- a/chain/actors/builtin/reward/v6.go +++ b/chain/actors/builtin/reward/v6.go @@ -40,7 +40,7 @@ func (s *state6) ThisEpochReward() (abi.TokenAmount, error) { func (s *state6) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v7.go b/chain/actors/builtin/reward/v7.go index 66da5720a..368bb3abd 100644 --- a/chain/actors/builtin/reward/v7.go +++ b/chain/actors/builtin/reward/v7.go @@ -40,7 +40,7 @@ func (s *state7) ThisEpochReward() (abi.TokenAmount, error) { func (s *state7) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/reward/v8.go b/chain/actors/builtin/reward/v8.go index 6fce0c06a..23ebf6f57 100644 --- a/chain/actors/builtin/reward/v8.go +++ b/chain/actors/builtin/reward/v8.go @@ -40,7 +40,7 @@ func (s *state8) ThisEpochReward() (abi.TokenAmount, error) { func (s *state8) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { - return builtin.FilterEstimate{ + return builtin.FilterEstimate{ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, }, nil diff --git a/chain/actors/builtin/system/v0.go b/chain/actors/builtin/system/v0.go index 4dee475bd..64c6f53d3 100644 --- a/chain/actors/builtin/system/v0.go +++ b/chain/actors/builtin/system/v0.go @@ -32,4 +32,4 @@ type state0 struct { func (s *state0) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/system/v2.go b/chain/actors/builtin/system/v2.go index 2389a5c22..eb540891c 100644 --- a/chain/actors/builtin/system/v2.go +++ b/chain/actors/builtin/system/v2.go @@ -32,4 +32,4 @@ type state2 struct { func (s *state2) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/system/v3.go b/chain/actors/builtin/system/v3.go index 20e4dc9b2..5b04e189e 100644 --- a/chain/actors/builtin/system/v3.go +++ b/chain/actors/builtin/system/v3.go @@ -32,4 +32,4 @@ type state3 struct { func (s *state3) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/system/v4.go b/chain/actors/builtin/system/v4.go index 1d37b49f1..b6c924978 100644 --- a/chain/actors/builtin/system/v4.go +++ b/chain/actors/builtin/system/v4.go @@ -32,4 +32,4 @@ type state4 struct { func (s *state4) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/system/v5.go b/chain/actors/builtin/system/v5.go index 255ae7b83..77d2a8478 100644 --- a/chain/actors/builtin/system/v5.go +++ b/chain/actors/builtin/system/v5.go @@ -32,4 +32,4 @@ type state5 struct { func (s *state5) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/system/v6.go b/chain/actors/builtin/system/v6.go index c801985c7..689620afb 100644 --- a/chain/actors/builtin/system/v6.go +++ b/chain/actors/builtin/system/v6.go @@ -32,4 +32,4 @@ type state6 struct { func (s *state6) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/system/v7.go b/chain/actors/builtin/system/v7.go index ca33d0314..813add5fb 100644 --- a/chain/actors/builtin/system/v7.go +++ b/chain/actors/builtin/system/v7.go @@ -32,4 +32,4 @@ type state7 struct { func (s *state7) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/system/v8.go b/chain/actors/builtin/system/v8.go index 10f285bcc..b218c7a52 100644 --- a/chain/actors/builtin/system/v8.go +++ b/chain/actors/builtin/system/v8.go @@ -32,4 +32,4 @@ type state8 struct { func (s *state8) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/verifreg/v0.go b/chain/actors/builtin/verifreg/v0.go index e3bf72b70..dcd34c72a 100644 --- a/chain/actors/builtin/verifreg/v0.go +++ b/chain/actors/builtin/verifreg/v0.go @@ -25,14 +25,14 @@ func load0(store adt.Store, root cid.Cid) (State, error) { func make0(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state0{store: store} - - em, err := adt0.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - out.State = *verifreg0.ConstructState(em, rootKeyAddress) - + em, err := adt0.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *verifreg0.ConstructState(em, rootKeyAddress) + return &out, nil } @@ -74,10 +74,10 @@ func (s *state0) verifiers() (adt.Map, error) { } func (s *state0) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state0) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/verifreg/v2.go b/chain/actors/builtin/verifreg/v2.go index 557366ab6..dfe25f054 100644 --- a/chain/actors/builtin/verifreg/v2.go +++ b/chain/actors/builtin/verifreg/v2.go @@ -25,14 +25,14 @@ func load2(store adt.Store, root cid.Cid) (State, error) { func make2(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state2{store: store} - - em, err := adt2.MakeEmptyMap(store).Root() - if err != nil { - return nil, err - } - out.State = *verifreg2.ConstructState(em, rootKeyAddress) - + em, err := adt2.MakeEmptyMap(store).Root() + if err != nil { + return nil, err + } + + out.State = *verifreg2.ConstructState(em, rootKeyAddress) + return &out, nil } @@ -74,10 +74,10 @@ func (s *state2) verifiers() (adt.Map, error) { } func (s *state2) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state2) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/verifreg/v3.go b/chain/actors/builtin/verifreg/v3.go index 90075dcf3..c71c69f92 100644 --- a/chain/actors/builtin/verifreg/v3.go +++ b/chain/actors/builtin/verifreg/v3.go @@ -26,14 +26,14 @@ func load3(store adt.Store, root cid.Cid) (State, error) { func make3(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state3{store: store} - - s, err := verifreg3.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - out.State = *s - + s, err := verifreg3.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -75,10 +75,10 @@ func (s *state3) verifiers() (adt.Map, error) { } func (s *state3) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state3) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/verifreg/v4.go b/chain/actors/builtin/verifreg/v4.go index dc730187d..d3adc5169 100644 --- a/chain/actors/builtin/verifreg/v4.go +++ b/chain/actors/builtin/verifreg/v4.go @@ -26,14 +26,14 @@ func load4(store adt.Store, root cid.Cid) (State, error) { func make4(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state4{store: store} - - s, err := verifreg4.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - out.State = *s - + s, err := verifreg4.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -75,10 +75,10 @@ func (s *state4) verifiers() (adt.Map, error) { } func (s *state4) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state4) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/verifreg/v5.go b/chain/actors/builtin/verifreg/v5.go index 9d5035ffd..2af501af3 100644 --- a/chain/actors/builtin/verifreg/v5.go +++ b/chain/actors/builtin/verifreg/v5.go @@ -26,14 +26,14 @@ func load5(store adt.Store, root cid.Cid) (State, error) { func make5(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state5{store: store} - - s, err := verifreg5.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - out.State = *s - + s, err := verifreg5.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -75,10 +75,10 @@ func (s *state5) verifiers() (adt.Map, error) { } func (s *state5) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state5) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/verifreg/v6.go b/chain/actors/builtin/verifreg/v6.go index 30446d4b7..454c9478f 100644 --- a/chain/actors/builtin/verifreg/v6.go +++ b/chain/actors/builtin/verifreg/v6.go @@ -26,14 +26,14 @@ func load6(store adt.Store, root cid.Cid) (State, error) { func make6(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state6{store: store} - - s, err := verifreg6.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - out.State = *s - + s, err := verifreg6.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -75,10 +75,10 @@ func (s *state6) verifiers() (adt.Map, error) { } func (s *state6) removeDataCapProposalIDs() (adt.Map, error) { - return nil, nil - + return nil, nil + } func (s *state6) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/verifreg/v7.go b/chain/actors/builtin/verifreg/v7.go index 01de7e5ab..3bcfa10bd 100644 --- a/chain/actors/builtin/verifreg/v7.go +++ b/chain/actors/builtin/verifreg/v7.go @@ -26,14 +26,14 @@ func load7(store adt.Store, root cid.Cid) (State, error) { func make7(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state7{store: store} - - s, err := verifreg7.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - out.State = *s - + s, err := verifreg7.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -75,9 +75,9 @@ func (s *state7) verifiers() (adt.Map, error) { } func (s *state7) removeDataCapProposalIDs() (adt.Map, error) { - return adt7.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin7.DefaultHamtBitwidth) + return adt7.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin7.DefaultHamtBitwidth) } func (s *state7) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/builtin/verifreg/v8.go b/chain/actors/builtin/verifreg/v8.go index 1903d0fe4..bb0b19909 100644 --- a/chain/actors/builtin/verifreg/v8.go +++ b/chain/actors/builtin/verifreg/v8.go @@ -26,14 +26,14 @@ func load8(store adt.Store, root cid.Cid) (State, error) { func make8(store adt.Store, rootKeyAddress address.Address) (State, error) { out := state8{store: store} - - s, err := verifreg8.ConstructState(store, rootKeyAddress) - if err != nil { - return nil, err - } - out.State = *s - + s, err := verifreg8.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + return &out, nil } @@ -75,9 +75,9 @@ func (s *state8) verifiers() (adt.Map, error) { } func (s *state8) removeDataCapProposalIDs() (adt.Map, error) { - return adt8.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin8.DefaultHamtBitwidth) + return adt8.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin8.DefaultHamtBitwidth) } func (s *state8) GetState() interface{} { return &s.State -} \ No newline at end of file +} diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index e48a79f24..673bbf57c 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -10,55 +10,45 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/chain/actors" - - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" - power0 "github.com/filecoin-project/specs-actors/actors/builtin/power" - - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg" - - - builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" + + builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin" market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg" - - - builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" + + builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" - - - builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" + + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg" - - - builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market" miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - - - builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" - - - builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" + + builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin" market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" miner8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/miner" verifreg8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/verifreg" - - paych8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/paych" ) @@ -73,45 +63,28 @@ const ( // SetSupportedProofTypes sets supported proof types, across all actor versions. // This should only be used for testing. func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { - - - miner0.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner2.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner2.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner2.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner3.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner3.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner3.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner4.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - miner4.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) - miner4.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner5.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - - - miner8.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) - - + + miner0.SupportedProofTypes = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner2.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner2.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner2.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner3.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner3.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner3.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner4.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner4.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2) + miner4.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner5.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + + miner8.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) AddSupportedProofTypes(types...) } @@ -125,76 +98,59 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { } // Set for all miner versions. - - - miner0.SupportedProofTypes[t] = struct{}{} - - - - miner2.PreCommitSealProofTypesV0[t] = struct{}{} - miner2.PreCommitSealProofTypesV7[t] = struct{}{} - miner2.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner2.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - - - miner3.PreCommitSealProofTypesV0[t] = struct{}{} - miner3.PreCommitSealProofTypesV7[t] = struct{}{} - miner3.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner3.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - - - miner4.PreCommitSealProofTypesV0[t] = struct{}{} - miner4.PreCommitSealProofTypesV7[t] = struct{}{} - miner4.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner4.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - - - - miner5.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err := t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } + miner0.SupportedProofTypes[t] = struct{}{} - miner5.WindowPoStProofTypes[wpp] = struct{}{} - - - - miner6.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } + miner2.PreCommitSealProofTypesV0[t] = struct{}{} + miner2.PreCommitSealProofTypesV7[t] = struct{}{} + miner2.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner2.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner6.WindowPoStProofTypes[wpp] = struct{}{} - - - - miner7.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } + miner3.PreCommitSealProofTypesV0[t] = struct{}{} + miner3.PreCommitSealProofTypesV7[t] = struct{}{} + miner3.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner3.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - miner7.WindowPoStProofTypes[wpp] = struct{}{} - - - - miner8.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} - wpp, err = t.RegisteredWindowPoStProof() - if err != nil { - // Fine to panic, this is a test-only method - panic(err) - } + miner4.PreCommitSealProofTypesV0[t] = struct{}{} + miner4.PreCommitSealProofTypesV7[t] = struct{}{} + miner4.PreCommitSealProofTypesV7[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + miner4.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + + miner5.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err := t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner5.WindowPoStProofTypes[wpp] = struct{}{} + + miner6.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner6.WindowPoStProofTypes[wpp] = struct{}{} + + miner7.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner7.WindowPoStProofTypes[wpp] = struct{}{} + + miner8.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner8.WindowPoStProofTypes[wpp] = struct{}{} - miner8.WindowPoStProofTypes[wpp] = struct{}{} - - } } @@ -202,23 +158,23 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { // actors versions. Use for testing. func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { // Set for all miner versions. - - miner0.PreCommitChallengeDelay = delay - - miner2.PreCommitChallengeDelay = delay - - miner3.PreCommitChallengeDelay = delay - - miner4.PreCommitChallengeDelay = delay - - miner5.PreCommitChallengeDelay = delay - - miner6.PreCommitChallengeDelay = delay - - miner7.PreCommitChallengeDelay = delay - - miner8.PreCommitChallengeDelay = delay - + + miner0.PreCommitChallengeDelay = delay + + miner2.PreCommitChallengeDelay = delay + + miner3.PreCommitChallengeDelay = delay + + miner4.PreCommitChallengeDelay = delay + + miner5.PreCommitChallengeDelay = delay + + miner6.PreCommitChallengeDelay = delay + + miner7.PreCommitChallengeDelay = delay + + miner8.PreCommitChallengeDelay = delay + } // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. @@ -230,120 +186,96 @@ func GetPreCommitChallengeDelay() abi.ChainEpoch { // meet for leader election, across all actor versions. This should only be used // for testing. func SetConsensusMinerMinPower(p abi.StoragePower) { - - - power0.ConsensusMinerMinPower = p - - - - for _, policy := range builtin2.SealProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin3.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin4.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin5.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin6.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin7.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - - - for _, policy := range builtin8.PoStProofPolicies { - policy.ConsensusMinerMinPower = p - } - - + + power0.ConsensusMinerMinPower = p + + for _, policy := range builtin2.SealProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin3.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin4.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin5.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin6.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin7.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + + for _, policy := range builtin8.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + } // SetMinVerifiedDealSize sets the minimum size of a verified deal. This should // only be used for testing. func SetMinVerifiedDealSize(size abi.StoragePower) { - - verifreg0.MinVerifiedDealSize = size - - verifreg2.MinVerifiedDealSize = size - - verifreg3.MinVerifiedDealSize = size - - verifreg4.MinVerifiedDealSize = size - - verifreg5.MinVerifiedDealSize = size - - verifreg6.MinVerifiedDealSize = size - - verifreg7.MinVerifiedDealSize = size - - verifreg8.MinVerifiedDealSize = size - + + verifreg0.MinVerifiedDealSize = size + + verifreg2.MinVerifiedDealSize = size + + verifreg3.MinVerifiedDealSize = size + + verifreg4.MinVerifiedDealSize = size + + verifreg5.MinVerifiedDealSize = size + + verifreg6.MinVerifiedDealSize = size + + verifreg7.MinVerifiedDealSize = size + + verifreg8.MinVerifiedDealSize = size + } func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { switch ver { - - case actors.Version0: - - return miner0.MaxSealDuration[t], nil - - - case actors.Version2: - - return miner2.MaxProveCommitDuration[t], nil - - - case actors.Version3: - - return miner3.MaxProveCommitDuration[t], nil - - - case actors.Version4: - - return miner4.MaxProveCommitDuration[t], nil - - - case actors.Version5: - - return miner5.MaxProveCommitDuration[t], nil - - - case actors.Version6: - - return miner6.MaxProveCommitDuration[t], nil - - - case actors.Version7: - - return miner7.MaxProveCommitDuration[t], nil - - - case actors.Version8: - - return miner8.MaxProveCommitDuration[t], nil - - + + case actors.Version0: + + return miner0.MaxSealDuration[t], nil + + case actors.Version2: + + return miner2.MaxProveCommitDuration[t], nil + + case actors.Version3: + + return miner3.MaxProveCommitDuration[t], nil + + case actors.Version4: + + return miner4.MaxProveCommitDuration[t], nil + + case actors.Version5: + + return miner5.MaxProveCommitDuration[t], nil + + case actors.Version6: + + return miner6.MaxProveCommitDuration[t], nil + + case actors.Version7: + + return miner7.MaxProveCommitDuration[t], nil + + case actors.Version8: + + return miner8.MaxProveCommitDuration[t], nil + default: return 0, xerrors.Errorf("unsupported actors version") } @@ -354,56 +286,40 @@ func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (a // only be used for testing. func SetProviderCollateralSupplyTarget(num, denom big.Int) { - - - market2.ProviderCollateralSupplyTarget = builtin2.BigFrac{ Numerator: num, Denominator: denom, } - - market3.ProviderCollateralSupplyTarget = builtin3.BigFrac{ Numerator: num, Denominator: denom, } - - market4.ProviderCollateralSupplyTarget = builtin4.BigFrac{ Numerator: num, Denominator: denom, } - - market5.ProviderCollateralSupplyTarget = builtin5.BigFrac{ Numerator: num, Denominator: denom, } - - market6.ProviderCollateralSupplyTarget = builtin6.BigFrac{ Numerator: num, Denominator: denom, } - - market7.ProviderCollateralSupplyTarget = builtin7.BigFrac{ Numerator: num, Denominator: denom, } - - market8.ProviderCollateralSupplyTarget = builtin8.BigFrac{ Numerator: num, Denominator: denom, } - } @@ -417,55 +333,47 @@ func DealProviderCollateralBounds( return big.Zero(), big.Zero(), err } switch v { - - case actors.Version0: - - min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) - return min, max, nil - - - case actors.Version2: - - min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version3: - - min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version4: - - min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version5: - - min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version6: - - min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version7: - - min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - - case actors.Version8: - - min, max := market8.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) - return min, max, nil - - + + case actors.Version0: + + min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer) + return min, max, nil + + case actors.Version2: + + min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version3: + + min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version4: + + min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version5: + + min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version6: + + min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version7: + + min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + + case actors.Version8: + + min, max := market8.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + default: return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") } @@ -478,63 +386,55 @@ func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) // Sets the challenge window and scales the proving period to match (such that // there are always 48 challenge windows in a proving period). func SetWPoStChallengeWindow(period abi.ChainEpoch) { - - miner0.WPoStChallengeWindow = period - miner0.WPoStProvingPeriod = period * abi.ChainEpoch(miner0.WPoStPeriodDeadlines) - - - miner2.WPoStChallengeWindow = period - miner2.WPoStProvingPeriod = period * abi.ChainEpoch(miner2.WPoStPeriodDeadlines) - - - miner3.WPoStChallengeWindow = period - miner3.WPoStProvingPeriod = period * abi.ChainEpoch(miner3.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner3.WPoStDisputeWindow = period * 30 - - - miner4.WPoStChallengeWindow = period - miner4.WPoStProvingPeriod = period * abi.ChainEpoch(miner4.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner4.WPoStDisputeWindow = period * 30 - - - miner5.WPoStChallengeWindow = period - miner5.WPoStProvingPeriod = period * abi.ChainEpoch(miner5.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner5.WPoStDisputeWindow = period * 30 - - - miner6.WPoStChallengeWindow = period - miner6.WPoStProvingPeriod = period * abi.ChainEpoch(miner6.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner6.WPoStDisputeWindow = period * 30 - - - miner7.WPoStChallengeWindow = period - miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner7.WPoStDisputeWindow = period * 30 - - - miner8.WPoStChallengeWindow = period - miner8.WPoStProvingPeriod = period * abi.ChainEpoch(miner8.WPoStPeriodDeadlines) - - // by default, this is 2x finality which is 30 periods. - // scale it if we're scaling the challenge period. - miner8.WPoStDisputeWindow = period * 30 - - + + miner0.WPoStChallengeWindow = period + miner0.WPoStProvingPeriod = period * abi.ChainEpoch(miner0.WPoStPeriodDeadlines) + + miner2.WPoStChallengeWindow = period + miner2.WPoStProvingPeriod = period * abi.ChainEpoch(miner2.WPoStPeriodDeadlines) + + miner3.WPoStChallengeWindow = period + miner3.WPoStProvingPeriod = period * abi.ChainEpoch(miner3.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner3.WPoStDisputeWindow = period * 30 + + miner4.WPoStChallengeWindow = period + miner4.WPoStProvingPeriod = period * abi.ChainEpoch(miner4.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner4.WPoStDisputeWindow = period * 30 + + miner5.WPoStChallengeWindow = period + miner5.WPoStProvingPeriod = period * abi.ChainEpoch(miner5.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner5.WPoStDisputeWindow = period * 30 + + miner6.WPoStChallengeWindow = period + miner6.WPoStProvingPeriod = period * abi.ChainEpoch(miner6.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner6.WPoStDisputeWindow = period * 30 + + miner7.WPoStChallengeWindow = period + miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner7.WPoStDisputeWindow = period * 30 + + miner8.WPoStChallengeWindow = period + miner8.WPoStProvingPeriod = period * abi.ChainEpoch(miner8.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner8.WPoStDisputeWindow = period * 30 + } func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { @@ -603,31 +503,31 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) { return 0, err } switch v { - - case actors.Version0: - return miner0.AddressedSectorsMax, nil - - case actors.Version2: - return miner2.AddressedSectorsMax, nil - - case actors.Version3: - return miner3.AddressedSectorsMax, nil - - case actors.Version4: - return miner4.AddressedSectorsMax, nil - - case actors.Version5: - return miner5.AddressedSectorsMax, nil - - case actors.Version6: - return miner6.AddressedSectorsMax, nil - - case actors.Version7: - return miner7.AddressedSectorsMax, nil - - case actors.Version8: - return miner8.AddressedSectorsMax, nil - + + case actors.Version0: + return miner0.AddressedSectorsMax, nil + + case actors.Version2: + return miner2.AddressedSectorsMax, nil + + case actors.Version3: + return miner3.AddressedSectorsMax, nil + + case actors.Version4: + return miner4.AddressedSectorsMax, nil + + case actors.Version5: + return miner5.AddressedSectorsMax, nil + + case actors.Version6: + return miner6.AddressedSectorsMax, nil + + case actors.Version7: + return miner7.AddressedSectorsMax, nil + + case actors.Version8: + return miner8.AddressedSectorsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -639,152 +539,128 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) { return 0, err } switch v { - - case actors.Version0: - - // TODO: Should we instead error here since the concept doesn't exist yet? - return miner0.AddressedPartitionsMax, nil - - - case actors.Version2: - - return miner2.DeclarationsMax, nil - - - case actors.Version3: - - return miner3.DeclarationsMax, nil - - - case actors.Version4: - - return miner4.DeclarationsMax, nil - - - case actors.Version5: - - return miner5.DeclarationsMax, nil - - - case actors.Version6: - - return miner6.DeclarationsMax, nil - - - case actors.Version7: - - return miner7.DeclarationsMax, nil - - - case actors.Version8: - - return miner8.DeclarationsMax, nil - - + + case actors.Version0: + + // TODO: Should we instead error here since the concept doesn't exist yet? + return miner0.AddressedPartitionsMax, nil + + case actors.Version2: + + return miner2.DeclarationsMax, nil + + case actors.Version3: + + return miner3.DeclarationsMax, nil + + case actors.Version4: + + return miner4.DeclarationsMax, nil + + case actors.Version5: + + return miner5.DeclarationsMax, nil + + case actors.Version6: + + return miner6.DeclarationsMax, nil + + case actors.Version7: + + return miner7.DeclarationsMax, nil + + case actors.Version8: + + return miner8.DeclarationsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } } func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actors.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { - - case actors.Version0: - - return big.Zero(), nil - - - case actors.Version2: - - return big.Zero(), nil - - - case actors.Version3: - - return big.Zero(), nil - - - case actors.Version4: - - return big.Zero(), nil - - - case actors.Version5: - - return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil - - - case actors.Version6: - - return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - - - case actors.Version7: - - return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - - - case actors.Version8: - - return miner8.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil - - + + case actors.Version0: + + return big.Zero(), nil + + case actors.Version2: + + return big.Zero(), nil + + case actors.Version3: + + return big.Zero(), nil + + case actors.Version4: + + return big.Zero(), nil + + case actors.Version5: + + return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil + + case actors.Version6: + + return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + + case actors.Version7: + + return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + + case actors.Version8: + + return miner8.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } } func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) { - v, err := actors.VersionForNetwork(nwVer) + v, err := actors.VersionForNetwork(nwVer) if err != nil { return big.Zero(), err } switch v { - - case actors.Version0: - - return big.Zero(), nil - - - case actors.Version2: - - return big.Zero(), nil - - - case actors.Version3: - - return big.Zero(), nil - - - case actors.Version4: - - return big.Zero(), nil - - - case actors.Version5: - - return big.Zero(), nil - - - case actors.Version6: - - return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - - - case actors.Version7: - - return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - - - case actors.Version8: - - return miner8.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil - - + + case actors.Version0: + + return big.Zero(), nil + + case actors.Version2: + + return big.Zero(), nil + + case actors.Version3: + + return big.Zero(), nil + + case actors.Version4: + + return big.Zero(), nil + + case actors.Version5: + + return big.Zero(), nil + + case actors.Version6: + + return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + + case actors.Version7: + + return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + + case actors.Version8: + + return miner8.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } From 3e72a088df1da0a2dd9095150f2d4cf3fe742953 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 7 Apr 2022 21:58:45 +0300 Subject: [PATCH 024/228] fix rand_test --- chain/rand/rand_test.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/chain/rand/rand_test.go b/chain/rand/rand_test.go index b5e2482b7..a4a4c39f0 100644 --- a/chain/rand/rand_test.go +++ b/chain/rand/rand_test.go @@ -93,19 +93,19 @@ func TestNullRandomnessV2(t *testing.T) { // prepare for upgrade. Network: network.Version9, Height: 1, - Migration: filcns.UpgradeActorsV2, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV2), }, { Network: network.Version10, Height: 2, - Migration: filcns.UpgradeActorsV3, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV3), }, { Network: network.Version12, Height: 3, - Migration: filcns.UpgradeActorsV4, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV4), }, { Network: network.Version13, Height: 4, - Migration: filcns.UpgradeActorsV5, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV5), }, } @@ -172,23 +172,23 @@ func TestNullRandomnessV3(t *testing.T) { // prepare for upgrade. Network: network.Version9, Height: 1, - Migration: filcns.UpgradeActorsV2, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV2), }, { Network: network.Version10, Height: 2, - Migration: filcns.UpgradeActorsV3, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV3), }, { Network: network.Version12, Height: 3, - Migration: filcns.UpgradeActorsV4, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV4), }, { Network: network.Version13, Height: 4, - Migration: filcns.UpgradeActorsV5, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV5), }, { Network: network.Version14, Height: 5, - Migration: filcns.UpgradeActorsV6, + Migration: filcns.LegacyMigration(filcns.UpgradeActorsV6), }, } From 36cb76a3220040cf42e002b9928635ca935d9baf Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 7 Apr 2022 22:51:09 +0300 Subject: [PATCH 025/228] genesis depends on actor bundle --- node/modules/genesis.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/node/modules/genesis.go b/node/modules/genesis.go index 03b4e2907..5aea2a5b4 100644 --- a/node/modules/genesis.go +++ b/node/modules/genesis.go @@ -22,8 +22,8 @@ func ErrorGenesis() Genesis { } } -func LoadGenesis(genBytes []byte) func(fx.Lifecycle, helpers.MetricsCtx, dtypes.ChainBlockstore) Genesis { - return func(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.ChainBlockstore) Genesis { +func LoadGenesis(genBytes []byte) func(fx.Lifecycle, helpers.MetricsCtx, dtypes.ChainBlockstore, dtypes.BuiltinActorsLoaded) Genesis { + return func(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.ChainBlockstore, _ dtypes.BuiltinActorsLoaded) Genesis { return func() (header *types.BlockHeader, e error) { ctx := helpers.LifecycleCtx(mctx, lc) c, err := car.LoadCar(ctx, bs, bytes.NewReader(genBytes)) @@ -49,7 +49,7 @@ func LoadGenesis(genBytes []byte) func(fx.Lifecycle, helpers.MetricsCtx, dtypes. func DoSetGenesis(_ dtypes.AfterGenesisSet) {} -func SetGenesis(lc fx.Lifecycle, mctx helpers.MetricsCtx, cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) { +func SetGenesis(lc fx.Lifecycle, mctx helpers.MetricsCtx, cs *store.ChainStore, g Genesis, _ dtypes.BuiltinActorsLoaded) (dtypes.AfterGenesisSet, error) { ctx := helpers.LifecycleCtx(mctx, lc) genFromRepo, err := cs.GetGenesis(ctx) if err == nil { From 45a65c5d9ef18d67ec4309bde1b85e92c6974fb4 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 00:35:52 +0300 Subject: [PATCH 026/228] update specs-actors --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d87d4bb6b..6d4fba3bc 100644 --- a/go.mod +++ b/go.mod @@ -56,7 +56,7 @@ require ( github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0 github.com/filecoin-project/specs-storage v0.2.2 - github.com/filecoin-project/specs-actors/v8 v8.0.0-20220404082322-5f5089f6e8bd + github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index bc9a9342c..0b057f23c 100644 --- a/go.sum +++ b/go.sum @@ -400,6 +400,8 @@ github.com/filecoin-project/specs-actors/v8 v8.0.0-20220301040630-7465555c2e22 h github.com/filecoin-project/specs-actors/v8 v8.0.0-20220301040630-7465555c2e22/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220404082322-5f5089f6e8bd h1:Ogyyz6Eh1CPoD1U4lT208vNS0UlMcl/C3UlqPLkkRqw= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220404082322-5f5089f6e8bd/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294 h1:4GF9ZCcMmlZbDlUbBsOzFROM0gPnd9oo7QlYrQo5uvs= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/storetheindex v0.3.5 h1:KoS9TvjPm6zIZfUH8atAHJbVHOO7GTP1MdTG+v0eE+Q= From 8f121ab0ec1c67e65d5429d330bce8e326496d5d Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 00:36:10 +0300 Subject: [PATCH 027/228] patch agen to deal with v8 deal proposals --- chain/actors/agen/main.go | 1 + chain/actors/builtin/market/state.go.template | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/chain/actors/agen/main.go b/chain/actors/agen/main.go index d07c039dd..6c5952f2e 100644 --- a/chain/actors/agen/main.go +++ b/chain/actors/agen/main.go @@ -110,6 +110,7 @@ func generateState(actDir string) error { err := tpl.Execute(&b, map[string]interface{}{ "v": version, "import": getVersionImports()[version], + "isv8": version == 8, }) if err != nil { return err diff --git a/chain/actors/builtin/market/state.go.template b/chain/actors/builtin/market/state.go.template index e8272276c..df561be49 100644 --- a/chain/actors/builtin/market/state.go.template +++ b/chain/actors/builtin/market/state.go.template @@ -231,7 +231,28 @@ func (s *dealProposals{{.v}}) array() adt.Array { } func fromV{{.v}}DealProposal(v{{.v}} market{{.v}}.DealProposal) DealProposal { +{{if .isv8 }} + label, err := v8.Label.ToString() + if err != nil { + bs, _ := v8.Label.ToBytes() + label = string(bs) + } + return DealProposal{ + PieceCID: v8.PieceCID, + PieceSize: v8.PieceSize, + VerifiedDeal: v8.VerifiedDeal, + Client: v8.Client, + Provider: v8.Provider, + Label: label, + StartEpoch: v8.StartEpoch, + EndEpoch: v8.EndEpoch, + StoragePricePerEpoch: v8.StoragePricePerEpoch, + ProviderCollateral: v8.ProviderCollateral, + ClientCollateral: v8.ClientCollateral, + } +{{else}} return (DealProposal)(v{{.v}}) +{{end}} } func (s *state{{.v}}) GetState() interface{} { From 9ee57937b440ec59e6bc74495f10bc0029e5bc89 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 00:36:17 +0300 Subject: [PATCH 028/228] make gen --- chain/actors/builtin/market/v0.go | 2 ++ chain/actors/builtin/market/v2.go | 2 ++ chain/actors/builtin/market/v3.go | 2 ++ chain/actors/builtin/market/v4.go | 2 ++ chain/actors/builtin/market/v5.go | 2 ++ chain/actors/builtin/market/v6.go | 2 ++ chain/actors/builtin/market/v7.go | 2 ++ chain/actors/builtin/market/v8.go | 21 ++++++++++++++++++++- 8 files changed, 34 insertions(+), 1 deletion(-) diff --git a/chain/actors/builtin/market/v0.go b/chain/actors/builtin/market/v0.go index f5a60b229..116c0da60 100644 --- a/chain/actors/builtin/market/v0.go +++ b/chain/actors/builtin/market/v0.go @@ -224,7 +224,9 @@ func (s *dealProposals0) array() adt.Array { } func fromV0DealProposal(v0 market0.DealProposal) DealProposal { + return (DealProposal)(v0) + } func (s *state0) GetState() interface{} { diff --git a/chain/actors/builtin/market/v2.go b/chain/actors/builtin/market/v2.go index 3c6914d0c..ee5968c21 100644 --- a/chain/actors/builtin/market/v2.go +++ b/chain/actors/builtin/market/v2.go @@ -224,7 +224,9 @@ func (s *dealProposals2) array() adt.Array { } func fromV2DealProposal(v2 market2.DealProposal) DealProposal { + return (DealProposal)(v2) + } func (s *state2) GetState() interface{} { diff --git a/chain/actors/builtin/market/v3.go b/chain/actors/builtin/market/v3.go index 2409bb05b..ff959d229 100644 --- a/chain/actors/builtin/market/v3.go +++ b/chain/actors/builtin/market/v3.go @@ -219,7 +219,9 @@ func (s *dealProposals3) array() adt.Array { } func fromV3DealProposal(v3 market3.DealProposal) DealProposal { + return (DealProposal)(v3) + } func (s *state3) GetState() interface{} { diff --git a/chain/actors/builtin/market/v4.go b/chain/actors/builtin/market/v4.go index 4e9011d10..37e0030b0 100644 --- a/chain/actors/builtin/market/v4.go +++ b/chain/actors/builtin/market/v4.go @@ -219,7 +219,9 @@ func (s *dealProposals4) array() adt.Array { } func fromV4DealProposal(v4 market4.DealProposal) DealProposal { + return (DealProposal)(v4) + } func (s *state4) GetState() interface{} { diff --git a/chain/actors/builtin/market/v5.go b/chain/actors/builtin/market/v5.go index 139a32247..def19e1fa 100644 --- a/chain/actors/builtin/market/v5.go +++ b/chain/actors/builtin/market/v5.go @@ -219,7 +219,9 @@ func (s *dealProposals5) array() adt.Array { } func fromV5DealProposal(v5 market5.DealProposal) DealProposal { + return (DealProposal)(v5) + } func (s *state5) GetState() interface{} { diff --git a/chain/actors/builtin/market/v6.go b/chain/actors/builtin/market/v6.go index 8230f3cf1..40ced4b75 100644 --- a/chain/actors/builtin/market/v6.go +++ b/chain/actors/builtin/market/v6.go @@ -219,7 +219,9 @@ func (s *dealProposals6) array() adt.Array { } func fromV6DealProposal(v6 market6.DealProposal) DealProposal { + return (DealProposal)(v6) + } func (s *state6) GetState() interface{} { diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go index 553913146..0815acf4c 100644 --- a/chain/actors/builtin/market/v7.go +++ b/chain/actors/builtin/market/v7.go @@ -219,7 +219,9 @@ func (s *dealProposals7) array() adt.Array { } func fromV7DealProposal(v7 market7.DealProposal) DealProposal { + return (DealProposal)(v7) + } func (s *state7) GetState() interface{} { diff --git a/chain/actors/builtin/market/v8.go b/chain/actors/builtin/market/v8.go index d2e6f9189..de689d4fe 100644 --- a/chain/actors/builtin/market/v8.go +++ b/chain/actors/builtin/market/v8.go @@ -219,7 +219,26 @@ func (s *dealProposals8) array() adt.Array { } func fromV8DealProposal(v8 market8.DealProposal) DealProposal { - return (DealProposal)(v8) + + label, err := v8.Label.ToString() + if err != nil { + bs, _ := v8.Label.ToBytes() + label = string(bs) + } + return DealProposal{ + PieceCID: v8.PieceCID, + PieceSize: v8.PieceSize, + VerifiedDeal: v8.VerifiedDeal, + Client: v8.Client, + Provider: v8.Provider, + Label: label, + StartEpoch: v8.StartEpoch, + EndEpoch: v8.EndEpoch, + StoragePricePerEpoch: v8.StoragePricePerEpoch, + ProviderCollateral: v8.ProviderCollateral, + ClientCollateral: v8.ClientCollateral, + } + } func (s *state8) GetState() interface{} { From e8b902b42fb9d14c54773680a222707d1b3cc791 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 00:56:07 +0300 Subject: [PATCH 029/228] initialize system actor for nv16 at genesis --- chain/gen/genesis/f00_system.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/chain/gen/genesis/f00_system.go b/chain/gen/genesis/f00_system.go index 4fde27107..9c384dea8 100644 --- a/chain/gen/genesis/f00_system.go +++ b/chain/gen/genesis/f00_system.go @@ -3,11 +3,16 @@ package genesis import ( "context" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin/system" + "github.com/filecoin-project/specs-actors/v8/actors/builtin/manifest" + system8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/system" + cbor "github.com/ipfs/go-ipld-cbor" bstore "github.com/filecoin-project/lotus/blockstore" @@ -22,6 +27,21 @@ func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actors.Versi return nil, err } + if av >= actors.Version8 { + mfCid, ok := actors.GetManifest(av) + if !ok { + return nil, xerrors.Errorf("missing manifest for actors version %d", av) + } + + mf := manifest.Manifest{} + if err := cst.Get(ctx, mfCid, &mf); err != nil { + return nil, xerrors.Errorf("loading manifest for actors version %d: %w", av, err) + } + + st8 := st.GetState().(*system8.State) + st8.BuiltinActors = mf.Data + } + statecid, err := cst.Put(ctx, st.GetState()) if err != nil { return nil, err From 752ce9e590ebce67fc7b626544811c6ab51e29c0 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 03:03:07 +0300 Subject: [PATCH 030/228] make tests work --- chain/actors/manifest.go | 10 ++++++++ chain/consensus/filcns/compute_state.go | 18 ++++++------- chain/vm/invoker.go | 20 ++++++++++++--- chain/vm/runtime.go | 34 +++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 12 deletions(-) diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go index 23caa184b..322052494 100644 --- a/chain/actors/manifest.go +++ b/chain/actors/manifest.go @@ -2,6 +2,7 @@ package actors import ( "context" + "strings" "sync" "golang.org/x/xerrors" @@ -97,3 +98,12 @@ func GetActorMetaByCode(c cid.Cid) (string, Version, bool) { return entry.name, entry.version, true } + +func CanonicalName(name string) string { + idx := strings.LastIndex(name, "/") + if idx >= 0 { + return name[idx+1:] + } + + return name +} diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 25d709cc6..987fe9ba0 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -53,18 +53,18 @@ func NewActorRegistry() *vm.ActorRegistry { // TODO: define all these properties on the actors themselves, in specs-actors. /* inline-gen template {{range .actorVersions}} - inv.Register(vm.ActorsVersionPredicate(actors.Version{{.}}), exported{{.}}.BuiltinActors()...){{end}} + inv.Register(actors.Version{{.}}, vm.ActorsVersionPredicate(actors.Version{{.}}), exported{{.}}.BuiltinActors()...){{end}} /* inline-gen start */ - inv.Register(vm.ActorsVersionPredicate(actors.Version0), exported0.BuiltinActors()...) - inv.Register(vm.ActorsVersionPredicate(actors.Version2), exported2.BuiltinActors()...) - inv.Register(vm.ActorsVersionPredicate(actors.Version3), exported3.BuiltinActors()...) - inv.Register(vm.ActorsVersionPredicate(actors.Version4), exported4.BuiltinActors()...) - inv.Register(vm.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...) - inv.Register(vm.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...) - inv.Register(vm.ActorsVersionPredicate(actors.Version7), exported7.BuiltinActors()...) - inv.Register(vm.ActorsVersionPredicate(actors.Version8), exported8.BuiltinActors()...) + inv.Register(actors.Version0, vm.ActorsVersionPredicate(actors.Version0), exported0.BuiltinActors()...) + inv.Register(actors.Version2, vm.ActorsVersionPredicate(actors.Version2), exported2.BuiltinActors()...) + inv.Register(actors.Version3, vm.ActorsVersionPredicate(actors.Version3), exported3.BuiltinActors()...) + inv.Register(actors.Version4, vm.ActorsVersionPredicate(actors.Version4), exported4.BuiltinActors()...) + inv.Register(actors.Version5, vm.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...) + inv.Register(actors.Version6, vm.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...) + inv.Register(actors.Version7, vm.ActorsVersionPredicate(actors.Version7), exported7.BuiltinActors()...) + inv.Register(actors.Version8, vm.ActorsVersionPredicate(actors.Version8), exported8.BuiltinActors()...) /* inline-gen end */ diff --git a/chain/vm/invoker.go b/chain/vm/invoker.go index 8a7a4c8c9..5093d5d13 100644 --- a/chain/vm/invoker.go +++ b/chain/vm/invoker.go @@ -89,22 +89,36 @@ func (ar *ActorRegistry) Invoke(codeCid cid.Cid, rt vmr.Runtime, method abi.Meth } -func (ar *ActorRegistry) Register(pred ActorPredicate, actors ...rtt.VMActor) { +func (ar *ActorRegistry) Register(av actors.Version, pred ActorPredicate, vmactors ...rtt.VMActor) { if pred == nil { pred = func(vmr.Runtime, rtt.VMActor) error { return nil } } - for _, a := range actors { + for _, a := range vmactors { // register in the `actors` map (for the invoker) code, err := ar.transform(a) if err != nil { panic(xerrors.Errorf("%s: %w", string(a.Code().Hash()), err)) } - ar.actors[a.Code()] = &actorInfo{ + + ai := &actorInfo{ methods: code, vmActor: a, predicate: pred, } + ac := a.Code() + ar.actors[ac] = ai + + // necessary to make genesis work for testing + if av >= actors.Version8 { + name := actors.CanonicalName(builtin.ActorNameByCode(ac)) + + ac, ok := actors.GetActorCodeID(av, name) + if ok { + ar.actors[ac] = ai + } + } + // register in the `Methods` map (used by statemanager utils) exports := a.Exports() methods := make(map[abi.MethodNum]MethodMeta, len(exports)) diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 9c4344a02..39617f91c 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -26,11 +26,14 @@ import ( rt8 "github.com/filecoin-project/specs-actors/v8/actors/runtime" "github.com/ipfs/go-cid" ipldcbor "github.com/ipfs/go-ipld-cbor" + mh "github.com/multiformats/go-multihash" "go.opencensus.io/trace" "golang.org/x/xerrors" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/aerrors" + "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/types" ) @@ -222,6 +225,23 @@ func (rt *Runtime) GetActorCodeCID(addr address.Address) (ret cid.Cid, ok bool) panic(aerrors.Fatalf("failed to get actor: %s", err)) } + // required for genesis/testing + if nv := rt.NetworkVersion(); nv >= network.Version16 { + name, av, ok := actors.GetActorMetaByCode(act.Code) + + if ok { + // lies, lies, lies + builder := cid.V1Builder{Codec: cid.Raw, MhType: mh.IDENTITY} + synthetic := fmt.Sprintf("fil/%d/%s", av, name) + syntheticCid, err := builder.Sum([]byte(synthetic)) + if err != nil { + panic(aerrors.Fatalf("failed to generate synthetic CID: %s", err)) + } + + return syntheticCid, true + } + } + return act.Code, true } @@ -367,6 +387,20 @@ func (rt *Runtime) ValidateImmediateCallerType(ts ...cid.Cid) { if t == callerCid { return } + + // this really only for genesis in tests; nv16 will be running on FVM anyway. + if nv := rt.NetworkVersion(); nv >= network.Version16 { + av, err := actors.VersionForNetwork(nv) + if err != nil { + panic(aerrors.Fatalf("failed to get actors version for network version %d", nv)) + } + + name := actors.CanonicalName(builtin.ActorNameByCode(t)) + ac, ok := actors.GetActorCodeID(av, name) + if ok && ac == callerCid { + return + } + } } rt.Abortf(exitcode.SysErrForbidden, "caller cid type %q was not one of %v", callerCid, ts) } From 5d6e9ec65b38f2960b6a495a3d04e4ce550f024f Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 12:45:17 +0300 Subject: [PATCH 031/228] patch genesis state tree to get the right code IDs --- chain/gen/genesis/genesis.go | 17 +++++++++++++++++ chain/gen/genesis/util.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index a1d1d01b8..9b14ef063 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -580,6 +580,23 @@ func MakeGenesisBlock(ctx context.Context, j journal.Journal, bs bstore.Blocksto return nil, xerrors.Errorf("setup miners failed: %w", err) } + if template.NetworkVersion >= network.Version16 { + st, err := state.LoadStateTree(cbor.NewCborStore(bs), stateroot) + if err != nil { + return nil, xerrors.Errorf("error loading state tree") + } + + err = patchStateTree(st, template.NetworkVersion) + if err != nil { + return nil, xerrors.Errorf("error patching state tree: %w", err) + } + + stateroot, err = st.Flush(ctx) + if err != nil { + return nil, xerrors.Errorf("flush state tree failed: %w", err) + } + } + store := adt.WrapStore(ctx, cbor.NewCborStore(bs)) emptyroot, err := adt0.MakeEmptyArray(store).Root() if err != nil { diff --git a/chain/gen/genesis/util.go b/chain/gen/genesis/util.go index 452bc835b..b37ceb1b8 100644 --- a/chain/gen/genesis/util.go +++ b/chain/gen/genesis/util.go @@ -5,10 +5,13 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" ) @@ -46,3 +49,36 @@ func doExecValue(ctx context.Context, vm *vm.LegacyVM, to, from address.Address, return ret.Return, nil } + +func patchStateTree(st *state.StateTree, nv network.Version) error { + av, err := actors.VersionForNetwork(nv) + if err != nil { + return err + } + + var acts []address.Address + err = st.ForEach(func(a address.Address, _ *types.Actor) error { + acts = append(acts, a) + return nil + }) + if err != nil { + return xerrors.Errorf("error collecting actors: %w", err) + } + + for _, a := range acts { + err = st.MutateActor(a, func(act *types.Actor) error { + name := actors.CanonicalName(builtin.ActorNameByCode(act.Code)) + code, ok := actors.GetActorCodeID(av, name) + if ok { + act.Code = code + } + return nil + }) + + if err != nil { + return xerrors.Errorf("error mutating actor %s: %w", a, err) + } + } + + return nil +} From fcf69e7b82fd97a6f523d2b486571417d9e83ef5 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 13:48:17 +0300 Subject: [PATCH 032/228] register mapping for methods using the real code cid --- chain/vm/invoker.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/chain/vm/invoker.go b/chain/vm/invoker.go index 5093d5d13..ffc3ab138 100644 --- a/chain/vm/invoker.go +++ b/chain/vm/invoker.go @@ -109,13 +109,15 @@ func (ar *ActorRegistry) Register(av actors.Version, pred ActorPredicate, vmacto ac := a.Code() ar.actors[ac] = ai - // necessary to make genesis work for testing + // necessary to make stuff work + var realCode cid.Cid if av >= actors.Version8 { name := actors.CanonicalName(builtin.ActorNameByCode(ac)) - ac, ok := actors.GetActorCodeID(av, name) + var ok bool + realCode, ok = actors.GetActorCodeID(av, name) if ok { - ar.actors[ac] = ai + ar.actors[realCode] = ai } } @@ -163,6 +165,9 @@ func (ar *ActorRegistry) Register(av actors.Version, pred ActorPredicate, vmacto } } ar.Methods[a.Code()] = methods + if realCode.Defined() { + ar.Methods[realCode] = methods + } } } From 2c9ea8c46b50c1431e73be413799ac6c08467369 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 13:48:54 +0300 Subject: [PATCH 033/228] fix test --- itests/kit/ensemble.go | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 8b0128f46..f842bf30b 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -59,6 +59,13 @@ import ( testing2 "github.com/filecoin-project/lotus/node/modules/testing" "github.com/filecoin-project/lotus/node/repo" "github.com/filecoin-project/lotus/storage/mockstorage" + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" + power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" + "github.com/ipfs/go-datastore" + libp2pcrypto "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" + "github.com/stretchr/testify/require" ) func init() { @@ -408,17 +415,20 @@ func (n *Ensemble) Start() *Ensemble { // we get the proof type for the requested sector size, for // the current network version. - nv, err := m.FullNode.FullNode.StateNetworkVersion(ctx, types.EmptyTSK) - require.NoError(n.t, err) + // nv, err := m.FullNode.FullNode.StateNetworkVersion(ctx, types.EmptyTSK) + // require.NoError(n.t, err) - proofType, err := miner.SealProofTypeFromSectorSize(m.options.sectorSize, nv) - require.NoError(n.t, err) + // this doesn't currently work with the FVM -- we need to specify policy somehow + // proofType, err := miner.WindowPoStProofTypeFromSectorSize(m.options.sectorSize) + // require.NoError(n.t, err) + // so do this instead, which works: + proofType := abi.RegisteredPoStProof_StackedDrgWindow64GiBV1 - params, aerr := actors.SerializeParams(&power2.CreateMinerParams{ - Owner: m.OwnerKey.Address, - Worker: m.OwnerKey.Address, - SealProofType: proofType, - Peer: abi.PeerID(m.Libp2p.PeerID), + params, aerr := actors.SerializeParams(&power3.CreateMinerParams{ + Owner: m.OwnerKey.Address, + Worker: m.OwnerKey.Address, + WindowPoStProofType: proofType, + Peer: abi.PeerID(m.Libp2p.PeerID), }) require.NoError(n.t, aerr) @@ -437,7 +447,7 @@ func (n *Ensemble) Start() *Ensemble { require.NoError(n.t, err) require.Equal(n.t, exitcode.Ok, mw.Receipt.ExitCode) - var retval power2.CreateMinerReturn + var retval power3.CreateMinerReturn err = retval.UnmarshalCBOR(bytes.NewReader(mw.Receipt.Return)) require.NoError(n.t, err, "failed to create miner") From 73e7c42b7e109172da8f779d41dd908296e2c7fc Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 13:52:29 +0300 Subject: [PATCH 034/228] mark TODO for fixing policy stuffs in test --- itests/kit/ensemble.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index f842bf30b..706626e5f 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -418,7 +418,7 @@ func (n *Ensemble) Start() *Ensemble { // nv, err := m.FullNode.FullNode.StateNetworkVersion(ctx, types.EmptyTSK) // require.NoError(n.t, err) - // this doesn't currently work with the FVM -- we need to specify policy somehow + // TODO this doesn't currently work with the FVM -- we need to specify policy somehow // proofType, err := miner.WindowPoStProofTypeFromSectorSize(m.options.sectorSize) // require.NoError(n.t, err) // so do this instead, which works: From 12554baed40c8f7a15a95d113018f87d1a53a147 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 14:00:25 +0300 Subject: [PATCH 035/228] fix forks_test --- chain/stmgr/forks_test.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/chain/stmgr/forks_test.go b/chain/stmgr/forks_test.go index 9a22716ba..82ac1a7f9 100644 --- a/chain/stmgr/forks_test.go +++ b/chain/stmgr/forks_test.go @@ -130,7 +130,7 @@ func TestForkHeightTriggers(t *testing.T) { Network: network.Version1, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + mf cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { cst := ipldcbor.NewCborStore(sm.ChainStore().StateBlockstore()) st, err := sm.StateTree(root) @@ -168,7 +168,7 @@ func TestForkHeightTriggers(t *testing.T) { } inv := filcns.NewActorRegistry() - inv.Register(nil, testActor{}) + inv.Register(actors.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) @@ -276,7 +276,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) { Expensive: true, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + mf cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { migrationCount++ return root, nil }}}, cg.BeaconSchedule()) @@ -285,7 +285,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) { } inv := filcns.NewActorRegistry() - inv.Register(nil, testActor{}) + inv.Register(actors.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) @@ -412,7 +412,7 @@ func TestForkPreMigration(t *testing.T) { Network: network.Version1, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + mf cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { // Make sure the test that should be canceled, is canceled. select { @@ -431,7 +431,7 @@ func TestForkPreMigration(t *testing.T) { PreMigrations: []PreMigration{{ StartWithin: 20, PreMigration: func(ctx context.Context, _ *StateManager, cache MigrationCache, - _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { + _ cid.Cid, _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { wait20.Done() wait20.Wait() @@ -445,7 +445,7 @@ func TestForkPreMigration(t *testing.T) { }, { StartWithin: 20, PreMigration: func(ctx context.Context, _ *StateManager, cache MigrationCache, - _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { + _ cid.Cid, _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { wait20.Done() wait20.Wait() @@ -459,7 +459,7 @@ func TestForkPreMigration(t *testing.T) { }, { StartWithin: 20, PreMigration: func(ctx context.Context, _ *StateManager, cache MigrationCache, - _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { + _ cid.Cid, _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { wait20.Done() wait20.Wait() @@ -475,7 +475,7 @@ func TestForkPreMigration(t *testing.T) { StartWithin: 15, StopWithin: 5, PreMigration: func(ctx context.Context, _ *StateManager, cache MigrationCache, - _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { + _ cid.Cid, _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { <-ctx.Done() close(wasCanceled) @@ -487,7 +487,7 @@ func TestForkPreMigration(t *testing.T) { }, { StartWithin: 10, PreMigration: func(ctx context.Context, _ *StateManager, cache MigrationCache, - _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { + _ cid.Cid, _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { checkCache(t, cache) @@ -506,7 +506,7 @@ func TestForkPreMigration(t *testing.T) { }() inv := filcns.NewActorRegistry() - inv.Register(nil, testActor{}) + inv.Register(actors.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) From c35e7691bd43499d30a91020d2ff43671cb31a39 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 14:11:04 +0300 Subject: [PATCH 036/228] fix conformance driver --- conformance/driver.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conformance/driver.go b/conformance/driver.go index f6ca9f9db..54ee40d5b 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -8,6 +8,7 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/stmgr" @@ -235,7 +236,8 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP // register the chaos actor if required by the vector. if chaosOn, ok := d.selector["chaos_actor"]; ok && chaosOn == "true" { - invoker.Register(nil, chaos.Actor{}) + av, _ := actors.VersionForNetwork(params.NetworkVersion) + invoker.Register(av, nil, chaos.Actor{}) } lvm.SetInvoker(invoker) From 77613b57a9650259deb7e20484c3f272a2585d44 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 8 Apr 2022 14:15:32 +0300 Subject: [PATCH 037/228] fix lint --- chain/stmgr/forks.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chain/stmgr/forks.go b/chain/stmgr/forks.go index 8a600f6cf..03b2e5640 100644 --- a/chain/stmgr/forks.go +++ b/chain/stmgr/forks.go @@ -272,6 +272,7 @@ func (sm *StateManager) preMigrationWorker(ctx context.Context) { notAfterEpoch = stopEpoch - 1 } + manifest := migration.manifest // Add an op to start a pre-migration. schedule = append(schedule, op{ after: afterEpoch, @@ -282,7 +283,7 @@ func (sm *StateManager) preMigrationWorker(ctx context.Context) { wg.Add(1) go func() { defer wg.Done() - runPreMigration(preCtx, sm, migration.manifest, migrationFunc, cache, ts) + runPreMigration(preCtx, sm, manifest, migrationFunc, cache, ts) }() }, }) From 339b7db2b7d0ab60a5d971299d37cbcee33e69e4 Mon Sep 17 00:00:00 2001 From: Aayush Date: Sat, 12 Mar 2022 13:07:35 -0500 Subject: [PATCH 038/228] Integrate FIP 0027 --- api/api_storage.go | 2 +- api/cbor_gen.go | 2 +- chain/actors/builtin/market/actor.go.template | 17 ++++++++-- chain/actors/builtin/market/market.go | 17 ++++++++-- chain/actors/builtin/market/state.go.template | 25 ++++++++++++--- chain/actors/builtin/market/v0.go | 21 +++++++++++-- chain/actors/builtin/market/v2.go | 21 +++++++++++-- chain/actors/builtin/market/v3.go | 21 +++++++++++-- chain/actors/builtin/market/v4.go | 21 +++++++++++-- chain/actors/builtin/market/v5.go | 21 +++++++++++-- chain/actors/builtin/market/v6.go | 21 +++++++++++-- chain/actors/builtin/market/v7.go | 21 +++++++++++-- chain/actors/builtin/market/v8.go | 21 +++++++++++-- cmd/lotus-miner/init.go | 5 +-- cmd/lotus-seed/seed/seed.go | 11 +++++-- documentation/en/api-v0-methods-miner.md | 14 ++++----- documentation/en/api-v0-methods.md | 4 +-- documentation/en/api-v1-unstable-methods.md | 4 +-- extern/storage-sealing/currentdealinfo.go | 9 +++--- .../storage-sealing/currentdealinfo_test.go | 25 +++++++++------ extern/storage-sealing/types_test.go | 5 +-- genesis/types.go | 8 ++--- go.mod | 8 ++--- go.sum | 31 ++++++++++++------- markets/dagstore/wrapper_migration_test.go | 2 +- markets/storageadapter/client.go | 8 ++--- markets/storageadapter/dealpublisher.go | 26 +++++++--------- markets/storageadapter/dealpublisher_test.go | 9 +++--- .../ondealsectorcommitted_test.go | 12 +++++-- markets/storageadapter/provider.go | 9 +++--- node/impl/client/client.go | 14 ++++++--- storage/mockstorage/preseal.go | 13 +++++--- 32 files changed, 322 insertions(+), 126 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 0411af537..1f26151e1 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -16,7 +16,7 @@ import ( datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-state-types/abi" abinetwork "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" + "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/go-fil-markets/piecestore" diff --git a/api/cbor_gen.go b/api/cbor_gen.go index eb4c34f8a..abe597600 100644 --- a/api/cbor_gen.go +++ b/api/cbor_gen.go @@ -9,8 +9,8 @@ import ( "sort" abi "github.com/filecoin-project/go-state-types/abi" - market "github.com/filecoin-project/specs-actors/actors/builtin/market" paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" + market "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" diff --git a/chain/actors/builtin/market/actor.go.template b/chain/actors/builtin/market/actor.go.template index cf618bd73..32d293924 100644 --- a/chain/actors/builtin/market/actor.go.template +++ b/chain/actors/builtin/market/actor.go.template @@ -1,6 +1,8 @@ package market import ( + "unicode/utf8" + "github.com/filecoin-project/go-state-types/network" "golang.org/x/xerrors" @@ -12,6 +14,7 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" + market{{.latestVersion}} "github.com/filecoin-project/specs-actors{{import .latestVersion}}actors/builtin/market" {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} @@ -128,7 +131,7 @@ type DealProposals interface { decode(*cbg.Deferred) (*DealProposal, error) } -type PublishStorageDealsParams = market0.PublishStorageDealsParams +type PublishStorageDealsParams = market{{.latestVersion}}.PublishStorageDealsParams type PublishStorageDealsReturn interface { DealIDs() ([]abi.DealID, error) @@ -154,7 +157,7 @@ func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStora type VerifyDealsForActivationParams = market0.VerifyDealsForActivationParams type WithdrawBalanceParams = market0.WithdrawBalanceParams -type ClientDealProposal = market0.ClientDealProposal +type ClientDealProposal = market{{.latestVersion}}.ClientDealProposal type DealState struct { SectorStartEpoch abi.ChainEpoch // -1 if not yet included in proven sector @@ -168,7 +171,7 @@ type DealProposal struct { VerifiedDeal bool Client address.Address Provider address.Address - Label string + Label market{{.latestVersion}}.DealLabel StartEpoch abi.ChainEpoch EndEpoch abi.ChainEpoch StoragePricePerEpoch abi.TokenAmount @@ -227,3 +230,11 @@ func (deal DealProposal) GetDealFees(height abi.ChainEpoch) (abi.TokenAmount, ab return ef, big.Sub(tf, ef) } + +func labelFromGoString(s string) (market{{.latestVersion}}.DealLabel, error) { + if utf8.ValidString(s) { + return market{{.latestVersion}}.NewLabelFromString(s) + } else { + return market{{.latestVersion}}.NewLabelFromBytes([]byte(s)) + } +} diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index 5f21a376a..139257a55 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -1,6 +1,8 @@ package market import ( + "unicode/utf8" + "github.com/filecoin-project/go-state-types/network" "golang.org/x/xerrors" @@ -12,6 +14,7 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -295,7 +298,7 @@ type DealProposals interface { decode(*cbg.Deferred) (*DealProposal, error) } -type PublishStorageDealsParams = market0.PublishStorageDealsParams +type PublishStorageDealsParams = market8.PublishStorageDealsParams type PublishStorageDealsReturn interface { DealIDs() ([]abi.DealID, error) @@ -342,7 +345,7 @@ func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStora type VerifyDealsForActivationParams = market0.VerifyDealsForActivationParams type WithdrawBalanceParams = market0.WithdrawBalanceParams -type ClientDealProposal = market0.ClientDealProposal +type ClientDealProposal = market8.ClientDealProposal type DealState struct { SectorStartEpoch abi.ChainEpoch // -1 if not yet included in proven sector @@ -356,7 +359,7 @@ type DealProposal struct { VerifiedDeal bool Client address.Address Provider address.Address - Label string + Label market8.DealLabel StartEpoch abi.ChainEpoch EndEpoch abi.ChainEpoch StoragePricePerEpoch abi.TokenAmount @@ -415,3 +418,11 @@ func (deal DealProposal) GetDealFees(height abi.ChainEpoch) (abi.TokenAmount, ab return ef, big.Sub(tf, ef) } + +func labelFromGoString(s string) (market8.DealLabel, error) { + if utf8.ValidString(s) { + return market8.NewLabelFromString(s) + } else { + return market8.NewLabelFromBytes([]byte(s)) + } +} diff --git a/chain/actors/builtin/market/state.go.template b/chain/actors/builtin/market/state.go.template index df561be49..5c14b6924 100644 --- a/chain/actors/builtin/market/state.go.template +++ b/chain/actors/builtin/market/state.go.template @@ -206,14 +206,24 @@ func (s *dealProposals{{.v}}) Get(dealID abi.DealID) (*DealProposal, bool, error if !found { return nil, false, nil } - proposal := fromV{{.v}}DealProposal(proposal{{.v}}) - return &proposal, true, nil + + proposal, err := fromV{{.v}}DealProposal(proposal{{.v}}) + if err != nil { + return nil, true, xerrors.Errorf("decoding proposal: %w", err) + } + + return &proposal, true, nil } func (s *dealProposals{{.v}}) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { var dp{{.v}} market{{.v}}.DealProposal return s.Array.ForEach(&dp{{.v}}, func(idx int64) error { - return cb(abi.DealID(idx), fromV{{.v}}DealProposal(dp{{.v}})) + dp, err := fromV{{.v}}DealProposal(dp{{.v}}) + if err != nil { + return xerrors.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) }) } @@ -222,8 +232,13 @@ func (s *dealProposals{{.v}}) decode(val *cbg.Deferred) (*DealProposal, error) { if err := dp{{.v}}.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { return nil, err } - dp := fromV{{.v}}DealProposal(dp{{.v}}) - return &dp, nil + + dp, err := fromV{{.v}}DealProposal(dp{{.v}}) + if err != nil { + return nil, err + } + + return &dp, nil } func (s *dealProposals{{.v}}) array() adt.Array { diff --git a/chain/actors/builtin/market/v0.go b/chain/actors/builtin/market/v0.go index 116c0da60..f210f5a40 100644 --- a/chain/actors/builtin/market/v0.go +++ b/chain/actors/builtin/market/v0.go @@ -199,14 +199,24 @@ func (s *dealProposals0) Get(dealID abi.DealID) (*DealProposal, bool, error) { if !found { return nil, false, nil } - proposal := fromV0DealProposal(proposal0) + + proposal, err := fromV0DealProposal(proposal0) + if err != nil { + return nil, true, xerrors.Errorf("decoding proposal: %w", err) + } + return &proposal, true, nil } func (s *dealProposals0) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { var dp0 market0.DealProposal return s.Array.ForEach(&dp0, func(idx int64) error { - return cb(abi.DealID(idx), fromV0DealProposal(dp0)) + dp, err := fromV0DealProposal(dp0) + if err != nil { + return xerrors.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) }) } @@ -215,7 +225,12 @@ func (s *dealProposals0) decode(val *cbg.Deferred) (*DealProposal, error) { if err := dp0.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { return nil, err } - dp := fromV0DealProposal(dp0) + + dp, err := fromV0DealProposal(dp0) + if err != nil { + return nil, err + } + return &dp, nil } diff --git a/chain/actors/builtin/market/v2.go b/chain/actors/builtin/market/v2.go index ee5968c21..f38368daa 100644 --- a/chain/actors/builtin/market/v2.go +++ b/chain/actors/builtin/market/v2.go @@ -199,14 +199,24 @@ func (s *dealProposals2) Get(dealID abi.DealID) (*DealProposal, bool, error) { if !found { return nil, false, nil } - proposal := fromV2DealProposal(proposal2) + + proposal, err := fromV2DealProposal(proposal2) + if err != nil { + return nil, true, xerrors.Errorf("decoding proposal: %w", err) + } + return &proposal, true, nil } func (s *dealProposals2) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { var dp2 market2.DealProposal return s.Array.ForEach(&dp2, func(idx int64) error { - return cb(abi.DealID(idx), fromV2DealProposal(dp2)) + dp, err := fromV2DealProposal(dp2) + if err != nil { + return xerrors.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) }) } @@ -215,7 +225,12 @@ func (s *dealProposals2) decode(val *cbg.Deferred) (*DealProposal, error) { if err := dp2.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { return nil, err } - dp := fromV2DealProposal(dp2) + + dp, err := fromV2DealProposal(dp2) + if err != nil { + return nil, err + } + return &dp, nil } diff --git a/chain/actors/builtin/market/v3.go b/chain/actors/builtin/market/v3.go index ff959d229..26a661c87 100644 --- a/chain/actors/builtin/market/v3.go +++ b/chain/actors/builtin/market/v3.go @@ -194,14 +194,24 @@ func (s *dealProposals3) Get(dealID abi.DealID) (*DealProposal, bool, error) { if !found { return nil, false, nil } - proposal := fromV3DealProposal(proposal3) + + proposal, err := fromV3DealProposal(proposal3) + if err != nil { + return nil, true, xerrors.Errorf("decoding proposal: %w", err) + } + return &proposal, true, nil } func (s *dealProposals3) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { var dp3 market3.DealProposal return s.Array.ForEach(&dp3, func(idx int64) error { - return cb(abi.DealID(idx), fromV3DealProposal(dp3)) + dp, err := fromV3DealProposal(dp3) + if err != nil { + return xerrors.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) }) } @@ -210,7 +220,12 @@ func (s *dealProposals3) decode(val *cbg.Deferred) (*DealProposal, error) { if err := dp3.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { return nil, err } - dp := fromV3DealProposal(dp3) + + dp, err := fromV3DealProposal(dp3) + if err != nil { + return nil, err + } + return &dp, nil } diff --git a/chain/actors/builtin/market/v4.go b/chain/actors/builtin/market/v4.go index 37e0030b0..915a99d52 100644 --- a/chain/actors/builtin/market/v4.go +++ b/chain/actors/builtin/market/v4.go @@ -194,14 +194,24 @@ func (s *dealProposals4) Get(dealID abi.DealID) (*DealProposal, bool, error) { if !found { return nil, false, nil } - proposal := fromV4DealProposal(proposal4) + + proposal, err := fromV4DealProposal(proposal4) + if err != nil { + return nil, true, xerrors.Errorf("decoding proposal: %w", err) + } + return &proposal, true, nil } func (s *dealProposals4) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { var dp4 market4.DealProposal return s.Array.ForEach(&dp4, func(idx int64) error { - return cb(abi.DealID(idx), fromV4DealProposal(dp4)) + dp, err := fromV4DealProposal(dp4) + if err != nil { + return xerrors.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) }) } @@ -210,7 +220,12 @@ func (s *dealProposals4) decode(val *cbg.Deferred) (*DealProposal, error) { if err := dp4.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { return nil, err } - dp := fromV4DealProposal(dp4) + + dp, err := fromV4DealProposal(dp4) + if err != nil { + return nil, err + } + return &dp, nil } diff --git a/chain/actors/builtin/market/v5.go b/chain/actors/builtin/market/v5.go index def19e1fa..5be3a18a1 100644 --- a/chain/actors/builtin/market/v5.go +++ b/chain/actors/builtin/market/v5.go @@ -194,14 +194,24 @@ func (s *dealProposals5) Get(dealID abi.DealID) (*DealProposal, bool, error) { if !found { return nil, false, nil } - proposal := fromV5DealProposal(proposal5) + + proposal, err := fromV5DealProposal(proposal5) + if err != nil { + return nil, true, xerrors.Errorf("decoding proposal: %w", err) + } + return &proposal, true, nil } func (s *dealProposals5) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { var dp5 market5.DealProposal return s.Array.ForEach(&dp5, func(idx int64) error { - return cb(abi.DealID(idx), fromV5DealProposal(dp5)) + dp, err := fromV5DealProposal(dp5) + if err != nil { + return xerrors.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) }) } @@ -210,7 +220,12 @@ func (s *dealProposals5) decode(val *cbg.Deferred) (*DealProposal, error) { if err := dp5.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { return nil, err } - dp := fromV5DealProposal(dp5) + + dp, err := fromV5DealProposal(dp5) + if err != nil { + return nil, err + } + return &dp, nil } diff --git a/chain/actors/builtin/market/v6.go b/chain/actors/builtin/market/v6.go index 40ced4b75..ee82c0b8c 100644 --- a/chain/actors/builtin/market/v6.go +++ b/chain/actors/builtin/market/v6.go @@ -194,14 +194,24 @@ func (s *dealProposals6) Get(dealID abi.DealID) (*DealProposal, bool, error) { if !found { return nil, false, nil } - proposal := fromV6DealProposal(proposal6) + + proposal, err := fromV6DealProposal(proposal6) + if err != nil { + return nil, true, xerrors.Errorf("decoding proposal: %w", err) + } + return &proposal, true, nil } func (s *dealProposals6) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { var dp6 market6.DealProposal return s.Array.ForEach(&dp6, func(idx int64) error { - return cb(abi.DealID(idx), fromV6DealProposal(dp6)) + dp, err := fromV6DealProposal(dp6) + if err != nil { + return xerrors.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) }) } @@ -210,7 +220,12 @@ func (s *dealProposals6) decode(val *cbg.Deferred) (*DealProposal, error) { if err := dp6.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { return nil, err } - dp := fromV6DealProposal(dp6) + + dp, err := fromV6DealProposal(dp6) + if err != nil { + return nil, err + } + return &dp, nil } diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go index 0815acf4c..3c82d2522 100644 --- a/chain/actors/builtin/market/v7.go +++ b/chain/actors/builtin/market/v7.go @@ -194,14 +194,24 @@ func (s *dealProposals7) Get(dealID abi.DealID) (*DealProposal, bool, error) { if !found { return nil, false, nil } - proposal := fromV7DealProposal(proposal7) + + proposal, err := fromV7DealProposal(proposal7) + if err != nil { + return nil, true, xerrors.Errorf("decoding proposal: %w", err) + } + return &proposal, true, nil } func (s *dealProposals7) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { var dp7 market7.DealProposal return s.Array.ForEach(&dp7, func(idx int64) error { - return cb(abi.DealID(idx), fromV7DealProposal(dp7)) + dp, err := fromV7DealProposal(dp7) + if err != nil { + return xerrors.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) }) } @@ -210,7 +220,12 @@ func (s *dealProposals7) decode(val *cbg.Deferred) (*DealProposal, error) { if err := dp7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { return nil, err } - dp := fromV7DealProposal(dp7) + + dp, err := fromV7DealProposal(dp7) + if err != nil { + return nil, err + } + return &dp, nil } diff --git a/chain/actors/builtin/market/v8.go b/chain/actors/builtin/market/v8.go index de689d4fe..43a8bd817 100644 --- a/chain/actors/builtin/market/v8.go +++ b/chain/actors/builtin/market/v8.go @@ -194,14 +194,24 @@ func (s *dealProposals8) Get(dealID abi.DealID) (*DealProposal, bool, error) { if !found { return nil, false, nil } - proposal := fromV8DealProposal(proposal8) + + proposal, err := fromV8DealProposal(proposal8) + if err != nil { + return nil, true, xerrors.Errorf("decoding proposal: %w", err) + } + return &proposal, true, nil } func (s *dealProposals8) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { var dp8 market8.DealProposal return s.Array.ForEach(&dp8, func(idx int64) error { - return cb(abi.DealID(idx), fromV8DealProposal(dp8)) + dp, err := fromV8DealProposal(dp8) + if err != nil { + return xerrors.Errorf("decoding proposal: %w", err) + } + + return cb(abi.DealID(idx), dp) }) } @@ -210,7 +220,12 @@ func (s *dealProposals8) decode(val *cbg.Deferred) (*DealProposal, error) { if err := dp8.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { return nil, err } - dp := fromV8DealProposal(dp8) + + dp, err := fromV8DealProposal(dp8) + if err != nil { + return nil, err + } + return &dp, nil } diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index 7d81026f2..8512f4a22 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -13,6 +13,8 @@ import ( "path/filepath" "strconv" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" + power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power" "github.com/docker/go-units" @@ -36,7 +38,6 @@ import ( "github.com/filecoin-project/lotus/extern/sector-storage/stores" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" @@ -391,7 +392,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string return mds.Put(ctx, datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) } -func findMarketDealID(ctx context.Context, api v1api.FullNode, deal market2.DealProposal) (abi.DealID, error) { +func findMarketDealID(ctx context.Context, api v1api.FullNode, deal market8.DealProposal) (abi.DealID, error) { // TODO: find a better way // (this is only used by genesis miners) diff --git a/cmd/lotus-seed/seed/seed.go b/cmd/lotus-seed/seed/seed.go index 3fbe66556..5e5178045 100644 --- a/cmd/lotus-seed/seed/seed.go +++ b/cmd/lotus-seed/seed/seed.go @@ -24,7 +24,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-storage/storage" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/wallet" @@ -252,12 +252,17 @@ func WriteGenesisMiner(maddr address.Address, sbroot string, gm *genesis.Miner, func createDeals(m *genesis.Miner, k *wallet.Key, maddr address.Address, ssize abi.SectorSize) error { for i, sector := range m.Sectors { - proposal := &market2.DealProposal{ + label, err := market8.NewLabelFromString(fmt.Sprintf("%d", i)) + if err != nil { + return xerrors.Errorf("error creating deal label: %w", err) + } + + proposal := &market8.DealProposal{ PieceCID: sector.CommD, PieceSize: abi.PaddedPieceSize(ssize), Client: k.Address, Provider: maddr, - Label: fmt.Sprintf("%d", i), + Label: label, StartEpoch: 0, EndEpoch: 9001, StoragePricePerEpoch: big.Zero(), diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index c0e913ca7..af862c016 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -707,7 +707,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -1158,7 +1158,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -1300,7 +1300,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -1335,7 +1335,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -1456,7 +1456,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -2711,7 +2711,7 @@ Inputs: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -3079,7 +3079,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index a1e50836a..4f1687e5b 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -5447,7 +5447,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -5525,7 +5525,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 6d24e915f..b0e1a5724 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -5863,7 +5863,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -5941,7 +5941,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": "string value", + "Label": {}, "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", diff --git a/extern/storage-sealing/currentdealinfo.go b/extern/storage-sealing/currentdealinfo.go index 6863b47b3..5a97f8955 100644 --- a/extern/storage-sealing/currentdealinfo.go +++ b/extern/storage-sealing/currentdealinfo.go @@ -4,15 +4,16 @@ import ( "bytes" "context" + "github.com/filecoin-project/lotus/chain/actors/builtin/market" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/types" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" "github.com/ipfs/go-cid" "golang.org/x/xerrors" ) @@ -120,7 +121,7 @@ func (mgr *CurrentDealInfoManager) dealIDFromPublishDealsMsg(ctx context.Context return dealID, nil, xerrors.Errorf("getting publish deal message %s: %w", publishCid, err) } - var pubDealsParams market2.PublishStorageDealsParams + var pubDealsParams market8.PublishStorageDealsParams if err := pubDealsParams.UnmarshalCBOR(bytes.NewReader(pubmsg.Params)); err != nil { return dealID, nil, xerrors.Errorf("unmarshalling publish deal message params for message %s: %w", publishCid, err) } @@ -173,7 +174,7 @@ func (mgr *CurrentDealInfoManager) CheckDealEquality(ctx context.Context, tok Ti return p1.PieceCID.Equals(p2.PieceCID) && p1.PieceSize == p2.PieceSize && p1.VerifiedDeal == p2.VerifiedDeal && - p1.Label == p2.Label && + p1.Label.Equals(p2.Label) && p1.StartEpoch == p2.StartEpoch && p1.EndEpoch == p2.EndEpoch && p1.StoragePricePerEpoch.Equals(p2.StoragePricePerEpoch) && diff --git a/extern/storage-sealing/currentdealinfo_test.go b/extern/storage-sealing/currentdealinfo_test.go index 4d8022adb..8cb6343ef 100644 --- a/extern/storage-sealing/currentdealinfo_test.go +++ b/extern/storage-sealing/currentdealinfo_test.go @@ -8,10 +8,12 @@ import ( "testing" "time" - "github.com/filecoin-project/go-state-types/network" - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" + + "github.com/filecoin-project/go-state-types/network" + "golang.org/x/net/context" "golang.org/x/xerrors" @@ -23,7 +25,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin/market" evtmock "github.com/filecoin-project/lotus/chain/events/state/mock" "github.com/filecoin-project/lotus/chain/types" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" tutils "github.com/filecoin-project/specs-actors/v2/support/testing" "github.com/ipfs/go-cid" "github.com/stretchr/testify/require" @@ -32,6 +33,12 @@ import ( var errNotFound = errors.New("could not find") func TestGetCurrentDealInfo(t *testing.T) { + success, err := market8.NewLabelFromString("success") + require.NoError(t, err) + + other, err := market8.NewLabelFromString("other") + require.NoError(t, err) + ctx := context.Background() dummyCid, _ := cid.Parse("bafkqaaa") dummyCid2, _ := cid.Parse("bafkqaab") @@ -46,7 +53,7 @@ func TestGetCurrentDealInfo(t *testing.T) { StoragePricePerEpoch: abi.NewTokenAmount(1), ProviderCollateral: abi.NewTokenAmount(1), ClientCollateral: abi.NewTokenAmount(1), - Label: "success", + Label: success, } otherProposal := market.DealProposal{ PieceCID: dummyCid2, @@ -56,7 +63,7 @@ func TestGetCurrentDealInfo(t *testing.T) { StoragePricePerEpoch: abi.NewTokenAmount(1), ProviderCollateral: abi.NewTokenAmount(1), ClientCollateral: abi.NewTokenAmount(1), - Label: "other", + Label: other, } successDeal := &api.MarketDeal{ Proposal: proposal, @@ -260,11 +267,11 @@ type CurrentDealInfoMockAPI struct { func (mapi *CurrentDealInfoMockAPI) ChainGetMessage(ctx context.Context, c cid.Cid) (*types.Message, error) { var dealIDs []abi.DealID - var deals []market2.ClientDealProposal + var deals []market.ClientDealProposal for k, dl := range mapi.MarketDeals { dealIDs = append(dealIDs, k.DealID) - deals = append(deals, market2.ClientDealProposal{ - Proposal: market2.DealProposal(dl.Proposal), + deals = append(deals, market.ClientDealProposal{ + Proposal: market8.DealProposal(market.DealProposal(dl.Proposal)), ClientSignature: crypto.Signature{ Data: []byte("foo bar cat dog"), Type: crypto.SigTypeBLS, @@ -275,7 +282,7 @@ func (mapi *CurrentDealInfoMockAPI) ChainGetMessage(ctx context.Context, c cid.C return dealIDs[i] < dealIDs[j] }) buf := new(bytes.Buffer) - params := market2.PublishStorageDealsParams{Deals: deals} + params := market.PublishStorageDealsParams{Deals: deals} err := params.MarshalCBOR(buf) if err != nil { panic(err) diff --git a/extern/storage-sealing/types_test.go b/extern/storage-sealing/types_test.go index 68e2b1111..180f5dfcc 100644 --- a/extern/storage-sealing/types_test.go +++ b/extern/storage-sealing/types_test.go @@ -4,6 +4,8 @@ import ( "bytes" "testing" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + "github.com/ipfs/go-cid" "gotest.tools/assert" @@ -11,7 +13,6 @@ import ( cborutil "github.com/filecoin-project/go-cbor-util" "github.com/filecoin-project/go-state-types/abi" api "github.com/filecoin-project/lotus/api" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" tutils "github.com/filecoin-project/specs-actors/v2/support/testing" ) @@ -29,7 +30,7 @@ func TestSectorInfoSerialization(t *testing.T) { StartEpoch: 0, EndEpoch: 100, }, - DealProposal: &market2.DealProposal{ + DealProposal: &market7.DealProposal{ PieceCID: dummyCid, PieceSize: 5, Client: tutils.NewActorAddr(t, "client"), diff --git a/genesis/types.go b/genesis/types.go index d4c04113a..d65bac6ea 100644 --- a/genesis/types.go +++ b/genesis/types.go @@ -3,14 +3,12 @@ package genesis import ( "encoding/json" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" - - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" ) type ActorType string @@ -24,7 +22,7 @@ type PreSeal struct { CommR cid.Cid CommD cid.Cid SectorID abi.SectorNumber - Deal market2.DealProposal + Deal market8.DealProposal ProofType abi.RegisteredSealProof } diff --git a/go.mod b/go.mod index 6d4fba3bc..057d6692b 100644 --- a/go.mod +++ b/go.mod @@ -38,16 +38,16 @@ require ( github.com/filecoin-project/go-data-transfer v1.15.1 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.20.1 + github.com/filecoin-project/go-fil-markets v1.20.2-0.20220407213005-954803e6a2c8 github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-legs v0.3.7 + github.com/filecoin-project/go-legs v0.3.10 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/go-statemachine v1.0.2 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.5.0 + github.com/filecoin-project/index-provider v0.6.1 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 @@ -56,7 +56,7 @@ require ( github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0 github.com/filecoin-project/specs-storage v0.2.2 - github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294 + github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index 0b057f23c..e45280c2a 100644 --- a/go.sum +++ b/go.sum @@ -298,6 +298,7 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/filecoin-project/dagstore v0.5.2 h1:Nd6oXdnolbbVhpMpkYT5PJHOjQp4OBSntHpMV5pxj3c= github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= @@ -335,8 +336,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.20.1 h1:DwrFuNIWC0a2c2ESpHtdEMH3QCpR/hoZ5DwjNT+VJ+E= -github.com/filecoin-project/go-fil-markets v1.20.1/go.mod h1:QV767KIWHrikVK8R0u2wTc5wkee4gXOf5/AfxDoQckw= +github.com/filecoin-project/go-fil-markets v1.20.2-0.20220407213005-954803e6a2c8 h1:JYjWHFOoGUouZE3bu1DvIztkq11Q7S2VrNbcvfU3bOg= +github.com/filecoin-project/go-fil-markets v1.20.2-0.20220407213005-954803e6a2c8/go.mod h1:lhA01KAScD9S/N4J5On9Y3vXmqm/r2yWlKrbKRItLGY= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -344,11 +345,11 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43PjRCn3yBuUiZgIxuA0hTUamY= +github.com/filecoin-project/go-indexer-core v0.2.9/go.mod h1:u03I3HB6ZnqCc3cm8Tq+QkTWBbfKOvNxM8K6Ny/IHRw= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-legs v0.3.7 h1:yfm7fx+iy1nPtgPEQ6kQjvhoJOVbXide50STYdy+yos= -github.com/filecoin-project/go-legs v0.3.7/go.mod h1:pgekGm8/gKY5zCtQ/qGAoSjGP92wTLFqpO3GPHeu8YU= +github.com/filecoin-project/go-legs v0.3.10 h1:B14z78do63gkxf5Br7rPnxZsZk/m9PR3Mx5aOf2WTIs= +github.com/filecoin-project/go-legs v0.3.10/go.mod h1:5psVRe2nRQDa3PDtcd+2Ud4CirxOr2DI5VsDVMq7sIk= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -367,13 +368,15 @@ github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4 github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= +github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd h1:Ykxbz+LvSCUIl2zFaaPGmF8KHXTJu9T/PymgHr7IHjs= +github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.5.0 h1:k2C1RFvOvxmA2i8bhmkb3b4qun7RDRDzzs/y25/TwQg= -github.com/filecoin-project/index-provider v0.5.0/go.mod h1:KHVrP2vU3YuScb+fawObwTFoR882up9U07kk0ZrfP0c= +github.com/filecoin-project/index-provider v0.6.1 h1:yVpmtm1ASl2JZMNDC6H2Fe0neYo5akYgaJJB2wlcsMU= +github.com/filecoin-project/index-provider v0.6.1/go.mod h1:iAbSQ6sUpKC4GqfUSheGnYwj9d9B+X8pPi4BV1PgwZA= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -402,10 +405,12 @@ github.com/filecoin-project/specs-actors/v8 v8.0.0-20220404082322-5f5089f6e8bd h github.com/filecoin-project/specs-actors/v8 v8.0.0-20220404082322-5f5089f6e8bd/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294 h1:4GF9ZCcMmlZbDlUbBsOzFROM0gPnd9oo7QlYrQo5uvs= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c h1:WdAk1RfDBOhypv+tFzdonzk3jjQIfk2FJBZdRyFrLN4= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= -github.com/filecoin-project/storetheindex v0.3.5 h1:KoS9TvjPm6zIZfUH8atAHJbVHOO7GTP1MdTG+v0eE+Q= -github.com/filecoin-project/storetheindex v0.3.5/go.mod h1:0r3d0kSpK63O6AvLr1CjAINLi+nWD49clzcnKV+GLpI= +github.com/filecoin-project/storetheindex v0.4.0 h1:MPIDJYBknPbwBcVf+2/WEIK6LKxhZmfQGCrqKmvhFyU= +github.com/filecoin-project/storetheindex v0.4.0/go.mod h1:LIwqpXoKeGxOGEjmxPfdYVPQYoZOSI3oXMUd9XTCpjc= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -596,6 +601,7 @@ github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= @@ -942,7 +948,7 @@ github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= -github.com/ipld/go-storethehash v0.0.1/go.mod h1:w8cQfWInks8lvvbQTiKbCPusU9v0sqiViBihTHbavpQ= +github.com/ipld/go-storethehash v0.0.2/go.mod h1:w8cQfWInks8lvvbQTiKbCPusU9v0sqiViBihTHbavpQ= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -1081,6 +1087,9 @@ github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5Xm github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= github.com/libp2p/go-libp2p v0.18.1 h1:IK9EOGNO2ZghU4F+dx9c4xfhMNZr45x06CijJaZE/ms= github.com/libp2p/go-libp2p v0.18.1/go.mod h1:ll44MqmrIFKpL3BwCexxzm+7RZ8exEtN96V1rRdMG7Y= +github.com/libp2p/go-libp2p v0.18.0-rc5/go.mod h1:aZPS5l84bDvCvP4jkyEUT/J6YOpUq33Fgqrs3K59mpI= +github.com/libp2p/go-libp2p v0.18.0-rc6 h1:IR6TVPYGo1wDY0tY61gyPQVxK1koOkXh49ejVfAnH7A= +github.com/libp2p/go-libp2p v0.18.0-rc6/go.mod h1:oOUOAlBrm1L0+jxT10h2TMUMTDz6pV3EvmkJ3beDYGQ= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1277,7 +1286,6 @@ github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkR github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= -github.com/libp2p/go-libp2p-swarm v0.10.1/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= github.com/libp2p/go-libp2p-swarm v0.10.2 h1:UaXf+CTq6Ns1N2V1EgqJ9Q3xaRsiN7ImVlDMpirMAWw= github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1957,7 +1965,6 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14 h1:vo2wkP2ceHyGyZwFFtAabpot03EeSxxwAe57pOI9E/4= github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go index 6c04f6929..24e688faf 100644 --- a/markets/dagstore/wrapper_migration_test.go +++ b/markets/dagstore/wrapper_migration_test.go @@ -21,7 +21,7 @@ import ( "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" + "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" ) func TestShardRegistration(t *testing.T) { diff --git a/markets/storageadapter/client.go b/markets/storageadapter/client.go index 75061b1c1..3c6ba1879 100644 --- a/markets/storageadapter/client.go +++ b/markets/storageadapter/client.go @@ -6,8 +6,8 @@ import ( "bytes" "context" - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" "github.com/ipfs/go-cid" "go.uber.org/fx" @@ -269,12 +269,12 @@ func (c *ClientNodeAdapter) DealProviderCollateralBounds(ctx context.Context, si } // TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer) -func (c *ClientNodeAdapter) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, proposal market0.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorPreCommittedCallback) error { +func (c *ClientNodeAdapter) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, proposal market8.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorPreCommittedCallback) error { return c.scMgr.OnDealSectorPreCommitted(ctx, provider, marketactor.DealProposal(proposal), *publishCid, cb) } // TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer) -func (c *ClientNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, sectorNumber abi.SectorNumber, proposal market0.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorCommittedCallback) error { +func (c *ClientNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, sectorNumber abi.SectorNumber, proposal market8.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorCommittedCallback) error { return c.scMgr.OnDealSectorCommitted(ctx, provider, sectorNumber, marketactor.DealProposal(proposal), *publishCid, cb) } @@ -368,7 +368,7 @@ func (c *ClientNodeAdapter) OnDealExpiredOrSlashed(ctx context.Context, dealID a return nil } -func (c *ClientNodeAdapter) SignProposal(ctx context.Context, signer address.Address, proposal market0.DealProposal) (*marketactor.ClientDealProposal, error) { +func (c *ClientNodeAdapter) SignProposal(ctx context.Context, signer address.Address, proposal market8.DealProposal) (*marketactor.ClientDealProposal, error) { // TODO: output spec signed proposal buf, err := cborutil.Dump(&proposal) if err != nil { diff --git a/markets/storageadapter/dealpublisher.go b/markets/storageadapter/dealpublisher.go index 65a57d7ce..2805e8fe7 100644 --- a/markets/storageadapter/dealpublisher.go +++ b/markets/storageadapter/dealpublisher.go @@ -15,8 +15,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/exitcode" - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" @@ -60,7 +58,7 @@ type DealPublisher struct { publishSpec *api.MessageSendSpec lk sync.Mutex - pending []*pendingDeal + pending []*pendingDeal `` cancelWaitForMoreDeals context.CancelFunc publishPeriodStart time.Time startEpochSealingBuffer abi.ChainEpoch @@ -69,7 +67,7 @@ type DealPublisher struct { // A deal that is queued to be published type pendingDeal struct { ctx context.Context - deal market2.ClientDealProposal + deal market.ClientDealProposal Result chan publishResult } @@ -79,7 +77,7 @@ type publishResult struct { err error } -func newPendingDeal(ctx context.Context, deal market2.ClientDealProposal) *pendingDeal { +func newPendingDeal(ctx context.Context, deal market.ClientDealProposal) *pendingDeal { return &pendingDeal{ ctx: ctx, deal: deal, @@ -151,7 +149,7 @@ func (p *DealPublisher) PendingDeals() api.PendingDealInfo { } } - pending := make([]market2.ClientDealProposal, len(deals)) + pending := make([]market.ClientDealProposal, len(deals)) for i, deal := range deals { pending[i] = deal.deal } @@ -173,7 +171,7 @@ func (p *DealPublisher) ForcePublishPendingDeals() { p.publishAllDeals() } -func (p *DealPublisher) Publish(ctx context.Context, deal market2.ClientDealProposal) (cid.Cid, error) { +func (p *DealPublisher) Publish(ctx context.Context, deal market.ClientDealProposal) (cid.Cid, error) { pdeal := newPendingDeal(ctx, deal) // Add the deal to the queue @@ -297,7 +295,7 @@ func (p *DealPublisher) publishReady(ready []*pendingDeal) { // Validate each deal to make sure it can be published validated := make([]*pendingDeal, 0, len(ready)) - deals := make([]market2.ClientDealProposal, 0, len(ready)) + deals := make([]market.ClientDealProposal, 0, len(ready)) for _, pd := range ready { // Validate the deal if err := p.validateDeal(pd.deal); err != nil { @@ -321,7 +319,7 @@ func (p *DealPublisher) publishReady(ready []*pendingDeal) { // validateDeal checks that the deal proposal start epoch hasn't already // elapsed -func (p *DealPublisher) validateDeal(deal market2.ClientDealProposal) error { +func (p *DealPublisher) validateDeal(deal market.ClientDealProposal) error { start := time.Now() pcid, err := deal.Proposal.Cid() @@ -344,8 +342,8 @@ func (p *DealPublisher) validateDeal(deal market2.ClientDealProposal) error { return xerrors.Errorf("getting provider info: %w", err) } - params, err := actors.SerializeParams(&market2.PublishStorageDealsParams{ - Deals: []market0.ClientDealProposal{deal}, + params, err := actors.SerializeParams(&market.PublishStorageDealsParams{ + Deals: []market.ClientDealProposal{deal}, }) if err != nil { return xerrors.Errorf("serializing PublishStorageDeals params failed: %w", err) @@ -377,7 +375,7 @@ func (p *DealPublisher) validateDeal(deal market2.ClientDealProposal) error { } // Sends the publish message -func (p *DealPublisher) publishDealProposals(deals []market2.ClientDealProposal) (cid.Cid, error) { +func (p *DealPublisher) publishDealProposals(deals []market.ClientDealProposal) (cid.Cid, error) { if len(deals) == 0 { return cid.Undef, nil } @@ -400,7 +398,7 @@ func (p *DealPublisher) publishDealProposals(deals []market2.ClientDealProposal) return cid.Undef, err } - params, err := actors.SerializeParams(&market2.PublishStorageDealsParams{ + params, err := actors.SerializeParams(&market.PublishStorageDealsParams{ Deals: deals, }) @@ -427,7 +425,7 @@ func (p *DealPublisher) publishDealProposals(deals []market2.ClientDealProposal) return smsg.Cid(), nil } -func pieceCids(deals []market2.ClientDealProposal) string { +func pieceCids(deals []market.ClientDealProposal) string { cids := make([]string, 0, len(deals)) for _, dl := range deals { cids = append(cids, dl.Proposal.PieceCID.String()) diff --git a/markets/storageadapter/dealpublisher_test.go b/markets/storageadapter/dealpublisher_test.go index a0ee0ae06..11f40e580 100644 --- a/markets/storageadapter/dealpublisher_test.go +++ b/markets/storageadapter/dealpublisher_test.go @@ -7,6 +7,8 @@ import ( "testing" "time" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" + "github.com/ipfs/go-cid" "github.com/raulk/clock" "golang.org/x/xerrors" @@ -25,7 +27,6 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" - market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" ) func TestDealPublisher(t *testing.T) { @@ -250,7 +251,7 @@ func publishDeal(t *testing.T, dp *DealPublisher, invalid int, ctxCancelled bool startEpoch = abi.ChainEpoch(5) } deal := market.ClientDealProposal{ - Proposal: market0.DealProposal{ + Proposal: market8.DealProposal{ PieceCID: generateCids(1)[0], Client: getClientActor(t), Provider: getProviderActor(t), @@ -297,7 +298,7 @@ func checkPublishedDeals(t *testing.T, dpapi *dpAPI, dealsToPublish []market.Cli require.Equal(t, market.Methods.PublishStorageDeals, msg.Method) // Check that the expected number of deals was included in the message - var params market2.PublishStorageDealsParams + var params market.PublishStorageDealsParams err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)) require.NoError(t, err) require.Len(t, params.Deals, expectedDealsInMsg) @@ -335,7 +336,7 @@ func matchPieceCids(sent []market.ClientDealProposal, exp []market.ClientDealPro return true } -func dealPieceCids(deals []market2.ClientDealProposal) []cid.Cid { +func dealPieceCids(deals []market.ClientDealProposal) []cid.Cid { cids := make([]cid.Cid, 0, len(deals)) for _, dl := range deals { cids = append(cids, dl.Proposal.PieceCID) diff --git a/markets/storageadapter/ondealsectorcommitted_test.go b/markets/storageadapter/ondealsectorcommitted_test.go index b11bf03a5..9ebe60928 100644 --- a/markets/storageadapter/ondealsectorcommitted_test.go +++ b/markets/storageadapter/ondealsectorcommitted_test.go @@ -10,6 +10,8 @@ import ( "testing" "time" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + sealing "github.com/filecoin-project/lotus/extern/storage-sealing" "golang.org/x/xerrors" @@ -31,6 +33,9 @@ import ( ) func TestOnDealSectorPreCommitted(t *testing.T) { + label, err := market7.NewDealLabelFromString("success") + require.NoError(t, err) + provider := address.TestAddress ctx := context.Background() publishCid := generateCids(1)[0] @@ -46,7 +51,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) { StoragePricePerEpoch: abi.NewTokenAmount(1), ProviderCollateral: abi.NewTokenAmount(1), ClientCollateral: abi.NewTokenAmount(1), - Label: "success", + Label: label, } unfinishedDeal := &api.MarketDeal{ Proposal: proposal, @@ -252,6 +257,9 @@ func TestOnDealSectorPreCommitted(t *testing.T) { } func TestOnDealSectorCommitted(t *testing.T) { + label, err := market7.NewDealLabelFromString("success") + require.NoError(t, err) + provider := address.TestAddress publishCid := generateCids(1)[0] pieceCid := generateCids(1)[0] @@ -265,7 +273,7 @@ func TestOnDealSectorCommitted(t *testing.T) { StoragePricePerEpoch: abi.NewTokenAmount(1), ProviderCollateral: abi.NewTokenAmount(1), ClientCollateral: abi.NewTokenAmount(1), - Label: "success", + Label: label, } unfinishedDeal := &api.MarketDeal{ Proposal: proposal, diff --git a/markets/storageadapter/provider.go b/markets/storageadapter/provider.go index 0828db271..da586e616 100644 --- a/markets/storageadapter/provider.go +++ b/markets/storageadapter/provider.go @@ -6,6 +6,8 @@ import ( "context" "time" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" + "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" "go.uber.org/fx" @@ -17,7 +19,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/exitcode" - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v1api" @@ -284,12 +285,12 @@ func (n *ProviderNodeAdapter) DealProviderCollateralBounds(ctx context.Context, } // TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer) -func (n *ProviderNodeAdapter) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, proposal market2.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorPreCommittedCallback) error { +func (n *ProviderNodeAdapter) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, proposal market8.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorPreCommittedCallback) error { return n.scMgr.OnDealSectorPreCommitted(ctx, provider, market.DealProposal(proposal), *publishCid, cb) } // TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer) -func (n *ProviderNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, sectorNumber abi.SectorNumber, proposal market2.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorCommittedCallback) error { +func (n *ProviderNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, sectorNumber abi.SectorNumber, proposal market8.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorCommittedCallback) error { return n.scMgr.OnDealSectorCommitted(ctx, provider, sectorNumber, market.DealProposal(proposal), *publishCid, cb) } @@ -310,7 +311,7 @@ func (n *ProviderNodeAdapter) WaitForMessage(ctx context.Context, mcid cid.Cid, return cb(receipt.Receipt.ExitCode, receipt.Receipt.Return, receipt.Message, nil) } -func (n *ProviderNodeAdapter) WaitForPublishDeals(ctx context.Context, publishCid cid.Cid, proposal market2.DealProposal) (*storagemarket.PublishDealsWaitResult, error) { +func (n *ProviderNodeAdapter) WaitForPublishDeals(ctx context.Context, publishCid cid.Cid, proposal market8.DealProposal) (*storagemarket.PublishDealsWaitResult, error) { // Wait for deal to be published (plus additional time for confidence) receipt, err := n.StateWaitMsg(ctx, publishCid, 2*build.MessageConfidence, api.LookbackNoLimit, true) if err != nil { diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 5b4791cfa..3b4eee9f8 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -12,6 +12,8 @@ import ( "strings" "time" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" + bstore "github.com/ipfs/go-ipfs-blockstore" format "github.com/ipfs/go-ipld-format" unixfile "github.com/ipfs/go-unixfs/file" @@ -60,7 +62,6 @@ import ( "github.com/filecoin-project/lotus/markets/storageadapter" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/specs-actors/v3/actors/builtin/market" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/repo/imports" @@ -233,12 +234,17 @@ func (a *API) dealStarter(ctx context.Context, params *api.StartDealParams, isSt // stateless flow from here to the end // - dealProposal := &market.DealProposal{ + label, err := market8.NewLabelFromString(params.Data.Root.Encode(multibase.MustNewEncoder('u'))) + if err != nil { + return nil, xerrors.Errorf("failed to encode label: %w", err) + } + + dealProposal := &market8.DealProposal{ PieceCID: *params.Data.PieceCid, PieceSize: params.Data.PieceSize.Padded(), Client: walletKey, Provider: params.Miner, - Label: params.Data.Root.Encode(multibase.MustNewEncoder('u')), + Label: label, StartEpoch: dealStart, EndEpoch: calcDealExpiration(params.MinBlocksDuration, md, dealStart), StoragePricePerEpoch: big.Zero(), @@ -265,7 +271,7 @@ func (a *API) dealStarter(ctx context.Context, params *api.StartDealParams, isSt return nil, xerrors.Errorf("failed to sign proposal : %w", err) } - dealProposalSigned := &market.ClientDealProposal{ + dealProposalSigned := &market8.ClientDealProposal{ Proposal: *dealProposal, ClientSignature: *dealProposalSig, } diff --git a/storage/mockstorage/preseal.go b/storage/mockstorage/preseal.go index 66a2a5054..a53e710fb 100644 --- a/storage/mockstorage/preseal.go +++ b/storage/mockstorage/preseal.go @@ -9,8 +9,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/extern/sector-storage/mock" - - market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + "golang.org/x/xerrors" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/wallet" @@ -39,6 +39,11 @@ func PreSeal(spt abi.RegisteredSealProof, maddr address.Address, sectors int) (* } for i := range genm.Sectors { + label, err := market7.NewDealLabelFromString(fmt.Sprintf("%d", i)) + if err != nil { + return nil, nil, xerrors.Errorf("failed to create label: %w", err) + } + preseal := &genesis.PreSeal{} preseal.ProofType = spt @@ -47,12 +52,12 @@ func PreSeal(spt abi.RegisteredSealProof, maddr address.Address, sectors int) (* r := mock.CommDR(d) preseal.CommR, _ = commcid.ReplicaCommitmentV1ToCID(r[:]) preseal.SectorID = abi.SectorNumber(i + 1) - preseal.Deal = market2.DealProposal{ + preseal.Deal = market7.DealProposal{ PieceCID: preseal.CommD, PieceSize: abi.PaddedPieceSize(ssize), Client: k.Address, Provider: maddr, - Label: fmt.Sprintf("%d", i), + Label: label, StartEpoch: 1, EndEpoch: 10000, StoragePricePerEpoch: big.Zero(), From 124fe264921fa5aecd53c2bad52c0dae9d309f59 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Thu, 7 Apr 2022 17:33:03 -0600 Subject: [PATCH 039/228] WIP annoying errors --- chain/actors/builtin/market/state.go.template | 30 +++++++++++++++++-- chain/actors/builtin/market/v0.go | 26 ++++++++++++++-- chain/actors/builtin/market/v2.go | 26 ++++++++++++++-- chain/actors/builtin/market/v3.go | 26 ++++++++++++++-- chain/actors/builtin/market/v4.go | 26 ++++++++++++++-- chain/actors/builtin/market/v5.go | 26 ++++++++++++++-- chain/actors/builtin/market/v6.go | 26 ++++++++++++++-- chain/actors/builtin/market/v7.go | 26 ++++++++++++++-- chain/actors/builtin/market/v8.go | 23 ++++++++++++-- 9 files changed, 217 insertions(+), 18 deletions(-) diff --git a/chain/actors/builtin/market/state.go.template b/chain/actors/builtin/market/state.go.template index 5c14b6924..24c08e057 100644 --- a/chain/actors/builtin/market/state.go.template +++ b/chain/actors/builtin/market/state.go.template @@ -189,8 +189,34 @@ func (s *dealStates{{.v}}) array() adt.Array { return s.Array } -func fromV{{.v}}DealState(v{{.v}} market{{.v}}.DealState) DealState { - return (DealState)(v{{.v}}) +func fromV{{.v}}DealState(v{{.v}} market{{.v}}.DealState) (DealState, error) { + {{if (le .v 7)}} + label, err := labelFromGoString(v{{.v}}.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + {{else}} + label := v{{.v}}.Label + {{end}} + + + return DealProposal{ + PieceCID : v{{.v}}.PieceCID, + PieceSize : v{{.v}}.PieceSize, + VerifiedDeal :v{{.v}}.VerifiedDeal, + Client :v{{.v}}.Client, + Provider :v{{.v}}.Provider, + + Label: label, + + StartEpoch : v{{.v}}.StartEpoch, + EndEpoch :v{{.v}}.EndEpoch, + StoragePricePerEpoch :v{{.v}}.StoragePricePerEpoch, + + ProviderCollateral :v{{.v}}.ProviderCollateral, + ClientCollateral :v{{.v}}.ClientCollateral, + }, nil + } type dealProposals{{.v}} struct { diff --git a/chain/actors/builtin/market/v0.go b/chain/actors/builtin/market/v0.go index f210f5a40..b58210ae8 100644 --- a/chain/actors/builtin/market/v0.go +++ b/chain/actors/builtin/market/v0.go @@ -182,8 +182,30 @@ func (s *dealStates0) array() adt.Array { return s.Array } -func fromV0DealState(v0 market0.DealState) DealState { - return (DealState)(v0) +func fromV0DealState(v0 market0.DealState) (DealState, error) { + + label, err := labelFromGoString(v0.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + + return DealProposal{ + PieceCID: v0.PieceCID, + PieceSize: v0.PieceSize, + VerifiedDeal: v0.VerifiedDeal, + Client: v0.Client, + Provider: v0.Provider, + + Label: label, + + StartEpoch: v0.StartEpoch, + EndEpoch: v0.EndEpoch, + StoragePricePerEpoch: v0.StoragePricePerEpoch, + + ProviderCollateral: v0.ProviderCollateral, + ClientCollateral: v0.ClientCollateral, + }, nil + } type dealProposals0 struct { diff --git a/chain/actors/builtin/market/v2.go b/chain/actors/builtin/market/v2.go index f38368daa..6837c1d0e 100644 --- a/chain/actors/builtin/market/v2.go +++ b/chain/actors/builtin/market/v2.go @@ -182,8 +182,30 @@ func (s *dealStates2) array() adt.Array { return s.Array } -func fromV2DealState(v2 market2.DealState) DealState { - return (DealState)(v2) +func fromV2DealState(v2 market2.DealState) (DealState, error) { + + label, err := labelFromGoString(v2.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + + return DealProposal{ + PieceCID: v2.PieceCID, + PieceSize: v2.PieceSize, + VerifiedDeal: v2.VerifiedDeal, + Client: v2.Client, + Provider: v2.Provider, + + Label: label, + + StartEpoch: v2.StartEpoch, + EndEpoch: v2.EndEpoch, + StoragePricePerEpoch: v2.StoragePricePerEpoch, + + ProviderCollateral: v2.ProviderCollateral, + ClientCollateral: v2.ClientCollateral, + }, nil + } type dealProposals2 struct { diff --git a/chain/actors/builtin/market/v3.go b/chain/actors/builtin/market/v3.go index 26a661c87..004079514 100644 --- a/chain/actors/builtin/market/v3.go +++ b/chain/actors/builtin/market/v3.go @@ -177,8 +177,30 @@ func (s *dealStates3) array() adt.Array { return s.Array } -func fromV3DealState(v3 market3.DealState) DealState { - return (DealState)(v3) +func fromV3DealState(v3 market3.DealState) (DealState, error) { + + label, err := labelFromGoString(v3.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + + return DealProposal{ + PieceCID: v3.PieceCID, + PieceSize: v3.PieceSize, + VerifiedDeal: v3.VerifiedDeal, + Client: v3.Client, + Provider: v3.Provider, + + Label: label, + + StartEpoch: v3.StartEpoch, + EndEpoch: v3.EndEpoch, + StoragePricePerEpoch: v3.StoragePricePerEpoch, + + ProviderCollateral: v3.ProviderCollateral, + ClientCollateral: v3.ClientCollateral, + }, nil + } type dealProposals3 struct { diff --git a/chain/actors/builtin/market/v4.go b/chain/actors/builtin/market/v4.go index 915a99d52..20a21e3ca 100644 --- a/chain/actors/builtin/market/v4.go +++ b/chain/actors/builtin/market/v4.go @@ -177,8 +177,30 @@ func (s *dealStates4) array() adt.Array { return s.Array } -func fromV4DealState(v4 market4.DealState) DealState { - return (DealState)(v4) +func fromV4DealState(v4 market4.DealState) (DealState, error) { + + label, err := labelFromGoString(v4.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + + return DealProposal{ + PieceCID: v4.PieceCID, + PieceSize: v4.PieceSize, + VerifiedDeal: v4.VerifiedDeal, + Client: v4.Client, + Provider: v4.Provider, + + Label: label, + + StartEpoch: v4.StartEpoch, + EndEpoch: v4.EndEpoch, + StoragePricePerEpoch: v4.StoragePricePerEpoch, + + ProviderCollateral: v4.ProviderCollateral, + ClientCollateral: v4.ClientCollateral, + }, nil + } type dealProposals4 struct { diff --git a/chain/actors/builtin/market/v5.go b/chain/actors/builtin/market/v5.go index 5be3a18a1..84974e259 100644 --- a/chain/actors/builtin/market/v5.go +++ b/chain/actors/builtin/market/v5.go @@ -177,8 +177,30 @@ func (s *dealStates5) array() adt.Array { return s.Array } -func fromV5DealState(v5 market5.DealState) DealState { - return (DealState)(v5) +func fromV5DealState(v5 market5.DealState) (DealState, error) { + + label, err := labelFromGoString(v5.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + + return DealProposal{ + PieceCID: v5.PieceCID, + PieceSize: v5.PieceSize, + VerifiedDeal: v5.VerifiedDeal, + Client: v5.Client, + Provider: v5.Provider, + + Label: label, + + StartEpoch: v5.StartEpoch, + EndEpoch: v5.EndEpoch, + StoragePricePerEpoch: v5.StoragePricePerEpoch, + + ProviderCollateral: v5.ProviderCollateral, + ClientCollateral: v5.ClientCollateral, + }, nil + } type dealProposals5 struct { diff --git a/chain/actors/builtin/market/v6.go b/chain/actors/builtin/market/v6.go index ee82c0b8c..7849dcca3 100644 --- a/chain/actors/builtin/market/v6.go +++ b/chain/actors/builtin/market/v6.go @@ -177,8 +177,30 @@ func (s *dealStates6) array() adt.Array { return s.Array } -func fromV6DealState(v6 market6.DealState) DealState { - return (DealState)(v6) +func fromV6DealState(v6 market6.DealState) (DealState, error) { + + label, err := labelFromGoString(v6.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + + return DealProposal{ + PieceCID: v6.PieceCID, + PieceSize: v6.PieceSize, + VerifiedDeal: v6.VerifiedDeal, + Client: v6.Client, + Provider: v6.Provider, + + Label: label, + + StartEpoch: v6.StartEpoch, + EndEpoch: v6.EndEpoch, + StoragePricePerEpoch: v6.StoragePricePerEpoch, + + ProviderCollateral: v6.ProviderCollateral, + ClientCollateral: v6.ClientCollateral, + }, nil + } type dealProposals6 struct { diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go index 3c82d2522..928478150 100644 --- a/chain/actors/builtin/market/v7.go +++ b/chain/actors/builtin/market/v7.go @@ -177,8 +177,30 @@ func (s *dealStates7) array() adt.Array { return s.Array } -func fromV7DealState(v7 market7.DealState) DealState { - return (DealState)(v7) +func fromV7DealState(v7 market7.DealState) (DealState, error) { + + label, err := labelFromGoString(v7.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + + return DealProposal{ + PieceCID: v7.PieceCID, + PieceSize: v7.PieceSize, + VerifiedDeal: v7.VerifiedDeal, + Client: v7.Client, + Provider: v7.Provider, + + Label: label, + + StartEpoch: v7.StartEpoch, + EndEpoch: v7.EndEpoch, + StoragePricePerEpoch: v7.StoragePricePerEpoch, + + ProviderCollateral: v7.ProviderCollateral, + ClientCollateral: v7.ClientCollateral, + }, nil + } type dealProposals7 struct { diff --git a/chain/actors/builtin/market/v8.go b/chain/actors/builtin/market/v8.go index 43a8bd817..37cdc56d6 100644 --- a/chain/actors/builtin/market/v8.go +++ b/chain/actors/builtin/market/v8.go @@ -177,8 +177,27 @@ func (s *dealStates8) array() adt.Array { return s.Array } -func fromV8DealState(v8 market8.DealState) DealState { - return (DealState)(v8) +func fromV8DealState(v8 market8.DealState) (DealState, error) { + + label := v8.Label + + return DealProposal{ + PieceCID: v8.PieceCID, + PieceSize: v8.PieceSize, + VerifiedDeal: v8.VerifiedDeal, + Client: v8.Client, + Provider: v8.Provider, + + Label: label, + + StartEpoch: v8.StartEpoch, + EndEpoch: v8.EndEpoch, + StoragePricePerEpoch: v8.StoragePricePerEpoch, + + ProviderCollateral: v8.ProviderCollateral, + ClientCollateral: v8.ClientCollateral, + }, nil + } type dealProposals8 struct { From 7163fe61a09ebd80891bc99a1c356a351575b588 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Thu, 7 Apr 2022 17:36:27 -0600 Subject: [PATCH 040/228] Post rebase fix --- chain/actors/builtin/market/state.go.template | 78 +++++++------------ chain/actors/builtin/market/v0.go | 49 ++++++------ chain/actors/builtin/market/v2.go | 49 ++++++------ chain/actors/builtin/market/v3.go | 49 ++++++------ chain/actors/builtin/market/v4.go | 49 ++++++------ chain/actors/builtin/market/v5.go | 49 ++++++------ chain/actors/builtin/market/v6.go | 49 ++++++------ chain/actors/builtin/market/v7.go | 49 ++++++------ chain/actors/builtin/market/v8.go | 52 ++++--------- 9 files changed, 205 insertions(+), 268 deletions(-) diff --git a/chain/actors/builtin/market/state.go.template b/chain/actors/builtin/market/state.go.template index 24c08e057..7b980b96d 100644 --- a/chain/actors/builtin/market/state.go.template +++ b/chain/actors/builtin/market/state.go.template @@ -189,34 +189,8 @@ func (s *dealStates{{.v}}) array() adt.Array { return s.Array } -func fromV{{.v}}DealState(v{{.v}} market{{.v}}.DealState) (DealState, error) { - {{if (le .v 7)}} - label, err := labelFromGoString(v{{.v}}.Label) - if err != nil { - return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) - } - {{else}} - label := v{{.v}}.Label - {{end}} - - - return DealProposal{ - PieceCID : v{{.v}}.PieceCID, - PieceSize : v{{.v}}.PieceSize, - VerifiedDeal :v{{.v}}.VerifiedDeal, - Client :v{{.v}}.Client, - Provider :v{{.v}}.Provider, - - Label: label, - - StartEpoch : v{{.v}}.StartEpoch, - EndEpoch :v{{.v}}.EndEpoch, - StoragePricePerEpoch :v{{.v}}.StoragePricePerEpoch, - - ProviderCollateral :v{{.v}}.ProviderCollateral, - ClientCollateral :v{{.v}}.ClientCollateral, - }, nil - +func fromV{{.v}}DealState(v{{.v}} market{{.v}}.DealState) DealState { + return (DealState)(v{{.v}}) } type dealProposals{{.v}} struct { @@ -271,31 +245,35 @@ func (s *dealProposals{{.v}}) array() adt.Array { return s.Array } -func fromV{{.v}}DealProposal(v{{.v}} market{{.v}}.DealProposal) DealProposal { -{{if .isv8 }} - label, err := v8.Label.ToString() - if err != nil { - bs, _ := v8.Label.ToBytes() - label = string(bs) - } +func fromV{{.v}}DealProposal(v{{.v}} market{{.v}}.DealProposal) (DealProposal, error) { + {{if (le .v 7)}} + label, err := labelFromGoString(v{{.v}}.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + {{else}} + label := v{{.v}}.Label + {{end}} + return DealProposal{ - PieceCID: v8.PieceCID, - PieceSize: v8.PieceSize, - VerifiedDeal: v8.VerifiedDeal, - Client: v8.Client, - Provider: v8.Provider, - Label: label, - StartEpoch: v8.StartEpoch, - EndEpoch: v8.EndEpoch, - StoragePricePerEpoch: v8.StoragePricePerEpoch, - ProviderCollateral: v8.ProviderCollateral, - ClientCollateral: v8.ClientCollateral, - } -{{else}} - return (DealProposal)(v{{.v}}) -{{end}} + PieceCID : v{{.v}}.PieceCID, + PieceSize : v{{.v}}.PieceSize, + VerifiedDeal :v{{.v}}.VerifiedDeal, + Client :v{{.v}}.Client, + Provider :v{{.v}}.Provider, + + Label: label, + + StartEpoch : v{{.v}}.StartEpoch, + EndEpoch :v{{.v}}.EndEpoch, + StoragePricePerEpoch :v{{.v}}.StoragePricePerEpoch, + + ProviderCollateral :v{{.v}}.ProviderCollateral, + ClientCollateral :v{{.v}}.ClientCollateral, + }, nil } + func (s *state{{.v}}) GetState() interface{} { return &s.State } diff --git a/chain/actors/builtin/market/v0.go b/chain/actors/builtin/market/v0.go index b58210ae8..b00035976 100644 --- a/chain/actors/builtin/market/v0.go +++ b/chain/actors/builtin/market/v0.go @@ -182,30 +182,8 @@ func (s *dealStates0) array() adt.Array { return s.Array } -func fromV0DealState(v0 market0.DealState) (DealState, error) { - - label, err := labelFromGoString(v0.Label) - if err != nil { - return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) - } - - return DealProposal{ - PieceCID: v0.PieceCID, - PieceSize: v0.PieceSize, - VerifiedDeal: v0.VerifiedDeal, - Client: v0.Client, - Provider: v0.Provider, - - Label: label, - - StartEpoch: v0.StartEpoch, - EndEpoch: v0.EndEpoch, - StoragePricePerEpoch: v0.StoragePricePerEpoch, - - ProviderCollateral: v0.ProviderCollateral, - ClientCollateral: v0.ClientCollateral, - }, nil - +func fromV0DealState(v0 market0.DealState) DealState { + return (DealState)(v0) } type dealProposals0 struct { @@ -260,10 +238,29 @@ func (s *dealProposals0) array() adt.Array { return s.Array } -func fromV0DealProposal(v0 market0.DealProposal) DealProposal { +func fromV0DealProposal(v0 market0.DealProposal) (DealProposal, error) { - return (DealProposal)(v0) + label, err := labelFromGoString(v0.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + return DealProposal{ + PieceCID: v0.PieceCID, + PieceSize: v0.PieceSize, + VerifiedDeal: v0.VerifiedDeal, + Client: v0.Client, + Provider: v0.Provider, + + Label: label, + + StartEpoch: v0.StartEpoch, + EndEpoch: v0.EndEpoch, + StoragePricePerEpoch: v0.StoragePricePerEpoch, + + ProviderCollateral: v0.ProviderCollateral, + ClientCollateral: v0.ClientCollateral, + }, nil } func (s *state0) GetState() interface{} { diff --git a/chain/actors/builtin/market/v2.go b/chain/actors/builtin/market/v2.go index 6837c1d0e..b75fe8551 100644 --- a/chain/actors/builtin/market/v2.go +++ b/chain/actors/builtin/market/v2.go @@ -182,30 +182,8 @@ func (s *dealStates2) array() adt.Array { return s.Array } -func fromV2DealState(v2 market2.DealState) (DealState, error) { - - label, err := labelFromGoString(v2.Label) - if err != nil { - return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) - } - - return DealProposal{ - PieceCID: v2.PieceCID, - PieceSize: v2.PieceSize, - VerifiedDeal: v2.VerifiedDeal, - Client: v2.Client, - Provider: v2.Provider, - - Label: label, - - StartEpoch: v2.StartEpoch, - EndEpoch: v2.EndEpoch, - StoragePricePerEpoch: v2.StoragePricePerEpoch, - - ProviderCollateral: v2.ProviderCollateral, - ClientCollateral: v2.ClientCollateral, - }, nil - +func fromV2DealState(v2 market2.DealState) DealState { + return (DealState)(v2) } type dealProposals2 struct { @@ -260,10 +238,29 @@ func (s *dealProposals2) array() adt.Array { return s.Array } -func fromV2DealProposal(v2 market2.DealProposal) DealProposal { +func fromV2DealProposal(v2 market2.DealProposal) (DealProposal, error) { - return (DealProposal)(v2) + label, err := labelFromGoString(v2.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + return DealProposal{ + PieceCID: v2.PieceCID, + PieceSize: v2.PieceSize, + VerifiedDeal: v2.VerifiedDeal, + Client: v2.Client, + Provider: v2.Provider, + + Label: label, + + StartEpoch: v2.StartEpoch, + EndEpoch: v2.EndEpoch, + StoragePricePerEpoch: v2.StoragePricePerEpoch, + + ProviderCollateral: v2.ProviderCollateral, + ClientCollateral: v2.ClientCollateral, + }, nil } func (s *state2) GetState() interface{} { diff --git a/chain/actors/builtin/market/v3.go b/chain/actors/builtin/market/v3.go index 004079514..0bca42eae 100644 --- a/chain/actors/builtin/market/v3.go +++ b/chain/actors/builtin/market/v3.go @@ -177,30 +177,8 @@ func (s *dealStates3) array() adt.Array { return s.Array } -func fromV3DealState(v3 market3.DealState) (DealState, error) { - - label, err := labelFromGoString(v3.Label) - if err != nil { - return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) - } - - return DealProposal{ - PieceCID: v3.PieceCID, - PieceSize: v3.PieceSize, - VerifiedDeal: v3.VerifiedDeal, - Client: v3.Client, - Provider: v3.Provider, - - Label: label, - - StartEpoch: v3.StartEpoch, - EndEpoch: v3.EndEpoch, - StoragePricePerEpoch: v3.StoragePricePerEpoch, - - ProviderCollateral: v3.ProviderCollateral, - ClientCollateral: v3.ClientCollateral, - }, nil - +func fromV3DealState(v3 market3.DealState) DealState { + return (DealState)(v3) } type dealProposals3 struct { @@ -255,10 +233,29 @@ func (s *dealProposals3) array() adt.Array { return s.Array } -func fromV3DealProposal(v3 market3.DealProposal) DealProposal { +func fromV3DealProposal(v3 market3.DealProposal) (DealProposal, error) { - return (DealProposal)(v3) + label, err := labelFromGoString(v3.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + return DealProposal{ + PieceCID: v3.PieceCID, + PieceSize: v3.PieceSize, + VerifiedDeal: v3.VerifiedDeal, + Client: v3.Client, + Provider: v3.Provider, + + Label: label, + + StartEpoch: v3.StartEpoch, + EndEpoch: v3.EndEpoch, + StoragePricePerEpoch: v3.StoragePricePerEpoch, + + ProviderCollateral: v3.ProviderCollateral, + ClientCollateral: v3.ClientCollateral, + }, nil } func (s *state3) GetState() interface{} { diff --git a/chain/actors/builtin/market/v4.go b/chain/actors/builtin/market/v4.go index 20a21e3ca..7ada6d57b 100644 --- a/chain/actors/builtin/market/v4.go +++ b/chain/actors/builtin/market/v4.go @@ -177,30 +177,8 @@ func (s *dealStates4) array() adt.Array { return s.Array } -func fromV4DealState(v4 market4.DealState) (DealState, error) { - - label, err := labelFromGoString(v4.Label) - if err != nil { - return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) - } - - return DealProposal{ - PieceCID: v4.PieceCID, - PieceSize: v4.PieceSize, - VerifiedDeal: v4.VerifiedDeal, - Client: v4.Client, - Provider: v4.Provider, - - Label: label, - - StartEpoch: v4.StartEpoch, - EndEpoch: v4.EndEpoch, - StoragePricePerEpoch: v4.StoragePricePerEpoch, - - ProviderCollateral: v4.ProviderCollateral, - ClientCollateral: v4.ClientCollateral, - }, nil - +func fromV4DealState(v4 market4.DealState) DealState { + return (DealState)(v4) } type dealProposals4 struct { @@ -255,10 +233,29 @@ func (s *dealProposals4) array() adt.Array { return s.Array } -func fromV4DealProposal(v4 market4.DealProposal) DealProposal { +func fromV4DealProposal(v4 market4.DealProposal) (DealProposal, error) { - return (DealProposal)(v4) + label, err := labelFromGoString(v4.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + return DealProposal{ + PieceCID: v4.PieceCID, + PieceSize: v4.PieceSize, + VerifiedDeal: v4.VerifiedDeal, + Client: v4.Client, + Provider: v4.Provider, + + Label: label, + + StartEpoch: v4.StartEpoch, + EndEpoch: v4.EndEpoch, + StoragePricePerEpoch: v4.StoragePricePerEpoch, + + ProviderCollateral: v4.ProviderCollateral, + ClientCollateral: v4.ClientCollateral, + }, nil } func (s *state4) GetState() interface{} { diff --git a/chain/actors/builtin/market/v5.go b/chain/actors/builtin/market/v5.go index 84974e259..c4301449b 100644 --- a/chain/actors/builtin/market/v5.go +++ b/chain/actors/builtin/market/v5.go @@ -177,30 +177,8 @@ func (s *dealStates5) array() adt.Array { return s.Array } -func fromV5DealState(v5 market5.DealState) (DealState, error) { - - label, err := labelFromGoString(v5.Label) - if err != nil { - return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) - } - - return DealProposal{ - PieceCID: v5.PieceCID, - PieceSize: v5.PieceSize, - VerifiedDeal: v5.VerifiedDeal, - Client: v5.Client, - Provider: v5.Provider, - - Label: label, - - StartEpoch: v5.StartEpoch, - EndEpoch: v5.EndEpoch, - StoragePricePerEpoch: v5.StoragePricePerEpoch, - - ProviderCollateral: v5.ProviderCollateral, - ClientCollateral: v5.ClientCollateral, - }, nil - +func fromV5DealState(v5 market5.DealState) DealState { + return (DealState)(v5) } type dealProposals5 struct { @@ -255,10 +233,29 @@ func (s *dealProposals5) array() adt.Array { return s.Array } -func fromV5DealProposal(v5 market5.DealProposal) DealProposal { +func fromV5DealProposal(v5 market5.DealProposal) (DealProposal, error) { - return (DealProposal)(v5) + label, err := labelFromGoString(v5.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + return DealProposal{ + PieceCID: v5.PieceCID, + PieceSize: v5.PieceSize, + VerifiedDeal: v5.VerifiedDeal, + Client: v5.Client, + Provider: v5.Provider, + + Label: label, + + StartEpoch: v5.StartEpoch, + EndEpoch: v5.EndEpoch, + StoragePricePerEpoch: v5.StoragePricePerEpoch, + + ProviderCollateral: v5.ProviderCollateral, + ClientCollateral: v5.ClientCollateral, + }, nil } func (s *state5) GetState() interface{} { diff --git a/chain/actors/builtin/market/v6.go b/chain/actors/builtin/market/v6.go index 7849dcca3..1fb16790b 100644 --- a/chain/actors/builtin/market/v6.go +++ b/chain/actors/builtin/market/v6.go @@ -177,30 +177,8 @@ func (s *dealStates6) array() adt.Array { return s.Array } -func fromV6DealState(v6 market6.DealState) (DealState, error) { - - label, err := labelFromGoString(v6.Label) - if err != nil { - return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) - } - - return DealProposal{ - PieceCID: v6.PieceCID, - PieceSize: v6.PieceSize, - VerifiedDeal: v6.VerifiedDeal, - Client: v6.Client, - Provider: v6.Provider, - - Label: label, - - StartEpoch: v6.StartEpoch, - EndEpoch: v6.EndEpoch, - StoragePricePerEpoch: v6.StoragePricePerEpoch, - - ProviderCollateral: v6.ProviderCollateral, - ClientCollateral: v6.ClientCollateral, - }, nil - +func fromV6DealState(v6 market6.DealState) DealState { + return (DealState)(v6) } type dealProposals6 struct { @@ -255,10 +233,29 @@ func (s *dealProposals6) array() adt.Array { return s.Array } -func fromV6DealProposal(v6 market6.DealProposal) DealProposal { +func fromV6DealProposal(v6 market6.DealProposal) (DealProposal, error) { - return (DealProposal)(v6) + label, err := labelFromGoString(v6.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + return DealProposal{ + PieceCID: v6.PieceCID, + PieceSize: v6.PieceSize, + VerifiedDeal: v6.VerifiedDeal, + Client: v6.Client, + Provider: v6.Provider, + + Label: label, + + StartEpoch: v6.StartEpoch, + EndEpoch: v6.EndEpoch, + StoragePricePerEpoch: v6.StoragePricePerEpoch, + + ProviderCollateral: v6.ProviderCollateral, + ClientCollateral: v6.ClientCollateral, + }, nil } func (s *state6) GetState() interface{} { diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go index 928478150..8b91a6c28 100644 --- a/chain/actors/builtin/market/v7.go +++ b/chain/actors/builtin/market/v7.go @@ -177,30 +177,8 @@ func (s *dealStates7) array() adt.Array { return s.Array } -func fromV7DealState(v7 market7.DealState) (DealState, error) { - - label, err := labelFromGoString(v7.Label) - if err != nil { - return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) - } - - return DealProposal{ - PieceCID: v7.PieceCID, - PieceSize: v7.PieceSize, - VerifiedDeal: v7.VerifiedDeal, - Client: v7.Client, - Provider: v7.Provider, - - Label: label, - - StartEpoch: v7.StartEpoch, - EndEpoch: v7.EndEpoch, - StoragePricePerEpoch: v7.StoragePricePerEpoch, - - ProviderCollateral: v7.ProviderCollateral, - ClientCollateral: v7.ClientCollateral, - }, nil - +func fromV7DealState(v7 market7.DealState) DealState { + return (DealState)(v7) } type dealProposals7 struct { @@ -255,10 +233,29 @@ func (s *dealProposals7) array() adt.Array { return s.Array } -func fromV7DealProposal(v7 market7.DealProposal) DealProposal { +func fromV7DealProposal(v7 market7.DealProposal) (DealProposal, error) { - return (DealProposal)(v7) + label, err := labelFromGoString(v7.Label) + if err != nil { + return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err) + } + return DealProposal{ + PieceCID: v7.PieceCID, + PieceSize: v7.PieceSize, + VerifiedDeal: v7.VerifiedDeal, + Client: v7.Client, + Provider: v7.Provider, + + Label: label, + + StartEpoch: v7.StartEpoch, + EndEpoch: v7.EndEpoch, + StoragePricePerEpoch: v7.StoragePricePerEpoch, + + ProviderCollateral: v7.ProviderCollateral, + ClientCollateral: v7.ClientCollateral, + }, nil } func (s *state7) GetState() interface{} { diff --git a/chain/actors/builtin/market/v8.go b/chain/actors/builtin/market/v8.go index 37cdc56d6..6f8e783f1 100644 --- a/chain/actors/builtin/market/v8.go +++ b/chain/actors/builtin/market/v8.go @@ -177,27 +177,8 @@ func (s *dealStates8) array() adt.Array { return s.Array } -func fromV8DealState(v8 market8.DealState) (DealState, error) { - - label := v8.Label - - return DealProposal{ - PieceCID: v8.PieceCID, - PieceSize: v8.PieceSize, - VerifiedDeal: v8.VerifiedDeal, - Client: v8.Client, - Provider: v8.Provider, - - Label: label, - - StartEpoch: v8.StartEpoch, - EndEpoch: v8.EndEpoch, - StoragePricePerEpoch: v8.StoragePricePerEpoch, - - ProviderCollateral: v8.ProviderCollateral, - ClientCollateral: v8.ClientCollateral, - }, nil - +func fromV8DealState(v8 market8.DealState) DealState { + return (DealState)(v8) } type dealProposals8 struct { @@ -252,27 +233,26 @@ func (s *dealProposals8) array() adt.Array { return s.Array } -func fromV8DealProposal(v8 market8.DealProposal) DealProposal { +func fromV8DealProposal(v8 market8.DealProposal) (DealProposal, error) { + + label := v8.Label - label, err := v8.Label.ToString() - if err != nil { - bs, _ := v8.Label.ToBytes() - label = string(bs) - } return DealProposal{ - PieceCID: v8.PieceCID, - PieceSize: v8.PieceSize, - VerifiedDeal: v8.VerifiedDeal, - Client: v8.Client, - Provider: v8.Provider, - Label: label, + PieceCID: v8.PieceCID, + PieceSize: v8.PieceSize, + VerifiedDeal: v8.VerifiedDeal, + Client: v8.Client, + Provider: v8.Provider, + + Label: label, + StartEpoch: v8.StartEpoch, EndEpoch: v8.EndEpoch, StoragePricePerEpoch: v8.StoragePricePerEpoch, - ProviderCollateral: v8.ProviderCollateral, - ClientCollateral: v8.ClientCollateral, - } + ProviderCollateral: v8.ProviderCollateral, + ClientCollateral: v8.ClientCollateral, + }, nil } func (s *state8) GetState() interface{} { From 60d09579bed5c435785c7cfb1c659dc3d49e05c9 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Fri, 8 Apr 2022 07:44:46 -0600 Subject: [PATCH 041/228] More fixes --- chain/stmgr/forks_test.go | 6 +++--- extern/storage-sealing/types_test.go | 5 ++--- markets/dagstore/wrapper_migration_test.go | 2 +- markets/storageadapter/ondealsectorcommitted_test.go | 6 +++--- storage/mockstorage/preseal.go | 6 +++--- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/chain/stmgr/forks_test.go b/chain/stmgr/forks_test.go index 82ac1a7f9..418834c76 100644 --- a/chain/stmgr/forks_test.go +++ b/chain/stmgr/forks_test.go @@ -130,7 +130,7 @@ func TestForkHeightTriggers(t *testing.T) { Network: network.Version1, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - mf cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + root cid.Cid, _ cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { cst := ipldcbor.NewCborStore(sm.ChainStore().StateBlockstore()) st, err := sm.StateTree(root) @@ -276,7 +276,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) { Expensive: true, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - mf cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + root cid.Cid, _ cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { migrationCount++ return root, nil }}}, cg.BeaconSchedule()) @@ -412,7 +412,7 @@ func TestForkPreMigration(t *testing.T) { Network: network.Version1, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - mf cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + root cid.Cid, _ cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { // Make sure the test that should be canceled, is canceled. select { diff --git a/extern/storage-sealing/types_test.go b/extern/storage-sealing/types_test.go index 180f5dfcc..b16ec0a06 100644 --- a/extern/storage-sealing/types_test.go +++ b/extern/storage-sealing/types_test.go @@ -4,8 +4,6 @@ import ( "bytes" "testing" - market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" - "github.com/ipfs/go-cid" "gotest.tools/assert" @@ -14,6 +12,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" api "github.com/filecoin-project/lotus/api" tutils "github.com/filecoin-project/specs-actors/v2/support/testing" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" ) func TestSectorInfoSerialization(t *testing.T) { @@ -30,7 +29,7 @@ func TestSectorInfoSerialization(t *testing.T) { StartEpoch: 0, EndEpoch: 100, }, - DealProposal: &market7.DealProposal{ + DealProposal: &market8.DealProposal{ PieceCID: dummyCid, PieceSize: 5, Client: tutils.NewActorAddr(t, "client"), diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go index 24e688faf..7e2a3663d 100644 --- a/markets/dagstore/wrapper_migration_test.go +++ b/markets/dagstore/wrapper_migration_test.go @@ -21,7 +21,7 @@ import ( "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" ) func TestShardRegistration(t *testing.T) { diff --git a/markets/storageadapter/ondealsectorcommitted_test.go b/markets/storageadapter/ondealsectorcommitted_test.go index 9ebe60928..349cf8e1f 100644 --- a/markets/storageadapter/ondealsectorcommitted_test.go +++ b/markets/storageadapter/ondealsectorcommitted_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" sealing "github.com/filecoin-project/lotus/extern/storage-sealing" @@ -33,7 +33,7 @@ import ( ) func TestOnDealSectorPreCommitted(t *testing.T) { - label, err := market7.NewDealLabelFromString("success") + label, err := market8.NewLabelFromString("success") require.NoError(t, err) provider := address.TestAddress @@ -257,7 +257,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) { } func TestOnDealSectorCommitted(t *testing.T) { - label, err := market7.NewDealLabelFromString("success") + label, err := market8.NewLabelFromString("success") require.NoError(t, err) provider := address.TestAddress diff --git a/storage/mockstorage/preseal.go b/storage/mockstorage/preseal.go index a53e710fb..01fb31ee7 100644 --- a/storage/mockstorage/preseal.go +++ b/storage/mockstorage/preseal.go @@ -9,7 +9,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/extern/sector-storage/mock" - market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + market8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/market" "golang.org/x/xerrors" "github.com/filecoin-project/lotus/chain/types" @@ -39,7 +39,7 @@ func PreSeal(spt abi.RegisteredSealProof, maddr address.Address, sectors int) (* } for i := range genm.Sectors { - label, err := market7.NewDealLabelFromString(fmt.Sprintf("%d", i)) + label, err := market8.NewLabelFromString(fmt.Sprintf("%d", i)) if err != nil { return nil, nil, xerrors.Errorf("failed to create label: %w", err) } @@ -52,7 +52,7 @@ func PreSeal(spt abi.RegisteredSealProof, maddr address.Address, sectors int) (* r := mock.CommDR(d) preseal.CommR, _ = commcid.ReplicaCommitmentV1ToCID(r[:]) preseal.SectorID = abi.SectorNumber(i + 1) - preseal.Deal = market7.DealProposal{ + preseal.Deal = market8.DealProposal{ PieceCID: preseal.CommD, PieceSize: abi.PaddedPieceSize(ssize), Client: k.Address, From 0f6da17cd1f50b31388175305c43c47def82b91a Mon Sep 17 00:00:00 2001 From: zenground0 Date: Fri, 8 Apr 2022 08:03:14 -0600 Subject: [PATCH 042/228] Lint --- cmd/lotus-shed/terminations.go | 10 +++++++++- extern/storage-sealing/currentdealinfo_test.go | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go index 0691f35da..d04fed773 100644 --- a/cmd/lotus-shed/terminations.go +++ b/cmd/lotus-shed/terminations.go @@ -167,8 +167,16 @@ var terminationsCmd = &cli.Command{ if err != nil { return err } + label, err := prop.Label.ToString() + if err != nil { + labelBs, err := prop.Label.ToBytes() + if err != nil { + return err + } + label = string(labelBs) + } if find { - fmt.Printf("%s, %d, %d, %s, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.Client, prop.PieceCID, prop.Label) + fmt.Printf("%s, %d, %d, %s, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.Client, prop.PieceCID, label) } } } diff --git a/extern/storage-sealing/currentdealinfo_test.go b/extern/storage-sealing/currentdealinfo_test.go index 8cb6343ef..2536e6740 100644 --- a/extern/storage-sealing/currentdealinfo_test.go +++ b/extern/storage-sealing/currentdealinfo_test.go @@ -271,7 +271,7 @@ func (mapi *CurrentDealInfoMockAPI) ChainGetMessage(ctx context.Context, c cid.C for k, dl := range mapi.MarketDeals { dealIDs = append(dealIDs, k.DealID) deals = append(deals, market.ClientDealProposal{ - Proposal: market8.DealProposal(market.DealProposal(dl.Proposal)), + Proposal: market8.DealProposal(dl.Proposal), ClientSignature: crypto.Signature{ Data: []byte("foo bar cat dog"), Type: crypto.SigTypeBLS, From 8562798940b31d90d21bdd6aee9c2a6ae440f732 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 11 Apr 2022 13:32:09 -0400 Subject: [PATCH 043/228] Use go-fil-markets tag --- go.mod | 2 +- go.sum | 4 ++-- markets/storageadapter/dealpublisher.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 057d6692b..c632fde5c 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.15.1 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.20.2-0.20220407213005-954803e6a2c8 + github.com/filecoin-project/go-fil-markets v1.20.2 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-legs v0.3.10 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index e45280c2a..59562b270 100644 --- a/go.sum +++ b/go.sum @@ -336,8 +336,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.20.2-0.20220407213005-954803e6a2c8 h1:JYjWHFOoGUouZE3bu1DvIztkq11Q7S2VrNbcvfU3bOg= -github.com/filecoin-project/go-fil-markets v1.20.2-0.20220407213005-954803e6a2c8/go.mod h1:lhA01KAScD9S/N4J5On9Y3vXmqm/r2yWlKrbKRItLGY= +github.com/filecoin-project/go-fil-markets v1.20.2 h1:OnfT3ggxksjz0IpPeWF4SvwVqQPmsQE3Ei4CB1Y/d0A= +github.com/filecoin-project/go-fil-markets v1.20.2/go.mod h1:lhA01KAScD9S/N4J5On9Y3vXmqm/r2yWlKrbKRItLGY= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= diff --git a/markets/storageadapter/dealpublisher.go b/markets/storageadapter/dealpublisher.go index 2805e8fe7..8b0ae44d6 100644 --- a/markets/storageadapter/dealpublisher.go +++ b/markets/storageadapter/dealpublisher.go @@ -58,7 +58,7 @@ type DealPublisher struct { publishSpec *api.MessageSendSpec lk sync.Mutex - pending []*pendingDeal `` + pending []*pendingDeal cancelWaitForMoreDeals context.CancelFunc publishPeriodStart time.Time startEpochSealingBuffer abi.ChainEpoch From cd5829ae423a280f6b3247e9c7e06acac588eb7e Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 09:49:00 +0300 Subject: [PATCH 044/228] update specs-actors --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index c632fde5c..8ce7700d4 100644 --- a/go.mod +++ b/go.mod @@ -56,7 +56,7 @@ require ( github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0 github.com/filecoin-project/specs-storage v0.2.2 - github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c + github.com/filecoin-project/specs-actors/v8 v8.0.0-20220412064630-4d0ecb61fc9d github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index 59562b270..8b394b99a 100644 --- a/go.sum +++ b/go.sum @@ -407,6 +407,8 @@ github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294 h github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c h1:WdAk1RfDBOhypv+tFzdonzk3jjQIfk2FJBZdRyFrLN4= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220412064630-4d0ecb61fc9d h1:w6UFGm+YAqnc18gFRGUhu5DRaIcUl3HuWrT7Mbw5GSA= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220412064630-4d0ecb61fc9d/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/storetheindex v0.4.0 h1:MPIDJYBknPbwBcVf+2/WEIK6LKxhZmfQGCrqKmvhFyU= From 19593eda3bdc56b7fb5c4502389a0c9de8054645 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 09:52:18 +0300 Subject: [PATCH 045/228] fix forks_test --- chain/stmgr/forks_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chain/stmgr/forks_test.go b/chain/stmgr/forks_test.go index 418834c76..2050eda0f 100644 --- a/chain/stmgr/forks_test.go +++ b/chain/stmgr/forks_test.go @@ -130,7 +130,7 @@ func TestForkHeightTriggers(t *testing.T) { Network: network.Version1, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - root cid.Cid, _ cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + _ cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { cst := ipldcbor.NewCborStore(sm.ChainStore().StateBlockstore()) st, err := sm.StateTree(root) @@ -276,7 +276,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) { Expensive: true, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - root cid.Cid, _ cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + _ cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { migrationCount++ return root, nil }}}, cg.BeaconSchedule()) @@ -412,7 +412,7 @@ func TestForkPreMigration(t *testing.T) { Network: network.Version1, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - root cid.Cid, _ cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + _ cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { // Make sure the test that should be canceled, is canceled. select { From 54f312139f4109d5a6a84f409283c5acb5c4aab3 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 09:56:42 +0300 Subject: [PATCH 046/228] removed dead code from builtin actor template init funcs --- chain/actors/builtin/account/actor.go.template | 6 ------ chain/actors/builtin/init/actor.go.template | 6 ------ chain/actors/builtin/market/actor.go.template | 6 ------ chain/actors/builtin/miner/actor.go.template | 6 ------ chain/actors/builtin/multisig/actor.go.template | 6 ------ chain/actors/builtin/paych/actor.go.template | 6 ------ chain/actors/builtin/power/actor.go.template | 6 ------ chain/actors/builtin/reward/actor.go.template | 6 ------ chain/actors/builtin/verifreg/actor.go.template | 6 ------ 9 files changed, 54 deletions(-) diff --git a/chain/actors/builtin/account/actor.go.template b/chain/actors/builtin/account/actor.go.template index 603d7c0ae..fb5a149e8 100644 --- a/chain/actors/builtin/account/actor.go.template +++ b/chain/actors/builtin/account/actor.go.template @@ -21,12 +21,6 @@ func init() { builtin.RegisterActorState(builtin{{.}}.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) - } {{end}}} var Methods = builtin4.MethodsAccount diff --git a/chain/actors/builtin/init/actor.go.template b/chain/actors/builtin/init/actor.go.template index 3c1457fdf..620a57948 100644 --- a/chain/actors/builtin/init/actor.go.template +++ b/chain/actors/builtin/init/actor.go.template @@ -23,12 +23,6 @@ func init() { builtin.RegisterActorState(builtin{{.}}.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) - } {{end}}} var ( diff --git a/chain/actors/builtin/market/actor.go.template b/chain/actors/builtin/market/actor.go.template index 32d293924..293e6b461 100644 --- a/chain/actors/builtin/market/actor.go.template +++ b/chain/actors/builtin/market/actor.go.template @@ -30,12 +30,6 @@ func init() { builtin.RegisterActorState(builtin{{.}}.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) - } {{end}}} var ( diff --git a/chain/actors/builtin/miner/actor.go.template b/chain/actors/builtin/miner/actor.go.template index 278213237..61bd21f98 100644 --- a/chain/actors/builtin/miner/actor.go.template +++ b/chain/actors/builtin/miner/actor.go.template @@ -34,12 +34,6 @@ func init() { builtin.RegisterActorState(builtin{{.}}.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) - } {{end}} } diff --git a/chain/actors/builtin/multisig/actor.go.template b/chain/actors/builtin/multisig/actor.go.template index 6a4062900..7fb5b70d1 100644 --- a/chain/actors/builtin/multisig/actor.go.template +++ b/chain/actors/builtin/multisig/actor.go.template @@ -29,12 +29,6 @@ func init() { builtin.RegisterActorState(builtin{{.}}.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) - } {{end}}} func Load(store adt.Store, act *types.Actor) (State, error) { diff --git a/chain/actors/builtin/paych/actor.go.template b/chain/actors/builtin/paych/actor.go.template index 7f39eb8c6..28c4a24bb 100644 --- a/chain/actors/builtin/paych/actor.go.template +++ b/chain/actors/builtin/paych/actor.go.template @@ -29,12 +29,6 @@ func init() { builtin.RegisterActorState(builtin{{.}}.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) - } {{end}}} // Load returns an abstract copy of payment channel state, irregardless of actor version diff --git a/chain/actors/builtin/power/actor.go.template b/chain/actors/builtin/power/actor.go.template index 2feb764e5..1d0626e89 100644 --- a/chain/actors/builtin/power/actor.go.template +++ b/chain/actors/builtin/power/actor.go.template @@ -24,12 +24,6 @@ func init() { builtin.RegisterActorState(builtin{{.}}.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) - } {{end}}} var ( diff --git a/chain/actors/builtin/reward/actor.go.template b/chain/actors/builtin/reward/actor.go.template index dbd69d937..897cfa2b2 100644 --- a/chain/actors/builtin/reward/actor.go.template +++ b/chain/actors/builtin/reward/actor.go.template @@ -22,12 +22,6 @@ func init() { builtin.RegisterActorState(builtin{{.}}.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) - } {{end}}} var ( diff --git a/chain/actors/builtin/verifreg/actor.go.template b/chain/actors/builtin/verifreg/actor.go.template index d2f212fff..4d045bcdb 100644 --- a/chain/actors/builtin/verifreg/actor.go.template +++ b/chain/actors/builtin/verifreg/actor.go.template @@ -24,12 +24,6 @@ func init() { builtin.RegisterActorState(builtin{{.}}.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load{{.}}(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version{{.}}, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load{{.}}(store, root) - }) - } {{end}} } From 508c06092d50929af767e79557c8955cafbb6287 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 10:02:06 +0300 Subject: [PATCH 047/228] remove unnecessary isv8 state boolean from agen --- chain/actors/agen/main.go | 1 - 1 file changed, 1 deletion(-) diff --git a/chain/actors/agen/main.go b/chain/actors/agen/main.go index 6c5952f2e..d07c039dd 100644 --- a/chain/actors/agen/main.go +++ b/chain/actors/agen/main.go @@ -110,7 +110,6 @@ func generateState(actDir string) error { err := tpl.Execute(&b, map[string]interface{}{ "v": version, "import": getVersionImports()[version], - "isv8": version == 8, }) if err != nil { return err From 1643ec4fe94f61b0c4959871929e5f00d5d87f11 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 10:02:19 +0300 Subject: [PATCH 048/228] less wonky market/state.go.template --- chain/actors/builtin/market/state.go.template | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/chain/actors/builtin/market/state.go.template b/chain/actors/builtin/market/state.go.template index 7b980b96d..a3f6dacbb 100644 --- a/chain/actors/builtin/market/state.go.template +++ b/chain/actors/builtin/market/state.go.template @@ -256,20 +256,20 @@ func fromV{{.v}}DealProposal(v{{.v}} market{{.v}}.DealProposal) (DealProposal, e {{end}} return DealProposal{ - PieceCID : v{{.v}}.PieceCID, - PieceSize : v{{.v}}.PieceSize, - VerifiedDeal :v{{.v}}.VerifiedDeal, - Client :v{{.v}}.Client, - Provider :v{{.v}}.Provider, + PieceCID: v{{.v}}.PieceCID, + PieceSize: v{{.v}}.PieceSize, + VerifiedDeal: v{{.v}}.VerifiedDeal, + Client: v{{.v}}.Client, + Provider: v{{.v}}.Provider, Label: label, - StartEpoch : v{{.v}}.StartEpoch, - EndEpoch :v{{.v}}.EndEpoch, - StoragePricePerEpoch :v{{.v}}.StoragePricePerEpoch, + StartEpoch: v{{.v}}.StartEpoch, + EndEpoch: v{{.v}}.EndEpoch, + StoragePricePerEpoch: v{{.v}}.StoragePricePerEpoch, - ProviderCollateral :v{{.v}}.ProviderCollateral, - ClientCollateral :v{{.v}}.ClientCollateral, + ProviderCollateral: v{{.v}}.ProviderCollateral, + ClientCollateral: v{{.v}}.ClientCollateral, }, nil } From 1f7c89d5d822a3c58aaa31725b42d286e3a5f51a Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 10:07:43 +0300 Subject: [PATCH 049/228] make gen --- chain/actors/builtin/account/account.go | 48 ----------------------- chain/actors/builtin/init/init.go | 48 ----------------------- chain/actors/builtin/market/market.go | 48 ----------------------- chain/actors/builtin/miner/miner.go | 48 ----------------------- chain/actors/builtin/multisig/multisig.go | 48 ----------------------- chain/actors/builtin/paych/paych.go | 48 ----------------------- chain/actors/builtin/power/power.go | 48 ----------------------- chain/actors/builtin/reward/reward.go | 48 ----------------------- chain/actors/builtin/verifreg/verifreg.go | 48 ----------------------- 9 files changed, 432 deletions(-) diff --git a/chain/actors/builtin/account/account.go b/chain/actors/builtin/account/account.go index f40f846c8..968c08813 100644 --- a/chain/actors/builtin/account/account.go +++ b/chain/actors/builtin/account/account.go @@ -35,81 +35,33 @@ func init() { return load0(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version0, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - } - builtin.RegisterActorState(builtin2.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version2, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - } - builtin.RegisterActorState(builtin3.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version3, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - } - builtin.RegisterActorState(builtin4.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version4, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - } - builtin.RegisterActorState(builtin5.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version5, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - } - builtin.RegisterActorState(builtin6.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version6, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - } - builtin.RegisterActorState(builtin7.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version7, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - } - builtin.RegisterActorState(builtin8.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version8, "account"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load8(store, root) - }) - } } var Methods = builtin4.MethodsAccount diff --git a/chain/actors/builtin/init/init.go b/chain/actors/builtin/init/init.go index 8ef377b07..2af7305ce 100644 --- a/chain/actors/builtin/init/init.go +++ b/chain/actors/builtin/init/init.go @@ -37,81 +37,33 @@ func init() { return load0(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version0, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - } - builtin.RegisterActorState(builtin2.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version2, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - } - builtin.RegisterActorState(builtin3.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version3, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - } - builtin.RegisterActorState(builtin4.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version4, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - } - builtin.RegisterActorState(builtin5.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version5, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - } - builtin.RegisterActorState(builtin6.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version6, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - } - builtin.RegisterActorState(builtin7.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version7, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - } - builtin.RegisterActorState(builtin8.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version8, "init"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load8(store, root) - }) - } } var ( diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index 139257a55..a5b33df3f 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -44,81 +44,33 @@ func init() { return load0(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version0, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - } - builtin.RegisterActorState(builtin2.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version2, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - } - builtin.RegisterActorState(builtin3.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version3, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - } - builtin.RegisterActorState(builtin4.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version4, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - } - builtin.RegisterActorState(builtin5.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version5, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - } - builtin.RegisterActorState(builtin6.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version6, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - } - builtin.RegisterActorState(builtin7.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version7, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - } - builtin.RegisterActorState(builtin8.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version8, "storagemarket"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load8(store, root) - }) - } } var ( diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index eb339c33f..198e75d67 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -48,82 +48,34 @@ func init() { return load0(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version0, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - } - builtin.RegisterActorState(builtin2.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version2, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - } - builtin.RegisterActorState(builtin3.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version3, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - } - builtin.RegisterActorState(builtin4.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version4, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - } - builtin.RegisterActorState(builtin5.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version5, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - } - builtin.RegisterActorState(builtin6.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version6, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - } - builtin.RegisterActorState(builtin7.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version7, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - } - builtin.RegisterActorState(builtin8.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version8, "storageminer"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load8(store, root) - }) - } - } var Methods = builtin8.MethodsMiner diff --git a/chain/actors/builtin/multisig/multisig.go b/chain/actors/builtin/multisig/multisig.go index 34d3083c6..e8929fe65 100644 --- a/chain/actors/builtin/multisig/multisig.go +++ b/chain/actors/builtin/multisig/multisig.go @@ -43,81 +43,33 @@ func init() { return load0(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version0, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - } - builtin.RegisterActorState(builtin2.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version2, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - } - builtin.RegisterActorState(builtin3.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version3, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - } - builtin.RegisterActorState(builtin4.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version4, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - } - builtin.RegisterActorState(builtin5.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version5, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - } - builtin.RegisterActorState(builtin6.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version6, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - } - builtin.RegisterActorState(builtin7.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version7, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - } - builtin.RegisterActorState(builtin8.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version8, "multisig"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load8(store, root) - }) - } } func Load(store adt.Store, act *types.Actor) (State, error) { diff --git a/chain/actors/builtin/paych/paych.go b/chain/actors/builtin/paych/paych.go index 75ff70a59..963a1fb34 100644 --- a/chain/actors/builtin/paych/paych.go +++ b/chain/actors/builtin/paych/paych.go @@ -43,81 +43,33 @@ func init() { return load0(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version0, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - } - builtin.RegisterActorState(builtin2.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version2, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - } - builtin.RegisterActorState(builtin3.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version3, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - } - builtin.RegisterActorState(builtin4.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version4, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - } - builtin.RegisterActorState(builtin5.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version5, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - } - builtin.RegisterActorState(builtin6.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version6, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - } - builtin.RegisterActorState(builtin7.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version7, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - } - builtin.RegisterActorState(builtin8.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version8, "paymentchannel"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load8(store, root) - }) - } } // Load returns an abstract copy of payment channel state, irregardless of actor version diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go index be0774c86..fd335e755 100644 --- a/chain/actors/builtin/power/power.go +++ b/chain/actors/builtin/power/power.go @@ -38,81 +38,33 @@ func init() { return load0(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version0, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - } - builtin.RegisterActorState(builtin2.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version2, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - } - builtin.RegisterActorState(builtin3.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version3, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - } - builtin.RegisterActorState(builtin4.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version4, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - } - builtin.RegisterActorState(builtin5.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version5, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - } - builtin.RegisterActorState(builtin6.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version6, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - } - builtin.RegisterActorState(builtin7.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version7, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - } - builtin.RegisterActorState(builtin8.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version8, "storagepower"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load8(store, root) - }) - } } var ( diff --git a/chain/actors/builtin/reward/reward.go b/chain/actors/builtin/reward/reward.go index 86c1febe1..b08c68881 100644 --- a/chain/actors/builtin/reward/reward.go +++ b/chain/actors/builtin/reward/reward.go @@ -36,81 +36,33 @@ func init() { return load0(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version0, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - } - builtin.RegisterActorState(builtin2.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version2, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - } - builtin.RegisterActorState(builtin3.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version3, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - } - builtin.RegisterActorState(builtin4.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version4, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - } - builtin.RegisterActorState(builtin5.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version5, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - } - builtin.RegisterActorState(builtin6.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version6, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - } - builtin.RegisterActorState(builtin7.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version7, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - } - builtin.RegisterActorState(builtin8.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) - - if c, ok := actors.GetActorCodeID(actors.Version8, "reward"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load8(store, root) - }) - } } var ( diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go index aef6a855d..742e83123 100644 --- a/chain/actors/builtin/verifreg/verifreg.go +++ b/chain/actors/builtin/verifreg/verifreg.go @@ -38,82 +38,34 @@ func init() { return load0(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version0, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load0(store, root) - }) - } - builtin.RegisterActorState(builtin2.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load2(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version2, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load2(store, root) - }) - } - builtin.RegisterActorState(builtin3.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load3(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version3, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load3(store, root) - }) - } - builtin.RegisterActorState(builtin4.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load4(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version4, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load4(store, root) - }) - } - builtin.RegisterActorState(builtin5.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load5(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version5, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load5(store, root) - }) - } - builtin.RegisterActorState(builtin6.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version6, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load6(store, root) - }) - } - builtin.RegisterActorState(builtin7.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load7(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version7, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load7(store, root) - }) - } - builtin.RegisterActorState(builtin8.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load8(store, root) }) - if c, ok := actors.GetActorCodeID(actors.Version8, "verifiedregistry"); ok { - builtin.RegisterActorState(c, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { - return load8(store, root) - }) - } - } var ( From 93f1fac76bb93a9c5058d664e64a3003cf88b746 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 10:12:16 +0300 Subject: [PATCH 050/228] simplify DI -- no need for the special key for builtin actor loading --- node/builder.go | 1 - node/builder_chain.go | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/node/builder.go b/node/builder.go index 759d04bbb..f0106ad97 100644 --- a/node/builder.go +++ b/node/builder.go @@ -71,7 +71,6 @@ var ( ConnGaterKey = special{12} // libp2p option DAGStoreKey = special{13} // constructor returns multiple values ResourceManagerKey = special{14} // Libp2p option - BuiltinActorsKey = special{15} // builtin actors bundle loading ) type invoke int diff --git a/node/builder_chain.go b/node/builder_chain.go index b4e12e89a..b75e7b553 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -53,7 +53,7 @@ var ChainNode = Options( // right manifest cid. // This restriction will be lifted once we have the final actors v8 bundle and we know // the manifest cid. - Override(BuiltinActorsKey, modules.LoadBultinActors), + Override(new(dtypes.BuiltinActorsLoaded), modules.LoadBultinActors), // Consensus settings Override(new(dtypes.DrandSchedule), modules.BuiltinDrandConfig), From 0ac8708396870f02a295f162454990ace69a04e9 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 10:18:52 +0300 Subject: [PATCH 051/228] simplify fetch-bundles script --- build/builtin-actors/fetch-bundles.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/build/builtin-actors/fetch-bundles.sh b/build/builtin-actors/fetch-bundles.sh index 49231cd4a..e36bd84bb 100755 --- a/build/builtin-actors/fetch-bundles.sh +++ b/build/builtin-actors/fetch-bundles.sh @@ -20,12 +20,7 @@ check() { file=$1 hash=$2 if [ -e "$file" ]; then - file_hash=$(sha256sum "$file" | cut -d ' ' -f 1) - if [ "$file_hash" == "$hash" ]; then - return 0 - else - return 1 - fi + echo "$hash $file" | sha256sum --check else return 1 fi From 3b1964c507a3a3f0d864a9646fff45ed9b909ed8 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 10:33:38 +0300 Subject: [PATCH 052/228] remove manifest from upgrade schedule, get it inside the migration instead --- chain/consensus/filcns/upgrades.go | 117 +++++++---------------------- chain/stmgr/forks.go | 15 +--- chain/stmgr/forks_test.go | 16 ++-- chain/stmgr/stmgr.go | 1 - 4 files changed, 41 insertions(+), 108 deletions(-) diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 24bbc812b..e7b032516 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -46,194 +46,132 @@ import ( "github.com/filecoin-project/lotus/chain/vm" ) -type LegacyMigrationFunc = func( - ctx context.Context, - sm *stmgr.StateManager, cache stmgr.MigrationCache, - cb stmgr.ExecMonitor, - oldState cid.Cid, - height abi.ChainEpoch, ts *types.TipSet, -) (newState cid.Cid, err error) - -type LegacyPreMigrationFunc = func( - ctx context.Context, - sm *stmgr.StateManager, cache stmgr.MigrationCache, - oldState cid.Cid, - height abi.ChainEpoch, ts *types.TipSet, -) error - -func LegacyMigration(f LegacyMigrationFunc) stmgr.MigrationFunc { - return func( - ctx context.Context, - sm *stmgr.StateManager, cache stmgr.MigrationCache, - cb stmgr.ExecMonitor, - manifest cid.Cid, - oldState cid.Cid, - height abi.ChainEpoch, ts *types.TipSet, - ) (newState cid.Cid, err error) { - return f(ctx, sm, cache, cb, oldState, height, ts) - } -} - -func LegacyPreMigration(f LegacyPreMigrationFunc) stmgr.PreMigrationFunc { - return func( - ctx context.Context, - sm *stmgr.StateManager, cache stmgr.MigrationCache, - manifest cid.Cid, - oldState cid.Cid, - height abi.ChainEpoch, ts *types.TipSet, - ) error { - return f(ctx, sm, cache, oldState, height, ts) - } -} - func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { var us stmgr.UpgradeSchedule - v8ManifestCid, ok := actors.GetManifest(actors.Version8) - if !ok { - v8ManifestCid = cid.Undef - } - updates := []stmgr.Upgrade{{ Height: build.UpgradeBreezeHeight, Network: network.Version1, - Migration: LegacyMigration(UpgradeFaucetBurnRecovery), - Manifest: cid.Undef, + Migration: UpgradeFaucetBurnRecovery, }, { Height: build.UpgradeSmokeHeight, Network: network.Version2, Migration: nil, - Manifest: cid.Undef, }, { Height: build.UpgradeIgnitionHeight, Network: network.Version3, - Migration: LegacyMigration(UpgradeIgnition), - Manifest: cid.Undef, + Migration: UpgradeIgnition, }, { Height: build.UpgradeRefuelHeight, Network: network.Version3, - Migration: LegacyMigration(UpgradeRefuel), - Manifest: cid.Undef, + Migration: UpgradeRefuel, }, { Height: build.UpgradeAssemblyHeight, Network: network.Version4, Expensive: true, - Migration: LegacyMigration(UpgradeActorsV2), - Manifest: cid.Undef, + Migration: UpgradeActorsV2, }, { Height: build.UpgradeTapeHeight, Network: network.Version5, Migration: nil, - Manifest: cid.Undef, }, { Height: build.UpgradeLiftoffHeight, Network: network.Version5, - Migration: LegacyMigration(UpgradeLiftoff), - Manifest: cid.Undef, + Migration: UpgradeLiftoff, }, { Height: build.UpgradeKumquatHeight, Network: network.Version6, Migration: nil, - Manifest: cid.Undef, }, { Height: build.UpgradeCalicoHeight, Network: network.Version7, - Migration: LegacyMigration(UpgradeCalico), - Manifest: cid.Undef, + Migration: UpgradeCalico, }, { Height: build.UpgradePersianHeight, Network: network.Version8, Migration: nil, - Manifest: cid.Undef, }, { Height: build.UpgradeOrangeHeight, Network: network.Version9, Migration: nil, - Manifest: cid.Undef, }, { Height: build.UpgradeTrustHeight, Network: network.Version10, - Migration: LegacyMigration(UpgradeActorsV3), + Migration: UpgradeActorsV3, PreMigrations: []stmgr.PreMigration{{ - PreMigration: LegacyPreMigration(PreUpgradeActorsV3), + PreMigration: PreUpgradeActorsV3, StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: LegacyPreMigration(PreUpgradeActorsV3), + PreMigration: PreUpgradeActorsV3, StartWithin: 30, DontStartWithin: 15, StopWithin: 5, }}, - Manifest: cid.Undef, Expensive: true, }, { Height: build.UpgradeNorwegianHeight, Network: network.Version11, Migration: nil, - Manifest: cid.Undef, }, { Height: build.UpgradeTurboHeight, Network: network.Version12, - Migration: LegacyMigration(UpgradeActorsV4), + Migration: UpgradeActorsV4, PreMigrations: []stmgr.PreMigration{{ - PreMigration: LegacyPreMigration(PreUpgradeActorsV4), + PreMigration: PreUpgradeActorsV4, StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: LegacyPreMigration(PreUpgradeActorsV4), + PreMigration: PreUpgradeActorsV4, StartWithin: 30, DontStartWithin: 15, StopWithin: 5, }}, - Manifest: cid.Undef, Expensive: true, }, { Height: build.UpgradeHyperdriveHeight, Network: network.Version13, - Migration: LegacyMigration(UpgradeActorsV5), + Migration: UpgradeActorsV5, PreMigrations: []stmgr.PreMigration{{ - PreMigration: LegacyPreMigration(PreUpgradeActorsV5), + PreMigration: PreUpgradeActorsV5, StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: LegacyPreMigration(PreUpgradeActorsV5), + PreMigration: PreUpgradeActorsV5, StartWithin: 30, DontStartWithin: 15, StopWithin: 5, }}, - Manifest: cid.Undef, Expensive: true, }, { Height: build.UpgradeChocolateHeight, Network: network.Version14, - Migration: LegacyMigration(UpgradeActorsV6), + Migration: UpgradeActorsV6, PreMigrations: []stmgr.PreMigration{{ - PreMigration: LegacyPreMigration(PreUpgradeActorsV6), + PreMigration: PreUpgradeActorsV6, StartWithin: 120, DontStartWithin: 60, StopWithin: 35, }, { - PreMigration: LegacyPreMigration(PreUpgradeActorsV6), + PreMigration: PreUpgradeActorsV6, StartWithin: 30, DontStartWithin: 15, StopWithin: 5, }}, - Manifest: cid.Undef, Expensive: true, }, { Height: build.UpgradeOhSnapHeight, Network: network.Version15, - Migration: LegacyMigration(UpgradeActorsV7), + Migration: UpgradeActorsV7, PreMigrations: []stmgr.PreMigration{{ - PreMigration: LegacyPreMigration(PreUpgradeActorsV7), + PreMigration: PreUpgradeActorsV7, StartWithin: 180, DontStartWithin: 60, StopWithin: 5, }}, - Manifest: cid.Undef, Expensive: true, }, { Height: build.UpgradeFVM1Height, @@ -245,7 +183,6 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { DontStartWithin: 60, StopWithin: 5, }}, - Manifest: v8ManifestCid, Expensive: true, }, } @@ -1381,7 +1318,7 @@ func upgradeActorsV7Common( return newRoot, nil } -func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, manifest cid.Cid, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { +func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { // Use all the CPUs except 3. workerCount := runtime.NumCPU() - 3 if workerCount <= 0 { @@ -1395,7 +1332,7 @@ func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi ProgressLogPeriod: 10 * time.Second, } - newRoot, err := upgradeActorsV8Common(ctx, sm, cache, manifest, root, epoch, ts, config) + newRoot, err := upgradeActorsV8Common(ctx, sm, cache, root, epoch, ts, config) if err != nil { return cid.Undef, xerrors.Errorf("migrating actors v6 state: %w", err) } @@ -1403,7 +1340,7 @@ func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi return newRoot, nil } -func PreUpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, manifest cid.Cid, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error { +func PreUpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error { // Use half the CPUs for pre-migration, but leave at least 3. workerCount := runtime.NumCPU() if workerCount <= 4 { @@ -1420,13 +1357,12 @@ func PreUpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr config := nv16.Config{MaxWorkers: uint(workerCount), ProgressLogPeriod: time.Minute * 5} - _, err = upgradeActorsV8Common(ctx, sm, cache, manifest, lbRoot, epoch, lbts, config) + _, err = upgradeActorsV8Common(ctx, sm, cache, lbRoot, epoch, lbts, config) return err } func upgradeActorsV8Common( ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, - manifest cid.Cid, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, config nv16.Config, ) (cid.Cid, error) { @@ -1446,6 +1382,11 @@ func upgradeActorsV8Common( ) } + manifest, ok := actors.GetManifest(actors.Version8) + if !ok { + return cid.Undef, xerrors.Errorf("no manifest CID for v8 upgrade") + } + // Perform the migration newHamtRoot, err := nv16.MigrateStateTree(ctx, store, manifest, stateRoot.Actors, epoch, config, migrationLogger{}, cache) if err != nil { diff --git a/chain/stmgr/forks.go b/chain/stmgr/forks.go index 03b2e5640..84937a677 100644 --- a/chain/stmgr/forks.go +++ b/chain/stmgr/forks.go @@ -48,7 +48,6 @@ type MigrationFunc func( ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - manifest cid.Cid, oldState cid.Cid, height abi.ChainEpoch, ts *types.TipSet, ) (newState cid.Cid, err error) @@ -58,7 +57,6 @@ type MigrationFunc func( type PreMigrationFunc func( ctx context.Context, sm *StateManager, cache MigrationCache, - manifest cid.Cid, oldState cid.Cid, height abi.ChainEpoch, ts *types.TipSet, ) error @@ -95,10 +93,6 @@ type Upgrade struct { // These functions should fill the given cache with information that can speed up the // eventual full migration at the upgrade epoch. PreMigrations []PreMigration - - // Manifest is the migration manifest CID, starting with nv16; for older migrations it is - // undefined - Manifest cid.Cid } type UpgradeSchedule []Upgrade @@ -182,7 +176,7 @@ func (sm *StateManager) HandleStateForks(ctx context.Context, root cid.Cid, heig // Yes, we clone the cache, even for the final upgrade epoch. Why? Reverts. We may // have to migrate multiple times. tmpCache := u.cache.Clone() - retCid, err = u.upgrade(ctx, sm, tmpCache, cb, u.manifest, root, height, ts) + retCid, err = u.upgrade(ctx, sm, tmpCache, cb, root, height, ts) if err != nil { log.Errorw("FAILED migration", "height", height, "from", root, "error", err) return cid.Undef, err @@ -219,7 +213,7 @@ func (sm *StateManager) hasExpensiveFork(height abi.ChainEpoch) bool { return ok } -func runPreMigration(ctx context.Context, sm *StateManager, manifest cid.Cid, fn PreMigrationFunc, cache *nv16.MemMigrationCache, ts *types.TipSet) { +func runPreMigration(ctx context.Context, sm *StateManager, fn PreMigrationFunc, cache *nv16.MemMigrationCache, ts *types.TipSet) { height := ts.Height() parent := ts.ParentState() @@ -231,7 +225,7 @@ func runPreMigration(ctx context.Context, sm *StateManager, manifest cid.Cid, fn // migration to use the cache may assume that // certain blocks exist, even if they don't. tmpCache := cache.Clone() - err := fn(ctx, sm, tmpCache, manifest, parent, height, ts) + err := fn(ctx, sm, tmpCache, parent, height, ts) if err != nil { log.Errorw("FAILED pre-migration", "error", err) return @@ -272,7 +266,6 @@ func (sm *StateManager) preMigrationWorker(ctx context.Context) { notAfterEpoch = stopEpoch - 1 } - manifest := migration.manifest // Add an op to start a pre-migration. schedule = append(schedule, op{ after: afterEpoch, @@ -283,7 +276,7 @@ func (sm *StateManager) preMigrationWorker(ctx context.Context) { wg.Add(1) go func() { defer wg.Done() - runPreMigration(preCtx, sm, manifest, migrationFunc, cache, ts) + runPreMigration(preCtx, sm, migrationFunc, cache, ts) }() }, }) diff --git a/chain/stmgr/forks_test.go b/chain/stmgr/forks_test.go index 2050eda0f..e36f57ceb 100644 --- a/chain/stmgr/forks_test.go +++ b/chain/stmgr/forks_test.go @@ -130,7 +130,7 @@ func TestForkHeightTriggers(t *testing.T) { Network: network.Version1, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - _ cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { cst := ipldcbor.NewCborStore(sm.ChainStore().StateBlockstore()) st, err := sm.StateTree(root) @@ -276,7 +276,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) { Expensive: true, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - _ cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { migrationCount++ return root, nil }}}, cg.BeaconSchedule()) @@ -412,7 +412,7 @@ func TestForkPreMigration(t *testing.T) { Network: network.Version1, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, - _ cid.Cid, root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + root cid.Cid, height abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { // Make sure the test that should be canceled, is canceled. select { @@ -431,7 +431,7 @@ func TestForkPreMigration(t *testing.T) { PreMigrations: []PreMigration{{ StartWithin: 20, PreMigration: func(ctx context.Context, _ *StateManager, cache MigrationCache, - _ cid.Cid, _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { + _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { wait20.Done() wait20.Wait() @@ -445,7 +445,7 @@ func TestForkPreMigration(t *testing.T) { }, { StartWithin: 20, PreMigration: func(ctx context.Context, _ *StateManager, cache MigrationCache, - _ cid.Cid, _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { + _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { wait20.Done() wait20.Wait() @@ -459,7 +459,7 @@ func TestForkPreMigration(t *testing.T) { }, { StartWithin: 20, PreMigration: func(ctx context.Context, _ *StateManager, cache MigrationCache, - _ cid.Cid, _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { + _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { wait20.Done() wait20.Wait() @@ -475,7 +475,7 @@ func TestForkPreMigration(t *testing.T) { StartWithin: 15, StopWithin: 5, PreMigration: func(ctx context.Context, _ *StateManager, cache MigrationCache, - _ cid.Cid, _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { + _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { <-ctx.Done() close(wasCanceled) @@ -487,7 +487,7 @@ func TestForkPreMigration(t *testing.T) { }, { StartWithin: 10, PreMigration: func(ctx context.Context, _ *StateManager, cache MigrationCache, - _ cid.Cid, _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { + _ cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) error { checkCache(t, cache) diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index f6d8582e2..8292e081f 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -124,7 +124,6 @@ func NewStateManager(cs *store.ChainStore, exec Executor, sys vm.SyscallBuilder, upgrade: upgrade.Migration, preMigrations: upgrade.PreMigrations, cache: nv16.NewMemMigrationCache(), - manifest: upgrade.Manifest, } stateMigrations[upgrade.Height] = migration } From dec2b312af4a2e25b77decd362008587b4069ecd Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 10:37:48 +0300 Subject: [PATCH 053/228] fix lint --- itests/kit/ensemble_opts_nv.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/itests/kit/ensemble_opts_nv.go b/itests/kit/ensemble_opts_nv.go index 1eeeb5611..b51b82bd5 100644 --- a/itests/kit/ensemble_opts_nv.go +++ b/itests/kit/ensemble_opts_nv.go @@ -30,7 +30,7 @@ func SDRUpgradeAt(calico, persian abi.ChainEpoch) EnsembleOpt { }, stmgr.Upgrade{ Network: network.Version7, Height: calico, - Migration: filcns.LegacyMigration(filcns.UpgradeCalico), + Migration: filcns.UpgradeCalico, }, stmgr.Upgrade{ Network: network.Version8, Height: persian, @@ -66,6 +66,6 @@ func TurboUpgradeAt(upgradeHeight abi.ChainEpoch) EnsembleOpt { }, stmgr.Upgrade{ Network: network.Version12, Height: upgradeHeight, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV4), + Migration: filcns.UpgradeActorsV4, }) } From 5f62227f539145a3624026505c53a8ac761c4152 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 10:49:34 +0300 Subject: [PATCH 054/228] fix sync_test --- chain/sync_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/chain/sync_test.go b/chain/sync_test.go index 491f78090..e97645fe9 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -126,27 +126,27 @@ func prepSyncTestWithV5Height(t testing.TB, h int, v5height abi.ChainEpoch) *syn // prepare for upgrade. Network: network.Version9, Height: 1, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV2), + Migration: filcns.UpgradeActorsV2, }, { Network: network.Version10, Height: 2, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV3), + Migration: filcns.UpgradeActorsV3, }, { Network: network.Version12, Height: 3, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV4), + Migration: filcns.UpgradeActorsV4, }, { Network: network.Version13, Height: v5height, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV5), + Migration: filcns.UpgradeActorsV5, }, { Network: network.Version14, Height: v5height + 10, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV6), + Migration: filcns.UpgradeActorsV6, }, { Network: network.Version15, Height: v5height + 15, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV7), + Migration: filcns.UpgradeActorsV7, }, { Network: network.Version16, Height: v5height + 20, From f28bd054ef975e774be97875bd69fb8db26b9cb8 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 10:53:39 +0300 Subject: [PATCH 055/228] fix rand_test --- chain/rand/rand_test.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/chain/rand/rand_test.go b/chain/rand/rand_test.go index a4a4c39f0..b5e2482b7 100644 --- a/chain/rand/rand_test.go +++ b/chain/rand/rand_test.go @@ -93,19 +93,19 @@ func TestNullRandomnessV2(t *testing.T) { // prepare for upgrade. Network: network.Version9, Height: 1, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV2), + Migration: filcns.UpgradeActorsV2, }, { Network: network.Version10, Height: 2, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV3), + Migration: filcns.UpgradeActorsV3, }, { Network: network.Version12, Height: 3, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV4), + Migration: filcns.UpgradeActorsV4, }, { Network: network.Version13, Height: 4, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV5), + Migration: filcns.UpgradeActorsV5, }, } @@ -172,23 +172,23 @@ func TestNullRandomnessV3(t *testing.T) { // prepare for upgrade. Network: network.Version9, Height: 1, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV2), + Migration: filcns.UpgradeActorsV2, }, { Network: network.Version10, Height: 2, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV3), + Migration: filcns.UpgradeActorsV3, }, { Network: network.Version12, Height: 3, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV4), + Migration: filcns.UpgradeActorsV4, }, { Network: network.Version13, Height: 4, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV5), + Migration: filcns.UpgradeActorsV5, }, { Network: network.Version14, Height: 5, - Migration: filcns.LegacyMigration(filcns.UpgradeActorsV6), + Migration: filcns.UpgradeActorsV6, }, } From 07e4024e3b128252dab2f7b9125f505e376be51c Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 10:56:29 +0300 Subject: [PATCH 056/228] fix lint --- chain/stmgr/stmgr.go | 1 - 1 file changed, 1 deletion(-) diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index 8292e081f..1fc395587 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -55,7 +55,6 @@ type migration struct { upgrade MigrationFunc preMigrations []PreMigration cache *nv16.MemMigrationCache - manifest cid.Cid } type Executor interface { From 395c7722225626d975e1ad64ca6a971164452c06 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 20:38:25 +0300 Subject: [PATCH 057/228] make the miner load the manifest so that it can correctly map actors --- chain/actors/manifest.go | 17 +++++++++++++++++ cmd/lotus-miner/init.go | 17 +++++++++++++++++ node/builder_miner.go | 3 +++ node/modules/builtin_actors.go | 19 ++++++++++--------- node/modules/storageminer.go | 2 ++ 5 files changed, 49 insertions(+), 9 deletions(-) diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go index 322052494..4fc37c0f5 100644 --- a/chain/actors/manifest.go +++ b/chain/actors/manifest.go @@ -1,6 +1,7 @@ package actors import ( + "bytes" "context" "strings" "sync" @@ -9,7 +10,9 @@ import ( cid "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" + car "github.com/ipld/go-car" + "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/specs-actors/v8/actors/builtin/manifest" ) @@ -107,3 +110,17 @@ func CanonicalName(name string) string { return name } + +func LoadBundle(ctx context.Context, bs blockstore.Blockstore, av Version, data []byte) error { + blobr := bytes.NewReader(data) + + hdr, err := car.LoadCar(ctx, bs, blobr) + if err != nil { + return xerrors.Errorf("error loading builtin actors v%d bundle: %w", av, err) + } + + manifestCid := hdr.Roots[0] + AddManifest(av, manifestCid) + + return nil +} diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index 8512f4a22..a23795d28 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -21,6 +21,7 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" + cbor "github.com/ipfs/go-ipld-cbor" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" "github.com/mitchellh/go-homedir" @@ -215,6 +216,22 @@ var initCmd = &cli.Command{ return err } + if len(build.BuiltinActorsV8Bundle()) > 0 { + bs, err := lr.Blockstore(context.TODO(), repo.UniversalBlockstore) + if err != nil { + return xerrors.Errorf("error opening blockstore: %w", err) + } + + if err := actors.LoadBundle(context.TODO(), bs, actors.Version8, build.BuiltinActorsV8Bundle()); err != nil { + return xerrors.Errorf("error loading actor bundle: %w", err) + } + + cborStore := cbor.NewCborStore(bs) + if err := actors.LoadManifests(ctx, cborStore); err != nil { + return xerrors.Errorf("error loading actor manifests: %w", err) + } + } + var localPaths []stores.LocalPath if pssb := cctx.StringSlice("pre-sealed-sectors"); len(pssb) != 0 { diff --git a/node/builder_miner.go b/node/builder_miner.go index 2223d14ce..0509fcd05 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -51,6 +51,9 @@ var MinerNode = Options( // Mining / proving Override(new(*storage.AddressSelector), modules.AddressSelector(nil)), + + // builtin actors manifest + Override(new(dtypes.BuiltinActorsLoaded), modules.LoadBultinActors), ) func ConfigStorageMiner(c interface{}) Option { diff --git a/node/modules/builtin_actors.go b/node/modules/builtin_actors.go index c65ae1a0a..a669123f2 100644 --- a/node/modules/builtin_actors.go +++ b/node/modules/builtin_actors.go @@ -1,8 +1,6 @@ package modules import ( - "bytes" - "go.uber.org/fx" "golang.org/x/xerrors" @@ -12,7 +10,6 @@ import ( "github.com/filecoin-project/lotus/node/modules/helpers" cbor "github.com/ipfs/go-ipld-cbor" - car "github.com/ipld/go-car" ) func LoadBultinActors(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.UniversalBlockstore) (result dtypes.BuiltinActorsLoaded, err error) { @@ -22,14 +19,18 @@ func LoadBultinActors(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.Univer // not already loaded. // For now, we just embed the v8 bundle and adjust the manifest CIDs for the migration/actor // metadata. - blobr := bytes.NewReader(build.BuiltinActorsV8Bundle()) - hdr, err := car.LoadCar(ctx, bs, blobr) - if err != nil { - return result, xerrors.Errorf("error loading builtin actors v8 bundle: %w", err) + if len(build.BuiltinActorsV8Bundle()) > 0 { + if err := actors.LoadBundle(ctx, bs, actors.Version8, build.BuiltinActorsV8Bundle()); err != nil { + return result, err + } } - manifestCid := hdr.Roots[0] - actors.ManifestCids[actors.Version8] = manifestCid + // for testing -- need to also set LOTUS_USE_FVM_CUSTOM_BUNDLE=1 to force the fvm to use it. + if len(build.BuiltinActorsV7Bundle()) > 0 { + if err := actors.LoadBundle(ctx, bs, actors.Version7, build.BuiltinActorsV7Bundle()); err != nil { + return result, err + } + } cborStore := cbor.NewCborStore(bs) if err := actors.LoadManifests(ctx, cborStore); err != nil { diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 09b8b6f31..ae3628764 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -219,6 +219,8 @@ type StorageMinerParams struct { Journal journal.Journal AddrSel *storage.AddressSelector Maddr dtypes.MinerAddress + + ManifestLoaded dtypes.BuiltinActorsLoaded } func StorageMiner(fc config.MinerFeeConfig) func(params StorageMinerParams) (*storage.Miner, error) { From 507b835a9ca9647991c1849d92a173b96af69f48 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 12 Apr 2022 21:27:02 +0300 Subject: [PATCH 058/228] need a blockstore for the manifest loader --- node/builder_miner.go | 1 + 1 file changed, 1 insertion(+) diff --git a/node/builder_miner.go b/node/builder_miner.go index 0509fcd05..21e1e6296 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -54,6 +54,7 @@ var MinerNode = Options( // builtin actors manifest Override(new(dtypes.BuiltinActorsLoaded), modules.LoadBultinActors), + Override(new(dtypes.UniversalBlockstore), modules.UniversalBlockstore), ) func ConfigStorageMiner(c interface{}) Option { From 6bd2d89e30a556cfe05742d6e808a40563b2bcf8 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 14 Apr 2022 19:02:19 +0300 Subject: [PATCH 059/228] use memory blockstore for miner manifest loading --- cmd/lotus-miner/init.go | 6 ++---- node/builder_miner.go | 2 +- node/modules/blockstore.go | 4 ++++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index a23795d28..ead430e30 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -45,6 +45,7 @@ import ( lapi "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v0api" "github.com/filecoin-project/lotus/api/v1api" + "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -217,10 +218,7 @@ var initCmd = &cli.Command{ } if len(build.BuiltinActorsV8Bundle()) > 0 { - bs, err := lr.Blockstore(context.TODO(), repo.UniversalBlockstore) - if err != nil { - return xerrors.Errorf("error opening blockstore: %w", err) - } + bs := blockstore.NewMemory() if err := actors.LoadBundle(context.TODO(), bs, actors.Version8, build.BuiltinActorsV8Bundle()); err != nil { return xerrors.Errorf("error loading actor bundle: %w", err) diff --git a/node/builder_miner.go b/node/builder_miner.go index 21e1e6296..f619308f8 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -54,7 +54,7 @@ var MinerNode = Options( // builtin actors manifest Override(new(dtypes.BuiltinActorsLoaded), modules.LoadBultinActors), - Override(new(dtypes.UniversalBlockstore), modules.UniversalBlockstore), + Override(new(dtypes.UniversalBlockstore), modules.MemoryBlockstore), ) func ConfigStorageMiner(c interface{}) Option { diff --git a/node/modules/blockstore.go b/node/modules/blockstore.go index 2486b9744..7a01c4dcc 100644 --- a/node/modules/blockstore.go +++ b/node/modules/blockstore.go @@ -37,6 +37,10 @@ func UniversalBlockstore(lc fx.Lifecycle, mctx helpers.MetricsCtx, r repo.Locked return bs, err } +func MemoryBlockstore() dtypes.UniversalBlockstore { + return blockstore.NewMemory() +} + func DiscardColdBlockstore(lc fx.Lifecycle, bs dtypes.UniversalBlockstore) (dtypes.ColdBlockstore, error) { return blockstore.NewDiscardStore(bs), nil } From 30ed847531685a5ab2e4ed3c7927264df5164ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 13 Apr 2022 11:14:55 +0200 Subject: [PATCH 060/228] make fetch-bundles.sh portable. --- build/builtin-actors/fetch-bundles.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/build/builtin-actors/fetch-bundles.sh b/build/builtin-actors/fetch-bundles.sh index e36bd84bb..37b8e906e 100755 --- a/build/builtin-actors/fetch-bundles.sh +++ b/build/builtin-actors/fetch-bundles.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -cd $(dirname "$0") +cd "$(dirname "$0")" # gateway to use dweb="dweb.link" @@ -20,7 +20,7 @@ check() { file=$1 hash=$2 if [ -e "$file" ]; then - echo "$hash $file" | sha256sum --check + echo "$hash $file" | shasum -a 256 --check else return 1 fi @@ -30,22 +30,22 @@ fetch() { output=$1 cid=$2 hash=$3 - if (check $output $hash); then + if (check "$output" "$hash"); then return 0 else echo "fetching $cid to $output" - curl -k "https://$dweb/ipfs/$cid" -o $output - check $output $hash || die "hash mismatch" + curl -k "https://$dweb/ipfs/$cid" -o "$output" + check "$output" "$hash" || die "hash mismatch" fi } -if [ ! -z "$actors7_cid" ]; then +if [ -n "$actors7_cid" ]; then fetch builtin-actors-v7.car "$actors7_cid" "$actors7_hash" else touch builtin-actors-v7.car fi -if [ ! -z "$actors8_cid" ]; then +if [ -n "$actors8_cid" ]; then fetch builtin-actors-v8.car "$actors8_cid" "$actors8_hash" else touch builtin-actors-v8.car From 1c1d8e06267b9acaad2490e78ac6ed5fb0d54f70 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 14 Apr 2022 19:18:36 +0300 Subject: [PATCH 061/228] update specs-actors/v8@master --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8ce7700d4..07ca96415 100644 --- a/go.mod +++ b/go.mod @@ -56,7 +56,7 @@ require ( github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0 github.com/filecoin-project/specs-storage v0.2.2 - github.com/filecoin-project/specs-actors/v8 v8.0.0-20220412064630-4d0ecb61fc9d + github.com/filecoin-project/specs-actors/v8 v8.0.0-20220414161338-8ff313b3258a github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index 8b394b99a..83fe6f778 100644 --- a/go.sum +++ b/go.sum @@ -407,8 +407,8 @@ github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294 h github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c h1:WdAk1RfDBOhypv+tFzdonzk3jjQIfk2FJBZdRyFrLN4= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220412064630-4d0ecb61fc9d h1:w6UFGm+YAqnc18gFRGUhu5DRaIcUl3HuWrT7Mbw5GSA= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220412064630-4d0ecb61fc9d/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220414161338-8ff313b3258a h1:5M+1REWUeMsplhcrPwrU/ltUwiUqtaumPm7hwcZ3Ddg= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220414161338-8ff313b3258a/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/storetheindex v0.4.0 h1:MPIDJYBknPbwBcVf+2/WEIK6LKxhZmfQGCrqKmvhFyU= From 65de3e7f6c98798bfcfcbbfe90ffe1b2543f8cd2 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 14 Apr 2022 19:18:49 +0300 Subject: [PATCH 062/228] add retries to curl when fetching bundles --- build/builtin-actors/fetch-bundles.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtin-actors/fetch-bundles.sh b/build/builtin-actors/fetch-bundles.sh index 37b8e906e..dd30d6a1f 100755 --- a/build/builtin-actors/fetch-bundles.sh +++ b/build/builtin-actors/fetch-bundles.sh @@ -34,7 +34,7 @@ fetch() { return 0 else echo "fetching $cid to $output" - curl -k "https://$dweb/ipfs/$cid" -o "$output" + curl --retry 3 -k "https://$dweb/ipfs/$cid" -o "$output" check "$output" "$hash" || die "hash mismatch" fi } From 1866eebe0691a2a61ff1ec332a70156b4751094f Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 14 Apr 2022 19:35:09 +0300 Subject: [PATCH 063/228] go mod tidy --- go.mod | 2 +- go.sum | 24 +++++------------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 07ca96415..bdc15c3c3 100644 --- a/go.mod +++ b/go.mod @@ -55,8 +55,8 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0 - github.com/filecoin-project/specs-storage v0.2.2 github.com/filecoin-project/specs-actors/v8 v8.0.0-20220414161338-8ff313b3258a + github.com/filecoin-project/specs-storage v0.2.2 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index 83fe6f778..7ef717353 100644 --- a/go.sum +++ b/go.sum @@ -360,16 +360,13 @@ github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= -github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= +github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= -github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd h1:Ykxbz+LvSCUIl2zFaaPGmF8KHXTJu9T/PymgHr7IHjs= -github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= @@ -397,20 +394,11 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1.0.20220118005651-2470cb39827e/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-actors/v7 v7.0.0 h1:FQN7tjt3o68hfb3qLFSJBoLMuOFY0REkFVLO/zXj8RU= github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= -github.com/filecoin-project/specs-storage v0.2.2 h1:6ugbtKQ6LTcTEnEIX9HkeCtTp1PCYO497P/bokF5tF4= -github.com/filecoin-project/specs-storage v0.2.2/go.mod h1:6cc/lncmAxMUocPi0z1EPCX63beIX7F7UnlmUZ3hLQo= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220301040630-7465555c2e22 h1:zf32sRuUQUDGZ8gc50CFFibzAboWleLW4EwR4apgpAw= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220301040630-7465555c2e22/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220404082322-5f5089f6e8bd h1:Ogyyz6Eh1CPoD1U4lT208vNS0UlMcl/C3UlqPLkkRqw= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220404082322-5f5089f6e8bd/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294 h1:4GF9ZCcMmlZbDlUbBsOzFROM0gPnd9oo7QlYrQo5uvs= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407213329-8b2d3ecf4294/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c h1:WdAk1RfDBOhypv+tFzdonzk3jjQIfk2FJBZdRyFrLN4= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220414161338-8ff313b3258a h1:5M+1REWUeMsplhcrPwrU/ltUwiUqtaumPm7hwcZ3Ddg= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220414161338-8ff313b3258a/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= -github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= -github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= +github.com/filecoin-project/specs-storage v0.2.2 h1:6ugbtKQ6LTcTEnEIX9HkeCtTp1PCYO497P/bokF5tF4= +github.com/filecoin-project/specs-storage v0.2.2/go.mod h1:6cc/lncmAxMUocPi0z1EPCX63beIX7F7UnlmUZ3hLQo= github.com/filecoin-project/storetheindex v0.4.0 h1:MPIDJYBknPbwBcVf+2/WEIK6LKxhZmfQGCrqKmvhFyU= github.com/filecoin-project/storetheindex v0.4.0/go.mod h1:LIwqpXoKeGxOGEjmxPfdYVPQYoZOSI3oXMUd9XTCpjc= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= @@ -1086,12 +1074,9 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= -github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= +github.com/libp2p/go-libp2p v0.18.0-rc5/go.mod h1:aZPS5l84bDvCvP4jkyEUT/J6YOpUq33Fgqrs3K59mpI= github.com/libp2p/go-libp2p v0.18.1 h1:IK9EOGNO2ZghU4F+dx9c4xfhMNZr45x06CijJaZE/ms= github.com/libp2p/go-libp2p v0.18.1/go.mod h1:ll44MqmrIFKpL3BwCexxzm+7RZ8exEtN96V1rRdMG7Y= -github.com/libp2p/go-libp2p v0.18.0-rc5/go.mod h1:aZPS5l84bDvCvP4jkyEUT/J6YOpUq33Fgqrs3K59mpI= -github.com/libp2p/go-libp2p v0.18.0-rc6 h1:IR6TVPYGo1wDY0tY61gyPQVxK1koOkXh49ejVfAnH7A= -github.com/libp2p/go-libp2p v0.18.0-rc6/go.mod h1:oOUOAlBrm1L0+jxT10h2TMUMTDz6pV3EvmkJ3beDYGQ= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1343,6 +1328,7 @@ github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mW github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= +github.com/libp2p/go-libp2p-yamux v0.8.2/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= github.com/libp2p/go-libp2p-yamux v0.9.0 h1:j+gnKykADCI/3cZlacOYBjQXDsncxgcwzJ1zw6Z6pts= github.com/libp2p/go-libp2p-yamux v0.9.0/go.mod h1:tpJKkRH9LlHj0VQh9Y9RP1pmF7yCS9ixxY/oSv+hhhQ= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= From 2690b6983164a2f13fb4d904d3bdff5d9cd63dcc Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 14 Apr 2022 19:38:49 +0300 Subject: [PATCH 064/228] fix rebase issues --- build/builtin_actors.go | 7 +++++++ chain/actors/manifest.go | 2 ++ chain/stmgr/forks.go | 1 + chain/vm/vmi.go | 2 +- 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/build/builtin_actors.go b/build/builtin_actors.go index ea9c28ad3..56bc5169a 100644 --- a/build/builtin_actors.go +++ b/build/builtin_actors.go @@ -10,3 +10,10 @@ var actorsv8 []byte func BuiltinActorsV8Bundle() []byte { return actorsv8 } + +//go:embed builtin-actors/builtin-actors-v7.car +var actorsv7 []byte + +func BuiltinActorsV7Bundle() []byte { + return actorsv7 +} diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go index 4fc37c0f5..97c9b7d6c 100644 --- a/chain/actors/manifest.go +++ b/chain/actors/manifest.go @@ -27,6 +27,8 @@ var actorMeta map[cid.Cid]actorEntry var ( loadOnce sync.Once loadError error + + manifestMx sync.Mutex ) type actorEntry struct { diff --git a/chain/stmgr/forks.go b/chain/stmgr/forks.go index 84937a677..048ea7372 100644 --- a/chain/stmgr/forks.go +++ b/chain/stmgr/forks.go @@ -17,6 +17,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" diff --git a/chain/vm/vmi.go b/chain/vm/vmi.go index f3d522a7c..2e826080f 100644 --- a/chain/vm/vmi.go +++ b/chain/vm/vmi.go @@ -19,7 +19,7 @@ type Interface interface { Flush(ctx context.Context) (cid.Cid, error) } -func NewVM(ctx context.Context, opts *VMOpts) (VMI, error) { +func NewVM(ctx context.Context, opts *VMOpts) (Interface, error) { if opts.NetworkVersion >= network.Version16 { return NewFVM(ctx, opts) } From cede67bfdd103f1f66579f409a05c451d120e4d8 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 14 Apr 2022 19:49:23 +0300 Subject: [PATCH 065/228] make gen --- build/openrpc/full.json.gz | Bin 27011 -> 27009 bytes build/openrpc/miner.json.gz | Bin 13540 -> 13536 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index d8c0bdd3f9f0cda479c9c200a42c332c688847b3..338ac68e84be897d512fd45d523861f31a4c9031 100644 GIT binary patch delta 25058 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

8x$A|^WlBb=2`Yl;V=#K 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 hCfeVl;W6)pnjhAKSN{{i*J%&PzZ delta 25109 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 Q00030|3Of$k1U!30DM0QC;$Ke delta 13074 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 Date: Thu, 14 Apr 2022 19:52:58 +0300 Subject: [PATCH 066/228] fix more rebase issues --- itests/kit/ensemble.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 706626e5f..6149758d6 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -26,8 +26,6 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-statestore" "github.com/filecoin-project/go-storedcounter" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v1api" @@ -61,11 +59,6 @@ import ( "github.com/filecoin-project/lotus/storage/mockstorage" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power" - "github.com/ipfs/go-datastore" - libp2pcrypto "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" - mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" - "github.com/stretchr/testify/require" ) func init() { From 534e43e1d367e29636bcc600c4c4da6d29d8d43b Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 14 Apr 2022 20:10:51 +0300 Subject: [PATCH 067/228] fix lotus-shed --- cmd/lotus-shed/deal-label.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/lotus-shed/deal-label.go b/cmd/lotus-shed/deal-label.go index 483415987..6c222a4b8 100644 --- a/cmd/lotus-shed/deal-label.go +++ b/cmd/lotus-shed/deal-label.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "io" - "unicode/utf8" "github.com/filecoin-project/lotus/chain/actors/builtin/market" @@ -99,7 +98,7 @@ var dealLabelCmd = &cli.Command{ var deals []abi.DealID if err = ps.ForEach(func(id abi.DealID, dp market.DealProposal) error { - if !utf8.Valid([]byte(dp.Label)) { + if dp.Label.IsBytes() { deals = append(deals, id) } From beb3369c765e0d813b01fbc71243693380a892fc Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 15 Apr 2022 20:15:28 +0300 Subject: [PATCH 068/228] add LoadManifestFromBundle, use it in miner init --- chain/actors/manifest.go | 9 +++++++++ cmd/lotus-miner/init.go | 10 ++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go index 97c9b7d6c..f9932d1db 100644 --- a/chain/actors/manifest.go +++ b/chain/actors/manifest.go @@ -126,3 +126,12 @@ func LoadBundle(ctx context.Context, bs blockstore.Blockstore, av Version, data return nil } + +func LoadManifestFromBundle(ctx context.Context, bs blockstore.Blockstore, av Version, data []byte) error { + if err := LoadBundle(ctx, bs, av, data); err != nil { + return err + } + + cborStore := cbor.NewCborStore(bs) + return LoadManifests(ctx, cborStore) +} diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index ead430e30..abda9df26 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -21,7 +21,6 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" - cbor "github.com/ipfs/go-ipld-cbor" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" "github.com/mitchellh/go-homedir" @@ -220,13 +219,8 @@ var initCmd = &cli.Command{ if len(build.BuiltinActorsV8Bundle()) > 0 { bs := blockstore.NewMemory() - if err := actors.LoadBundle(context.TODO(), bs, actors.Version8, build.BuiltinActorsV8Bundle()); err != nil { - return xerrors.Errorf("error loading actor bundle: %w", err) - } - - cborStore := cbor.NewCborStore(bs) - if err := actors.LoadManifests(ctx, cborStore); err != nil { - return xerrors.Errorf("error loading actor manifests: %w", err) + if err := actors.LoadManifestFromBundle(context.TODO(), bs, actors.Version8, build.BuiltinActorsV8Bundle()); err != nil { + return xerrors.Errorf("error loading actor manifest: %w", err) } } From e2e2cd87ff4b18ea976c4de278369755ef754ae3 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 15 Apr 2022 20:18:41 +0300 Subject: [PATCH 069/228] rename patchStateTree to patchManifestCodeCids --- chain/gen/genesis/genesis.go | 2 +- chain/gen/genesis/util.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 9b14ef063..581b635db 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -586,7 +586,7 @@ func MakeGenesisBlock(ctx context.Context, j journal.Journal, bs bstore.Blocksto return nil, xerrors.Errorf("error loading state tree") } - err = patchStateTree(st, template.NetworkVersion) + err = patchManifestCodeCids(st, template.NetworkVersion) if err != nil { return nil, xerrors.Errorf("error patching state tree: %w", err) } diff --git a/chain/gen/genesis/util.go b/chain/gen/genesis/util.go index b37ceb1b8..8bf5c031d 100644 --- a/chain/gen/genesis/util.go +++ b/chain/gen/genesis/util.go @@ -50,7 +50,7 @@ func doExecValue(ctx context.Context, vm *vm.LegacyVM, to, from address.Address, return ret.Return, nil } -func patchStateTree(st *state.StateTree, nv network.Version) error { +func patchManifestCodeCids(st *state.StateTree, nv network.Version) error { av, err := actors.VersionForNetwork(nv) if err != nil { return err From 959b62a2df79b348fab66f6b70f04f448216c33a Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 19 Apr 2022 14:42:53 +0300 Subject: [PATCH 070/228] new bundle fetcher --- .gitignore | 2 +- build/builtin-actors/bundles.env | 2 + build/builtin-actors/fetch-bundles.sh | 83 ++++++++++++++++----------- 3 files changed, 52 insertions(+), 35 deletions(-) create mode 100644 build/builtin-actors/bundles.env diff --git a/.gitignore b/.gitignore index b30b96310..00107fdcc 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,4 @@ bin/tmp/* .idea scratchpad -build/builtin-actors/*.car +build/builtin-actors/v* diff --git a/build/builtin-actors/bundles.env b/build/builtin-actors/bundles.env new file mode 100644 index 000000000..78405d953 --- /dev/null +++ b/build/builtin-actors/bundles.env @@ -0,0 +1,2 @@ +actors7_release="" +actors8_release=a9635268e3b359bd diff --git a/build/builtin-actors/fetch-bundles.sh b/build/builtin-actors/fetch-bundles.sh index dd30d6a1f..58fb5c39d 100755 --- a/build/builtin-actors/fetch-bundles.sh +++ b/build/builtin-actors/fetch-bundles.sh @@ -3,50 +3,65 @@ set -e cd "$(dirname "$0")" -# gateway to use -dweb="dweb.link" - -actors7_cid="" -actors7_hash="" -actors8_cid="bafybeictmywrut5tprz5fnoti6adfwuvixvrfardhqwldxosmdsfavc56e" -actors8_hash="687b38f59b0c32800f55a8f1f303de214ec173c90e653984d67f393bc41c1416" +. bundles.env die() { echo "$1" exit 1 } -check() { - file=$1 - hash=$2 - if [ -e "$file" ]; then - echo "$hash $file" | shasum -a 256 --check - else - return 1 - fi -} - fetch() { - output=$1 - cid=$2 - hash=$3 - if (check "$output" "$hash"); then - return 0 - else - echo "fetching $cid to $output" - curl --retry 3 -k "https://$dweb/ipfs/$cid" -o "$output" - check "$output" "$hash" || die "hash mismatch" + ver=$1 + rel=$2 + + if [ ! -e $ver ]; then + mkdir $ver fi + + if [ -e $ver/release ]; then + cur=$(cat $ver/release) + if [ $cur == $rel ]; then + return 0 + fi + fi + + for net in mainnet caterpillarnet butterflynet calibrationnet devnet testing; do + fetch_bundle $ver $rel $net + done + + # remember the current release so that we don't have to hit github unless we have modified it + echo $rel > $ver/release } -if [ -n "$actors7_cid" ]; then - fetch builtin-actors-v7.car "$actors7_cid" "$actors7_hash" -else - touch builtin-actors-v7.car +fetch_bundle() { + ver=$1 + rel=$2 + net=$3 + + target=builtin-actors-$net.car + hash=builtin-actors-$net.sha256 + + pushd $ver + + # fetch the hash first and check if it matches what we (may) already have + curl -L --retry 3 https://github.com/filecoin-project/builtin-actors/releases/download/$rel/$hash -o $hash || die "error fetching hash for $ver/$net" + if (shasum -a 256 --check $hash); then + popd + return 0 + fi + + # we don't have the (correct) bundle, fetch it + curl -L --retry 3 https://github.com/filecoin-project/builtin-actors/releases/download/$rel/$target -o $target || die "error fetching bundle for $ver/$net" + # verify + shasum -a 256 --check $hash || die "hash mismatch" + # all good + popd +} + +if [ -n "$actors7_release" ]; then + fetch v7 "$actors7_release" fi -if [ -n "$actors8_cid" ]; then - fetch builtin-actors-v8.car "$actors8_cid" "$actors8_hash" -else - touch builtin-actors-v8.car +if [ -n "$actors8_release" ]; then + fetch v8 "$actors8_release" fi From 995caaaace0d8e7aebc52b15266bb36c1c8ac589 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 19 Apr 2022 15:02:14 +0300 Subject: [PATCH 071/228] update filecoin-ffi --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 0c6d69861..4ff4fec93 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 0c6d698610a98c9efcefc58d5277ee8813d80033 +Subproject commit 4ff4fec93f1b40e1351af978b8df5de1156f389d From 7e1c55cdf9027c562055f43d839c8a2753bfe24f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 19 Apr 2022 15:20:40 +0300 Subject: [PATCH 072/228] use build tags to embed appropriate bundles --- build/builtin-actors/fetch-bundles.sh | 16 ++++++++++++++ build/builtin_actors_2k.go | 22 +++++++++++++++++++ build/builtin_actors_butterfly.go | 22 +++++++++++++++++++ ...n_actors.go => builtin_actors_calibnet.go} | 7 ++++-- build/builtin_actors_interop.go | 22 +++++++++++++++++++ build/builtin_actors_mainnet.go | 22 +++++++++++++++++++ 6 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 build/builtin_actors_2k.go create mode 100644 build/builtin_actors_butterfly.go rename build/{builtin_actors.go => builtin_actors_calibnet.go} (54%) create mode 100644 build/builtin_actors_interop.go create mode 100644 build/builtin_actors_mainnet.go diff --git a/build/builtin-actors/fetch-bundles.sh b/build/builtin-actors/fetch-bundles.sh index 58fb5c39d..bf4d44a55 100755 --- a/build/builtin-actors/fetch-bundles.sh +++ b/build/builtin-actors/fetch-bundles.sh @@ -58,10 +58,26 @@ fetch_bundle() { popd } +touch_bundles() { + ver=$1 + + if [ ! -e $ver ]; then + mkdir $ver + fi + + for net in mainnet caterpillarnet butterflynet calibrationnet devnet testing; do + touch $ver/builtin-actors-$net.car + done +} + if [ -n "$actors7_release" ]; then fetch v7 "$actors7_release" +else + touch_bundles v7 fi if [ -n "$actors8_release" ]; then fetch v8 "$actors8_release" +else + touch_bundles v8 fi diff --git a/build/builtin_actors_2k.go b/build/builtin_actors_2k.go new file mode 100644 index 000000000..1dfee49dc --- /dev/null +++ b/build/builtin_actors_2k.go @@ -0,0 +1,22 @@ +//go:build debug || 2k || testground +// +build debug 2k testground + +package build + +import ( + _ "embed" +) + +//go:embed builtin-actors/v8/builtin-actors-devnet.car +var actorsv8 []byte + +func BuiltinActorsV8Bundle() []byte { + return actorsv8 +} + +//go:embed builtin-actors/v7/builtin-actors-devnet.car +var actorsv7 []byte + +func BuiltinActorsV7Bundle() []byte { + return actorsv7 +} diff --git a/build/builtin_actors_butterfly.go b/build/builtin_actors_butterfly.go new file mode 100644 index 000000000..d3d76e8f9 --- /dev/null +++ b/build/builtin_actors_butterfly.go @@ -0,0 +1,22 @@ +//go:build butterflynet +// +build butterflynet + +package build + +import ( + _ "embed" +) + +//go:embed builtin-actors/v8/builtin-actors-butterflynet.car +var actorsv8 []byte + +func BuiltinActorsV8Bundle() []byte { + return actorsv8 +} + +//go:embed builtin-actors/v7/builtin-actors-butterflynet.car +var actorsv7 []byte + +func BuiltinActorsV7Bundle() []byte { + return actorsv7 +} diff --git a/build/builtin_actors.go b/build/builtin_actors_calibnet.go similarity index 54% rename from build/builtin_actors.go rename to build/builtin_actors_calibnet.go index 56bc5169a..d73760a77 100644 --- a/build/builtin_actors.go +++ b/build/builtin_actors_calibnet.go @@ -1,17 +1,20 @@ +//go:build calibnet +// +build calibnet + package build import ( _ "embed" ) -//go:embed builtin-actors/builtin-actors-v8.car +//go:embed builtin-actors/v8/builtin-actors-calibrationnet.car var actorsv8 []byte func BuiltinActorsV8Bundle() []byte { return actorsv8 } -//go:embed builtin-actors/builtin-actors-v7.car +//go:embed builtin-actors/v7/builtin-actors-calibrationnet.car var actorsv7 []byte func BuiltinActorsV7Bundle() []byte { diff --git a/build/builtin_actors_interop.go b/build/builtin_actors_interop.go new file mode 100644 index 000000000..8203e4b3d --- /dev/null +++ b/build/builtin_actors_interop.go @@ -0,0 +1,22 @@ +//go:build interopnet +// +build interopnet + +package build + +import ( + _ "embed" +) + +//go:embed builtin-actors/v8/builtin-actors-caterpillarnet.car +var actorsv8 []byte + +func BuiltinActorsV8Bundle() []byte { + return actorsv8 +} + +//go:embed builtin-actors/v7/builtin-actors-caterpillarnet.car +var actorsv7 []byte + +func BuiltinActorsV7Bundle() []byte { + return actorsv7 +} diff --git a/build/builtin_actors_mainnet.go b/build/builtin_actors_mainnet.go new file mode 100644 index 000000000..400ac7827 --- /dev/null +++ b/build/builtin_actors_mainnet.go @@ -0,0 +1,22 @@ +//go:build !debug && !2k && !testground && !calibnet && !nerpanet && !butterflynet && !interopnet +// +build !debug,!2k,!testground,!calibnet,!nerpanet,!butterflynet,!interopnet + +package build + +import ( + _ "embed" +) + +//go:embed builtin-actors/v8/builtin-actors-mainnet.car +var actorsv8 []byte + +func BuiltinActorsV8Bundle() []byte { + return actorsv8 +} + +//go:embed builtin-actors/v7/builtin-actors-mainnet.car +var actorsv7 []byte + +func BuiltinActorsV7Bundle() []byte { + return actorsv7 +} From eb7fc47290f3e44e24dae8f93e6832c4a302543d Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 19 Apr 2022 15:38:14 +0300 Subject: [PATCH 073/228] update CI workflow for bundle fetching --- .circleci/config.yml | 12 ------------ .circleci/template.yml | 12 ------------ 2 files changed, 24 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ca94d2a77..ba689c633 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -86,22 +86,10 @@ commands: git fetch --all fetch_builtin_actors: steps: - - restore_cache: - name: restore builtin actors bundle cache - keys: - - 'builtin-actors-v8.car' - paths: - - build/builtin-actors/ - run: name: fetch builtin actor bundles command: | build/builtin-actors/fetch-bundles.sh - - save_cache: - name: save builtin actors bundle cache - key: 'builtin-actors-v8.car' - paths: - - build/builtin-actors/ - packer_build: description: "Run a packer build" parameters: diff --git a/.circleci/template.yml b/.circleci/template.yml index 0543b3676..acb580966 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -86,22 +86,10 @@ commands: git fetch --all fetch_builtin_actors: steps: - - restore_cache: - name: restore builtin actors bundle cache - keys: - - 'builtin-actors-v8.car' - paths: - - build/builtin-actors/ - run: name: fetch builtin actor bundles command: | build/builtin-actors/fetch-bundles.sh - - save_cache: - name: save builtin actors bundle cache - key: 'builtin-actors-v8.car' - paths: - - build/builtin-actors/ - packer_build: description: "Run a packer build" parameters: From adaa02fd26a0c286425d683701ac6d61daad6a79 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 19 Apr 2022 17:33:08 +0300 Subject: [PATCH 074/228] load testing bundles for tests --- node/builder.go | 3 +++ node/modules/builtin_actors.go | 39 +++++++++++++++++++++++++++++++++ node/modules/testing/genesis.go | 8 +++---- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/node/builder.go b/node/builder.go index f0106ad97..6f9805760 100644 --- a/node/builder.go +++ b/node/builder.go @@ -384,6 +384,9 @@ func Test() Option { Unset(new(*peermgr.PeerMgr)), Override(new(beacon.Schedule), testing.RandomBeacon), Override(new(*storageadapter.DealPublisher), storageadapter.NewDealPublisher(nil, storageadapter.PublishMsgConfig{})), + // use the testing bundles + Unset(new(dtypes.BuiltinActorsLoaded)), + Override(new(dtypes.BuiltinActorsLoaded), modules.LoadBuiltinActorsTesting), ) } diff --git a/node/modules/builtin_actors.go b/node/modules/builtin_actors.go index a669123f2..c14b60ce8 100644 --- a/node/modules/builtin_actors.go +++ b/node/modules/builtin_actors.go @@ -1,6 +1,10 @@ package modules import ( + "fmt" + "io" + "os" + "go.uber.org/fx" "golang.org/x/xerrors" @@ -39,3 +43,38 @@ func LoadBultinActors(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.Univer return result, nil } + +// for itests +func LoadBuiltinActorsTesting(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.UniversalBlockstore) (result dtypes.BuiltinActorsLoaded, err error) { + ctx := helpers.LifecycleCtx(mctx, lc) + + base := os.Getenv("LOTUS_SRC_DIR") + if base == "" { + base = "." + } + + for _, ver := range []actors.Version{actors.Version8} { + path := fmt.Sprintf("%s/build/builtin-actors/v%d/builtin-actors-testing.car", base, ver) + + file, err := os.Open(path) + if err != nil { + return result, xerrors.Errorf("error opening v%d bundle: %w", ver, err) + } + + bundle, err := io.ReadAll(file) + if err != nil { + return result, xerrors.Errorf("error reading v%d bundle: %w", ver, err) + } + + if err := actors.LoadBundle(ctx, bs, actors.Version8, bundle); err != nil { + return result, xerrors.Errorf("error loading v%d bundle: %w", ver, err) + } + } + + cborStore := cbor.NewCborStore(bs) + if err := actors.LoadManifests(ctx, cborStore); err != nil { + return result, xerrors.Errorf("error loading actor manifests: %w", err) + } + + return result, nil +} diff --git a/node/modules/testing/genesis.go b/node/modules/testing/genesis.go index a3d25e36a..68d792d83 100644 --- a/node/modules/testing/genesis.go +++ b/node/modules/testing/genesis.go @@ -30,8 +30,8 @@ import ( var glog = logging.Logger("genesis") -func MakeGenesisMem(out io.Writer, template genesis.Template) func(bs dtypes.ChainBlockstore, syscalls vm.SyscallBuilder, j journal.Journal) modules.Genesis { - return func(bs dtypes.ChainBlockstore, syscalls vm.SyscallBuilder, j journal.Journal) modules.Genesis { +func MakeGenesisMem(out io.Writer, template genesis.Template) func(bs dtypes.ChainBlockstore, syscalls vm.SyscallBuilder, j journal.Journal, _ dtypes.BuiltinActorsLoaded) modules.Genesis { + return func(bs dtypes.ChainBlockstore, syscalls vm.SyscallBuilder, j journal.Journal, _ dtypes.BuiltinActorsLoaded) modules.Genesis { return func() (*types.BlockHeader, error) { glog.Warn("Generating new random genesis block, note that this SHOULD NOT happen unless you are setting up new network") b, err := genesis2.MakeGenesisBlock(context.TODO(), j, bs, syscalls, template) @@ -51,8 +51,8 @@ func MakeGenesisMem(out io.Writer, template genesis.Template) func(bs dtypes.Cha } } -func MakeGenesis(outFile, genesisTemplate string) func(bs dtypes.ChainBlockstore, syscalls vm.SyscallBuilder, j journal.Journal) modules.Genesis { - return func(bs dtypes.ChainBlockstore, syscalls vm.SyscallBuilder, j journal.Journal) modules.Genesis { +func MakeGenesis(outFile, genesisTemplate string) func(bs dtypes.ChainBlockstore, syscalls vm.SyscallBuilder, j journal.Journal, _ dtypes.BuiltinActorsLoaded) modules.Genesis { + return func(bs dtypes.ChainBlockstore, syscalls vm.SyscallBuilder, j journal.Journal, _ dtypes.BuiltinActorsLoaded) modules.Genesis { return func() (*types.BlockHeader, error) { glog.Warn("Generating new random genesis block, note that this SHOULD NOT happen unless you are setting up new network") genesisTemplate, err := homedir.Expand(genesisTemplate) From 942f05ad6a06727e3a3fe61590d9a988dfe135a9 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 19 Apr 2022 18:21:16 +0300 Subject: [PATCH 075/228] set LOTUS_SRC_DIR for tests in CI --- .circleci/config.yml | 3 ++- .circleci/template.yml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ba689c633..3fd7b24a9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -202,6 +202,7 @@ jobs: environment: TEST_RUSTPROOFS_LOGS: << parameters.proofs-log-test >> SKIP_CONFORMANCE: "1" + LOTUS_SRC_DIR: /home/circleci/project command: | mkdir -p /tmp/test-reports/<< parameters.suite >> mkdir -p /tmp/test-artifacts @@ -1113,4 +1114,4 @@ workflows: only: - master jobs: - - publish-packer-snap \ No newline at end of file + - publish-packer-snap diff --git a/.circleci/template.yml b/.circleci/template.yml index acb580966..2e4831dd7 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -202,6 +202,7 @@ jobs: environment: TEST_RUSTPROOFS_LOGS: << parameters.proofs-log-test >> SKIP_CONFORMANCE: "1" + LOTUS_SRC_DIR: /home/circleci/project command: | mkdir -p /tmp/test-reports/<< parameters.suite >> mkdir -p /tmp/test-artifacts @@ -918,4 +919,4 @@ workflows: only: - master jobs: - - publish-packer-snap \ No newline at end of file + - publish-packer-snap From 042601129dd6b7ffc6edcee0b586f193e527ad97 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 19 Apr 2022 18:39:55 +0300 Subject: [PATCH 076/228] fix lotus-seed --- cmd/lotus-seed/genesis.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-seed/genesis.go b/cmd/lotus-seed/genesis.go index 89feec33a..34dd15b89 100644 --- a/cmd/lotus-seed/genesis.go +++ b/cmd/lotus-seed/genesis.go @@ -1,6 +1,7 @@ package main import ( + "context" "encoding/csv" "encoding/json" "fmt" @@ -12,9 +13,11 @@ import ( "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" "github.com/filecoin-project/lotus/journal" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/modules/testing" "github.com/google/uuid" "github.com/mitchellh/go-homedir" @@ -577,7 +580,12 @@ var genesisCarCmd = &cli.Command{ jrnl := journal.NilJournal() bstor := blockstore.WrapIDStore(blockstore.NewMemorySync()) sbldr := vm.Syscalls(ffiwrapper.ProofVerifier) - _, err := testing.MakeGenesis(ofile, c.Args().First())(bstor, sbldr, jrnl)() + if len(build.BuiltinActorsV8Bundle()) > 0 { + if err := actors.LoadManifestFromBundle(context.TODO(), bstor, actors.Version8, build.BuiltinActorsV8Bundle()); err != nil { + return xerrors.Errorf("error loading actor manifest: %w", err) + } + } + _, err := testing.MakeGenesis(ofile, c.Args().First())(bstor, sbldr, jrnl, dtypes.BuiltinActorsLoaded{})() return err }, } From 34dfc78f57c8c7dd6fd94262bcb2eb03a2ed0d9f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 19 Apr 2022 19:12:25 +0300 Subject: [PATCH 077/228] only check hash if we have the file --- build/builtin-actors/fetch-bundles.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build/builtin-actors/fetch-bundles.sh b/build/builtin-actors/fetch-bundles.sh index bf4d44a55..6345480a5 100755 --- a/build/builtin-actors/fetch-bundles.sh +++ b/build/builtin-actors/fetch-bundles.sh @@ -45,9 +45,11 @@ fetch_bundle() { # fetch the hash first and check if it matches what we (may) already have curl -L --retry 3 https://github.com/filecoin-project/builtin-actors/releases/download/$rel/$hash -o $hash || die "error fetching hash for $ver/$net" - if (shasum -a 256 --check $hash); then - popd - return 0 + if [ -e $target ]; then + if (shasum -a 256 --check $hash); then + popd + return 0 + fi fi # we don't have the (correct) bundle, fetch it From b60d795a5dec3d6121b448fea10eefcee513b428 Mon Sep 17 00:00:00 2001 From: Aayush Date: Sun, 13 Mar 2022 17:24:13 -0400 Subject: [PATCH 078/228] FVM: Support exectraces --- chain/vm/cbor_gen.go | 169 ++++++++++++++++++++++++++++ chain/vm/fvm.go | 56 +++++++-- chain/vm/runtime.go | 8 +- chain/vm/runtime_test.go | 8 +- chain/vm/vm.go | 2 +- documentation/misc/gas_balancing.md | 2 +- extern/filecoin-ffi | 2 +- gen/main.go | 10 ++ testplans/lotus-soup/go.mod | 2 +- testplans/lotus-soup/go.sum | 31 ++--- 10 files changed, 256 insertions(+), 34 deletions(-) create mode 100644 chain/vm/cbor_gen.go diff --git a/chain/vm/cbor_gen.go b/chain/vm/cbor_gen.go new file mode 100644 index 000000000..76d8e9d48 --- /dev/null +++ b/chain/vm/cbor_gen.go @@ -0,0 +1,169 @@ +// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. + +package vm + +import ( + "fmt" + "io" + "math" + "sort" + + types "github.com/filecoin-project/lotus/chain/types" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" +) + +var _ = xerrors.Errorf +var _ = cid.Undef +var _ = math.E +var _ = sort.Sort + +var lengthBufFvmExecutionTrace = []byte{132} + +func (t *FvmExecutionTrace) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + if _, err := w.Write(lengthBufFvmExecutionTrace); err != nil { + return err + } + + scratch := make([]byte, 9) + + // t.Msg (types.Message) (struct) + if err := t.Msg.MarshalCBOR(w); err != nil { + return err + } + + // t.MsgRct (types.MessageReceipt) (struct) + if err := t.MsgRct.MarshalCBOR(w); err != nil { + return err + } + + // t.Error (string) (string) + if len(t.Error) > cbg.MaxLength { + return xerrors.Errorf("Value in field t.Error was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.Error))); err != nil { + return err + } + if _, err := io.WriteString(w, string(t.Error)); err != nil { + return err + } + + // t.Subcalls ([]vm.FvmExecutionTrace) (slice) + if len(t.Subcalls) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.Subcalls was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Subcalls))); err != nil { + return err + } + for _, v := range t.Subcalls { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + return nil +} + +func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) error { + *t = FvmExecutionTrace{} + + br := cbg.GetPeeker(r) + scratch := make([]byte, 8) + + maj, extra, err := cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajArray { + return fmt.Errorf("cbor input should be of type array") + } + + if extra != 4 { + return fmt.Errorf("cbor input had wrong number of fields") + } + + // t.Msg (types.Message) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.Msg = new(types.Message) + if err := t.Msg.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.Msg pointer: %w", err) + } + } + + } + // t.MsgRct (types.MessageReceipt) (struct) + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + t.MsgRct = new(types.MessageReceipt) + if err := t.MsgRct.UnmarshalCBOR(br); err != nil { + return xerrors.Errorf("unmarshaling t.MsgRct pointer: %w", err) + } + } + + } + // t.Error (string) (string) + + { + sval, err := cbg.ReadStringBuf(br, scratch) + if err != nil { + return err + } + + t.Error = string(sval) + } + // t.Subcalls ([]vm.FvmExecutionTrace) (slice) + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.Subcalls: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.Subcalls = make([]FvmExecutionTrace, extra) + } + + for i := 0; i < int(extra); i++ { + + var v FvmExecutionTrace + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.Subcalls[i] = v + } + + return nil +} diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index 5b52dd24e..a22020d83 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -48,7 +48,37 @@ type FvmExtern struct { base cid.Cid } -// VerifyConsensusFault is similar to the one in syscalls.go used by the LegacyVM, except it never errors +// This may eventually become identical to ExecutionTrace, but we can make incremental progress towards that +type FvmExecutionTrace struct { + Msg *types.Message + MsgRct *types.MessageReceipt + Error string + + Subcalls []FvmExecutionTrace +} + +func (t *FvmExecutionTrace) ToExecutionTrace() types.ExecutionTrace { + if t == nil { + return types.ExecutionTrace{} + } + + ret := types.ExecutionTrace{ + Msg: t.Msg, + MsgRct: t.MsgRct, + Error: t.Error, + Duration: 0, + GasCharges: nil, + Subcalls: make([]types.ExecutionTrace, len(t.Subcalls)), + } + + for i, v := range t.Subcalls { + ret.Subcalls[i] = v.ToExecutionTrace() + } + + return ret +} + +// VerifyConsensusFault is similar to the one in syscalls.go used by the Lotus VM, except it never errors // Errors are logged and "no fault" is returned, which is functionally what go-actors does anyway func (x *FvmExtern) VerifyConsensusFault(ctx context.Context, a, b, extra []byte) (*ffi_cgo.ConsensusFault, int64) { totalGas := int64(0) @@ -257,6 +287,7 @@ func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { BaseCircSupply: circToReport, NetworkVersion: opts.NetworkVersion, StateBase: opts.StateBase, + Tracing: EnableDetailedTracing, } if os.Getenv("LOTUS_USE_FVM_CUSTOM_BUNDLE") == "1" { @@ -295,6 +326,13 @@ func (vm *FVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet return nil, xerrors.Errorf("applying msg: %w", err) } + var et FvmExecutionTrace + if len(ret.ExecTraceBytes) != 0 { + if err = et.UnmarshalCBOR(bytes.NewReader(ret.ExecTraceBytes)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal exectrace: %w", err) + } + } + return &ApplyRet{ MessageReceipt: types.MessageReceipt{ Return: ret.Return, @@ -311,10 +349,8 @@ func (vm *FVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet GasRefund: 0, GasBurned: 0, }, - // TODO: do these eventually, not consensus critical - // https://github.com/filecoin-project/ref-fvm/issues/318 ActorErr: nil, - ExecutionTrace: types.ExecutionTrace{}, + ExecutionTrace: et.ToExecutionTrace(), Duration: time.Since(start), }, nil } @@ -330,17 +366,21 @@ func (vm *FVM) ApplyImplicitMessage(ctx context.Context, cmsg *types.Message) (* return nil, xerrors.Errorf("applying msg: %w", err) } + var et FvmExecutionTrace + if len(ret.ExecTraceBytes) != 0 { + if err = et.UnmarshalCBOR(bytes.NewReader(ret.ExecTraceBytes)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal exectrace: %w", err) + } + } + return &ApplyRet{ MessageReceipt: types.MessageReceipt{ Return: ret.Return, ExitCode: exitcode.ExitCode(ret.ExitCode), GasUsed: ret.GasUsed, }, - GasCosts: nil, - // TODO: do these eventually, not consensus critical - // https://github.com/filecoin-project/ref-fvm/issues/318 ActorErr: nil, - ExecutionTrace: types.ExecutionTrace{}, + ExecutionTrace: et.ToExecutionTrace(), Duration: time.Since(start), }, nil } diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 39617f91c..6f671065f 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -60,8 +60,8 @@ func (m *Message) ValueReceived() abi.TokenAmount { return m.msg.Value } -// EnableGasTracing, if true, outputs gas tracing in execution traces. -var EnableGasTracing = os.Getenv("LOTUS_VM_ENABLE_GAS_TRACING_VERY_SLOW") == "1" +// EnableDetailedTracing, if true, outputs gas tracing in execution traces. +var EnableDetailedTracing = os.Getenv("LOTUS_VM_ENABLE_GAS_TRACING_VERY_SLOW") == "1" type Runtime struct { rt7.Message @@ -552,7 +552,7 @@ func (rt *Runtime) stateCommit(oldh, newh cid.Cid) aerrors.ActorError { } func (rt *Runtime) finilizeGasTracing() { - if EnableGasTracing { + if EnableDetailedTracing { if rt.lastGasCharge != nil { rt.lastGasCharge.TimeTaken = time.Since(rt.lastGasChargeTime) } @@ -586,7 +586,7 @@ func (rt *Runtime) chargeGasFunc(skip int) func(GasCharge) { func (rt *Runtime) chargeGasInternal(gas GasCharge, skip int) aerrors.ActorError { toUse := gas.Total() - if EnableGasTracing { + if EnableDetailedTracing { var callers [10]uintptr cout := gruntime.Callers(2+skip, callers[:]) diff --git a/chain/vm/runtime_test.go b/chain/vm/runtime_test.go index 816835cb9..0c75cb1dd 100644 --- a/chain/vm/runtime_test.go +++ b/chain/vm/runtime_test.go @@ -56,14 +56,14 @@ func BenchmarkRuntime_CreateRuntimeChargeGas_TracingDisabled(b *testing.B) { b.ResetTimer() - EnableGasTracing = false - noop := func() bool { return EnableGasTracing } + EnableDetailedTracing = false + noop := func() bool { return EnableDetailedTracing } for n := 0; n < b.N; n++ { // flip the value and access it to make sure // the compiler doesn't optimize away - EnableGasTracing = true + EnableDetailedTracing = true _ = noop() - EnableGasTracing = false + EnableDetailedTracing = false _ = (&Runtime{cst: cst}).chargeGasInternal(gch, 0) } } diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 7b9d6ba8a..4b3fd2105 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -283,7 +283,7 @@ func (vm *LegacyVM) send(ctx context.Context, msg *types.Message, parent *Runtim st := vm.cstate rt := vm.makeRuntime(ctx, msg, parent) - if EnableGasTracing { + if EnableDetailedTracing { rt.lastGasChargeTime = start if parent != nil { rt.lastGasChargeTime = parent.lastGasChargeTime diff --git a/documentation/misc/gas_balancing.md b/documentation/misc/gas_balancing.md index 64d9fcf0e..213c9681e 100644 --- a/documentation/misc/gas_balancing.md +++ b/documentation/misc/gas_balancing.md @@ -15,7 +15,7 @@ may be subject to change. Complete gas balancing is performed using `lotus-bench` the process is based on importing a chain export and collecting gas traces which are later aggregated. -Before building `lotus-bench` make sure `EnableGasTracing` in `chain/vm/runtime.go` is set to `true`. +Before building `lotus-bench` make sure `EnableDetailedTracing` in `chain/vm/runtime.go` is set to `true`. The process can be started using `./lotus-bench import` with `--car` flag set to the location of CAR chain export. `--start-epoch` and `--end-epoch` can be used to to limit the range of epochs to run diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 4ff4fec93..4cb8411aa 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 4ff4fec93f1b40e1351af978b8df5de1156f389d +Subproject commit 4cb8411aa6c15bc8f38fef9dcd9ae5d83837eb87 diff --git a/gen/main.go b/gen/main.go index f7b96c537..1118f9716 100644 --- a/gen/main.go +++ b/gen/main.go @@ -4,6 +4,8 @@ import ( "fmt" "os" + "github.com/filecoin-project/lotus/chain/vm" + gen "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/lotus/api" @@ -38,6 +40,14 @@ func main() { os.Exit(1) } + err = gen.WriteTupleEncodersToFile("./chain/vm/cbor_gen.go", "vm", + vm.FvmExecutionTrace{}, + ) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + err = gen.WriteMapEncodersToFile("./paychmgr/cbor_gen.go", "paychmgr", paychmgr.VoucherInfo{}, paychmgr.ChannelInfo{}, diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index a89c6f038..dbf8219c9 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -28,7 +28,7 @@ require ( github.com/ipfs/go-unixfs v0.3.1 github.com/ipld/go-car v0.3.3 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c - github.com/libp2p/go-libp2p v0.18.0 + github.com/libp2p/go-libp2p v0.18.1 github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 github.com/multiformats/go-multiaddr v0.5.0 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 4ad4101fa..6f9efd946 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -1312,8 +1312,8 @@ github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76f github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= -github.com/libp2p/go-libp2p v0.18.0 h1:moKKKG875KNGsCjZxTIFB75ihHiVjFeWg5I4aR1pDLk= -github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4cggO11ETmw= +github.com/libp2p/go-libp2p v0.18.1 h1:IK9EOGNO2ZghU4F+dx9c4xfhMNZr45x06CijJaZE/ms= +github.com/libp2p/go-libp2p v0.18.1/go.mod h1:ll44MqmrIFKpL3BwCexxzm+7RZ8exEtN96V1rRdMG7Y= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1496,8 +1496,8 @@ github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs2 github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-resource-manager v0.1.3/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.1.5 h1:7J6t9KLFS0MxXDTfqA6rwfVCZl/yLQnXW5LpZjHAANI= -github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.2.0 h1:Ul/k5d5StIpAtq7IapAEGh/2+0rwsJGXYJ6Kbzeedtc= +github.com/libp2p/go-libp2p-resource-manager v0.2.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= @@ -1539,8 +1539,9 @@ github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= -github.com/libp2p/go-libp2p-testing v0.8.0 h1:/te8SOIyj5sGH5Jr1Uoo+qYB00aK8O4+yHGzLgfE3kc= github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc= +github.com/libp2p/go-libp2p-testing v0.9.2 h1:dCpODRtRaDZKF8HXT9qqqgON+OMEB423Knrgeod8j84= +github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= @@ -1578,8 +1579,8 @@ github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mW github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= -github.com/libp2p/go-libp2p-yamux v0.8.2 h1:6GKWntresp0TFxMP/oSoH96nV8XKJRdynXsdp43dn0Y= -github.com/libp2p/go-libp2p-yamux v0.8.2/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= +github.com/libp2p/go-libp2p-yamux v0.9.0 h1:j+gnKykADCI/3cZlacOYBjQXDsncxgcwzJ1zw6Z6pts= +github.com/libp2p/go-libp2p-yamux v0.9.0/go.mod h1:tpJKkRH9LlHj0VQh9Y9RP1pmF7yCS9ixxY/oSv+hhhQ= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1678,8 +1679,9 @@ github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZj github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/go-yamux/v3 v3.0.2 h1:LW0q5+A1Wy0npEsPJP9wmare2NH4ohNluN5EWVwv2mE= github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= +github.com/libp2p/go-yamux/v3 v3.1.0 h1:2johPiST4xsXsqQ/38C2MAERw0hJ+t8oehHWA8F2R3Q= +github.com/libp2p/go-yamux/v3 v3.1.0/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= @@ -2318,7 +2320,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU= @@ -2521,8 +2523,9 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2592,9 +2595,9 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2734,11 +2737,11 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025112917-711f33c9992c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2844,8 +2847,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 5ceaeafa6eea3695ff23d79b1d8fafb7789b59a5 Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 20 Apr 2022 12:47:06 +0300 Subject: [PATCH 079/228] fix TODO for proof type, now that we have the testing bundle --- itests/kit/ensemble.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 6149758d6..d9eb9a2fd 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -406,16 +406,8 @@ func (n *Ensemble) Start() *Ensemble { // this is a miner created after genesis, so it won't have a preseal. // we need to create it on chain. - // we get the proof type for the requested sector size, for - // the current network version. - // nv, err := m.FullNode.FullNode.StateNetworkVersion(ctx, types.EmptyTSK) - // require.NoError(n.t, err) - - // TODO this doesn't currently work with the FVM -- we need to specify policy somehow - // proofType, err := miner.WindowPoStProofTypeFromSectorSize(m.options.sectorSize) - // require.NoError(n.t, err) - // so do this instead, which works: - proofType := abi.RegisteredPoStProof_StackedDrgWindow64GiBV1 + proofType, err := miner.WindowPoStProofTypeFromSectorSize(m.options.sectorSize) + require.NoError(n.t, err) params, aerr := actors.SerializeParams(&power3.CreateMinerParams{ Owner: m.OwnerKey.Address, From 8ea00a3fc0267156f303fc59cf2c081361dd1070 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 21 Apr 2022 13:21:24 +0300 Subject: [PATCH 080/228] update builtin-actors bundle --- build/builtin-actors/bundles.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtin-actors/bundles.env b/build/builtin-actors/bundles.env index 78405d953..808a758c7 100644 --- a/build/builtin-actors/bundles.env +++ b/build/builtin-actors/bundles.env @@ -1,2 +1,2 @@ actors7_release="" -actors8_release=a9635268e3b359bd +actors8_release=5921189441f18b88 From 1366901dede54cdbd090d3172be09262b2f816b7 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 21 Apr 2022 13:26:22 +0300 Subject: [PATCH 081/228] preload manifest in cli --- cli/init.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 cli/init.go diff --git a/cli/init.go b/cli/init.go new file mode 100644 index 000000000..f90811556 --- /dev/null +++ b/cli/init.go @@ -0,0 +1,22 @@ +package cli + +import ( + "context" + "fmt" + + "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors" +) + +func init() { + // preload manifest so that we have the correct code CID inventory for cli since that doesn't + // go through CI + if len(build.BuiltinActorsV8Bundle()) > 0 { + bs := blockstore.NewMemory() + + if err := actors.LoadManifestFromBundle(context.TODO(), bs, actors.Version8, build.BuiltinActorsV8Bundle()); err != nil { + panic(fmt.Errorf("error loading actor manifest: %w", err)) + } + } +} From 75f00e92f559d72b662846e1a895fcad990cec36 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 21 Apr 2022 13:53:30 +0300 Subject: [PATCH 082/228] improve concurrency story of manifest state --- chain/actors/manifest.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go index f9932d1db..72cc411fa 100644 --- a/chain/actors/manifest.go +++ b/chain/actors/manifest.go @@ -25,10 +25,7 @@ var manifests map[Version]*manifest.Manifest var actorMeta map[cid.Cid]actorEntry var ( - loadOnce sync.Once - loadError error - - manifestMx sync.Mutex + manifestMx sync.RWMutex ) type actorEntry struct { @@ -44,17 +41,18 @@ func AddManifest(av Version, manifestCid cid.Cid) { } func GetManifest(av Version) (cid.Cid, bool) { - manifestMx.Lock() - defer manifestMx.Unlock() + manifestMx.RLock() + defer manifestMx.RUnlock() c, ok := manifestCids[av] return c, ok } func LoadManifests(ctx context.Context, store cbor.IpldStore) error { - // tests may invoke this concurrently, so we wrap it in a sync.Once - loadOnce.Do(func() { loadError = loadManifests(ctx, store) }) - return loadError + manifestMx.Lock() + defer manifestMx.Unlock() + + return loadManifests(ctx, store) } func loadManifests(ctx context.Context, store cbor.IpldStore) error { @@ -87,6 +85,9 @@ func loadManifests(ctx context.Context, store cbor.IpldStore) error { } func GetActorCodeID(av Version, name string) (cid.Cid, bool) { + manifestMx.RLock() + defer manifestMx.RUnlock() + mf, ok := manifests[av] if ok { return mf.Get(name) @@ -96,6 +97,9 @@ func GetActorCodeID(av Version, name string) (cid.Cid, bool) { } func GetActorMetaByCode(c cid.Cid) (string, Version, bool) { + manifestMx.RLock() + defer manifestMx.RUnlock() + entry, ok := actorMeta[c] if !ok { return "", -1, false From 090c655422698eacde6aaba77db23f911b4c6c86 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 21 Apr 2022 14:18:21 +0300 Subject: [PATCH 083/228] remove log spam --- chain/vm/fvm.go | 1 - 1 file changed, 1 deletion(-) diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index a22020d83..14421bfcc 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -257,7 +257,6 @@ type FVM struct { } func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { - log.Info("using the FVM, this is experimental!") circToReport := opts.FilVested // For v14 (and earlier), we perform the FilVested portion of the calculation, and let the FVM dynamically do the rest // v15 and after, the circ supply is always constant per epoch, so we calculate the base and report it at creation From 688e8f3c09b9c35e39fb1a1985affc28fcdf87ff Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 21 Apr 2022 15:09:49 +0300 Subject: [PATCH 084/228] fix multisig creation to not use the synthetic CIDs after v8 --- chain/actors/builtin/multisig/message.go.template | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/chain/actors/builtin/multisig/message.go.template b/chain/actors/builtin/multisig/message.go.template index 6bff8983a..b8bee9780 100644 --- a/chain/actors/builtin/multisig/message.go.template +++ b/chain/actors/builtin/multisig/message.go.template @@ -54,9 +54,17 @@ func (m message{{.v}}) Create( return nil, actErr } + {{if (le .v 7)}} + actorCodeID := builtin{{.v}}.MultisigActorCodeID + {{else}} + actorCodeID, ok := actors.GetActorCodeID(actors.Version{{.v}}, "multisig") + if !ok { + return nil, xerrors.Errorf("error getting actor multisig code id for actor version %d", {{.v}}) + } + {{end}} // new actors are created by invoking 'exec' on the init actor with the constructor params execParams := &init{{.v}}.ExecParams{ - CodeCID: builtin{{.v}}.MultisigActorCodeID, + CodeCID: actorCodeID, ConstructorParams: enc, } From 2d93697fe33934fba896f1ef7cc40395fcdb4ad4 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 21 Apr 2022 15:09:58 +0300 Subject: [PATCH 085/228] make gen --- chain/actors/builtin/multisig/message0.go | 4 +++- chain/actors/builtin/multisig/message2.go | 4 +++- chain/actors/builtin/multisig/message3.go | 4 +++- chain/actors/builtin/multisig/message4.go | 4 +++- chain/actors/builtin/multisig/message5.go | 4 +++- chain/actors/builtin/multisig/message6.go | 4 +++- chain/actors/builtin/multisig/message7.go | 4 +++- chain/actors/builtin/multisig/message8.go | 7 ++++++- 8 files changed, 27 insertions(+), 8 deletions(-) diff --git a/chain/actors/builtin/multisig/message0.go b/chain/actors/builtin/multisig/message0.go index dc43a9d5d..ec40e1347 100644 --- a/chain/actors/builtin/multisig/message0.go +++ b/chain/actors/builtin/multisig/message0.go @@ -53,9 +53,11 @@ func (m message0) Create( return nil, actErr } + actorCodeID := builtin0.MultisigActorCodeID + // new actors are created by invoking 'exec' on the init actor with the constructor params execParams := &init0.ExecParams{ - CodeCID: builtin0.MultisigActorCodeID, + CodeCID: actorCodeID, ConstructorParams: enc, } diff --git a/chain/actors/builtin/multisig/message2.go b/chain/actors/builtin/multisig/message2.go index da2700d06..96953662f 100644 --- a/chain/actors/builtin/multisig/message2.go +++ b/chain/actors/builtin/multisig/message2.go @@ -50,9 +50,11 @@ func (m message2) Create( return nil, actErr } + actorCodeID := builtin2.MultisigActorCodeID + // new actors are created by invoking 'exec' on the init actor with the constructor params execParams := &init2.ExecParams{ - CodeCID: builtin2.MultisigActorCodeID, + CodeCID: actorCodeID, ConstructorParams: enc, } diff --git a/chain/actors/builtin/multisig/message3.go b/chain/actors/builtin/multisig/message3.go index f5f6d8cdf..581e4808e 100644 --- a/chain/actors/builtin/multisig/message3.go +++ b/chain/actors/builtin/multisig/message3.go @@ -50,9 +50,11 @@ func (m message3) Create( return nil, actErr } + actorCodeID := builtin3.MultisigActorCodeID + // new actors are created by invoking 'exec' on the init actor with the constructor params execParams := &init3.ExecParams{ - CodeCID: builtin3.MultisigActorCodeID, + CodeCID: actorCodeID, ConstructorParams: enc, } diff --git a/chain/actors/builtin/multisig/message4.go b/chain/actors/builtin/multisig/message4.go index 90885aa07..6b50e7248 100644 --- a/chain/actors/builtin/multisig/message4.go +++ b/chain/actors/builtin/multisig/message4.go @@ -50,9 +50,11 @@ func (m message4) Create( return nil, actErr } + actorCodeID := builtin4.MultisigActorCodeID + // new actors are created by invoking 'exec' on the init actor with the constructor params execParams := &init4.ExecParams{ - CodeCID: builtin4.MultisigActorCodeID, + CodeCID: actorCodeID, ConstructorParams: enc, } diff --git a/chain/actors/builtin/multisig/message5.go b/chain/actors/builtin/multisig/message5.go index 9a8110f2c..8775e334a 100644 --- a/chain/actors/builtin/multisig/message5.go +++ b/chain/actors/builtin/multisig/message5.go @@ -50,9 +50,11 @@ func (m message5) Create( return nil, actErr } + actorCodeID := builtin5.MultisigActorCodeID + // new actors are created by invoking 'exec' on the init actor with the constructor params execParams := &init5.ExecParams{ - CodeCID: builtin5.MultisigActorCodeID, + CodeCID: actorCodeID, ConstructorParams: enc, } diff --git a/chain/actors/builtin/multisig/message6.go b/chain/actors/builtin/multisig/message6.go index b2b95245e..4e70a5863 100644 --- a/chain/actors/builtin/multisig/message6.go +++ b/chain/actors/builtin/multisig/message6.go @@ -50,9 +50,11 @@ func (m message6) Create( return nil, actErr } + actorCodeID := builtin6.MultisigActorCodeID + // new actors are created by invoking 'exec' on the init actor with the constructor params execParams := &init6.ExecParams{ - CodeCID: builtin6.MultisigActorCodeID, + CodeCID: actorCodeID, ConstructorParams: enc, } diff --git a/chain/actors/builtin/multisig/message7.go b/chain/actors/builtin/multisig/message7.go index e7fb83e9b..ceba4f41a 100644 --- a/chain/actors/builtin/multisig/message7.go +++ b/chain/actors/builtin/multisig/message7.go @@ -50,9 +50,11 @@ func (m message7) Create( return nil, actErr } + actorCodeID := builtin7.MultisigActorCodeID + // new actors are created by invoking 'exec' on the init actor with the constructor params execParams := &init7.ExecParams{ - CodeCID: builtin7.MultisigActorCodeID, + CodeCID: actorCodeID, ConstructorParams: enc, } diff --git a/chain/actors/builtin/multisig/message8.go b/chain/actors/builtin/multisig/message8.go index 9852af105..bd0016762 100644 --- a/chain/actors/builtin/multisig/message8.go +++ b/chain/actors/builtin/multisig/message8.go @@ -50,9 +50,14 @@ func (m message8) Create( return nil, actErr } + actorCodeID, ok := actors.GetActorCodeID(actors.Version8, "multisig") + if !ok { + return nil, xerrors.Errorf("error getting actor multisig code id for actor version %d", 8) + } + // new actors are created by invoking 'exec' on the init actor with the constructor params execParams := &init8.ExecParams{ - CodeCID: builtin8.MultisigActorCodeID, + CodeCID: actorCodeID, ConstructorParams: enc, } From 0def6cb9e1cb6025eb225ed5783b9b1322fbbe14 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 21 Apr 2022 19:19:13 +0300 Subject: [PATCH 086/228] fix paymentch actor code ID for construction --- chain/actors/builtin/paych/message.go.template | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/chain/actors/builtin/paych/message.go.template b/chain/actors/builtin/paych/message.go.template index 99f64cabb..962942f81 100644 --- a/chain/actors/builtin/paych/message.go.template +++ b/chain/actors/builtin/paych/message.go.template @@ -1,6 +1,10 @@ package paych import ( + {{if (ge .v 8)}} + "golang.org/x/xerrors" + {{end}} + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -16,12 +20,21 @@ import ( type message{{.v}} struct{ from address.Address } func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + {{if (le .v 7)}} + actorCodeID := builtin{{.v}}.PaymentChannelActorCodeID + {{else}} + actorCodeID, ok := actors.GetActorCodeID(actors.Version{{.v}}, "paymentchannel") + if !ok { + return nil, xerrors.Errorf("error getting actor paymentchannel code id for actor version %d", {{.v}}) + } + {{end}} + params, aerr := actors.SerializeParams(&paych{{.v}}.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } enc, aerr := actors.SerializeParams(&init{{.v}}.ExecParams{ - CodeCID: builtin{{.v}}.PaymentChannelActorCodeID, + CodeCID: actorCodeID, ConstructorParams: params, }) if aerr != nil { From f017d43aae912ec8567a6f87f7670caf3fe17dbc Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 21 Apr 2022 19:19:20 +0300 Subject: [PATCH 087/228] make gen --- chain/actors/builtin/paych/message0.go | 5 ++++- chain/actors/builtin/paych/message2.go | 5 ++++- chain/actors/builtin/paych/message3.go | 5 ++++- chain/actors/builtin/paych/message4.go | 5 ++++- chain/actors/builtin/paych/message5.go | 5 ++++- chain/actors/builtin/paych/message6.go | 5 ++++- chain/actors/builtin/paych/message7.go | 5 ++++- chain/actors/builtin/paych/message8.go | 10 +++++++++- 8 files changed, 37 insertions(+), 8 deletions(-) diff --git a/chain/actors/builtin/paych/message0.go b/chain/actors/builtin/paych/message0.go index 7cba977e3..d7f8201ee 100644 --- a/chain/actors/builtin/paych/message0.go +++ b/chain/actors/builtin/paych/message0.go @@ -16,12 +16,15 @@ import ( type message0 struct{ from address.Address } func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + + actorCodeID := builtin0.PaymentChannelActorCodeID + params, aerr := actors.SerializeParams(&paych0.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } enc, aerr := actors.SerializeParams(&init0.ExecParams{ - CodeCID: builtin0.PaymentChannelActorCodeID, + CodeCID: actorCodeID, ConstructorParams: params, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message2.go b/chain/actors/builtin/paych/message2.go index 60c7fe16e..30bd5b886 100644 --- a/chain/actors/builtin/paych/message2.go +++ b/chain/actors/builtin/paych/message2.go @@ -16,12 +16,15 @@ import ( type message2 struct{ from address.Address } func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + + actorCodeID := builtin2.PaymentChannelActorCodeID + params, aerr := actors.SerializeParams(&paych2.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } enc, aerr := actors.SerializeParams(&init2.ExecParams{ - CodeCID: builtin2.PaymentChannelActorCodeID, + CodeCID: actorCodeID, ConstructorParams: params, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message3.go b/chain/actors/builtin/paych/message3.go index 04fb35b57..06e43a4b3 100644 --- a/chain/actors/builtin/paych/message3.go +++ b/chain/actors/builtin/paych/message3.go @@ -16,12 +16,15 @@ import ( type message3 struct{ from address.Address } func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + + actorCodeID := builtin3.PaymentChannelActorCodeID + params, aerr := actors.SerializeParams(&paych3.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } enc, aerr := actors.SerializeParams(&init3.ExecParams{ - CodeCID: builtin3.PaymentChannelActorCodeID, + CodeCID: actorCodeID, ConstructorParams: params, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message4.go b/chain/actors/builtin/paych/message4.go index 9f5e000d9..abb1c056b 100644 --- a/chain/actors/builtin/paych/message4.go +++ b/chain/actors/builtin/paych/message4.go @@ -16,12 +16,15 @@ import ( type message4 struct{ from address.Address } func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + + actorCodeID := builtin4.PaymentChannelActorCodeID + params, aerr := actors.SerializeParams(&paych4.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } enc, aerr := actors.SerializeParams(&init4.ExecParams{ - CodeCID: builtin4.PaymentChannelActorCodeID, + CodeCID: actorCodeID, ConstructorParams: params, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message5.go b/chain/actors/builtin/paych/message5.go index 71e6b6799..bddb3a3eb 100644 --- a/chain/actors/builtin/paych/message5.go +++ b/chain/actors/builtin/paych/message5.go @@ -16,12 +16,15 @@ import ( type message5 struct{ from address.Address } func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + + actorCodeID := builtin5.PaymentChannelActorCodeID + params, aerr := actors.SerializeParams(&paych5.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } enc, aerr := actors.SerializeParams(&init5.ExecParams{ - CodeCID: builtin5.PaymentChannelActorCodeID, + CodeCID: actorCodeID, ConstructorParams: params, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message6.go b/chain/actors/builtin/paych/message6.go index 7f80bc4a6..5918a5c92 100644 --- a/chain/actors/builtin/paych/message6.go +++ b/chain/actors/builtin/paych/message6.go @@ -16,12 +16,15 @@ import ( type message6 struct{ from address.Address } func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + + actorCodeID := builtin6.PaymentChannelActorCodeID + params, aerr := actors.SerializeParams(&paych6.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } enc, aerr := actors.SerializeParams(&init6.ExecParams{ - CodeCID: builtin6.PaymentChannelActorCodeID, + CodeCID: actorCodeID, ConstructorParams: params, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message7.go b/chain/actors/builtin/paych/message7.go index e3ee0d77b..3ad5d35db 100644 --- a/chain/actors/builtin/paych/message7.go +++ b/chain/actors/builtin/paych/message7.go @@ -16,12 +16,15 @@ import ( type message7 struct{ from address.Address } func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + + actorCodeID := builtin7.PaymentChannelActorCodeID + params, aerr := actors.SerializeParams(&paych7.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } enc, aerr := actors.SerializeParams(&init7.ExecParams{ - CodeCID: builtin7.PaymentChannelActorCodeID, + CodeCID: actorCodeID, ConstructorParams: params, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message8.go b/chain/actors/builtin/paych/message8.go index f49f457e8..bfc3cfdde 100644 --- a/chain/actors/builtin/paych/message8.go +++ b/chain/actors/builtin/paych/message8.go @@ -1,6 +1,8 @@ package paych import ( + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" @@ -16,12 +18,18 @@ import ( type message8 struct{ from address.Address } func (m message8) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + + actorCodeID, ok := actors.GetActorCodeID(actors.Version8, "paymentchannel") + if !ok { + return nil, xerrors.Errorf("error getting actor paymentchannel code id for actor version %d", 8) + } + params, aerr := actors.SerializeParams(&paych8.ConstructorParams{From: m.from, To: to}) if aerr != nil { return nil, aerr } enc, aerr := actors.SerializeParams(&init8.ExecParams{ - CodeCID: builtin8.PaymentChannelActorCodeID, + CodeCID: actorCodeID, ConstructorParams: params, }) if aerr != nil { From eb9aa039bb722b0a606db12bab2a1f7a66a8b32f Mon Sep 17 00:00:00 2001 From: Aayush Date: Thu, 21 Apr 2022 17:00:44 -0400 Subject: [PATCH 088/228] Set interop (caterpillarnet) params --- build/params_interop.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/params_interop.go b/build/params_interop.go index 14c63d1dc..1821d8685 100644 --- a/build/params_interop.go +++ b/build/params_interop.go @@ -19,7 +19,7 @@ import ( const BootstrappersFile = "interopnet.pi" const GenesisFile = "interopnet.car" -const GenesisNetworkVersion = network.Version13 +const GenesisNetworkVersion = network.Version15 var UpgradeBreezeHeight = abi.ChainEpoch(-1) @@ -48,7 +48,7 @@ var UpgradeTurboHeight = abi.ChainEpoch(-15) var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) var UpgradeOhSnapHeight = abi.ChainEpoch(-18) -var UpgradeFVM1Height = abi.ChainEpoch(-19) +var UpgradeFVM1Height = abi.ChainEpoch(3000) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, From 3eb007776a0a522e0ae707716394255ca10d8fbc Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 22 Apr 2022 11:40:59 -0400 Subject: [PATCH 089/228] Update actors --- go.mod | 2 +- go.sum | 4 ++-- testplans/lotus-soup/go.mod | 2 +- testplans/lotus-soup/go.sum | 45 +++++++++++++++++++------------------ 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index bdc15c3c3..7994c5142 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0 - github.com/filecoin-project/specs-actors/v8 v8.0.0-20220414161338-8ff313b3258a + github.com/filecoin-project/specs-actors/v8 v8.0.0-20220422153930-0afe155bfffa github.com/filecoin-project/specs-storage v0.2.2 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index 7ef717353..06c9eb2ae 100644 --- a/go.sum +++ b/go.sum @@ -395,8 +395,8 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1.0.20220118005651-2470cb39 github.com/filecoin-project/specs-actors/v7 v7.0.0 h1:FQN7tjt3o68hfb3qLFSJBoLMuOFY0REkFVLO/zXj8RU= github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220414161338-8ff313b3258a h1:5M+1REWUeMsplhcrPwrU/ltUwiUqtaumPm7hwcZ3Ddg= -github.com/filecoin-project/specs-actors/v8 v8.0.0-20220414161338-8ff313b3258a/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220422153930-0afe155bfffa h1:P9l2WQMvWUJ450esBttbAaqH8Lhe1hu1W2J6cQsiZcA= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220422153930-0afe155bfffa/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-storage v0.2.2 h1:6ugbtKQ6LTcTEnEIX9HkeCtTp1PCYO497P/bokF5tF4= github.com/filecoin-project/specs-storage v0.2.2/go.mod h1:6cc/lncmAxMUocPi0z1EPCX63beIX7F7UnlmUZ3hLQo= github.com/filecoin-project/storetheindex v0.4.0 h1:MPIDJYBknPbwBcVf+2/WEIK6LKxhZmfQGCrqKmvhFyU= diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index dbf8219c9..4dae43d09 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -9,7 +9,7 @@ require ( github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-data-transfer v1.15.1 - github.com/filecoin-project/go-fil-markets v1.20.1 + github.com/filecoin-project/go-fil-markets v1.20.2 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 6f9efd946..56facd1c7 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -389,6 +389,7 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/filecoin-project/dagstore v0.5.2 h1:Nd6oXdnolbbVhpMpkYT5PJHOjQp4OBSntHpMV5pxj3c= github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= @@ -426,8 +427,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.20.1 h1:DwrFuNIWC0a2c2ESpHtdEMH3QCpR/hoZ5DwjNT+VJ+E= -github.com/filecoin-project/go-fil-markets v1.20.1/go.mod h1:QV767KIWHrikVK8R0u2wTc5wkee4gXOf5/AfxDoQckw= +github.com/filecoin-project/go-fil-markets v1.20.2 h1:OnfT3ggxksjz0IpPeWF4SvwVqQPmsQE3Ei4CB1Y/d0A= +github.com/filecoin-project/go-fil-markets v1.20.2/go.mod h1:lhA01KAScD9S/N4J5On9Y3vXmqm/r2yWlKrbKRItLGY= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -435,11 +436,11 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43PjRCn3yBuUiZgIxuA0hTUamY= +github.com/filecoin-project/go-indexer-core v0.2.9/go.mod h1:u03I3HB6ZnqCc3cm8Tq+QkTWBbfKOvNxM8K6Ny/IHRw= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-legs v0.3.7 h1:yfm7fx+iy1nPtgPEQ6kQjvhoJOVbXide50STYdy+yos= -github.com/filecoin-project/go-legs v0.3.7/go.mod h1:pgekGm8/gKY5zCtQ/qGAoSjGP92wTLFqpO3GPHeu8YU= +github.com/filecoin-project/go-legs v0.3.10 h1:B14z78do63gkxf5Br7rPnxZsZk/m9PR3Mx5aOf2WTIs= +github.com/filecoin-project/go-legs v0.3.10/go.mod h1:5psVRe2nRQDa3PDtcd+2Ud4CirxOr2DI5VsDVMq7sIk= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -450,11 +451,9 @@ github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= -github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= @@ -463,8 +462,8 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.5.0 h1:k2C1RFvOvxmA2i8bhmkb3b4qun7RDRDzzs/y25/TwQg= -github.com/filecoin-project/index-provider v0.5.0/go.mod h1:KHVrP2vU3YuScb+fawObwTFoR882up9U07kk0ZrfP0c= +github.com/filecoin-project/index-provider v0.6.1 h1:yVpmtm1ASl2JZMNDC6H2Fe0neYo5akYgaJJB2wlcsMU= +github.com/filecoin-project/index-provider v0.6.1/go.mod h1:iAbSQ6sUpKC4GqfUSheGnYwj9d9B+X8pPi4BV1PgwZA= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -485,10 +484,13 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1.0.20220118005651-2470cb39827e/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-actors/v7 v7.0.0 h1:FQN7tjt3o68hfb3qLFSJBoLMuOFY0REkFVLO/zXj8RU= github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220407202104-e375a8763a1c/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220422153930-0afe155bfffa h1:P9l2WQMvWUJ450esBttbAaqH8Lhe1hu1W2J6cQsiZcA= +github.com/filecoin-project/specs-actors/v8 v8.0.0-20220422153930-0afe155bfffa/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= github.com/filecoin-project/specs-storage v0.2.2 h1:6ugbtKQ6LTcTEnEIX9HkeCtTp1PCYO497P/bokF5tF4= github.com/filecoin-project/specs-storage v0.2.2/go.mod h1:6cc/lncmAxMUocPi0z1EPCX63beIX7F7UnlmUZ3hLQo= -github.com/filecoin-project/storetheindex v0.3.5 h1:KoS9TvjPm6zIZfUH8atAHJbVHOO7GTP1MdTG+v0eE+Q= -github.com/filecoin-project/storetheindex v0.3.5/go.mod h1:0r3d0kSpK63O6AvLr1CjAINLi+nWD49clzcnKV+GLpI= +github.com/filecoin-project/storetheindex v0.4.0 h1:MPIDJYBknPbwBcVf+2/WEIK6LKxhZmfQGCrqKmvhFyU= +github.com/filecoin-project/storetheindex v0.4.0/go.mod h1:LIwqpXoKeGxOGEjmxPfdYVPQYoZOSI3oXMUd9XTCpjc= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= @@ -779,6 +781,7 @@ github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -1154,7 +1157,7 @@ github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= -github.com/ipld/go-storethehash v0.0.1/go.mod h1:w8cQfWInks8lvvbQTiKbCPusU9v0sqiViBihTHbavpQ= +github.com/ipld/go-storethehash v0.0.2/go.mod h1:w8cQfWInks8lvvbQTiKbCPusU9v0sqiViBihTHbavpQ= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -1311,7 +1314,7 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= -github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= +github.com/libp2p/go-libp2p v0.18.0-rc5/go.mod h1:aZPS5l84bDvCvP4jkyEUT/J6YOpUq33Fgqrs3K59mpI= github.com/libp2p/go-libp2p v0.18.1 h1:IK9EOGNO2ZghU4F+dx9c4xfhMNZr45x06CijJaZE/ms= github.com/libp2p/go-libp2p v0.18.1/go.mod h1:ll44MqmrIFKpL3BwCexxzm+7RZ8exEtN96V1rRdMG7Y= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= @@ -1523,7 +1526,6 @@ github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkR github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= -github.com/libp2p/go-libp2p-swarm v0.10.1/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= github.com/libp2p/go-libp2p-swarm v0.10.2 h1:UaXf+CTq6Ns1N2V1EgqJ9Q3xaRsiN7ImVlDMpirMAWw= github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1579,6 +1581,7 @@ github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mW github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= +github.com/libp2p/go-libp2p-yamux v0.8.2/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE= github.com/libp2p/go-libp2p-yamux v0.9.0 h1:j+gnKykADCI/3cZlacOYBjQXDsncxgcwzJ1zw6Z6pts= github.com/libp2p/go-libp2p-yamux v0.9.0/go.mod h1:tpJKkRH9LlHj0VQh9Y9RP1pmF7yCS9ixxY/oSv+hhhQ= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= @@ -2276,7 +2279,6 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14 h1:vo2wkP2ceHyGyZwFFtAabpot03EeSxxwAe57pOI9E/4= github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= @@ -2320,7 +2322,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU= @@ -2523,9 +2525,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2595,9 +2596,9 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2737,11 +2738,11 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025112917-711f33c9992c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2847,8 +2848,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From ea4f599233779b26643728b52a26545deb716c36 Mon Sep 17 00:00:00 2001 From: Travis Person Date: Fri, 22 Apr 2022 21:01:23 +0000 Subject: [PATCH 090/228] Make MarketListDeals and DealsList return points for MarketDeal --- api/api_full.go | 2 +- api/api_storage.go | 4 ++-- api/mocks/mock_full.go | 4 ++-- api/proxy_gen.go | 30 +++++++++++++++--------------- api/v0api/full.go | 2 +- api/v0api/proxy_gen.go | 10 +++++----- api/v0api/v0mocks/mock_full.go | 4 ++-- node/impl/full/state.go | 6 +++--- node/impl/storminer.go | 8 ++++---- 9 files changed, 35 insertions(+), 35 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 6c49cd731..90fe0cc86 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -517,7 +517,7 @@ type FullNode interface { // StateMarketParticipants returns the Escrow and Locked balances of every participant in the Storage Market StateMarketParticipants(context.Context, types.TipSetKey) (map[string]MarketBalance, error) //perm:read // StateMarketDeals returns information about every deal in the Storage Market - StateMarketDeals(context.Context, types.TipSetKey) (map[string]MarketDeal, error) //perm:read + StateMarketDeals(context.Context, types.TipSetKey) (map[string]*MarketDeal, error) //perm:read // StateMarketStorageDeal returns information about the indicated deal StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*MarketDeal, error) //perm:read // StateLookupID retrieves the ID address of the given address diff --git a/api/api_storage.go b/api/api_storage.go index 1f26151e1..75f167e7a 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -162,7 +162,7 @@ type StorageMiner interface { StorageStat(ctx context.Context, id storiface.ID) (fsutil.FsStat, error) //perm:admin MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error //perm:write - MarketListDeals(ctx context.Context) ([]MarketDeal, error) //perm:read + MarketListDeals(ctx context.Context) ([]*MarketDeal, error) //perm:read MarketListRetrievalDeals(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) //perm:read MarketGetDealUpdates(ctx context.Context) (<-chan storagemarket.MinerDeal, error) //perm:read MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) //perm:read @@ -239,7 +239,7 @@ type StorageMiner interface { RuntimeSubsystems(ctx context.Context) (MinerSubsystems, error) //perm:read DealsImportData(ctx context.Context, dealPropCid cid.Cid, file string) error //perm:admin - DealsList(ctx context.Context) ([]MarketDeal, error) //perm:admin + DealsList(ctx context.Context) ([]*MarketDeal, error) //perm:admin DealsConsiderOnlineStorageDeals(context.Context) (bool, error) //perm:admin DealsSetConsiderOnlineStorageDeals(context.Context, bool) error //perm:admin DealsConsiderOnlineRetrievalDeals(context.Context) (bool, error) //perm:admin diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 45fcd6f53..a4667e0a3 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -2512,10 +2512,10 @@ func (mr *MockFullNodeMockRecorder) StateMarketBalance(arg0, arg1, arg2 interfac } // StateMarketDeals mocks base method. -func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 types.TipSetKey) (map[string]api.MarketDeal, error) { +func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 types.TipSetKey) (map[string]*api.MarketDeal, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketDeals", arg0, arg1) - ret0, _ := ret[0].(map[string]api.MarketDeal) + ret0, _ := ret[0].(map[string]*api.MarketDeal) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/api/proxy_gen.go b/api/proxy_gen.go index e0664bca9..5cac0be86 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -366,7 +366,7 @@ type FullNodeStruct struct { StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]MarketDeal, error) `perm:"read"` + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]*MarketDeal, error) `perm:"read"` StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]MarketBalance, error) `perm:"read"` @@ -671,7 +671,7 @@ type StorageMinerStruct struct { DealsImportData func(p0 context.Context, p1 cid.Cid, p2 string) error `perm:"admin"` - DealsList func(p0 context.Context) ([]MarketDeal, error) `perm:"admin"` + DealsList func(p0 context.Context) ([]*MarketDeal, error) `perm:"admin"` DealsPieceCidBlocklist func(p0 context.Context) ([]cid.Cid, error) `perm:"admin"` @@ -709,7 +709,7 @@ type StorageMinerStruct struct { MarketListDataTransfers func(p0 context.Context) ([]DataTransferChannel, error) `perm:"write"` - MarketListDeals func(p0 context.Context) ([]MarketDeal, error) `perm:"read"` + MarketListDeals func(p0 context.Context) ([]*MarketDeal, error) `perm:"read"` MarketListIncompleteDeals func(p0 context.Context) ([]storagemarket.MinerDeal, error) `perm:"read"` @@ -2539,15 +2539,15 @@ func (s *FullNodeStub) StateMarketBalance(p0 context.Context, p1 address.Address return *new(MarketBalance), ErrNotSupported } -func (s *FullNodeStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]MarketDeal, error) { +func (s *FullNodeStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]*MarketDeal, error) { if s.Internal.StateMarketDeals == nil { - return *new(map[string]MarketDeal), ErrNotSupported + return *new(map[string]*MarketDeal), ErrNotSupported } return s.Internal.StateMarketDeals(p0, p1) } -func (s *FullNodeStub) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]MarketDeal, error) { - return *new(map[string]MarketDeal), ErrNotSupported +func (s *FullNodeStub) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]*MarketDeal, error) { + return *new(map[string]*MarketDeal), ErrNotSupported } func (s *FullNodeStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]MarketBalance, error) { @@ -4024,15 +4024,15 @@ func (s *StorageMinerStub) DealsImportData(p0 context.Context, p1 cid.Cid, p2 st return ErrNotSupported } -func (s *StorageMinerStruct) DealsList(p0 context.Context) ([]MarketDeal, error) { +func (s *StorageMinerStruct) DealsList(p0 context.Context) ([]*MarketDeal, error) { if s.Internal.DealsList == nil { - return *new([]MarketDeal), ErrNotSupported + return *new([]*MarketDeal), ErrNotSupported } return s.Internal.DealsList(p0) } -func (s *StorageMinerStub) DealsList(p0 context.Context) ([]MarketDeal, error) { - return *new([]MarketDeal), ErrNotSupported +func (s *StorageMinerStub) DealsList(p0 context.Context) ([]*MarketDeal, error) { + return *new([]*MarketDeal), ErrNotSupported } func (s *StorageMinerStruct) DealsPieceCidBlocklist(p0 context.Context) ([]cid.Cid, error) { @@ -4233,15 +4233,15 @@ func (s *StorageMinerStub) MarketListDataTransfers(p0 context.Context) ([]DataTr return *new([]DataTransferChannel), ErrNotSupported } -func (s *StorageMinerStruct) MarketListDeals(p0 context.Context) ([]MarketDeal, error) { +func (s *StorageMinerStruct) MarketListDeals(p0 context.Context) ([]*MarketDeal, error) { if s.Internal.MarketListDeals == nil { - return *new([]MarketDeal), ErrNotSupported + return *new([]*MarketDeal), ErrNotSupported } return s.Internal.MarketListDeals(p0) } -func (s *StorageMinerStub) MarketListDeals(p0 context.Context) ([]MarketDeal, error) { - return *new([]MarketDeal), ErrNotSupported +func (s *StorageMinerStub) MarketListDeals(p0 context.Context) ([]*MarketDeal, error) { + return *new([]*MarketDeal), ErrNotSupported } func (s *StorageMinerStruct) MarketListIncompleteDeals(p0 context.Context) ([]storagemarket.MinerDeal, error) { diff --git a/api/v0api/full.go b/api/v0api/full.go index b37e89155..14f0c650b 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -521,7 +521,7 @@ type FullNode interface { // StateMarketParticipants returns the Escrow and Locked balances of every participant in the Storage Market StateMarketParticipants(context.Context, types.TipSetKey) (map[string]api.MarketBalance, error) //perm:read // StateMarketDeals returns information about every deal in the Storage Market - StateMarketDeals(context.Context, types.TipSetKey) (map[string]api.MarketDeal, error) //perm:read + StateMarketDeals(context.Context, types.TipSetKey) (map[string]*api.MarketDeal, error) //perm:read // StateMarketStorageDeal returns information about the indicated deal StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error) //perm:read // StateLookupID retrieves the ID address of the given address diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 49ebad428..faf88e120 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -283,7 +283,7 @@ type FullNodeStruct struct { StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketDeal, error) `perm:"read"` + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]*api.MarketDeal, error) `perm:"read"` StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketBalance, error) `perm:"read"` @@ -1834,15 +1834,15 @@ func (s *FullNodeStub) StateMarketBalance(p0 context.Context, p1 address.Address return *new(api.MarketBalance), ErrNotSupported } -func (s *FullNodeStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketDeal, error) { +func (s *FullNodeStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]*api.MarketDeal, error) { if s.Internal.StateMarketDeals == nil { - return *new(map[string]api.MarketDeal), ErrNotSupported + return *new(map[string]*api.MarketDeal), ErrNotSupported } return s.Internal.StateMarketDeals(p0, p1) } -func (s *FullNodeStub) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketDeal, error) { - return *new(map[string]api.MarketDeal), ErrNotSupported +func (s *FullNodeStub) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]*api.MarketDeal, error) { + return *new(map[string]*api.MarketDeal), ErrNotSupported } func (s *FullNodeStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketBalance, error) { diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 6cb80d894..5e3a5b376 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -2396,10 +2396,10 @@ func (mr *MockFullNodeMockRecorder) StateMarketBalance(arg0, arg1, arg2 interfac } // StateMarketDeals mocks base method. -func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 types.TipSetKey) (map[string]api.MarketDeal, error) { +func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 types.TipSetKey) (map[string]*api.MarketDeal, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMarketDeals", arg0, arg1) - ret0, _ := ret[0].(map[string]api.MarketDeal) + ret0, _ := ret[0].(map[string]*api.MarketDeal) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/node/impl/full/state.go b/node/impl/full/state.go index dfd1c69d9..873441d87 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -670,8 +670,8 @@ func (a *StateAPI) StateMarketParticipants(ctx context.Context, tsk types.TipSet return out, nil } -func (a *StateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]api.MarketDeal, error) { - out := map[string]api.MarketDeal{} +func (a *StateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]*api.MarketDeal, error) { + out := map[string]*api.MarketDeal{} ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { @@ -700,7 +700,7 @@ func (a *StateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (m } else if !found { s = market.EmptyDealState() } - out[strconv.FormatInt(int64(dealID), 10)] = api.MarketDeal{ + out[strconv.FormatInt(int64(dealID), 10)] = &api.MarketDeal{ Proposal: d, State: *s, } diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 86e0ba0fc..fe88f2874 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -454,7 +454,7 @@ func (sm *StorageMinerAPI) MarketImportDealData(ctx context.Context, propCid cid return sm.StorageProvider.ImportDataForDeal(ctx, propCid, fi) } -func (sm *StorageMinerAPI) listDeals(ctx context.Context) ([]api.MarketDeal, error) { +func (sm *StorageMinerAPI) listDeals(ctx context.Context) ([]*api.MarketDeal, error) { ts, err := sm.Full.ChainHead(ctx) if err != nil { return nil, err @@ -465,7 +465,7 @@ func (sm *StorageMinerAPI) listDeals(ctx context.Context) ([]api.MarketDeal, err return nil, err } - var out []api.MarketDeal + var out []*api.MarketDeal for _, deal := range allDeals { if deal.Proposal.Provider == sm.Miner.Address() { @@ -476,7 +476,7 @@ func (sm *StorageMinerAPI) listDeals(ctx context.Context) ([]api.MarketDeal, err return out, nil } -func (sm *StorageMinerAPI) MarketListDeals(ctx context.Context) ([]api.MarketDeal, error) { +func (sm *StorageMinerAPI) MarketListDeals(ctx context.Context) ([]*api.MarketDeal, error) { return sm.listDeals(ctx) } @@ -1072,7 +1072,7 @@ func (sm *StorageMinerAPI) DagstoreLookupPieces(ctx context.Context, cid cid.Cid return ret, nil } -func (sm *StorageMinerAPI) DealsList(ctx context.Context) ([]api.MarketDeal, error) { +func (sm *StorageMinerAPI) DealsList(ctx context.Context) ([]*api.MarketDeal, error) { return sm.listDeals(ctx) } From 30ed272aa9e31d10722c7a7708ce2554c9154c63 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 22 Apr 2022 11:34:18 +0300 Subject: [PATCH 091/228] fetch testing-fwp bundle use testing-fwp bundle when InsecurePostValidation is true testing-fwp is testing-fake-proofs --- build/builtin-actors/fetch-bundles.sh | 4 ++-- node/modules/builtin_actors.go | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/build/builtin-actors/fetch-bundles.sh b/build/builtin-actors/fetch-bundles.sh index 6345480a5..66c1c2d6b 100755 --- a/build/builtin-actors/fetch-bundles.sh +++ b/build/builtin-actors/fetch-bundles.sh @@ -25,7 +25,7 @@ fetch() { fi fi - for net in mainnet caterpillarnet butterflynet calibrationnet devnet testing; do + for net in mainnet caterpillarnet butterflynet calibrationnet devnet testing testing-fake-proofs; do fetch_bundle $ver $rel $net done @@ -67,7 +67,7 @@ touch_bundles() { mkdir $ver fi - for net in mainnet caterpillarnet butterflynet calibrationnet devnet testing; do + for net in mainnet caterpillarnet butterflynet calibrationnet devnet testing testing-fake-proofs; do touch $ver/builtin-actors-$net.car done } diff --git a/node/modules/builtin_actors.go b/node/modules/builtin_actors.go index c14b60ce8..b5d7b9ce9 100644 --- a/node/modules/builtin_actors.go +++ b/node/modules/builtin_actors.go @@ -53,8 +53,17 @@ func LoadBuiltinActorsTesting(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtype base = "." } + var template string + if build.InsecurePoStValidation { + template = "%s/build/builtin-actors/v%d/builtin-actors-testing-fake-proofs.car" + } else { + template = "%s/build/builtin-actors/v%d/builtin-actors-testing.car" + } + for _, ver := range []actors.Version{actors.Version8} { - path := fmt.Sprintf("%s/build/builtin-actors/v%d/builtin-actors-testing.car", base, ver) + path := fmt.Sprintf(template, base, ver) + + log.Infof("loading testing bundle: %s", path) file, err := os.Open(path) if err != nil { From 7c9ce4936204fb7f0e84a75c93ea32d269fa2e5d Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 22 Apr 2022 11:41:29 +0300 Subject: [PATCH 092/228] update bundles --- build/builtin-actors/bundles.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtin-actors/bundles.env b/build/builtin-actors/bundles.env index 808a758c7..3c7681d7a 100644 --- a/build/builtin-actors/bundles.env +++ b/build/builtin-actors/bundles.env @@ -1,2 +1,2 @@ actors7_release="" -actors8_release=5921189441f18b88 +actors8_release=940d99d34ffe413b From 31d193702b280913d200c890fe5207bc95e6a632 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 22 Apr 2022 17:53:49 +0300 Subject: [PATCH 093/228] don't parse error messages, just check exit codes --- itests/wdpost_dispute_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/itests/wdpost_dispute_test.go b/itests/wdpost_dispute_test.go index fe723a814..818cc1e9b 100644 --- a/itests/wdpost_dispute_test.go +++ b/itests/wdpost_dispute_test.go @@ -223,7 +223,7 @@ func TestWindowPostDispute(t *testing.T) { // Now try to be evil again err = submitBadProof(ctx, client, evilMiner.OwnerKey.Address, evilMinerAddr, di, evilSectorLoc.Deadline, evilSectorLoc.Partition) require.Error(t, err) - require.Contains(t, err.Error(), "message execution failed: exit 16, reason: window post failed: invalid PoSt") + require.Equal(t, 16, err) // It didn't work because we're recovering. } @@ -327,7 +327,7 @@ waitForProof: } _, err := client.MpoolPushMessage(ctx, msg, nil) require.Error(t, err) - require.Contains(t, err.Error(), "failed to dispute valid post (RetCode=16)") + require.Equal(t, err, 16) } } From 53ca3b64e183e5b8e42b12dbea842ae2c8bac5e0 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 22 Apr 2022 11:46:37 +0300 Subject: [PATCH 094/228] normalize itest PrecommitChallengeDelay to 10, matching the test bundles --- itests/deals_anycid_test.go | 2 +- itests/deals_concurrent_test.go | 6 +++--- itests/deals_padding_test.go | 2 +- itests/deals_partial_retrieval_dm-level_test.go | 2 +- itests/deals_partial_retrieval_test.go | 2 +- itests/deals_retry_deal_no_funds_test.go | 6 +++--- itests/deals_test.go | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/itests/deals_anycid_test.go b/itests/deals_anycid_test.go index 8e061af29..f504ead86 100644 --- a/itests/deals_anycid_test.go +++ b/itests/deals_anycid_test.go @@ -32,7 +32,7 @@ func TestDealRetrieveByAnyCid(t *testing.T) { ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() - policy.SetPreCommitChallengeDelay(5) + policy.SetPreCommitChallengeDelay(10) t.Cleanup(func() { policy.SetPreCommitChallengeDelay(oldDelay) }) diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index 015cf03a1..53aa0c782 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -40,7 +40,7 @@ func TestDealWithMarketAndMinerNode(t *testing.T) { kit.QuietMiningLogs() oldDelay := policy.GetPreCommitChallengeDelay() - policy.SetPreCommitChallengeDelay(5) + policy.SetPreCommitChallengeDelay(10) t.Cleanup(func() { policy.SetPreCommitChallengeDelay(oldDelay) }) @@ -92,7 +92,7 @@ func TestDealCyclesConcurrent(t *testing.T) { } oldDelay := policy.GetPreCommitChallengeDelay() - policy.SetPreCommitChallengeDelay(5) + policy.SetPreCommitChallengeDelay(10) t.Cleanup(func() { policy.SetPreCommitChallengeDelay(oldDelay) }) @@ -143,7 +143,7 @@ func TestSimultanenousTransferLimit(t *testing.T) { kit.QuietMiningLogs() oldDelay := policy.GetPreCommitChallengeDelay() - policy.SetPreCommitChallengeDelay(5) + policy.SetPreCommitChallengeDelay(10) t.Cleanup(func() { policy.SetPreCommitChallengeDelay(oldDelay) }) diff --git a/itests/deals_padding_test.go b/itests/deals_padding_test.go index c79b6a7db..9ac736f8c 100644 --- a/itests/deals_padding_test.go +++ b/itests/deals_padding_test.go @@ -26,7 +26,7 @@ func TestDealPadding(t *testing.T) { var blockTime = 250 * time.Millisecond startEpoch := abi.ChainEpoch(2 << 12) - policy.SetPreCommitChallengeDelay(2) + policy.SetPreCommitChallengeDelay(10) client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.WithAllSubsystems()) // no mock proofs. ens.InterconnectAll().BeginMining(blockTime) diff --git a/itests/deals_partial_retrieval_dm-level_test.go b/itests/deals_partial_retrieval_dm-level_test.go index 4b1a5b0e3..7cb1d9b77 100644 --- a/itests/deals_partial_retrieval_dm-level_test.go +++ b/itests/deals_partial_retrieval_dm-level_test.go @@ -46,7 +46,7 @@ func TestDMLevelPartialRetrieval(t *testing.T) { //stm: @CLIENT_RETRIEVAL_RETRIEVE_001, @CLIENT_RETRIEVAL_FIND_001 ctx := context.Background() - policy.SetPreCommitChallengeDelay(2) + policy.SetPreCommitChallengeDelay(10) kit.QuietMiningLogs() client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.MockProofs()) dh := kit.NewDealHarness(t, client, miner, miner) diff --git a/itests/deals_partial_retrieval_test.go b/itests/deals_partial_retrieval_test.go index abc5cf411..5e7f073f0 100644 --- a/itests/deals_partial_retrieval_test.go +++ b/itests/deals_partial_retrieval_test.go @@ -48,7 +48,7 @@ func TestPartialRetrieval(t *testing.T) { //stm: @CLIENT_RETRIEVAL_RETRIEVE_001 ctx := context.Background() - policy.SetPreCommitChallengeDelay(2) + policy.SetPreCommitChallengeDelay(10) kit.EnableLargeSectors(t) kit.QuietMiningLogs() client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.MockProofs(), kit.SectorSize(512<<20)) diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go index a14a0d085..cede2a8ab 100644 --- a/itests/deals_retry_deal_no_funds_test.go +++ b/itests/deals_retry_deal_no_funds_test.go @@ -36,7 +36,7 @@ func TestDealsRetryLackOfFunds(t *testing.T) { //stm: @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() - policy.SetPreCommitChallengeDelay(5) + policy.SetPreCommitChallengeDelay(10) t.Cleanup(func() { policy.SetPreCommitChallengeDelay(oldDelay) @@ -120,7 +120,7 @@ func TestDealsRetryLackOfFunds_blockInPublishDeal(t *testing.T) { //stm: @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() - policy.SetPreCommitChallengeDelay(5) + policy.SetPreCommitChallengeDelay(10) t.Cleanup(func() { policy.SetPreCommitChallengeDelay(oldDelay) @@ -201,7 +201,7 @@ func TestDealsRetryLackOfFunds_belowLimit(t *testing.T) { //stm: @CLIENT_STORAGE_DEALS_LIST_IMPORTS_001 ctx := context.Background() oldDelay := policy.GetPreCommitChallengeDelay() - policy.SetPreCommitChallengeDelay(5) + policy.SetPreCommitChallengeDelay(10) t.Cleanup(func() { policy.SetPreCommitChallengeDelay(oldDelay) diff --git a/itests/deals_test.go b/itests/deals_test.go index fb8e6e4f3..c7a2b2ad1 100644 --- a/itests/deals_test.go +++ b/itests/deals_test.go @@ -23,7 +23,7 @@ func TestDealsWithSealingAndRPC(t *testing.T) { kit.QuietMiningLogs() oldDelay := policy.GetPreCommitChallengeDelay() - policy.SetPreCommitChallengeDelay(5) + policy.SetPreCommitChallengeDelay(10) t.Cleanup(func() { policy.SetPreCommitChallengeDelay(oldDelay) }) From b29a182da78174da22332c6958efb9936f8dea87 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 26 Apr 2022 18:36:13 +0300 Subject: [PATCH 095/228] fix docgen --- api/docgen/docgen.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index a15d4623e..e590a8e7c 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -146,6 +146,10 @@ func init() { addExample(map[string]api.MarketDeal{ "t026363": ExampleValue("init", reflect.TypeOf(api.MarketDeal{}), nil).(api.MarketDeal), }) + addExample(map[string]*api.MarketDeal{ + "t026363": ExampleValue("init", reflect.TypeOf(&api.MarketDeal{}), nil).(*api.MarketDeal), + }) + addExample(map[string]api.MarketBalance{ "t026363": ExampleValue("init", reflect.TypeOf(api.MarketBalance{}), nil).(api.MarketBalance), }) From f80d10f3be09be9bbb59ba92f103c1f745c2c772 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 26 Apr 2022 18:36:22 +0300 Subject: [PATCH 096/228] make docsgen --- build/openrpc/full.json.gz | Bin 27009 -> 27009 bytes build/openrpc/miner.json.gz | Bin 13536 -> 13537 bytes documentation/en/api-v0-methods-miner.md | 12 ++++++------ documentation/en/api-v0-methods.md | 4 ++-- documentation/en/api-v1-unstable-methods.md | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 338ac68e84be897d512fd45d523861f31a4c9031..45c6ad7c496f13ccdf508df69a7b59d6ad20b609 100644 GIT binary patch delta 23327 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�|y+>)B9xa#AlC2_3LDLx9C!tFhEQPt?bzm;( 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index bb7489f00c4fd4623cc5e9da47c899e8e409b351..3add034d47d4b5f1237fdb228a756132a4d270f0 100644 GIT binary patch delta 10336 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 diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index af862c016..70f65470e 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -707,7 +707,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": {}, + "Label": "", "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -1300,7 +1300,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": {}, + "Label": "", "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -1335,7 +1335,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": {}, + "Label": "", "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -1456,7 +1456,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": {}, + "Label": "", "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -2711,7 +2711,7 @@ Inputs: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": {}, + "Label": "", "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -3079,7 +3079,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": {}, + "Label": "", "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 4f1687e5b..eedc6141d 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -5447,7 +5447,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": {}, + "Label": "", "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -5525,7 +5525,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": {}, + "Label": "", "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index b0e1a5724..31bbba541 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -5863,7 +5863,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": {}, + "Label": "", "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", @@ -5941,7 +5941,7 @@ Response: "VerifiedDeal": true, "Client": "f01234", "Provider": "f01234", - "Label": {}, + "Label": "", "StartEpoch": 10101, "EndEpoch": 10101, "StoragePricePerEpoch": "0", From f0673daaad637dcc0e50d234f0916e3b6fa4586e Mon Sep 17 00:00:00 2001 From: Travis Person Date: Fri, 29 Apr 2022 21:46:23 +0000 Subject: [PATCH 097/228] Reset interopnet --- build/bootstrap/interopnet.pi | 4 ++-- build/genesis/interopnet.car | Bin 1133932 -> 2200632 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/bootstrap/interopnet.pi b/build/bootstrap/interopnet.pi index 923653d94..7a0265d20 100644 --- a/build/bootstrap/interopnet.pi +++ b/build/bootstrap/interopnet.pi @@ -1,2 +1,2 @@ -/dns4/bootstrap-0.interop.fildev.network/tcp/1347/p2p/12D3KooWLGPq9JL1xwL6gHok7HSNxtK1Q5kyfg4Hk69ifRPghn4i -/dns4/bootstrap-1.interop.fildev.network/tcp/1347/p2p/12D3KooWFYS1f31zafv8mqqYu8U3hEqYvaZ6avWzYU3BmZdpyH3h +/dns4/bootstrap-0.interop.fildev.network/tcp/1347/p2p/12D3KooWKh4DZbYJA9brRKzrjixmjyr2T8Er8N9moLRFB6NcC3EC +/dns4/bootstrap-1.interop.fildev.network/tcp/1347/p2p/12D3KooWRE7NYtgfYP2cHD4zY31JQ9B1Y79oNgdgAuMs8t4RVBbL diff --git a/build/genesis/interopnet.car b/build/genesis/interopnet.car index 2c7c2a49873d670ebcfc5565b55eb0f2bc72433a..332f0fde756199086cde80a8db92984ef4dd33a3 100644 GIT binary patch literal 2200632 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 v$MlJn&Lf$@%@+<*f?2KjyiaB|>O^!^ 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

  • 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

    jBTNK28W)OEYGv^wYye?ka>|od}`gW0|P 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 z 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%0AIn@ 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%0Atmj?pv0&jI0Oa-L95Iw6cXpzv$dx2XIlc^$moE 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

    mLfl(!xaIzjMo+f#qzYBh~j(FtDt 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

    q?I~7%K)x5+R;0)L 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

    K^UZPTcqO^E9Wh-Ox$ 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 z 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

    wodjQyS;JieXZ%z_4({i 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 W-6}I#W1(f?<(yT@u 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