From 4edfb0194cd8e9ff1b8bd6014e3609631d8cda91 Mon Sep 17 00:00:00 2001 From: envestcc Date: Wed, 2 Aug 2023 16:26:28 +0800 Subject: [PATCH] iip 16 --- assets/iip-16-network-arch.jpeg | Bin 0 -> 76378 bytes iip-16.md | 201 ++++++++++++++++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 assets/iip-16-network-arch.jpeg create mode 100644 iip-16.md diff --git a/assets/iip-16-network-arch.jpeg b/assets/iip-16-network-arch.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e5e5b7dc0bf0c92484f878274d86f1d71e1b4442 GIT binary patch literal 76378 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

Y`B!VKKtf4xSAX^z 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 z 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 literal 0 HcmV?d00001 diff --git a/iip-16.md b/iip-16.md new file mode 100644 index 0000000..c5fcaf1 --- /dev/null +++ b/iip-16.md @@ -0,0 +1,201 @@ +``` +IIP: 16 +Title: Support Multiple Node Types within IoTeX Network +Author: ChenChen (chenchen@iotex.me) +Status: WIP +Type: Standards Track +Category: Core +Created: 2023-08-02 +``` + +## Abstract + +This IIP introduces the concept of node types, aiming to enable a diversified network structure in the future. It discusses the registration process and mechanisms associated with node types. Additionally, it introduces the concept of message networks to optimize communication efficiency among diverse node types. By exploring these advancements, this article seeks to enhance the network's flexibility and scalability. + +## Motivation + +Currently, the requirements for becoming a delegate node in the IoTeX network are relatively high. To address this, we propose separating the block proposal task from delegate nodes. By delegating this responsibility to a different set of nodes that require a lower staking requirement, more individuals can actively participate in the network and earn rewards. + +In line with our broader vision for the future of IoTeX, we envision a diverse network comprising various types of nodes, each performing specific functions. This includes consensus nodes, block proposal nodes, w3bstream (WS) compute nodes, and more. These nodes will earn rewards based on their respective roles and contributions to the network. + +To achieve these objectives, it is crucial to establish a solid infrastructure for managing node role assignments. + +## Specification + +### What are Node Types? + +A node type refers to a distinct category or role assigned to a node within the IoTeX network. Each node type is designed to fulfill specific functions and contribute to the network. The introduction of node types allows for specialization and efficient allocation of resources, ensuring that different tasks are performed by nodes with the necessary expertise and functionalities. + +### Why do we need new Node Types? + +Currently, the IoTeX network relies on delegates to validate blocks and maintain the consensus. However, as the network evolves, we envision the introduction of additional node types to enhance its capabilities and accommodate diverse use cases. + +For example, we would like to have oracle nodes that serve as bridges between the blockchain and the real world, transforming real-world data into a usable form in smart contracts. Additionally, there will be bridge nodes that connect nodes from different blockchain networks, allowing users to transfer and exchange assets, information, and value between different blockchain networks. Moreover, there will also be WS nodes capable of receiving data streams from IoT devices and processing, analyzing, and computing on this data. + +### How do we support New Node Types? + +#### Registration + +The registration process plays a vital role in onboarding nodes into the IoTeX network. + +##### Register Action Interface + +The registration action is used to trigger the registration of node types. Different types of node registrations may require different information, but they need to follow a unified specification. Below are the interface definitions that each type of node registration should comply with. + +```go +NodeTypeRegisterAction interface { + OwnerAddress() address.Address + OperatorAddress() address.Address + RewardAddress() address.Address + Amount() *big.Int + Duration() uint32 + AutoStake() bool + CandidateType() uint32 + ExtraData() []byte +} +``` + +Whereas CandidateType represents the type of registered node. ExtraData is used for the personalized data required for registration of different types of nodes. (For example, delegate node registration requires a name.) + +##### Validatation + +A valid registration action must meet the following requirements: +- The staking amount must meet the minimum staking requirements +- The same OperatorAddress or OwnerAddress can only register the same node type once. +- The same OperatorAddress can register as different types of nodes. + +##### Storage + +After successful registration verification, two types of data, NodeType and Staking Bucket, will be stored on blockchain. + +NodeType stores the registration information of nodes, and its structure is defined as follows: +```go +NodeType struct { + Owner address.Address + Operator address.Address + Reward address.Address + Type uint32 + SelfStakeBucketIdx uint64 + extraData []byte +} + +func NodeTypeExtra[T interface{ Deserilized([]byte) error }](c *NodeType, extra T) error { + return extra.Deserilized(c.extraData) +} +``` + +SelfStakeBucketIdx represents the index of the corresponding bucket. The personalized data of different node types is stored in extraData, which can be parsed into the corresponding structure for easy access using the NodeTypeExtra method. + +The Staking Bucket inherits the native staking bucket from before, and its definition is as follows: +```go +VoteBucket struct { + Index uint64 + Candidate address.Address + Owner address.Address + StakedAmount *big.Int + StakedDuration time.Duration + CreateTime time.Time + StakeStartTime time.Time + UnstakeStartTime time.Time + AutoStake bool +} +``` + +For the candidate to be consistent with the owner, it indicates a self-stake bucket. Not all operations on buckets are supported. The detail is as follows (checked means support the operation): +- Unstake: ✅ +- Withdraw: ✅ +- Restake: ✅ +- Deposit: ✅ +- ChangeDelegate +- Transfer + +##### Retrieve + +After completing the registration, you can obtain information on all nodes of a specified type through the staking protocol. The interface is defined as follows: +```go +type Protocol interface{ + NodeTypes(nodeType uint32) []NodeType +} +``` + +#### Revoke + +If a user no longer wishes to continue running as a registered node in the network, they can initiate the exit process at any time. +1. Non-auto-stake: If the bucket's status is set to auto-stake, the user needs to perform a restake operation first to switch the status to non-auto-stake. +2. Waiting staking period: Starting from the moment of non-auto-stake, the user needs to wait for the staking period of the corresponding bucket. During this period, the node's registration type remains effective. +3. Unstake: After the staking period ends, the user can perform an unstake operation. Once completed, the node's registration type becomes invalid. +4. Waiting for 3 days: Starting from the moment of unstake, the user needs to wait for three days. +5. Withdraw: After the waiting period, the user can perform a withdraw operation to retrieve the staked amount. + +#### Messaging + +Once the registration of nodes is completed, they can operate and perform their respective functions within the network. To facilitate more effective communication among different types of nodes, we introduce the concept of message networks. Message networks possess the following characteristics, optimizing communication and addressing network congestion: +1. Node Message Sending and Receiving: When a node joins a message network, it can send and receive messages within that network. This allows nodes to engage in real-time information exchange with other nodes within the same message network. +2. Isolation of Message Networks: Nodes can send messages to a message network they have not joined, but they are unable to receive messages from that network. This isolation ensures that nodes are only affected by the message network they belong to, preventing interference from other message networks. Different types of nodes can exchange internal messages within their respective message networks without disrupting the operation of other nodes. +3. Joining Multiple Message Networks: Nodes have the capability to join multiple message networks simultaneously. This flexibility allows nodes to participate in appropriate message networks based on their specific communication requirements. By joining the relevant message networks, nodes can engage in targeted message delivery and subscribe to messages from nodes of other types. + +##### Architect + +Different types of nodes have different roles, which determine the networks they will join and the networks to which they will send messages. The future IoTeX network will consist of various types of nodes. Each type of node will choose to join specific networks and send messages to certain networks, thus forming the overall network structure. This allows each type of node to receive only the content of interest, reducing network load. Below is an example diagram of the network structure: +![network arch](./assets/iip-16-network-arch.jpeg) + +##### Pubsub + +We will implement message networks based on the pubsub system. The main reasons for choosing it are as follows: +1. Seamless Integration: libp2p is a fundamental building block of the IoTeX network, providing a modular and flexible networking layer. Utilizing the pubsub system from libp2p ensures seamless integration with the existing network infrastructure and minimizes code complexity. +2. Robustness and Security: libp2p is designed to be secure and resilient, making it well-suited for decentralized and distributed networks. By leveraging the pubsub system of libp2p, the message networks benefit from the library's robustness and security features, enhancing the overall reliability of the communication mechanism. + +Using the pubsub system to implement message networks involves the following steps: +1. Topic Creation: +To create a message network, a node must first define a topic, which serves as the channel for message dissemination within the network. Each message network can have its own unique topic. When a node wants to participate in a specific message network, it subscribes to the corresponding topic. +2. Subscribing to Topics: +Nodes interested in a particular message network subscribe to its topic. Subscribing allows the node to receive messages published to that topic by other participating nodes. When a node joins a message network, it sends a subscription request to the network, informing other nodes of its interest in receiving messages related to that topic. +3. Publishing Messages: +Nodes within the message network can publish messages to the topic they have subscribed to. When a node has relevant information to share with other participants, it can publish a message to the topic, ensuring that all subscribed nodes receive the message. The pubsub system takes care of disseminating the message to all relevant recipients within the message network. +4. Fan-out: +The fan-out feature allows nodes to publish messages to topics even if they have not subscribed to them. This feature is particularly useful when a node needs to disseminate information or broadcast messages to a wider audience within the network. By leveraging the fan-out capability, nodes can reach beyond their subscribed topics and broadcast important messages to other nodes throughout the network. + +##### Interface + +To join the P2P network and receive messages from specific networks, the creation of the P2P agent needs to include a parameter for the network list. Here is the updated method: +```go +func NewAgent(cfg Config, chainID uint32, genesisHash hash.Hash256, broadcastHandler HandleBroadcastInbound, unicastHandler HandleUnicastInboundAsync, networks []string) Agent +``` + +To indicate the network for sending messages during the runtime of a node, we can introduce a NetworkProxy to minimize changes to the existing code. The NetworkProxy represents a proxy for a specific network through which messages can be sent. The original Agent will remove the method for sending messages while adding a method for creating a proxy for a specific network. Here is the specific interface definition: +```go +type Agent interface { + Info() (peer.AddrInfo, error) + Self() ([]multiaddr.Multiaddr, error) + BlockPeer(string) + NetworkProxy(string) NetworkProxy +} + +type NetworkProxy interface { + BroadcastOutbound(ctx context.Context, msg proto.Message) (err error) + UnicastOutbound(ctx context.Context, peer peer.AddrInfo, msg proto.Message) (err error) + ConnectedPeers() ([]peer.AddrInfo, error) +} +``` + +It is worth noting that when creating a NetworkProxy, the selected network does not need to be specified among the networks to be joined during the creation of the Agent. This is because the node can send messages to networks that have not been joined. + +#### Incentive + +The introduction of multiple node types within the IoTeX network fosters active participation and rewards contributions across various node roles. By incentivizing different types of nodes, the network aims to create a vibrant ecosystem where more participants are motivated to engage and contribute to its growth. The incentives for multiple node types are designed to align with their respective responsibilities and contributions to the network. + +## Rationale + +By introducing node type and messaging networks, the IoTeX ecosystem benefits in the following ways: +1. Decentralization and Network Security: By supporting multiple node types, the IoTeX network aims to foster decentralization. Delegating specific tasks to different types of nodes distributes responsibility and authority across a diverse set of participants. This decentralization promotes a more robust and resilient network architecture by reducing the reliance on a single type of node, such as delegates. It enhances network security, mitigates the risk of single points of failure, and ensures that no single entity or group has undue control over the network's operations. +2. Increased Participation: Traditional delegate staking requirements may pose barriers to entry for some individuals or organizations. By diversifying node types and reducing the staking requirements for certain roles, the network becomes more accessible to a broader range of participants. This inclusivity fosters a more vibrant and diverse network ecosystem, attracting a wider community of contributors and stakeholders. Increased participation enhances network resilience, decentralization, and fosters innovation by harnessing a diverse set of skills and perspectives. +3. Future-proofing the Network: As the network expands and new use cases emerge, different types of nodes enable the network to adapt to specific requirements. By having specialized node types, such as proposer nodes for efficient block bundling or w3bstream compute nodes for IoT data processing, the network remains adaptable and capable of handling diverse tasks. This future-proofing ensures that the IoTeX network can scale, evolve, and meet the needs of emerging applications and technologies. + +## Backward Compatibility + +Ensures backward compatibility by implementing a new registration process separate from the original delegate registration and maintaining a unified message network where all nodes currently reside. + +## Security Considerations + +### Copyright +Copyright and related rights waived via CC0. \ No newline at end of file