区块链大学区块链研习社区块链研究

Cosmos文档(中文版)-- 5. 验证人

2018-08-11  本文已影响11人  糙米薏仁汤

由本人翻译, 转载需先说明

所有章节:

  1. 介绍
  2. 开始
  3. Cosmos SDK
  4. Lotion JS
  5. 验证人
  6. 委托人

英文版文档:Cosmos Docs
中文版白皮书:Cosmos白皮书

验证人概览

介绍

Cosmos Hub基于Tendermint,依赖于一组负责往区块链提交新区块的验证人。这些验证人通过广播含有验证人私钥签名过的加密信息的投票来参与到共识协议当中。

验证人候选者能抵押他们自有的Atom,还有token持有者"委托"给他们的Atom。Cosmos Hub会有100个验证人,后面会按照预先定义的计划逐渐增加到300个。验证人由其总股权来决定——前100名拥有最多股权的候选者将会成为Cosmos的验证人。

验证人和他们的委托人都可以赚取Atom作为区块增发奖励,token作为执行Tendermint共识协议的交易费用。起初,交易费用只能用Atom来支付,但在以后,Cosmos生态中的任意token都将是合法的手续费用支付方式,只要这个token出现在经治理认可的白名单上。注意验证人可以从其委托人的收益中抽成一部分佣金来作为额外的激励。

如果验证人双签,频繁掉线或者没有参与到治理,他们抵押的Atom(包括委托给他们的Atom)会被削减。处罚的额度依据过失的严重程度来定。

硬件

当前还不存在针对验证人密钥管理的云解决方案。这可能会等到2018年云解决方案SGX变得更加普及时才会有所改善。由于这个原因,验证人必须设置一个有访问权限限制的物理操作。例如,验证人与安全的数据中心共栖。

验证人期望用充足的电力,带宽和存储备份来装备他们的数据中心。期望有数个充足的网络盒子应对光纤,防火墙还有路由的需求,一台有着足够硬盘驱动器和容错能力的小型服务器。硬件可以先从低端的数据中心配置开始。

我们期望一开始的网络需求是比较低的。当前的测试网络只需要极小的资源。之后,带宽,CPU和内存的需求将会随着网络的发展而增长。要存储数年区块链的历史信息的话,推荐配置足够大的的硬盘驱动。

启动一个网站

启动一个专用的验证人网站,在我们的论坛展示你要成为一个验证人的意愿。这是非常重要的,因为委托人会想要足够的有关他们委托Atom实体的信息。

需求法律意见

如果你打算运行一个验证人节点,请寻求法律意见。

社区

可以在我们的社区聊天频道和论坛讨论关于成为一个验证人的细节:

概览

每一个验证人候选者都被鼓励去独立运行他们的操作,因为不同的设置增加了网络的复原能力。为了能按时启动主网,验证人候选者现在就应该开始设置了。

密钥管理 - HSM

让攻击者无法盗取验证人的密钥是至关重要的任务。如果可能发生盗取,这将会使委托在抵抗力脆弱的验证人那里的全部委托股权都处于风险之中。硬件安全模块是防范该风险的一个重要策略。

为了Cosmos Hub,HSM模块必须要支持ed25519签名。YubiHSM2支持了ed25519,我们期望在2017年12月时,能有一个可以使用的适配器库。YubiHSM可以保护私钥但是不能确保它不会去重复签署一个区块。

Tendermint团队也在为支持验证人签名的Ledger Nano S应用做贡献。这个应用将会储存最近的区块,并能降低双重签名攻击的风险。

我们会在有更多关于密钥保存的可行解决方案出现时更新这个文档。

Sentry节点(DDOS保护)

验证人要负责确保网络能够经受住DOS攻击。

降低这种风险的一个推荐方案是验证人要在所谓的sentry节点结构上去精心架构他们的网络技术。

验证人节点应该只连接到他们所信任的全节点上,因为他们可以操作自身,也可以被他们熟知的其他验证人运行。一个验证人节点通常会运行在一个数据中心。大部分数据中心提供对主流云服务提供商的直接网络连接服务。验证人可以使用去连接云服务中的sentry节点。验证人节点直接连接到他们的sentry节点,这样减缓了DOS攻击带来的压力,可能需要新的sentry节点被激活去减轻已存在的sentry节点所遭受到的攻击。

