From f5100a2a1df1ffe451dc33c1f86234d32cb3c16d Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Fri, 5 Apr 2024 12:58:29 +1100 Subject: [PATCH 01/12] fix(events): order entries by insertion order when selecting Fixes: https://github.com/filecoin-project/lotus/issues/11823 --- chain/events/filter/index.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/events/filter/index.go b/chain/events/filter/index.go index d3dd1a085..e04a403bc 100644 --- a/chain/events/filter/index.go +++ b/chain/events/filter/index.go @@ -557,7 +557,7 @@ func (ei *EventIndex) prefillFilter(ctx context.Context, f *eventFilter, exclude s = s + " WHERE " + strings.Join(clauses, " AND ") } - s += " ORDER BY event.height DESC" + s += " ORDER BY event.height DESC, event_entry._rowid_ ASC" stmt, err := ei.db.Prepare(s) if err != nil { From 5d620a72f74c1423b70f61b23d44d928e1306eac Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Fri, 5 Apr 2024 13:47:11 +1100 Subject: [PATCH 02/12] fix(events): harden tests to assert strict event entry order --- chain/events/filter/index.go | 1 + itests/direct_data_onboard_test.go | 86 +++++++++++++-------- itests/direct_data_onboard_verified_test.go | 22 +++--- itests/sector_terminate_test.go | 2 +- 4 files changed, 65 insertions(+), 46 deletions(-) diff --git a/chain/events/filter/index.go b/chain/events/filter/index.go index e04a403bc..1ff8bb2c2 100644 --- a/chain/events/filter/index.go +++ b/chain/events/filter/index.go @@ -557,6 +557,7 @@ func (ei *EventIndex) prefillFilter(ctx context.Context, f *eventFilter, exclude s = s + " WHERE " + strings.Join(clauses, " AND ") } + // retain insertion order of event_entry rows with the implicit _rowid_ column s += " ORDER BY event.height DESC, event_entry._rowid_ ASC" stmt, err := ei.db.Prepare(s) diff --git a/itests/direct_data_onboard_test.go b/itests/direct_data_onboard_test.go index 037fa1dbb..3d414ba1c 100644 --- a/itests/direct_data_onboard_test.go +++ b/itests/direct_data_onboard_test.go @@ -11,6 +11,7 @@ import ( "github.com/ipfs/go-cid" "github.com/ipld/go-ipld-prime" "github.com/ipld/go-ipld-prime/codec/dagcbor" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" "github.com/ipld/go-ipld-prime/node/basicnode" "github.com/multiformats/go-multicodec" "github.com/stretchr/testify/require" @@ -24,6 +25,7 @@ import ( "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/market" minertypes "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/consensus/filcns" @@ -131,15 +133,17 @@ func TestOnboardMixedMarketDDO(t *testing.T) { var pieces []abi.PieceInfo var dealID abi.DealID + // market ddo piece + var marketSector api.SectorOffset + var marketPiece abi.PieceInfo + marketPieceSize := abi.PaddedPieceSize(2048 / 2).Unpadded() { - // market piece - pieceSize := abi.PaddedPieceSize(2048 / 2).Unpadded() - pieceData := make([]byte, pieceSize) + pieceData := make([]byte, marketPieceSize) _, _ = rand.Read(pieceData) - dc, err := miner.ComputeDataCid(ctx, pieceSize, bytes.NewReader(pieceData)) + marketPiece, err = miner.ComputeDataCid(ctx, marketPieceSize, bytes.NewReader(pieceData)) require.NoError(t, err) - pieces = append(pieces, dc) + pieces = append(pieces, marketPiece) head, err := client.ChainHead(ctx) require.NoError(t, err) @@ -148,7 +152,7 @@ func TestOnboardMixedMarketDDO(t *testing.T) { psdParams := market2.PublishStorageDealsParams{ Deals: []market2.ClientDealProposal{ - makeMarketDealProposal(t, client, miner, dc.PieceCID, pieceSize.Padded(), head.Height()+2880*2, head.Height()+2880*400), + makeMarketDealProposal(t, client, miner, marketPiece.PieceCID, marketPieceSize.Padded(), head.Height()+2880*2, head.Height()+2880*400), }, } @@ -177,7 +181,7 @@ func TestOnboardMixedMarketDDO(t *testing.T) { mcid := smsg.Cid() - so, err := miner.SectorAddPieceToAny(ctx, pieceSize, bytes.NewReader(pieceData), piece.PieceDealInfo{ + marketSector, err = miner.SectorAddPieceToAny(ctx, marketPieceSize, bytes.NewReader(pieceData), piece.PieceDealInfo{ PublishCid: &mcid, DealID: dealID, DealProposal: &psdParams.Deals[0].Proposal, @@ -190,25 +194,26 @@ func TestOnboardMixedMarketDDO(t *testing.T) { }) require.NoError(t, err) - require.Equal(t, abi.PaddedPieceSize(0), so.Offset) - require.Equal(t, abi.SectorNumber(2), so.Sector) + require.Equal(t, abi.PaddedPieceSize(0), marketSector.Offset) + require.Equal(t, abi.SectorNumber(2), marketSector.Sector) } + // raw ddo piece + var rawSector api.SectorOffset + var rawPiece abi.PieceInfo + rawPieceSize := abi.PaddedPieceSize(2048 / 2).Unpadded() { - // raw ddo piece - - pieceSize := abi.PaddedPieceSize(2048 / 2).Unpadded() - pieceData := make([]byte, pieceSize) + pieceData := make([]byte, rawPieceSize) _, _ = rand.Read(pieceData) - dc, err := miner.ComputeDataCid(ctx, pieceSize, bytes.NewReader(pieceData)) + rawPiece, err = miner.ComputeDataCid(ctx, rawPieceSize, bytes.NewReader(pieceData)) require.NoError(t, err) - pieces = append(pieces, dc) + pieces = append(pieces, rawPiece) head, err := client.ChainHead(ctx) require.NoError(t, err) - so, err := miner.SectorAddPieceToAny(ctx, pieceSize, bytes.NewReader(pieceData), piece.PieceDealInfo{ + rawSector, err = miner.SectorAddPieceToAny(ctx, rawPieceSize, bytes.NewReader(pieceData), piece.PieceDealInfo{ PublishCid: nil, DealID: 0, DealProposal: nil, @@ -218,18 +223,20 @@ func TestOnboardMixedMarketDDO(t *testing.T) { }, KeepUnsealed: false, PieceActivationManifest: &minertypes.PieceActivationManifest{ - CID: dc.PieceCID, - Size: dc.Size, + CID: rawPiece.PieceCID, + Size: rawPiece.Size, VerifiedAllocationKey: nil, Notify: nil, }, }) require.NoError(t, err) - require.Equal(t, abi.PaddedPieceSize(1024), so.Offset) - require.Equal(t, abi.SectorNumber(2), so.Sector) + require.Equal(t, abi.PaddedPieceSize(1024), rawSector.Offset) + require.Equal(t, abi.SectorNumber(2), rawSector.Sector) } + require.Equal(t, marketSector.Sector, rawSector.Sector) // sanity check same sector + toCheck := map[abi.SectorNumber]struct{}{ 2: {}, } @@ -272,7 +279,7 @@ func TestOnboardMixedMarketDDO(t *testing.T) { fmt.Println("piece", piece.PieceCID, piece.Size) } - // check "deal-published" actor event + // check some actor events var epochZero abi.ChainEpoch allEvents, err := miner.FullNode.GetActorEventsRaw(ctx, &types.ActorEventFilter{ FromHeight: &epochZero, @@ -282,21 +289,32 @@ func TestOnboardMixedMarketDDO(t *testing.T) { var found bool keyBytes := must.One(ipld.Encode(basicnode.NewString(key), dagcbor.Encode)) for _, event := range allEvents { - for _, e := range event.Entries { - if e.Key == "$type" && bytes.Equal(e.Value, keyBytes) { - found = true - switch key { - case "deal-published", "deal-activated": - expectedEntries := []types.EventEntry{ - {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "$type", Value: keyBytes}, - {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "id", Value: must.One(ipld.Encode(basicnode.NewInt(2), dagcbor.Encode))}, - {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "client", Value: must.One(ipld.Encode(basicnode.NewInt(int64(clientId)), dagcbor.Encode))}, - {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "provider", Value: must.One(ipld.Encode(basicnode.NewInt(int64(minerId)), dagcbor.Encode))}, - } - require.ElementsMatch(t, expectedEntries, event.Entries) + require.True(t, len(event.Entries) > 0) + if event.Entries[0].Key == "$type" && bytes.Equal(event.Entries[0].Value, keyBytes) { + found = true + switch key { + case "deal-published", "deal-activated": + expectedEntries := []types.EventEntry{ + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "$type", Value: keyBytes}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "id", Value: must.One(ipld.Encode(basicnode.NewInt(2), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "client", Value: must.One(ipld.Encode(basicnode.NewInt(int64(clientId)), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "provider", Value: must.One(ipld.Encode(basicnode.NewInt(int64(minerId)), dagcbor.Encode))}, } - break + require.Equal(t, expectedEntries, event.Entries) + case "sector-activated": + // only one sector, that has both our pieces in it + expectedEntries := []types.EventEntry{ + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "$type", Value: must.One(ipld.Encode(basicnode.NewString("sector-activated"), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "sector", Value: must.One(ipld.Encode(basicnode.NewInt(int64(rawSector.Sector)), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "unsealed-cid", Value: must.One(ipld.Encode(basicnode.NewLink(cidlink.Link{Cid: expectCommD}), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "piece-cid", Value: must.One(ipld.Encode(basicnode.NewLink(cidlink.Link{Cid: marketPiece.PieceCID}), dagcbor.Encode))}, + {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "piece-size", Value: must.One(ipld.Encode(basicnode.NewInt(int64(marketPieceSize.Padded())), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "piece-cid", Value: must.One(ipld.Encode(basicnode.NewLink(cidlink.Link{Cid: rawPiece.PieceCID}), dagcbor.Encode))}, + {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "piece-size", Value: must.One(ipld.Encode(basicnode.NewInt(int64(rawPieceSize.Padded())), dagcbor.Encode))}, + } + require.Equal(t, expectedEntries, event.Entries) } + break } } require.True(t, found, "expected to find event %s", key) diff --git a/itests/direct_data_onboard_verified_test.go b/itests/direct_data_onboard_verified_test.go index dd42a1881..df87a48a9 100644 --- a/itests/direct_data_onboard_verified_test.go +++ b/itests/direct_data_onboard_verified_test.go @@ -175,11 +175,11 @@ func TestOnboardRawPieceVerified_WithActorEvents(t *testing.T) { // first sector to start mining is CC {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "sector", Value: must.One(ipld.Encode(basicnode.NewInt(int64(so.Sector)-1), dagcbor.Encode))}, } - require.ElementsMatch(t, expectedEntries, precommitedEvents[0].Entries) + require.Equal(t, expectedEntries, precommitedEvents[0].Entries) // second sector has our piece expectedEntries[1].Value = must.One(ipld.Encode(basicnode.NewInt(int64(so.Sector)), dagcbor.Encode)) - require.ElementsMatch(t, expectedEntries, precommitedEvents[1].Entries) + require.Equal(t, expectedEntries, precommitedEvents[1].Entries) } { @@ -192,7 +192,7 @@ func TestOnboardRawPieceVerified_WithActorEvents(t *testing.T) { {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "sector", Value: must.One(ipld.Encode(basicnode.NewInt(int64(so.Sector)-1), dagcbor.Encode))}, {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "unsealed-cid", Value: must.One(ipld.Encode(datamodel.Null, dagcbor.Encode))}, } - require.ElementsMatch(t, expectedEntries, activatedEvents[0].Entries) + require.Equal(t, expectedEntries, activatedEvents[0].Entries) // second sector has our piece, and only our piece, so usealed-cid matches piece-cid, // unfortunately we don't have a case with multiple pieces @@ -202,7 +202,7 @@ func TestOnboardRawPieceVerified_WithActorEvents(t *testing.T) { types.EventEntry{Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "piece-cid", Value: must.One(ipld.Encode(basicnode.NewLink(cidlink.Link{Cid: dc.PieceCID}), dagcbor.Encode))}, types.EventEntry{Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "piece-size", Value: must.One(ipld.Encode(basicnode.NewInt(int64(pieceSize.Padded())), dagcbor.Encode))}, ) - require.ElementsMatch(t, expectedEntries, activatedEvents[1].Entries) + require.Equal(t, expectedEntries, activatedEvents[1].Entries) } { @@ -232,21 +232,21 @@ func TestOnboardRawPieceVerified_WithActorEvents(t *testing.T) { {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "$type", Value: must.One(ipld.Encode(basicnode.NewString("allocation"), dagcbor.Encode))}, // first, bogus, allocation {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "id", Value: must.One(ipld.Encode(basicnode.NewInt(int64(allocationId)-1), dagcbor.Encode))}, - {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "provider", Value: must.One(ipld.Encode(basicnode.NewInt(int64(minerId)), dagcbor.Encode))}, {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "client", Value: must.One(ipld.Encode(basicnode.NewInt(int64(clientId)), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "provider", Value: must.One(ipld.Encode(basicnode.NewInt(int64(minerId)), dagcbor.Encode))}, {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "piece-cid", Value: must.One(ipld.Encode(basicnode.NewLink(cidlink.Link{Cid: bogusPieceCid}), dagcbor.Encode))}, {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "piece-size", Value: must.One(ipld.Encode(basicnode.NewInt(int64(pieceSize.Padded())), dagcbor.Encode))}, {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "term-min", Value: must.One(ipld.Encode(basicnode.NewInt(verifregtypes13.MinimumVerifiedAllocationTerm), dagcbor.Encode))}, {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "term-max", Value: must.One(ipld.Encode(basicnode.NewInt(verifregtypes13.MaximumVerifiedAllocationTerm), dagcbor.Encode))}, {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "expiration", Value: must.One(ipld.Encode(basicnode.NewInt(int64(bogusAllocationExpiry)), dagcbor.Encode))}, } - require.ElementsMatch(t, expectedEntries, allocationEvents[0].Entries) + require.Equal(t, expectedEntries, allocationEvents[0].Entries) // the second, real allocation expectedEntries[1].Value = must.One(ipld.Encode(basicnode.NewInt(int64(allocationId)), dagcbor.Encode)) // "id" expectedEntries[4].Value = must.One(ipld.Encode(basicnode.NewLink(cidlink.Link{Cid: dc.PieceCID}), dagcbor.Encode)) // "piece-cid" expectedEntries[8].Value = must.One(ipld.Encode(basicnode.NewInt(verifregtypes13.MaximumVerifiedAllocationExpiration), dagcbor.Encode)) // "expiration" - require.ElementsMatch(t, expectedEntries, allocationEvents[1].Entries) + require.Equal(t, expectedEntries, allocationEvents[1].Entries) } { @@ -257,15 +257,15 @@ func TestOnboardRawPieceVerified_WithActorEvents(t *testing.T) { expectedEntries := []types.EventEntry{ {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "$type", Value: must.One(ipld.Encode(basicnode.NewString("allocation-removed"), dagcbor.Encode))}, {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "id", Value: must.One(ipld.Encode(basicnode.NewInt(int64(allocationId)-1), dagcbor.Encode))}, - {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "provider", Value: must.One(ipld.Encode(basicnode.NewInt(int64(minerId)), dagcbor.Encode))}, {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "client", Value: must.One(ipld.Encode(basicnode.NewInt(int64(clientId)), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "provider", Value: must.One(ipld.Encode(basicnode.NewInt(int64(minerId)), dagcbor.Encode))}, {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "piece-cid", Value: must.One(ipld.Encode(basicnode.NewLink(cidlink.Link{Cid: bogusPieceCid}), dagcbor.Encode))}, {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "piece-size", Value: must.One(ipld.Encode(basicnode.NewInt(int64(pieceSize.Padded())), dagcbor.Encode))}, {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "term-min", Value: must.One(ipld.Encode(basicnode.NewInt(verifregtypes13.MinimumVerifiedAllocationTerm), dagcbor.Encode))}, {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "term-max", Value: must.One(ipld.Encode(basicnode.NewInt(verifregtypes13.MaximumVerifiedAllocationTerm), dagcbor.Encode))}, {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "expiration", Value: must.One(ipld.Encode(basicnode.NewInt(int64(bogusAllocationExpiry)), dagcbor.Encode))}, } - require.ElementsMatch(t, expectedEntries, allocationEvents[0].Entries) + require.Equal(t, expectedEntries, allocationEvents[0].Entries) } { @@ -276,8 +276,8 @@ func TestOnboardRawPieceVerified_WithActorEvents(t *testing.T) { {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "$type", Value: must.One(ipld.Encode(basicnode.NewString("claim"), dagcbor.Encode))}, // claimId inherits from its original allocationId {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "id", Value: must.One(ipld.Encode(basicnode.NewInt(int64(allocationId)), dagcbor.Encode))}, - {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "provider", Value: must.One(ipld.Encode(basicnode.NewInt(int64(minerId)), dagcbor.Encode))}, {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "client", Value: must.One(ipld.Encode(basicnode.NewInt(int64(clientId)), dagcbor.Encode))}, + {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "provider", Value: must.One(ipld.Encode(basicnode.NewInt(int64(minerId)), dagcbor.Encode))}, {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "piece-cid", Value: must.One(ipld.Encode(basicnode.NewLink(cidlink.Link{Cid: dc.PieceCID}), dagcbor.Encode))}, {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "piece-size", Value: must.One(ipld.Encode(basicnode.NewInt(int64(pieceSize.Padded())), dagcbor.Encode))}, {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "term-min", Value: must.One(ipld.Encode(basicnode.NewInt(verifregtypes13.MinimumVerifiedAllocationTerm), dagcbor.Encode))}, @@ -285,7 +285,7 @@ func TestOnboardRawPieceVerified_WithActorEvents(t *testing.T) { {Flags: 0x01, Codec: uint64(multicodec.Cbor), Key: "term-start", Value: must.One(ipld.Encode(basicnode.NewInt(int64(claimEvents[0].Height)), dagcbor.Encode))}, {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "sector", Value: must.One(ipld.Encode(basicnode.NewInt(int64(si.SectorID)), dagcbor.Encode))}, } - require.ElementsMatch(t, expectedEntries, claimEvents[0].Entries) + require.Equal(t, expectedEntries, claimEvents[0].Entries) } // verify that we can trace a datacap allocation through to a claim with the events, since this diff --git a/itests/sector_terminate_test.go b/itests/sector_terminate_test.go index ac586ff8f..f3524c198 100644 --- a/itests/sector_terminate_test.go +++ b/itests/sector_terminate_test.go @@ -189,7 +189,7 @@ loop: {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "$type", Value: keyBytes}, {Flags: 0x03, Codec: uint64(multicodec.Cbor), Key: "sector", Value: must.One(ipld.Encode(basicnode.NewInt(int64(toTerminate)), dagcbor.Encode))}, } - require.ElementsMatch(t, expectedEntries, event.Entries) + require.Equal(t, expectedEntries, event.Entries) } break } From cf7ef3823f95cb936ad3e4ba5d1c9857330e7ed3 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Wed, 3 Apr 2024 22:42:24 -0400 Subject: [PATCH 03/12] update deps (#11819) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 730cf5ede..4623f942b 100644 --- a/go.mod +++ b/go.mod @@ -111,7 +111,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.33.1 + github.com/libp2p/go-libp2p v0.33.2 github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-gorpc v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.25.2 @@ -126,7 +126,7 @@ require ( github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.1.0 - github.com/multiformats/go-multiaddr v0.12.2 + github.com/multiformats/go-multiaddr v0.12.3 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.2.0 github.com/multiformats/go-multicodec v0.9.0 diff --git a/go.sum b/go.sum index b5fb5867d..4fe32e664 100644 --- a/go.sum +++ b/go.sum @@ -1012,8 +1012,8 @@ github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xS github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= -github.com/libp2p/go-libp2p v0.33.1 h1:tvJl9b9M6nSLBtZSXSguq+/lRhRj2oLRkyhBmQNMFLA= -github.com/libp2p/go-libp2p v0.33.1/go.mod h1:zOUTMjG4I7TXwMndNyOBn/CNtVBLlvBlnxfi+8xzx+E= +github.com/libp2p/go-libp2p v0.33.2 h1:vCdwnFxoGOXMKmaGHlDSnL4bM3fQeW8pgIa9DECnb40= +github.com/libp2p/go-libp2p v0.33.2/go.mod h1:zTeppLuCvUIkT118pFVzA8xzP/p2dJYOMApCkFh0Yww= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1309,8 +1309,8 @@ github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.12.2 h1:9G9sTY/wCYajKa9lyfWPmpZAwe6oV+Wb1zcmMS1HG24= -github.com/multiformats/go-multiaddr v0.12.2/go.mod h1:GKyaTYjZRdcUhyOetrxTk9z0cW+jA/YrnqTOvKgi44M= +github.com/multiformats/go-multiaddr v0.12.3 h1:hVBXvPRcKG0w80VinQ23P5t7czWgg65BmIvQKjDydU8= +github.com/multiformats/go-multiaddr v0.12.3/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= From a3ce23cf3bde99c3f4e96070aebaddfd9316dd7e Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 5 Apr 2024 08:50:55 +0200 Subject: [PATCH 04/12] Make gen & Make docsgen-cli Make gen & Make docsgen-cli --- build/openrpc/full.json.gz | Bin 35935 -> 35935 bytes build/openrpc/gateway.json.gz | Bin 12258 -> 12258 bytes build/openrpc/miner.json.gz | Bin 16475 -> 16475 bytes build/openrpc/worker.json.gz | Bin 6049 -> 6049 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-provider.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 9 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index da276e6ab26e89fce34b9044397be97042583667..baaf830238c024f8118746efa5064f6a537e08a8 100644 GIT binary patch literal 35935 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 GW|mFzH5i0Jg&5vrzzQ5b7V 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%0AaDkS zknU8UR3xojiv@wE-jH&+%QKvmu!eGd48gi1uL*ZZ@!;g*-FO_Mv95!BDRH&wql+au zLyW`OTq`AFtzY1=Yx55@7OxW+$-@hsfd~<C+$J^cNxIn>t+C5=U{lyww z?QQ+XVio!wmK9}xj($E9SXj6|SrX*hY+D>u{?Jb8DWGgSwRJ7-HL7=`vzZ(JF-(6+ zLV7Tr%g>gK=hCxNI6*`E3X176FG0iiSen*|6=;QCSqM z{ewA}Q^xQxk|}GXADdHk-$3R^yv8(P(b5jFS=+_^?AGb)y4#f5_gZg}u6-_>k?C%! zx}44C-6o{&e716>4rMAP9K!TIggU4Na13#OCflFMJ{jbAQ+Hc%NrG>B2VBZbWv$@D zCgGk3Vn}JU>de-rT@5U1qCN4Y#B?*r6!^%u$6|uyZ6oW37uRnw1u%fdfKc9tZrwxZ zmcDIrA6HNwC>(5W)kKSbhf#$10gNCC{KGV?){dzd{s6!0!znyICcFs@Ebv)`vd^R zJ-l60&swd`BQ%0Z#Oo5+xNT*dNOka)M=GZ(qPLX7sfPci-CW?SDqT}s(dO8xxu1}J>Ik(6Lo^#Zi?>>P*`&6vxm@6EmEh8yhVnlu&9PqL@{U2< z75(T1(sMHlw|8rT{M9mfeyK8|uM(HoKTve&Zq~A#_Z-L=eyGQqI3W#}( zuOUZZie$nHV?(VWARhg8vOj5ER9gPnB`EDumzIo}ENCI8T^PVMfm}XkUIwvs;{a+- zx1NY_-K(h?rnbi?*jC;A1YHyOIk=88k{x-BOcqxmgy^-}KV;j3_<7?)@0clVt(P@- zXVkhno~;Bblqj|U6wPlF zlt?Zj%($!~X}W{ZTGG2}ftQ9<`V3WXIGp@stNiC64U+od6c%VKcth5zn4`zN2VU32 z{HU+~87*3FfzN2seE#_tT3*USbAJ*087*#AzAD~V30J{|y2`}V)uw7=H!qg1lwO9% zV%(coh>}5GCZ^1BP1He!)-+8$|-8TODB0}L9#aBd+L#8Gr$qdCffKl3f z8@w=E?|>KJ;N(JR*!lA7`1DnONH;Mfgm#w^481Ju2nXKO#8j!ZevzFEw1k74Kvy2) zoMJa#V~fL8d*A3>1zJ@ca?1b9Z1MU{N;)iE_uv+G??^t`+u5p#FVd?9k4fA8gU7_D zs>6?;!zCBO_0J$)&NR$ULHB&i! zi0RDy`!gj0QZIg!NpV!Jf{&1$;2BnV8$Lqz0ii=U&mW$}Xoi!S{^3+smylU|&h#g! zN?u)Agnu}khiH5q@8Z3HGPK~6B^$rIncmF*9+92JDEMc8cD*y1(J5aH!<#9**<%~O zd<)#lQTyJEG{)Vcsh&T_T+G>o`u3F0y-Pp(V>{jP)8DbJ9HIUr(d*B|V^EJlEiuTv*=(-;2dnBo(Pa92J3Eb` z)#*i`^{Ccb@9K_wwK3j^1sI2bZN&{cB;Hjs1O;vT9<DkxGfur zSu3$|6DuA#oLW)j0|3p!Z1P?;ogwAW)G;=d(Q#R$?B3+&6}dDnV1yJgSy*ubuhR?M z&n1HH;kiW{iV!Z literal 35935 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≠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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 05122ea7911953cc2c9970977a50d33276545e3e..9c2dfbcf2a23bf48df7a05d645fc7c8b0187be02 100644 GIT binary patch delta 21 dcmaD9|0sS!3uFGq)=+&8N6S_BW9Kk2003>M2*&^b delta 21 dcmaD9|0sS!3uF4m)=+(p87Jo|#Li)2003{-2-*Mu diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 51c202d72b5b21a7bf84b56fae5a63bb1315033a..ba135c01577aa0bd16db70857c2b4c172bf43fc0 100644 GIT binary patch delta 23 fcmccJz<9fXaY75D^TyV5_8cuo3g5hUXJ!BZe>Ms_ delta 23 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 delta 5946 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 Date: Thu, 4 Apr 2024 23:16:34 +0200 Subject: [PATCH 05/12] fix: piece: Don't return StartEport in PieceDealInfo.EndEpoch (#11832) --- storage/pipeline/piece/piece_info.go | 2 +- storage/pipeline/precommit_policy_test.go | 35 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/storage/pipeline/piece/piece_info.go b/storage/pipeline/piece/piece_info.go index 7ee8f7029..48e15751a 100644 --- a/storage/pipeline/piece/piece_info.go +++ b/storage/pipeline/piece/piece_info.go @@ -147,7 +147,7 @@ func (ds *PieceDealInfo) EndEpoch() (abi.ChainEpoch, error) { default: // note - when implementing make sure to cache any dynamically computed values // todo do we want a smarter mechanism here - return ds.DealSchedule.StartEpoch, nil + return ds.DealSchedule.EndEpoch, nil } } diff --git a/storage/pipeline/precommit_policy_test.go b/storage/pipeline/precommit_policy_test.go index ec2a61ff2..6329e90d3 100644 --- a/storage/pipeline/precommit_policy_test.go +++ b/storage/pipeline/precommit_policy_test.go @@ -18,6 +18,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/modules/dtypes" @@ -242,3 +243,37 @@ func TestMissingDealIsIgnored(t *testing.T) { assert.Equal(t, 547300, int(exp)) } + +func TestBasicPolicyDDO(t *testing.T) { + cfg := fakeConfigGetter(nil) + pcp := pipeline.NewBasicPreCommitPolicy(&fakeChain{ + h: abi.ChainEpoch(55), + }, cfg, 0) + + pieces := []pipeline.SafeSectorPiece{ + pipeline.SafePiece(api.SectorPiece{ + Piece: abi.PieceInfo{ + Size: abi.PaddedPieceSize(1024), + PieceCID: fakePieceCid(t), + }, + DealInfo: &piece.PieceDealInfo{ + PublishCid: nil, + DealID: abi.DealID(44), + DealSchedule: piece.DealSchedule{ + StartEpoch: abi.ChainEpoch(100_000), + EndEpoch: abi.ChainEpoch(1500_000), + }, + PieceActivationManifest: &miner.PieceActivationManifest{ + Size: 0, + VerifiedAllocationKey: nil, + Notify: nil, + }, + }, + }), + } + + exp, err := pcp.Expiration(context.Background(), pieces...) + require.NoError(t, err) + + assert.Equal(t, abi.ChainEpoch(1500_000), exp) +} From 01e24969df313c78e51a6f30dfa054179ba5d357 Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 5 Apr 2024 18:44:36 +0200 Subject: [PATCH 06/12] Update Changelog Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f224abda1..39205d0af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ ## Improvements +# v1.26.2 / 2024-04-05 + +**This is a highly recommended patch release** + +This patch releases fixes an issue for node operators who want to index builtin-actor events after the nv22 upgrade. Specifically, it ensures the builtin actor event entries are ordered by insertion order when selected ([#11834](https://github.com/filecoin-project/lotus/pull/11834)). + +This patch release also includes a couple Lotus-Miner fixes, ensuring that SnapDeals works properly and are using the new ProveReplicaUpdate3 message after the network version 22 upgrade, ensuring that DDO-sectors has the correct sector expirations, as well as DDO-sector visibility in the `lotus-miner sectors list` cmd. + # v1.26.1 / 2024-03-27 **This is a patch release for the Calibration network user.** The Calibration network is scheduled for an upgrade to include the two additional built-in actor events to ease the transition and observability of DDO for the ecosystem ([#964](https://github.com/filecoin-project/FIPs/pull/964) and [#968](https://github.com/filecoin-project/FIPs/pull/968)). From ba11769228668cf63ea38cf980f2d4eed2653793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 5 Apr 2024 09:11:28 +0200 Subject: [PATCH 07/12] fix: lmcli: make 'sectors list' DDO-aware --- cmd/lotus-miner/sectors.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 07cc2e795..8b8fc65cb 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -487,6 +487,13 @@ var sectorsListCmd = &cli.Command{ } } + var pams int + for _, p := range st.Pieces { + if p.DealInfo != nil && p.DealInfo.PieceActivationManifest != nil { + pams++ + } + } + exp := st.Expiration if st.OnTime > 0 && st.OnTime < exp { exp = st.OnTime // Can be different when the sector was CC upgraded @@ -501,6 +508,8 @@ var sectorsListCmd = &cli.Command{ if deals > 0 { m["Deals"] = color.GreenString("%d", deals) + } else if pams > 0 { + m["Deals"] = color.MagentaString("DDO:%d", pams) } else { m["Deals"] = color.BlueString("CC") if st.ToUpgrade { From 65e89a08cae102a5422e62a1d78b92afe396a563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 5 Apr 2024 20:58:00 +0200 Subject: [PATCH 08/12] fix: sealing: Use PRU3 After Nv22 (#11831) --- storage/pipeline/states_replica_update.go | 8 +++- storage/pipeline/states_sealing.go | 45 ++++++++++++----------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/storage/pipeline/states_replica_update.go b/storage/pipeline/states_replica_update.go index 380078e75..a0d92891c 100644 --- a/storage/pipeline/states_replica_update.go +++ b/storage/pipeline/states_replica_update.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/exitcode" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-statemachine" "github.com/filecoin-project/lotus/api" @@ -170,7 +171,12 @@ func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector Sec // figure out message type - pams, deals, err := m.processPieces(ctx.Context(), sector) + nv, err := m.Api.StateNetworkVersion(ctx.Context(), ts.Key()) + if err != nil { + log.Errorf("failed to get network version: %+v", err) + } + + pams, deals, err := m.processPieces(ctx.Context(), sector, nv >= network.Version22) if err != nil { log.Errorf("failed to process pieces: %+v", err) return ctx.Send(SectorSubmitReplicaUpdateFailed{}) diff --git a/storage/pipeline/states_sealing.go b/storage/pipeline/states_sealing.go index 4f40ac7c7..81ee85853 100644 --- a/storage/pipeline/states_sealing.go +++ b/storage/pipeline/states_sealing.go @@ -748,30 +748,33 @@ func (m *Sealing) handleSubmitCommit(ctx statemachine.Context, sector SectorInfo // processPieces returns either: // - a list of piece activation manifests // - a list of deal IDs, if all non-filler pieces are deal-id pieces -func (m *Sealing) processPieces(ctx context.Context, sector SectorInfo) ([]miner.PieceActivationManifest, []abi.DealID, error) { +func (m *Sealing) processPieces(ctx context.Context, sector SectorInfo, forceDDO bool) ([]miner.PieceActivationManifest, []abi.DealID, error) { pams := make([]miner.PieceActivationManifest, 0, len(sector.Pieces)) dealIDs := make([]abi.DealID, 0, len(sector.Pieces)) - var hasDDO bool + hasDDO := forceDDO - for _, piece := range sector.Pieces { - piece := piece + if !forceDDO { + // if not forcing DDO, check if we have any DDO pieces + for _, piece := range sector.Pieces { + piece := piece - // first figure out if this is a ddo sector - err := piece.handleDealInfo(handleDealInfoParams{ - FillerHandler: func(info UniversalPieceInfo) error { - // Fillers are implicit (todo review: Are they??) - return nil - }, - BuiltinMarketHandler: func(info UniversalPieceInfo) error { - return nil - }, - DDOHandler: func(info UniversalPieceInfo) error { - hasDDO = true - return nil - }, - }) - if err != nil { - return nil, nil, xerrors.Errorf("handleDealInfo: %w", err) + // first figure out if this is a ddo sector + err := piece.handleDealInfo(handleDealInfoParams{ + FillerHandler: func(info UniversalPieceInfo) error { + // Fillers are implicit (todo review: Are they??) + return nil + }, + BuiltinMarketHandler: func(info UniversalPieceInfo) error { + return nil + }, + DDOHandler: func(info UniversalPieceInfo) error { + hasDDO = true + return nil + }, + }) + if err != nil { + return nil, nil, xerrors.Errorf("handleDealInfo: %w", err) + } } } for _, piece := range sector.Pieces { @@ -847,7 +850,7 @@ func (m *Sealing) handleSubmitCommitAggregate(ctx statemachine.Context, sector S return ctx.Send(SectorCommitFailed{xerrors.Errorf("sector had nil commR or commD")}) } - pams, dealIDs, err := m.processPieces(ctx.Context(), sector) + pams, dealIDs, err := m.processPieces(ctx.Context(), sector, false) if err != nil { return err } From 647aa48b11f47232b7f030a432c18586e3681230 Mon Sep 17 00:00:00 2001 From: Phi Date: Sun, 7 Apr 2024 13:43:02 +0200 Subject: [PATCH 09/12] Update changelog and upgrade epochs/date --- CHANGELOG.md | 14 ++++++++++---- build/params_mainnet.go | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39205d0af..45c9f0f11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,13 +6,19 @@ ## Improvements -# v1.26.2 / 2024-04-05 +# v1.26.2 / 2024-04-08 -**This is a highly recommended patch release** +**This is a mandatory patch release for the Filecoin network version 22 mainnet upgrade, for all node operators.** -This patch releases fixes an issue for node operators who want to index builtin-actor events after the nv22 upgrade. Specifically, it ensures the builtin actor event entries are ordered by insertion order when selected ([#11834](https://github.com/filecoin-project/lotus/pull/11834)). +There is an update in the upgrade epoch for nv22, you can read the [full discussion in Slack here.](https://filecoinproject.slack.com/archives/C05P37R9KQD/p1712548103521969) + +The new upgrade epoch is scheduled to be on **epoch `3855360 - 2024-04-24 - 14:00:00Z`**. That means: + +**- All mainnet node operators that have upgraded to v1.26.x, must upgrade to this patch release before 2024-04-11T14:00:00Z.** +**- All mainnet node operators that are on a version lower the v1.26.x, must upgrade to this patch release before 2024-04-24T14:00:00Z** + +This patch also includes fixes for node operators who want to index builtin-actor events after the nv22 upgrade. Specifically, it ensures the builtin actor event entries are ordered by insertion order when selected ([#11834](https://github.com/filecoin-project/lotus/pull/11834)). It also includes a couple Lotus-Miner patch fixes, ensuring that SnapDeals works properly and are using the new ProveReplicaUpdate3 message after the network version 22 upgrade, ensuring that DDO-sectors has the correct sector expirations, as well as DDO-sector visibility in the `lotus-miner sectors list` cmd. -This patch release also includes a couple Lotus-Miner fixes, ensuring that SnapDeals works properly and are using the new ProveReplicaUpdate3 message after the network version 22 upgrade, ensuring that DDO-sectors has the correct sector expirations, as well as DDO-sector visibility in the `lotus-miner sectors list` cmd. # v1.26.1 / 2024-03-27 diff --git a/build/params_mainnet.go b/build/params_mainnet.go index 1ff8bd749..ef3996909 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -99,8 +99,8 @@ const UpgradeThunderHeight = UpgradeLightningHeight + 2880*21 // 2023-12-12T13:30:00Z const UpgradeWatermelonHeight = 3469380 -// 2024-04-11T14:00:00Z -var UpgradeDragonHeight = abi.ChainEpoch(3817920) +// 2024-04-24T14:00:00Z +var UpgradeDragonHeight = abi.ChainEpoch(3855360) // This epoch, 120 epochs after the "rest" of the nv22 upgrade, is when we switch to Drand quicknet // 2024-04-11T15:00:00Z From 557c3c01f7b24e207032e45c15504c323a553184 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Tue, 9 Apr 2024 06:17:31 +1000 Subject: [PATCH 10/12] fix(build): disable phoenix drand upgrade if LOTUS_DISABLE_DRAGON --- build/params_mainnet.go | 1 + 1 file changed, 1 insertion(+) diff --git a/build/params_mainnet.go b/build/params_mainnet.go index ef3996909..5831e5137 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -132,6 +132,7 @@ func init() { if os.Getenv("LOTUS_DISABLE_DRAGON") == "1" { UpgradeDragonHeight = math.MaxInt64 - 1 + delete(DrandSchedule, UpgradePhoenixHeight) UpgradePhoenixHeight = math.MaxInt64 } From 099a754a7407ab2dcc8518f01b8388187f723ad4 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Tue, 9 Apr 2024 08:02:18 +1000 Subject: [PATCH 11/12] doc: update changelog, retract 1.26.{0,1}, fix formatting --- CHANGELOG.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45c9f0f11..4436726fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,14 +14,16 @@ There is an update in the upgrade epoch for nv22, you can read the [full discuss The new upgrade epoch is scheduled to be on **epoch `3855360 - 2024-04-24 - 14:00:00Z`**. That means: -**- All mainnet node operators that have upgraded to v1.26.x, must upgrade to this patch release before 2024-04-11T14:00:00Z.** -**- All mainnet node operators that are on a version lower the v1.26.x, must upgrade to this patch release before 2024-04-24T14:00:00Z** +- **All mainnet node operators that have upgraded to v1.26.x, must upgrade to this patch release before 2024-04-11T14:00:00Z.** +- **All mainnet node operators that are on a version lower the v1.26.x, must upgrade to this patch release before 2024-04-24T14:00:00Z.** This patch also includes fixes for node operators who want to index builtin-actor events after the nv22 upgrade. Specifically, it ensures the builtin actor event entries are ordered by insertion order when selected ([#11834](https://github.com/filecoin-project/lotus/pull/11834)). It also includes a couple Lotus-Miner patch fixes, ensuring that SnapDeals works properly and are using the new ProveReplicaUpdate3 message after the network version 22 upgrade, ensuring that DDO-sectors has the correct sector expirations, as well as DDO-sector visibility in the `lotus-miner sectors list` cmd. # v1.26.1 / 2024-03-27 +***RETRACTED: Due to a change in network version 22 upgrade epoch, Lotus v1.26.1 should not be used prior to the new upgrade epoch. See v1.26.2 release notes above.*** + **This is a patch release for the Calibration network user.** The Calibration network is scheduled for an upgrade to include the two additional built-in actor events to ease the transition and observability of DDO for the ecosystem ([#964](https://github.com/filecoin-project/FIPs/pull/964) and [#968](https://github.com/filecoin-project/FIPs/pull/968)). The agreed-upon epoch between the Filecoin implementer team for the update is `1493854`, corresponding to `2024-04-03T11:00:00Z`. All Calibration network users need to upgrade to this patch release before that. @@ -30,6 +32,8 @@ The agreed-upon epoch between the Filecoin implementer team for the update is `1 # v1.26.0 / 2024-03-21 +***RETRACTED: Due to a change in network version 22 upgrade epoch, Lotus v1.26.0 should not be used prior to the new upgrade epoch. See v1.26.2 release notes above.*** + This is the stable release for the upcoming MANDATORY Filecoin network upgrade v22, codenamed Dragon 🐉, at `epoch 3817920 - 2024-04-11 - 14:00:00Z` The Filecoin network version 22 delivers the following FIPs: From 082a9159ced1f6bd7e8fa77064a51d209324b693 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Tue, 9 Apr 2024 08:16:54 +1000 Subject: [PATCH 12/12] doc: add 1.26.x notes in 1.26.2 changelog --- CHANGELOG.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4436726fc..f5f6215d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,25 @@ The new upgrade epoch is scheduled to be on **epoch `3855360 - 2024-04-24 - 14:0 This patch also includes fixes for node operators who want to index builtin-actor events after the nv22 upgrade. Specifically, it ensures the builtin actor event entries are ordered by insertion order when selected ([#11834](https://github.com/filecoin-project/lotus/pull/11834)). It also includes a couple Lotus-Miner patch fixes, ensuring that SnapDeals works properly and are using the new ProveReplicaUpdate3 message after the network version 22 upgrade, ensuring that DDO-sectors has the correct sector expirations, as well as DDO-sector visibility in the `lotus-miner sectors list` cmd. +## Upgrade Warnings + +For users currently on a version of Lotus lower than v1.26.0, please note that **this release requires a minimum Go version of v1.21.7 or higher to successfully build Lotus.** + +## v1.26.x Inclusions + +See the [v1.26.0](#v1260--2024-03-21) release notes below for inclusions and notes on the v1.26.x series. + +* [v13 Builtin Actor Bundle](#v13-builtin-actor-bundle) +* [Migration](#migration) +* [New features](#new-features-1) + * [Tracing API](#tracing-api) + * [Ethereum Tracing API (`trace_block` and `trace_replayBlockTransactions`)](#ethereum-tracing-api-trace_block-and-trace_replayblocktransactions) + * [GetActorEventsRaw and SubscribeActorEventsRaw](#getactoreventsraw-and-subscribeactoreventsraw) + * [Events Configuration Changes](#events-configuration-changes) + * [GetAllClaims and GetAllAlocations](#getallclaims-and-getallalocations) + * [Lotus CLI](#lotus-cli) + +#v1260--2024-03-21 # v1.26.1 / 2024-03-27 @@ -94,7 +113,7 @@ For certain node operators, such as full archival nodes or systems that need to - feat: implement FIP-0063 ([filecoin-project/lotus#11572](https://github.com/filecoin-project/lotus/pull/11572)) - feat: events: Add Lotus APIs to consume smart contract and built-in actor events ([filecoin-project/lotus#11618](https://github.com/filecoin-project/lotus/pull/11618)) -## Tracing API +### Tracing API Replace the `CodeCid` field in the message trace (added in 1.23.4) with an `InvokedActor` field.