朱汉成
(四川大学计算机学院,成都610065)
随着以比特币为代表的虚拟数字货币飞速发展,区块链作为这个应用的底层关键技术受到了国家和科技巨头们的极大关注。区块链天生具有去中心化、不可篡改等特性,使其在对数据信息安全性要求高的行业应用前景极其看好[2],现如今很多银行带头做起金融区块链,蚂蚁金服也发布了落地应用——善款追踪和商品溯源。但是现在的以太网为代表的区块链生态系统的在交易吞吐量等方面远远满足不了当今大部分应用场景的需求。
共识算法作为区块链的核心,往往决定着区块链的出块效率,如今共识算法发展的十分全面[1]。现如今以PoW、PoS 算法为主流共识算法的公有链,虽然可以很好的保证了安全性,但是效率低下。以Paxos、Raft为代表的传统一致性算法只能追求在宕机或者网络问题时仍能保证一致性,但是组织恶意节点进行破坏攻击;PBFT 拜占庭容错算法)则是一种状态机副本复制算法,可以防止1/3 以下节点数的恶意节点攻击,但是却需要较大的网络带宽来保证副本的复制。
区块链作为这两年风头正热的新兴技术,难以落地一直困扰众多看好区块链的政府与企业。现实的企业应用中,假如应用不涉及代币内容,那么我们可能要求的区块链的交易吞吐量达到一个较高的量级,而不是常见公有链以分钟计来确定一个区块。因为主流的公有链的区块链应用不仅效率堪忧,而且浪费大量算力是国家和有责任的企业不愿意看见的。随之而来就是大量对联盟链和私有链的研究。联盟链是多数机构共同维护一个联盟链,并且大多使用基于PBFT 的算法,TPS 可以过万,但是还是容易收到PBFT 算法影响,当节点个数过多时,共识难以达成,效率大受影响。私有链与联盟链类似,但私有链由单个机构或组织来管理,很多时候默认链中节点是不会成为恶意节点进行攻击的。但是私有链实际情况之中还是会出现恶意节点,假如恶意节点成为记账节点,那么对于整个私有链是致命的。本文将改进Raft 算法并且应用到我们的私有链之中,既保留了算法中快速找出记账节点进行记账,同时保证出现恶意节点攻击也能保证系统稳定、其他节点不受影响。
Lamport 首次提出Paxos 算法,用以解决分布式中节点的一致性问题,虽然后来又在中进行简化说明,仍然理解起来较为吃力并且难以工程实现。Diego Ongaro 和John Ousterhout[3]提出了Raft 算法,相比于Paxos而言更加简单理解而且更容易工程实现。一致性是指多个服务器节点状态达成一致,但是在一个分布式的系统之中仍然会出现一些节点出现宕机等不稳定状况,就难以和其他的服务器保持一致。这时候一致性协议出现可以保证尽管出现节点异常,仍然可以保证整个分布式系统正常运行。在Raft 算法中,主要有三个角色:Candidate、Leader、Follower。Candidate 节点分别向其他的节点索要选票,如果收到的选票可以达到节点数的半数以上,Candidate 节点的身份将会升级为Leader,Leader 就可以对其他Follower 节点进行只会操作。李升林[4]等人也曾改进Raft 算法并且将其用在区块链中,Raft 算法的简单高效有着很高的改进余地。本文通过对Raft 算法进行改进以防止恶意节点攻击。本文将增加一个Monitor 身份用以接收验证信息并且此时可以判断哪些节点出现问题或者是恶意节点,达到一定错误次数以后将会进行删除节点的操作。Leader 将会把打包的区块信息广播给其他的Follower 节点,因为每个节点都会收到所有的交易数据,那么每个节点都可以对Leader 打包的区块进行一个验证。每个节点都会将自己的计算结果广播给所有的其他节点,此时所有节点的身份都将变成Monitor,Monitor 将会进行统计票数,如果收到的计算结果正确的个数超过半数,则说明Leader 计算的结果正确并且进行记账,同时各个节点将会记录问题节点,记录达到一定程度,我们将舍弃此节点;如果收到计算结果正确的个数未超过半数,则说明Leader 计算结果出错,节点身份将会变成Candidate 再次竞争Leader,至于上一轮Leader 计算结果出错可能会出现两种状况:一是恶意节点、二是网络问题导师交易信息不全,各节点也将记录此次Leader,如果再次连续出现问题记录,下次Monitor 会考虑舍弃此节点。改进后的算法可以作为私有链的共识算法,不仅保留了Raft 本身效率高的特点,而且具有防止恶意节点攻击的情况出现。
改进算法中节点的四个角色:
Candidate:候选人,可以竞选Leader;
Follower:跟随者,进行Leader 选举投票,校验Leader 打包区块的结果;
Leader:领导者;
Monitor:监视者,收集Leader 和Follow 计算结果的反馈,从而判断问题节点进行下一步操作。
每个节点都可以同时具有所有角色,不同的过程扮演不用角色。
(1)Candidate 节点将进行竞选Leader,我们可以进行一些策略避免所有Candidate 节点同时竞选,例如可以参考PoW 算法,产生一定随机性。当Candidate 收到其他Follower 的返回结果时,统计结果,如果票数过半,则说明选举成功。此节点角色将由Candidate 变为Leader,具有此次的记账权。
(2)Leader 节点将自己节点收到的交易信息进行整理、计算、打包成一个区块,将计算后的区块信息广播给其他的Follower 节点。
(3)所有Follower 收到节点后的将会根据自己节点收到的所有交易信息进行整理、计算,并且与Leader广播的结果进行比较,然后将自己的结果广播给其他的所有节点(包括Leader 节点)。
(4)每个节点会收到其他节点的所有结果,这个时候节点的角色将会兼顾着Monitor 的角色。节点会接收到其他所有节点的验证Leader 结果的反馈,会有以下两种情况:
①如果各个节点收到Leader 计算结果正确的反馈超过半数,节点就可以将Leader 广播的区块进行记录上链,并且将记录所有反馈节点错误的节点,并且进行监管,如果连续出现问题,可能是网络问题导致所接受的交易信息不够完整,也有可能节点攻击后进行恶意操作,此时各个正常节点将行使Monitor 的权利,将此节点除名,保证安全性。
②如果各个节点收到的Leader 计算结果正确的反馈未能超过半数,各个节点就会重新进入到步骤(1)进行竞选Leader,同时记录Leader 为待验证问题节点,而反馈Leader 结果正确的节点将会被各个节点直接舍弃,因为一定是被攻击到的问题节点。
相比较原算法而言,本文提出的改进方案多加了一个角色信息,与此角色相对应的增加了校验Leader节点计算结果全部节点校验和出错节点记录的过程,使得改进后的算法具有的容错的功能。
本文将使用改进后Raft 算法作为共识算法的构建私有链进行攻击,确认改进后私有链的安全性;并且对比改进算法后构建私有连的交易吞吐量状况和传统的公有链的交易吞吐量进行对比,体现私有链的可用性。
(1)实验模拟私有链共有五个节点,并且分别攻击一个非Leader 节点、一个Leader 节点、攻击两个节点,查看私有链的运行状况:
①攻击一个Follower 节点,其他节点会正常进行记账并且记录此Follower 节点此次出错。
②攻击Leader 节点,Leader 节点会发送错误信息,其他节点会发现计算区块信息错误并且重新选举Leader,并且将Leader 记录此次出错。
③攻击半数以上节点,如果Leader 节点发送错误信息,其他节点也会进行记账加区块;如果Leader 节点计算的区块内容是正确的,但是由于作恶节点占到半数,那么最后每个节点都会认为Leader 计算结果出现问题,并且重新选举节点,并且造成系统瘫痪。
(2)实验将计算区块生成效率,然后与公有链的算法进行比较:
经过实验模拟,本文提出基于改进Raft 算法的私有链打包区块的TPS 可以达到5000 左右,比起主流的区块链的打包区块速度有了质的飞跃,如果进行后期的足够优化,本文提出的方案将可以更加广泛的应用在各种领域。
本文对Raft 进行改进并且将其应用到私有链之中,既保留原来强一致性的高效,又可以防止恶意节点的攻击,为很多私有链应用落地提供更多可行性的方案。今后的工作将对Raft 算法进行更多的容错方面的改进,使其在复杂的网络环境保证可用性得到提高,能够有更强的生命活力;并且能够改进通信和负载均衡方面的结构,让私有链在通信的时候尽量减小网络开销,提高系统的稳定性。