Sentry节点能够迅速地被轮换或者改变它们的IP地址。因为与sentry节点的连接是在私有的IP网段,基于因特网的攻击不可能直接骚扰到它们。这将确保验证人区块的提交和投票总是能传播到网络中的其余节点。

你可以遵循下面的指令去开启你的sentry节点架构:

必须在config.toml文件中编辑验证人节点:

# Comma separated list of nodes to keep persistent connections to
# Do not add private peers to this list if you don't want them advertised
persistent_peers =[list of sentry nodes]

# Set true to enable the peer-exchange reactor
pex = false

sentry节点需要编辑它们的config.toml文件:

# Comma separated list of peer IDs to keep private (will not be gossiped to other peers)
private_peer_ids = "ipaddress of validator nodes"

验证人启动

在设置你的验证人节点之前,确保你已经完成了全节点启动教程

运行一个验证人节点

验证人负责通过投票向区块链中提交新的区块。一个验证人的股权会在他们掉线时,重复签署一笔交易,或者没有行使投票权的情况下被削减。请阅读Sentry Node Architecture去帮助你保护节点免于DDOS攻击。

警告
如果你想要成为一个Cosmos Hub主网的验证人,你应该好好研究安全性。

创建你的验证人

你可以用cosmosvalpub来通过抵押token的方式创建一个新的验证人。你可以查看你的验证人公钥:

gaiad tendermint show_validator

接下来,设计你的gaiacli stake create-validator命令:

注意
不要使用超出你所拥有的steak(测试网络中的原生token,相当于主网上的Atom)!你总是可以通过Faucet得到更多的steak。

gaiacli stake create-validator \
  --amount=5steak \
  --pubkey=$(gaiad tendermint show_validator) \
  --address-validator=<account_cosmosaccaddr>
  --moniker="choose a moniker" \
  --chain-id=gaia-6002 \
  --name=<key_name>

编辑验证人描述信息

你可以编辑你的验证人公开描述信息。这个信息用于去标识你的验证人身份,而且委托人会通过这些信息去决定向哪一个验证人委托股权。确保给下方每一个字段都提供输入,否则字段会默认为空(--moniker默认是机器名称)。

keybase-sig是一个由keybase.io账户生成的16位的字符串。它是一个加密的安全方法用于验证你的在多个在线网络传输过的身份信息。Keybase API允许我们去获取你的Keybase avatar。这就是为何你能够向你的验证人信息去添加一个标志。

gaiacli stake edit-validator
  --address-validator=<account_cosmosaccaddr>
  --moniker="choose a moniker" \
  --website="https://cosmos.network" \
  --keybase-sig="6A0D65E29A4CBC8E"
  --details="To infinity and beyond!"
  --chain-id=gaia-6002 \
  --name=<key_name>

查看验证人描述信息

通过这条命令查看验证人的信息:

gaiacli stake validator \
  --address-validator=<account_cosmosaccaddr> \
  --chain-id=gaia-6002

确认你的验证人正在运行中

如果下面的命令有返回,表示你的验证人是活跃状态:

gaiacli advanced tendermint validator-set | grep "$(gaiad tendermint show_validator)"

你应该能够在这个区块浏览器中看到你的验证人。你可以在~/.gaiad/config/priv_validator.json文件里查找bech32编码格式的address

注意
为了能加入到验证人队伍中,你需要有足够多的投票权,至少要超过第100名验证人。

常见问题

Problem #1: 我的验证人的voting_power: 0

你的验证人已经处于离线状态。 在gaia-6002中,我们会解绑掉那些在最近100个区块中没有给50个以上的区块投票的验证人。因为区块每2秒内就会被提议,一个验证人如果有100秒的时间无响应的话,就会被解绑。这通常会发生在你的gaiad崩溃的情况下。

这里你可以把投票权返还给你的验证人。首先,如果gaiad没有处于运行状态,请再次启动它:

gaiad start

等待你的全节点追赶上最新的区块高度。接下来,运行下面的命令。注意<cosmosaccaddr>是你的验证人账户的地址,<name>是验证人账户的名称。你可以运行gaiacli keys list命令查找到这个信息。

