# 在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，连接添加你自己的全节点。如果一切运行正常，地址栏左边的图标应该变成绿色。你可以使用钱包里面的资源管理器来查看区块制作的状态。)

![](https://1408473552-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeznvyTQln_bTVfC_fg%2F-MfQqrbta035ouALkhVk%2F-MfTEypGmvntf1e7SQ3x%2Fimage.png?alt=media\&token=567680d9-5223-4bdc-b788-98f98ba2d9b0)

![](https://1408473552-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeznvyTQln_bTVfC_fg%2F-MfQqrbta035ouALkhVk%2F-MfTF8WSgTBlQKL9T0xn%2Fimage.png?alt=media\&token=7a10656d-9dae-44f8-a46a-da56f76ac66c)

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

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

由于主网刚刚启动，我们预计可能会不时出现紧急升级的情况。 为了减轻节点操作员的工作，我们提供了一个名为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
```
