mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-01-16 15:25:24 +00:00
0a80a3bb25
This avoid restarting the node always with a full radius, which causes the node the be bombarded with offers which it later has to delete anyhow. In order to implement this functionality, several changes were made as the radius needed to move from the Portal wire protocol current location to the contentDB and beaconDB, which is conceptually more correct anyhow. So radius is now part of the database objects and a handler is used in the portal wire protocol to access its value.
111 lines
3.0 KiB
Nim
111 lines
3.0 KiB
Nim
# Fluffy
|
|
# Copyright (c) 2021-2024 Status Research & Development GmbH
|
|
# Licensed and distributed under either of
|
|
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
|
|
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
{.push raises: [].}
|
|
|
|
import std/strutils, confutils, chronos, stint, eth/p2p/discoveryv5/routing_table
|
|
|
|
type
|
|
PortalNetwork* = enum
|
|
none
|
|
mainnet
|
|
angelfood
|
|
|
|
# The Portal sub-protocols
|
|
PortalSubnetwork* = enum
|
|
state
|
|
history
|
|
beacon
|
|
transactionIndex
|
|
verkleState
|
|
transactionGossip
|
|
|
|
RadiusConfigKind* = enum
|
|
Static
|
|
Dynamic
|
|
|
|
RadiusConfig* = object
|
|
case kind*: RadiusConfigKind
|
|
of Static:
|
|
logRadius*: uint16
|
|
of Dynamic:
|
|
discard
|
|
|
|
PortalProtocolConfig* = object
|
|
tableIpLimits*: TableIpLimits
|
|
bitsPerHop*: int
|
|
radiusConfig*: RadiusConfig
|
|
disablePoke*: bool
|
|
|
|
const
|
|
defaultRadiusConfig* = RadiusConfig(kind: Dynamic)
|
|
defaultRadiusConfigDesc* = $defaultRadiusConfig.kind
|
|
defaultDisablePoke* = false
|
|
revalidationTimeout* = chronos.seconds(30)
|
|
|
|
defaultPortalProtocolConfig* = PortalProtocolConfig(
|
|
tableIpLimits: DefaultTableIpLimits,
|
|
bitsPerHop: DefaultBitsPerHop,
|
|
radiusConfig: defaultRadiusConfig,
|
|
)
|
|
|
|
proc init*(
|
|
T: type PortalProtocolConfig,
|
|
tableIpLimit: uint,
|
|
bucketIpLimit: uint,
|
|
bitsPerHop: int,
|
|
radiusConfig: RadiusConfig,
|
|
disablePoke: bool,
|
|
): T =
|
|
PortalProtocolConfig(
|
|
tableIpLimits:
|
|
TableIpLimits(tableIpLimit: tableIpLimit, bucketIpLimit: bucketIpLimit),
|
|
bitsPerHop: bitsPerHop,
|
|
radiusConfig: radiusConfig,
|
|
disablePoke: disablePoke,
|
|
)
|
|
|
|
func fromLogRadius*(T: type UInt256, logRadius: uint16): T =
|
|
# Get the max value of the logRadius range
|
|
pow((2).stuint(256), logRadius) - 1
|
|
|
|
## Confutils parsers
|
|
|
|
proc parseCmdArg*(T: type RadiusConfig, p: string): T {.raises: [ValueError].} =
|
|
if p.startsWith("dynamic") and len(p) == 7:
|
|
RadiusConfig(kind: Dynamic)
|
|
elif p.startsWith("static:"):
|
|
let num = p[7 ..^ 1]
|
|
let parsed =
|
|
try:
|
|
uint16.parseCmdArg(num)
|
|
except ValueError:
|
|
let msg = "Provided logRadius: " & num & " is not a valid number"
|
|
raise newException(ValueError, msg)
|
|
|
|
if parsed > 256:
|
|
raise newException(ValueError, "Provided logRadius should be <= 256")
|
|
|
|
RadiusConfig(kind: Static, logRadius: parsed)
|
|
else:
|
|
let parsed =
|
|
try:
|
|
uint16.parseCmdArg(p)
|
|
except ValueError:
|
|
let msg =
|
|
"Not supported radius config option: " & p & " . " &
|
|
"Supported options: dynamic and static:logRadius"
|
|
raise newException(ValueError, msg)
|
|
|
|
if parsed > 256:
|
|
raise newException(ValueError, "Provided logRadius should be <= 256")
|
|
|
|
RadiusConfig(kind: Static, logRadius: parsed)
|
|
|
|
proc completeCmdArg*(T: type RadiusConfig, val: string): seq[string] =
|
|
return @[]
|