gaiacli stake unrevoke <cosmosaccaddr> --chain-id=gaia-6002 --name=<name>

警告
如果你不等待gaiad同步,提前运行unrevoke,你将会收到一个错误信息告知你,你的验证人依然处于监禁中。

最后,再次检查你的验证人看看你的投票权是否回来了。

gaiacli status

你可能会注意到你的投票权重比之前要少。这是因为你的掉线受到的处罚。

Problem #2: 我的 gaiad 崩溃了,报错 too many open files

Linux(每个进程)默认打开的文件数量是1024gaiad是会打开超过1024个文件的。这会导致程序的崩溃。一个快捷的修复方法是运行ulimit -n 4096(增加允许进程打开文件的数量),然后通过gaiad start重启进程。如果你正在使用systemd或者其他的进程管理器去启动gaiad的话,这可能需要一些配置。下面是一个修复这个问题的示例systemd文件:

# /etc/systemd/system/gaiad.service
[Unit]
Description=Cosmos Gaia Node
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu
ExecStart=/home/ubuntu/go/bin/gaiad start
Restart=on-failure
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target

验证人常见问题解答

免责声明
这部分工作仍然在进行之中。机制和参数值都是很可能出现变化的。

基本概念

验证人是什么?

Cosmos Hub基于Tendermint,依赖一组验证人去保证网络的安全。验证人负责去运行一个全节点,广播经验证人私钥签名过的加密信息的投票来参与到共识协议当中。验证人往区块链中提交新的区块,从而获得报酬。

什么是'股权抵押'?

Cosmos Hub是权益证明(POS)的区块链,意味着验证人的权重由其抵押的,用作担保金的代币(Atom)的数量决定。这些Atom可以直接由验证人抵押,或者由Atom持有者委托给验证人。

任何系统中的用户都可以通过发送一笔"declare-candidacy"交易,来表明他们想成为一个验证人的意图。

一个候选者的权重(即所有的股权)决定了他是否能成为一个验证人,还有此节点提议区块的频率及能获取的利润。一开始,只会有权重排名前100的候选者才能成为验证人。如果验证人双签,频繁掉线或者不参加治理,他们抵押的Atom(包括那些委托给他们的Atom)会被部分销毁(削减)。

什么是全节点?

全节点专门去验证区块链中交易和区块。区别于只处理区块头信息和小部分交易的轻节点。运行一个全节点比轻节点需要更多的资源,这也是成为验证人必须要具备的。实际上,运行一个全节点只是运行一个有着低网络延迟且不掉线的,实时更新版本的软件。

当然,我们鼓励所有用户都去运行一个全节点,哪怕他们并不打算成为验证人。

委托人是什么?

