区块链tendermint into区块链
一、Tendermint 共识算法
分布式一致性算法一般可以分为两类:拜占庭容错和非拜占庭容错。
非拜占庭容错算法如 Paxos, Raft等在当前的分布式系统中已经广泛使用,而拜占庭容错算法的实际应用范围相对来说小很多(特别是在区块链问世之前)。
Tendermint属于拜占庭容错算法,它针对传统的 PBFT算法做了优化,只需要有两轮投票即可达成共识,目前 Tendermint算法主要应用在区块链系统中,这篇文章就从原理上来介绍 Tendermint的共识机制。
关于 Tendermint算法的完整描述在这里。
这里先介绍一下算法的流程,理解了算法流程之后,再来阐述该算法的安全性证明(Proof of Safty)和活性证明(Proof of Liveness)。
下面这张图是 tendermint状态转换图
算法主要有 NewHeigh-> Propose-> Prevote-> Precommit-> Commit一共 5个状态(阶段)。
上述每个状态都被称为一个 Step,首尾的 NewHeigh和 Commit这两个 Steps被称为特殊的 Step,而中间加粗体的三个 Steps则被称为一个 Round,是共识阶段,也是也是算法的核心原理所在。
需要注意的是,一个块的最终提交(Commit)可能需要多个 Round过程,这是因为有许多原因可能会导致当前 Round不成功(比如出块节点 Offline,提出的块是无效块,收到的 Prevote或者 Precommit票数不够+2/3等等),出现这些情况的话,解决方案就是移步到下一轮,或者增加 timeout时间)。
这里,还要介绍一个重要概念:PoLC,全称为 Proof of Lock Change,表示在某个特定的高度和轮数(height, round),对某个块或 nil(空块)超过总结点 2/3的 Prevote投票集合,简单来说 PoLC就是 Prevote的投票集。
Tendermint中有两种类型的节点,Validator节点和 Non-Validator节点,顾名思义,只有 Validator节点会参与共识投票,而普通节点作为 Non-Validator节点,不参与共识投票,只协助传递状态或向 Validator节点发送交易请求。
初始状态下(创世块),高度为 0,此时,系统会基于 Round Robin原则来选出一个 Validator(每个 Validator都有一定的 Voting Power),由这个 Validator打包一个新的 Block,并向所有节点发出 Proposal,剩余的 Validator节点对该 Proposal进行投票,最终达成共识。
以下,分阶段来阐述各个阶段:
当上一轮 Commit结束,就会出现新高度,这是就需要进入下一轮共识了,也就是说,这就是新一轮共识过程的开始,这时候需要选出一个 Proposer。选择算法是 Round Robin,基于他们的 Voting Power(上一轮的选中的 Validator节点会把其 Voting Power值减去 Total Voting Power,也就是说上一轮的 Validator在这一轮,其 Voting Power会变成负数)。
在 Propose节点开始的时候,该轮指定的 proposer需要通过 gossip广播一条 proposal到所有的 peers。如果此时这个 proposer被锁在上一轮的某个 block上,那么它就直接 propose那个 block,同时包含一条 proof of lock的信息。
Validator节点收到 propose信息之后就进入 Prevote投票阶段。投票时,如果 Validator被锁在之前一个 block上,那么还是给之前那个 block投 prevote票,否则就投当前的 block。同时,它会继续收集对这个 block的 prevote投票,等轮到他 propose的时候打包进 PoLC。
注意:
如果自己有 Lock-Block,这时又收到一个新的针对另外一个块的 PoLC,并且满足LastLockRound< PoLC-Round<当前 Round,则解锁 Lock-Block。
如果 timeout期间没收到 proposal,或者收到的 proposal是无效的,那么就投 nil票。
在 Prevote阶段不会锁住任何 block。
Prevote超时或者收到的 Prevote的 nil票超过 2/3时,就进入 Precommit阶段。
如果此时收到了+2/3的 prevote投票,就广播一条 precommit投票,同时,把自己锁在当前的 block上(把之前的都释放掉)。一个节点一次只能锁在一个块上。
如果收到+2/3的 nil投票,那么就释放锁。
当一个节点锁在一个 block上的时候(有 PoLC),它会将 LastLockRound置为当前 Round,并对这个块投 Precommit票。
如果有针对 nil票的 PoLC,则解锁并且对 nil投 Precommit票;否则的话保持 Lock-Block不变,并投 nil。
如果在 timeout期间内,没有收到对某个块的足够的+2/3投票(prevote或者 nil都行),那么就什么也不干。
最终,如果一个节点收到了+2/3的 precommit投票,就进入 Commit阶段。否则,继续进入下一轮的 Propose阶段。
Commit阶段是一个特殊阶段,有两个并行的条件必须满足:
At any time during the consensus process if a node receives more than 2/3 of commits for a particular block, it immediately enters the Commit step if it hadn’t already. Thus there are two ways to enter the Commit step. A commit-vote for a block at round R counts as prevotes and precommits for all rounds R0 where R< R0. Commit-votes are gossipped to neighboring peers in the background re-gardless of the current round or step。
At any time during the consensus process if a node is locked on a block from round R but receives a proof-of-lock for a round R0 where R< R0, the node unlocks.
Tendermint的安全性就是说,在对高度为 H的块达成共识之后,不可能会出现新的高度为 H的块,也就是说 Tendermint保证不会分叉,保证不会分叉的主要角色就是 Lock-Block。
先看下wiki对于安全性证明的描述:
Assume that at most-1/3 of the voting power of validators is byzantine. If a validator commits block B at
round R, it's because it saw+2/3 of precommits at round R. This implies that 1/3+ of honest nodes are still
locked at round R'> R. These locked validators will remain locked until they see a PoLC at R'> R, but this
won't happen because 1/3+ are locked and honest, so at most-2/3 are available to vote for anything other
than B.
翻译:
假定有最多小于总结点 1/3的拜占庭节点。如果一个节点在第 R轮提交一个块,则表明此节点在第 R轮收到大于 2/3的针对此块的 Precommit投票。这也就意味有
大于1/3的诚实节点在第 R’(R'> R)轮仍然锁定在这个块上(因为大于 2/3的 Precommit投票必定包含大于 1/3诚实节点的 Precommit投票)。只有当遇到针对另一个
块的 PoLC时才会解锁,但是在 R'轮是不可能有针对某个块的 PoLC,因为已经有大于 1/3的诚实节点已经锁定在这个块上,所以就不可能有对另外一个块大于 2/3
的 Prevote投票。
下面给出较为详细的证明过程,假设高度为 H的块 b在第 R轮达成共识。给出如下条件:
需要证明,当 x个节点 commit之后,剩余(也就是 y+ z)的没有 Commit块 b的节点不会对另外一个块达成共识。
也就是说需要证明:y+ z- z0< 2/3,假设所有的拜占庭节点都对 b投了 Precommit,则满足:x+ y+ z0> 2/3。
简而言之,要从 x+ y+ z0> 2/3证明 y+ z- z0< 2/3。
我们通过反证法来证明:
假设 y+ z- z0> 2/3,也就是在第 r轮之后有可能造成分叉,则:
x+ y+ z- z0> 2/3+ x=> 1- z0> 2/3+ x=> x+ z0< 1/3。
而上面我们提到了,因为x节点已经 Commit块 b,则 x+ y+ z0> 2/3,且 y< 1/3,则说明 x+ z0必须大于1/3。由此证明,y+ z- z0< 1/3成立,在第 R轮之后无法对另一个块达成共识,也就不可能出现分叉。
活性证明相对来说就要简单一些,假设多于 1/3的节点分别 Lock在不同的块上,则在 Prevote阶段的条件保证最终 round较小的会 unlock,而且 proposal的超时时间会随着轮数的提高而提高。
在证明安全性的过程中提到,有可能会有部分节点由于没有收到足够的 Precommit投票导致无法 commit,这个时候可以通过同步来使各个节点的状态尽量保持一致,在wiki中提到一个 JSet和 VSet的概念,当节点已经 commit时,就可以广播一条消息携带 VSet给其他节点,其他节点验证对于块的 commit是否有效。这一点其实和 bft-raft(另外一个拜占庭容错算法,Raft算法的变种)的做法类似。
二、区块链具有哪些特点
据报道,区块链具有去中心化、去信任和不可篡改等优势特点。
报道称,区块链的其基础层协议相对较为晦涩、语言欠丰富,导致其应用门槛高。因此,开发者工具项目成为了区块链项目生态中最核心的一环。特别是智能合约的出现,凭借其灵活多变、适用性强的特点,加速了区块链技术的应用进程。
相比于智能合约,EOS为开发者提供了更多的底层模块,如并行运算、数据库、账户系统等。而Aion等第三代区块链技术使跨链交易成为了可能。其中,Cosmos是由大量独立的区块链构成的网络,通过其网络,用户能够使用内部区块链通信包将代币从一条区块链转移至另外的区块链上。
而相比于互联网,Cosmos所构想的区块链网络在信息交互的同时,也实现了资产价值传递。通过IBC跨链协议,基于Cosmos的Tendermint Core开发的区块链之间能实现代币的跨链转移,而对于类似于以太坊一类的基于PoW共识机制生成的公有链,可以使用Pegged Zone桥接。
文章来源:比特110网
三、gate.io的委托有哪些特点
Gate.io永续合约委托有哪些类型和特点
普通委托。先尝试吃单,如果没有完全成交,则挂起。
立即成交或取消。只吃单,没有完全成交的部分并不挂单。其中市价委托此类型。
被动委托。只挂单,不吃单。如果在下单时会立即成交,则不成交并撤销。可以用来保证不被收取taker手续费。也可以用来防止误操作。
只减仓委托。当委托被撮合时,只会减仓。如果超出仓位大小,则会被取消。
平仓委托。一个仓位同时只能有一个平仓委托。平仓委托也有只减仓的特性。
冰山委托。用户可以调小委托在市场orderbook的显示数量。但对此的惩罚是,实际数量和显示数量间的成交,会以taker角色来收取手续费。
策略委托是指市场一旦满足您预先设定的触发条件,系统自动将事先设置的委托送入市场的委托。
止盈止损委托。止盈止损委托是一种策略委托。当被触发后,系统检查预定委托的有效性,创建委托单并将其送入委托单列表。
如果有效性检查失败,例如,账户余额不足、超出风险限额、平仓委托冲突等,则会导致下单失败。
其中平仓委托冲突,是指由于一个仓位同时只能有最多一个平仓委托,所以如果仓位已经存在一个平仓委托,而止盈止损委托也选择了“触发后平仓”属性,那么在触发时会因为“仓位在平仓中”而下单失败。
如果用户在有平仓委托的情况下,确实又想创建一个止盈止损委托,那么可以选择”只减仓“属性,而不使用”触发后平仓“属性。
-
芝麻开门交易所官网地址 芝麻交易所排名 11-09