# 在Meter主网上运行全节点

## **概述**

Meter是一个具有双链结构的PoW和PoS混合区块链系统。所有的账户和交易都记录在PoS链上，而PoW链（目前是比特币的修改版，与比特币的起源相同）只维护用于挖矿的加密难题。PoW链向PoS链提交密码难题的解决方案，获胜的矿工在PoS链的账户上获得奖励。

**区块**

Meter以区块为单位进行操作，区块由k块（普通区块称为m块）发出信号。在区块结束时，委员会节点对最长的PoW链进行投票，并向所有PoW矿工分发挖矿奖励，它还将信息传递给PoW链，所有PoW矿工将不得不开始对加盖印章的PoW区块进行挖矿。要创建一个k区块，PoW链通常要有60个以上的区块。由于PoW区块的平均周期为1分钟，因此每个区块约为1小时（目前区块的时间完全由PoW决定，但我们将在未来实现交叉互动的区块调整）。所有与系统财务相关的活动，如奖励分配，进入和退出代表节点池，只发生在k-block。

还需要在同一台物理或虚拟机上运行PoS和PoW进程，以确保安全。

在Meter中，网络中存在几种类型的全节点。

1、**普通全节点：**&#x4ED6;们为每个区块进行同步，并可以支持与钱包的互动

2、**代表节点：**&#x8FD9;些节点是委员会节点的候选人，有机会提出和签署区块。要成为一个代表节点，前N个（N是一个协议参数）被押注的全节点（包括自我押注和其他押注者的投票）就是代表节点。

3、**委员会节点：**&#x6BCF;个区块都会随机选择一个代表节点的子集。这些节点组成委员会的法定人数，并执行共识。委员会节点轮流提出区块。如果一个提议的区块得到了委员会中2/3的节点的认可，这些签名就形成了一个QC（法定人数证书）。每个新提议的区块都带有前一个区块的QC。一旦新提议的区块获得了QC，前一个区块就被认为是被确认和最终确定的。

在主网的初始启动阶段。代表节点的数量将与委员会节点的数量相同，这些节点的数量被设定为300。

运行一个委托/委员会节点的要求。为了实现Meter网络的全部性能，推荐的硬件配置是8个以上的计算优化的vCPU，16GB内存和200GB的SSD（AWS c5.2xlarge实例或更好）。Meter中的最大块大小约为1.3MB。还建议拥有数据中心级别的1Gbps至10Gbps互联网连接。然而，Meter共识协议能够在一定程度上适应交易负载、网络和节点处理速度，将区块周期从2秒到30秒不等。最低要求是2个vCPU和4GB内存。当网络有最小负荷时，预计每月平均区块数据约为1.5GB。

## **教程（社区版）**

