Network
Introduction
The network layer in aelf is vital for maintaining connections and communication between nodes. It supports higher-level logic like synchronization and allows node operators to monitor and manage network operations. aelf uses gRPC for connections to keep the design simple and flexible.
Architecture
The network consists of three layers:
-
aelf.OS
- Handles network events.
- Runs background tasks for network operations.
-
aelf.OS.Core.Network
- Provides services to higher levels.
- Defines infrastructure components and types.
-
aelf.OS.Network.Grpc
- Implements the infrastructure layer using gRPC.
- Manages low-level functions like serialization and retrying.
aelf.OS
This layer monitors and handles network-related events:
- Transaction Accepted Event: When a transaction is verified.
- Block Mined Event: When a block is packaged.
- Block Accepted Event: When a block is executed successfully.
- New Irreversible Block Found Event: When a new irreversible block is found.
It also performs regular tasks:
- Peer Health Check: Ensures connected peers are healthy.
- Peer Retry Connection: Attempts to reconnect with unhealthy peers.
- Network Node Discovery: Finds new nodes.
aelf.OS.Core.Network
This core module includes:
- NetworkService: Manages sending/receiving requests, broadcasting items to peers, and handling network exceptions.
- IPeerPool/PeerPool: Manages active peer connections.
- IPeer: Defines peer interactions and metrics.
- IaelfNetworkServer: Manages network lifecycle and connections.
aelf.OS.Network.Grpc
Implements the infrastructure layer using gRPC:
- GrpcPeer: Implements
IPeer
. - GrpcStreamPeer: Client-side
IPeer
implementation (node version >=1.4.0). - GrpcStreamBackPeer: Server-side
IPeer
implementation (node version >=1.4.0). - GrpcNetworkServer: Implements
IaelfNetworkServer
. - GrpcServerService: Manages network service interfaces and data exchange.
Extra functionalities include:
- Serializing and deserializing requests.
- Implementing request/response mechanisms.
- Authentication.
Protocol
Nodes use a defined network interface protocol for normal operation and data synchronization.
Connection
DoHandshake
When a node connects, it exchanges handshake information. This includes chain status, current height, and more.
- Request:
rpc DoHandshake (HandshakeRequest) returns (HandshakeReply) {}
- Handshake Message:
message Handshake {
HandshakeData handshake_data = 1;
bytes signature = 2;
bytes session_id = 3;
} - HandshakeData Message:
message HandshakeData {
int32 chain_id = 1;
int32 version = 2;
int32 listening_port = 3;
bytes pubkey = 4;
aelf.Hash best_chain_hash = 5;
int64 best_chain_height = 6;
aelf.Hash last_irreversible_block_hash = 7;
int64 last_irreversible_block_height = 8;
google.protobuf.Timestamp time = 9;
}
ConfirmHandshake
Confirms the handshake with the target node.
- Request:
rpc ConfirmHandshake (ConfirmHandshakeRequest) returns (VoidReply) {}
Broadcasting
BlockBroadcastStream
Receives block information after packaging.
- Request:
rpc BlockBroadcastStream (stream BlockWithTransactions) returns (VoidReply) {}
TransactionBroadcastStream
Receives forwarded transaction information.
- Request:
rpc TransactionBroadcastStream (stream aelf.Transaction) returns (VoidReply) {}
AnnouncementBroadcastStream
Receives block announcements.
- Request:
rpc AnnouncementBroadcastStream (stream BlockAnnouncement) returns (VoidReply) {}
LibAnnouncementBroadcastStream
Receives last irreversible block (LIB) announcements.
- Request:
rpc LibAnnouncementBroadcastStream (stream LibAnnouncement) returns (VoidReply) {}
Block Request
RequestBlock
Requests a single block.
- Request:
rpc RequestBlock (BlockRequest) returns (BlockReply) {}
RequestBlocks
Requests multiple blocks.
- Request:
rpc RequestBlocks (BlocksRequest) returns (BlockList) {}
Peer Management
Ping
Verifies network availability.
- Request:
rpc Ping (PingRequest) returns (PongReply) {}
CheckHealth
Performs health checks on peers.
- Request:
rpc CheckHealth (HealthCheckRequest) returns (HealthCheckReply) {}