nimbus-eth1/fluffy/network/wire/portal_protocol_config.nim

137 lines
3.8 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
alpha*: int
radiusConfig*: RadiusConfig
disablePoke*: bool
maxGossipNodes*: int
contentCacheSize*: int
disableContentCache*: bool
maxConcurrentOffers*: int
const
defaultRadiusConfig* = RadiusConfig(kind: Dynamic)
defaultRadiusConfigDesc* = $defaultRadiusConfig.kind
defaultDisablePoke* = false
defaultMaxGossipNodes* = 4
defaultContentCacheSize* = 100
defaultDisableContentCache* = false
defaultMaxConcurrentOffers* = 50
defaultAlpha* = 3
revalidationTimeout* = chronos.seconds(30)
defaultPortalProtocolConfig* = PortalProtocolConfig(
tableIpLimits: DefaultTableIpLimits,
bitsPerHop: DefaultBitsPerHop,
alpha: defaultAlpha,
radiusConfig: defaultRadiusConfig,
disablePoke: defaultDisablePoke,
maxGossipNodes: defaultMaxGossipNodes,
contentCacheSize: defaultContentCacheSize,
disableContentCache: defaultDisableContentCache,
maxConcurrentOffers: defaultMaxConcurrentOffers,
)
proc init*(
T: type PortalProtocolConfig,
tableIpLimit: uint,
bucketIpLimit: uint,
bitsPerHop: int,
alpha: int,
radiusConfig: RadiusConfig,
disablePoke: bool,
maxGossipNodes: int,
contentCacheSize: int,
disableContentCache: bool,
maxConcurrentOffers: int,
): T =
PortalProtocolConfig(
tableIpLimits:
TableIpLimits(tableIpLimit: tableIpLimit, bucketIpLimit: bucketIpLimit),
bitsPerHop: bitsPerHop,
alpha: alpha,
radiusConfig: radiusConfig,
disablePoke: disablePoke,
maxGossipNodes: maxGossipNodes,
contentCacheSize: contentCacheSize,
disableContentCache: disableContentCache,
maxConcurrentOffers: maxConcurrentOffers,
)
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 @[]