From 0ef65d1bb958002fcbfbb6f92d6c8da9cc47bf9f Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Fri, 11 Sep 2020 15:41:08 +0300 Subject: [PATCH 1/3] config: add minimum network fee setting Follow neo-project/neo#1901. --- config/protocol.mainnet.yml | 1 + config/protocol.testnet.yml | 1 + pkg/config/protocol_config.go | 4 +++- pkg/core/blockchain.go | 9 ++++++++- pkg/rpc/server/server.go | 5 +++++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/config/protocol.mainnet.yml b/config/protocol.mainnet.yml index 14f163821..65eae8412 100644 --- a/config/protocol.mainnet.yml +++ b/config/protocol.mainnet.yml @@ -36,6 +36,7 @@ ProtocolConfiguration: MaxTransactionsPerBlock: 500 MaxFreeTransactionsPerBlock: 20 MaxFreeTransactionSize: 1024 + MinimumNetworkFee: 0 FeePerExtraByte: 0.00001 ApplicationConfiguration: diff --git a/config/protocol.testnet.yml b/config/protocol.testnet.yml index ccfe6a689..fa04b58ec 100644 --- a/config/protocol.testnet.yml +++ b/config/protocol.testnet.yml @@ -36,6 +36,7 @@ ProtocolConfiguration: MaxTransactionsPerBlock: 500 MaxFreeTransactionsPerBlock: 20 MaxFreeTransactionSize: 1024 + MinimumNetworkFee: 0 FeePerExtraByte: 0.00001 ApplicationConfiguration: diff --git a/pkg/config/protocol_config.go b/pkg/config/protocol_config.go index acd2bb203..13c2deba5 100644 --- a/pkg/config/protocol_config.go +++ b/pkg/config/protocol_config.go @@ -36,7 +36,9 @@ type ( MaxFreeTransactionSize int `yaml:"MaxFreeTransactionSize"` // Maximum number of low priority transactions accepted into block. MaxFreeTransactionsPerBlock int `yaml:"MaxFreeTransactionsPerBlock"` - MemPoolSize int `yaml:"MemPoolSize"` + // MinimumNetworkFee sets the minimum required network fee for transaction to pass validation. + MinimumNetworkFee util.Fixed8 `yaml:"MinimumNetworkFee"` + MemPoolSize int `yaml:"MemPoolSize"` // SaveStorageBatch enables storage batch saving before every persist. SaveStorageBatch bool `yaml:"SaveStorageBatch"` SecondsPerBlock int `yaml:"SecondsPerBlock"` diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index 1481302b1..2bcf7c777 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -168,6 +168,10 @@ func NewBlockchain(s storage.Store, cfg config.ProtocolConfiguration, log *zap.L cfg.MaxFreeTransactionSize = 0 log.Info("MaxFreeTransactionSize is not set or wrong, setting default value (unlimited)", zap.Int("MaxFreeTransactionSize", cfg.MaxFreeTransactionSize)) } + if cfg.MinimumNetworkFee < 0 { + cfg.MinimumNetworkFee = 0 + log.Info("MinimumNetworkFee is not set or wrong, setting default value (0)", zap.String("MinimumNetworkFee", cfg.MinimumNetworkFee.String())) + } if cfg.FeePerExtraByte <= 0 { cfg.FeePerExtraByte = 0 log.Info("FeePerExtraByte is not set or wrong, setting default value", zap.Float64("FeePerExtraByte", cfg.FeePerExtraByte)) @@ -1996,13 +2000,16 @@ func (bc *Blockchain) PoolTx(t *transaction.Transaction) error { if t.Type != transaction.ClaimType { txSize := io.GetVarSize(t) maxFree := bc.config.MaxFreeTransactionSize + netFee := bc.NetworkFee(t) if maxFree != 0 && txSize > maxFree { - netFee := bc.NetworkFee(t) if bc.IsLowPriority(netFee) || netFee < util.Fixed8FromFloat(bc.config.FeePerExtraByte)*util.Fixed8(txSize-maxFree) { return ErrPolicy } } + if t.Type == transaction.InvocationType && netFee < bc.config.MinimumNetworkFee { + return ErrPolicy + } } if err := bc.memPool.Add(t, bc); err != nil { switch err { diff --git a/pkg/rpc/server/server.go b/pkg/rpc/server/server.go index 216f6d3be..e05671399 100644 --- a/pkg/rpc/server/server.go +++ b/pkg/rpc/server/server.go @@ -89,6 +89,7 @@ var rpcHandlers = map[string]func(*Server, request.Params) (interface{}, *respon "getclaimable": (*Server).getClaimable, "getconnectioncount": (*Server).getConnectionCount, "getcontractstate": (*Server).getContractState, + "getminimumnetworkfee": (*Server).getMinimumNetworkFee, "getnep5balances": (*Server).getNEP5Balances, "getnep5transfers": (*Server).getNEP5Transfers, "getpeers": (*Server).getPeers, @@ -798,6 +799,10 @@ func (s *Server) getNEP5Transfers(ps request.Params) (interface{}, *response.Err return bs, nil } +func (s *Server) getMinimumNetworkFee(ps request.Params) (interface{}, *response.Error) { + return s.chain.GetConfig().MinimumNetworkFee, nil +} + func (s *Server) getProof(ps request.Params) (interface{}, *response.Error) { root, err := ps.Value(0).GetUint256() if err != nil { From c4d287f3262ed2b3656e8a8e12e7f87b7c464c63 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Fri, 11 Sep 2020 16:48:52 +0300 Subject: [PATCH 2/3] config: update FreeGas values Based on neo-project/neo-node#656 changes. --- config/protocol.mainnet.yml | 2 +- config/protocol.testnet.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/protocol.mainnet.yml b/config/protocol.mainnet.yml index 65eae8412..e809b7eca 100644 --- a/config/protocol.mainnet.yml +++ b/config/protocol.mainnet.yml @@ -32,7 +32,7 @@ ProtocolConfiguration: RegisterTransaction: 10000 VerifyBlocks: true VerifyTransactions: false - FreeGasLimit: {0: 10.0, 6200000: 50.0} + FreeGasLimit: {0: 10.0, 6216000: 50.0} MaxTransactionsPerBlock: 500 MaxFreeTransactionsPerBlock: 20 MaxFreeTransactionSize: 1024 diff --git a/config/protocol.testnet.yml b/config/protocol.testnet.yml index fa04b58ec..85214ee85 100644 --- a/config/protocol.testnet.yml +++ b/config/protocol.testnet.yml @@ -32,7 +32,7 @@ ProtocolConfiguration: RegisterTransaction: 100 VerifyBlocks: true VerifyTransactions: false - FreeGasLimit: {0: 10.0, 4818000: 50.0} + FreeGasLimit: {0: 10.0, 5220000: 50.0} MaxTransactionsPerBlock: 500 MaxFreeTransactionsPerBlock: 20 MaxFreeTransactionSize: 1024 From e14ba6c85541d73bc372aadf8868962f23815cfd Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Fri, 11 Sep 2020 16:52:58 +0300 Subject: [PATCH 3/3] core: fix policy-enforcing network fee check 0.001 should be added to the 'extra' value as per https://neo.org/blog/details/4148 --- pkg/core/blockchain.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index 2bcf7c777..812925fcc 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -2003,7 +2003,7 @@ func (bc *Blockchain) PoolTx(t *transaction.Transaction) error { netFee := bc.NetworkFee(t) if maxFree != 0 && txSize > maxFree { if bc.IsLowPriority(netFee) || - netFee < util.Fixed8FromFloat(bc.config.FeePerExtraByte)*util.Fixed8(txSize-maxFree) { + netFee < (util.Fixed8FromFloat(bc.config.LowPriorityThreshold)+util.Fixed8FromFloat(bc.config.FeePerExtraByte)*util.Fixed8(txSize-maxFree)) { return ErrPolicy } }