diff --git a/api/api_errors.go b/api/api_errors.go index fd157be5fd1..c5cce58ad56 100644 --- a/api/api_errors.go +++ b/api/api_errors.go @@ -10,22 +10,57 @@ import ( const ( EOutOfGas = iota + jsonrpc.FirstUserCode EActorNotFound + EF3Disabled + EF3ParticipationTicketInvalid + EF3ParticipationTicketExpired + EF3ParticipationIssuerMismatch + EF3ParticipationTooManyInstances + EF3ParticipationTicketStartBeforeExisting + EF3NotReady ) -type ErrOutOfGas struct{} +var ( + RPCErrors = jsonrpc.NewErrors() -func (e *ErrOutOfGas) Error() string { - return "call ran out of gas" -} + // ErrF3Disabled signals that F3 consensus process is disabled. + ErrF3Disabled = errF3Disabled{} + // ErrF3ParticipationTicketInvalid signals that F3ParticipationTicket cannot be decoded. + ErrF3ParticipationTicketInvalid = errF3ParticipationTicketInvalid{} + // ErrF3ParticipationTicketExpired signals that the current GPBFT instance as surpassed the expiry of the ticket. + ErrF3ParticipationTicketExpired = errF3ParticipationTicketExpired{} + // ErrF3ParticipationIssuerMismatch signals that the ticket is not issued by the current node. + ErrF3ParticipationIssuerMismatch = errF3ParticipationIssuerMismatch{} + // ErrF3ParticipationTooManyInstances signals that participation ticket cannot be + // issued because it asks for too many instances. + ErrF3ParticipationTooManyInstances = errF3ParticipationTooManyInstances{} + // ErrF3ParticipationTicketStartBeforeExisting signals that participation ticket + // is before the start instance of an existing lease held by the miner. + ErrF3ParticipationTicketStartBeforeExisting = errF3ParticipationTicketStartBeforeExisting{} + // ErrF3NotReady signals that the F3 instance isn't ready for participation yet. The caller + // should back off and try again later. + ErrF3NotReady = errF3NotReady{} -type ErrActorNotFound struct{} + _ error = (*ErrOutOfGas)(nil) + _ error = (*ErrActorNotFound)(nil) + _ error = (*errF3Disabled)(nil) + _ error = (*errF3ParticipationTicketInvalid)(nil) + _ error = (*errF3ParticipationTicketExpired)(nil) + _ error = (*errF3ParticipationIssuerMismatch)(nil) + _ error = (*errF3NotReady)(nil) +) -func (e *ErrActorNotFound) Error() string { - return "actor not found" +func init() { + RPCErrors.Register(EOutOfGas, new(*ErrOutOfGas)) + RPCErrors.Register(EActorNotFound, new(*ErrActorNotFound)) + RPCErrors.Register(EF3Disabled, new(*errF3Disabled)) + RPCErrors.Register(EF3ParticipationTicketInvalid, new(*errF3ParticipationTicketInvalid)) + RPCErrors.Register(EF3ParticipationTicketExpired, new(*errF3ParticipationTicketExpired)) + RPCErrors.Register(EF3ParticipationIssuerMismatch, new(*errF3ParticipationIssuerMismatch)) + RPCErrors.Register(EF3ParticipationTooManyInstances, new(*errF3ParticipationTooManyInstances)) + RPCErrors.Register(EF3ParticipationTicketStartBeforeExisting, new(*errF3ParticipationTicketStartBeforeExisting)) + RPCErrors.Register(EF3NotReady, new(*errF3NotReady)) } -var RPCErrors = jsonrpc.NewErrors() - func ErrorIsIn(err error, errorTypes []error) bool { for _, etype := range errorTypes { tmp := reflect.New(reflect.PointerTo(reflect.ValueOf(etype).Elem().Type())).Interface() @@ -36,7 +71,42 @@ func ErrorIsIn(err error, errorTypes []error) bool { return false } -func init() { - RPCErrors.Register(EOutOfGas, new(*ErrOutOfGas)) - RPCErrors.Register(EActorNotFound, new(*ErrActorNotFound)) +// ErrOutOfGas signals that a call failed due to insufficient gas. +type ErrOutOfGas struct{} + +func (ErrOutOfGas) Error() string { return "call ran out of gas" } + +// ErrActorNotFound signals that the actor is not found. +type ErrActorNotFound struct{} + +func (ErrActorNotFound) Error() string { return "actor not found" } + +type errF3Disabled struct{} + +func (errF3Disabled) Error() string { return "f3 is disabled" } + +type errF3ParticipationTicketInvalid struct{} + +func (errF3ParticipationTicketInvalid) Error() string { return "ticket is not valid" } + +type errF3ParticipationTicketExpired struct{} + +func (errF3ParticipationTicketExpired) Error() string { return "ticket has expired" } + +type errF3ParticipationIssuerMismatch struct{} + +func (errF3ParticipationIssuerMismatch) Error() string { return "issuer does not match current node" } + +type errF3ParticipationTooManyInstances struct{} + +func (errF3ParticipationTooManyInstances) Error() string { return "requested instance count too high" } + +type errF3ParticipationTicketStartBeforeExisting struct{} + +func (errF3ParticipationTicketStartBeforeExisting) Error() string { + return "ticket starts before existing lease" } + +type errF3NotReady struct{} + +func (errF3NotReady) Error() string { return "f3 isn't yet ready to participate" } diff --git a/api/api_full.go b/api/api_full.go index aff873b2327..34dcb6f33f5 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -8,6 +8,7 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" @@ -910,24 +911,51 @@ type FullNode interface { //*********************************** ALL F3 APIs below are not stable & subject to change *********************************** - // F3Participate should be called by a storage provider to participate in signing F3 consensus. - // Calling this API gives the lotus node a lease to sign in F3 on behalf of given SP. - // The lease should be active only on one node. The lease will expire at the newLeaseExpiration. - // To continue participating in F3 with the given node, call F3Participate again before - // the newLeaseExpiration time. - // newLeaseExpiration cannot be further than 5 minutes in the future. - // It is recommended to call F3Participate every 60 seconds - // with newLeaseExpiration set 2min into the future. - // The oldLeaseExpiration has to be set to newLeaseExpiration of the last successful call. - // For the first call to F3Participate, set the oldLeaseExpiration to zero value/time in the past. - // F3Participate will return true if the lease was accepted. - // The minerID has to be the ID address of the miner. - F3Participate(ctx context.Context, minerID address.Address, newLeaseExpiration time.Time, oldLeaseExpiration time.Time) (bool, error) //perm:sign - // F3GetCertificate returns a finality certificate at given instance number + // F3GetOrRenewParticipationTicket retrieves or renews a participation ticket + // necessary for a miner to engage in the F3 consensus process for the given + // number of instances. + // + // This function accepts an optional previous ticket. If provided, a new ticket + // will be issued only under one the following conditions: + // 1. The previous ticket has expired. + // 2. The issuer of the previous ticket matches the node processing this + // request. + // + // If there is an issuer mismatch (ErrF3ParticipationIssuerMismatch), the miner + // must retry obtaining a new ticket to ensure it is only participating in one F3 + // instance at any time. If the number of instances is beyond the maximum leasable + // participation instances accepted by the node ErrF3ParticipationTooManyInstances + // is returned. + // + // Note: Successfully acquiring a ticket alone does not constitute participation. + // The retrieved ticket must be used to invoke F3Participate to actively engage + // in the F3 consensus process. + F3GetOrRenewParticipationTicket(ctx context.Context, minerID address.Address, previous F3ParticipationTicket, instances uint64) (F3ParticipationTicket, error) //perm:sign + // F3Participate enrolls a storage provider in the F3 consensus process using a + // provided participation ticket. This ticket grants a temporary lease that enables + // the provider to sign transactions as part of the F3 consensus. + // + // The function verifies the ticket's validity and checks if the ticket's issuer + // aligns with the current node. If there is an issuer mismatch + // (ErrF3ParticipationIssuerMismatch), the provider should retry with the same + // ticket, assuming the issue is due to transient network problems or operational + // deployment conditions. If the ticket is invalid + // (ErrF3ParticipationTicketInvalid) or has expired + // (ErrF3ParticipationTicketExpired), the provider must obtain a new ticket by + // calling F3GetOrRenewParticipationTicket. + // + // The start instance associated to the given ticket cannot be less than the + // start instance of any existing lease held by the miner. Otherwise, + // ErrF3ParticipationTicketStartBeforeExisting is returned. In this case, the + // miner should acquire a new ticket before attempting to participate again. + // + // For details on obtaining or renewing a ticket, see F3GetOrRenewParticipationTicket. + F3Participate(ctx context.Context, ticket F3ParticipationTicket) (F3ParticipationLease, error) //perm:sign + // F3GetCertificate returns a finality certificate at given instance. F3GetCertificate(ctx context.Context, instance uint64) (*certs.FinalityCertificate, error) //perm:read - // F3GetLatestCertificate returns the latest finality certificate + // F3GetLatestCertificate returns the latest finality certificate. F3GetLatestCertificate(ctx context.Context) (*certs.FinalityCertificate, error) //perm:read - // F3GetGetManifest returns the current manifest being used for F3 + // F3GetManifest returns the current manifest being used for F3 operations. F3GetManifest(ctx context.Context) (*manifest.Manifest, error) //perm:read // F3GetECPowerTable returns a F3 specific power table for use in standalone F3 nodes. F3GetECPowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) //perm:read @@ -936,6 +964,29 @@ type FullNode interface { // F3IsRunning returns true if the F3 instance is running, false if it's not running but // it's enabled, and an error when disabled entirely. F3IsRunning(ctx context.Context) (bool, error) //perm:read + // F3GetProgress returns the progress of the current F3 instance in terms of instance ID, round and phase. + F3GetProgress(ctx context.Context) (gpbft.Instant, error) //perm:read +} + +// F3ParticipationTicket represents a ticket that authorizes a miner to +// participate in the F3 consensus. +type F3ParticipationTicket []byte + +// F3ParticipationLease defines the lease granted to a storage provider for +// participating in F3 consensus, detailing the session identifier, issuer, +// subject, and the expiration instance. +type F3ParticipationLease struct { + // Network is the name of the network this lease belongs to. + Network gpbft.NetworkName + // Issuer is the identity of the node that issued the lease. + Issuer peer.ID + // MinerID is the actor ID of the miner that holds the lease. + MinerID uint64 + // FromInstance specifies the instance ID from which this lease is valid. + FromInstance uint64 + // ValidityTerm specifies the number of instances for which the lease remains + // valid from the FromInstance. + ValidityTerm uint64 } // EthSubscriber is the reverse interface to the client, called after EthSubscribe diff --git a/api/cbor_gen.go b/api/cbor_gen.go index 7a3f97e5980..10907bd95d0 100644 --- a/api/cbor_gen.go +++ b/api/cbor_gen.go @@ -9,9 +9,11 @@ import ( "sort" cid "github.com/ipfs/go-cid" + peer "github.com/libp2p/go-libp2p/core/peer" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + gpbft "github.com/filecoin-project/go-f3/gpbft" abi "github.com/filecoin-project/go-state-types/abi" paych "github.com/filecoin-project/go-state-types/builtin/v8/paych" @@ -23,6 +25,229 @@ var _ = cid.Undef var _ = math.E var _ = sort.Sort +func (t *F3ParticipationLease) MarshalCBOR(w io.Writer) error { + if t == nil { + _, err := w.Write(cbg.CborNull) + return err + } + + cw := cbg.NewCborWriter(w) + + if _, err := cw.Write([]byte{165}); err != nil { + return err + } + + // t.Issuer (peer.ID) (string) + if len("Issuer") > 8192 { + return xerrors.Errorf("Value in field \"Issuer\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Issuer"))); err != nil { + return err + } + if _, err := cw.WriteString(string("Issuer")); err != nil { + return err + } + + if len(t.Issuer) > 8192 { + return xerrors.Errorf("Value in field t.Issuer was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Issuer))); err != nil { + return err + } + if _, err := cw.WriteString(string(t.Issuer)); err != nil { + return err + } + + // t.MinerID (uint64) (uint64) + if len("MinerID") > 8192 { + return xerrors.Errorf("Value in field \"MinerID\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("MinerID"))); err != nil { + return err + } + if _, err := cw.WriteString(string("MinerID")); err != nil { + return err + } + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.MinerID)); err != nil { + return err + } + + // t.Network (gpbft.NetworkName) (string) + if len("Network") > 8192 { + return xerrors.Errorf("Value in field \"Network\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Network"))); err != nil { + return err + } + if _, err := cw.WriteString(string("Network")); err != nil { + return err + } + + if len(t.Network) > 8192 { + return xerrors.Errorf("Value in field t.Network was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Network))); err != nil { + return err + } + if _, err := cw.WriteString(string(t.Network)); err != nil { + return err + } + + // t.FromInstance (uint64) (uint64) + if len("FromInstance") > 8192 { + return xerrors.Errorf("Value in field \"FromInstance\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("FromInstance"))); err != nil { + return err + } + if _, err := cw.WriteString(string("FromInstance")); err != nil { + return err + } + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.FromInstance)); err != nil { + return err + } + + // t.ValidityTerm (uint64) (uint64) + if len("ValidityTerm") > 8192 { + return xerrors.Errorf("Value in field \"ValidityTerm\" was too long") + } + + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("ValidityTerm"))); err != nil { + return err + } + if _, err := cw.WriteString(string("ValidityTerm")); err != nil { + return err + } + + if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ValidityTerm)); err != nil { + return err + } + + return nil +} + +func (t *F3ParticipationLease) UnmarshalCBOR(r io.Reader) (err error) { + *t = F3ParticipationLease{} + + cr := cbg.NewCborReader(r) + + maj, extra, err := cr.ReadHeader() + if err != nil { + return err + } + defer func() { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + }() + + if maj != cbg.MajMap { + return fmt.Errorf("cbor input should be of type map") + } + + if extra > cbg.MaxLength { + return fmt.Errorf("F3ParticipationLease: map struct too large (%d)", extra) + } + + var name string + n := extra + + for i := uint64(0); i < n; i++ { + + { + sval, err := cbg.ReadStringWithMax(cr, 8192) + if err != nil { + return err + } + + name = string(sval) + } + + switch name { + // t.Issuer (peer.ID) (string) + case "Issuer": + + { + sval, err := cbg.ReadStringWithMax(cr, 8192) + if err != nil { + return err + } + + t.Issuer = peer.ID(sval) + } + // t.MinerID (uint64) (uint64) + case "MinerID": + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.MinerID = uint64(extra) + + } + // t.Network (gpbft.NetworkName) (string) + case "Network": + + { + sval, err := cbg.ReadStringWithMax(cr, 8192) + if err != nil { + return err + } + + t.Network = gpbft.NetworkName(sval) + } + // t.FromInstance (uint64) (uint64) + case "FromInstance": + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.FromInstance = uint64(extra) + + } + // t.ValidityTerm (uint64) (uint64) + case "ValidityTerm": + + { + + maj, extra, err = cr.ReadHeader() + if err != nil { + return err + } + if maj != cbg.MajUnsignedInt { + return fmt.Errorf("wrong type for uint64 field") + } + t.ValidityTerm = uint64(extra) + + } + + default: + // Field doesn't exist on this type, so ignore it + cbg.ScanForLinks(r, func(cid.Cid) {}) + } + } + + return nil +} func (t *PaymentInfo) MarshalCBOR(w io.Writer) error { if t == nil { _, err := w.Write(cbg.CborNull) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index bc1b3b0f9ba..d0f98677cf3 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -124,6 +124,7 @@ func init() { addExample(api.FullAPIVersion1) addExample(api.PCHInbound) addExample(time.Minute) + addExample(gpbft.INITIAL_PHASE) addExample(network.ReachabilityPublic) addExample(buildconstants.TestNetworkVersion) @@ -420,6 +421,7 @@ func init() { }) addExample(&certs.FinalityCertificate{}) addExample(&manifest.Manifest{}) + addExample(gpbft.NetworkName("filecoin")) addExample(gpbft.ActorID(1000)) } diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index be08cc87b0c..c574753d8f4 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -1290,6 +1290,36 @@ func (mr *MockFullNodeMockRecorder) F3GetManifest(arg0 interface{}) *gomock.Call return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3GetManifest", reflect.TypeOf((*MockFullNode)(nil).F3GetManifest), arg0) } +// F3GetOrRenewParticipationTicket mocks base method. +func (m *MockFullNode) F3GetOrRenewParticipationTicket(arg0 context.Context, arg1 address.Address, arg2 api.F3ParticipationTicket, arg3 uint64) (api.F3ParticipationTicket, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3GetOrRenewParticipationTicket", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(api.F3ParticipationTicket) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// F3GetOrRenewParticipationTicket indicates an expected call of F3GetOrRenewParticipationTicket. +func (mr *MockFullNodeMockRecorder) F3GetOrRenewParticipationTicket(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3GetOrRenewParticipationTicket", reflect.TypeOf((*MockFullNode)(nil).F3GetOrRenewParticipationTicket), arg0, arg1, arg2, arg3) +} + +// F3GetProgress mocks base method. +func (m *MockFullNode) F3GetProgress(arg0 context.Context) (gpbft.Instant, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "F3GetProgress", arg0) + ret0, _ := ret[0].(gpbft.Instant) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// F3GetProgress indicates an expected call of F3GetProgress. +func (mr *MockFullNodeMockRecorder) F3GetProgress(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3GetProgress", reflect.TypeOf((*MockFullNode)(nil).F3GetProgress), arg0) +} + // F3IsRunning mocks base method. func (m *MockFullNode) F3IsRunning(arg0 context.Context) (bool, error) { m.ctrl.T.Helper() @@ -1306,18 +1336,18 @@ func (mr *MockFullNodeMockRecorder) F3IsRunning(arg0 interface{}) *gomock.Call { } // F3Participate mocks base method. -func (m *MockFullNode) F3Participate(arg0 context.Context, arg1 address.Address, arg2, arg3 time.Time) (bool, error) { +func (m *MockFullNode) F3Participate(arg0 context.Context, arg1 api.F3ParticipationTicket) (api.F3ParticipationLease, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "F3Participate", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(bool) + ret := m.ctrl.Call(m, "F3Participate", arg0, arg1) + ret0, _ := ret[0].(api.F3ParticipationLease) ret1, _ := ret[1].(error) return ret0, ret1 } // F3Participate indicates an expected call of F3Participate. -func (mr *MockFullNodeMockRecorder) F3Participate(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +func (mr *MockFullNodeMockRecorder) F3Participate(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3Participate", reflect.TypeOf((*MockFullNode)(nil).F3Participate), arg0, arg1, arg2, arg3) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "F3Participate", reflect.TypeOf((*MockFullNode)(nil).F3Participate), arg0, arg1) } // FilecoinAddressToEthAddress mocks base method. diff --git a/api/proxy_gen.go b/api/proxy_gen.go index a1b3fc71d65..e0b39ded673 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -270,9 +270,13 @@ type FullNodeMethods struct { F3GetManifest func(p0 context.Context) (*manifest.Manifest, error) `perm:"read"` + F3GetOrRenewParticipationTicket func(p0 context.Context, p1 address.Address, p2 F3ParticipationTicket, p3 uint64) (F3ParticipationTicket, error) `perm:"sign"` + + F3GetProgress func(p0 context.Context) (gpbft.Instant, error) `perm:"read"` + F3IsRunning func(p0 context.Context) (bool, error) `perm:"read"` - F3Participate func(p0 context.Context, p1 address.Address, p2 time.Time, p3 time.Time) (bool, error) `perm:"sign"` + F3Participate func(p0 context.Context, p1 F3ParticipationTicket) (F3ParticipationLease, error) `perm:"sign"` FilecoinAddressToEthAddress func(p0 context.Context, p1 jsonrpc.RawParams) (ethtypes.EthAddress, error) `perm:"read"` @@ -2195,6 +2199,28 @@ func (s *FullNodeStub) F3GetManifest(p0 context.Context) (*manifest.Manifest, er return nil, ErrNotSupported } +func (s *FullNodeStruct) F3GetOrRenewParticipationTicket(p0 context.Context, p1 address.Address, p2 F3ParticipationTicket, p3 uint64) (F3ParticipationTicket, error) { + if s.Internal.F3GetOrRenewParticipationTicket == nil { + return *new(F3ParticipationTicket), ErrNotSupported + } + return s.Internal.F3GetOrRenewParticipationTicket(p0, p1, p2, p3) +} + +func (s *FullNodeStub) F3GetOrRenewParticipationTicket(p0 context.Context, p1 address.Address, p2 F3ParticipationTicket, p3 uint64) (F3ParticipationTicket, error) { + return *new(F3ParticipationTicket), ErrNotSupported +} + +func (s *FullNodeStruct) F3GetProgress(p0 context.Context) (gpbft.Instant, error) { + if s.Internal.F3GetProgress == nil { + return *new(gpbft.Instant), ErrNotSupported + } + return s.Internal.F3GetProgress(p0) +} + +func (s *FullNodeStub) F3GetProgress(p0 context.Context) (gpbft.Instant, error) { + return *new(gpbft.Instant), ErrNotSupported +} + func (s *FullNodeStruct) F3IsRunning(p0 context.Context) (bool, error) { if s.Internal.F3IsRunning == nil { return false, ErrNotSupported @@ -2206,15 +2232,15 @@ func (s *FullNodeStub) F3IsRunning(p0 context.Context) (bool, error) { return false, ErrNotSupported } -func (s *FullNodeStruct) F3Participate(p0 context.Context, p1 address.Address, p2 time.Time, p3 time.Time) (bool, error) { +func (s *FullNodeStruct) F3Participate(p0 context.Context, p1 F3ParticipationTicket) (F3ParticipationLease, error) { if s.Internal.F3Participate == nil { - return false, ErrNotSupported + return *new(F3ParticipationLease), ErrNotSupported } - return s.Internal.F3Participate(p0, p1, p2, p3) + return s.Internal.F3Participate(p0, p1) } -func (s *FullNodeStub) F3Participate(p0 context.Context, p1 address.Address, p2 time.Time, p3 time.Time) (bool, error) { - return false, ErrNotSupported +func (s *FullNodeStub) F3Participate(p0 context.Context, p1 F3ParticipationTicket) (F3ParticipationLease, error) { + return *new(F3ParticipationLease), ErrNotSupported } func (s *FullNodeStruct) FilecoinAddressToEthAddress(p0 context.Context, p1 jsonrpc.RawParams) (ethtypes.EthAddress, error) { diff --git a/build/openrpc/full.json b/build/openrpc/full.json index e760f79f11f..863576e0f96 100644 --- a/build/openrpc/full.json +++ b/build/openrpc/full.json @@ -37,7 +37,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1340" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1344" } }, { @@ -60,7 +60,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1351" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1355" } }, { @@ -103,7 +103,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1362" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1366" } }, { @@ -214,7 +214,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1384" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1388" } }, { @@ -454,7 +454,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1395" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1399" } }, { @@ -685,7 +685,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1406" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1410" } }, { @@ -784,7 +784,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1417" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1421" } }, { @@ -816,7 +816,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1428" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1432" } }, { @@ -922,7 +922,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1439" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1443" } }, { @@ -1019,7 +1019,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1450" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1454" } }, { @@ -1078,7 +1078,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1461" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1465" } }, { @@ -1171,7 +1171,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1472" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1476" } }, { @@ -1255,7 +1255,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1483" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1487" } }, { @@ -1355,7 +1355,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1494" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1498" } }, { @@ -1411,7 +1411,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1505" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1509" } }, { @@ -1484,7 +1484,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1516" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1520" } }, { @@ -1557,7 +1557,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1527" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1531" } }, { @@ -1604,7 +1604,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1538" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1542" } }, { @@ -1636,7 +1636,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1549" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1553" } }, { @@ -1691,7 +1691,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1560" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1564" } }, { @@ -1743,7 +1743,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1582" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1586" } }, { @@ -1780,7 +1780,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1593" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1597" } }, { @@ -1827,7 +1827,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1604" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1608" } }, { @@ -1874,7 +1874,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1615" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1619" } }, { @@ -1954,7 +1954,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1626" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1630" } }, { @@ -2006,7 +2006,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1637" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1641" } }, { @@ -2045,7 +2045,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1648" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1652" } }, { @@ -2092,7 +2092,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1659" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1663" } }, { @@ -2147,7 +2147,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1670" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1674" } }, { @@ -2176,7 +2176,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1681" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1685" } }, { @@ -2313,7 +2313,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1692" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1696" } }, { @@ -2342,7 +2342,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1703" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1707" } }, { @@ -2396,7 +2396,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1714" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1718" } }, { @@ -2487,7 +2487,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1725" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1729" } }, { @@ -2515,7 +2515,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1736" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1740" } }, { @@ -2605,7 +2605,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1747" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1751" } }, { @@ -2861,7 +2861,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1758" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1762" } }, { @@ -3106,7 +3106,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1769" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1773" } }, { @@ -3382,7 +3382,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1780" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1784" } }, { @@ -3675,7 +3675,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1791" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1795" } }, { @@ -3731,7 +3731,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1802" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1806" } }, { @@ -3778,7 +3778,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1813" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1817" } }, { @@ -3876,7 +3876,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1824" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1828" } }, { @@ -3942,7 +3942,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1835" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1839" } }, { @@ -4008,7 +4008,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1846" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1850" } }, { @@ -4117,7 +4117,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1857" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1861" } }, { @@ -4175,7 +4175,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1868" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1872" } }, { @@ -4297,7 +4297,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1879" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1883" } }, { @@ -4506,7 +4506,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1890" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1894" } }, { @@ -4706,7 +4706,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1901" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1905" } }, { @@ -4898,7 +4898,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1912" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1916" } }, { @@ -5107,7 +5107,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1923" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1927" } }, { @@ -5198,7 +5198,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1934" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1938" } }, { @@ -5256,7 +5256,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1945" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1949" } }, { @@ -5514,7 +5514,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1956" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1960" } }, { @@ -5789,7 +5789,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1967" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1971" } }, { @@ -5817,7 +5817,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1978" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1982" } }, { @@ -5855,7 +5855,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1989" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L1993" } }, { @@ -5963,7 +5963,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2000" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2004" } }, { @@ -6001,7 +6001,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2011" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2015" } }, { @@ -6030,7 +6030,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2022" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2026" } }, { @@ -6093,7 +6093,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2033" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2037" } }, { @@ -6156,7 +6156,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2044" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2048" } }, { @@ -6219,7 +6219,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2055" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2059" } }, { @@ -6264,7 +6264,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2066" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2070" } }, { @@ -6386,7 +6386,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2077" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2081" } }, { @@ -6562,7 +6562,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2088" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2092" } }, { @@ -6717,7 +6717,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2099" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2103" } }, { @@ -6839,7 +6839,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2110" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2114" } }, { @@ -6893,7 +6893,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2121" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2125" } }, { @@ -6947,13 +6947,13 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2132" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2136" } }, { "name": "Filecoin.F3GetCertificate", "description": "```go\nfunc (s *FullNodeStruct) F3GetCertificate(p0 context.Context, p1 uint64) (*certs.FinalityCertificate, error) {\n\tif s.Internal.F3GetCertificate == nil {\n\t\treturn nil, ErrNotSupported\n\t}\n\treturn s.Internal.F3GetCertificate(p0, p1)\n}\n```", - "summary": "F3GetCertificate returns a finality certificate at given instance number\n", + "summary": "F3GetCertificate returns a finality certificate at given instance.\n", "paramStructure": "by-position", "params": [ { @@ -7132,7 +7132,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2143" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2147" } }, { @@ -7215,7 +7215,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2154" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2158" } }, { @@ -7298,13 +7298,13 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2165" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2169" } }, { "name": "Filecoin.F3GetLatestCertificate", "description": "```go\nfunc (s *FullNodeStruct) F3GetLatestCertificate(p0 context.Context) (*certs.FinalityCertificate, error) {\n\tif s.Internal.F3GetLatestCertificate == nil {\n\t\treturn nil, ErrNotSupported\n\t}\n\treturn s.Internal.F3GetLatestCertificate(p0)\n}\n```", - "summary": "F3GetLatestCertificate returns the latest finality certificate\n", + "summary": "F3GetLatestCertificate returns the latest finality certificate.\n", "paramStructure": "by-position", "params": [], "result": { @@ -7465,13 +7465,13 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2176" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2180" } }, { "name": "Filecoin.F3GetManifest", "description": "```go\nfunc (s *FullNodeStruct) F3GetManifest(p0 context.Context) (*manifest.Manifest, error) {\n\tif s.Internal.F3GetManifest == nil {\n\t\treturn nil, ErrNotSupported\n\t}\n\treturn s.Internal.F3GetManifest(p0)\n}\n```", - "summary": "F3GetGetManifest returns the current manifest being used for F3\n", + "summary": "F3GetManifest returns the current manifest being used for F3 operations.\n", "paramStructure": "by-position", "params": [], "result": { @@ -7670,40 +7670,13 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2187" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2191" } }, { - "name": "Filecoin.F3IsRunning", - "description": "```go\nfunc (s *FullNodeStruct) F3IsRunning(p0 context.Context) (bool, error) {\n\tif s.Internal.F3IsRunning == nil {\n\t\treturn false, ErrNotSupported\n\t}\n\treturn s.Internal.F3IsRunning(p0)\n}\n```", - "summary": "F3IsRunning returns true if the F3 instance is running, false if it's not running but\nit's enabled, and an error when disabled entirely.\n", - "paramStructure": "by-position", - "params": [], - "result": { - "name": "bool", - "description": "bool", - "summary": "", - "schema": { - "examples": [ - true - ], - "type": [ - "boolean" - ] - }, - "required": true, - "deprecated": false - }, - "deprecated": false, - "externalDocs": { - "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2198" - } - }, - { - "name": "Filecoin.F3Participate", - "description": "```go\nfunc (s *FullNodeStruct) F3Participate(p0 context.Context, p1 address.Address, p2 time.Time, p3 time.Time) (bool, error) {\n\tif s.Internal.F3Participate == nil {\n\t\treturn false, ErrNotSupported\n\t}\n\treturn s.Internal.F3Participate(p0, p1, p2, p3)\n}\n```", - "summary": "F3Participate should be called by a storage provider to participate in signing F3 consensus.\nCalling this API gives the lotus node a lease to sign in F3 on behalf of given SP.\nThe lease should be active only on one node. The lease will expire at the newLeaseExpiration.\nTo continue participating in F3 with the given node, call F3Participate again before\nthe newLeaseExpiration time.\nnewLeaseExpiration cannot be further than 5 minutes in the future.\nIt is recommended to call F3Participate every 60 seconds\nwith newLeaseExpiration set 2min into the future.\nThe oldLeaseExpiration has to be set to newLeaseExpiration of the last successful call.\nFor the first call to F3Participate, set the oldLeaseExpiration to zero value/time in the past.\nF3Participate will return true if the lease was accepted.\nThe minerID has to be the ID address of the miner.\n", + "name": "Filecoin.F3GetOrRenewParticipationTicket", + "description": "```go\nfunc (s *FullNodeStruct) F3GetOrRenewParticipationTicket(p0 context.Context, p1 address.Address, p2 F3ParticipationTicket, p3 uint64) (F3ParticipationTicket, error) {\n\tif s.Internal.F3GetOrRenewParticipationTicket == nil {\n\t\treturn *new(F3ParticipationTicket), ErrNotSupported\n\t}\n\treturn s.Internal.F3GetOrRenewParticipationTicket(p0, p1, p2, p3)\n}\n```", + "summary": "F3GetOrRenewParticipationTicket retrieves or renews a participation ticket\nnecessary for a miner to engage in the F3 consensus process for the given\nnumber of instances.\n\nThis function accepts an optional previous ticket. If provided, a new ticket\nwill be issued only under one the following conditions:\n 1. The previous ticket has expired.\n 2. The issuer of the previous ticket matches the node processing this\n request.\n\nIf there is an issuer mismatch (ErrF3ParticipationIssuerMismatch), the miner\nmust retry obtaining a new ticket to ensure it is only participating in one F3\ninstance at any time. If the number of instances is beyond the maximum leasable\nparticipation instances accepted by the node ErrF3ParticipationTooManyInstances\nis returned.\n\nNote: Successfully acquiring a ticket alone does not constitute participation.\nThe retrieved ticket must be used to invoke F3Participate to actively engage\nin the F3 consensus process.\n", "paramStructure": "by-position", "params": [ { @@ -7724,37 +7697,128 @@ }, { "name": "p2", - "description": "time.Time", + "description": "F3ParticipationTicket", "summary": "", "schema": { "examples": [ - "0001-01-01T00:00:00Z" + "Bw==" ], - "type": [ - "string" + "items": [ + { + "title": "number", + "description": "Number is a number", + "type": [ + "number" + ] + } ], - "format": "date-time" + "type": [ + "array" + ] }, "required": true, "deprecated": false }, { "name": "p3", - "description": "time.Time", + "description": "uint64", "summary": "", "schema": { + "title": "number", + "description": "Number is a number", "examples": [ - "0001-01-01T00:00:00Z" + 42 ], "type": [ - "string" - ], - "format": "date-time" + "number" + ] }, "required": true, "deprecated": false } ], + "result": { + "name": "F3ParticipationTicket", + "description": "F3ParticipationTicket", + "summary": "", + "schema": { + "examples": [ + "Bw==" + ], + "items": [ + { + "title": "number", + "description": "Number is a number", + "type": [ + "number" + ] + } + ], + "type": [ + "array" + ] + }, + "required": true, + "deprecated": false + }, + "deprecated": false, + "externalDocs": { + "description": "Github remote link", + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2202" + } + }, + { + "name": "Filecoin.F3GetProgress", + "description": "```go\nfunc (s *FullNodeStruct) F3GetProgress(p0 context.Context) (gpbft.Instant, error) {\n\tif s.Internal.F3GetProgress == nil {\n\t\treturn *new(gpbft.Instant), ErrNotSupported\n\t}\n\treturn s.Internal.F3GetProgress(p0)\n}\n```", + "summary": "F3GetProgress returns the progress of the current F3 instance in terms of instance ID, round and phase.\n", + "paramStructure": "by-position", + "params": [], + "result": { + "name": "gpbft.Instant", + "description": "gpbft.Instant", + "summary": "", + "schema": { + "examples": [ + { + "ID": 42, + "Round": 42, + "Phase": 0 + } + ], + "additionalProperties": false, + "properties": { + "ID": { + "title": "number", + "type": "number" + }, + "Phase": { + "title": "number", + "type": "number" + }, + "Round": { + "title": "number", + "type": "number" + } + }, + "type": [ + "object" + ] + }, + "required": true, + "deprecated": false + }, + "deprecated": false, + "externalDocs": { + "description": "Github remote link", + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2213" + } + }, + { + "name": "Filecoin.F3IsRunning", + "description": "```go\nfunc (s *FullNodeStruct) F3IsRunning(p0 context.Context) (bool, error) {\n\tif s.Internal.F3IsRunning == nil {\n\t\treturn false, ErrNotSupported\n\t}\n\treturn s.Internal.F3IsRunning(p0)\n}\n```", + "summary": "F3IsRunning returns true if the F3 instance is running, false if it's not running but\nit's enabled, and an error when disabled entirely.\n", + "paramStructure": "by-position", + "params": [], "result": { "name": "bool", "description": "bool", @@ -7773,7 +7837,86 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2209" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2224" + } + }, + { + "name": "Filecoin.F3Participate", + "description": "```go\nfunc (s *FullNodeStruct) F3Participate(p0 context.Context, p1 F3ParticipationTicket) (F3ParticipationLease, error) {\n\tif s.Internal.F3Participate == nil {\n\t\treturn *new(F3ParticipationLease), ErrNotSupported\n\t}\n\treturn s.Internal.F3Participate(p0, p1)\n}\n```", + "summary": "F3Participate enrolls a storage provider in the F3 consensus process using a\nprovided participation ticket. This ticket grants a temporary lease that enables\nthe provider to sign transactions as part of the F3 consensus.\n\nThe function verifies the ticket's validity and checks if the ticket's issuer\naligns with the current node. If there is an issuer mismatch\n(ErrF3ParticipationIssuerMismatch), the provider should retry with the same\nticket, assuming the issue is due to transient network problems or operational\ndeployment conditions. If the ticket is invalid\n(ErrF3ParticipationTicketInvalid) or has expired\n(ErrF3ParticipationTicketExpired), the provider must obtain a new ticket by\ncalling F3GetOrRenewParticipationTicket.\n\nThe start instance associated to the given ticket cannot be less than the\nstart instance of any existing lease held by the miner. Otherwise,\nErrF3ParticipationTicketStartBeforeExisting is returned. In this case, the\nminer should acquire a new ticket before attempting to participate again.\n\nFor details on obtaining or renewing a ticket, see F3GetOrRenewParticipationTicket.\n", + "paramStructure": "by-position", + "params": [ + { + "name": "p1", + "description": "F3ParticipationTicket", + "summary": "", + "schema": { + "examples": [ + "Bw==" + ], + "items": [ + { + "title": "number", + "description": "Number is a number", + "type": [ + "number" + ] + } + ], + "type": [ + "array" + ] + }, + "required": true, + "deprecated": false + } + ], + "result": { + "name": "F3ParticipationLease", + "description": "F3ParticipationLease", + "summary": "", + "schema": { + "examples": [ + { + "Network": "filecoin", + "Issuer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "MinerID": 42, + "FromInstance": 42, + "ValidityTerm": 42 + } + ], + "additionalProperties": false, + "properties": { + "FromInstance": { + "title": "number", + "type": "number" + }, + "Issuer": { + "type": "string" + }, + "MinerID": { + "title": "number", + "type": "number" + }, + "Network": { + "type": "string" + }, + "ValidityTerm": { + "title": "number", + "type": "number" + } + }, + "type": [ + "object" + ] + }, + "required": true, + "deprecated": false + }, + "deprecated": false, + "externalDocs": { + "description": "Github remote link", + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2235" } }, { @@ -7836,7 +7979,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2220" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2246" } }, { @@ -7979,7 +8122,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2231" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2257" } }, { @@ -8106,7 +8249,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2242" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2268" } }, { @@ -8208,7 +8351,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2253" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2279" } }, { @@ -8431,7 +8574,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2264" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2290" } }, { @@ -8614,7 +8757,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2275" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2301" } }, { @@ -8694,7 +8837,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2286" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2312" } }, { @@ -8739,7 +8882,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2297" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2323" } }, { @@ -8795,7 +8938,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2308" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2334" } }, { @@ -8875,7 +9018,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2319" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2345" } }, { @@ -8955,7 +9098,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2330" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2356" } }, { @@ -9440,7 +9583,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2341" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2367" } }, { @@ -9634,7 +9777,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2352" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2378" } }, { @@ -9789,7 +9932,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2363" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2389" } }, { @@ -10038,7 +10181,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2374" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2400" } }, { @@ -10193,7 +10336,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2385" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2411" } }, { @@ -10370,7 +10513,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2396" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2422" } }, { @@ -10468,7 +10611,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2407" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2433" } }, { @@ -10633,7 +10776,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2418" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2444" } }, { @@ -10672,7 +10815,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2429" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2455" } }, { @@ -10737,7 +10880,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2440" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2466" } }, { @@ -10783,7 +10926,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2451" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2477" } }, { @@ -10933,7 +11076,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2462" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2488" } }, { @@ -11070,7 +11213,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2473" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2499" } }, { @@ -11301,7 +11444,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2484" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2510" } }, { @@ -11438,7 +11581,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2495" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2521" } }, { @@ -11603,7 +11746,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2506" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2532" } }, { @@ -11680,7 +11823,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2517" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2543" } }, { @@ -11875,7 +12018,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2539" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2565" } }, { @@ -12054,7 +12197,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2550" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2576" } }, { @@ -12216,7 +12359,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2561" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2587" } }, { @@ -12364,7 +12507,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2572" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2598" } }, { @@ -12592,7 +12735,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2583" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2609" } }, { @@ -12740,7 +12883,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2594" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2620" } }, { @@ -12952,7 +13095,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2605" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2631" } }, { @@ -13158,7 +13301,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2616" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2642" } }, { @@ -13226,7 +13369,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2627" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2653" } }, { @@ -13343,7 +13486,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2638" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2664" } }, { @@ -13434,7 +13577,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2649" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2675" } }, { @@ -13520,7 +13663,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2660" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2686" } }, { @@ -13715,7 +13858,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2671" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2697" } }, { @@ -13877,7 +14020,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2682" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2708" } }, { @@ -14073,7 +14216,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2693" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2719" } }, { @@ -14253,7 +14396,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2704" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2730" } }, { @@ -14416,7 +14559,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2715" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2741" } }, { @@ -14443,7 +14586,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2726" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2752" } }, { @@ -14470,7 +14613,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2737" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2763" } }, { @@ -14569,7 +14712,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2748" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2774" } }, { @@ -14615,7 +14758,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2759" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2785" } }, { @@ -14715,7 +14858,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2770" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2796" } }, { @@ -14831,7 +14974,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2781" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2807" } }, { @@ -14879,7 +15022,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2792" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2818" } }, { @@ -14971,7 +15114,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2803" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2829" } }, { @@ -15086,7 +15229,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2814" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2840" } }, { @@ -15134,7 +15277,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2825" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2851" } }, { @@ -15171,7 +15314,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2836" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2862" } }, { @@ -15443,7 +15586,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2847" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2873" } }, { @@ -15491,7 +15634,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2858" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2884" } }, { @@ -15549,7 +15692,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2869" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2895" } }, { @@ -15754,7 +15897,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2880" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2906" } }, { @@ -15957,7 +16100,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2891" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2917" } }, { @@ -16126,7 +16269,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2902" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2928" } }, { @@ -16330,7 +16473,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2913" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2939" } }, { @@ -16497,7 +16640,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2924" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2950" } }, { @@ -16704,7 +16847,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2935" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2961" } }, { @@ -16772,7 +16915,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2946" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2972" } }, { @@ -16824,7 +16967,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2957" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2983" } }, { @@ -16873,7 +17016,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2968" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2994" } }, { @@ -16964,7 +17107,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2979" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3005" } }, { @@ -17470,7 +17613,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L2990" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3016" } }, { @@ -17576,7 +17719,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3001" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3027" } }, { @@ -17628,7 +17771,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3012" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3038" } }, { @@ -18180,7 +18323,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3023" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3049" } }, { @@ -18294,7 +18437,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3034" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3060" } }, { @@ -18391,7 +18534,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3045" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3071" } }, { @@ -18491,7 +18634,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3056" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3082" } }, { @@ -18579,7 +18722,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3067" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3093" } }, { @@ -18679,7 +18822,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3078" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3104" } }, { @@ -18766,7 +18909,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3089" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3115" } }, { @@ -18857,7 +19000,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3100" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3126" } }, { @@ -18982,7 +19125,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3111" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3137" } }, { @@ -19091,7 +19234,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3122" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3148" } }, { @@ -19161,7 +19304,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3133" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3159" } }, { @@ -19264,7 +19407,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3144" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3170" } }, { @@ -19325,7 +19468,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3155" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3181" } }, { @@ -19455,7 +19598,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3166" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3192" } }, { @@ -19562,7 +19705,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3177" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3203" } }, { @@ -19781,7 +19924,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3188" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3214" } }, { @@ -19858,7 +20001,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3199" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3225" } }, { @@ -19935,7 +20078,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3210" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3236" } }, { @@ -20044,7 +20187,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3221" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3247" } }, { @@ -20153,7 +20296,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3232" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3258" } }, { @@ -20214,7 +20357,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3243" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3269" } }, { @@ -20324,7 +20467,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3254" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3280" } }, { @@ -20385,7 +20528,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3265" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3291" } }, { @@ -20453,7 +20596,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3276" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3302" } }, { @@ -20521,7 +20664,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3287" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3313" } }, { @@ -20602,7 +20745,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3298" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3324" } }, { @@ -20756,7 +20899,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3309" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3335" } }, { @@ -20828,7 +20971,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3320" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3346" } }, { @@ -20992,7 +21135,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3331" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3357" } }, { @@ -21157,7 +21300,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3342" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3368" } }, { @@ -21227,7 +21370,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3353" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3379" } }, { @@ -21295,7 +21438,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3364" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3390" } }, { @@ -21388,7 +21531,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3375" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3401" } }, { @@ -21459,7 +21602,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3386" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3412" } }, { @@ -21660,7 +21803,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3397" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3423" } }, { @@ -21792,7 +21935,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3408" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3434" } }, { @@ -21895,7 +22038,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3419" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3445" } }, { @@ -22032,7 +22175,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3430" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3456" } }, { @@ -22143,7 +22286,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3441" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3467" } }, { @@ -22275,7 +22418,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3452" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3478" } }, { @@ -22406,7 +22549,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3463" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3489" } }, { @@ -22477,7 +22620,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3474" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3500" } }, { @@ -22561,7 +22704,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3485" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3511" } }, { @@ -22647,7 +22790,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3496" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3522" } }, { @@ -22830,7 +22973,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3507" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3533" } }, { @@ -22857,7 +23000,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3518" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3544" } }, { @@ -22910,7 +23053,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3529" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3555" } }, { @@ -22998,7 +23141,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3540" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3566" } }, { @@ -23449,7 +23592,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3551" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3577" } }, { @@ -23616,7 +23759,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3562" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3588" } }, { @@ -23714,7 +23857,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3573" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3599" } }, { @@ -23887,7 +24030,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3584" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3610" } }, { @@ -23985,7 +24128,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3595" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3621" } }, { @@ -24136,7 +24279,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3606" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3632" } }, { @@ -24221,7 +24364,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3617" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3643" } }, { @@ -24289,7 +24432,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3628" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3654" } }, { @@ -24341,7 +24484,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3639" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3665" } }, { @@ -24409,7 +24552,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3650" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3676" } }, { @@ -24570,7 +24713,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3661" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3687" } }, { @@ -24617,7 +24760,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3683" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3709" } }, { @@ -24664,7 +24807,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3694" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3720" } }, { @@ -24707,7 +24850,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3716" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3742" } }, { @@ -24803,7 +24946,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3727" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3753" } }, { @@ -25069,7 +25212,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3738" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3764" } }, { @@ -25092,7 +25235,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3749" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3775" } }, { @@ -25135,7 +25278,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3760" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3786" } }, { @@ -25186,7 +25329,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3771" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3797" } }, { @@ -25231,7 +25374,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3782" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3808" } }, { @@ -25259,7 +25402,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3793" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3819" } }, { @@ -25299,7 +25442,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3804" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3830" } }, { @@ -25358,7 +25501,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3815" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3841" } }, { @@ -25402,7 +25545,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3826" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3852" } }, { @@ -25461,7 +25604,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3837" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3863" } }, { @@ -25498,7 +25641,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3848" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3874" } }, { @@ -25542,7 +25685,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3859" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3885" } }, { @@ -25582,7 +25725,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3870" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3896" } }, { @@ -25657,7 +25800,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3881" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3907" } }, { @@ -25865,7 +26008,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3892" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3918" } }, { @@ -25909,7 +26052,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3903" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3929" } }, { @@ -25999,7 +26142,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3914" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3940" } }, { @@ -26026,7 +26169,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3925" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3951" } } ] diff --git a/build/openrpc/gateway.json b/build/openrpc/gateway.json index 452a96f7ce3..d505b5d2769 100644 --- a/build/openrpc/gateway.json +++ b/build/openrpc/gateway.json @@ -242,7 +242,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3936" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3962" } }, { @@ -473,7 +473,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3947" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3973" } }, { @@ -572,7 +572,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3958" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3984" } }, { @@ -604,7 +604,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3969" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3995" } }, { @@ -710,7 +710,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3980" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4006" } }, { @@ -803,7 +803,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L3991" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4017" } }, { @@ -887,7 +887,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4002" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4028" } }, { @@ -987,7 +987,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4013" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4039" } }, { @@ -1043,7 +1043,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4024" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4050" } }, { @@ -1116,7 +1116,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4035" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4061" } }, { @@ -1189,7 +1189,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4046" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4072" } }, { @@ -1236,7 +1236,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4057" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4083" } }, { @@ -1268,7 +1268,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4068" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4094" } }, { @@ -1305,7 +1305,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4090" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4116" } }, { @@ -1352,7 +1352,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4101" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4127" } }, { @@ -1392,7 +1392,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4112" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4138" } }, { @@ -1439,7 +1439,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4123" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4149" } }, { @@ -1494,7 +1494,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4134" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4160" } }, { @@ -1523,7 +1523,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4145" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4171" } }, { @@ -1660,7 +1660,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4156" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4182" } }, { @@ -1689,7 +1689,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4167" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4193" } }, { @@ -1743,7 +1743,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4178" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4204" } }, { @@ -1834,7 +1834,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4189" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4215" } }, { @@ -1862,7 +1862,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4200" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4226" } }, { @@ -1952,7 +1952,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4211" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4237" } }, { @@ -2208,7 +2208,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4222" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4248" } }, { @@ -2453,7 +2453,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4233" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4259" } }, { @@ -2729,7 +2729,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4244" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4270" } }, { @@ -3022,7 +3022,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4255" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4281" } }, { @@ -3078,7 +3078,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4266" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4292" } }, { @@ -3125,7 +3125,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4277" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4303" } }, { @@ -3223,7 +3223,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4288" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4314" } }, { @@ -3289,7 +3289,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4299" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4325" } }, { @@ -3355,7 +3355,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4310" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4336" } }, { @@ -3464,7 +3464,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4321" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4347" } }, { @@ -3522,7 +3522,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4332" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4358" } }, { @@ -3644,7 +3644,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4343" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4369" } }, { @@ -3836,7 +3836,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4354" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4380" } }, { @@ -4045,7 +4045,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4365" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4391" } }, { @@ -4136,7 +4136,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4376" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4402" } }, { @@ -4194,7 +4194,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4387" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4413" } }, { @@ -4452,7 +4452,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4398" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4424" } }, { @@ -4727,7 +4727,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4409" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4435" } }, { @@ -4755,7 +4755,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4420" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4446" } }, { @@ -4793,7 +4793,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4431" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4457" } }, { @@ -4901,7 +4901,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4442" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4468" } }, { @@ -4939,7 +4939,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4453" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4479" } }, { @@ -4968,7 +4968,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4464" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4490" } }, { @@ -5031,7 +5031,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4475" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4501" } }, { @@ -5094,7 +5094,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4486" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4512" } }, { @@ -5139,7 +5139,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4497" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4523" } }, { @@ -5261,7 +5261,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4508" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4534" } }, { @@ -5437,7 +5437,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4519" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4545" } }, { @@ -5592,7 +5592,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4530" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4556" } }, { @@ -5714,7 +5714,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4541" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4567" } }, { @@ -5768,7 +5768,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4552" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4578" } }, { @@ -5822,7 +5822,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4563" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4589" } }, { @@ -5885,7 +5885,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4574" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4600" } }, { @@ -5987,7 +5987,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4585" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4611" } }, { @@ -6210,7 +6210,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4596" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4622" } }, { @@ -6393,7 +6393,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4607" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4633" } }, { @@ -6587,7 +6587,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4618" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4644" } }, { @@ -6633,7 +6633,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4629" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4655" } }, { @@ -6783,7 +6783,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4640" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4666" } }, { @@ -6920,7 +6920,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4651" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4677" } }, { @@ -6988,7 +6988,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4662" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4688" } }, { @@ -7105,7 +7105,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4673" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4699" } }, { @@ -7196,7 +7196,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4684" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4710" } }, { @@ -7282,7 +7282,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4695" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4721" } }, { @@ -7309,7 +7309,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4706" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4732" } }, { @@ -7336,7 +7336,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4717" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4743" } }, { @@ -7404,7 +7404,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4728" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4754" } }, { @@ -7910,7 +7910,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4739" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4765" } }, { @@ -8007,7 +8007,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4750" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4776" } }, { @@ -8107,7 +8107,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4761" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4787" } }, { @@ -8207,7 +8207,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4772" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4798" } }, { @@ -8332,7 +8332,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4783" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4809" } }, { @@ -8441,7 +8441,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4794" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4820" } }, { @@ -8544,7 +8544,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4805" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4831" } }, { @@ -8674,7 +8674,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4816" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4842" } }, { @@ -8781,7 +8781,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4827" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4853" } }, { @@ -8842,7 +8842,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4838" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4864" } }, { @@ -8910,7 +8910,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4849" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4875" } }, { @@ -8991,7 +8991,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4860" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4886" } }, { @@ -9155,7 +9155,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4871" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4897" } }, { @@ -9248,7 +9248,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4882" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4908" } }, { @@ -9449,7 +9449,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4893" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4919" } }, { @@ -9560,7 +9560,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4904" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4930" } }, { @@ -9691,7 +9691,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4915" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4941" } }, { @@ -9777,7 +9777,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4926" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4952" } }, { @@ -9804,7 +9804,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4937" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4963" } }, { @@ -9857,7 +9857,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4948" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4974" } }, { @@ -9945,7 +9945,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4959" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4985" } }, { @@ -10396,7 +10396,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4970" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4996" } }, { @@ -10563,7 +10563,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4981" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5007" } }, { @@ -10736,7 +10736,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L4992" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5018" } }, { @@ -10804,7 +10804,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5003" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5029" } }, { @@ -10872,7 +10872,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5014" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5040" } }, { @@ -11033,7 +11033,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5025" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5051" } }, { @@ -11078,7 +11078,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5047" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5073" } }, { @@ -11123,7 +11123,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5058" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5084" } }, { @@ -11150,7 +11150,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5069" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5095" } } ] diff --git a/build/openrpc/miner.json b/build/openrpc/miner.json index d81d9ee97aa..f8a701ccfea 100644 --- a/build/openrpc/miner.json +++ b/build/openrpc/miner.json @@ -30,7 +30,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5355" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5381" } }, { @@ -109,7 +109,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5366" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5392" } }, { @@ -155,7 +155,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5377" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5403" } }, { @@ -203,7 +203,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5388" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5414" } }, { @@ -251,7 +251,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5399" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5425" } }, { @@ -354,7 +354,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5410" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5436" } }, { @@ -428,7 +428,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5421" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5447" } }, { @@ -591,7 +591,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5432" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5458" } }, { @@ -742,7 +742,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5443" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5469" } }, { @@ -781,7 +781,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5454" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5480" } }, { @@ -913,7 +913,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5465" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5491" } }, { @@ -945,7 +945,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5476" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5502" } }, { @@ -986,7 +986,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5487" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5513" } }, { @@ -1054,7 +1054,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5498" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5524" } }, { @@ -1185,7 +1185,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5509" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5535" } }, { @@ -1316,7 +1316,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5520" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5546" } }, { @@ -1416,7 +1416,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5531" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5557" } }, { @@ -1516,7 +1516,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5542" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5568" } }, { @@ -1616,7 +1616,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5553" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5579" } }, { @@ -1716,7 +1716,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5564" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5590" } }, { @@ -1816,7 +1816,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5575" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5601" } }, { @@ -1916,7 +1916,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5586" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5612" } }, { @@ -2040,7 +2040,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5597" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5623" } }, { @@ -2164,7 +2164,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5608" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5634" } }, { @@ -2279,7 +2279,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5619" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5645" } }, { @@ -2379,7 +2379,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5630" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5656" } }, { @@ -2512,7 +2512,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5641" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5667" } }, { @@ -2636,7 +2636,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5652" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5678" } }, { @@ -2760,7 +2760,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5663" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5689" } }, { @@ -2884,7 +2884,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5674" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5700" } }, { @@ -3017,7 +3017,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5685" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5711" } }, { @@ -3117,7 +3117,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5696" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5722" } }, { @@ -3157,7 +3157,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5707" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5733" } }, { @@ -3229,7 +3229,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5718" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5744" } }, { @@ -3279,7 +3279,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5729" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5755" } }, { @@ -3323,7 +3323,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5740" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5766" } }, { @@ -3364,7 +3364,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5751" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5777" } }, { @@ -3608,7 +3608,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5762" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5788" } }, { @@ -3682,7 +3682,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5773" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5799" } }, { @@ -3732,7 +3732,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5784" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5810" } }, { @@ -3761,7 +3761,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5795" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5821" } }, { @@ -3790,7 +3790,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5806" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5832" } }, { @@ -3846,7 +3846,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5817" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5843" } }, { @@ -3869,7 +3869,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5828" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5854" } }, { @@ -3929,7 +3929,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5839" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5865" } }, { @@ -3968,7 +3968,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5850" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5876" } }, { @@ -4008,7 +4008,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5861" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5887" } }, { @@ -4081,7 +4081,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5872" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5898" } }, { @@ -4145,7 +4145,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5883" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5909" } }, { @@ -4208,7 +4208,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5894" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5920" } }, { @@ -4258,7 +4258,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5905" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5931" } }, { @@ -4817,7 +4817,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5916" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5942" } }, { @@ -4858,7 +4858,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5927" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5953" } }, { @@ -4899,7 +4899,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5938" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5964" } }, { @@ -4940,7 +4940,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5949" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5975" } }, { @@ -4981,7 +4981,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5960" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5986" } }, { @@ -5022,7 +5022,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5971" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5997" } }, { @@ -5053,7 +5053,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5982" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6008" } }, { @@ -5103,7 +5103,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L5993" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6019" } }, { @@ -5144,7 +5144,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6004" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6030" } }, { @@ -5183,7 +5183,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6015" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6041" } }, { @@ -5247,7 +5247,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6026" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6052" } }, { @@ -5305,7 +5305,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6037" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6063" } }, { @@ -5752,7 +5752,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6048" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6074" } }, { @@ -5788,7 +5788,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6059" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6085" } }, { @@ -5931,7 +5931,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6070" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6096" } }, { @@ -5987,7 +5987,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6081" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6107" } }, { @@ -6026,7 +6026,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6092" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6118" } }, { @@ -6203,7 +6203,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6103" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6129" } }, { @@ -6255,7 +6255,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6114" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6140" } }, { @@ -6447,7 +6447,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6125" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6151" } }, { @@ -6547,7 +6547,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6136" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6162" } }, { @@ -6601,7 +6601,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6147" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6173" } }, { @@ -6640,7 +6640,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6158" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6184" } }, { @@ -6725,7 +6725,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6169" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6195" } }, { @@ -6919,7 +6919,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6180" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6206" } }, { @@ -7017,7 +7017,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6191" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6217" } }, { @@ -7149,7 +7149,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6202" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6228" } }, { @@ -7203,7 +7203,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6213" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6239" } }, { @@ -7237,7 +7237,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6224" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6250" } }, { @@ -7324,7 +7324,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6235" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6261" } }, { @@ -7378,7 +7378,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6246" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6272" } }, { @@ -7478,7 +7478,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6257" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6283" } }, { @@ -7555,7 +7555,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6268" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6294" } }, { @@ -7646,7 +7646,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6279" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6305" } }, { @@ -7685,7 +7685,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6290" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6316" } }, { @@ -7801,7 +7801,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6301" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6327" } }, { @@ -9901,7 +9901,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6312" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6338" } } ] diff --git a/build/openrpc/worker.json b/build/openrpc/worker.json index 6c89818078c..14cec75ca21 100644 --- a/build/openrpc/worker.json +++ b/build/openrpc/worker.json @@ -161,7 +161,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6400" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6426" } }, { @@ -252,7 +252,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6411" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6437" } }, { @@ -420,7 +420,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6422" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6448" } }, { @@ -447,7 +447,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6433" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6459" } }, { @@ -597,7 +597,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6444" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6470" } }, { @@ -700,7 +700,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6455" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6481" } }, { @@ -803,7 +803,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6466" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6492" } }, { @@ -925,7 +925,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6477" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6503" } }, { @@ -1135,7 +1135,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6488" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6514" } }, { @@ -1306,7 +1306,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6499" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6525" } }, { @@ -3350,7 +3350,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6510" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6536" } }, { @@ -3470,7 +3470,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6521" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6547" } }, { @@ -3531,7 +3531,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6532" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6558" } }, { @@ -3569,7 +3569,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6543" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6569" } }, { @@ -3729,7 +3729,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6554" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6580" } }, { @@ -3913,7 +3913,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6565" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6591" } }, { @@ -4054,7 +4054,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6576" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6602" } }, { @@ -4107,7 +4107,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6587" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6613" } }, { @@ -4250,7 +4250,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6598" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6624" } }, { @@ -4474,7 +4474,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6609" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6635" } }, { @@ -4601,7 +4601,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6620" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6646" } }, { @@ -4768,7 +4768,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6631" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6657" } }, { @@ -4895,7 +4895,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6642" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6668" } }, { @@ -4933,7 +4933,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6653" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6679" } }, { @@ -4972,7 +4972,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6664" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6690" } }, { @@ -4995,7 +4995,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6675" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6701" } }, { @@ -5034,7 +5034,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6686" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6712" } }, { @@ -5057,7 +5057,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6697" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6723" } }, { @@ -5096,7 +5096,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6708" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6734" } }, { @@ -5130,7 +5130,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6719" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6745" } }, { @@ -5184,7 +5184,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6730" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6756" } }, { @@ -5223,7 +5223,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6741" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6767" } }, { @@ -5262,7 +5262,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6752" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6778" } }, { @@ -5297,7 +5297,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6763" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6789" } }, { @@ -5477,7 +5477,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6774" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6800" } }, { @@ -5506,7 +5506,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6785" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6811" } }, { @@ -5529,7 +5529,7 @@ "deprecated": false, "externalDocs": { "description": "Github remote link", - "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6796" + "url": "https://github.com/filecoin-project/lotus/blob/master/api/proxy_gen.go#L6822" } } ] diff --git a/chain/lf3/config.go b/chain/lf3/config.go index 8c669ded945..2472ca28a86 100644 --- a/chain/lf3/config.go +++ b/chain/lf3/config.go @@ -8,6 +8,7 @@ import ( "github.com/filecoin-project/go-f3/gpbft" "github.com/filecoin-project/go-f3/manifest" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/build/buildconstants" "github.com/filecoin-project/lotus/chain/actors/policy" @@ -15,34 +16,81 @@ import ( ) type Config struct { - InitialManifest *manifest.Manifest + // BaseNetworkName is the base from which dynamic network names are defined and is usually + // the name of the network defined by the static manifest. This must be set correctly or, + // e.g., pubsub topic filters won't work correctly. + BaseNetworkName gpbft.NetworkName + // StaticManifest this instance's default manifest absent any dynamic manifests. Also see + // PrioritizeStaticManifest. + StaticManifest *manifest.Manifest + // DynamicManifestProvider is the peer ID of the peer authorized to send us dynamic manifest + // updates. Dynamic manifest updates can be used for testing but will not be used to affect + // finality. DynamicManifestProvider peer.ID + // PrioritizeStaticManifest means that, once we get within one finality of the static + // manifest's bootstrap epoch we'll switch to it and ignore any further dynamic manifest + // updates. This exists to enable bootstrapping F3. + PrioritizeStaticManifest bool + // TESTINGAllowDynamicFinalize allow dynamic manifests to finalize tipsets. DO NOT ENABLE + // THIS IN PRODUCTION! + AllowDynamicFinalize bool } -func NewConfig(manifestProvider peer.ID, initialPowerTable cid.Cid) func(dtypes.NetworkName) *Config { - return func(nn dtypes.NetworkName) *Config { - m := manifest.LocalDevnetManifest() - m.NetworkName = gpbft.NetworkName(nn) - m.EC.Period = time.Duration(buildconstants.BlockDelaySecs) * time.Second - m.CatchUpAlignment = time.Duration(buildconstants.BlockDelaySecs) * time.Second / 2 - if buildconstants.F3BootstrapEpoch < 0 { - // if unset, set to a sane default so we don't get scary logs and pause. - m.BootstrapEpoch = 2 * int64(policy.ChainFinality) - m.Pause = true - } else { - m.BootstrapEpoch = int64(buildconstants.F3BootstrapEpoch) - } - m.EC.Finality = int64(policy.ChainFinality) - m.CommitteeLookback = 5 - m.InitialPowerTable = initialPowerTable - m.EC.Finalize = buildconstants.F3Consensus +// NewManifest constructs a sane F3 manifest based on the passed parameters. This function does not +// look at and/or depend on the nodes build params, etc. +func NewManifest( + nn gpbft.NetworkName, + finality, bootstrapEpoch abi.ChainEpoch, + ecPeriod time.Duration, + initialPowerTable cid.Cid, +) *manifest.Manifest { + return &manifest.Manifest{ + ProtocolVersion: manifest.VersionCapability, + BootstrapEpoch: int64(bootstrapEpoch), + NetworkName: nn, + InitialPowerTable: initialPowerTable, + CommitteeLookback: manifest.DefaultCommitteeLookback, + CatchUpAlignment: ecPeriod / 2, + Gpbft: manifest.DefaultGpbftConfig, + EC: manifest.EcConfig{ + Period: ecPeriod, + Finality: int64(finality), + DelayMultiplier: manifest.DefaultEcConfig.DelayMultiplier, + BaseDecisionBackoffTable: manifest.DefaultEcConfig.BaseDecisionBackoffTable, + HeadLookback: 0, + Finalize: true, + }, + CertificateExchange: manifest.CxConfig{ + ClientRequestTimeout: manifest.DefaultCxConfig.ClientRequestTimeout, + ServerRequestTimeout: manifest.DefaultCxConfig.ServerRequestTimeout, + MinimumPollInterval: ecPeriod, + MaximumPollInterval: 4 * ecPeriod, + }, + } +} - // TODO: We're forcing this to start paused for now. We need to remove this for the final - // mainnet launch. - m.Pause = true - return &Config{ - InitialManifest: m, - DynamicManifestProvider: manifestProvider, - } +// NewConfig creates a new F3 config based on the node's build parameters and the passed network +// name. +func NewConfig(nn dtypes.NetworkName) *Config { + // Use "filecoin" as the network name on mainnet, otherwise use the network name. Yes, + // mainnet is called testnetnet in state. + if nn == "testnetnet" { + nn = "filecoin" + } + c := &Config{ + BaseNetworkName: gpbft.NetworkName(nn), + PrioritizeStaticManifest: true, + DynamicManifestProvider: buildconstants.F3ManifestServerID, + AllowDynamicFinalize: false, + } + if buildconstants.F3BootstrapEpoch >= 0 { + c.StaticManifest = NewManifest( + c.BaseNetworkName, + policy.ChainFinality, + buildconstants.F3BootstrapEpoch, + time.Duration(buildconstants.BlockDelaySecs)*time.Second, + buildconstants.F3InitialPowerTableCID, + ) } + return c } diff --git a/chain/lf3/f3.go b/chain/lf3/f3.go index c98133f0038..0b702bb73a8 100644 --- a/chain/lf3/f3.go +++ b/chain/lf3/f3.go @@ -4,7 +4,6 @@ import ( "context" "errors" "path/filepath" - "time" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" @@ -34,8 +33,8 @@ type F3 struct { inner *f3.F3 ec *ecWrapper - signer gpbft.Signer - newLeases chan leaseRequest + signer gpbft.Signer + leaser *leaser } type F3Params struct { @@ -51,6 +50,8 @@ type F3Params struct { Wallet api.Wallet Config *Config LockedRepo repo.LockedRepo + + Net api.Net } var log = logging.Logger("f3") @@ -67,16 +68,25 @@ func New(mctx helpers.MetricsCtx, lc fx.Lifecycle, params F3Params) (*F3, error) f3FsPath := filepath.Join(params.LockedRepo.Path(), "f3") module, err := f3.New(mctx, params.ManifestProvider, ds, params.Host, params.PubSub, verif, ec, f3FsPath) - if err != nil { return nil, xerrors.Errorf("creating F3: %w", err) } + nodeId, err := params.Net.ID(mctx) + if err != nil { + return nil, xerrors.Errorf("getting node ID: %w", err) + } + // maxLeasableInstances is the maximum number of leased F3 instances this node + // would give out. + const maxLeasableInstances = 5 + status := func() (*manifest.Manifest, gpbft.Instant) { + return module.Manifest(), module.Progress() + } fff := &F3{ - inner: module, - ec: ec, - signer: &signer{params.Wallet}, - newLeases: make(chan leaseRequest, 4), // some buffer to avoid blocking + inner: module, + ec: ec, + signer: &signer{params.Wallet}, + leaser: newParticipationLeaser(nodeId, status, maxLeasableInstances), } // Start F3 @@ -106,13 +116,6 @@ func New(mctx helpers.MetricsCtx, lc fx.Lifecycle, params F3Params) (*F3, error) return fff, nil } -type leaseRequest struct { - minerID uint64 - newExpiration time.Time - oldExpiration time.Time - resultCh chan<- bool -} - func (fff *F3) runSigningLoop(ctx context.Context) { participateOnce := func(ctx context.Context, mb *gpbft.MessageBuilder, minerID uint64) error { signatureBuilder, err := mb.PrepareSigningInputs(gpbft.ActorID(minerID)) @@ -136,7 +139,6 @@ func (fff *F3) runSigningLoop(ctx context.Context) { return nil } - leaseMngr := new(leaseManager) msgCh := fff.inner.MessagesToSign() loop: @@ -144,36 +146,26 @@ loop: select { case <-ctx.Done(): return - case l := <-fff.newLeases: - // resultCh has only one user and is buffered - l.resultCh <- leaseMngr.UpsertDefensive(l.minerID, l.newExpiration, l.oldExpiration) - close(l.resultCh) case mb, ok := <-msgCh: if !ok { continue loop } - - for _, minerID := range leaseMngr.Active() { - err := participateOnce(ctx, mb, minerID) - if err != nil { - log.Errorf("while participating for miner f0%d: %+v", minerID, err) + participants := fff.leaser.getParticipantsByInstance(mb.Payload.Instance) + for _, id := range participants { + if err := participateOnce(ctx, mb, id); err != nil { + log.Errorf("while participating for miner f0%d: %+v", id, err) } } } } } -// Participate notifies participation loop about a new lease -// Returns true if lease was accepted -func (fff *F3) Participate(ctx context.Context, minerID uint64, newLeaseExpiration, oldLeaseExpiration time.Time) bool { - resultCh := make(chan bool, 1) //buffer the channel to for sure avoid blocking - request := leaseRequest{minerID: minerID, newExpiration: newLeaseExpiration, resultCh: resultCh} - select { - case fff.newLeases <- request: - return <-resultCh - case <-ctx.Done(): - return false - } +func (fff *F3) GetOrRenewParticipationTicket(_ context.Context, minerID uint64, previous api.F3ParticipationTicket, instances uint64) (api.F3ParticipationTicket, error) { + return fff.leaser.getOrRenewParticipationTicket(minerID, previous, instances) +} + +func (fff *F3) Participate(_ context.Context, ticket api.F3ParticipationTicket) (api.F3ParticipationLease, error) { + return fff.leaser.participate(ticket) } func (fff *F3) GetCert(ctx context.Context, instance uint64) (*certs.FinalityCertificate, error) { @@ -199,3 +191,7 @@ func (fff *F3) GetF3PowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft. func (fff *F3) IsRunning() bool { return fff.inner.IsRunning() } + +func (fff *F3) Progress() gpbft.Instant { + return fff.inner.Progress() +} diff --git a/chain/lf3/leasemanager.go b/chain/lf3/leasemanager.go deleted file mode 100644 index 24c75933aa8..00000000000 --- a/chain/lf3/leasemanager.go +++ /dev/null @@ -1,73 +0,0 @@ -package lf3 - -import ( - "time" - - "github.com/raulk/clock" -) - -type leaseManager struct { - // clock for testing - clock clock.Clock - leases map[uint64]time.Time -} - -// Upsert inserts or updates a lease for given id to the expiration time. -func (lm *leaseManager) Upsert(id uint64, expiration time.Time) { - if lm.leases == nil { - lm.leases = make(map[uint64]time.Time) - } - lm.leases[id] = expiration -} - -// UpsertDefensive inserts or updates a lease for the given id to the expiration time either if: -// - old expiration is in the past -// - old expiration matches the one in leaseManager -// returns true if update has happened -func (lm *leaseManager) UpsertDefensive(id uint64, newExpiration time.Time, oldExpiration time.Time) bool { - clk := lm.clk() - if lm.leases == nil { - lm.leases = make(map[uint64]time.Time) - } - // if the old lease is expired just insert a new one - if clk.Until(oldExpiration) < 0 { - lm.Upsert(id, newExpiration) - return true - } - - // old lease is not expired - exp, ok := lm.leases[id] - if !ok { - // we don't know about it, don't start a new lease - return false - } - if exp != oldExpiration { - // the lease we know about does not match and because the old lease is not expired - // we should not allow for new lease - return false - } - // we know about the lease, update it - lm.Upsert(id, newExpiration) - return true -} - -func (lm *leaseManager) clk() clock.Clock { - if lm.clock != nil { - return lm.clock - } - return clock.New() -} - -// Active returns active leases and cleans up the inactive ones under the hood. -func (lm *leaseManager) Active() []uint64 { - clk := lm.clk() - var res []uint64 - for id, exp := range lm.leases { - if clk.Until(exp) <= 0 { - delete(lm.leases, id) - continue - } - res = append(res, id) - } - return res -} diff --git a/chain/lf3/leasemanager_test.go b/chain/lf3/leasemanager_test.go deleted file mode 100644 index 3adaccebe3a..00000000000 --- a/chain/lf3/leasemanager_test.go +++ /dev/null @@ -1,93 +0,0 @@ -package lf3 - -import ( - "testing" - "time" - - "github.com/raulk/clock" - "github.com/stretchr/testify/assert" -) - -func TestLeaseManager_Upsert(t *testing.T) { - lm := &leaseManager{ - clock: clock.NewMock(), - } - - // Test inserting a new lease - expiration := lm.clock.Now().Add(1 * time.Hour) - lm.Upsert(1, expiration) - assert.Equal(t, 1, len(lm.leases)) - assert.Equal(t, expiration, lm.leases[1]) - - // Test updating an existing lease - newExpiration := lm.clock.Now().Add(2 * time.Hour) - lm.Upsert(1, newExpiration) - assert.Equal(t, 1, len(lm.leases)) - assert.Equal(t, newExpiration, lm.leases[1]) -} - -func TestLeaseManager_Active(t *testing.T) { - mockClock := clock.NewMock() - lm := &leaseManager{ - clock: mockClock, - } - - // Add some leases - expiration1 := mockClock.Now().Add(1 * time.Hour) - expiration2 := mockClock.Now().Add(2 * time.Hour) - expiration3 := mockClock.Now().Add(-1 * time.Hour) // Already expired - - lm.Upsert(1, expiration1) - lm.Upsert(2, expiration2) - lm.Upsert(3, expiration3) - - // Check active leases before advancing the clock - activeLeases := lm.Active() - assert.ElementsMatch(t, []uint64{1, 2}, activeLeases) - - // Advance the clock and check active leases again - mockClock.Add(1 * time.Hour) - activeLeases = lm.Active() - assert.ElementsMatch(t, []uint64{2}, activeLeases) - - mockClock.Add(1 * time.Hour) - activeLeases = lm.Active() - assert.Empty(t, activeLeases) -} - -func TestLeaseManager_UpsertDefensive(t *testing.T) { - mockClock := clock.NewMock() - lm := &leaseManager{ - clock: mockClock, - } - - // Test inserting a new lease when oldExpiration is in the past - oldExpiration := mockClock.Now().Add(-1 * time.Hour) - newExpiration := mockClock.Now().Add(1 * time.Hour) - updated := lm.UpsertDefensive(1, newExpiration, oldExpiration) - assert.True(t, updated) - assert.Equal(t, newExpiration, lm.leases[1]) - - // Test updating an existing lease when oldExpiration matches - oldExpiration = newExpiration - newExpiration = mockClock.Now().Add(2 * time.Hour) - updated = lm.UpsertDefensive(1, newExpiration, oldExpiration) - assert.True(t, updated) - assert.Equal(t, newExpiration, lm.leases[1]) - - // Test not updating a lease when oldExpiration does not match - oldExpiration = mockClock.Now().Add(3 * time.Hour) // Different from the current lease expiration - newExpiration = mockClock.Now().Add(4 * time.Hour) - updated = lm.UpsertDefensive(1, newExpiration, oldExpiration) - assert.False(t, updated) - assert.NotEqual(t, newExpiration, lm.leases[1]) - - // Test not updating a lease when it is not known - unknownID := uint64(2) - oldExpiration = mockClock.Now().Add(1 * time.Hour) - newExpiration = mockClock.Now().Add(2 * time.Hour) - updated = lm.UpsertDefensive(unknownID, newExpiration, oldExpiration) - assert.False(t, updated) - _, exists := lm.leases[unknownID] - assert.False(t, exists) -} diff --git a/chain/lf3/manifest.go b/chain/lf3/manifest.go index e4a944f090f..2b64cc4b224 100644 --- a/chain/lf3/manifest.go +++ b/chain/lf3/manifest.go @@ -1,45 +1,91 @@ package lf3 import ( + "context" "fmt" + "strings" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" pubsub "github.com/libp2p/go-libp2p-pubsub" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-f3/ec" "github.com/filecoin-project/go-f3/manifest" + "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/lotus/node/modules/helpers" ) +type headGetter store.ChainStore + +func (hg *headGetter) GetHead(context.Context) (ec.TipSet, error) { + head := (*store.ChainStore)(hg).GetHeaviestTipSet() + if head == nil { + return nil, xerrors.New("no heaviest tipset") + } + return &f3TipSet{TipSet: head}, nil +} + // Determines the max. number of configuration changes // that are allowed for the dynamic manifest. // If the manifest changes more than this number, the F3 // message topic will be filtered var MaxDynamicManifestChangesAllowed = 1000 -func NewManifestProvider(config *Config, ps *pubsub.PubSub, mds dtypes.MetadataDS) (manifest.ManifestProvider, error) { +func NewManifestProvider(mctx helpers.MetricsCtx, config *Config, cs *store.ChainStore, ps *pubsub.PubSub, mds dtypes.MetadataDS) (prov manifest.ManifestProvider, err error) { if config.DynamicManifestProvider == "" { - return manifest.NewStaticManifestProvider(config.InitialManifest) + if config.StaticManifest == nil { + return manifest.NoopManifestProvider{}, nil + } + return manifest.NewStaticManifestProvider(config.StaticManifest) + } + + opts := []manifest.DynamicManifestProviderOption{ + manifest.DynamicManifestProviderWithDatastore( + namespace.Wrap(mds, datastore.NewKey("/f3-dynamic-manifest")), + ), } - primaryNetworkName := config.InitialManifest.NetworkName + if config.StaticManifest != nil { + opts = append(opts, + manifest.DynamicManifestProviderWithInitialManifest(config.StaticManifest), + ) + } + + if config.AllowDynamicFinalize { + log.Error("dynamic F3 manifests are allowed to finalize tipsets, do not enable this in production!") + } + + networkNameBase := config.BaseNetworkName + "/" filter := func(m *manifest.Manifest) error { if m.EC.Finalize { - return fmt.Errorf("refusing dynamic manifest that finalizes tipsets") + if !config.AllowDynamicFinalize { + return fmt.Errorf("refusing dynamic manifest that finalizes tipsets") + } + log.Error("WARNING: loading a dynamic F3 manifest that will finalize new tipsets") } - if m.NetworkName == primaryNetworkName { + if !strings.HasPrefix(string(m.NetworkName), string(networkNameBase)) { return fmt.Errorf( - "refusing dynamic manifest with network name %q that clashes with initial manifest", - primaryNetworkName, + "refusing dynamic manifest with network name %q, must start with %q", + m.NetworkName, + networkNameBase, ) } return nil } - ds := namespace.Wrap(mds, datastore.NewKey("/f3-dynamic-manifest")) - return manifest.NewDynamicManifestProvider(ps, config.DynamicManifestProvider, - manifest.DynamicManifestProviderWithInitialManifest(config.InitialManifest), - manifest.DynamicManifestProviderWithDatastore(ds), + opts = append(opts, manifest.DynamicManifestProviderWithFilter(filter), ) + + prov, err = manifest.NewDynamicManifestProvider(ps, config.DynamicManifestProvider, opts...) + if err != nil { + return nil, err + } + if config.PrioritizeStaticManifest && config.StaticManifest != nil { + prov, err = manifest.NewFusingManifestProvider(mctx, + (*headGetter)(cs), prov, config.StaticManifest) + } + return prov, err } diff --git a/chain/lf3/participation_lease.go b/chain/lf3/participation_lease.go new file mode 100644 index 00000000000..042d48301da --- /dev/null +++ b/chain/lf3/participation_lease.go @@ -0,0 +1,161 @@ +package lf3 + +import ( + "bytes" + "errors" + "sync" + + "github.com/libp2p/go-libp2p/core/peer" + "go.uber.org/multierr" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-f3/gpbft" + "github.com/filecoin-project/go-f3/manifest" + + "github.com/filecoin-project/lotus/api" +) + +type f3Status = func() (*manifest.Manifest, gpbft.Instant) + +type leaser struct { + mutex sync.Mutex + leases map[uint64]api.F3ParticipationLease + issuer peer.ID + status f3Status + maxLeasableInstances uint64 +} + +func newParticipationLeaser(nodeId peer.ID, status f3Status, maxLeasedInstances uint64) *leaser { + return &leaser{ + leases: make(map[uint64]api.F3ParticipationLease), + issuer: nodeId, + status: status, + maxLeasableInstances: maxLeasedInstances, + } +} + +func (l *leaser) getOrRenewParticipationTicket(participant uint64, previous api.F3ParticipationTicket, instances uint64) (api.F3ParticipationTicket, error) { + + if instances > l.maxLeasableInstances { + return nil, api.ErrF3ParticipationTooManyInstances + } + + manifest, instant := l.status() + if manifest == nil { + return nil, api.ErrF3NotReady + } + currentInstance := instant.ID + if len(previous) != 0 { + // A previous ticket is present. To avoid overlapping lease across multiple + // instances for the same participant check its validity and only proceed to + // issue a new ticket if: + // - either it is expired/invalid, or + // - it is valid and was issued by this node. + // + // Otherwise, return ErrF3ParticipationIssuerMismatch to signal to the caller the need for retry. + switch _, err := l.validate(manifest.NetworkName, currentInstance, previous); { + case errors.Is(err, api.ErrF3ParticipationTicketInvalid): + // Invalid ticket means the miner must have got the ticket from a node with a potentially different version. + // Refuse to issue a new ticket in case there is some other node with active lease for the miner. + return nil, err + case errors.Is(err, api.ErrF3ParticipationTicketExpired): + // The current instance is beyond the validity term of the previous lease. It is + // safe to proceed to issuing a ticket from current instance onwards for the term + // asked for. + case errors.Is(err, api.ErrF3ParticipationIssuerMismatch): + // The previous ticket is still valid and is not issued by this node; return error. + return nil, err + case errors.Is(err, api.ErrF3ParticipationTooManyInstances): + // We don't care if the previous lease was for too many instances. What we care + // about is that the new ticket is within the max which was checked right at the + // top. + case err != nil: + log.Errorw("Unexpected error occurred while validating previous participation ticket", "participant", participant, "err", err) + return nil, err + default: + // The previous ticket was issued by this node and is still valid. It is safe to + // proceed with issuing a new ticket with overlapping validity. + } + log.Debugw("Renewing previously issued participation ticket with overlapping lease", "participant", participant, "startInstance", currentInstance, "validFor", instances) + } + + return l.newParticipationTicket(manifest.NetworkName, participant, currentInstance, instances) +} + +func (l *leaser) participate(ticket api.F3ParticipationTicket) (api.F3ParticipationLease, error) { + manifest, instant := l.status() + if manifest == nil { + return api.F3ParticipationLease{}, api.ErrF3NotReady + } + newLease, err := l.validate(manifest.NetworkName, instant.ID, ticket) + if err != nil { + return api.F3ParticipationLease{}, err + } + l.mutex.Lock() + defer l.mutex.Unlock() + currentLease, found := l.leases[newLease.MinerID] + if found && currentLease.Network == newLease.Network && currentLease.FromInstance > newLease.FromInstance { + // For safety, strictly require lease start instance to never decrease. + return api.F3ParticipationLease{}, api.ErrF3ParticipationTicketStartBeforeExisting + } + l.leases[newLease.MinerID] = newLease + return newLease, nil +} + +func (l *leaser) getParticipantsByInstance(instance uint64) []uint64 { + l.mutex.Lock() + defer l.mutex.Unlock() + var participants []uint64 + for id, lease := range l.leases { + if instance > lease.FromInstance+lease.ValidityTerm { + // Lazily delete the expired leases. + delete(l.leases, id) + } else { + participants = append(participants, id) + } + } + return participants +} + +func (l *leaser) newParticipationTicket(nn gpbft.NetworkName, participant uint64, from uint64, instances uint64) (api.F3ParticipationTicket, error) { + // Lotus node API and miners run in a trusted environment. For now we make the + // ticket to simply be the CBOR encoding of the lease. In the future, where the + // assumptions of trust may no longer hold, ticket could be encrypted and + // decrypted at the time of issuing the actual lease. + var buf bytes.Buffer + if err := (&api.F3ParticipationLease{ + Network: nn, + Issuer: l.issuer, + MinerID: participant, + FromInstance: from, + ValidityTerm: instances, + }).MarshalCBOR(&buf); err != nil { + return nil, xerrors.Errorf("issuing participation ticket: %w", err) + } + return buf.Bytes(), nil +} + +func (l *leaser) validate(currentNetwork gpbft.NetworkName, currentInstance uint64, t api.F3ParticipationTicket) (api.F3ParticipationLease, error) { + var lease api.F3ParticipationLease + reader := bytes.NewReader(t) + if err := lease.UnmarshalCBOR(reader); err != nil { + return api.F3ParticipationLease{}, api.ErrF3ParticipationTicketInvalid + } + + // Combine the errors to remove significance of the order by which they are + // checked outside if this function. + var err error + if currentNetwork != lease.Network || currentInstance > lease.FromInstance+lease.ValidityTerm { + err = multierr.Append(err, api.ErrF3ParticipationTicketExpired) + } + if l.issuer != lease.Issuer { + err = multierr.Append(err, api.ErrF3ParticipationIssuerMismatch) + } + if lease.ValidityTerm > l.maxLeasableInstances { + err = multierr.Append(err, api.ErrF3ParticipationTooManyInstances) + } + if err != nil { + return api.F3ParticipationLease{}, err + } + return lease, nil +} diff --git a/chain/lf3/participation_lease_test.go b/chain/lf3/participation_lease_test.go new file mode 100644 index 00000000000..731c1ba5be3 --- /dev/null +++ b/chain/lf3/participation_lease_test.go @@ -0,0 +1,173 @@ +package lf3 + +import ( + "testing" + "time" + + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/go-f3/gpbft" + "github.com/filecoin-project/go-f3/manifest" + + "github.com/filecoin-project/lotus/api" +) + +func TestLeaser(t *testing.T) { + nodeID := peer.ID("peerID") + progress := mockProgress{currentInstance: 10} + subject := newParticipationLeaser(nodeID, progress.Progress, 5) + + t.Run("participate", func(t *testing.T) { + ticket, err := subject.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + + lease, err := subject.participate(ticket) + require.NoError(t, err) + require.Equal(t, uint64(123), lease.MinerID) + require.Equal(t, nodeID, lease.Issuer) + require.Equal(t, uint64(5), lease.ValidityTerm) // Current instance (10) + offset (5) + }) + t.Run("get participants", func(t *testing.T) { + progress.currentInstance = 11 + ticket1, err := subject.getOrRenewParticipationTicket(123, nil, 4) + require.NoError(t, err) + ticket2, err := subject.getOrRenewParticipationTicket(456, nil, 5) + require.NoError(t, err) + + _, err = subject.participate(ticket1) + require.NoError(t, err) + _, err = subject.participate(ticket2) + require.NoError(t, err) + + // Both participants should still be valid. + participants := subject.getParticipantsByInstance(11) + require.Len(t, participants, 2) + require.Contains(t, participants, uint64(123)) + require.Contains(t, participants, uint64(456)) + + // After instance 16, only participant 456 should be valid. + participants = subject.getParticipantsByInstance(16) + require.Len(t, participants, 1) + require.Contains(t, participants, uint64(456)) + + // After instance 17, no participant must have a lease. + participants = subject.getParticipantsByInstance(17) + require.Empty(t, participants) + }) + t.Run("expired ticket", func(t *testing.T) { + ticket, err := subject.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + + progress.currentInstance += 10 + lease, err := subject.participate(ticket) + require.ErrorIs(t, err, api.ErrF3ParticipationTicketExpired) + require.Zero(t, lease) + }) + t.Run("too many instances", func(t *testing.T) { + ticket, err := subject.getOrRenewParticipationTicket(123, nil, 6) + require.Error(t, err, api.ErrF3ParticipationTooManyInstances) + require.Nil(t, ticket) + + // Generate a token from the same subject but with higher term, then assert that + // original subject with lower term rejects it. + subjectSpoofWithHigherMaxLease := newParticipationLeaser(nodeID, progress.Progress, 6) + ticket, err = subjectSpoofWithHigherMaxLease.getOrRenewParticipationTicket(123, nil, 6) + require.NoError(t, err) + require.NotEmpty(t, ticket) + lease, err := subject.participate(ticket) + require.ErrorIs(t, err, api.ErrF3ParticipationTooManyInstances) + require.Zero(t, lease) + + }) + t.Run("invalid ticket", func(t *testing.T) { + lease, err := subject.participate([]byte("ghoti")) + require.ErrorIs(t, err, api.ErrF3ParticipationTicketInvalid) + require.Zero(t, lease) + }) + t.Run("issuer mismatch", func(t *testing.T) { + anotherIssuer := newParticipationLeaser("barreleye", progress.Progress, 5) + ticket, err := anotherIssuer.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + lease, err := subject.participate(ticket) + require.ErrorIs(t, err, api.ErrF3ParticipationIssuerMismatch) + require.Zero(t, lease) + }) + t.Run("never decreasing start", func(t *testing.T) { + progress.currentInstance++ + earlierTicket, err := subject.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + progress.currentInstance++ + laterTicket, err := subject.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + + lease, err := subject.participate(laterTicket) + require.NoError(t, err) + require.Equal(t, uint64(123), lease.MinerID) + require.Equal(t, uint64(5), lease.ValidityTerm) + require.Equal(t, progress.currentInstance, lease.FromInstance) + + lease, err = subject.participate(earlierTicket) + require.ErrorIs(t, err, api.ErrF3ParticipationTicketStartBeforeExisting) + require.Zero(t, lease) + }) + t.Run("expired previous ticket", func(t *testing.T) { + previous, err := subject.getOrRenewParticipationTicket(123, nil, 5) + require.NoError(t, err) + + // Get or renew without progress + newTicket, err := subject.getOrRenewParticipationTicket(123, previous, 5) + require.NoError(t, err) + require.NotNil(t, newTicket) + require.Equal(t, previous, newTicket) + + // Get or renew with overlapping validity progress + progress.currentInstance += 3 + newTicket, err = subject.getOrRenewParticipationTicket(123, previous, 5) + require.NoError(t, err) + require.NotNil(t, newTicket) + require.NotEqual(t, previous, newTicket) + + // Get or renew with expired previous + progress.currentInstance += 10 + newTicket, err = subject.getOrRenewParticipationTicket(123, previous, 5) + require.NoError(t, err) + require.NotNil(t, newTicket) + require.NotEqual(t, previous, newTicket) + + // Get or renew with valid but mismatching issuer + progress.currentInstance -= 10 + anotherIssuer := newParticipationLeaser("barreleye", progress.Progress, 5) + newTicket, err = anotherIssuer.getOrRenewParticipationTicket(123, previous, 5) + require.ErrorIs(t, err, api.ErrF3ParticipationIssuerMismatch) + require.Empty(t, newTicket) + + // Get or renew with expired but mismatching issuer + progress.currentInstance += 10 + newTicket, err = anotherIssuer.getOrRenewParticipationTicket(123, previous, 5) + require.NoError(t, err) + require.NotNil(t, newTicket) + require.NotEqual(t, previous, newTicket) + + // Get or renew with expired but mismatching session + progress.currentInstance -= 10 + subjectAtNewSession := newParticipationLeaser(nodeID, progress.Progress, 5) + newTicket, err = subjectAtNewSession.getOrRenewParticipationTicket(123, previous, 5) + require.NoError(t, err) + require.NotNil(t, newTicket) + require.NotEqual(t, previous, newTicket) + }) +} + +var testManifest = NewManifest("fakenet", 30, 30, 30*time.Second, cid.Undef) + +type mockProgress struct{ currentInstance uint64 } + +func (m *mockProgress) Progress() (*manifest.Manifest, gpbft.Instant) { + return testManifest, gpbft.Instant{ + ID: m.currentInstance, + Round: 0, + Phase: gpbft.INITIAL_PHASE, + } +} diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index a9854d922b3..24bd9838a29 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -90,6 +90,8 @@ * [F3GetF3PowerTable](#F3GetF3PowerTable) * [F3GetLatestCertificate](#F3GetLatestCertificate) * [F3GetManifest](#F3GetManifest) + * [F3GetOrRenewParticipationTicket](#F3GetOrRenewParticipationTicket) + * [F3GetProgress](#F3GetProgress) * [F3IsRunning](#F3IsRunning) * [F3Participate](#F3Participate) * [Filecoin](#Filecoin) @@ -2337,7 +2339,7 @@ Response: `true` ### F3GetCertificate -F3GetCertificate returns a finality certificate at given instance number +F3GetCertificate returns a finality certificate at given instance. Perms: read @@ -2462,7 +2464,7 @@ Response: ``` ### F3GetLatestCertificate -F3GetLatestCertificate returns the latest finality certificate +F3GetLatestCertificate returns the latest finality certificate. Perms: read @@ -2520,7 +2522,7 @@ Response: ``` ### F3GetManifest -F3GetGetManifest returns the current manifest being used for F3 +F3GetManifest returns the current manifest being used for F3 operations. Perms: read @@ -2566,6 +2568,58 @@ Response: } ``` +### F3GetOrRenewParticipationTicket +F3GetOrRenewParticipationTicket retrieves or renews a participation ticket +necessary for a miner to engage in the F3 consensus process for the given +number of instances. + +This function accepts an optional previous ticket. If provided, a new ticket +will be issued only under one the following conditions: + 1. The previous ticket has expired. + 2. The issuer of the previous ticket matches the node processing this + request. + +If there is an issuer mismatch (ErrF3ParticipationIssuerMismatch), the miner +must retry obtaining a new ticket to ensure it is only participating in one F3 +instance at any time. If the number of instances is beyond the maximum leasable +participation instances accepted by the node ErrF3ParticipationTooManyInstances +is returned. + +Note: Successfully acquiring a ticket alone does not constitute participation. +The retrieved ticket must be used to invoke F3Participate to actively engage +in the F3 consensus process. + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "Bw==", + 42 +] +``` + +Response: `"Bw=="` + +### F3GetProgress +F3GetProgress returns the progress of the current F3 instance in terms of instance ID, round and phase. + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "ID": 42, + "Round": 42, + "Phase": 0 +} +``` + ### F3IsRunning F3IsRunning returns true if the F3 instance is running, false if it's not running but it's enabled, and an error when disabled entirely. @@ -2578,18 +2632,25 @@ Inputs: `null` Response: `true` ### F3Participate -F3Participate should be called by a storage provider to participate in signing F3 consensus. -Calling this API gives the lotus node a lease to sign in F3 on behalf of given SP. -The lease should be active only on one node. The lease will expire at the newLeaseExpiration. -To continue participating in F3 with the given node, call F3Participate again before -the newLeaseExpiration time. -newLeaseExpiration cannot be further than 5 minutes in the future. -It is recommended to call F3Participate every 60 seconds -with newLeaseExpiration set 2min into the future. -The oldLeaseExpiration has to be set to newLeaseExpiration of the last successful call. -For the first call to F3Participate, set the oldLeaseExpiration to zero value/time in the past. -F3Participate will return true if the lease was accepted. -The minerID has to be the ID address of the miner. +F3Participate enrolls a storage provider in the F3 consensus process using a +provided participation ticket. This ticket grants a temporary lease that enables +the provider to sign transactions as part of the F3 consensus. + +The function verifies the ticket's validity and checks if the ticket's issuer +aligns with the current node. If there is an issuer mismatch +(ErrF3ParticipationIssuerMismatch), the provider should retry with the same +ticket, assuming the issue is due to transient network problems or operational +deployment conditions. If the ticket is invalid +(ErrF3ParticipationTicketInvalid) or has expired +(ErrF3ParticipationTicketExpired), the provider must obtain a new ticket by +calling F3GetOrRenewParticipationTicket. + +The start instance associated to the given ticket cannot be less than the +start instance of any existing lease held by the miner. Otherwise, +ErrF3ParticipationTicketStartBeforeExisting is returned. In this case, the +miner should acquire a new ticket before attempting to participate again. + +For details on obtaining or renewing a ticket, see F3GetOrRenewParticipationTicket. Perms: sign @@ -2597,13 +2658,20 @@ Perms: sign Inputs: ```json [ - "f01234", - "0001-01-01T00:00:00Z", - "0001-01-01T00:00:00Z" + "Bw==" ] ``` -Response: `true` +Response: +```json +{ + "Network": "filecoin", + "Issuer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "MinerID": 42, + "FromInstance": 42, + "ValidityTerm": 42 +} +``` ## Filecoin diff --git a/gen/main.go b/gen/main.go index da343ea03b4..1752661bd13 100644 --- a/gen/main.go +++ b/gen/main.go @@ -126,6 +126,7 @@ func generateNodeHello() error { func generateApi() error { return gen.WriteMapEncodersToFile("./api/cbor_gen.go", "api", + api.F3ParticipationLease{}, api.PaymentInfo{}, api.SealedRef{}, api.SealedRefs{}, diff --git a/go.mod b/go.mod index 2fee44d90ad..80ac4baa982 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils/v2 v2.1.0 github.com/filecoin-project/go-crypto v0.1.0 - github.com/filecoin-project/go-f3 v0.4.0 + github.com/filecoin-project/go-f3 v0.7.0 github.com/filecoin-project/go-fil-commcid v0.2.0 github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 github.com/filecoin-project/go-jsonrpc v0.6.0 diff --git a/go.sum b/go.sum index ff09fd9a65a..1385adb9021 100644 --- a/go.sum +++ b/go.sum @@ -273,8 +273,8 @@ github.com/filecoin-project/go-commp-utils/v2 v2.1.0/go.mod h1:NbxJYlhxtWaNhlVCj github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.1.0 h1:Pob2MphoipMbe/ksxZOMcQvmBHAd3sI/WEqcbpIsGI0= github.com/filecoin-project/go-crypto v0.1.0/go.mod h1:K9UFXvvoyAVvB+0Le7oGlKiT9mgA5FHOJdYQXEE8IhI= -github.com/filecoin-project/go-f3 v0.4.0 h1:3UUjFMmZYvytDZPI5oeMroaEGO691icQM/7XoioYVxg= -github.com/filecoin-project/go-f3 v0.4.0/go.mod h1:QoxuoK4aktNZD1R/unlhNbhV6TnlNTAbA/QODCnAjak= +github.com/filecoin-project/go-f3 v0.7.0 h1:JNo39SAELT5hEn+rmQZbSJQBJfmGJtp70RfyWJrIayY= +github.com/filecoin-project/go-f3 v0.7.0/go.mod h1:QoxuoK4aktNZD1R/unlhNbhV6TnlNTAbA/QODCnAjak= github.com/filecoin-project/go-fil-commcid v0.2.0 h1:B+5UX8XGgdg/XsdUpST4pEBviKkFOw+Fvl2bLhSKGpI= github.com/filecoin-project/go-fil-commcid v0.2.0/go.mod h1:8yigf3JDIil+/WpqR5zoKyP0jBPCOGtEqq/K1CcMy9Q= github.com/filecoin-project/go-fil-commp-hashhash v0.2.0 h1:HYIUugzjq78YvV3vC6rL95+SfC/aSTVSnZSZiDV5pCk= diff --git a/itests/f3_test.go b/itests/f3_test.go index f3a1ce65619..0a96fa4d54f 100644 --- a/itests/f3_test.go +++ b/itests/f3_test.go @@ -5,15 +5,18 @@ import ( "testing" "time" + "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/host" "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" + "github.com/filecoin-project/go-f3/gpbft" "github.com/filecoin-project/go-f3/manifest" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/lf3" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/node" @@ -21,8 +24,9 @@ import ( ) const ( - DefaultBootsrapEpoch = 20 - DefaultFinality = 5 + DefaultBootstrapEpoch = 20 + DefaultFinality = 5 + BaseNetworkName gpbft.NetworkName = "test" ) type testEnv struct { @@ -61,7 +65,7 @@ func TestF3_Rebootstrap(t *testing.T) { cpy := *e.m cpy.BootstrapEpoch = 25 - cpy.NetworkName += "/1" + cpy.NetworkName = BaseNetworkName + "/2" e.ms.UpdateManifest(&cpy) newManifest := e.waitTillManifestChange(&cpy, 20*time.Second) @@ -90,7 +94,7 @@ func TestF3_PauseAndRebootstrap(t *testing.T) { e.waitTillF3Runs(30 * time.Second) cpy := *e.m - cpy.NetworkName += "/1" + cpy.NetworkName = BaseNetworkName + "/2" cpy.BootstrapEpoch = 25 e.ms.UpdateManifest(&cpy) @@ -98,6 +102,35 @@ func TestF3_PauseAndRebootstrap(t *testing.T) { e.waitTillF3Rebootstrap(20 * time.Second) } +// Tests that pause/resume and rebootstrapping F3 works +func TestF3_Bootstrap(t *testing.T) { + kit.QuietMiningLogs() + + var bootstrapEpoch abi.ChainEpoch = 50 + blocktime := 100 * time.Millisecond + staticManif := lf3.NewManifest(BaseNetworkName, DefaultFinality, bootstrapEpoch, blocktime, cid.Undef) + dynamicManif := *staticManif + dynamicManif.BootstrapEpoch = 5 + dynamicManif.EC.Finalize = false + dynamicManif.NetworkName = BaseNetworkName + "/1" + + e := setupWithStaticManifest(t, staticManif, true) + e.ms.UpdateManifest(&dynamicManif) + e.waitTillManifestChange(&dynamicManif, 20*time.Second) + e.waitTillF3Instance(2, 20*time.Second) + e.waitTillManifestChange(staticManif, 20*time.Second) + e.waitTillF3Instance(2, 20*time.Second) + + // Try to switch back, we should ignore the manifest update. + e.ms.UpdateManifest(&dynamicManif) + time.Sleep(time.Second) + for _, n := range e.minerFullNodes { + m, err := n.F3GetManifest(e.testCtx) + require.NoError(e.t, err) + require.True(t, m.Equal(staticManif)) + } +} + func (e *testEnv) waitTillF3Rebootstrap(timeout time.Duration) { e.waitFor(func(n *kit.TestFullNode) bool { // the prev epoch yet, check if we already bootstrapped and from @@ -176,9 +209,16 @@ func (e *testEnv) waitFor(f func(n *kit.TestFullNode) bool, timeout time.Duratio // and the second full-node is an observer that is not directly connected to // a miner. The last return value is the manifest sender for the network. func setup(t *testing.T, blocktime time.Duration) *testEnv { + manif := lf3.NewManifest(BaseNetworkName+"/1", DefaultFinality, DefaultBootstrapEpoch, blocktime, cid.Undef) + return setupWithStaticManifest(t, manif, false) +} + +func setupWithStaticManifest(t *testing.T, manif *manifest.Manifest, testBootstrap bool) *testEnv { ctx, stopServices := context.WithCancel(context.Background()) errgrp, ctx := errgroup.WithContext(ctx) + blocktime := manif.EC.Period + t.Cleanup(func() { stopServices() require.NoError(t, errgrp.Wait()) @@ -188,7 +228,15 @@ func setup(t *testing.T, blocktime time.Duration) *testEnv { manifestServerHost, err := libp2p.New(libp2p.ListenAddrStrings("/ip4/127.0.0.1/udp/0/quic-v1")) require.NoError(t, err) - f3NOpt := kit.F3Enabled(DefaultBootsrapEpoch, blocktime, DefaultFinality, manifestServerHost.ID()) + cfg := &lf3.Config{ + BaseNetworkName: BaseNetworkName, + StaticManifest: manif, + DynamicManifestProvider: manifestServerHost.ID(), + PrioritizeStaticManifest: testBootstrap, + AllowDynamicFinalize: !testBootstrap, + } + + f3NOpt := kit.F3Enabled(cfg) f3MOpt := kit.ConstructorOpts(node.Override(node.F3Participation, modules.F3Participation)) var ( diff --git a/itests/kit/node_opts.go b/itests/kit/node_opts.go index 6755988caa9..6a50e60ff79 100644 --- a/itests/kit/node_opts.go +++ b/itests/kit/node_opts.go @@ -2,11 +2,6 @@ package kit import ( "math" - "time" - - "github.com/ipfs/go-cid" - pubsub "github.com/libp2p/go-libp2p-pubsub" - "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-f3/manifest" "github.com/filecoin-project/go-state-types/abi" @@ -215,28 +210,10 @@ func MutateSealingConfig(mut func(sc *config.SealingConfig)) NodeOpt { }))) } -func F3Enabled(bootstrapEpoch abi.ChainEpoch, blockDelay time.Duration, finality abi.ChainEpoch, manifestProvider peer.ID) NodeOpt { +func F3Enabled(cfg *lf3.Config) NodeOpt { return ConstructorOpts( - node.Override(new(*lf3.Config), func(nn dtypes.NetworkName) *lf3.Config { - c := lf3.NewConfig(manifestProvider, cid.Undef)(nn) - c.InitialManifest.Pause = false - c.InitialManifest.EC.Period = blockDelay - c.InitialManifest.Gpbft.Delta = blockDelay / 5 - c.InitialManifest.EC.Finality = int64(finality) - c.InitialManifest.BootstrapEpoch = int64(bootstrapEpoch) - c.InitialManifest.EC.HeadLookback = 0 - c.InitialManifest.EC.Finalize = true - c.InitialManifest.CatchUpAlignment = blockDelay / 2 - c.InitialManifest.CertificateExchange.MinimumPollInterval = 2 * blockDelay - c.InitialManifest.CertificateExchange.MaximumPollInterval = 10 * blockDelay - return c - }), - node.Override(new(manifest.ManifestProvider), - func(config *lf3.Config, ps *pubsub.PubSub) (manifest.ManifestProvider, error) { - return manifest.NewDynamicManifestProvider(ps, config.DynamicManifestProvider, - manifest.DynamicManifestProviderWithInitialManifest(config.InitialManifest), - ) - }), + node.Override(new(*lf3.Config), cfg), + node.Override(new(manifest.ManifestProvider), lf3.NewManifestProvider), node.Override(new(*lf3.F3), lf3.New), ) } diff --git a/node/builder_chain.go b/node/builder_chain.go index 480c5cb27f6..d367ab4e3eb 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -13,7 +13,6 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/build/buildconstants" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/beacon" "github.com/filecoin-project/lotus/chain/consensus" @@ -165,10 +164,7 @@ var ChainNode = Options( ), If(build.IsF3Enabled(), - Override(new(*lf3.Config), lf3.NewConfig( - buildconstants.F3ManifestServerID, - buildconstants.F3InitialPowerTableCID, - )), + Override(new(*lf3.Config), lf3.NewConfig), Override(new(manifest.ManifestProvider), lf3.NewManifestProvider), Override(new(*lf3.F3), lf3.New), ), diff --git a/node/impl/full/f3.go b/node/impl/full/f3.go index 8e88afe89fe..84a79d72c8d 100644 --- a/node/impl/full/f3.go +++ b/node/impl/full/f3.go @@ -2,8 +2,6 @@ package full import ( "context" - "errors" - "time" "go.uber.org/fx" "golang.org/x/xerrors" @@ -13,6 +11,7 @@ import ( "github.com/filecoin-project/go-f3/gpbft" "github.com/filecoin-project/go-f3/manifest" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/lf3" "github.com/filecoin-project/lotus/chain/types" ) @@ -23,67 +22,72 @@ type F3API struct { F3 *lf3.F3 `optional:"true"` } -var ErrF3Disabled = errors.New("f3 is disabled") - -func (f3api *F3API) F3Participate(ctx context.Context, miner address.Address, - newLeaseExpiration time.Time, oldLeaseExpiration time.Time) (bool, error) { - - if leaseDuration := time.Until(newLeaseExpiration); leaseDuration > 5*time.Minute { - return false, xerrors.Errorf("F3 participation lease too long: %v > 5 min", leaseDuration) - } else if leaseDuration < 0 { - return false, xerrors.Errorf("F3 participation lease is in the past: %d < 0", leaseDuration) - } - +func (f3api *F3API) F3GetOrRenewParticipationTicket(ctx context.Context, miner address.Address, previous api.F3ParticipationTicket, instances uint64) (api.F3ParticipationTicket, error) { if f3api.F3 == nil { - log.Infof("F3Participate called for %v, F3 is disabled", miner) - return false, ErrF3Disabled + log.Infof("F3GetParticipationTicket called for %v, F3 is disabled", miner) + return api.F3ParticipationTicket{}, api.ErrF3Disabled } minerID, err := address.IDFromAddress(miner) if err != nil { - return false, xerrors.Errorf("miner address is not of ID type: %v: %w", miner, err) + return api.F3ParticipationTicket{}, xerrors.Errorf("miner address is not of ID type: %v: %w", miner, err) } + return f3api.F3.GetOrRenewParticipationTicket(ctx, minerID, previous, instances) +} + +func (f3api *F3API) F3Participate(ctx context.Context, ticket api.F3ParticipationTicket) (api.F3ParticipationLease, error) { - return f3api.F3.Participate(ctx, minerID, newLeaseExpiration, oldLeaseExpiration), nil + if f3api.F3 == nil { + log.Infof("F3Participate called, F3 is disabled") + return api.F3ParticipationLease{}, api.ErrF3Disabled + } + return f3api.F3.Participate(ctx, ticket) } func (f3api *F3API) F3GetCertificate(ctx context.Context, instance uint64) (*certs.FinalityCertificate, error) { if f3api.F3 == nil { - return nil, ErrF3Disabled + return nil, api.ErrF3Disabled } return f3api.F3.GetCert(ctx, instance) } func (f3api *F3API) F3GetLatestCertificate(ctx context.Context) (*certs.FinalityCertificate, error) { if f3api.F3 == nil { - return nil, ErrF3Disabled + return nil, api.ErrF3Disabled } return f3api.F3.GetLatestCert(ctx) } -func (f3api *F3API) F3GetManifest(_ctx context.Context) (*manifest.Manifest, error) { +func (f3api *F3API) F3GetManifest(context.Context) (*manifest.Manifest, error) { if f3api.F3 == nil { - return nil, ErrF3Disabled + return nil, api.ErrF3Disabled } return f3api.F3.GetManifest(), nil } -func (f3api *F3API) F3IsRunning(_ctx context.Context) (bool, error) { +func (f3api *F3API) F3IsRunning(context.Context) (bool, error) { if f3api.F3 == nil { - return false, ErrF3Disabled + return false, api.ErrF3Disabled } return f3api.F3.IsRunning(), nil } func (f3api *F3API) F3GetECPowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { if f3api.F3 == nil { - return nil, ErrF3Disabled + return nil, api.ErrF3Disabled } return f3api.F3.GetPowerTable(ctx, tsk) } func (f3api *F3API) F3GetF3PowerTable(ctx context.Context, tsk types.TipSetKey) (gpbft.PowerEntries, error) { if f3api.F3 == nil { - return nil, ErrF3Disabled + return nil, api.ErrF3Disabled } return f3api.F3.GetF3PowerTable(ctx, tsk) } + +func (f3api *F3API) F3GetProgress(context.Context) (gpbft.Instant, error) { + if f3api.F3 == nil { + return gpbft.Instant{}, api.ErrF3Disabled + } + return f3api.F3.Progress(), nil +} diff --git a/node/modules/lp2p/pubsub.go b/node/modules/lp2p/pubsub.go index 0c8f7b291fc..20a222cd21c 100644 --- a/node/modules/lp2p/pubsub.go +++ b/node/modules/lp2p/pubsub.go @@ -388,9 +388,12 @@ func GossipSub(in GossipIn) (service *pubsub.PubSub, err error) { allowTopics = append(allowTopics, drandTopics...) if in.F3Config != nil { - f3BaseTopicName := manifest.PubSubTopicFromNetworkName(in.F3Config.InitialManifest.NetworkName) - allowTopics = append(allowTopics, f3BaseTopicName) + if in.F3Config.StaticManifest != nil { + f3TopicName := manifest.PubSubTopicFromNetworkName(in.F3Config.StaticManifest.NetworkName) + allowTopics = append(allowTopics, f3TopicName) + } if in.F3Config.DynamicManifestProvider != "" { + f3BaseTopicName := manifest.PubSubTopicFromNetworkName(in.F3Config.BaseNetworkName) allowTopics = append(allowTopics, manifest.ManifestPubSubTopicName) for i := 0; i < lf3.MaxDynamicManifestChangesAllowed; i++ { allowTopics = append(allowTopics, fmt.Sprintf("%s/%d", f3BaseTopicName, i)) diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 74e20fba89a..b37ebd52ba5 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -5,6 +5,7 @@ import ( "errors" "net/http" "strings" + "sync" "time" "github.com/google/uuid" @@ -34,7 +35,6 @@ import ( "github.com/filecoin-project/lotus/journal" lotusminer "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node/config" - "github.com/filecoin-project/lotus/node/impl/full" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/modules/helpers" "github.com/filecoin-project/lotus/node/repo" @@ -357,78 +357,217 @@ func SectorStorage(mctx helpers.MetricsCtx, lc fx.Lifecycle, lstor *paths.Local, return sst, nil } -func F3Participation(mctx helpers.MetricsCtx, lc fx.Lifecycle, api v1api.FullNode, minerAddress dtypes.MinerAddress) error { - ctx := helpers.LifecycleCtx(mctx, lc) - b := &backoff.Backoff{ - Min: 1 * time.Second, - Max: 1 * time.Minute, - Factor: 1.5, - Jitter: false, +type f3Participator struct { + node v1api.FullNode + participant address.Address + backoff *backoff.Backoff + maxCheckProgressAttempts int + previousTicket api.F3ParticipationTicket + checkProgressInterval time.Duration + leaseTerm uint64 +} + +func newF3Participator(node v1api.FullNode, participant dtypes.MinerAddress, backoff *backoff.Backoff, maxCheckProgress int, checkProgressInterval time.Duration, leaseTerm uint64) *f3Participator { + return &f3Participator{ + node: node, + participant: address.Address(participant), + backoff: backoff, + maxCheckProgressAttempts: maxCheckProgress, + checkProgressInterval: checkProgressInterval, + leaseTerm: leaseTerm, } - go func() { - timer := time.NewTimer(0) - defer timer.Stop() +} - if !timer.Stop() { - <-timer.C +func (p *f3Participator) participate(ctx context.Context) error { + for ctx.Err() == nil { + if ticket, err := p.tryGetF3ParticipationTicket(ctx); err != nil { + return err + } else if lease, participating, err := p.tryF3Participate(ctx, ticket); err != nil { + return err + } else if !participating { + continue + } else if err := p.awaitLeaseExpiry(ctx, lease); err != nil { + return err } + log.Info("Restarting F3 participation") + } + return ctx.Err() +} - leaseTime := 120 * time.Second - // start with some time in the past - oldLease := time.Now().Add(-24 * time.Hour) - - for ctx.Err() == nil { - newLease := time.Now().Add(leaseTime) +func (p *f3Participator) tryGetF3ParticipationTicket(ctx context.Context) (api.F3ParticipationTicket, error) { + p.backoff.Reset() + for ctx.Err() == nil { + switch ticket, err := p.node.F3GetOrRenewParticipationTicket(ctx, p.participant, p.previousTicket, p.leaseTerm); { + case ctx.Err() != nil: + return api.F3ParticipationTicket{}, ctx.Err() + case errors.Is(err, api.ErrF3Disabled): + log.Errorw("Cannot participate in F3 as it is disabled.", "err", err) + return api.F3ParticipationTicket{}, xerrors.Errorf("acquiring F3 participation ticket: %w", err) + case err != nil: + log.Errorw("Failed to acquire F3 participation ticket; retrying after backoff", "backoff", p.backoff.Duration(), "err", err) + p.backOff(ctx) + log.Debugw("Reattempting to acquire F3 participation ticket.", "attempts", p.backoff.Attempt()) + continue + default: + log.Debug("Successfully acquired F3 participation ticket") + return ticket, nil + } + } + return api.F3ParticipationTicket{}, ctx.Err() +} - ok, err := api.F3Participate(ctx, address.Address(minerAddress), newLease, oldLease) +func (p *f3Participator) tryF3Participate(ctx context.Context, ticket api.F3ParticipationTicket) (api.F3ParticipationLease, bool, error) { + p.backoff.Reset() + for ctx.Err() == nil { + switch lease, err := p.node.F3Participate(ctx, ticket); { + case ctx.Err() != nil: + return api.F3ParticipationLease{}, false, ctx.Err() + case errors.Is(err, api.ErrF3Disabled): + log.Errorw("Cannot participate in F3 as it is disabled.", "err", err) + return api.F3ParticipationLease{}, false, xerrors.Errorf("attempting F3 participation with ticket: %w", err) + case errors.Is(err, api.ErrF3ParticipationTicketExpired): + log.Warnw("F3 participation ticket expired while attempting to participate. Acquiring a new ticket.", "attempts", p.backoff.Attempt(), "err", err) + return api.F3ParticipationLease{}, false, nil + case errors.Is(err, api.ErrF3ParticipationTicketStartBeforeExisting): + log.Warnw("F3 participation ticket starts before the existing lease. Acquiring a new ticket.", "attempts", p.backoff.Attempt(), "err", err) + return api.F3ParticipationLease{}, false, nil + case errors.Is(err, api.ErrF3ParticipationTicketInvalid): + log.Errorw("F3 participation ticket is not valid. Acquiring a new ticket after backoff.", "backoff", p.backoff.Duration(), "attempts", p.backoff.Attempt(), "err", err) + p.backOff(ctx) + return api.F3ParticipationLease{}, false, nil + case errors.Is(err, api.ErrF3ParticipationIssuerMismatch): + log.Warnw("Node is not the issuer of F3 participation ticket. Miner maybe load-balancing or node has changed. Retrying F3 participation after backoff.", "backoff", p.backoff.Duration(), "err", err) + p.backOff(ctx) + log.Debugw("Reattempting F3 participation with the same ticket.", "attempts", p.backoff.Attempt()) + continue + case errors.Is(err, api.ErrF3NotReady): + log.Warnw("F3 is not ready. Retrying F3 participation after backoff.", "backoff", p.backoff.Duration(), "err", err) + p.backOff(ctx) + continue + case err != nil: + log.Errorw("Unexpected error while attempting F3 participation. Retrying after backoff", "backoff", p.backoff.Duration(), "attempts", p.backoff.Attempt(), "err", err) + p.backOff(ctx) + continue + default: + log.Infow("Successfully acquired F3 participation lease.", "issuer", lease.Issuer, "expiry", lease.ValidityTerm) + p.previousTicket = ticket + return lease, true, nil + } + } + return api.F3ParticipationLease{}, false, ctx.Err() +} - if ctx.Err() != nil { - return - } - if errors.Is(err, full.ErrF3Disabled) { - log.Errorf("Cannot participate in F3 as it is disabled: %+v", err) - return +func (p *f3Participator) awaitLeaseExpiry(ctx context.Context, lease api.F3ParticipationLease) error { + p.backoff.Reset() + for ctx.Err() == nil { + switch manifest, err := p.node.F3GetManifest(ctx); { + case errors.Is(err, api.ErrF3Disabled): + log.Errorw("Cannot await F3 participation lease expiry as F3 is disabled.", "err", err) + return xerrors.Errorf("awaiting F3 participation lease expiry: %w", err) + case err != nil: + if p.backoff.Attempt() > float64(p.maxCheckProgressAttempts) { + log.Errorw("Too many failures while attempting to check F3 progress. Restarting participation.", "attempts", p.backoff.Attempt(), "err", err) + return nil } - if err != nil { - log.Errorf("while starting to participate in F3: %+v", err) - // use exponential backoff to avoid hotloop - timer.Reset(b.Duration()) - select { - case <-ctx.Done(): - return - case <-timer.C: - } - continue + log.Errorw("Failed to check F3 progress while awaiting lease expiry. Retrying after backoff.", "attempts", p.backoff.Attempt(), "backoff", p.backoff.Duration(), "err", err) + p.backOff(ctx) + case manifest.NetworkName != lease.Network: + return nil + } + switch progress, err := p.node.F3GetProgress(ctx); { + case errors.Is(err, api.ErrF3Disabled): + log.Errorw("Cannot await F3 participation lease expiry as F3 is disabled.", "err", err) + return xerrors.Errorf("awaiting F3 participation lease expiry: %w", err) + case err != nil: + if p.backoff.Attempt() > float64(p.maxCheckProgressAttempts) { + log.Errorw("Too many failures while attempting to check F3 progress. Restarting participation.", "attempts", p.backoff.Attempt(), "err", err) + return nil } - if !ok { - log.Errorf("lotus node refused our lease, are you loadbalancing or did the miner just restart?") + log.Errorw("Failed to check F3 progress while awaiting lease expiry. Retrying after backoff.", "attempts", p.backoff.Attempt(), "backoff", p.backoff.Duration(), "err", err) + p.backOff(ctx) + case progress.ID+2 >= lease.ValidityTerm: + log.Infof("F3 progressed (%d) to within two instances of lease expiry (%d). Restarting participation.", progress.ID, lease.ValidityTerm) + return nil + default: + remainingInstanceLease := lease.ValidityTerm - progress.ID + log.Debugf("F3 participation lease is valid for further %d instances. Recking after %s.", remainingInstanceLease, p.checkProgressInterval) + p.backOffFor(ctx, p.checkProgressInterval) + } + } + return ctx.Err() +} - sleepFor := b.Duration() - if d := time.Until(oldLease); d > 0 && d < sleepFor { - sleepFor = d - } - timer.Reset(sleepFor) - select { - case <-ctx.Done(): - return - case <-timer.C: - } - continue - } +func (p *f3Participator) backOff(ctx context.Context) { + p.backOffFor(ctx, p.backoff.Duration()) +} + +func (p *f3Participator) backOffFor(ctx context.Context, d time.Duration) { + // Create a timer every time to avoid potential risk of deadlock or the need for + // mutex despite the fact that f3Participator is never (and should never) be + // called from multiple goroutines. + timer := time.NewTimer(d) + defer timer.Stop() + select { + case <-ctx.Done(): + return + case <-timer.C: + } +} - // we have succeeded in giving a lease, reset the backoff - b.Reset() +func F3Participation(mctx helpers.MetricsCtx, lc fx.Lifecycle, node v1api.FullNode, participant dtypes.MinerAddress) error { + const ( + // maxCheckProgressAttempts defines the maximum number of failed attempts + // before we abandon the current lease and restart the participation process. + // + // The default backoff takes 12 attempts to reach a maximum delay of 1 minute. + // Allowing for 13 failures results in approximately 2 minutes of backoff since + // the lease was granted. Given a lease validity of up to 5 instances, this means + // we would give up on checking the lease during its mid-validity period; + // typically when we would try to renew the participation ticket. Hence, the value + // to 13. + checkProgressMaxAttempts = 13 + // checkProgressInterval defines the duration between progress checks in normal operation mode. + // This interval is used when there are no errors in retrieving the current progress. + checkProgressInterval = 10 * time.Second + // leaseTerm The number of instances the miner will attempt to lease from nodes. + leaseTerm = 5 + ) + + participator := newF3Participator( + node, + participant, + &backoff.Backoff{ + Min: 1 * time.Second, + Max: 1 * time.Minute, + Factor: 1.5, + }, + checkProgressMaxAttempts, + checkProgressInterval, + leaseTerm, + ) - oldLease = newLease - // wait for the half of the lease time and then refresh - timer.Reset(leaseTime / 2) - select { - case <-ctx.Done(): - return - case <-timer.C: - } - } - }() + ctx, cancel := context.WithCancel(mctx) + var wg sync.WaitGroup + lc.Append(fx.Hook{ + OnStart: func(context.Context) error { + wg.Add(1) + go func() { + defer wg.Done() + switch err := participator.participate(ctx); { + case err == nil, ctx.Err() != nil: + log.Infof("Stopped participating in F3") + default: + log.Errorw("F3 participation stopped abruptly", "err", err) + } + }() + return nil + }, + OnStop: func(context.Context) error { + cancel() + wg.Wait() + return nil + }, + }) return nil }