From b7010c9e60b4b562f1c866da82de9825ef0ad21d Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 6 Jun 2022 23:14:16 -0400 Subject: [PATCH] Implement function to migrate actors with only code changes --- .circleci/config.yml | 5 + api/api_full.go | 5 + api/api_gateway.go | 2 + api/docgen/docgen.go | 4 + api/mocks/mock_full.go | 15 ++ api/proxy_gen.go | 40 +++++ api/v0api/full.go | 4 + api/v0api/gateway.go | 2 + api/v0api/proxy_gen.go | 27 +++ api/v0api/v0mocks/mock_full.go | 15 ++ blockstore/api.go | 15 +- build/openrpc/full.json.gz | Bin 27616 -> 27675 bytes build/openrpc/gateway.json.gz | Bin 4824 -> 4898 bytes build/openrpc/miner.json.gz | Bin 13814 -> 13813 bytes build/openrpc/worker.json.gz | Bin 4772 -> 4770 bytes chain/actors/builtin/system/actor.go.template | 6 +- chain/actors/builtin/system/state.go.template | 14 +- chain/actors/builtin/system/system.go | 6 +- chain/actors/builtin/system/v0.go | 6 + chain/actors/builtin/system/v2.go | 6 + chain/actors/builtin/system/v3.go | 6 + chain/actors/builtin/system/v4.go | 6 + chain/actors/builtin/system/v5.go | 6 + chain/actors/builtin/system/v6.go | 6 + chain/actors/builtin/system/v7.go | 6 + chain/actors/builtin/system/v8.go | 12 +- chain/consensus/filcns/upgrades.go | 161 +++++++++++++++++- chain/events/state/mock/api.go | 6 + chain/gen/genesis/f00_system.go | 5 +- chain/stmgr/actors.go | 5 +- chain/stmgr/utils.go | 46 ++++- documentation/en/api-v0-methods.md | 16 ++ documentation/en/api-v1-unstable-methods.md | 16 ++ gateway/node.go | 6 + go.mod | 4 +- go.sum | 8 +- itests/lite_migration_test.go | 120 +++++++++++++ markets/storageadapter/api.go | 2 + node/impl/full/chain.go | 5 + storage/miner.go | 2 + 40 files changed, 586 insertions(+), 30 deletions(-) create mode 100644 itests/lite_migration_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index e99c88099..c2ce75f9c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -868,6 +868,11 @@ workflows: suite: itest-get_messages_in_ts target: "./itests/get_messages_in_ts_test.go" + - test: + name: test-itest-lite_migration + suite: itest-lite_migration + target: "./itests/lite_migration_test.go" + - test: name: test-itest-lookup_robust_address suite: itest-lookup_robust_address diff --git a/api/api_full.go b/api/api_full.go index 7abe419aa..8c3c64ce2 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -6,6 +6,7 @@ import ( "fmt" "time" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" @@ -38,6 +39,7 @@ import ( type ChainIO interface { ChainReadObj(context.Context, cid.Cid) ([]byte, error) ChainHasObj(context.Context, cid.Cid) (bool, error) + ChainPutObj(context.Context, blocks.Block) error } const LookbackNoLimit = abi.ChainEpoch(-1) @@ -123,6 +125,9 @@ type FullNode interface { // ChainHasObj checks if a given CID exists in the chain blockstore. ChainHasObj(context.Context, cid.Cid) (bool, error) //perm:read + // ChainPutObj puts a given object into the block store + ChainPutObj(context.Context, blocks.Block) error //perm:admin + // ChainStatObj returns statistics about the graph referenced by 'obj'. // If 'base' is also specified, then the returned stat will be a diff // between the two objects. diff --git a/api/api_gateway.go b/api/api_gateway.go index 6e92c6e0d..ab5f497fe 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -3,6 +3,7 @@ package api import ( "context" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/filecoin-project/go-address" @@ -30,6 +31,7 @@ import ( type Gateway interface { ChainHasObj(context.Context, cid.Cid) (bool, error) + ChainPutObj(context.Context, blocks.Block) error ChainHead(ctx context.Context) (*types.TipSet, error) ChainGetParentMessages(context.Context, cid.Cid) ([]Message, error) ChainGetParentReceipts(context.Context, cid.Cid) ([]*types.MessageReceipt, error) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index cebf15d66..d7840fd8a 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -28,6 +28,7 @@ import ( filestore "github.com/filecoin-project/go-fil-markets/filestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-jsonrpc/auth" + blocks "github.com/ipfs/go-block-format" textselector "github.com/ipld/go-ipld-selector-text-lite" "github.com/filecoin-project/go-state-types/abi" @@ -95,6 +96,9 @@ func init() { apiSelExample := api.Selector("Links/21/Hash/Links/42/Hash") clientEvent := retrievalmarket.ClientEventDealAccepted + block := blocks.Block(&blocks.BasicBlock{}) + ExampleValues[reflect.TypeOf(&block).Elem()] = block + addExample(bitfield.NewFromSet([]uint64{5})) addExample(abi.RegisteredSealProof_StackedDrg32GiBV1_1) addExample(abi.RegisteredPoStProof_StackedDrgWindow32GiBV1) diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 689a67834..9a2bda0b4 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -31,6 +31,7 @@ import ( imports "github.com/filecoin-project/lotus/node/repo/imports" gomock "github.com/golang/mock/gomock" uuid "github.com/google/uuid" + blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" metrics "github.com/libp2p/go-libp2p-core/metrics" network0 "github.com/libp2p/go-libp2p-core/network" @@ -374,6 +375,20 @@ func (mr *MockFullNodeMockRecorder) ChainNotify(arg0 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainNotify", reflect.TypeOf((*MockFullNode)(nil).ChainNotify), arg0) } +// ChainPutObj mocks base method. +func (m *MockFullNode) ChainPutObj(arg0 context.Context, arg1 blocks.Block) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainPutObj", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ChainPutObj indicates an expected call of ChainPutObj. +func (mr *MockFullNodeMockRecorder) ChainPutObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainPutObj", reflect.TypeOf((*MockFullNode)(nil).ChainPutObj), arg0, arg1) +} + // ChainReadObj mocks base method. func (m *MockFullNode) ChainReadObj(arg0 context.Context, arg1 cid.Cid) ([]byte, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 0cbb04751..0177ef277 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -34,6 +34,7 @@ import ( "github.com/filecoin-project/lotus/node/repo/imports" "github.com/filecoin-project/specs-storage/storage" "github.com/google/uuid" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" metrics "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/network" @@ -48,6 +49,8 @@ type ChainIOStruct struct { Internal struct { ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `` + ChainPutObj func(p0 context.Context, p1 blocks.Block) error `` + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `` } } @@ -141,6 +144,8 @@ type FullNodeStruct struct { ChainNotify func(p0 context.Context) (<-chan []*HeadChange, error) `perm:"read"` + ChainPutObj func(p0 context.Context, p1 blocks.Block) error `perm:"admin"` + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` @@ -511,6 +516,8 @@ type GatewayStruct struct { ChainNotify func(p0 context.Context) (<-chan []*HeadChange, error) `` + ChainPutObj func(p0 context.Context, p1 blocks.Block) error `` + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `` Discover func(p0 context.Context) (apitypes.OpenRPCDocument, error) `` @@ -981,6 +988,17 @@ func (s *ChainIOStub) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) return false, ErrNotSupported } +func (s *ChainIOStruct) ChainPutObj(p0 context.Context, p1 blocks.Block) error { + if s.Internal.ChainPutObj == nil { + return ErrNotSupported + } + return s.Internal.ChainPutObj(p0, p1) +} + +func (s *ChainIOStub) ChainPutObj(p0 context.Context, p1 blocks.Block) error { + return ErrNotSupported +} + func (s *ChainIOStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { if s.Internal.ChainReadObj == nil { return *new([]byte), ErrNotSupported @@ -1311,6 +1329,17 @@ func (s *FullNodeStub) ChainNotify(p0 context.Context) (<-chan []*HeadChange, er return nil, ErrNotSupported } +func (s *FullNodeStruct) ChainPutObj(p0 context.Context, p1 blocks.Block) error { + if s.Internal.ChainPutObj == nil { + return ErrNotSupported + } + return s.Internal.ChainPutObj(p0, p1) +} + +func (s *FullNodeStub) ChainPutObj(p0 context.Context, p1 blocks.Block) error { + return ErrNotSupported +} + func (s *FullNodeStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { if s.Internal.ChainReadObj == nil { return *new([]byte), ErrNotSupported @@ -3291,6 +3320,17 @@ func (s *GatewayStub) ChainNotify(p0 context.Context) (<-chan []*HeadChange, err return nil, ErrNotSupported } +func (s *GatewayStruct) ChainPutObj(p0 context.Context, p1 blocks.Block) error { + if s.Internal.ChainPutObj == nil { + return ErrNotSupported + } + return s.Internal.ChainPutObj(p0, p1) +} + +func (s *GatewayStub) ChainPutObj(p0 context.Context, p1 blocks.Block) error { + return ErrNotSupported +} + func (s *GatewayStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { if s.Internal.ChainReadObj == nil { return *new([]byte), ErrNotSupported diff --git a/api/v0api/full.go b/api/v0api/full.go index 30a0dfb8e..4721f4c63 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" textselector "github.com/ipld/go-ipld-selector-text-lite" "github.com/libp2p/go-libp2p-core/peer" @@ -110,6 +111,9 @@ type FullNode interface { // ChainDeleteObj deletes node referenced by the given CID ChainDeleteObj(context.Context, cid.Cid) error //perm:admin + // ChainPutObj puts and object into the blockstore + ChainPutObj(context.Context, blocks.Block) error + // ChainHasObj checks if a given CID exists in the chain blockstore. ChainHasObj(context.Context, cid.Cid) (bool, error) //perm:read diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index e13e92dd3..70994c740 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -3,6 +3,7 @@ package v0api import ( "context" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/filecoin-project/go-address" @@ -34,6 +35,7 @@ import ( type Gateway interface { ChainHasObj(context.Context, cid.Cid) (bool, error) + ChainPutObj(context.Context, blocks.Block) error ChainHead(ctx context.Context) (*types.TipSet, error) ChainGetBlockMessages(context.Context, cid.Cid) (*api.BlockMessages, error) ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.Message, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index bae8ba782..a2a69f163 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -23,6 +23,7 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" "golang.org/x/xerrors" @@ -74,6 +75,8 @@ type FullNodeStruct struct { ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) `perm:"read"` + ChainPutObj func(p0 context.Context, p1 blocks.Block) error `` + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` @@ -420,6 +423,8 @@ type GatewayStruct struct { ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) `` + ChainPutObj func(p0 context.Context, p1 blocks.Block) error `` + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `` GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` @@ -682,6 +687,17 @@ func (s *FullNodeStub) ChainNotify(p0 context.Context) (<-chan []*api.HeadChange return nil, ErrNotSupported } +func (s *FullNodeStruct) ChainPutObj(p0 context.Context, p1 blocks.Block) error { + if s.Internal.ChainPutObj == nil { + return ErrNotSupported + } + return s.Internal.ChainPutObj(p0, p1) +} + +func (s *FullNodeStub) ChainPutObj(p0 context.Context, p1 blocks.Block) error { + return ErrNotSupported +} + func (s *FullNodeStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { if s.Internal.ChainReadObj == nil { return *new([]byte), ErrNotSupported @@ -2530,6 +2546,17 @@ func (s *GatewayStub) ChainNotify(p0 context.Context) (<-chan []*api.HeadChange, return nil, ErrNotSupported } +func (s *GatewayStruct) ChainPutObj(p0 context.Context, p1 blocks.Block) error { + if s.Internal.ChainPutObj == nil { + return ErrNotSupported + } + return s.Internal.ChainPutObj(p0, p1) +} + +func (s *GatewayStub) ChainPutObj(p0 context.Context, p1 blocks.Block) error { + return ErrNotSupported +} + func (s *GatewayStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { if s.Internal.ChainReadObj == nil { return *new([]byte), ErrNotSupported diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index e807862e6..ef194e9d3 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -33,6 +33,7 @@ import ( imports "github.com/filecoin-project/lotus/node/repo/imports" gomock "github.com/golang/mock/gomock" uuid "github.com/google/uuid" + blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" metrics "github.com/libp2p/go-libp2p-core/metrics" network0 "github.com/libp2p/go-libp2p-core/network" @@ -377,6 +378,20 @@ func (mr *MockFullNodeMockRecorder) ChainNotify(arg0 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainNotify", reflect.TypeOf((*MockFullNode)(nil).ChainNotify), arg0) } +// ChainPutObj mocks base method. +func (m *MockFullNode) ChainPutObj(arg0 context.Context, arg1 blocks.Block) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainPutObj", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ChainPutObj indicates an expected call of ChainPutObj. +func (mr *MockFullNodeMockRecorder) ChainPutObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainPutObj", reflect.TypeOf((*MockFullNode)(nil).ChainPutObj), arg0, arg1) +} + // ChainReadObj mocks base method. func (m *MockFullNode) ChainReadObj(arg0 context.Context, arg1 cid.Cid) ([]byte, error) { m.ctrl.T.Helper() diff --git a/blockstore/api.go b/blockstore/api.go index dc4c03452..090f53e5a 100644 --- a/blockstore/api.go +++ b/blockstore/api.go @@ -11,6 +11,7 @@ import ( type ChainIO interface { ChainReadObj(context.Context, cid.Cid) ([]byte, error) ChainHasObj(context.Context, cid.Cid) (bool, error) + ChainPutObj(context.Context, blocks.Block) error } type apiBlockstore struct { @@ -49,12 +50,18 @@ func (a *apiBlockstore) GetSize(ctx context.Context, c cid.Cid) (int, error) { return len(bb), nil } -func (a *apiBlockstore) Put(context.Context, blocks.Block) error { - return xerrors.New("not supported") +func (a *apiBlockstore) Put(ctx context.Context, block blocks.Block) error { + return a.api.ChainPutObj(ctx, block) } -func (a *apiBlockstore) PutMany(context.Context, []blocks.Block) error { - return xerrors.New("not supported") +func (a *apiBlockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { + for _, block := range blocks { + err := a.api.ChainPutObj(ctx, block) + if err != nil { + return err + } + } + return nil } func (a *apiBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 01c02e14fb4a33f21b14da5191bb66a1debc1d12..5f73b3a45e8c6879fb04e599fa3f0720ce9c600d 100644 GIT binary patch delta 26919 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

3QVK_F#M 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 PzP>KaDD&mbeuDfjEVW&x diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 12a5ebaca11fa549b9821a0e39a0d766a7c26961..5a9eb751152f1a37421f6dcf3999c68c8e91ecaa 100644 GIT binary patch literal 4898 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index b10e9b7613654b74b768b0503da016a13edd93e4..93112005667bafd078fe5eea04de25b4d31c55fe 100644 GIT binary patch delta 10627 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 delta 10628 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 155ac591e43e75dc07d82e194ebadf08a235e5dc..4e7e7b530e64414a44314378796b5567982d4fa6 100644 GIT binary patch delta 3619 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 delta 3622 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 sfIb2wT&JVJUl0 100 + }) + + bs := blockstore.NewAPIBlockstore(client16) + ctxStore := gstStore.WrapBlockStore(ctx, bs) + + ts, err := client16.ChainHead(ctx) + require.NoError(t, err) + + stateRoot := ts.ParentState() + oldStateTree, err := state.LoadStateTree(ctxStore, stateRoot) + require.NoError(t, err) + + oldManifest, err := stmgr.GetManifest(ctx, oldStateTree) + require.NoError(t, err) + newManifestCid := makeTestManifest(t, ctxStore) + // Use the Cid we generated to get the new manifest instead of loading it from the state tree, because that would not test that we have the correct manifest in the state + var newManifest manifest.Manifest + err = ctxStore.Get(ctx, newManifestCid, &newManifest) + require.NoError(t, err) + err = newManifest.Load(ctx, ctxStore) + require.NoError(t, err) + newManifestData := manifest.ManifestData{} + err = ctxStore.Get(ctx, newManifest.Data, &newManifestData) + require.NoError(t, err) + + newStateRoot, err := filcns.LiteMigration(ctx, bs, newManifestCid, stateRoot, actors.Version8, types.StateTreeVersion4, types.StateTreeVersion4) + require.NoError(t, err) + + newStateTree, err := state.LoadStateTree(ctxStore, newStateRoot) + require.NoError(t, err) + + migrations := make(map[cid.Cid]cid.Cid) + for _, entry := range newManifestData.Entries { + oldCodeCid, ok := oldManifest.Get(entry.Name) + require.True(t, ok) + migrations[oldCodeCid] = entry.Code + } + + err = newStateTree.ForEach(func(addr address.Address, newActorState *types.Actor) error { + oldActor, err := oldStateTree.GetActor(addr) + require.NoError(t, err) + newCodeCid, ok := migrations[oldActor.Code] + require.True(t, ok) + require.Equal(t, newCodeCid, newActorState.Code) + return nil + }) + require.NoError(t, err) +} + +func makeTestManifest(t *testing.T, ctxStore adt.Store) cid.Cid { + builder := cid.V1Builder{Codec: cid.Raw, MhType: mh.IDENTITY} + + manifestData := manifest.ManifestData{} + for _, name := range []string{"system", "init", "cron", "account", "storagepower", "storageminer", "storagemarket", "paymentchannel", "multisig", "reward", "verifiedregistry"} { + codeCid, err := builder.Sum([]byte(fmt.Sprintf("fil/8/%s", name))) + if err != nil { + t.Fatal(err) + } + + manifestData.Entries = append(manifestData.Entries, + manifest.ManifestEntry{ + Name: name, + Code: codeCid, + }) + } + + manifestDataCid, err := ctxStore.Put(ctxStore.Context(), &manifestData) + if err != nil { + t.Fatal(err) + } + + mf := manifest.Manifest{ + Version: 1, + Data: manifestDataCid, + } + + manifestCid, err := ctxStore.Put(ctxStore.Context(), &mf) + if err != nil { + t.Fatal(err) + } + + return manifestCid +} diff --git a/markets/storageadapter/api.go b/markets/storageadapter/api.go index c49a96f88..4316174bc 100644 --- a/markets/storageadapter/api.go +++ b/markets/storageadapter/api.go @@ -3,6 +3,7 @@ package storageadapter import ( "context" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" "golang.org/x/xerrors" @@ -20,6 +21,7 @@ type apiWrapper struct { StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error) ChainHasObj(context.Context, cid.Cid) (bool, error) + ChainPutObj(context.Context, blocks.Block) error } } diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index 61be82bc9..97bf260a4 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -15,6 +15,7 @@ import ( "go.uber.org/fx" "golang.org/x/xerrors" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" offline "github.com/ipfs/go-ipfs-exchange-offline" @@ -261,6 +262,10 @@ func (m *ChainModule) ChainReadObj(ctx context.Context, obj cid.Cid) ([]byte, er return blk.RawData(), nil } +func (a *ChainAPI) ChainPutObj(ctx context.Context, obj blocks.Block) error { + return a.ExposedBlockstore.Put(ctx, obj) +} + func (a *ChainAPI) ChainDeleteObj(ctx context.Context, obj cid.Cid) error { return a.ExposedBlockstore.DeleteBlock(ctx, obj) } diff --git a/storage/miner.go b/storage/miner.go index 5a97c5f6a..80f06581f 100644 --- a/storage/miner.go +++ b/storage/miner.go @@ -6,6 +6,7 @@ import ( "time" "github.com/filecoin-project/go-bitfield" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" logging "github.com/ipfs/go-log/v2" @@ -122,6 +123,7 @@ type fullNodeFilteredAPI interface { ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*api.HeadChange, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error) ChainHasObj(context.Context, cid.Cid) (bool, error) + ChainPutObj(context.Context, blocks.Block) error ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) WalletSign(context.Context, address.Address, []byte) (*crypto.Signature, error)