| 《区块链:技术驱动金融》笔记04 区块链-林没事
作者:阿尔文德·纳拉亚南/约什·贝努/爱德华·费尔顿/安德鲁·米勒/史蒂文·戈德费德出版社:中信出版社,中信出版集团原作名:Bitcoin and Cryptocurrency Technologies译者:林华/王勇等出版年:2016-8-25页数:432
【比特币的交易】
比特币交易的过程其实就是不停地创造区块的过程。一个比特币交易分成三部分:元数据、一系列的输入和一系列的输出。
●元数据。存放一些内部处理的信息:包含这笔交易的规模、输入的数量、输出的数量, 还有此笔交易的哈希值,也就是这个交易独一无二的ID。我们可以用哈希指针指向这个 ID。最后还有一个“锁定时间”(lock_time)。
● 输入君九龄。所有输入排成一个序列,每个输入的格式都是一样的。输入需要明确说明之前一笔交易的某个输出, 因此它包括之前那笔交易的哈希值,使其成为指向那个特定交易
的哈希指针。这个输入部分同时包括之前交易输出的索引和一个签名:我们必须有签名来 证明我们有资格去支配这笔比特币。
● 输出。所有输出也排成一个序列。每个输出的内容分成两部分。所有输出的金额之和必须小于或等于输入的金额之和。当输出的总金额小于输入总金额时,输出的总金额与输入 的总金额的差额部分,就作为交易费支付给为这笔交易记账的矿工。
【比特币的脚本】
比特币脚本语言是为比特币开发的。比特币的脚本语言设计原则就是简明扼要,并内生地支持加密操作。比如,脚本里面有目的性的指令用来计算哈希值和检验签名。比特币脚本语言是堆栈式的,意味着每个指令只被执行一次,是线性的,无法循环执行。所以指令的 数目给了我们一个执行时间与内存使用的上限。比特币脚本语言不是图灵完备的,意味着 不能随意运行强大函数功能。但这是有意设计的,因为矿工需要去执行这些网络上任意交易提交者所递交的脚本,设计者并不希望让他们提交可能无限循环的脚本。
比特币脚本语言十分简单,只有256个指令,每个只用一个字节。256个指令中,有15个目前不可用,有75个被保留还没有具体定义(以后或许可以被用来扩展),剩下的才是可用 的。
在堆栈语言里执行一个脚本,我们只需要一个堆栈来垒积数据,不需要分配任何内存与变量。因此,堆栈语言中计算相当容易。总共有两类指令:数据指令和工作码指令。数据指令的作用是把数据推到堆栈的最上面;工作码指令则通常是用堆栈顶部的数据作为输入 值,用来计算一个函数。
【比特币脚本的应用】
智能合约(smart contracts),是那些不同于需要通过法律或者仲裁机构来保护执行的普通合约,智能合约是比特币系统里可以用技术手段来强制执行的合约,我们已经看到,比特币有非常好的特性让我们可以用脚本、矿工和交易验证——而不是通过中心化权威机构——来实现第三方托管协议或是小额支付。叶云凤
【比特币的区块】
区块链(块链)非常聪明地把两个基于哈希值的数据结构结合起来:第一个数据结构是区 块的哈希链,每一个区块都有一个区块头部,里面有一个哈希指针指向上一个区 块。第二个数据结构是一个树状数据结构,也就是以树状结构把区块内所有交易的哈希值进行排列 存储。 也叫梅克尔树,它以一种非常高效的形式把所有交易组织起来。
为了证明某个交易在某个区块内,可以通过树内路径来进行搜索,而树的长度就是区块内 所包含的交易数目的对数。区块头部的哈希函数必须以一大堆零开头才有效,此外,区块头部还要包含一个矿工可以修改的“临时随机数”、一个时间戳和一个点数(点数用来表示 找到这个区块的难度)。区块头部是挖矿过程中唯一哈希值化的,所以要验证一个区块的 链,只要检查区块头部即可。在区块头部唯一的交易数据是交易树的树根——“ mrkl_root”。
每个区块的梅克尔树上都有一个有意思的交易,叫作币基交易。
这个交易创造新的比特币,它看上去像是一个普通的交易,但有几点不同:
1. 它永远只有一个单一的输入与单一的输出。
2. 这个交易并不消费之前交易输出的比特币,因此,没有指针指向“上一交易”。
3. 这个输出值目前大约是 25个币多一点点(此书写于2016年,目前区块奖励是12.5个)。这个输出值就是矿工的挖矿收入。它由两部分组成:一部分是奖励的25个比特币(奖励在每生产210000个区块——大概4年——后减半),另一部分是所有交易的交易手续费。
4. 还有一个特别的地方就是“币基”参数,矿工可以放任何值进去。
【比特币网络】
比特币网络是一个点对点的网络,沿用了很多已有的点对点网络的理念好猫香烟。在比特币网络里,所有的节点都是平等的。没有等级,也没有特殊的节点,或所谓的主节点。它运行在TCP网络上,有一个随意的拓扑结构,每个节点和其他的随机节点相连。新的节点也可以 随时加入。
比特币网络大小很难测量,因为它随时都在变化,而且没有一个中央权威机构。有些人通过研究给了一些估计:往高说,每个月可能有100万个IP地址成为比特币网络的节点(也可能是临时成为节点)。往低说,大约只有5000~10000节点永远在线并处理交易。这个数字 有点出乎意料得小,但是截至本书完成时,并没有证据表明永远在线的节点数量在升高或降低。
【限制与优化】
在比特币2009年刚问世的时候,它的协议有许多内在的硬性限制,那是因为在那时没有人 会想到它会发展成一个重要的国际货币。比如每个区块的平均时间、块的大小、每个区块 的签名数目、切分性、比特币总量、区块奖励结构等。比特币的总体数量与记账奖励很可能永远都不会改变,因为那样经济影响太大。矿工与投资人都在比特币现有的框架内投入 巨资,如果这个框架改变了,会对他们产生巨大冲击。所以,社区基本达成共识,不管这些特性好或不好,都不应该改变。
比特币系统的交易处理能力。这个硬伤来自对区块大小的硬性规定,每个区块大小限定在1MB,每个交易大约是250字节,所以每块最多容纳4000个交易。平均每隔10分钟,有一个矿工获得记账权利,所以每秒钟只能处理7个交易,这就是比特币网络的交易处理能力!
我们可以做一下比较:维萨(Visa)平均每秒处理2000笔交易,峰值每秒处理10000笔交易。贝宝(PayPal)的交易处理能力比维萨弱,但峰值时每秒也能处理100笔交易。比特 币无法处理这种量级的交易。
另一个限制是比特币用的密码算法。现在只有几个哈希函数算法和一个签名算法可以使用。比特币使用的签名算法是ESDSA——一种secp256k1的椭圆曲线数字签名算法,大家 担心在比特币的一生(大家都希望是很长的一生)中,这个算法可能会被攻破。哈希函数 也有同样的问题,比特币使用的SHA-1也有弱点无敌福禄寿,近10年来,对SHA-1的分析也逐步取得 了一些进展(尽管并不致命)。为了改变这些问题,我们不得不加强比特币的脚本语言来支持新的密码算法。
【热储存与冷储存】
把比特币放在你的个人电脑里就像把钱放在钱包里带着,这叫“热储存”。这很方便但很不 安全。而另一方面,“冷储存”是离线的,把比特币锁在其他地方金牌女王。冷储存不联入互联网, 是封存起来的。所以相对安全和保险,但是很显然不方便。这就像你带着一些零钱出去,但是把终生积蓄锁在保险箱里的道理一样。
【比特币挖矿】
要成为比特币矿工,你必须加入比特币网络并与其他节点相联。建立链接之后,还有六个 任务要完成:
1. 监听交易广播。监听网络上的交易广播,然后验证它们的签名是正当有效的,交易输出 没有被重复支付。
2. 维护区块链网络和监听新的区块。必须先维护区块链。为了做到这一点,一开始你可以要求其他节点把区块链上的历史记录(在你加入区块链网络之前的)同步过来。然后,监听那些被广播到网络上的新的区块。你的任务是验证你收到的每个区块,这里的验证是指保证区块里的每笔交易都是有效的,而且这个区块包含了一个有效的随机数。
3. 组装一个备选区块。一旦拥有最新的全部区块链数据备份,你就可以开始制造你自己的 区块了。要做到这一点,你要把所监听到的交易进行组合并放进一个新的区块,然后把该 新区块排在整条链中最新的区块的后面。你必须保证你建立的新区块里的每笔交易都是正当有效的。
4. 找到一个让你的区块有效的随机数。这一步的工作量最大,也是矿工工作中最难的一个环节。
5. 希望你的区块被全网接受。即使你找到了一个区块,也不能保证该区块会成为共识链(concensus chain)的一部分 。这需要有点运气,希望其他的矿工接受你的区块,然后从 该区块开始继续接龙下去,而不是从你的竞争对手发现的区块开始。
6. 利润。如果所有其他矿工接受了你的区块,那你就能获取利润。
可以把矿工的任务分成两类:第一类任务是验证交易和区块,这是比特币网络赖以生存和 运转的基础。这些任务也是比特币协议需要矿工的首要原因。第二类任务是和其他矿工竞争,争取可以找到区块并因此获益。这些任务并不是比特币网络存在所必需的,而是为了鼓励矿工去完成第一类任务而设置的。当然,这两类任务都是使比特币成为一个数字货币 的必要条件,因为矿工必须获得奖励才会去完成这些重要的任务。
区块链主要有两层基于哈希函数的结构。第一层是在区块链上,每个区块的头部都有一个指针指向其前一个区块,第二层是在每一个区块里,包括所有交易的梅克尔树。
作为矿工,首先需要从你的交易池中选出一系列有效的交易并且编译成梅克尔树。当然,只要不超过每个区块随机数的交易上限,你可以选择编译的交易数量。然后,组装出一个 新的区块,让它的头部指向区块链上的前一个区块。新区块的头部,有一个32位的随机数 区域。你需要尝试不同的临时随机数,直到该随机数能使整个区块的哈希值小于目标值。这个目标值一般体现为以零开始的特定位数的数值。
每挖出2016个区块,挖矿难度会改变一次,这个周期大约是两个星期。难度的改变是根据上2016个区块的挖矿效率来决定的。用下列公式来表达:
2016×10分钟就是两周,也就是说,如果产生一个区块需要10分钟,那么产生2016个区块 就需要两周时间。所以这个公式的意义就是,测量全网难度进而维持平均每10分钟产生一个新的区块的速度。挖矿难度改变的周期是两周,并没有什么特别的意义,只不过是一个权衡之下的结果。如果这个周期太短,难度会随着每一个周期找到的区块的数目的不同而波动(概率问题)。如果太长,整个网络的哈希算力会与难度大大地失去平衡(难度的调整滞后于计算能力的变化)。
矿工计算难度的核心在于,对SHA-256哈希函数的运算。SHA-256是一个通用的密码学哈 希函数,它是在2001年被标准化的密码学哈希函数大家族里的一员。SHA是安全哈希算法(Secure Hash Algorithm)的简称。SHA-256是一个不错的选择,因为它是比特币被发明 时可用的密码学哈希函数中保密性最强的黑蛇呻吟。虽然它的安全性有可能随着时间推移而慢慢降低,但至少现在它还是很安全的。SHA-256是一个256位的状态机,这256个状态被分割成 8个32位的字段,这样它可以最优化地运行在32位的硬件上。
比特币挖矿这个名词起得很有意思,如果回顾比特币挖矿的发展历程,我们不难发现其与 历史上的挖金矿有着有趣的相似之处。它们都开始于类似的淘金者热潮,很多年轻人和业余爱好者积极地参与其中。比特币与黄金都从个人操作为主逐步演变为大公司专业运作。另外一个相似点就是,大多数的利润都被设备制造商拿走了,不管是黄金采掘设备还是比特币ASIC矿机生产商,而埋单的都是那些希望一夜致富的人。
【能源消耗和生态环保】
比特币挖矿是如何消耗能源的?这个消耗过程分三个部分,其中有些可能还不是很明显:
1. 内涵能源。首先,比特币挖掘设备需要被生产出来,生产时所用的原材料就需要被物理开采出来,然后要把这些材料通过一系列的生产流程转化为比特币挖矿专用的ASIC,这两个过程都需要消耗能源,这被称为内涵能源。
2. 电能。当矿机启动开始挖矿时,它就会消耗电能。
3. 冷却。比特币矿机需要被冷却,这是为了防止矿机出故障。
根据我们的估算,整个比特币网络大概消耗了一个大型电厂总发电量的10%。虽然这个数字已经相当惊人,但是和地球上其他的用电“大户”比起来,这个还算是小的。
比特币这种“浪费”能源的形式经常被人诟病,因为SHA-256的运算没有其他任何用处。但是我们必须认识到,任何一种支付系统都需要能源和电力的消耗。就拿传统的货币来说,纸币印刷、ATM机器的运行、硬币分类机器、点钞机、支付服务系统以及运送现钞和金条的武装押运车,无一不在消耗各种能源。你也可以一样说这些能源的消耗除了维护整个货币体系之外,也没有任何其他用处。所以,如果我们认可比特币作为一个有用的货币体系,那么支持比特币体系的能耗就不能认为是浪费。当然,如果我们可以用更加节省能源 的解谜算法来代替现在的比特币挖矿,同时确保货币的安全性,那自然更好。
【矿池】
矿池就是一个比特币矿工互相之间的保险。一组矿工可以形成一个矿池共同进行挖矿,并 指定一个币基接受人。这个接受人就是矿池管理员。所以不管是谁最终发现了一个有效区块,矿池管理员将会收到这个区块的奖励,继而根据每个参与者所贡献的工作量按比例分配给所有矿池的参与者。
矿池有可能会掩盖这样一个事实:实际上的算力集中在几个大的挖矿机构手上,这些大的机构可以同时参与多个不同的矿池以掩盖它们的真实规模。这种做法被称为“洗算力”(laundering hashes迟子建散文,类似于洗钱)。因为矿池的原因,发现洗算力变得非常困难,这也使得外人无法知晓矿机的实际物理控制有多么集中。
矿池的好处在于矿工挖矿变得更加容易预测,也让小矿工更加容易参与初一扛把子。矿池另外的一个 好处在于,每一个矿池都有一个中心化的矿池管理员在网络中组装区块,所以网络更新变得更加容易。当然矿池的一大问题是中心化管理。矿池管理员实际掌握了多大的算力是一 个问题。另一个坏处是减少了比特币网络上校验全部交易节点的数量(全节点)。
关注微信公众号,获取更多区块链知识