# 节点加入与离开网络的机制

在Delta的设计中，每个Delta Node（以下称为节点）都需要加入网络，并在网络上注册自己的身份，这样该节点才能够被网络中的其他节点发现， 并进一步发起任务或参与任务的执行。因此，当节点启动时，第一步就是加入网络。

当节点不再运行时，也需要退出网络，否则用户就无法得知目前网络中有多少节点在线。

在Delta中，节点加入与退出网络，都是通过调用Delta Chain Connector中相应的接口实现的，无论是处于区块链模式还是Coordinator模式。 这两种模式的区别在于，区块链模式下，Delta Chain Connector实际上是调用了链上智能合约的方法，是智能合约实现了节点加入和退出的机制； 而在Coordinator模式下，由Delta Chain Connector自己实现节点的加入和退出。

## 旧版本机制

在0.8.1版本之前，节点加入的机制如下：

1. 节点启动时，会加入网络
2. 节点停止运行时，会退出网络
3. 为了防止出现两个同名的节点无法区分，两个同名的节点不能同时加入一个网络

在具体实现中，节点加入网络时，智能合约（或Delta Chain Connector）会保留一条该节点的记录；当节点退出时，会删除相应的记录。通过节点的记录来确定在线的节点。

这个设计就造成了一个大家在使用时经常会遇到的问题：节点停止运行后，再次启动就无法加入网络了。这是因为在节点停止时退出网络这一机制并不稳定，可能在调用退出网络方法之前进程就被杀掉了，或者由于网络问题调用失败。这就造成改节点虽然实际上退出了，但是智能合约（或Delta Chain Connector）并不知道，没有删除该节点的记录，一直认为该节点在线，所以会阻止后续同名节点的加入。如果用户在关闭节点之前先关闭了Delta Chain Connector，也会造成同样的问题。

## 0.8.1版本的新机制

为了解决上述的问题，我们重新设计了整个节点加入网络的机制。新的机制如下：

1. 节点启动时，会加入网络
2. 节点停止运行时，会退出网络
3. 加入网络的节点，会被设置一个存活时间（目前为2分钟）
4. 节点在存活时间内，会不断地调用相应的方法，刷新其存活时间
5. 存活时间到期的节点，会被视为退出
6. 为了防止出现两个同名的节点无法区分，两个同名的节点不能同时加入一个网络

在具体实现中，智能合约（或Delta Chain Connector）不会主动删除存活时间到期的节点。当节点退出时，智能合约（或Delta Chain Connector）只会将该节点的存活时间置为0。当需要判断节点是否在线时（如节点加入、获取节点信息、获取在线节点），通过存活时间来判断节点是否在线。

在新的机制下，节点如果在停止运行时调用了退出网络的方法，再次启动时立刻就能重新加入网络；节点如果在停止运行时没有调用退出网络方法，只要等待存活时间到期（不超过2分钟），就会被视为退出，再次启动时一样可以正常地加入网络。即使Delta Chain Connector先于节点关闭，该机制也不会失效。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.deltampc.com/system-design/delta-node-join-and-leave.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
