Implementation of ALSP manager is available here: manager.go Note that this readme is primarily focusing on the ALSP manager. For more details regarding the ALSP system please refer to readme.md.
Figure below illustrates the ALSP manager’s role in the reporting of misbehavior and the management of node penalties as
well as the interactions between the ALSP manager and the LibP2PNode, ConnectionGater, and PeerManager components for
the disallow listing and allow listing processes.
In the event that an engine detects misbehavior within a channel,
it is imperative to report this finding to the ALSP manager.
This is achieved by invoking the ReportMisbehavior method on the conduit corresponding to the engine.
The ALSP manager is responsible for maintaining records of misbehavior reports associated with
remote nodes and for calculating their accumulated misbehavior penalties.
Should a node’s misbehavior penalty surpass a certain threshold
(referred to as DisallowListingThreshold), the ALSP manager initiates the disallow listing process. When a remote node is disallow-listed,
it is effectively isolated from the network by the ConnectionGater and PeerManager components, i.e., the existing
connections to that remote node are closed and new connections attempts are rejected.
-
The ALSP manager communicates with the
LibP2PNodeby calling itsOnDisallowListNotificationmethod to indicate that a particular remote node has been disallow-listed. -
In response, the
LibP2PNodetakes two important actions:a. It alerts the
PeerManager, instructing it to sever the connection with the disallow-listed node. b. It notifies theConnectionGaterto block any incoming or outgoing connections to and from the disallow-listed node. This ensures that the disallow-listed node is effectively isolated from the local node's network.
The ALSP manager also includes a penalty decay mechanism, which gradually reduces the penalties of nodes over time upon regular heartbeat intervals (default is every one second).
Once a disallow-listed node's penalty decays back to zero, the node can be reintegrated into the network through the allow listing process. The allow-listing process involves allowing
the ConnectionGater to lift the block on the disallow-listed node and instructing the PeerManager to initiate an outbound connection with the allow-listed node.
-
The ALSP manager calls the
OnAllowListNotificationmethod on theLibP2PNodeto signify that a previously disallow-listed node is now allow-listed. -
The
LibP2PNoderesponds by:a. Instructing the
ConnectionGaterto lift the block, thereby permitting connections with the now allow-listed node. b. Requesting thePeerManagerto initiate an outbound connection with the allow-listed node.
This series of actions allows the rehabilitated node to be reintegrated and actively participate in the network once again.

The ALSP (Application Layer Spam Prevention) Manager handles application layer spamming misbehavior reports and penalizes misbehaving nodes. It also disallow-lists nodes whose penalties drop below a threshold.
- Misbehavior Reports: When a local engine detects a spamming misbehavior of a remote node, it sends a report to the ALSP manager, by invoking the
HandleMisbehaviorReportmethod of the corresponding conduit on which the misbehavior was detected. The manager handles the report in a thread-safe and non-blocking manner, using worker pools.
func (m *MisbehaviorReportManager) HandleMisbehaviorReport(channel channels.Channel, report network.MisbehaviorReport) {
// Handle the report
}-
Penalties: Misbehaving nodes are penalized by the manager. The manager keeps a cache of records with penalties for each node. The penalties are decayed over time through periodic heartbeats.
-
Disallow-listing: Nodes whose penalties drop below a threshold are disallow-listed.
-
Heartbeats: Periodic heartbeats allow the manager to perform recurring tasks, such as decaying the penalties of misbehaving nodes.
func (m *MisbehaviorReportManager) heartbeatLoop(ctx irrecoverable.SignalerContext, interval time.Duration) {
// Handle heartbeats
}- Disallow-list Notification Consumer: is the interface of the consumer of disallow-list notifications, which is
responsible for taking actions when a node is disallow-listed, i.e., closing exisitng connections with the remote disallow-listed
node and blocking any incoming or outgoing connections to that node. The consumer is passed to the manager when it is created.
In the current implementation the consumer is the instance of the
LibP2PNodecomponent of the node.
disallowListingConsumer network.DisallowListNotificationConsumerThe configuration includes settings like cache size, heartbeat intervals, and network type.