委托人是那些没有能力或者不想要做验证人操作的Atom持有者。通过Cosmos Voyager,一个用户可以把Atom委托给一个验证人,并获取一部分交易收益(关于收益是如何分配的更多内容,请查看下面的对抵押股权的激励什么是验证人佣金

委托人与他们的验证人分享收益,所以委托人也要共担责任。如果一个验证人行为不端,每一个相关的委托人也会按比例被削减部分股权。这就是为什么委托人在委托之前应该履行调查职责,还有尽量把股权分散给多个验证人。

委托人在系统里扮演了一个关键角色,因为他们负责选举验证人。委托人也并不是一个消极的角色:委托人应该积极监控验证人的行为,并参与到治理当中。

成为一个验证人

如何去成为一个验证人?

网络中的任何参与者都可以通过发送一笔"declare-candidacy"交易来表明他们想成为一个验证人的意愿,必须要填写如下的参数:

一旦某个公钥宣布参选,Atom持有者可以向其委托Atom,有效地向其股权池里增加股权。一个地址的所有股权是其自抵押的Atom和委托人委托的股权的总和。

在所有表明竞选意愿的候选者中,股权最多的100名候选者被任命为验证人。如果某个验证人的股权总量跌出了前100名就会失去验证人权利。随着时间的过去,验证人的最大数量会依照预先定义的计划逐渐增加:

我要怎样加入到测试网络?

测试网络是一个很好的在主网上线之前去测试你的验证人设置的环境。

我们将参与测试网络视为一个向社区展示你是有准备且有能力去运行验证人节点的方式。你可以在这里找到有关测试网络的更多内容。

有测试网络token的水龙头吗?

如果你想要获得测试网络的token, 你可以使用这个水龙头

验证人的自抵押Atom有最小的数量要求吗?

没有最小限制。前100名有着最高总股权(总股权=自抵押股权+委托股权)的候选者就是验证人。

委托人要怎样去选择他们的验证人?

委托人可以根据他们的主观判断随意去选择验证人。也就是说,评判预期是很重要的,包括了:

除去这些会展示在Cosmos Voyager上的评判标准,验证人还可能展示一个网址去完善他们的简历。验证人需要通过多种方式去树立良好的声誉来吸引委托人。比如,验证人让第三方来审计他们的设置就是一个很好的实践。注意,Tendermint团队将不会批准和引导任何对自身的审计。

职责

验证人需要公开表明身份吗?

不需要。每个委托人会用他们自己的评判标准去衡量验证人的价值。验证人可以在他们上任时去注册一个网址,把他们认为合适的行为广而告之。一些委托人可能更偏好通过一个清楚展示团队是如何去运行验证人节点以及团队成员的简历的网站来帮助选择,尽管其他的一些委托人更偏好那些隐藏了行为记录的匿名验证人。很可能身份明确的验证人和匿名的验证人都会存在于验证人队伍中。

一个验证人要担负哪些责任?

验证人有两个主要的职责:

此外,验证人被期待成为社区的活跃成员。他们应该持续更新社区的实时状态,这样就能更容易适应某些改变。

参与到治理中需要?

Cosmos Hub中的验证人和委托人可以对提议投票表决来改变网络运行参数(比如区块的gas limit),协调升级更新,还有对治理Cosmos Hub的宪法的修正方案进行投票表决。

验证人在治理系统中扮演一个特殊的角色。身为系统的支柱他们需要对每一个提案进行投票表决。这是尤其重要的,因为委托人把票权给了验证人而自己无法直接去投票。每次当某个验证人不去对一个提案投票表决时,他就会被削减掉少量的股权。

股权抵押是指?

抵押Atom可以被认为是一种在验证活动中进行的安全储蓄。但一个验证人或者一个委托人想要拿回部分甚至所有的存款时,他们就发送一笔赎回交易。然后,Atom会经历一个3周的解绑期,在此期间他们容易在赎回过程开始之前因潜在的错误提交而被削减掉股权。

验证人,和与其形成联盟的委托人,得到区块增发奖励,区块奖励和手续费奖励,还有参与治理的权利。如果一个验证人行为不端,它的总股份的一部分会被削减掉(处罚的严厉性取决于错误行为的类型)。这意味着每一个往验证人委托Atoms的用户也会受到一定比例的处罚。因此委托人倾向于把Atom委托给那些安全运作的验证人。

验证人可以卷走委托人的Atom跑路吗?

向一个验证人委托,用户就委托了他的股权。验证人有更多的股权,在共识和治理工程中也就有了更大的权重。这不意味着验证人可以扣押其委托人的Atom。一个验证人是绝不可能带着他的委托人的Atom跑路的。

尽管委托资金不可能被验证人盗取,委托人仍然要对他们的验证人做出的不端行为负责。这种情况下,每个委托人的股权也会按其股权比例遭到部分的削减处罚。

一个验证人要多久被选择去提议下一个区块?会随着抵押Atom数量上升吗?

被选作去提议下一个区块的验证人称为提案人。每个提案人都是由明确的方式选出来的,被选的频率也与他们的总股权相等(总股权=自抵押股权+委托人股权)。比如,如果所有验证人总的抵押股权是100个Atom,一个验证人的总股权是10个Atom,那么有10%的时间该验证人会被选作下一个提案人。

Cosmos Hub的验证人需要去验证Cosmos生态中的其他分区吗?

是的,他们会如此。刚开始,Cosmos Hub的验证人还会验证第一个公共Ethermint分区。如果治理决定这么做,Cosmos Hub的验证人可能需要去验证Cosmos生态系统里的其它分区。就Ethermint分区而言,对每一个额外的分区都会以区块奖励和交易手续费的形式来提供奖励。

激励

对抵押股权的激励是什么?

一个验证人股权池里的每个成员赚取不同类型的收益:

这些总收益会按验证人股权池中每个验证人所占的权重来进行分配。然后,每个验证人的股权池的收益又会根据其每一个委托人的股权来分配。注意,会在分配前从委托人所得中抽成的佣金给到验证人。

对运行一个验证人的激励?

因为能抽成佣金,验证人比起他们的委托人能按比例赚取更多的收益。

验证人在治理中充当一个重要角色。如果一个委托人没有投票,他也能从他的验证人那里继承到投票权。这样验证人在生态里承担主要的责任。

什么是验证人的佣金?

一个验证人的股权池收到的收益会被拆分为给验证人的部分和给委托人的部分。验证人可以从给其委托人的收益中抽取一部分作为佣金奖励给自己。这个佣金被设置成一个百分比。每个验证人可以随意设置初始佣金,最大每日佣金变化比率和最大佣金。Cosmos Hub强制每个验证人都要明确设置这些参数。这些参数只能在一开始宣布竞选时设置,也只可能在声明之后被进一步限制。

区块增发奖励怎么分配?

区块增发奖励会按验证人的总股权来成比例地发放。这意味着即使每个验证人每次增发奖励时都获得了Atom,但所有验证人仍然会维持相等的权重。

让我们举一个例子:我们有着股权相等的10个验证人,佣金比例是1%。然后我们假设一个区块的增发奖励是1000个Atom,每一个验证人有20%的自抵押Atom。这些token不会直接分给提案人。而是被均匀地分发给验证人。所以现在每个验证人的股权池获得100个Atom。这100个Atom会依据每个参与者的股权来分发:

然后,每个委托人可以按照他们在验证人股权池中的股权,从79.2个Atom中等比例地索要属于他们应得的那一份。注意验证人的佣金不仅只适用于区块增发奖励,也适用于区块奖励(使用Photons支付)。

交易手续费怎么分配?

手续费以类似的方式分发,不同之处在于,如果区块的提案人有多于明确的提交所需的最小值,区块提案人就可以在由其提议的区块手续费中获得一笔奖励。

当一个验证人被选作去提议下一个区块时,必须要含有对当前区块至少2/3的验证人签名许可。尽管如此,仍然存在有一个激励去奖励那些超过2/3的验证人签名许可。这个奖励是线性的:如果提案人含有2/3的签名许可(区块有效的最小值),比例是1%, 如果提案人含有100%的签名许可,比例是5%。当然,提案人不应该等待太久去做提案,或许其他的验证人有可能超时,长时间的等待容易造成提案的延误。这样的话,验证人不得不在获取最多签名的等待时间和失去对下个区块的提案之间寻找一个平衡点。这个机制旨在提案人不要去提案空块,维护验证人之间更好的网络,还有减轻审查。

让我们举一个实际的例子来说明上面的概念。在这个例子中,有着10个股权相等的验证人。每个验证人采用1%的佣金比例,有20%的自抵押Atom。现在,产出了一个有着1025.51020408个Atom手续费的区块。

首先,一个 2% 的税是必须的。这部分Atom会进入贮存池中。贮存池里的资金会通过治理来分配,用来作奖赏和更新升级的花费。

现在只剩下了1005个Atom。让我们假设提案人提案的区块包含了100%的验证人签名。因此提案人能获得手续费奖励中的5%的额外奖励。

我们解这个简单的算式得出给每一个验证人的奖励R :
9*R + R + R*5% = 1005 ⇔ R = 1005/10.05 = 100

遭到削减处罚的原因?

如果一个验证人行为不端,他抵押的股权,连同其委托人的股权都会遭到削减处罚。处罚的严重性依据错误的类型来定。有3个主要的错误会导致验证人和其委托人的资金遭到削减处罚:

请注意,即使一个验证人并不是有意作恶,在出现节点崩溃,失去连接,被DOS攻击,或者是私钥泄露的情况时,仍然会被遭受削减股权的处罚。我们很快会出版一个关于网络经济的完整文档。

验证人必须要自抵押股权吗?

不。一个验证人的总股权等于其自抵押股权和受委托股权的总和。这意味着一个验证人可以通过吸引更多委托人来补偿其低额的自抵押股权。这也是为何对验证人而言,良好的声誉是极其重要的。

尽管对验证人来说是并没有义务去自抵押Atom,委托人还是希望他们的验证人在其股权池里有一定的自抵押Atom。换句话说,验证人应该共担风险。

为了委托人能获得一些与之共担风险的验证人给予的保证,验证人可以声明一个最小数量的自抵押Atom额度。如果一个验证人的自抵押额度低于预先定义的限制,该验证人和其所有的委托人的股权都会被赎回。

怎样预防股权集中到少数的验证人手中?

目前我们期望社区能有更明智的和有自我保护意识的行为表现。当一个Bitcoin的矿池获得过多的算力时,社区通常会停止向该矿池贡献算力。Cosmos Hub在初期也将会依赖同样的方式。之后,其他的机制会被应用,来尽可能地使这个过程更顺畅:

技术要求

对硬件的要求是什么?

我们期望验证人供应一个或多个的有着充足电力,网络资源,防火墙安全,HSM和服务器的数据中心。

我们期望初期能有一个适度级别的硬件规格说明书,会随着网络使用的增长而逐步提高标准。参与到测试网络是了解更多情况的不错方式。

对软件的要求是什么?

除了能运行一个Cosmos Hub节点,验证人还应该开发相关的监控,预警和管理的解决方案。

对带宽的要求是什么?

与像Ethereum或Bitcoin这样的区块链相比,Cosmos网络要有高吞吐量的性能。

我们建议数据中心只在云服务上连接信任的全节点或者是相熟知的验证人节点,这会减轻数据中心遭受DOS攻击的压力。

最后,随着网络越来越被重度使用,具有单日十亿字节级别的带宽是非常现实的。

运行一个验证人节点意味着什么?

运行一个成功的验证人节点需要多方面的技艺精湛的和持续性运营的共同努力。相比运行一个Bitcoin矿工节点,这被认为是有些复杂难懂的。

怎样去进行密钥管理?

我们期望验证人去运行一个HSM来支持ed25519密钥。下面是可能的选择:

Tendermint团队不会推荐上面的其中之一。社区最好去加强努力去提高HSM和密钥管理的安全性。

在操作上我们期望验证人可以做到哪些?

进行有效率的操作是避免验证人节点的意外的掉线或遭到削减处罚的关键所在。这包括良好的应对攻击,断电的能力,还有维持数据中心的安全性和独立性。

维护需要哪些?

验证人应该去执行常规的软件升级以适应更新和修复漏洞。在启动阶段的前期阶段不可避免的会出现一些网络问题,这需要大量的警觉。

验证人怎样保护自己免于DOS攻击?

当一个攻击者向一个IP地址发送海量的因特网流量来阻止该IP地址上的网络服务时,这就是DOS攻击。

一个攻击者扫描网络,尽量去获得多个验证人节点的IP地址,然后通过向他们发送海量流量来阻断他们之间的连接。

一个降低这样的风险的推荐做法是验证人在所谓的sentry节点的架构中精心去构建他们的网络拓扑结构。

验证人节点应该只连接到他们所信任的全节点上,因为他们可以操作自身,也可以被他们熟知的其他验证人运行。一个验证人节点通常会运行在一个数据中心。大部分数据中心提供对主流云服务提供商的直接网络连接服务。验证人可以使用去连接云服务中的sentry节点。验证人节点直接连接到他们的sentry节点,这样减缓了DOS攻击带来的压力,可能需要新的sentry节点被激活去减轻已存在的sentry节点所遭受到的攻击。

sSentry节点能够迅速地被轮换或者改变它们的IP地址。因为与sentry节点的连接是在私有的IP网段,基于因特网的攻击不可能直接骚扰到它们。这将确保验证人区块的提交和投票总是能传播到网络中的其余节点。

期待验证人在这方面良好的操作将完全消除这些威胁。

上一篇 下一篇

猜你喜欢

热点阅读