讲一下如何用R语言构建区块链。
区块链是年初以来被炒得最火、也最“莫名其妙”火起来的技术。得益于大佬们的集体发声,区块链最终在业界达成了共识,“无区块链,无未来!”。这样的共识,在历史上,也同样出现在很多成功或失败的技术上。
下面的内容,部分参考(主要是代码)Johannes Mueller的一篇博客。Johannes Mueller说他受另外一个用Python写区块链的博客启发,于是写了一个R语言版本的区块链。
我看了下Johannes Mueller的博客,里面并没有涉及太复杂的细节,讲的是在实现区块链的两个非常重要的环节,即Hash(哈希)和 Proof-of-Work-Algorithms(工作量证明)。
Hash是加密算法的一部分。Johannes Mueller举了一个例子来说明什么是Hash。
Johannes Mueller问他的朋友:“你猜猜,在R语言和Stata语言中,哪一个是我的最爱?”,接着他又告诉朋友:“我可以告诉你答案,但是我只能给你这个答案的Hash值,而且是用SHA256算法得到的Hash值”。
这个Hash值是:
“71ec0b920622cf4358bbc21d6a8b41f903584808db53ec07a8aa79119304ce86”
如果不借助工具,估计大家都猜不出这段Hash值到底代表的是什么。但是,这个问题的答案很明确,要么是Stata,要么是R,而且我们还知道产生这个Hash值的算法是SHA256算法。
于是,Johannes Mueller的朋友使用R语言的digest工具来寻找答案,首先,他用digest工具得到Stata的Hash值,代码如下:
很明显,Stata的Hash值与Johannes Mueller提供的Hash值并不相同,所以,这位朋友基本上可以判断Johannes Mueller喜欢的是R语言。我们看一下R的Hash值是多少?
R的Hash值确实和Johannes Mueller提供的Hash值是一样的。
Johannes Mueller问的是一个很简单的问题,而且给出了潜在的答案。可是现实情况要复杂的多,没那么容易就能得到答案,要通过秘钥才能知道Hash值所表达的真实内容。
我们再回到区块链上。字面上区块链是由一个个区块连接成的一条链条(这么解释有点多余)。区块里都装了些什么呢?如图所示:
index(索引)、timestamp(时间戳)、data(数据),如果仅仅是这三样东西,那么这个区块和普通数据库没什么区别。
可是,当我们加上 previous_hash(之前的Hash值)、proof(证明)、new_hash(新的Hash值)之后,区块就不再是传统数据库了。
我们举个银行的例子,来说明传统数据库的内在风险。主要体现在以下两点:
获得超级权限的人,可以对数据库进行篡改。这个技术风险始终存在。
银行内部人员串通,通过“合法”手段窃取客户财产。这个道德风险始终存在。
我们再看一下区块。
index(索引)、timestamp(时间戳)、data(数据),这三样东西是传统数据库存储的信息,如果hacker攻入数据库只看到这些信息,当然很开心了,赚它一个亿的事情就在眼前。
可是,当hacker看到 previous_hash(之前的Hash值)、proof(证明)、new_hash(新的Hash值)这三样东西,估计就没那么开心了。因为new_hash是根据index、timestamp、data、previous_hash这四项生成的。如果hacker想“偷走一个亿”,必然要改这个new_hash,可是这个区块的new_hash,是下一个区块的 previous_hash,hacker必须设法把这个区块之后所有区块内的hash全部进行篡改。这就不符合hacker“悄悄干活”的初衷,反而变成了一场大规模的网络攻击,hacker要是有这本事,去“割韭菜”好过抢银行。
我们看一下 new_hash 是怎么产生的。
相当于把 index、timestamp、data、previous_hash 这四项打包加密了。
这好比把数据库中的数据之间进行了关联,有点类似中国古代的“保甲制”或“连坐制”,单独改一条数据肯定是不行的,差不多要“牵一发而动全身”。
而且,hacker 改 new_hash 也不是那么容易的事情。hacker还得获得 proof,proof 有点类似公司的公章,光有数据不行,还得加盖公司的公章。很多人终其一生,排排队也好,宫廷内斗也好,都是为了一枚枚公章,有了公章,就有了权利,就有了“钱途”。
可是,区块链中的“公章” proof 偏偏不是掌握在少数人手里的,而是通过 Proof-of-Work-Algorithms(工作量证明)来进行分配的,在比特币世界里,只有那些付出足够多“心水”的矿主们,才有可能获得足够的“公章” proof ,进而获得比特币,而且获得“公章” proof的难度越来越大,收益却越来越少。
所以,hacker要想篡改区块中的数据,得设法获得每个区块的“公章” proof,这对hacker来讲,几乎是“不可能完成的任务”。对于银行而言,由于“公章” proof 不掌握在少数人手中,“监守自盗”的道德风险得以缓解。
我们看一下“公章” proof 是怎么产生的。
Johannes Mueller 用了一个“比较水”的Proof-of-Work-Algorithms(工作量证明),现实中区块链的Proof-of-Work-Algorithms(工作量证明)要复杂很多。这里假设每个人都有一个编号,只有能被99整除且能被前一个proof整除的编号,才可以作为下一个proof。
到这里,我们可以看到区块链的两个基本特征。一个是数据的捆绑加密,一个是产生“公章” proof的独特设计。
我们看一下 Johannes Mueller 举的例子。他做了一条六个区块的区块链。
每个区块里的data都是一样的:赚他一个亿。我们看一下第四个和第五个区块差异。
虽然两个区块的data是一样的,但index、timestamp、data、previous_hash、new_hash不同,且第4个区块的new_hash是第5个区块的previous_hash。这种关联加密以及Proof-of-Work-Algorithms(工作量证明)的机制,在确保数据安全上,确实有很大的进步。
昨晚,雷锋网报道A站数据泄露,客户的账户和密码被hacker挂在网上。如果使用区块链这种关联加密技术,恐怕是没那么容易被攻击吧。
另外一个细节是,报道中提到“目前市面上最常见的加密算法是 MD5”。如果此事属实,那么数据安全市场的规模就太大了。毕竟,2004~2005年,山东大学的王小云教授带领团队先后破解了MD5、HAVAL-128、MD4、RIPEMD、SHA-1密码算法。