From b5c88d57146fc6b2e503b453046e8814d54d8fc1 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Tue, 7 Mar 2023 19:36:11 +0200 Subject: [PATCH 01/18] try to add statenetworkname method --- api/api_gateway.go | 2 ++ api/proxy_gen.go | 31 +++++++++++++++++++++---------- api/v0api/gateway.go | 2 ++ api/v0api/proxy_gen.go | 23 +++++++++++++++++------ gateway/node.go | 2 ++ 5 files changed, 44 insertions(+), 16 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index 2e877fb1a..62f4be87f 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/lotus/node/modules/dtypes" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" @@ -63,6 +64,7 @@ type Gateway interface { StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (MinerInfo, error) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) StateMinerPower(context.Context, address.Address, types.TipSetKey) (*MinerPower, error) + StateNetworkName(context.Context) (dtypes.NetworkName, error) StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index ef257e69b..661e50976 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -7,15 +7,6 @@ import ( "encoding/json" "time" - "github.com/google/uuid" - "github.com/ipfs/go-cid" - blocks "github.com/ipfs/go-libipfs/blocks" - "github.com/libp2p/go-libp2p/core/metrics" - "github.com/libp2p/go-libp2p/core/network" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/protocol" - "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -32,7 +23,6 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" - apitypes "github.com/filecoin-project/lotus/api/types" builtinactors "github.com/filecoin-project/lotus/chain/actors/builtin" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -45,6 +35,14 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/sealtasks" "github.com/filecoin-project/lotus/storage/sealer/storiface" + "github.com/google/uuid" + "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" + "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -754,6 +752,8 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `` StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) `perm:"read"` @@ -4750,6 +4750,17 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A return nil, ErrNotSupported } +func (s *GatewayStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + if s.Internal.StateNetworkName == nil { + return *new(dtypes.NetworkName), ErrNotSupported + } + return s.Internal.StateNetworkName(p0) +} + +func (s *GatewayStub) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + return *new(dtypes.NetworkName), ErrNotSupported +} + func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) { if s.Internal.StateNetworkVersion == nil { return *new(apitypes.NetworkVersion), ErrNotSupported diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index 674371c14..fcbc714b3 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" ) @@ -59,6 +60,7 @@ type Gateway interface { StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (api.MinerInfo, error) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) StateMinerPower(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error) + StateNetworkName(context.Context) (dtypes.NetworkName, error) StateNetworkVersion(context.Context, types.TipSetKey) (abinetwork.Version, error) StateSearchMsg(ctx context.Context, msg cid.Cid) (*api.MsgLookup, error) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 5fa0d949c..b8359fb42 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,11 +5,6 @@ package v0api import ( "context" - "github.com/ipfs/go-cid" - blocks "github.com/ipfs/go-libipfs/blocks" - "github.com/libp2p/go-libp2p/core/peer" - "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -22,7 +17,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -30,6 +24,10 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" + "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" + "github.com/libp2p/go-libp2p/core/peer" + "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -481,6 +479,8 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) `` StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `` @@ -2842,6 +2842,17 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A return nil, ErrNotSupported } +func (s *GatewayStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + if s.Internal.StateNetworkName == nil { + return *new(dtypes.NetworkName), ErrNotSupported + } + return s.Internal.StateNetworkName(p0) +} + +func (s *GatewayStub) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + return *new(dtypes.NetworkName), ErrNotSupported +} + func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { if s.Internal.StateNetworkVersion == nil { return *new(abinetwork.Version), ErrNotSupported diff --git a/gateway/node.go b/gateway/node.go index 90a6812b5..ac83f12bc 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -25,6 +25,7 @@ import ( _ "github.com/filecoin-project/lotus/lib/sigs/bls" _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/impl/full" ) @@ -71,6 +72,7 @@ type TargetAPI interface { StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MarketBalance, error) StateMarketStorageDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*api.MarketDeal, error) + StateNetworkName(context.Context) (dtypes.NetworkName, error) StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*api.MsgLookup, error) StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*api.MsgLookup, error) From 857b0205a8c478b38fc948a05d502ea057711c08 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Tue, 7 Mar 2023 21:29:49 +0200 Subject: [PATCH 02/18] add method implementation --- gateway/proxy_fil.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index 1f6ee2ccc..ba0c98579 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" @@ -308,6 +309,13 @@ func (gw *Node) StateMarketStorageDeal(ctx context.Context, dealId abi.DealID, t return gw.target.StateMarketStorageDeal(ctx, dealId, tsk) } +func (gw *Node) StateNetworkName(ctx context.Context) (dtypes.NetworkName, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return *new(dtypes.NetworkName), err + } + return gw.target.StateNetworkName(ctx) +} + func (gw *Node) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return network.VersionMax, err From 3aac4b45ab9b47c53c0ab40b3cb20be0aa5243a8 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Tue, 7 Mar 2023 22:19:20 +0200 Subject: [PATCH 03/18] add MPoolGetNonce --- api/api_gateway.go | 1 + api/proxy_gen.go | 13 +++++++++++++ api/v0api/gateway.go | 1 + api/v0api/proxy_gen.go | 13 +++++++++++++ gateway/node.go | 1 + gateway/proxy_fil.go | 7 +++++++ 6 files changed, 36 insertions(+) diff --git a/api/api_gateway.go b/api/api_gateway.go index 62f4be87f..8de636516 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -48,6 +48,7 @@ type Gateway interface { ChainReadObj(context.Context, cid.Cid) ([]byte, error) ChainGetGenesis(context.Context) (*types.TipSet, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 661e50976..9fc69dde5 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -718,6 +718,8 @@ type GatewayMethods struct { GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `` MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `` @@ -4563,6 +4565,17 @@ func (s *GatewayStub) GasEstimateMessageGas(p0 context.Context, p1 *types.Messag return nil, ErrNotSupported } +func (s *GatewayStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + if s.Internal.MpoolGetNonce == nil { + return 0, ErrNotSupported + } + return s.Internal.MpoolGetNonce(p0, p1) +} + +func (s *GatewayStub) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return 0, ErrNotSupported +} + func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { if s.Internal.MpoolPush == nil { return *new(cid.Cid), ErrNotSupported diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index fcbc714b3..f157617d9 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -45,6 +45,7 @@ type Gateway interface { ChainNotify(context.Context) (<-chan []*api.HeadChange, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index b8359fb42..88d3def63 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -449,6 +449,8 @@ type GatewayMethods struct { GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `` MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `` @@ -2677,6 +2679,17 @@ func (s *GatewayStub) GasEstimateMessageGas(p0 context.Context, p1 *types.Messag return nil, ErrNotSupported } +func (s *GatewayStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + if s.Internal.MpoolGetNonce == nil { + return 0, ErrNotSupported + } + return s.Internal.MpoolGetNonce(p0, p1) +} + +func (s *GatewayStub) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return 0, ErrNotSupported +} + func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { if s.Internal.MpoolPush == nil { return *new(cid.Cid), ErrNotSupported diff --git a/gateway/node.go b/gateway/node.go index ac83f12bc..5a51fe62c 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -60,6 +60,7 @@ type TargetAPI interface { ChainPutObj(context.Context, blocks.Block) error ChainGetGenesis(context.Context) (*types.TipSet, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPushUntrusted(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index ba0c98579..50da42cba 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -188,6 +188,13 @@ func (gw *Node) GasEstimateMessageGas(ctx context.Context, msg *types.Message, s return gw.target.GasEstimateMessageGas(ctx, msg, spec, tsk) } +func (gw *Node) MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return 0, err + } + return gw.target.MpoolGetNonce(ctx, addr) +} + func (gw *Node) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return cid.Cid{}, err From fb569d4c2c4371960f4f4d9cd509ad098469eb7a Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Wed, 8 Mar 2023 03:15:52 +0200 Subject: [PATCH 04/18] add two more methods: StateCall and StateDecodeParams --- api/api_gateway.go | 4 +++- api/proxy_gen.go | 26 ++++++++++++++++++++++++++ api/v0api/gateway.go | 4 +++- api/v0api/proxy_gen.go | 30 +++++++++++++++++++++++++++++- gateway/node.go | 4 +++- gateway/proxy_fil.go | 20 ++++++++++++++++++++ 6 files changed, 84 insertions(+), 4 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index 8de636516..575050623 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -55,9 +55,11 @@ type Gateway interface { MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) MsigGetVestingSchedule(ctx context.Context, addr address.Address, tsk types.TipSetKey) (MsigVesting, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*InvocResult, error) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) - StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error) //perm:read + StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (MarketBalance, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 9fc69dde5..8ea8c7d45 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -736,8 +736,12 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) `` + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` + StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `` @@ -4664,6 +4668,17 @@ func (s *GatewayStub) StateAccountKey(p0 context.Context, p1 address.Address, p2 return *new(address.Address), ErrNotSupported } +func (s *GatewayStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) { + if s.Internal.StateCall == nil { + return nil, ErrNotSupported + } + return s.Internal.StateCall(p0, p1, p2) +} + +func (s *GatewayStub) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) { if s.Internal.StateDealProviderCollateralBounds == nil { return *new(DealCollateralBounds), ErrNotSupported @@ -4675,6 +4690,17 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a return *new(DealCollateralBounds), ErrNotSupported } +func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) +} + +func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { if s.Internal.StateGetActor == nil { return nil, ErrNotSupported diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index f157617d9..b83dd0539 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -51,7 +51,9 @@ type Gateway interface { MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 88d3def63..fc321f594 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -461,7 +461,11 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `` + + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` + + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` @@ -2734,6 +2738,8 @@ func (s *GatewayStub) MsigGetVested(p0 context.Context, p1 address.Address, p2 t return *new(types.BigInt), ErrNotSupported } + + func (s *GatewayStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { if s.Internal.StateAccountKey == nil { return *new(address.Address), ErrNotSupported @@ -2745,6 +2751,17 @@ func (s *GatewayStub) StateAccountKey(p0 context.Context, p1 address.Address, p2 return *new(address.Address), ErrNotSupported } +func (s *GatewayStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { + if s.Internal.StateCall == nil { + return nil, ErrNotSupported + } + return s.Internal.StateCall(p0, p1, p2) +} + +func (s *GatewayStub) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { if s.Internal.StateDealProviderCollateralBounds == nil { return *new(api.DealCollateralBounds), ErrNotSupported @@ -2756,6 +2773,17 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a return *new(api.DealCollateralBounds), ErrNotSupported } +func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) +} + +func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { if s.Internal.StateGetActor == nil { return nil, ErrNotSupported diff --git a/gateway/node.go b/gateway/node.go index 5a51fe62c..babf844a2 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -67,7 +67,9 @@ type TargetAPI interface { MsigGetVestingSchedule(context.Context, address.Address, types.TipSetKey) (api.MsigVesting, error) MsigGetPending(ctx context.Context, addr address.Address, ts types.TipSetKey) ([]*api.MsigTransaction, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index 50da42cba..e3e8d5312 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -256,6 +256,16 @@ func (gw *Node) StateAccountKey(ctx context.Context, addr address.Address, tsk t return gw.target.StateAccountKey(ctx, addr, tsk) } +func (gw *Node) StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return nil, err + } + if err := gw.checkTipsetKey(ctx, tsk); err != nil { + return nil, err + } + return gw.target.StateCall(ctx, msg, tsk) +} + func (gw *Node) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return api.DealCollateralBounds{}, err @@ -266,6 +276,16 @@ func (gw *Node) StateDealProviderCollateralBounds(ctx context.Context, size abi. return gw.target.StateDealProviderCollateralBounds(ctx, size, verified, tsk) } +func (gw *Node) StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return nil, err + } + if err := gw.checkTipsetKey(ctx, tsk); err != nil { + return nil, err + } + return gw.target.StateDecodeParams(ctx, toAddr, method, params, tsk) +} + func (gw *Node) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return nil, err From 649b0769ba679ededa0e621c7e6a82949eb13aa9 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Wed, 8 Mar 2023 18:53:19 +0200 Subject: [PATCH 05/18] run make gen --- api/api_gateway.go | 4 +-- api/proxy_gen.go | 38 +++++++++++---------- api/v0api/gateway.go | 8 ++--- api/v0api/proxy_gen.go | 60 +++++++++++++++++----------------- build/openrpc/full.json.gz | Bin 33286 -> 33287 bytes build/openrpc/gateway.json.gz | Bin 8480 -> 9295 bytes build/openrpc/miner.json.gz | Bin 16039 -> 16043 bytes build/openrpc/worker.json.gz | Bin 5220 -> 5221 bytes gateway/node.go | 12 +++---- gateway/proxy_fil.go | 24 +++++++------- 10 files changed, 74 insertions(+), 72 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index 575050623..9bc69cc0f 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -12,10 +12,10 @@ import ( "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/lotus/node/modules/dtypes" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) // MODIFYING THE API INTERFACE @@ -48,7 +48,7 @@ type Gateway interface { ChainReadObj(context.Context, cid.Cid) ([]byte, error) ChainGetGenesis(context.Context) (*types.TipSet, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) - MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 8ea8c7d45..70579af1a 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -7,6 +7,15 @@ import ( "encoding/json" "time" + "github.com/google/uuid" + "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -23,6 +32,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" + apitypes "github.com/filecoin-project/lotus/api/types" builtinactors "github.com/filecoin-project/lotus/chain/actors/builtin" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -35,14 +45,6 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/sealtasks" "github.com/filecoin-project/lotus/storage/sealer/storiface" - "github.com/google/uuid" - "github.com/ipfs/go-cid" - blocks "github.com/ipfs/go-libipfs/blocks" - "github.com/libp2p/go-libp2p/core/metrics" - "github.com/libp2p/go-libp2p/core/network" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/protocol" - "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -718,7 +720,7 @@ type GatewayMethods struct { GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `` @@ -736,11 +738,11 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `` StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) `` - StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` @@ -758,11 +760,11 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` - StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `` - StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) `perm:"read"` + StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) `` StateSearchMsg func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*MsgLookup, error) `` @@ -4691,14 +4693,14 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a } func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - if s.Internal.StateDecodeParams == nil { - return nil, ErrNotSupported - } - return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) } func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - return nil, ErrNotSupported + return nil, ErrNotSupported } func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index b83dd0539..2a0bfb2f7 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -12,9 +12,9 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) // MODIFYING THE API INTERFACE @@ -51,9 +51,9 @@ type Gateway interface { MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) - StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index fc321f594..17a1ae84a 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,6 +5,11 @@ package v0api import ( "context" + "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" + "github.com/libp2p/go-libp2p/core/peer" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -17,6 +22,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -24,10 +30,6 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" - "github.com/ipfs/go-cid" - blocks "github.com/ipfs/go-libipfs/blocks" - "github.com/libp2p/go-libp2p/core/peer" - "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -461,11 +463,11 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` - StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` @@ -485,7 +487,7 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` - StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) `` @@ -2684,14 +2686,14 @@ func (s *GatewayStub) GasEstimateMessageGas(p0 context.Context, p1 *types.Messag } func (s *GatewayStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { - if s.Internal.MpoolGetNonce == nil { - return 0, ErrNotSupported - } - return s.Internal.MpoolGetNonce(p0, p1) + if s.Internal.MpoolGetNonce == nil { + return 0, ErrNotSupported + } + return s.Internal.MpoolGetNonce(p0, p1) } func (s *GatewayStub) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { - return 0, ErrNotSupported + return 0, ErrNotSupported } func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { @@ -2738,8 +2740,6 @@ func (s *GatewayStub) MsigGetVested(p0 context.Context, p1 address.Address, p2 t return *new(types.BigInt), ErrNotSupported } - - func (s *GatewayStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { if s.Internal.StateAccountKey == nil { return *new(address.Address), ErrNotSupported @@ -2752,14 +2752,14 @@ func (s *GatewayStub) StateAccountKey(p0 context.Context, p1 address.Address, p2 } func (s *GatewayStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { - if s.Internal.StateCall == nil { - return nil, ErrNotSupported - } - return s.Internal.StateCall(p0, p1, p2) + if s.Internal.StateCall == nil { + return nil, ErrNotSupported + } + return s.Internal.StateCall(p0, p1, p2) } func (s *GatewayStub) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { - return nil, ErrNotSupported + return nil, ErrNotSupported } func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { @@ -2774,14 +2774,14 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a } func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - if s.Internal.StateDecodeParams == nil { - return nil, ErrNotSupported - } - return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) } func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - return nil, ErrNotSupported + return nil, ErrNotSupported } func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { @@ -2884,14 +2884,14 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A } func (s *GatewayStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { - if s.Internal.StateNetworkName == nil { - return *new(dtypes.NetworkName), ErrNotSupported - } - return s.Internal.StateNetworkName(p0) + if s.Internal.StateNetworkName == nil { + return *new(dtypes.NetworkName), ErrNotSupported + } + return s.Internal.StateNetworkName(p0) } func (s *GatewayStub) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { - return *new(dtypes.NetworkName), ErrNotSupported + return *new(dtypes.NetworkName), ErrNotSupported } func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 16fe7b83776c9d828aa2ede1cf17758a94cc5897..bd8810929825a503b8986d7178ffbda8f4354c82 100644 GIT binary patch delta 29893 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 z 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 ImU*uR07|*-J^%m! delta 29882 zcmV)!K#;$OgaU?y0+1a7II*!GG6H`Gd+$V_N>

