开篇
很多年没有看到像区块链这样有生命力的事物了它像一个欣欣向荣的新大陆一样, 把技术理想主义者, 围观者, 投资者, 投机者, 甚至流氓骗子各色人等聚集在一起
在此乱象中, 我深感于现在区块链, 观点太多, 事实太少我作为一个个体去摸这头大象的时候, 比较擅长的是以技术的角度切入, 看它到底是如何工作, 如何发展的, 从而把这一只象腿摸清楚我把自己的学习记录下来这些记录可能很入门, 甚至有错误, 但是或许对于同样感兴趣的人有所帮助
链表
从技术角度看, 区块链的底层是精妙设计的链表数据结构
什么是链表呢? 就是有顺序的一串数据块, 一个跟在另一个后面, 这个顺序是严格规定的, 不能乱区块链, 食物链, 供应链, 资金链, 甚至鄙视链, 描述的就是这样有顺序的一串物品
我们以比特币为例, 来剖析这个链表
为了构成链表, 链表的数据块里面有两个基本的部分: 区块头, 和数据本身区块头里面有一个字段指明了上一个区块的 id, 而所有区块的 id 既不是顺序的, 也不是随机的, 而是区块头这 80 个字节的两次哈希值
哈希 Hash
这可能是区块链里面最让非理工科出身的学习者费解的概念了听起来很吓人, 实际很简单哈希就是一个算法, 能把任意长度的内容 (无论是一个数, 还是文章, 图像, 视频, 总之就是任何数字化的信息) 转换成一串看似没有规律的固定长度的数字(哈希值), 并保证结果唯一, 而从这个结果几乎没有办法推算出原始数据比特币用的是叫做 SHA256 的哈希算法
比如: 1 的 SHA256 哈希结果是: 0x6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
2 的 SHA256 哈希结果是:
0xd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35
我们把这个哈希值看成乱码好了, 因为唯一的规律就是没有规律同时, 在原始数据中哪怕有一点点改动, 产生的哈希就会产生巨大的变化这个特性常常用来做数字指纹
用日常例子来打个比方比如按照配方做菜就是个哈希过程: 有了配方精确的做菜容易, 而从菜品推测出配方难得多给出两个数算出他们的平方和比较容易, 给出一个数求是哪两个数的平方和就难很多哈希算法就大概这么个意思
区块头和 id
刚才讲到, 每个区块的 id 从它的区块头的 80 个字节数据两次 SHA256 哈希得到区块链的一个精妙的设计就是, 它对于的 id 是有要求的只有满足特定的规则的 id 才是合法的这个规则就是: 区块头的哈希值必须小于一个数, 直观看到的就是, 每个新的区块的长达 64 个字符的 id 必须以比如 18 个零开头, 一个合法的区块 id 是长成这个样子的: 000000000000000000 3c19cdbebe2df5c7f82558e2c80a0c7341e25072b732a2
区块头这 80 个字节里面的 6 个字段, 5 个是不能改的, 它们是:
1. 版本号 最近一直是 0x20000000
2. 上一个块的哈希值 这个是排队时候的队尾, 改了就排不到队里了
3. 数据的哈希 这个是区块里的交易数据, 也不能改
4. 时间 不能改, 就是现在的时间
5. 难度 每个给定的时间全网的难度是一样的
只有第六个字段是随便写的, 这个数字叫做 No nce
6. No nce
网络上任何一台机器只要找到一个合适的数字填到自己的这个区块的 No nce 位置, 使得区块头这 6 个字段 (80 个字节) 的数据的哈希值的哈希值以 18 个以上的 0 开头, 谁就找到了那个金子! 既然我们无法事先写好一个满足 18 个 0 的数字然后反推 Nounce, 唯一的做法就是从 0 开始一个一个的尝试, 看结果是不是满足要求, 不满足就再试下一个, 直到找到
这个过程被戏称为挖矿其实我觉得这个过程和淘金更像淘金者做的事情很简单, 却很重复, 就是对于河里所有沙子, 拿起来一个, 判断是不是金子如果不是, 扔掉再拿一个如此重复几百万次, 总有一个是金子而在区块链世界, 那 64 个十六进制的字符串, 第一个是 0 的概率是 1/16, 第二个也是 0 的概率再乘以 1/16, 第 18 个还是零的概率可想而知所以大家为了找到这个金子一般的 No nce 一般要花费十几亿次尝试, 虽然每次算哈希的工作并不那么费时间, 重复十几亿次还是要耗费巨大的计算机资源和电力资源
比特币体系的另外一个精妙设计就是它动态的调整难度, 以无论有多少台矿机在寻找那个珍贵的正确的 No nce, 都保证大约每 10 分钟产生一个块这也是一个类似经济学的算法它每 2016 的块 (也就是 2 周) 就计算一下前面 2016 个块平均每个块花了多少时间, 如果低于 10 分钟就按照低的比例调高难度, 如果高于 10 分钟调低难度这样矿机无论增减, 比特币都可以按照每 10 分钟找到一个块的金数字并且生成一个合法的块
找到了那个金子一样的数字以后呢?
谁找到了那个数字, 谁都可以向全网广播这个新块了而真正的财富秘密在于在这个新块的数据区的交易数据里面, 第一条交易中, 挖矿的人可以凭空的给一个地址 (通常是自己的) 发放 12.5 个比特币这是规则认可的, 就好像赌场里荷官可以合法的从桌上拿一部分钱进自己的口袋一样这 12.5 个比特币是比特币网络上唯一没有发款人, 只有收款人的交易, 新的比特币就这样凭空诞生了这个激励每 4 年减半, 再过两年就只有 6.25 个了, 这样 2140 年左右两千一百万个比特币就基本上全产生了并且不会增加了
区块链的网络
刚才描述的是在一台电脑上的样子实际上, 这一串数据是通过 P2P 网络分布在无数的电脑 (节点) 上的任何矿工找到了那个金子数字后就立刻全网络刚播新找到的块如果所有节点在一个大的聊天室里面倒也简单, 但实际上这个广播是跟烽火台一样接力的传递的每个节点告诉周围的, 然后它再告诉周围的有意或无意的, 就会有两个或多个矿工近似同时对于网络的一部分分别宣布发现了新块这个时候的规则就是, 每个节点只会接受最长的链并且丢弃较短的链经过几个节点后一定有一个胜出, 另外一个被抛弃, 而添加新块是需要算力的, 最终一定是拥有最大算力的一方获胜这也就是如果没有人掌超过 50% 的算力就无法控制区块链
小结
以比特币体系为例, 最底层就是一串这样以 80 个字节的区块头开始, 约 1M 的数据跟着的数据用哈希这样的算法, 一层一层的锁定, 形成了固若金汤的链条再把它分布在成千上万的节点上, 再又成千上万的矿机通过挖矿来保持算力高压, 让篡改数据需要算力门槛同时, 任何人对于历史数据, 哪怕就改了很小的一部分, 数据的哈希就变了, 区块头就变了, 它的两次哈希结果就变了, 它后面的块就连不上来了, 就会被立刻发现如此几层嵌套, 一个人类到现在为止最为安全和防篡改的公共信息系统诞生了
下面几篇会记录一下钱包, 公钥密钥, 智能合约, 发放通证(Token), 区块链应用, 区块链对于组织的影响等等方面继续记录学习过程感谢阮一峰, 华宏伟, 王哲, 赵君, Tim Chen 的指正和帮助
后注
注: 这个跟其他的各种本质是并不矛盾, 比如区块链本质是分布式账本也对, 这个是在链表结构上面构建的, 也有人说本质是加密货币, 这也对, 因为货币是在分布式账本之上构建的这些说法之间不是非此即彼的矛盾关系, 而是不同层次的应用的问题
注: 自然界谁吃谁的顺序, 生产中的谁供货给谁, 再组装后工会给谁的顺序, 资金从哪里流到哪里, 再流到哪里等等, 都是这样的数据结构
注: 区块头的第三个字段其实不是数据的直接哈希, 而是一个树状结构 Merkle 根
注: 刚才所说的 18 个零是一种近似的说法严格地说, 是算出来的本块的 ID 必须小于一个叫做叫做目标数的数这个数越小(就是开始的 0 越多), 就越难
注: 严格的意义说最长的链不是最多区块的链, 而是链上的所有块的难度总量最大的链
注: 只给感兴趣的人看: 0x20000000 (十进制 536870912)是从 BIP9 开始规定的新的版本号规则, 开始用一个位数表示一个独立的功能, 以区分未来的软分叉 0x20000000 相当于 block 的第五个版本
注: 以我写文章的时候最新的一个块为例, 它的 80 位区块头是这样的:
00000020 5d9a3e3dec3e207c3afa9c0be901eaece34b99973a5033000000000000000000 8565d5bf3819014d521429f02b8cf9d27e226b80998f61d87cd51846c9ab6f95 51eb9c5a a3895517 ed52e1d4
非常不方便的地方在于比特币选择了小端存储, 就是习惯意义的倒着写数字的方式按照颜色, 如上就是: 版本号 上一个块的哈希 数据哈希 时间 难度 Nounce 这个 80 位数字的两次 SHA256 哈希就是这一个块的 id,18 个零开头, 满足要求: 00000000000000000043752089261f2b6699cd988d9f5b1732a5a259b50984cf
来源: http://www.tuicool.com/articles/FBVjEbb