如何在Oasis网络上为Quest进行节点设置
This guide will cover setting up your nodes for The Quest, a multi-round staking competition (aka incentivized testnet) on the Oasis Network. 它假定你对命令行工具的使用有一定的基础知识。
系统要求
本指南假设你有两个用于部署的不同物理机器。这些机器如下:
- 你的本地系统,称为
localhost
- 远程系统,作为Oasis节点运行的系统,称为
server
这样做的原因是为了确保用于设置节点的密钥得到保护。本指南不包括HSMs的使用,但是将来也要使用到它们。
创建实体(Entity)
注意:本节中的所有操作都应该在本地主机localhost上完成,因为有些敏感项会创建。
创建一个工作目录
在这个实体初始化过程中,我们将创建密钥和其他重要的组件,用于网络上部署节点。如果你打算使用这个生成的组件来注册实体和节点,那么在这个目录中保存和保护它们是很重要的。
注意:我们将localhost上的工作目设置为/localhostdir。
在/localhostdir中,你还要创建以下目录:
entity
:这将存储一个我们称为“entity”的实体。建议里面的私有内容在与internet保持断开连接的计算机上使用,这样才保证安全
目录的权限应该是rwx------
node
:这将存储一个我们称为“node”的节点。这个目录的名字并不重要,它只是表示一个节点。你可以任意重命名它。该目录的私有内容将在节点本身上使用。
你应该使用Entity
的私钥在系统上初始化此信息。
目录权限应该是rwx------
关于Linux的权限说明,这里有一篇博客:Linux系统rwx权限详解
要创建目录结构,请使用以下命令:
1 | mkdir -m700 -p {entity,node} |
复制创世文件
最新的创世纪文件可以在Current Testnet Parameters找到。你应该下载最新genesis.json
文件,将其复制到工作目录,并设置以下环境变量指向其路径:
1 | GENESIS_FILE_PATH=/localhostdir/genesis.json |
这将在以后生成transactions时用到。
初始化实体
如架构概述中所述,实体对于网络上的操作节点至关重要,因为它控制着附加到网络上的特定个人或组织的stake。在未来,我们将支持通过HSMs使用实体密钥,以确保实体密钥不会被轻易破坏。
1 | # 警告 |
要初始化实体,只需从/localhostdir/entity
:运行以下命令:
1 | oasis-node registry entity init |
这将在 /localhostdir/entity
中生成三个文件:
entity.pem
: 实体的私钥。永远不要公开这个,因为它可以用来转让STAKE。entity.json
: 这是发送到网络注册中心应用程序的未签名信息的JSON。entity_genesis.json
: 这个json对象包含了实体描述符,它已经被实体的私有密匙签名了,例如entity.pem。这意味着要共享以包含在Genesis块中。
初始化节点
当节点启动时,节点将自己注册到网络。但是,为了验证自身,实体签署了与节点关联的公钥。这允许在没有上传实体的私钥到internet的情况下进行节点注册。
要初始化Validator节点,请注意将运行你的节点的服务器的静态IP,并从/localhostdir/node
目录输入以下命令:
1 | STATIC_IP=<YOUR-STATIC-IP> |
这个命令将创建一个Validator节点的标识,以便它可以是一个自签名节点(这就是允许自注册的原因)。
1 | # 注意 |
该命令将生成以下文件:
consensus.pem
: 节点的一致私钥。 DO NOT SHAREconsensus_pub.pem
: 节点的一致公钥。identity.pem
: 节点的标识私钥。 DO NOT SHAREidentity_pub.pem
: 节点的标识公钥。node_genesis.json
: 如果希望在网络的genesis文件中包含该节点,则需要了解该节点的详细信息。p2p.pem
: 节点的libp2p私钥。 DO NOT SHAREp2p_pub.pem
: 节点的libp2p公钥。tls_identity.pem
: 用于保护gRPC连接的节点的TLS私有密钥。DO NOT SHAREtls_identity_cert.pem
: 节点的TLS证书,用于保护gRPC连接。
将节点添加到实体描述符
初始化节点之后,我们需要将它添加到实体描述符中,以便在节点启动时它可以正确地注册自己。
在/localhostdir/node
目录下执行以下命令:
1 | oasis-node registry entity update \ |
这将更新entity.json
中的实体描述符,并随后更新包含签名实体描述符的entity_genesis.json
文件。
初始化其他节点
在Public Testnet的时候,网络将只有Validator,没有其他committees(没有计算,没有密钥管理,没有存储,等等)。
此时,本文档不包括配置单个Validator之外的任何东西的说明。
如果你想创建更多的Validator节点,你可以简单地重复上面的过程来初始化额外节点的构件,只需适当地重命名与特定节点相关的内容。
1 | # 注意 |
在服务器上运行Oasis节点
设置Oasis节点的工作目录
在服务器上运行节点之前,我们需要确保有地方存储节点所需的文件。
1 | # 注意 |
设置 /serverdir
目录
在/serverdir
目录中,我们将创建以下子目录:
etc/
- 这是用来存储配置的node/
- 用来存储节点的数据node/entity/
- 这是用来存储节点实体的公共组件的
你可以通过执行以下命令来创建这个目录结构:
1 | mkdir -m700 -p /serverdir/{etc,node,node/entity} |
从 /localhostdir
复制节点构件
为了使节点注册正常工作(如/localhostdir/entity.json
中定义的那样),你必须复制在初始化节点部分中生成的节点组件。为此,通过安全通道(例如SSH)将以下文件从/localhostdir/node
上传到/serverdir/node
:
consensus.pem
consensus_pub.pem
identity.pem
identity_pub.pem
p2p.pem
p2p_pub.pem
tls_identity.pem
tls_identity_cert.pem
复制后,请确保所有这些文件都具有 0600
权限,即只有其所有者具有 read
和 write
权限。
为此,执行以下命令:
1 | chmod -R 600 /serverdir/node/*.pem |
1 | # 重要 |
从 /localhostdir
复制公共实体构件
我们还需要在 server
上显示/localhostdir
中的公共实体组件。 将本地主机上的 /localhostdir/entity/entity.json
文件复制到server
上的/serverdir/node/entity/entity.json
目录
将Genesis文件复制到server
最新的Genesis文件可以在 Current Testnet Parameters中找到。你应该下载最新的genesis.json
文件并将其复制到server
上的/serverdir/etc/genesis.json
路径下。
配置Oasis节点
在运行Oasis节点时,有多种可用的选项。下面的YAML文件是网络上Validator节点的基本配置。
在使用此配置之前,你应该收集以下信息来替换配置文件中出现的 { { var_name } }
变量:
{ { external_address } }
: 注册此节点时使用的外部IP。
1 | # 注意 |
{ { seed_node_address } }
: 种子节点地址的形式为ID@IP:port
。
你可以在 Current Testnet Parameters中找到当前的 Oasis Seed Node的地址。
要使用此配置,请将其保存在/serverdir/etc/config.yml
文件中,并将其作为--config
标志的参数传递给oasis-node
命令。
1 | ## |
确保适当的权限
只有运行Oasis节点的进程的所有者才能访问/serverdir/node
目录中的文件。oasis-node二进制文件确保该节点使用的文件拥有尽可能少的特权,这样你就不会在操作节点时不小心搬起石头砸自己的脚。
为了确保设置了正确的权限,我们建议运行以下命令来删除所有非所有者的读/写/执行权限:
1 | chmod -R go-r,go-w,go-x /serverdir |
注意
需要说明的是,oasis-node
binary二进制文件需要以下权限:
700
用于/serverdir/node
目录700
用于/serverdir/node/entity
目录600
用于所有的*.pem
文件
启动Oasis节点
1 | # 警告 |
你可以通过运行以下命令来启动节点:
1 | oasis-node --config /serverdir/etc/config.yml |
1 | # 注意 |
验证与网络的连接
作为启动服务器进程的一部分,缺省情况下,oasis-node
二进制将在节点的datadir
中设置一个内部unix套接字。此套接字可用于与节点通信并查询有关网络的详细信息。
运行以下命令:
1 | oasis-node registry entity list -a unix:/serverdir/node/internal.sock |
如果这个命令失败,你将收到一个非零的退出码,你很可能没有连接到网络。如果它工作正常,它应该响应输出如下,但也可能有更多的内容:
1 | CVzqFIADD2Ed0khGBNf4Rvh7vSNtrL1ULTkWYQszDpc= |
到达连接的节点后,可以继续下一节,因为你的节点还没有在Oasis Testnet上注册为Validator。
注册Testnet Tokens
1 | # 注意 |
为了参与到Testnet中,你需要有一些tokens。你将使用这些tokens来注册你的实体并在网络上stake。
为了得到代币,你需要在此表格上注册。填写表单时,它将要求你的实体的公钥。这与您的实体的帐户ID相同,可以在/localhostdir/entity/entity
JSON文件中的id
键中找到。
例子
在以下 entity.json
文件中, 实体的公钥为TszGIrC1X08czcik0DgAnmGPzjf8pfQ47bgrjpTmbro=
.
1 | { |
填写完表格后,等待电子邮件通知你已经获得资金,然后再继续下一步。以下部分假设你已经获得了funded。
Staking 和注册
注意:如果你的实体在Genesis文件中列出,则不必执行此步骤。
注意:如果你以前提交过标记或注册表事务,那么你的nonce可能与示例中使用的nonce不同。如果你不确定,请立即使用本指南检查你的帐户。
一旦你获得了资金,你可以通过注册你的实体和节点来完成将你的节点连接到网络的过程,如下所述:
检查你的节点是否同步
在进行任何事务之前,必须确保节点是同步的。在服务器上调用这个命令:
1 | oasis-node control is-synced -a unix:/serverdir/node/internal.sock |
如果你的节点是同步的,上面的命令应该输出:
1 | node completed initial syncing |
如果你的节点尚未同步,则需要等待才能继续。
在 localhost
上生成一个Staking(托管)事务
你的实体的私钥应该在localhost
上与internet断开连接。因此,你需要在localhost
上生成以下事务。
警告:实体的私钥用于授权你的staking帐户上的交易。因此,它不应该出现在在线server
上。
对于Testnet,当前注册实体和将节点注册为Validator所需的最stake是100个令牌。因此,我们将生成一个托管事务,托管你自己实体上的100个令牌。
注意:Oasis节点的标记应用程序将标记标记的操作称为“托管”。
在生成托管事务之前,你需要设置以下环境变量:
GENESIS_FILE_PATH
: 指向localhost
中Genesis文件的路径 即:/localhostdir/genesis.json`。ENTITY_DIR_PATH
: 本地主机上实体组件目录的路径,即:/localhostdir/entity/
。OUTPUT_TX_FILE_PATH
:包含输出的已签名事务的文件的路径。对于本指南,我们将使用
/localhostdir/signed-escrow.tx
.ACCOUNT_ID
:实体的ID(public key)。
注意:你可以在 entity.json
文件的ID字段中找到你的实体 id
。
然后执行以下命令:
1 | oasis-node stake account gen_escrow \ |
注意:选项--stake.amount
看起来是一个非常大的数字,但它实际上相当于Testnet上的100个Token,因为用于跟踪帐户余额的每个单位值是1x10^-9个令牌
生成 Entity Registration Transaction
提交你的托管帐户后,你需要注册你的实体,使你的节点注册正确。你可以在提交托管事务后执行此过程。然而,为了节省步骤,我们在生成register事务之前,需要设置以下环境变量:
GENESIS_FILE_PATH
:本地主机上的Genesis文件的路径,即/localhostdir/genesis.json
.ENTITY_DIR_PATH
: 本地主机上实体工件目录的路径,即/localhostdir/entity/
.OUTPUT_REGISTER_TX_FILE_PATH
: 包含输出的签名事务的文件的路径。对于本指南,我们将使用
/localhostdir/signed-register.tx
.
然后执行以下命令:
1 | oasis-node registry entity gen_register \ |
在服务器上提交事务
为了完成标记过程,我们需要将生成的托管和注册表事务从脱机本地主机复制到服务器并提交它们。
为此,请遵循以下步骤:
- 将本地主机上的
/localhostdir/signed-escrow.tx
文件复制到服务器上的/serverdir/signed-escrow.tx
。 - 将本地主机上的
/localhostdir/signed-register.tx
文件复制到服务器上/serverdir/signed-register.tx
。 - 通过
oasis-node consensus submit_tx
子命令提交两个事务:
1 | oasis-node consensus submit_tx \ |
检查你的节点是否正确注册
要确保你的节点作为网络上的Validator被正确连接,你可以运行以下命令:
1 | oasis-node registry node is-registered -a unix:/serverdir/node/internal.sock |
如果你的节点已注册,上面的命令应该输出:
1 | node is registered |
You’re a Validator!
如果你已经做到了这一点,那么你已经正确地将你的节点连接到网络,并且你现在是Public Testnett上的Validator。