1UWbHRB5)vGDHg3m|RMwD=9;v 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 60bf3dd77bde07d331b381e82d05337fa280d76c..b25ce7cbe1ab3cfd377be9c3d92391adffab78bd 100644 GIT binary patch delta 9070 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 g6H@V+Wmp~@YU;zokB9#k00960YR delta 8246 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index b3f1e3c25f2b1e6b352f3e15e086937d8fd5f649..1bbcff07417c74e3b4f49e6af62f4194f3a6f970 100644 GIT binary patch delta 14255 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 N|Nq7QtK0D#0{~kb*e(D7 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index ff47f7b11157d68f004b7198bf8eef7bfb9f7381..8aa648469a10cdd793a646a4af4076708f2a6b81 100644 GIT binary patch delta 2801 zcmV4YN8Y`(sieiR=95Ax`pem#dY__Ij-A&B$f@$U@Ss2TW^2Eq>>pysR3f8N5Gcl zLy*)l->YPPC6!8LPgovnJJi>gUn3qaOzpck4?zo)nTOm5Y@n{^SLk)Ulc~~EwUeHz z>3vC-{)wQ8Tu(YBOUqg_U34I2#&;1@qRuazTDL7Xf{h&6|Akh*76nSDlwp6*ZS!tMeI0gVi9)Mttsp~!481loq$$~C=vM+K7UG@9hPg6m&wKDL zAUFAZB+Q&mLV_OS;2b+q4ki~_b{~S&QIM;ps-*X_Rp}py8gouX^7HVr=RCyr8TIbv z1*G%vadaEzqv3b_H`_#@Z)BFi zK_PfSKdZXNNI*{8SX%@UXo;~t6A=)&AaLQe;le;G#)WV!ssTcfxp^cA@;40u+tvu* z-y(w)zF&X%e&PEo`Tn7v?fbtVf?P;LhxaeE`iE;TD(uSVmczTeXkfE*hD}a%$gRF9 zpeSl@aUhn!jn|4Bg^P!wUhiKk^o@j2aBd<(@f2sQ8=hekxU6~)5y~92hpg#IkY<9( zEHF4i0W?h)c^)zW-j>z@=ajkisqHS12_`E5!JmJ@w;wWq;LJ9W0p2~%u`vgjn3y$@ z)v;Jw6dUaAi35#$WNvF=o%J3-Vgd-hu~c*D%{%d>%qOYK^c+rC>f|Rh5Y!$$b3RyU zP#e&R=G~)(^SAxuKhAPxFPy(8iz!-7HGPV;U9lO-|5MQ%-bqh)yONGET;Dpbn?{1oq)b zlBK^8p3P}+v%^>0fRUxPYNUr>Kw?LcOPinh|-+QzvHftKTt0e1fcq37A-V|v= z#@kJ6s{z|9yZuF1atz(I4di)O$nyf7=Cb%$=4{hnF0t9UzAmPs@q&K}tbSV>pPeV= z%r^KSBSSXVzYz+sihw-@kAACx7vz`0EWFpw3=>)_@Hj^#Om|D1pg!PH=u+>N9Oy~5 zjZO_u^i7G2t4gtjMlQD6kN>a3%=*1tGkZXn!KQX_@mYH2ve(v1e1vcAb3Hf^RI< z9D4Ike3Dzw6_^nY6w<01t^*Y#(~glz--jti=7=LBR+q%;(ra5?8mML2a2mjQ*|1tO z82bY@E+*o3#K=eb4fhzb!2*BmBdE7@6yCLq9C*g&Wtn zpOZ=tOn)d$kCj0-OkW{ro%z=h@CI5&a`HlSz#gG>=|=?<@5{^{|GFKW}$81&{>N75_zRSJb`$x4e`{RbE24A zzi?6Y6{%h3nii!F+fIs$)Fc?j8XjF=5}4Q$8*T$8zJYZmvC<;;%>+>qM5P|0qU9X? z6@P==Dzo!l=IRsl9p+b?qwi#R7G@%5>Mb{hTxLsvU-R z_$hcz9e=m)+`F&%9wpB5lfh(3!S+Br5{7(7PPt=NU}6tWELOKT;qHx`a5o<0oN#xA z=&!`r25!6AWXvOs6Wg{5K04SHaOj5zF@I4CK0er0xPb1x2k0DatO9xf1@F2W>*#>r zYzpWcvVX7#JVYrbvsSIGYNAYY$Utdv(4iV7Y@&6 z$OT@Q@L+U!bNVvMlb;bZf8(6b6+;F1j3_kbA2T|olv;1Ib9%)@?wYhYDorD&%fB)0 z87fN7_js`mKfou8 zR=7+NDYRg%BBx}&m5aFijd;==Ia58IpRUZBW~m!GPNl91DeO9sf6o1d%YsYtY6?4U zt1+l~p`(FDTp|-07IY7>ig+1$PXCwanEU%w`<5fJO0NkAQX)Ugwo|MN%ArC}8;>DW z^b>WU_D^(u(mR=E2Bl>o{L!4cs3i=a)RCdfZqM*VDXF7G9x*2 zNf?3_h2FjAR})-&f0%2Fk@60;z_@75Q?OJsOVY9M>U6{3ZS1Ook{zPqdQOxC8%=|drvE}XC;N{%gjzTe|E*RbYohlPwPEXkirOs zR~+<0(u%HVBfaV^(|gaBNEvd2Em7-e zM*7f*SNF9>MEU>*aV>zjOG^Z+ieS~+2J;nd3bp8JU00960oq2scsV)Hk DTA*Q8 delta 2796 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 Date: Wed, 8 Mar 2023 20:38:09 +0000 Subject: [PATCH 06/18] Eth API: make block parameter parsing sounder. --- node/impl/full/eth.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 907adf8cd..7af9e7000 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -153,6 +153,8 @@ type EthAPI struct { EthEventAPI } +var ErrNullRound = errors.New("requested epoch was a null round") + func (a *EthModule) StateNetworkName(ctx context.Context) (dtypes.NetworkName, error) { return stmgr.GetNetworkName(ctx, a.StateManager, a.Chain.GetHeaviestTipSet().ParentState()) } @@ -231,7 +233,7 @@ func (a *EthModule) EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthH return newEthBlockFromFilecoinTipSet(ctx, ts, fullTxInfo, a.Chain, a.StateAPI) } -func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string) (tipset *types.TipSet, err error) { +func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict bool) (tipset *types.TipSet, err error) { if blkParam == "earliest" { return nil, fmt.Errorf("block param \"earliest\" is not supported") } @@ -252,16 +254,19 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string) (tipset if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } - ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, false) + ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } + if strict && ts.Height() != abi.ChainEpoch(num) { + return nil, ErrNullRound + } return ts, nil } } func (a *EthModule) EthGetBlockByNumber(ctx context.Context, blkParam string, fullTxInfo bool) (ethtypes.EthBlock, error) { - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, true) if err != nil { return ethtypes.EthBlock{}, err } @@ -367,7 +372,7 @@ func (a *EthModule) EthGetTransactionCount(ctx context.Context, sender ethtypes. return ethtypes.EthUint64(0), nil } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return ethtypes.EthUint64(0), xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -456,7 +461,7 @@ func (a *EthModule) EthGetCode(ctx context.Context, ethAddr ethtypes.EthAddress, return nil, xerrors.Errorf("cannot get Filecoin address: %w", err) } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return nil, xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -535,7 +540,7 @@ func (a *EthModule) EthGetCode(ctx context.Context, ethAddr ethtypes.EthAddress, } func (a *EthModule) EthGetStorageAt(ctx context.Context, ethAddr ethtypes.EthAddress, position ethtypes.EthBytes, blkParam string) (ethtypes.EthBytes, error) { - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return nil, xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -631,7 +636,7 @@ func (a *EthModule) EthGetBalance(ctx context.Context, address ethtypes.EthAddre return ethtypes.EthBigInt{}, err } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return ethtypes.EthBigInt{}, xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -676,7 +681,7 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth } } - ts, err := a.parseBlkParam(ctx, params.NewestBlkNum) + ts, err := a.parseBlkParam(ctx, params.NewestBlkNum, false) if err != nil { return ethtypes.EthFeeHistory{}, fmt.Errorf("bad block parameter %s: %s", params.NewestBlkNum, err) } @@ -1066,7 +1071,7 @@ func (a *EthModule) EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam s return nil, xerrors.Errorf("failed to convert ethcall to filecoin message: %w", err) } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return nil, xerrors.Errorf("cannot parse block param: %s", blkParam) } From a0821506bc5aacf7740dfd7c405e3308c56a6fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 8 Mar 2023 20:49:28 +0000 Subject: [PATCH 07/18] Eth API: fail when requesting future epochs. --- node/impl/full/eth.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 7af9e7000..919380ad1 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -254,6 +254,9 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } + if abi.ChainEpoch(num) > head.Height()-1 { + return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") + } ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) From e73ec088d563de385f05e9217c32dcc2b2e264d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 8 Mar 2023 21:15:04 +0000 Subject: [PATCH 08/18] add a test to verify block parameter soundness. --- itests/eth_transactions_test.go | 71 +++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 9afeb7bd5..82de0c6c0 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -7,6 +7,7 @@ import ( "testing" "time" + "github.com/filecoin-project/lotus/chain/store" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/big" @@ -270,6 +271,76 @@ func TestContractInvocation(t *testing.T) { require.EqualValues(t, ethtypes.EthUint64(0x1), receipt.Status) } +func TestGetBlockByNumber(t *testing.T) { + blockTime := 100 * time.Millisecond + client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) + + bms := ens.InterconnectAll().BeginMining(blockTime) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + // install contract + contractHex, err := os.ReadFile("./contracts/SimpleCoin.hex") + require.NoError(t, err) + + contract, err := hex.DecodeString(string(contractHex)) + require.NoError(t, err) + + // create a new Ethereum account + key, ethAddr, deployer := client.EVM().NewAccount() + // send some funds to the f410 address + kit.SendFunds(ctx, t, client, deployer, types.FromFil(10)) + + // DEPLOY CONTRACT + tx, err := deployContractTx(ctx, client, ethAddr, contract) + require.NoError(t, err) + + client.EVM().SignTransaction(tx, key.PrivateKey) + hash := client.EVM().SubmitTransaction(ctx, tx) + + receipt, err := waitForEthTxReceipt(ctx, client, hash) + require.NoError(t, err) + require.NotNil(t, receipt) + require.EqualValues(t, ethtypes.EthUint64(0x1), receipt.Status) + + latest, err := client.EthBlockNumber(ctx) + require.NoError(t, err) + + // can get the latest block + _, err = client.EthGetBlockByNumber(ctx, latest.Hex(), true) + require.NoError(t, err) + + // fail to get a future block + _, err = client.EthGetBlockByNumber(ctx, (latest + 10000).Hex(), true) + require.Error(t, err) + + // inject 10 null rounds + bms[0].InjectNulls(10) + + // wait until we produce blocks again + tctx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + ch, err := client.ChainNotify(tctx) + require.NoError(t, err) + hc := <-ch // current + hc = <-ch // wait for next block + require.Equal(t, store.HCApply, hc[0].Type) + + afterNullHeight := hc[0].Val.Height() + + // Fail when trying to fetch a null round. + _, err = client.EthGetBlockByNumber(ctx, (ethtypes.EthUint64(afterNullHeight - 1)).Hex(), true) + require.Error(t, err) + + // Fetch balance on a null round; should not fail and should return previous balance. + // Should be lower than original balance. + bal, err := client.EthGetBalance(ctx, ethAddr, (ethtypes.EthUint64(afterNullHeight - 1)).Hex()) + require.NoError(t, err) + require.NotEqual(t, big.Zero(), bal) + require.Equal(t, -1, bal.Cmp(types.FromFil(10).Int)) +} + func deployContractTx(ctx context.Context, client *kit.TestFullNode, ethAddr ethtypes.EthAddress, contract []byte) (*ethtypes.EthTxArgs, error) { gaslimit, err := client.EthEstimateGas(ctx, ethtypes.EthCall{ From: ðAddr, From 6a7895bf49ce9de264cb46315b7497dd178a11dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 12:15:35 +0000 Subject: [PATCH 09/18] fmt. --- itests/eth_transactions_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 82de0c6c0..5cc829907 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -7,7 +7,6 @@ import ( "testing" "time" - "github.com/filecoin-project/lotus/chain/store" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/big" @@ -15,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" "github.com/filecoin-project/lotus/itests/kit" From 558eaf8b61b57e8157201aff49cf10a322f75896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 14:59:56 +0000 Subject: [PATCH 10/18] fix lint. --- itests/eth_transactions_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 5cc829907..9d6c742dc 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -323,8 +323,8 @@ func TestGetBlockByNumber(t *testing.T) { defer cancel() ch, err := client.ChainNotify(tctx) require.NoError(t, err) - hc := <-ch // current - hc = <-ch // wait for next block + <-ch // current + hc := <-ch // wait for next block require.Equal(t, store.HCApply, hc[0].Type) afterNullHeight := hc[0].Val.Height() From 2909a31e8f104803ee5dacabc67b6d3d30610a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 17:14:23 +0000 Subject: [PATCH 11/18] fix TestEthBlockHashesCorrect_MultiBlockTipset: skip null rounds. --- itests/eth_block_hash_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/itests/eth_block_hash_test.go b/itests/eth_block_hash_test.go index ac6506bb2..7cc766ebc 100644 --- a/itests/eth_block_hash_test.go +++ b/itests/eth_block_hash_test.go @@ -3,6 +3,7 @@ package itests import ( "context" "fmt" + "strings" "testing" "time" @@ -55,6 +56,10 @@ func TestEthBlockHashesCorrect_MultiBlockTipset(t *testing.T) { hex := fmt.Sprintf("0x%x", i) ethBlockA, err := n2.EthGetBlockByNumber(ctx, hex, true) + // Cannot use static ErrFullRound error for comparison since it gets reserialized as a JSON RPC error. + if err != nil && strings.Contains(err.Error(), "null round") { + continue + } require.NoError(t, err) ethBlockB, err := n2.EthGetBlockByHash(ctx, ethBlockA.Hash, true) From a72879b2b257a6b98054f0f30ec38c0ec1668c94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 18:51:38 +0000 Subject: [PATCH 12/18] switch to ChainAPI#ChainGetTipSetByHeight. --- node/impl/full/eth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 919380ad1..203d9475b 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -257,7 +257,7 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if abi.ChainEpoch(num) > head.Height()-1 { return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") } - ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) + ts, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(num), head.Key()) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } From 1da2d59066d73125ffe29686fe5e6b595a2bd1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 19:05:31 +0000 Subject: [PATCH 13/18] simplify test. --- itests/eth_transactions_test.go | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 9d6c742dc..8d0df0433 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -280,29 +280,10 @@ func TestGetBlockByNumber(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - // install contract - contractHex, err := os.ReadFile("./contracts/SimpleCoin.hex") - require.NoError(t, err) - - contract, err := hex.DecodeString(string(contractHex)) - require.NoError(t, err) - // create a new Ethereum account - key, ethAddr, deployer := client.EVM().NewAccount() + _, ethAddr, filAddr := client.EVM().NewAccount() // send some funds to the f410 address - kit.SendFunds(ctx, t, client, deployer, types.FromFil(10)) - - // DEPLOY CONTRACT - tx, err := deployContractTx(ctx, client, ethAddr, contract) - require.NoError(t, err) - - client.EVM().SignTransaction(tx, key.PrivateKey) - hash := client.EVM().SubmitTransaction(ctx, tx) - - receipt, err := waitForEthTxReceipt(ctx, client, hash) - require.NoError(t, err) - require.NotNil(t, receipt) - require.EqualValues(t, ethtypes.EthUint64(0x1), receipt.Status) + kit.SendFunds(ctx, t, client, filAddr, types.FromFil(10)) latest, err := client.EthBlockNumber(ctx) require.NoError(t, err) @@ -338,7 +319,7 @@ func TestGetBlockByNumber(t *testing.T) { bal, err := client.EthGetBalance(ctx, ethAddr, (ethtypes.EthUint64(afterNullHeight - 1)).Hex()) require.NoError(t, err) require.NotEqual(t, big.Zero(), bal) - require.Equal(t, -1, bal.Cmp(types.FromFil(10).Int)) + require.Equal(t, types.FromFil(10).Int, bal.Int) } func deployContractTx(ctx context.Context, client *kit.TestFullNode, ethAddr ethtypes.EthAddress, contract []byte) (*ethtypes.EthTxArgs, error) { From 0e58b3fbbc14826c5b271592b4930da513de809a Mon Sep 17 00:00:00 2001 From: ychiao Date: Wed, 8 Mar 2023 19:28:17 -0500 Subject: [PATCH 14/18] fix: EthAPI: use StateCompute for feeHistory; apply minimum gas premium (#10413) --- itests/eth_fee_history_test.go | 135 ++++++++++++++++++++++++++++----- node/impl/full/eth.go | 40 +++++----- node/impl/full/eth_test.go | 2 +- 3 files changed, 135 insertions(+), 42 deletions(-) diff --git a/itests/eth_fee_history_test.go b/itests/eth_fee_history_test.go index 72302f298..a792c7f0e 100644 --- a/itests/eth_fee_history_test.go +++ b/itests/eth_fee_history_test.go @@ -3,18 +3,42 @@ package itests import ( "context" "encoding/json" + "sort" "testing" "time" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-jsonrpc" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" "github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/lib/result" + "github.com/filecoin-project/lotus/node/impl/full" ) +// calculateExpectations calculates the expected number of items to be included in the response +// of eth_feeHistory. It takes care of null rounds by finding the closet tipset with height +// smaller than startHeight, and then looks back at requestAmount of items. It also considers +// scenarios where there are not enough items to look back. +func calculateExpectations(tsHeights []int, requestAmount, startHeight int) (count, oldestHeight int) { + latestIdx := sort.SearchInts(tsHeights, startHeight) + // SearchInts returns the index of the number that's larger than the target if the target + // doesn't exist. However, we're looking for the closet number that's smaller that the target + for tsHeights[latestIdx] > startHeight { + latestIdx-- + } + cnt := requestAmount + oldestIdx := latestIdx - requestAmount + 1 + if oldestIdx < 0 { + cnt = latestIdx + 1 + oldestIdx = 0 + } + return cnt, tsHeights[oldestIdx] +} + func TestEthFeeHistory(t *testing.T) { require := require.New(t) @@ -22,70 +46,136 @@ func TestEthFeeHistory(t *testing.T) { blockTime := 100 * time.Millisecond client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) - ens.InterconnectAll().BeginMining(blockTime) ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - // Wait for the network to create 20 blocks + heads, err := client.ChainNotify(ctx) + require.NoError(err) + + // Save the full view of the tipsets to calculate the answer when there are null rounds + tsHeights := []int{1} + go func() { + for chg := range heads { + for _, c := range chg { + tsHeights = append(tsHeights, int(c.Val.Height())) + } + } + }() + + miner := ens.InterconnectAll().BeginMining(blockTime) + + client.WaitTillChain(ctx, kit.HeightAtLeast(7)) + miner[0].InjectNulls(abi.ChainEpoch(5)) + + // Wait for the network to create at least 20 tipsets client.WaitTillChain(ctx, kit.HeightAtLeast(20)) + for _, m := range miner { + m.Pause() + } + + ch, err := client.ChainNotify(ctx) + require.NoError(err) + + // Wait for 5 seconds of inactivity + func() { + for { + select { + case <-ch: + continue + case <-time.After(5 * time.Second): + return + } + } + }() + + sort.Ints(tsHeights) + + // because of the deferred execution, the last tipset is not executed yet, + // and the one before the last one is the last executed tipset, + // which corresponds to the "latest" tag in EthGetBlockByNumber + latestBlk := ethtypes.EthUint64(tsHeights[len(tsHeights)-2]) + blk, err := client.EthGetBlockByNumber(ctx, "latest", false) + require.NoError(err) + require.Equal(blk.Number, latestBlk) + + assertHistory := func(history *ethtypes.EthFeeHistory, requestAmount, startHeight int) { + amount, oldest := calculateExpectations(tsHeights, requestAmount, startHeight) + require.Equal(amount+1, len(history.BaseFeePerGas)) + require.Equal(amount, len(history.GasUsedRatio)) + require.Equal(ethtypes.EthUint64(oldest), history.OldestBlock) + } history, err := client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "0x10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(16-5+1), history.OldestBlock) + assertHistory(&history, 5, 16) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{"5", "0x10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(16-5+1), history.OldestBlock) + assertHistory(&history, 5, 16) + require.Nil(history.Reward) + + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{5, "latest"}), + ).Assert(require.NoError)) + require.NoError(err) + assertHistory(&history, 5, int(latestBlk)) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{"0x10", "0x12"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(17, len(history.BaseFeePerGas)) - require.Equal(16, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(18-16+1), history.OldestBlock) + assertHistory(&history, 16, 18) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "0x10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(16-5+1), history.OldestBlock) + assertHistory(&history, 5, 16) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(10-5+1), history.OldestBlock) + assertHistory(&history, 5, 10) + require.Nil(history.Reward) + + // test when the requested number of blocks is longer than chain length + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{"0x30", "latest"}), + ).Assert(require.NoError)) + require.NoError(err) + assertHistory(&history, 48, int(latestBlk)) + require.Nil(history.Reward) + + // test when the requested number of blocks is longer than chain length + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{"0x30", "10"}), + ).Assert(require.NoError)) + require.NoError(err) + assertHistory(&history, 48, 10) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "10", &[]float64{25, 50, 75}}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(10-5+1), history.OldestBlock) + assertHistory(&history, 5, 10) require.NotNil(history.Reward) require.Equal(5, len(*history.Reward)) for _, arr := range *history.Reward { require.Equal(3, len(arr)) + for _, item := range arr { + require.Equal(ethtypes.EthBigInt(types.NewInt(full.MinGasPremium)), item) + } } history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( @@ -93,6 +183,11 @@ func TestEthFeeHistory(t *testing.T) { ).Assert(require.NoError)) require.Error(err) + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{5, "10", &[]float64{75, 50}}), + ).Assert(require.NoError)) + require.Error(err) + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "10", &[]float64{}}), ).Assert(require.NoError)) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 203d9475b..c5809d250 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -254,10 +254,7 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } - if abi.ChainEpoch(num) > head.Height()-1 { - return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") - } - ts, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(num), head.Key()) + ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } @@ -689,11 +686,7 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth return ethtypes.EthFeeHistory{}, fmt.Errorf("bad block parameter %s: %s", params.NewestBlkNum, err) } - // Deal with the case that the chain is shorter than the number of requested blocks. oldestBlkHeight := uint64(1) - if abi.ChainEpoch(params.BlkCount) <= ts.Height() { - oldestBlkHeight = uint64(ts.Height()) - uint64(params.BlkCount) + 1 - } // NOTE: baseFeePerGas should include the next block after the newest of the returned range, // because the next base fee can be inferred from the messages in the newest block. @@ -703,29 +696,32 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth gasUsedRatioArray := []float64{} rewardsArray := make([][]ethtypes.EthBigInt, 0) - for ts.Height() >= abi.ChainEpoch(oldestBlkHeight) { - // Unfortunately we need to rebuild the full message view so we can - // totalize gas used in the tipset. - msgs, err := a.Chain.MessagesForTipset(ctx, ts) + blocksIncluded := 0 + for blocksIncluded < int(params.BlkCount) && ts.Height() > 0 { + compOutput, err := a.StateCompute(ctx, ts.Height(), nil, ts.Key()) if err != nil { - return ethtypes.EthFeeHistory{}, xerrors.Errorf("error loading messages for tipset: %v: %w", ts, err) + return ethtypes.EthFeeHistory{}, xerrors.Errorf("cannot lookup the status of tipset: %v: %w", ts, err) } txGasRewards := gasRewardSorter{} - for txIdx, msg := range msgs { - msgLookup, err := a.StateAPI.StateSearchMsg(ctx, types.EmptyTSK, msg.Cid(), api.LookbackNoLimit, false) - if err != nil || msgLookup == nil { - return ethtypes.EthFeeHistory{}, nil + for _, msg := range compOutput.Trace { + if msg.Msg.From == builtintypes.SystemActorAddr { + continue } - tx, err := newEthTxFromMessageLookup(ctx, msgLookup, txIdx, a.Chain, a.StateAPI) + smsgCid, err := getSignedMessage(ctx, a.Chain, msg.MsgCid) if err != nil { - return ethtypes.EthFeeHistory{}, nil + return ethtypes.EthFeeHistory{}, xerrors.Errorf("failed to get signed msg %s: %w", msg.MsgCid, err) + } + + tx, err := newEthTxFromSignedMessage(ctx, smsgCid, a.StateAPI) + if err != nil { + return ethtypes.EthFeeHistory{}, err } txGasRewards = append(txGasRewards, gasRewardTuple{ reward: tx.Reward(ts.Blocks()[0].ParentBaseFee), - gas: uint64(msgLookup.Receipt.GasUsed), + gas: uint64(msg.MsgRct.GasUsed), }) } @@ -735,6 +731,8 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth baseFeeArray = append(baseFeeArray, ethtypes.EthBigInt(ts.Blocks()[0].ParentBaseFee)) gasUsedRatioArray = append(gasUsedRatioArray, float64(totalGasUsed)/float64(build.BlockGasLimit)) rewardsArray = append(rewardsArray, rewards) + oldestBlkHeight = uint64(ts.Height()) + blocksIncluded++ parentTsKey := ts.Parents() ts, err = a.Chain.LoadTipSet(ctx, parentTsKey) @@ -2351,7 +2349,7 @@ func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRew rewards := make([]ethtypes.EthBigInt, len(rewardPercentiles)) for i := range rewards { - rewards[i] = ethtypes.EthBigIntZero + rewards[i] = ethtypes.EthBigInt(types.NewInt(MinGasPremium)) } if len(txGasRewards) == 0 { diff --git a/node/impl/full/eth_test.go b/node/impl/full/eth_test.go index 67a8b0500..4cf3b5c76 100644 --- a/node/impl/full/eth_test.go +++ b/node/impl/full/eth_test.go @@ -135,7 +135,7 @@ func TestRewardPercentiles(t *testing.T) { { percentiles: []float64{25, 50, 75}, txGasRewards: []gasRewardTuple{}, - answer: []int64{0, 0, 0}, + answer: []int64{MinGasPremium, MinGasPremium, MinGasPremium}, }, { percentiles: []float64{25, 50, 75, 100}, From 36ffa09b054f3366d4ba50d8b09347c0399db591 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 9 Mar 2023 07:14:57 -0500 Subject: [PATCH 15/18] fix: eth API: return correct txIdx around null blocks (#10419) --- node/impl/full/eth.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index c5809d250..9b6794339 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -1802,12 +1802,16 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return ethtypes.EthBlock{}, xerrors.Errorf("failed to compute state: %w", err) } - for txIdx, msg := range compOutput.Trace { + txIdx := 0 + for _, msg := range compOutput.Trace { // skip system messages like reward application and cron if msg.Msg.From == builtintypes.SystemActorAddr { continue } + ti := ethtypes.EthUint64(txIdx) + txIdx++ + gasUsed += msg.MsgRct.GasUsed smsgCid, err := getSignedMessage(ctx, cs, msg.MsgCid) if err != nil { @@ -1818,8 +1822,6 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return ethtypes.EthBlock{}, xerrors.Errorf("failed to convert msg to ethTx: %w", err) } - ti := ethtypes.EthUint64(txIdx) - tx.ChainID = ethtypes.EthUint64(build.Eip155ChainId) tx.BlockHash = &blkHash tx.BlockNumber = &bn From b7db4cb280cc07f35804bb8d90f61a249db300b3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 9 Mar 2023 13:17:17 -0800 Subject: [PATCH 16/18] feat: mempool: Reduce minimum replace fee from 1.25x to 1.1x (#10416) However, we're leaving the default at 1.25x for backwards compatibility, for now. Also: 1. Actually use the configured replace fee ratio. 2. Store said ratios as percentages instead of floats. 1.25, or 1+1/(2^2), can be represented as a float. 1.1, or 1 + 1/(2 * 5), cannot. fixes #10415 --- api/docgen/docgen.go | 4 ++ build/openrpc/full.json.gz | Bin 33287 -> 33289 bytes build/version.go | 2 +- chain/messagepool/config.go | 14 ++++--- chain/messagepool/messagepool.go | 14 ++++--- chain/types/mpool.go | 2 +- chain/types/percent.go | 39 ++++++++++++++++++++ chain/types/percent_test.go | 34 +++++++++++++++++ cli/mpool.go | 9 ++++- cli/mpool_test.go | 7 +++- documentation/en/api-v0-methods.md | 4 +- documentation/en/api-v1-unstable-methods.md | 4 +- 12 files changed, 113 insertions(+), 20 deletions(-) create mode 100644 chain/types/percent.go create mode 100644 chain/types/percent_test.go diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 65d71d208..0e97997a6 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -401,6 +401,10 @@ func init() { FromBlock: pstring("2301220"), Address: []ethtypes.EthAddress{ethaddr}, }) + + percent := types.Percent(123) + addExample(percent) + addExample(&percent) } func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index bd8810929825a503b8986d7178ffbda8f4354c82..dfa68e4f37c5b836f2e599d091be8266a7ef01ed 100644 GIT binary patch delta 8498 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 1.00). +type Percent int64 + +func (p Percent) String() string { + abs := p + sign := "" + if abs < 0 { + abs = -abs + sign = "-" + } + return fmt.Sprintf(`%s%d.%d`, sign, abs/100, abs%100) +} + +func (p Percent) MarshalJSON() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *Percent) UnmarshalJSON(b []byte) error { + flt, err := strconv.ParseFloat(string(b)+"e2", 64) + if err != nil { + return xerrors.Errorf("unable to parse ratio %s: %w", string(b), err) + } + if math.Trunc(flt) != flt { + return xerrors.Errorf("ratio may only have two decimals: %s", string(b)) + } + *p = Percent(flt) + return nil +} diff --git a/chain/types/percent_test.go b/chain/types/percent_test.go new file mode 100644 index 000000000..7364c2447 --- /dev/null +++ b/chain/types/percent_test.go @@ -0,0 +1,34 @@ +package types + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPercent(t *testing.T) { + for _, tc := range []struct { + p Percent + s string + }{ + {100, "1.0"}, + {111, "1.11"}, + {12, "0.12"}, + {-12, "-0.12"}, + {1012, "10.12"}, + {-1012, "-10.12"}, + {0, "0.0"}, + } { + tc := tc + t.Run(fmt.Sprintf("%d <> %s", tc.p, tc.s), func(t *testing.T) { + m, err := tc.p.MarshalJSON() + require.NoError(t, err) + require.Equal(t, tc.s, string(m)) + var p Percent + require.NoError(t, p.UnmarshalJSON([]byte(tc.s))) + require.Equal(t, tc.p, p) + }) + } + +} diff --git a/cli/mpool.go b/cli/mpool.go index e098806cb..c83fb4b61 100644 --- a/cli/mpool.go +++ b/cli/mpool.go @@ -461,7 +461,12 @@ var MpoolReplaceCmd = &cli.Command{ msg := found.Message if cctx.Bool("auto") { - minRBF := messagepool.ComputeMinRBF(msg.GasPremium) + cfg, err := api.MpoolGetConfig(ctx) + if err != nil { + return xerrors.Errorf("failed to lookup the message pool config: %w", err) + } + + defaultRBF := messagepool.ComputeRBF(msg.GasPremium, cfg.ReplaceByFeeRatio) var mss *lapi.MessageSendSpec if cctx.IsSet("fee-limit") { @@ -482,7 +487,7 @@ var MpoolReplaceCmd = &cli.Command{ return xerrors.Errorf("failed to estimate gas values: %w", err) } - msg.GasPremium = big.Max(retm.GasPremium, minRBF) + msg.GasPremium = big.Max(retm.GasPremium, defaultRBF) msg.GasFeeCap = big.Max(retm.GasFeeCap, msg.GasPremium) mff := func() (abi.TokenAmount, error) { diff --git a/cli/mpool_test.go b/cli/mpool_test.go index 01b49d4b3..0aa055ba3 100644 --- a/cli/mpool_test.go +++ b/cli/mpool_test.go @@ -15,6 +15,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/messagepool" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/mock" "github.com/filecoin-project/lotus/chain/wallet" @@ -298,6 +299,7 @@ func TestReplace(t *testing.T) { mockApi.EXPECT().ChainGetMessage(ctx, sm.Cid()).Return(&sm.Message, nil), mockApi.EXPECT().ChainHead(ctx).Return(nil, nil), mockApi.EXPECT().MpoolPending(ctx, types.EmptyTSK).Return([]*types.SignedMessage{sm}, nil), + mockApi.EXPECT().MpoolGetConfig(ctx).Return(messagepool.DefaultConfig(), nil), // use gomock.any to match the message in expected api calls // since the replace function modifies the message between calls, it would be pointless to try to match the exact argument mockApi.EXPECT().GasEstimateMessageGas(ctx, gomock.Any(), &mss, types.EmptyTSK).Return(&sm.Message, nil), @@ -342,6 +344,7 @@ func TestReplace(t *testing.T) { gomock.InOrder( mockApi.EXPECT().ChainHead(ctx).Return(nil, nil), mockApi.EXPECT().MpoolPending(ctx, types.EmptyTSK).Return([]*types.SignedMessage{sm}, nil), + mockApi.EXPECT().MpoolGetConfig(ctx).Return(messagepool.DefaultConfig(), nil), // use gomock.any to match the message in expected api calls // since the replace function modifies the message between calls, it would be pointless to try to match the exact argument mockApi.EXPECT().GasEstimateMessageGas(ctx, gomock.Any(), &mss, types.EmptyTSK).Return(&sm.Message, nil), @@ -538,7 +541,7 @@ func TestConfig(t *testing.T) { t.Fatal(err) } - mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 1234567, SizeLimitLow: 6, ReplaceByFeeRatio: 0.25} + mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 1234567, SizeLimitLow: 6, ReplaceByFeeRatio: types.Percent(25)} gomock.InOrder( mockApi.EXPECT().MpoolGetConfig(ctx).Return(mpoolCfg, nil), ) @@ -566,7 +569,7 @@ func TestConfig(t *testing.T) { t.Fatal(err) } - mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 234567, SizeLimitLow: 3, ReplaceByFeeRatio: 0.33} + mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 234567, SizeLimitLow: 3, ReplaceByFeeRatio: types.Percent(33)} gomock.InOrder( mockApi.EXPECT().MpoolSetConfig(ctx, mpoolCfg).Return(nil), ) diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index fe639b2f3..e47b90904 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -2879,7 +2879,7 @@ Response: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } @@ -3167,7 +3167,7 @@ Inputs: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 8e8176c23..5c3ac336d 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -3816,7 +3816,7 @@ Response: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } @@ -4104,7 +4104,7 @@ Inputs: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } From 51d0d5e5490cd4e96901979dd82d6cb9ff7c6727 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 19:24:18 -0500 Subject: [PATCH 17/18] make gen --- build/openrpc/full.json.gz | Bin 33289 -> 33289 bytes build/openrpc/gateway.json.gz | Bin 9295 -> 9295 bytes build/openrpc/miner.json.gz | Bin 16043 -> 16043 bytes build/openrpc/worker.json.gz | Bin 5221 -> 5221 bytes documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 7 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index dfa68e4f37c5b836f2e599d091be8266a7ef01ed..acf4fb80f258800544f3a0b31b0fd6b00ecce16d 100644 GIT binary patch literal 33289 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 literal 33289 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 ZhsV8t{`vmT{|5j7|NjBLDEphQ1^|phe82zz diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index b25ce7cbe1ab3cfd377be9c3d92391adffab78bd..bae9a6a79b0245962fcf82e4f79d013a96bf1865 100644 GIT binary patch delta 21 dcmX@_ao%G>6XUOq%}10u?k!!a-tw1`0RVW|3NQcw delta 21 dcmX@_ao%G>6JyoJ<|E1+Ih7L)TmCXK003;x2?ziH diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 1bbcff07417c74e3b4f49e6af62f4194f3a6f970..be588eccd3e652a06e6545ca11925ca275713d2a 100644 GIT binary patch delta 21 dcmZ2oySjElE91hAZL)S8-=~Bye3WKp003<#2#^2( delta 21 dcmZ2oySjElD`VrvHd#B4Gu!We{3y-L0046D3E}_% diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 8aa648469a10cdd793a646a4af4076708f2a6b81..1f10d091011e00ff878bf3e9976e387f7945eb3f 100644 GIT binary patch delta 5137 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 diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 82c9ba147..782441813 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.20.1 + 1.20.2 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 1673ba528..bf1fa68b0 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.20.1 + 1.20.2 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index e581d13cc..e9ff4a6ee 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.20.1 + 1.20.2 COMMANDS: daemon Start a lotus daemon process From 4def0a53e0f5838050636fc46bb59390ed5a2905 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 19:39:07 -0500 Subject: [PATCH 18/18] change log --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b13ba3f6..84b67b84d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Lotus changelog +# v1.20.2 / 2023-03-09 + +This is a HIGHLY RECOMMENDED patch release for node operators/API service providers that run ETH RPC service and an optional release for Storage Providers. + +## Bug fixes +- fix: EthAPI: use StateCompute for feeHistory; apply minimum gas premium #10413 +- fix: eth API: return correct txIdx around null blocks #10419 +- fix: Eth API: make block parameter parsing sounder. #10427 + +## Improvement +- feat: Lotus Gateway: Add missing methods - master #10420 +- feat: mempool: Reduce minimum replace fee from 1.25x to 1.1x #10416 + - We recommend storage providers to update your nodes to this patch, that will help improve developers who use Ethereum tooling's experience. + # v1.20.1 / 2023-03-06 This an optional patch releases for node operators/API service providers that run ETH RPC service.