《区块链技术指南》读书笔记(三)
区块链中的密码学技术
哈希算法。比特币中使用了两个密码学哈希函数,一个是SHA256,一个是RIPEMD160。
在比特币的实现中,除来做工作量证明为,还用到了哈希指针链
和Merkle哈希树
公钥密码算法为椭圆曲线算法:椭圆曲线密码(Elliptic Curve Cryptography,ECC)算法是基于椭圆曲线数学的一种公钥密码的算法,其安全性依赖于椭圆曲线离散对数问题的困难性。
共识算法:
拜占庭容错技术(Byzantine Fault Tolerance,BFT)来源于拜占庭将军问题。为了降低拜占庭协议的运行复杂度,这里使用实用拜占庭容错系统(Practical Byzantine Fault Tolerance,PBFT)
如果我们不需要强一致性,而是只处理一般的死机故障,采用Paxos等协议会更高效。谷歌的GFS、BigTable采用的是基于Paxos的Chubby的分布式锁协议,Yahoo的Hadoop系统采用的了类似的Zookeeper协议。考虑到私有链或者联盟链的安全性比公有链场景要高,一般不经常存在拜占庭故障,所以在一些场景中可以考虑采用非拜占庭协议的分布式共识算法,比如Raft协议。简单地说,Raft协议就是,许多节点先选择一个领导,然后以领导的指令为准同步,以达到一致性的目的。
回到比特币,怎么样选出领导呢,就引入了PoW机制,以上面的Raft为例,n个节点,先选出领导,怎么选呢,可以说是随机的,或者说只与网络状态有关,而引入了PoW就是,看谁能通过算力加运气,先找到一个新的区块,找到了新的区块,就有资格将这个区块发布出去。
PoW浪费了大量的算力,又不能保证解决拜占庭问题,所以有人又提出了权益证明(Proof of Stake,PoS)来代替工作量证明。
PoS简单来描述,就是如果你拥有货币的时间长数量多,你的权限就大,简单来算,你手头的币的数量乘以拥有的天数为你的权限,然后凭这个值来竞争领导者来写新的区块。这基本上不需要消耗算力了。直观上就能看到,越有钱的越有利,所以NXT币和黑币采用随机的就去预测下一合法区块。另外,PoS也可能会导致人们囤币,所以瑞迪币(reddcoin)也引入了权益 速度证明,鼓励钱币的流通。
基于PoW和PoS的不足,人们又引入了股份授权证明机制(Delegated Proof of Stake,DPoS),比特股(Bitshare)就是这类采用DPoS机制的密码货币。
比特股引入了见证人这个概念,见证人可以生成区块,见证人通过持股人的投票选举。不光区块链可以通过选举出的见证人写入,货币的一些参数也可以通过选举来决定,说句题外话,比特股的创始人好像就这样被选出去了。
小蚁共识机制:上面的算法是选领导人,只是选法不同,而小蚁只不同,它是先通过多节点产生一个区块随机数,然后将这个随机数使用沙米尔秘密共享方案(Shamir’s Secret Sharing Scheme,SSSS)分成n份,根据这个方案,只要能回收k份,就能恢复秘文,这N份用其它N个记账人的公钥加密,广播。这N个记账人收到后,用自己的私钥解密并广播,如果有k份被解密的碎片被收集,就能得到一个正确的区块。这里不了解的是,奖励归谁,不过,相信其白皮书中有详细的说明,这里不去研究了。
下面用一个开发试验环境来熟悉比特币的开发。
用一个ubuntu14.04的虚拟机来安装Docker环境。然后导入比特币测试网络的镜像并运行。可以看这个说明。从中可以看出,比特币系统中可编程的部分其实是有限的。我们可以想像比特币系统由一串账单构成,这个账单里记录的是交易情况,只是在备注的地方可以 给我们一起发挥的空间,我们可以在备注里写一些数据,这明显限制了它的使用场景。书中介绍了ODIN(Open Data Index Name)项目。
实现的原理也很简单,在区块链上的备注字段,加一个字符串,这个字符串里有唯一的标识符标识要定义的数字资产,还有一个URL告诉你到哪里看到这个资产的详细信息。
优点自然有一堆,不过缺点也很 明显,效率低啊,要先从开源的映射表中找到ODIN到区块的映射,找到区块,然后从区块中解析出对应的URL,还要到URL上再解析出具体的内容。如果不在区块链技术基础上能不能实现这个功能呢,好像 也可以,比如Zone网,Tor网,但是区块链有两个好处,一是永久存在,二是有利益为动力让人们增加节点。任何写入ODIN都是要付费的,就是区块链中基本的消息费用。
ODIN的技术规范可以在网上找到。写入区块的ODIN数据是不能修改的,但是映射的URL里内容是可以 修改的,这样还有一个坏处,就是ODIN里会出现许多的死节点。而且因为ODIN的写入是有成本的,这个成本与比特币的价格相关。
再理解一下区块,一般的应用,程序和数据是分离的,而区块里,其实不光有数据,还有加密的协议,操作方式等,是一个完全独立又完整的个体。
智能合约:在如刚才的理解,区块中不仅有数据,还可以绑定程序,既然区块是可信的,我们也可以认为程序也是可信的,里面的程序是不可更改的,这样,可以按把一部分的自动化脚本也绑定到区块中,让它自动执行,这就是智能合约了。
历史上以太坊的the DAO事件却又体现了智能合约的风险之处,不过这一事件却又进一步验证了区块链技术中不可更改的特点,都已经发现漏洞了,却没有办法修改这个漏洞。
https://github.com/TheDAO/DAO-1.0)
- 超级账本项目(Hyperledger)
为了克服比特币的缺点又能利用其优点,一些大企业一起启动了这一项目。简单理解,就是建立一个基础的区块链系统,供各个项目使用,相当于区块链的基础架构体系。
著名的项目有,Fabric、Sawtooth Lake等。
通过对比特币交易的分析,可以发现其匿名性和隐私性都是相对的。而矿池的算力集中问题也使得去中心化变得名存实亡。而一旦算力集中超过51%,引发的51%攻击问题,使得整个系统的安全变得岌岌可危。
- The DAO事件:
the DAO的源代码可以在Github上看到。从中可以看到其代码出现了一个Bug
根据The DAO白皮书的设计,代码中splitDAO函数的运行可以分裂出一个小规模的DAO。这个函数的本意是要保护投票中处于弱势地位的少数派,防止他们被多数派通过投票的方式合法剥削。通过分裂DAO,给予他们一个拒绝的机制,同时仍然确保他们可以获取分裂前进行的对外资助产生的可能收益。
splitDAO会创建childDAO(如果不存在的话),将分裂者拥有的以太币转入childDAO中,支付任何已产生的报酬(Reward),然后返回。攻击者利用了这一目前唯一可行的提取以太币的机制,创建childDAO并将以太币持续地转入给定的账户。
攻击者分析了DAO.sol代码,发现splitDAO函数在递归发送模式上存在漏洞:该函数只是在最后才修改用户的结余和交易总额,如果能够在返回splitDAO处理这些运算之前,进行多次以太币操作调用,就能通过多次递归来持续转移以太币到其他账户。
这一事件导致以太坊的分叉,这又引起了一种“重放攻击”
闪电网络(Lightning Network)
一个比特币的交易流程是,转账需要得到至少6个块的确认,而出块的速度又是受限的,所以要完成一次交易,其实是比较慢的,尤其在小额交易时,一是慢二是交易费用高。这时,闪电网络则通过奇妙的想法解决了这个问题。具体的算法比较绕,但是基本原则是,A和B维护一个共同的账户,通过改变账户中的资产比例来进行转账,如果涉及第三方,则通过多个共用账户来实现。