From 5d05048de95b5b2115b85205a00ae3b820c0e92c Mon Sep 17 00:00:00 2001 From: Makis Christou Date: Wed, 26 Jun 2024 08:43:24 +0300 Subject: [PATCH 1/3] Increase bandwidth coverage (#727) * Increase bandwidth coverage * Cleanup * Remove whitespaces * Fix BandwidthSuggestGasLimit error message --------- Co-authored-by: libotony --- cmd/thor/bandwidth/bandwidth_test.go | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 cmd/thor/bandwidth/bandwidth_test.go diff --git a/cmd/thor/bandwidth/bandwidth_test.go b/cmd/thor/bandwidth/bandwidth_test.go new file mode 100644 index 000000000..ed4e11230 --- /dev/null +++ b/cmd/thor/bandwidth/bandwidth_test.go @@ -0,0 +1,65 @@ +// Copyright (c) 2024 The VeChainThor developers + +// Distributed under the GNU Lesser General Public License v3.0 software license, see the accompanying +// file LICENSE or + +package bandwidth + +import ( + "crypto/rand" + "sync" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/vechain/thor/v2/block" + "github.com/vechain/thor/v2/thor" +) + +func TestBandwidth(t *testing.T) { + bandwidth := Bandwidth{ + value: 0, + lock: sync.Mutex{}, + } + + val := bandwidth.Value() + + assert.Equal(t, uint64(0), val) +} + +func GetMockHeader(t *testing.T) *block.Header { + var sig [65]byte + rand.Read(sig[:]) + + block := new(block.Builder).Build().WithSignature(sig[:]) + h := block.Header() + return h +} + +func TestBandwithUpdate(t *testing.T) { + bandwidth := Bandwidth{ + value: 0, + lock: sync.Mutex{}, + } + + block := new(block.Builder).ParentID(thor.Bytes32{1}).Timestamp(1).GasLimit(100000).Beneficiary(thor.Address{1}).GasUsed(11234).TotalScore(1).StateRoot(thor.Bytes32{1}).ReceiptsRoot(thor.Bytes32{1}).Build() + header := block.Header() + + bandwidth.Update(header, 1) + val := bandwidth.Value() + + assert.Equal(t, uint64(11234000000000), val) +} + +func TestBandwidthSuggestGasLimit(t *testing.T) { + bandwidth := Bandwidth{ + value: 0, + lock: sync.Mutex{}, + } + + block := new(block.Builder).ParentID(thor.Bytes32{1}).Timestamp(1).GasLimit(100000).Beneficiary(thor.Address{1}).GasUsed(11234).TotalScore(1).StateRoot(thor.Bytes32{1}).ReceiptsRoot(thor.Bytes32{1}).Build() + header := block.Header() + bandwidth.Update(header, 1) + val := bandwidth.SuggestGasLimit() + + assert.Equal(t, uint64(5617000000000), val) +} From ca6d8be493843bb1a1fcbad481030291df47b087 Mon Sep 17 00:00:00 2001 From: libotony Date: Mon, 1 Jul 2024 14:55:24 +0800 Subject: [PATCH 2/3] doc: add release hint for build from source (#780) --- docs/build.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/build.md b/docs/build.md index 42e1a7d29..4c708be86 100644 --- a/docs/build.md +++ b/docs/build.md @@ -13,6 +13,12 @@ git clone https://github.com/vechain/thor.git cd thor ``` +It is recommended to use the latest stable release. To checkout the latest stable release, run: + +```shell +git checkout $(git describe --tags `git rev-list --tags --max-count=1`) +``` + To see a list of all available commands, run `make help` ### Building From ef9367617ed1d94313937a21c50aed6f9ca66ba6 Mon Sep 17 00:00:00 2001 From: libotony Date: Mon, 8 Jul 2024 22:11:42 +0800 Subject: [PATCH 3/3] use uint64 for number flags (#779) * use uint64 for number flags * improve func readIntFromUInt64Flag --- cmd/thor/flags.go | 28 ++++++++++++++-------------- cmd/thor/main.go | 43 ++++++++++++++++++++++++++++--------------- cmd/thor/utils.go | 15 ++++++++++++--- 3 files changed, 54 insertions(+), 32 deletions(-) diff --git a/cmd/thor/flags.go b/cmd/thor/flags.go index ad52e5d30..69267d36d 100644 --- a/cmd/thor/flags.go +++ b/cmd/thor/flags.go @@ -45,17 +45,17 @@ var ( Value: "", Usage: "comma separated list of domains from which to accept cross origin requests to API", } - apiTimeoutFlag = cli.IntFlag{ + apiTimeoutFlag = cli.Uint64Flag{ Name: "api-timeout", Value: 10000, Usage: "API request timeout value in milliseconds", } - apiCallGasLimitFlag = cli.IntFlag{ + apiCallGasLimitFlag = cli.Uint64Flag{ Name: "api-call-gas-limit", Value: 50000000, Usage: "limit contract call gas", } - apiBacktraceLimitFlag = cli.IntFlag{ + apiBacktraceLimitFlag = cli.Uint64Flag{ Name: "api-backtrace-limit", Value: 1000, Usage: "limit the distance between 'position' and best block for subscriptions APIs", @@ -64,7 +64,7 @@ var ( Name: "api-allow-custom-tracer", Usage: "allow custom JS tracer to be used tracer API", } - apiLogsLimitFlag = cli.IntFlag{ + apiLogsLimitFlag = cli.Uint64Flag{ Name: "api-logs-limit", Value: 1000, Usage: "limit the number of logs returned by /logs API", @@ -73,17 +73,17 @@ var ( Name: "enable-api-logs", Usage: "enables API requests logging", } - verbosityFlag = cli.IntFlag{ + verbosityFlag = cli.Uint64Flag{ Name: "verbosity", - Value: int(log15.LvlInfo), + Value: uint64(log15.LvlInfo), Usage: "log verbosity (0-9)", } - maxPeersFlag = cli.IntFlag{ + maxPeersFlag = cli.Uint64Flag{ Name: "max-peers", Usage: "maximum number of P2P network peers (P2P network disabled if set to 0)", Value: 25, } - p2pPortFlag = cli.IntFlag{ + p2pPortFlag = cli.Uint64Flag{ Name: "p2p-port", Value: 11235, Usage: "P2P network listening port", @@ -110,7 +110,7 @@ var ( Name: "export", Usage: "export master key to keystore", } - targetGasLimitFlag = cli.IntFlag{ + targetGasLimitFlag = cli.Uint64Flag{ Name: "target-gas-limit", Value: 0, Usage: "target block gas limit (adaptive if set to 0)", @@ -128,7 +128,7 @@ var ( Usage: "verify log db at startup", Hidden: true, } - cacheFlag = cli.IntFlag{ + cacheFlag = cli.Uint64Flag{ Name: "cache", Usage: "megabytes of ram allocated to trie nodes cache", Value: 4096, @@ -152,7 +152,7 @@ var ( Name: "on-demand", Usage: "create new block when there is pending transaction", } - blockInterval = cli.IntFlag{ + blockInterval = cli.Uint64Flag{ Name: "block-interval", Value: 10, Usage: "choose a custom block interval for solo mode (seconds)", @@ -161,17 +161,17 @@ var ( Name: "persist", Usage: "blockchain data storage option, if set data will be saved to disk", } - gasLimitFlag = cli.IntFlag{ + gasLimitFlag = cli.Uint64Flag{ Name: "gas-limit", Value: 40_000_000, Usage: "block gas limit(adaptive if set to 0)", } - txPoolLimitFlag = cli.IntFlag{ + txPoolLimitFlag = cli.Uint64Flag{ Name: "txpool-limit", Value: 10000, Usage: "set tx limit in pool", } - txPoolLimitPerAccountFlag = cli.IntFlag{ + txPoolLimitPerAccountFlag = cli.Uint64Flag{ Name: "txpool-limit-per-account", Value: 16, Usage: "set tx limit per account in pool", diff --git a/cmd/thor/main.go b/cmd/thor/main.go index de68a837a..8eef1cf95 100644 --- a/cmd/thor/main.go +++ b/cmd/thor/main.go @@ -152,7 +152,11 @@ func defaultAction(ctx *cli.Context) error { defer func() { log.Info("exited") }() - initLogger(ctx) + lvl, err := readIntFromUInt64Flag(ctx.Uint64(verbosityFlag.Name)) + if err != nil { + return errors.Wrap(err, "parse verbosity flag") + } + initLogger(log15.Lvl(lvl)) // enable metrics as soon as possible metricsURL := "" @@ -230,14 +234,14 @@ func defaultAction(ctx *cli.Context) error { p2pCommunicator.Communicator(), forkConfig, ctx.String(apiCorsFlag.Name), - uint32(ctx.Int(apiBacktraceLimitFlag.Name)), - uint64(ctx.Int(apiCallGasLimitFlag.Name)), + uint32(ctx.Uint64(apiBacktraceLimitFlag.Name)), + ctx.Uint64(apiCallGasLimitFlag.Name), ctx.Bool(pprofFlag.Name), skipLogs, ctx.Bool(apiAllowCustomTracerFlag.Name), ctx.Bool(enableAPILogsFlag.Name), ctx.Bool(enableMetricsFlag.Name), - uint64(ctx.Int(apiLogsLimitFlag.Name)), + ctx.Uint64(apiLogsLimitFlag.Name), ) defer func() { log.Info("closing API..."); apiCloser() }() @@ -266,7 +270,7 @@ func defaultAction(ctx *cli.Context) error { txPool, filepath.Join(instanceDir, "tx.stash"), p2pCommunicator.Communicator(), - uint64(ctx.Int(targetGasLimitFlag.Name)), + ctx.Uint64(targetGasLimitFlag.Name), skipLogs, forkConfig).Run(exitSignal) } @@ -275,7 +279,11 @@ func soloAction(ctx *cli.Context) error { exitSignal := handleExitSignal() defer func() { log.Info("exited") }() - initLogger(ctx) + lvl, err := readIntFromUInt64Flag(ctx.Uint64(verbosityFlag.Name)) + if err != nil { + return errors.Wrap(err, "parse verbosity flag") + } + initLogger(log15.Lvl(lvl)) // enable metrics as soon as possible metricsURL := "" @@ -309,7 +317,6 @@ func soloAction(ctx *cli.Context) error { var mainDB *muxdb.MuxDB var logDB *logdb.LogDB var instanceDir string - var err error if ctx.Bool(persistFlag.Name) { if instanceDir, err = makeInstanceDir(ctx, gene); err != nil { @@ -344,8 +351,14 @@ func soloAction(ctx *cli.Context) error { } txPoolOption := defaultTxPoolOptions - txPoolOption.Limit = ctx.Int(txPoolLimitFlag.Name) - txPoolOption.LimitPerAccount = ctx.Int(txPoolLimitPerAccountFlag.Name) + txPoolOption.Limit, err = readIntFromUInt64Flag(ctx.Uint64(txPoolLimitFlag.Name)) + if err != nil { + return errors.Wrap(err, "parse txpool-limit flag") + } + txPoolOption.LimitPerAccount, err = readIntFromUInt64Flag(ctx.Uint64(txPoolLimitPerAccountFlag.Name)) + if err != nil { + return errors.Wrap(err, "parse txpool-limit-per-account flag") + } txPool := txpool.New(repo, state.NewStater(mainDB), txPoolOption) defer func() { log.Info("closing tx pool..."); txPool.Close() }() @@ -360,14 +373,14 @@ func soloAction(ctx *cli.Context) error { &solo.Communicator{}, forkConfig, ctx.String(apiCorsFlag.Name), - uint32(ctx.Int(apiBacktraceLimitFlag.Name)), - uint64(ctx.Int(apiCallGasLimitFlag.Name)), + uint32(ctx.Uint64(apiBacktraceLimitFlag.Name)), + ctx.Uint64(apiCallGasLimitFlag.Name), ctx.Bool(pprofFlag.Name), skipLogs, ctx.Bool(apiAllowCustomTracerFlag.Name), ctx.Bool(enableAPILogsFlag.Name), ctx.Bool(enableMetricsFlag.Name), - uint64(ctx.Int(apiLogsLimitFlag.Name)), + ctx.Uint64(apiLogsLimitFlag.Name), ) defer func() { log.Info("closing API..."); apiCloser() }() @@ -380,7 +393,7 @@ func soloAction(ctx *cli.Context) error { srvCloser() }() - blockInterval := ctx.Int(blockInterval.Name) + blockInterval := ctx.Uint64(blockInterval.Name) if blockInterval == 0 { return errors.New("block-interval cannot be zero") } @@ -394,10 +407,10 @@ func soloAction(ctx *cli.Context) error { state.NewStater(mainDB), logDB, txPool, - uint64(ctx.Int(gasLimitFlag.Name)), + ctx.Uint64(gasLimitFlag.Name), ctx.Bool(onDemandFlag.Name), skipLogs, - uint64(blockInterval), + blockInterval, forkConfig).Run(exitSignal) } diff --git a/cmd/thor/utils.go b/cmd/thor/utils.go index 852cd42be..2982bae6a 100644 --- a/cmd/thor/utils.go +++ b/cmd/thor/utils.go @@ -60,9 +60,8 @@ import ( var devNetGenesisID = genesis.NewDevnet().ID() -func initLogger(ctx *cli.Context) { - logLevel := ctx.Int(verbosityFlag.Name) - log15.Root().SetHandler(log15.LvlFilterHandler(log15.Lvl(logLevel), log15.StderrHandler)) +func initLogger(lvl log15.Lvl) { + log15.Root().SetHandler(log15.LvlFilterHandler(lvl, log15.StderrHandler)) // set go-ethereum log lvl to Warn ethLogHandler := ethlog.NewGlogHandler(ethlog.StreamHandler(os.Stderr, ethlog.TerminalFormat(true))) ethLogHandler.Verbosity(ethlog.LvlWarn) @@ -712,3 +711,13 @@ func parseNodeList(list string) ([]*discover.Node, error) { return nodes, nil } + +func readIntFromUInt64Flag(val uint64) (int, error) { + i := int(val) + + if i < 0 { + return 0, fmt.Errorf("invalid value %d ", val) + } + + return i, nil +}