From 2fa54225810c2349d008a7e755a2a99a364a9ec3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 23 Sep 2023 17:17:00 -0400 Subject: [PATCH] fix: use VerifyDealForActivation in StateComputeCID Unfortunately, ComputeDataCommitement was deprecated. --- go.mod | 4 +- go.sum | 8 +-- node/impl/full/state.go | 114 +++++++++++++++++++++++++++++++++------- 3 files changed, 100 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index 8923eaa2f..f30d97d08 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-jsonrpc v0.3.1 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.12.2 + github.com/filecoin-project/go-state-types v0.12.3 github.com/filecoin-project/go-statemachine v1.0.3 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 @@ -135,7 +135,7 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/urfave/cli/v2 v2.25.5 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa + github.com/whyrusleeping/cbor-gen v0.0.0-20230923211252-36a87e1ba72f github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/xeipuuv/gojsonschema v1.2.0 diff --git a/go.sum b/go.sum index 9a6e74910..4dedcce3d 100644 --- a/go.sum +++ b/go.sum @@ -338,8 +338,8 @@ github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.11.2-0.20230712101859-8f37624fa540/go.mod h1:SyNPwTsU7I22gL2r0OAPcImvLoTVfgRwdK/Y5rR1zz8= -github.com/filecoin-project/go-state-types v0.12.2 h1:gOEJMkjfjF64ku13ZhLASUDrsE0hMKwNHAuEiH7m9zw= -github.com/filecoin-project/go-state-types v0.12.2/go.mod h1:KOBGyvCalT8uHBS7KSKOVbjsilD90bBZHgLAqrzz6gU= +github.com/filecoin-project/go-state-types v0.12.3 h1:tPljjwrmLUT+b/H0R0yWZQVjVEso7ld9JBh4mpF6c8c= +github.com/filecoin-project/go-state-types v0.12.3/go.mod h1:iJTqGdWDvzXhuVf64Lw0hzt4TIoitMo0VgHdxdjNDZI= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.3 h1:N07o6alys+V1tNoSTi4WuuoeNC4erS/6jE74+NsgQuk= github.com/filecoin-project/go-statemachine v1.0.3/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= @@ -1659,8 +1659,8 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/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-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa h1:EyA027ZAkuaCLoxVX4r1TZMPy1d31fM6hbfQ4OU4I5o= -github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20230923211252-36a87e1ba72f h1:SBuSxXJL0/ZJMtTxbXZgHZkThl9dNrzyaNhlyaqscRo= +github.com/whyrusleeping/cbor-gen v0.0.0-20230923211252-36a87e1ba72f/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 357584ea0..5e137bfc4 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "math" "strconv" "github.com/ipfs/go-cid" @@ -19,6 +20,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/big" + market12 "github.com/filecoin-project/go-state-types/builtin/v12/market" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" @@ -912,27 +914,25 @@ func (a *StateAPI) StateComputeDataCID(ctx context.Context, maddr address.Addres return cid.Cid{}, err } - var ccparams []byte if nv < network.Version13 { - ccparams, err = actors.SerializeParams(&market2.ComputeDataCommitmentParams{ - DealIDs: deals, - SectorType: sectorType, - }) + return a.stateComputeDataCIDv1(ctx, maddr, sectorType, deals, tsk) + } else if nv < network.Version21 { + return a.stateComputeDataCIDv2(ctx, maddr, sectorType, deals, tsk) } else { - ccparams, err = actors.SerializeParams(&market5.ComputeDataCommitmentParams{ - Inputs: []*market5.SectorDataSpec{ - { - DealIDs: deals, - SectorType: sectorType, - }, - }, - }) + return a.stateComputeDataCIDv3(ctx, maddr, sectorType, deals, tsk) } +} + +func (a *StateAPI) stateComputeDataCIDv1(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) { + var err error + ccparams, err := actors.SerializeParams(&market2.ComputeDataCommitmentParams{ + DealIDs: deals, + SectorType: sectorType, + }) if err != nil { return cid.Undef, xerrors.Errorf("computing params for ComputeDataCommitment: %w", err) } - ccmt := &types.Message{ To: market.Address, From: maddr, @@ -948,13 +948,41 @@ func (a *StateAPI) StateComputeDataCID(ctx context.Context, maddr address.Addres return cid.Undef, xerrors.Errorf("receipt for ComputeDataCommitment had exit code %d", r.MsgRct.ExitCode) } - if nv < network.Version13 { - var c cbg.CborCid - if err := c.UnmarshalCBOR(bytes.NewReader(r.MsgRct.Return)); err != nil { - return cid.Undef, xerrors.Errorf("failed to unmarshal CBOR to CborCid: %w", err) - } + var c cbg.CborCid + if err := c.UnmarshalCBOR(bytes.NewReader(r.MsgRct.Return)); err != nil { + return cid.Undef, xerrors.Errorf("failed to unmarshal CBOR to CborCid: %w", err) + } - return cid.Cid(c), nil + return cid.Cid(c), nil +} + +func (a *StateAPI) stateComputeDataCIDv2(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) { + var err error + ccparams, err := actors.SerializeParams(&market5.ComputeDataCommitmentParams{ + Inputs: []*market5.SectorDataSpec{ + { + DealIDs: deals, + SectorType: sectorType, + }, + }, + }) + + if err != nil { + return cid.Undef, xerrors.Errorf("computing params for ComputeDataCommitment: %w", err) + } + ccmt := &types.Message{ + To: market.Address, + From: maddr, + Value: types.NewInt(0), + Method: market.Methods.ComputeDataCommitment, + Params: ccparams, + } + r, err := a.StateCall(ctx, ccmt, tsk) + if err != nil { + return cid.Undef, xerrors.Errorf("calling ComputeDataCommitment: %w", err) + } + if r.MsgRct.ExitCode != 0 { + return cid.Undef, xerrors.Errorf("receipt for ComputeDataCommitment had exit code %d", r.MsgRct.ExitCode) } var cr market5.ComputeDataCommitmentReturn @@ -969,6 +997,52 @@ func (a *StateAPI) StateComputeDataCID(ctx context.Context, maddr address.Addres return cid.Cid(cr.CommDs[0]), nil } +func (a *StateAPI) stateComputeDataCIDv3(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) { + if len(deals) == 0 { + return cid.Undef, nil + } + + var err error + ccparams, err := actors.SerializeParams(&market12.VerifyDealsForActivationParams{ + Sectors: []market12.SectorDeals{{ + SectorType: sectorType, + SectorExpiry: math.MaxInt64, + DealIDs: deals, + }}, + }) + + if err != nil { + return cid.Undef, xerrors.Errorf("computing params for VerifyDealsForActivation: %w", err) + } + ccmt := &types.Message{ + To: market.Address, + From: maddr, + Value: types.NewInt(0), + Method: market.Methods.VerifyDealsForActivation, + Params: ccparams, + } + r, err := a.StateCall(ctx, ccmt, tsk) + if err != nil { + return cid.Undef, xerrors.Errorf("calling VerifyDealsForActivation: %w", err) + } + if r.MsgRct.ExitCode != 0 { + return cid.Undef, xerrors.Errorf("receipt for VerifyDealsForActivation had exit code %d", r.MsgRct.ExitCode) + } + + var cr market12.VerifyDealsForActivationReturn + if err := cr.UnmarshalCBOR(bytes.NewReader(r.MsgRct.Return)); err != nil { + return cid.Undef, xerrors.Errorf("failed to unmarshal CBOR to VerifyDealsForActivationReturn: %w", err) + } + if len(cr.UnsealedCIDs) != 1 { + return cid.Undef, xerrors.Errorf("Sectors output must have 1 entry") + } + ucid := cr.UnsealedCIDs[0] + if ucid == nil { + return cid.Undef, xerrors.Errorf("computed data CID is nil") + } + return *ucid, nil +} + func (a *StateAPI) StateChangedActors(ctx context.Context, old cid.Cid, new cid.Cid) (map[string]types.Actor, error) { store := a.Chain.ActorStore(ctx)