关于如何设置Meter的全节点和验证器的[步骤教程](https://medium.com/@Paolo_G/step-by-step-guide-to-creating-a-node-in-meter-mainnet-4cdde1085fbb)是由一个社区成员创建的。 以下指南由官方维护。

## **设置Docker**

由于Meter全节点由多个进程组成，我们将整个节点打包成一个docker容器镜像。下面的说明是假设Ubuntu Linux。 如果你使用的是Windows，你可以用Ubuntu镜像来[安装WSL2](https://docs.microsoft.com/en-us/windows/wsl/install-win10)。请参考[Ubuntu Docker安装指南](https://phoenixnap.com/kb/how-to-install-docker-on-ubuntu-18-04)，在Ubuntu上添加Docker支持。

在Ubuntu上，你可以使用以下命令来安装docker

```
sudo apt update
sudo apt install docker.io
```

默认情况下，如果你通过apt install安装了docker，它需要root用户权限才能运行。然而，这可能会带来安全问题。实际上，以非root用户身份运行Docker是非常简单的。

设置Docker用户组，以非root用户身份运行Docker。我们假设运行Docker的非root用户是 "ubuntu"，如果你使用不同的用户，请相应改变命令。

```
sudo groupadd docker
sudo usermod -aG docker ubuntu
```

在此之后，请退出并重新登录以刷新用户组设置，你就可以开始工作了。

## **设置一个全节点**

1. 下载最新的[桌面钱包](https://www.meter.io/getcoins#wallets)
2. 为Meter Docker容器准备主机工作目录 建议为容器准备一个主机工作目录，以保存重要的密钥和区块数据库，这样我们可以在未来的升级中保留它们。我们将创建一个名为meter-data的目录，并将其路径设置为环境变量**METER\_MAIN\_DATA\_PATH**。
3. 为Meter Docker容器准备主机工作目录 我们建议为容器准备一个主机工作目录，以保存重要的密钥和区块数据库，这样我们就可以在未来的升级中保留它们。我们将创建一个名为meter-data的目录，并将其路径设置为环境变量METER\_DATA\_PATH（如果你有一个不同的目录结构，你将不得不进行相应的修改），并将其映射到容器内的/pos目录。

准备一个干净的工作目录

```
$ mkdir meter_main_data
$ cd meter_main_data/
$ echo export "METER_MAIN_DATA_PATH=$PWD" >> ~/.bashrc
$ source ~/.bashrc
```

启动Meter容器

**下面的说明假设用户在METER\_MAIN\_DATA\_PATH中操作。请注意命令中的参数，并根据你的环境替换相应的路径，特别是docker run命令中-v后面的路径。**

```
docker run --network host --name meter_main --restart always -e NETWORK="main" -v $METER_MAIN_DATA_PATH:/pos -d meterio/mainnet:latest
```

对docker有用的几个命令：

```
docker container ls -a
```

输出结果将如下：

```
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS               NAMES
260bbd571d1a        meterio/mainnet           "/usr/bin/supervisord"   23 hours ago        Up 23 hours                             meter_main
```

```
docker container stop meter_main              //stop the container
docker container start meter_main             //start the container
docker container rm meter_main                //remove the container
docker image ls
docker image rm [image ID]                   //remove the container image, will trigger redownloading the image at the next docker run, it is recommended to do this every time we upgrade the testnet
docker container exec -it meter_main bash     //launch a bash in the container
```

日志文件可以位于容器内，在/var/log/supervisor目录下。如果你提交任何bug，请记得在bug中附上PoS的日志（包括stderr和stdout）。你可以复制和粘贴日志，或者使用

```
docker cp meter_main:/var/log/supervisor/[LogFileNameHere]     //replace with the log file name
```

在通过日志确认节点正常运行后，你可以将桌面钱包连接到你自己的全节点。

你可以将其与团队维护的[资源管理器](https://scan.meter.io/)的高度进行比较

将[Meter桌面钱包](https://www.meter.io/getcoins#wallets)指向你自己的全节点 在钱包的设置中，在节点下，你可以通过添加[http://IPaddrOfYourNode:8669，连接添加你自己的全节点。如果一切运行正常，地址栏左边的图标应该变成绿色。你可以使用钱包里面的资源管理器来查看区块制作的状态。](https://cn.docs.meter.io/zhi-ya-yu-yan-zheng/http:/IPaddrOfYourNode:8669，连接添加你自己的全节点。如果一切运行正常，地址栏左边的图标应该变成绿色。你可以使用钱包里面的资源管理器来查看区块制作的状态。)

![](/files/-MfTEypGmvntf1e7SQ3x)

![](/files/-MfTF8WSgTBlQKL9T0xn)

请确保钱包中的区块高度与官方区块浏览器相同。

## **自动升级为全节点**

由于主网刚刚启动，我们预计可能会不时出现紧急升级的情况。 为了减轻节点操作员的工作，我们提供了一个名为watchtower的自动升级服务。 它定期拉取docker容器镜像发布，并进行相应的升级。 对于那些不能全天候监控节点的非专业验证者，我们强烈建议在主网启动后的第一年使用watchtower服务。

```
docker run -d --name watchtower --restart always -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --include-stopped --revive-stopped --enable-lifecycle-hooks --interval 10 --cleanup meter_main
```

## **手动升级为全节点**

停止并删除当前的CONTAINER

```
docker container rm -f meter
```

拉出最新的容器镜像

```
docker pull meterio/mainnet:latest
```

启动新的图像

```
docker run --network host --name meter_main --restart always -e NETWORK="main" -v $METER_MAIN_DATA_PATH:/pos -d meterio/mainnet:latest
```


---

# 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://cn.docs.meter.io/zhi-ya-yu-yan-zheng/zai-meter-zhu-wang-shang-yun-hang-yi-ge-wan-zheng-de-jie-dian.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.
