前言 区块链技术驱动金融 18.5.21
- 本书是学习区块链技术金融书籍读书笔记
原版前言部分
前言部分:通往比特币的漫长道路
在通往比特币路上,一个个加密支付系统更新迭代,其中贝宝(PayPal)幸存,由于其及时纠正了最初想在移动设备上进行加密支付这一想法。
-
传统金融体系
政府和货币出现之前,物物交易。难点在于协调。之后出现:信用、现金体系。
信用体系:类似于人情之类的。
现金体系:购买,闭环交易。
-
网络信用卡弊端
贝宝交易:中介式结构风格。即买卖家之间存在一个中介公司。
优点:不需给卖家提供信用卡信息、个人信息,规避了安全风险、避免泄露个人隐私。
缺点:买卖家无法直接交流,增加复杂性。
中介支付最早在1994年,第一家虚拟公司成立。但是由于其沟通只能通过电子邮件,用户有90天拒付期,3个月之后卖家才能收到货款。
20世纪90年代,出现了安全电子交易协议(SET)。在SET体系中,用户在网络购物时,用户浏览器会将交易和信用卡加密存储在电脑上的应用程序里,只有中介能解密这些信息。支付时只有中介解密买家信息与商家交易信息进行对比,只有一致情况下才批准支付。
SET体系行之有效原因:它的认证机制。认证就是把加密过的身份,即公钥与现实身份连接起来。网络现金公司和SET体系认为:安全性比操作的便捷性更重要。
但是其认证机制类似报税一样繁琐,故很多用户拒绝使用要求终端客户端认证的系统。比特币巧妙的避开了这一难题,无须用户真实身份,通过公钥本身来辨别用户身份。
-
从信用到(加密)现金
对比信用,现金体系需要启动自循环,规避了卖家拒不偿还债务风险。
另外两个优势是:第一更好的确保了用户的匿名性。第二是支持线下交易。
但比特币没有以上两个特点,但具备两个类似的功能:
一是匿名性比不上现金。涉及到比特币匿名性问题。
二是并不完全支持线下交易,优点是不需要中央处理器,依赖点对点网络。
1983年,David Chaum 提出把加密技术运用于现金上想法。我可通过数字签名发送电子纸条,但涉及到双重支付难题。Chaum提出解决方案是:我给你一张纸条,你记录下它序列号(不让我看见),然后我签名,不需要知道它的序列号。这也就是密码学里面的盲签。
与其预防双重支付,不如检测双重支付。因此,Chaum与两位密码学专家提出了一种复杂的加密机制:发行方在电子货币中以加密方式嵌入你的个人信息,除了你本人,包括银行在内的任何人都无法解密。用电子货币消费时:接收方随机跳远一部分密码要求你解密,并且将之记录下来,但这一部分解密内容不足以暴露你的身份。
但是这一机制需要完善,比如之后相关出现的梅克尔树和零知识验证。
Chaum的数字现金技术获得了几项专利,特别时它使用的盲签技术。其中几位经常在”网络朋克“的邮件组里互动的密码专家另辟蹊径。著名的中本聪第一次向全世界宣战比特币系统就在一个邮件组里,前身就是网络朋克。
数字现金技术失败的原因。主要在于它没能说服银行和商家使用它。因此,最终败给了信用卡公司。
-
凭空发行货币
要想创造出一种自由浮动并且具有真实价值的虚拟货币,必须要设计出某种稀缺性的东西。虚拟世界,虚拟货币只有在需要花一段时间解决了一定的数学计算或谜题之后方可生成,这样就保证了稀缺性。
比特币的挖矿就是这样的。
-
把一切信息都记录在数据库账本中
区块链是比特币的另一项关机按技术,它像一个数据库账本,安全记录所有的比特币交易信息。
区块链理论基础由来已久,可追溯到哈勃(Haber)和斯托尔内塔(Stornetta)在1991年发表的一系列论文。提出的是一种可以安全地对数据文件进行时间戳记录的方法。时间戳是为了记录文件创建的大概时间,并且可以准确反映文件创建的先后顺序:如果一份文件比另外一份更早创建,可以从时间戳看出来。时间戳的安全性体现在:文件的时间戳一旦生成,无法更改。
关于他们提出的协议:
①用户发送文件时,其设计的体系能够像用户提供时间戳服务。
②服务器收到文件时,会用当时时间和指向之前文件的链接或指针作为签名,来签名改文件并产生包含签名信息的认证。指针这里指的是一串数据,如果该数据更改,指针自动失效。
注:要想对一份文件进行认证,时间戳服务器必须包括指向之气那文件认证的哈希指针,当前时间和文件内容本身,并用这三条信息来对文件进行签名。
✔该协议实现的效果:每份文件的认证都确保了上一份文件内容的完整性。事实上,反复运用,每次认证基本上都保证了这个认证点之前的所有文件和认证的完整性。
随后发表的论文提出了一个提升效率方案:不必单独链接各个文件,直接把它们集合成块,在一条链中链接整个块。每个块里,文件通过树状结构而非线性结构的方式相互链接。
优点:减少了在整个系统中查找特别文件所需的工作量。这一数据结构形成了比特币区块链的框架。详情参见第三章。
比特币将其进行改进,用一种类似于哈希现金的协议来降低在区块链里增添块的速度。
①第一点:比特币体系通过一群未被认证过的节点,即矿工来记录时间,通过每个矿工来记录块的信息。任何人都可通过解决数学计算,新建块,成为一名矿工。
②第二点:比特币舍弃了签名,只依靠哈希指针来确保数据结构的完整性。
③第三点:真正的时间戳对比特币不是很重要,整个系统的意义在于根据先后顺序记录交易信息,并确保它不能被篡改。事实上,比特币不按固定时间表产生。
比特币从根本上融合了用数学计算来控制新币的产生和用安全的时间戳来记录交易信息并防止双重支付这两种思路。
比特币之前,有B币和比特黄金。其区别是:
①后者可以通过数学计算直接创造货币。任何人都可以解题,答案本身就是货币。而比特币体系中解决数学计算并不构成货币,只是确保区块链安全,间接地在有限时间里创造新货币。
②后者靠时间戳给货币的创造和转账签名,而比特币不需要被认证过的时间戳,只是用时间戳来保存区块和交易的先后顺序。
③后者在服务器和节点对数据库账本的记录不符时,没有提供一个明确的解决方案。
④后者都不是正式发布的体系。B币是一篇发表在邮件组的文件中提出的,比特黄金是在几篇博文中提出的。不像比特币白皮书,没有给出详细设定或成都源代码。
-
关于中本聪的猜测
中本聪:比特币创造者化名。
第一章 密码学及加密货币概述
法定货币,类似央行的机构控制货币供给+实体货币上加防伪标识。但是仍然可以伪造。
加密数字货币需采取安全措施以及防止混淆。
二者不同在于:后者安全规则需要完全通过技术手段,前者则是依赖于中央机构。
本章主要介绍密码学中的哈希算法(Hash)和数字签名(digital signature)技术。两者对构建一个加密数字货币系统非常关键。后面章节介绍:零知识验证。
1.1 密码学哈希函数
哈希函数
哈希函数是一个数学函数,有以下三个特性:
①输入可为任意大小的字符串
②产生固定大小的输出。本章假设输出大小为256位。
③能进行有效计算即对于特定的输入字符串,在合理时间内,可以计算出哈希函数的输出。对应n位的字符串,其哈希值计算的复杂度为O(n)。
哈希表
基于哈希函数,创建的数据结构。
由于专注加密的哈希函数,要使哈希函数达到密码安全,需满足:
①碰撞阻力 collision-resistance
②隐秘性 hiding
③谜题友好 puzzle-friendliness
特性1 碰撞阻力
碰撞☞:对于两个不同的输入,产生相同的输出。
对于哈希函数H(·),没人能找到碰撞(不表示不存在碰撞),则称该函数具有碰撞阻力。x,y是两个不同输入,但有H(x) = H(y),说明这个函数是哈希碰撞的
注:通过计数论证可证明碰撞的确存在。哈希函数输入空间无限(包含所有长度的任意字符串),输出空间有限(只包含特定固定长度的字符串),因此一定会有输入字符串映射到相同的输出字符串。实际上根据歌巢原理可知必然会有大量可能的输入被映射到任意特定输出。对于加密的哈希函数,有些方法是能保证找到碰撞的。输出256位大小的哈希函数,选择2^256 + 1个不同数值,因为输入大于输出,必将产生碰撞。
生日悖论是仅仅通过检验可能输出数量的平方根次数,便能答题找到碰撞。
优点:这个碰撞检测算法对于每个哈希函数都有效。
缺点:计算需要花费很长很长时间。
但是:我们已经证明,世界上没有哈希函数具有防碰撞特性。我们实践中所依赖的加密的哈希函数仅仅是暂未成功找到碰撞的函数,暂且选择相信这些具有哈希阻力。比如MD5哈希函数找到了碰撞,已经逐渐被淘汰。
应用:信息摘要部分
基于前提:哈希函数H具有碰撞阻力,x,y是两个不同输入,则可以假设输出不同。
该论证可以将哈希输出作为信息摘要。
例子是:爱丽丝上传了很大的文件,如何能在之后下载确定她下载的文件和她上传的文件相同。
ⅰ整个文件本地存储,再对比。麻烦且上传无意义。
ⅱ无碰撞哈希函数解决这个问题,爱丽丝只需要记住原文件哈希值,下载文件后,计算下载文件的哈希值与之相比。相同,则是。
此处:哈希函数对于一个信息生成固定长度的摘要或生成了总结。
特性2 隐秘性
隐秘性保证:若只知哈希函数的y=H(x),没有可行的办法算出输入值x。
为实现隐秘性:x的取值需来自一个非常广泛的集合。避免被反解出。
隐秘性哈希函数H具有隐秘性。如果:当其输入r选自一个高阶最小熵的概率分布,在给定H(r||x)条件下来确定x是不可行的。(双竖线||为连接符号,代表把一系列事件、事情联系起来)
信息论中最小熵是用户测试结果可预见性的手段。高阶最小熵比较直观的描述了分布的分散程度。
应用:承诺
想做的事情称为承诺。
该处承诺是个数字化过程:选定一个数字,装进信封,放到人人可见桌上,这样则说明你对信封里数字做出了承诺,打开信封前对他人是秘密,打开之后,来展示承诺数值。
承诺协议:一个承诺协议方案由两个算法构成。
①承诺函数将信息和一个临时随机数作为输入,输出就是一个承诺。
②验证函数将某个承诺输出、临时随机数及信息作为输入。对比。
需要由两个安全特性:隐秘性和约束性。
此处书中第10页有具体介绍。
如何执行承诺方案,通过加密的哈希函数:生成一个256位的临时随机数等。详情参见书。
特性3 谜题友好
谜题友好:如果对于任意n位输出值y,假定k选自高阶最小熵分布,如果无法找到一个可行的方法,在2^n小很多时间内找到x,保证H(k||x)=y成立,那么我们称哈希函数H为谜题友好。
应用:搜索谜题
搜索谜题构成:
一个哈希函数H。
从高阶最小熵分布选出的一个取值,id(称为谜题ID)
目标集合Y。
该谜题的解决方法为一个解,x,满足以下公式:H(id||x) ∈ Y
安全哈希算法
安全哈希算法Secure Hash Algorithm 256 简称 SHA-256
SHA-256主要被比特币世界采用。
要求哈希函数可以任意长度输入,只要我们建立一个用于固定长度输入的哈希函数,通过一般方法,可以将接受固定长度的哈希函数转化为可接受任意长度输入的哈希函数。该过程称为MD变换。SHA-256是采用这种变换方法的常用哈希函数之一。
压缩函数:通用术语中,这种基础型,可用于固定长度,具备碰撞阻力的哈希函数被称为压缩函数。
经验证:如果基本压缩函数具有碰撞阻力的特性,那通过转换而生成的哈希函数也具有碰撞阻力。
MD变换
压缩函数带入长度为m的输入值,产生长度短一些为n的输出值。哈希函数的输入(可为任意大小)被分为长度为m-n的区块。
MD转换过程:将每个区块与之前区块的输出一起带入压缩函数,输出长度变为(m-n)+n=m
=压缩函数的输入长度。对于第一个区块而言,需选取一个初始向量。每次调用哈希函数,这个数字都会被再次使用,实践中可直接在标准文档中找到它。最后一个区块的输出就是返回的结果。
SHA-256利用压缩函数,把768位的输入压缩成一个256位的输出,每一个区块的大小是256位。
未完待续。2018.5.21 22:50
接着。2018.5.22 7:17
哈希函数建模
事实证明,要确定一系列哈希函数特性以全面达成可证安全极度困难,本书中主要是选出在比特币和其他加密数字货币中,对哈希函数使用方式很重要的三个特性。即使在这个范围内,并不是所有这些特性对哈希函数的每一次使用都有必要。比如:谜题友好旨在比特币采矿中具有重要性
1.2 哈希指针及数据结构
哈希指针hash pointer:一种数据结构。即一个指向数据存储位置及其位置数据的哈希值的指针。
哈希与普通指针相比:普通指针只能告诉数据存储的位置,哈希指针可以告诉数据存储的位置+给你一种方式来验证数据没有被篡改过。
1.2.1 区块链
区块链block chain:通过哈希指针构建一个链表的数据结构。
普通链表:有一系列区块,每个a区块既有数据也有一个指向上一个区块的指针。
区块链中,上一个区块指针被置换为哈希指针(因此每个区块能告诉上一个区块的的值在哪里+该值的摘要=验证那个值没有改变)
应用:防篡改日志
建立一个存储很多数据的日志数据结构,能将数据附加到日志末尾。如果想要篡改日志前面的数据,可以被检测到。
分析如下:
如果对手要篡改区块链中间的数据,目的是让只记得区块链头部哈希指针的人无法检测到篡改行为。
①对手会改变某区块k的数据,因此区块k+1的哈希值(即整个区块k的哈希值)将不会匹配。(因为哈希函数具有碰撞阻力,故可确定新的哈希值与改变后的内容不会匹配)
结果:可检测到区块k中的新数据及区块k+1的哈希指针的不一致性。
②对手继续试图通过篡改下一个区块的哈希值掩盖这次篡改。
结果:到达链表的头部时,这个策略失败。(即只要将链表头部的哈希指针存储到对手无法改动的地方,对手篡改任何区块,都会被检测到)
总之,对手想篡改区块链中任意地方的数据,为保证内容一致,必须篡改所有的哈希指针直至最开始的地方。但是,最终也因为不能篡改链表头部的指针而失败。仅通过记住一个哈希指针,就基本记住了整个链表的防篡改哈希值。因此可搭建一个包含很多区块的区块链网络。
创世区块:链表头部的哈希指针
1.2.3 梅克尔树
梅克尔树 Merkle trees:使用哈希指针的二叉树。
数据结构:
①所有的数据区块被两两分组,指向这些数据区块的指针被存储在上一层的父节点中。
②这些父节点再次被两两分组,指向父节点的指针被存储在上一层的父节点中。
③持续反复。
④最后达到树的根节点。
通过记住树最前面的哈希指针,如同区块链一样,仅仅通过记住顶部的哈希指针,任何企图篡改任何数据的行为都会被检测到。
应用:隶属证明
梅克尔树的另一个特点:可以实现简洁的隶属证明。(这点与区块链不同)
原理:为了证明某个数据区块来自一个梅克尔树,只需找到该数据区块到根节点的路径。
详情参见书18页。
非隶属证明:
有了排序梅克尔树,可在一个对数复杂度的条件下验证某一个数据区块并非来自梅克尔树。
证明某个特定区块不属于梅克尔树,通过展示被验证区块之前+之后的区块路径即可。
①如果之前之后两个区块在树上连续,则被验证区块与该梅克尔树之间为非隶属关系
②在两个条目之间,隶属于梅克尔树。
总结:可在任何以指针为基础的数据结构中使用哈希指针,只要数据结构不存在循环。(如果存在循环,将不能使所有哈希值得到匹配,因为没有一个根节点让我们追溯)
1.3 数字签名
数字签名 digital dignatures 被认为是对纸上手写签名的数字模拟。需要有两个特性要求:
①可自己制作自己签名,但任何看到它的人都可验证其有效性
②希望签名只与某一特定文件发生联系,因此该签名不能用于表明你同意或支持另一份不同的文件。
(对于手写签名,这条就是确保别人不能将你的签名从一份文件上扯下来粘贴到另一份文件末尾)
数字签名方案:其中generateKeys和sign可采用随机算法。
⑴ (sk,pk) := generateKeys(keysize)
generateKeys方法把keysize作为输入:产生一对公钥和私钥。
私钥sk:被安全保存,用来签名一段消息。
公钥pk:任何人都可找到,拿着它可以用来验证你的签名。
⑵ sig := sign(sk,message)
签名过程就是把一段消息和私钥作为一个输入
对于消息输出是签名。
⑶ isValid := verify(pk,message,sig)
验证过程通过把一段消息+签名消息与公钥作为输入
返回结果为真:证明签名属实。
返回结果为假:证明签名消息为假。
我们要求两个性质有效:即有效签名可以通过验证和签名不可伪造。① 有效签名可以通过验证:verify(pk,message,sign(sk,message))==true
② 签名不可伪造
验证第一条性质:我用我的密钥sk签署一条消息后,有人使用我的公钥pk验证关于同一条消息的签名,该签名必须证实为正确。
验证第二条性质:不可为造性 要求计算上不可能伪造签名。不可伪造性游戏:对手和挑战者一起玩。如果对手可在一个没有见过的消息上进行签名,对手赢。反之,挑战者赢。证明这个数字签名方案不可伪造。
实践中的考量
算法概念转化为现实中可执行的数字签名机制,考虑问题很多。
ⅰ很多签名算法是随机的,则需要随机性的良好来源
ⅱ 信息大小 。
解决方法是:对信息的哈希值进行签署,使用输出值为256位的加密的哈希函数,将信息的哈希值作为信息摘要,哈希函数具有碰撞阻力,因此这种方式是安全的。后面还有一种方法是可以对哈希指针进行签署。
1.3.1 椭圆曲线数字签名算法
椭圆曲线数字签名算法 ECDSA:比特币使用的数字签名方案。(ECDSA是美国政府的标准,是DSA电子签名算法利用了椭圆曲线的升级版)
注:比特币使用ECDSA算法,而非标准椭圆曲线"secp 256k1"。
相关参数介绍:
个人密钥:256位。
公钥(未压缩):512位。
公钥(压缩):257位。
待签名信息:256位。
签名:512位。
注:虽然ECDSA只能签署256位的信息,但实际上信息在签署之前总是已经经过哈希压缩。因此,任何大小的信息都能被有效签署。
使用ECDSA,确保随机性良好来源至关重要。不良来源可能会导致密钥信息的泄露。但ECDSA很古怪,即你若仅在生成签名时使用了不良随机,而你使用的密钥完美无缺,你的个人密钥还是由可能泄露。(这是DSA的古怪之处,并不针对椭圆曲线)。
如果个人密钥泄露,对手就可伪造你的签名。
加密货币即加密技术
比特币没有使用任何加密术,因为没有加密的需要。很多技术(比如承诺方案)在某种程度上隐藏信息,但是这与加密术不同。
1.4 公钥即身份
从数字签名模式中拿出一个公共验证密钥,并将其一个人或一个系统参与者的身份对等。如果一条消息的签名被公钥pk正确验证,则可认为pk就是在表达这条信息。从这个角度,公钥就是身份,让某人能为pk身份发声,必须知道相应的密钥sk。
结果:可随时制定新的身份。
实践中,你可能会使用pk的哈希作为你的身份(因为公钥很大)。验证时候需要两点:(1)你的身份确实是pk的哈希(2)信息能经过公钥pk验证。
去中心化身份管理
公钥和私钥的体系,帮助我们引入去中心化的身份管理的概念。想要新的身份,可随机生成一个,想要多少就生成多少。事实上,这就是比特币对待身份的方式。这些身份在比特币语言中被称为地址,地址其实就是公钥的哈希值。
注:比特币系统中,你不需要明确地注册或揭露你的真实姓名,但是你的行为模式本身可能是可识别的。
1.5 两种简单的加密货币
密码术到加密货币。
1.5.1 高飞币
高飞币 GoofyCoin:想到的最简单的加密货币。仅有两个规则即:制定高飞可以随时创建新币 和 这个新创建的币都属于他。
详情参加书27页。
总结:高飞币规则是
①高飞可以通过签署声明来表示他使用唯一的货币编号来创建一个新币
②币的所有人可以通过签署声明表示”将这个币转给X“(其中X为公钥),将其转给另一个。
③任何人都可验证一只币的有效性,跟随哈希指针追溯到它是由高飞创建,并验证过程中所有签名。
隐患是:双重支付。事实上双重支付是任何加密货币需要解决的主要问题之一,但高飞币并没有解决这个问题,因此不安全,不适合作为加密货币。
1.5.2 财奴币
解决双重支付问题,涉及到财奴币ScroogeCoin。
财奴币是以高飞币为基础创建的,但在数据结构方面更复杂。
第一个概念:
一个叫财奴的指定实体将负责公布包含所有发生过的交易历史记录的仅增账目(保证了写入这个账目的任何数据都会永久保留下来)。
若项目真的仅增,则通过要求所有的交易在被接受前都写入项目,便可预防双重支付。
如何执行这个仅增功能?财奴创建一个区块链(形成一系列数据块,每个数据块中都包含一次交易,实践中优化的做法就是把多次交易放在同一个区块中,比如比特币,每个区块包含交易的ID和内容+上一个区块的哈希指针),进行数字签名(针对最后一个哈希指针),最后将签名和区块链一起发布。
哪种交易作数?只有在财奴签名的区块链的交易财算数。
为什么财奴签署每个区块还需一个带哈希指针的区块链?保证仅增特性。财奴可能会试图增加或移除交易记录。
财奴币中有两种交易。
第一种:造币CreateCoins
基于高飞创造新币的程序,将其扩展即可在一次交易中创建多个币量。(造币交易创造了多个不同个数量和归属于不同拥有者的新货币,称为虚拟货币ID即指该次交易中交易ID和货币序号的组合)详情参见书30页。
第二种:付币PayCoins
消耗币,创建具有相同总值的新币,新币可能属于不同的人(公钥),交易必须由一个支付该币的人来进行签署。满足以下四个条件,付币交易有效:
⑴被消耗的币为有效货币,即在之前交易中创建的
⑵被消耗的币在之前交易没被消耗掉,即不是双重支出
⑶本次交易产生的币值=消耗的币值量,即只有财奴才可以创建新币。
⑷本次交易被消耗的所有币均有其所有者的有效签署。
注意:直至发布之前,即使满足前三条件,仍然可能是一个被双重支付抢占的交易。
财奴币核心问题
工作原理是:人们可以看见哪些币是有效的。防止双重支付。
问题是:中心化。
写于2018.5.22 12:53
第二章 比特币如何做到去中心化
本章目的是让你对去中心化由一个通盘的认识,以及对比特币运作机制有所了解,最终知道为什么比特币确实是安全的。
2.1 中心化与去中心化
互联网就是一个著名的去中心化系统。早期是在AOL记忆ComputerServe(美国最大的在线信息服务机构之一)等围墙花园式信息服务体系的竞争中,逐渐变得越来越风行。
电子邮件实质也是一种简单邮件传输协议STMP的去中心化系统。
中心化与去中心化并非水火不容,没有一个系统是完全中心化或者完全去中心化的。虽然比特币系统是去中心化的,但比特币交易所(一个可将比特币转换为其他货币的平台)、钱包软件以及用户管理比特币的软件,可以是去中心化的或去中心化的。
比特币如何做到去中心化?
问题1:谁在维护交易账本?
问题2:谁有权利批准哪个交易是正当有效的?
问题3:谁在制造新的比特币?
问题4:谁在制定系统变化规则?
问题5:比特币是如何取得交易价值的?
2.2 分布式共识
共识:consensus
分布式共识:distributed consensus
比特币是个点对点的系统。
分布式共识协议:在一个有n个节点的系统中,每一个节点都有一个输入值,其中一些节点具有故障,甚至是恶意的。一个分布式共识协议有以下两个属性:
①输入值的中止须经所有诚实节点来确定
②这个输入值必须由城市节点来生成
例子:当Alice向Bob付款的时候,Alice需要向整个比特币点对点网络进行广播。
注:Bob在Alice广播时不一定在以上网络中,但是Bob是否运行节点并不影响他收到爱丽丝转给他的比特币。
比特币网络里,节点要达成怎样的共识呢?
⑴比特币体系中,在任何时点,所有在点对点网络上的节点都有包含一系列区块的总帐本,每个区块中都包含了已经被所有节点达成共识的交易清单。
⑵但是,每个节点还有一堆没有被打包进入区块的交易(网络节点已经被通知、交易已经发生,但是还没有被写进区块的交易)。网络节点对于这些交易还没达成共识,故每个节点都有一个略有差异、尚待确认的交易池。实际中,点对点网络不完美,所以有些节点听到了交易,有些则没有听到。
所有的节点如何对一个区块达成共识呢?
详情参加书41页。
达成共识几个技术上的问题:
⑴达成共识一般是个难题,有些节点会死机或者根本就是恶意节点。
⑵就比特币而言,点对点网络不完美,并非所有对应的节点是两两相连的,互联网链接的不良可能会造成网络问题,要执行一个所有节点都参与的共识协议似乎并不现实。
⑶由于交易信息是分布在整个互联网上的,信息传递会有严重延迟。
延迟与全球时间
比特币协议达成共识时必须直面两大障碍:
①是不完美网络,比如信息延迟和节点死机
②是某些故意搞破坏的节点。
严重网络延迟的一个后果是:节点之间没有一个统一的全球时间的概念。并非所有的节点都能根据每个交易的时间戳来达成交易时间共识。
2.2.1 不可能性结论
在全球时间上的不统一,给共识协议算法带来了很多限制。
典型案例就是拜占庭将军问题(Byzantine Generals Problem):
拜占庭是东罗马帝国的首都,它的军队分成多个师,每个师都由一个将军统领。这些将军通过信使进行交流,来达成一个共同作战方案。有些将军可能是叛徒,想故意破坏这个过程,会造成忠诚的将军也无法达成一个统一的作战计划。
如何解决这个问题呢?
实际上,就是让忠诚的将军在可能有叛徒误导的情况下依然能达成统一作战方案。然而事实证明,叛徒数量超过1/3,这个难题将无法克服。
Fisher-Lynch-Paterson不可能结果指出:在一定的条件下(包括节点行为具有确定性特征),甚至在只有一个缺陷的过程中,达成共识都是不可能的。(这个关于不可能性的一个结论)
Paxos算法协议:①Paxos算法能做到不产生不一致的结果②但是它妥协是,在一定条件下(虽然不常见),该协议会死机卡住,从而无法继续运行。(这个是某些文献提到的一个共识协议)
2.2.2 打破传统上的假设
不可能性结论都是在一些特定模式下才成立,结论是针对分布式数据库的研究。但对于比特币,其本身打破了很多原来分布式数据库所做的假设。目前对共识的研究,比特币实际比理论情况要好很多。
比特币打破了哪些经典模型得哪些假设呢?
⑴比特币引入了奖励概念。奖励对于分布式共识协议是个全新概念,因此可以说比特币只是在特定货币系统下解决了分布式共识问题。
⑵比特币体系包含随机性这个概念。比特币的共识算法极大程度的依赖于随机性。比特币不纠结于规定共识里的起点终点,而且共识是通过一段较长的时间而达成的。
2.3 使用区块链达成没有身份的共识
与传统分布式共识算法不同,比特币中的每个节点并没有一个稳定的、长期的身份。
身份缺失的原因:
①点对点网络,没有乱造节点即女巫攻击 sybil attack现象
②化名制 pseudonymity。(比特币仍旧不能保证真正的匿名,比特币特性也没强迫必须用真是身份来加入)
基于安全上的便利,有真实身份会让设计变得容易。然而,并没有。但可以用一个理论假设来弥补。
2.3.1 隐性共识
对随意节点选择的假设可以让隐性共识inplicit consensus成为可能。
共识协议里有多个回合,每个回合对应着区块链里的一个块。每个回合里,一个随机节点会被选中,这个节点可以提议该链的下一个区块。
无共识算法,为避免随机选出节点是恶意的,通过隐性共识的方法选中:其他节点通过隐性地接受或拒绝前面这个被随机选择出来的节点。如果接受则继续在这个块之后接龙下去;如果拒绝则忽略这个新的区块而选择前一曾经接受的区块继续接龙下去。
节点选择哪一块来继续接龙?比特币共识算法简化版
假设可任意选择一个节点,这些节点都不会受到女巫攻击影响。
①新的交易被广播到所有节点上
②每个节点都将新的交易放入区块
③每个回合,一个随机的节点可以广播它的区块
④其他节点可以选择接受这个区块,前提是如果区块里的交易都是正当的即有真的签名
⑤节点们可把以上区块的哈希值放进自己的区块里来表示它们对那个新区块的认可。
验证这个共识算法有效
窃取比特币爱丽丝不能够窃取属于另一个用户,不受她控制的地址里的比特币。因为若数字签名机制安全,爱丽丝无法伪造比特币拥有者的签名。
拒绝服务攻击Alice不喜欢Bob,拒绝提供服务给Bob。尽管Bob的交易没有被放入Alice所提议的下一个区块,只需要等到下一个诚实节点发起区块的时候,他的交易记录就会被放进这个区块里。
双重支付攻击假设Alice是Bob网店顾客,并且已经一个由诚实节点发起包含代表Alice向Bob支付交易在内的区块。(该交易是个数据结构,包含Alice数字签名+付给Bob的公钥即地址的指令+一个哈希值)
注:该哈希值是个指针指向先前一笔交易的输出,就是比特币来源。
详情参见书48页,此处较为复杂。
双重支付攻击是否成功?取决于最后哪个区块被纳入长期的共识链。
什么决定哪个区块被纳入?诚实节点会遵守最长有效分支后延展规则,在哪个分支后面延展?没有明确答案。(两个分支长度一样,区别在于最后一个区块,然而两个区块都有效,因此选择决定了双重支付攻击是否成功)技术角度而言,两笔交易完全一致并且有效。
实践中,节点利用点对点网络中最早听到的区块这种起方式的方法依旧存在问题,比如网络延迟,最先听到的不一定是最早被创造出来的。假设包含Alice-Bob交易区块的链如果被网络完全遗忘,则成为一个孤块orphan block。
Bob角度而言,Bobby在Alice广播交易时,操作草率,在网上完成检查程序并允许Alice下载软件,这叫零验证交易 zero confirmation transaction。结果会更糟。为了保护自己免受双重支付攻击,应该多等待。
总结:一个交易得到的确认越多,被纳入长期共识链的概率越大。因为诚实节点总是选择延展最长的共识链。事实证明,双重支付攻击成功的概率随着确认的数目的增加而指数级降低。比特币生态系统中,常见的方法是等待6个确认。而防止不正当交易完全使用的是密码学的方法,被共识所加强,防止双重支付攻击完全依赖于共识,密码学不起任何作用,因为共识能决定哪个被放进长期共识链。
区别两种哈希指针
区块内用来表示接在之前哪个区块后面的哈希指针
在交易里的一个或多个用来指向之前交易里说明比特币来源的哈希指针。
2.4 奖励机制与工作量证明
以货币为单位奖励那些表现诚实的节点。
2.4.1 奖励一:区块奖励
比特币中由两种不同的奖励机制:区块奖励和交易费。
根据比特币规则,创建区块的节点可以在这个区块中加入一笔特别的交易(该交易就是一个造币的交易类似于财奴币里面的造币,节点可指定这笔交易的接收地址,通常会选择一个属于自己的地址,可以将这个看作是节点在共识链上进行创建区块服务的报酬)。
写本书时候,区块奖励金额定在25个比特币。每生成210000个区块,金额就会减半。最终数量是2100万,大约到2140年就发完了。但是这个系统仍旧可以运行,因为区块奖励只是比特币奖励机制之一。
注:奖励只有当区块链最终被纳入长期共识链才会实现。这是新比特币被允许创造出来的唯一途径。
2.4.1 奖励二:交易费
比特币的第二个奖励机制。
任何交易的制造者都可以选择让交易输出值比输入值小。第一个创建区块把交易放进区块链的人可以取得这个差额,作为交易费。
如果你是一个节点,正在创建一个包含200笔交易的区块,那么这200笔交易的交易费将会被付到你放在区块内的那个地址。
2.4.2 挖矿与工作量证明
描述共识机制时候还有一个问题没有解答。
⑴我们要你相信这样一个假设:我们能随机选取一个节点
⑵因奖励那些节点而产生的新问题:大家分一杯羹成为一个节点来获得这些奖励,那么系统就会不稳定
⑶基于第二个问题,可能会有攻击者创建大量的女巫节点来尝试颠覆整个共识过程。
解决办法:工作量证明 proof of work:把随机选取节点改为根据节点占有某种资源的比例来选取节点,希望这种资源是没有人能垄断的。比如这个资源是计算能力,称为权益证明proof of stake。
虽然比特币没有使用,但是权益证明也是另一种合格的模式,被其余加密货币所使用。
工作量证明:允许节点用其计算能力来互相竞争,计算能力的比例决定了节点被自动选中的概率。
未完待续 2018.5.22 19:53 跑步去啦,回来继续
继续更新2018.5.23 21:50
比特币是用哈希函数解谜来证明工作量的。
继续更新2018.5.24 9:11
任何一个提议并创建区块的节点想要制造下一块,该节点必须找到一个临时随机数。临时随机数需要满足:H(nonce || prev_hash||tx||tx||...||tx) < target
一个区块通常包含:
①该节点提议的一系列交易。
②一个指向前序区块的哈希指针。(该指针只是文本中的字符串,该哈希值作为在网络上请求其他节点寻找区块的ID,让获取这个区块之后验证它)。
③一个临时随机数。(为提高发现符合要求的临时随机数的难度,把包含临时随机数在内的整个区块的哈希值组合在一起,输出结果是一种特定的形式。若哈希函数符合谜题友好特性,唯一解法就是试足够多的临时随机数,直到成功)
比特币系统完全实现去中心化的方式:哈希函数解谜以及工作量证明的办法,可以完全舍弃采取那种随机选取节点的办法。这些节点竞争哈希函数解谜过程中一直相互独立,若一个节点正好发现一个临时随机数可以满足要求,即可提议创建下一个区块。
2.4.3 哈希谜题特性:难于计算
哈希谜题有三个重要特性:难于计算、可参数化成本、易于证实。
特性一:要有一定的难度。其实难度实际上是随时间而改变的。
注:不停尝试解哈希谜题的过程,即比特币挖矿,参与挖矿的节点被称为矿工。技术上每个人都可以称为矿工,但是挖矿的高成本导致了挖矿生态系统需消耗大量能量。
2.4.3 哈希谜题特性:可参数化成本
特性二:希望成本是可以通过参数来变化的,而非一个固定值。
比特币的点对点网络里:每产生2016个区块后,所有节点都会自动重新计算目标区域相对于整个输出范围的比例大小,使后续的区块产生的时间间隔约为10min.(若区块产生的间隔太小,造成很多低效率,导致失去许多优化上的好处,故间隔是个固定值,虽然理想间隔意见仍然不统一)
注:任何一个矿工,找到下一个区块的概率是其控制的计算力占整个全球计算力的比例。
总结:只要以计算能力为权重的大多数矿工,遵循比特币协议(是诚实的),则比特币中的大量攻击就都没有可能发生。
矿工行为的两种行为模式:博弈论观点认为最大的问题是矿工默认的行为是否是一种“那什均衡”(Nash equilibrium)
伯努利试验Beroulli trial:解哈希谜题是概率性的,通过一个个去试临时随机数。结果只有两种,连续试验下,每种结果发生的概率是固定的。
泊松过程 Poisson process:节点多次尝试临时随机数的伯努利试验是一个离散概率过程,可用泊松过程的连续概率过程近似表示。
对于特定的矿工:发现下一区块的平均时间=10min/占全部计算力的比例
2.4.3 哈希谜题特性:易于证实
第三个特性:证实一个节点正确地计算了工作量证明很容易。任何节点或矿工,都可以迅速地证实其他矿工找到的区块符合工作量证明的规定。
本章总结:
挖矿成本:如何计算出挖矿是否赚钱。
如果:挖矿成本>挖矿成本 则:矿工赚钱
条件:
挖矿奖励=区块奖励+交易费
挖矿成本=硬件成本+运营成本(电费、空调费等)
复杂之处分析:
①硬件投资固定,电费随时间变化。
②矿工得到的奖励取决于发现区块的速度=硬件的能力+计算力占全球计算能力的比例。
③挖矿产生的成本通常为美元和其他货币,涉及到比特币汇率。
④假设矿工诚实地遵守协议,但矿工也可采用其余策略。
不存在1比特币
比特币没有固定面额,没有”1比特币“说法,比特币是交易输出,目前可以精确到小数点后8位,可能地最小价值是0.000 000 01 BTC,称之为一个中本聪。
一个交易被放进区块链
一个交易被放进区块链,说明这笔交易已经被确认过了很多次(次数不固定,6为常用次数,确认越多,越容易确信)。但经常有一些孤块(导致原因是这个区块可能包含一个不正当交易或试图双重支付或网络延迟)或没有进入共识链的区块。
哈希谜题与挖矿
矿工是决定参与创造新区块竞争的特殊类型节点。若其他矿工继续在他们的区块上搭建,则他们努力的回报是新造的比特币(新区块奖励)+已经存在的比特币(交易费)。
比特币深度使用了分布式共识的概念
传统中,有个共识过程来决定货币的汇率。
比特币里,由区块链来完成对账本情况的共识,即你拥有多少比特币的算法是依赖共识的。比特币点对点网络,区块链中记录的所有爱丽丝地址上拥有的比特币数量总额。拥有比特币就是其他节点对给定的一方拥有这些比特币的共识。
比特币规则改变有两种:软分叉与硬分叉。
启动加密货币
自举过程bootstrapping
比特币系统里有三个想法:区块链的安全性、挖矿生态系统的健康程度、货币的价值在相互作用。
51%攻击
如果共识失败,并存在一个在比特币网络里实际掌握了绝大部分挖矿能力的51%攻击者。
攻击者可以从现存的地址里偷币吗?不行,除非有能推翻加密方法。这里可能会出现分叉情况。
51%攻击者可以压制其他交易吗?不能,即使成功,大家也都知道发生了攻击。
攻击者可以改变区块奖励吗?不能,这是对系统规则的改动,其他节点不会轻易认可区块奖励提高,故他无法使用这些区块。
攻击者会摧毁大家对比特币信心吗?如果有一方控制了51%哈希算力,即使没发动攻击,大家也可能会对比特币失去信心。
结于 2018.5.24 10:37
第三章 比特币的运行机制
本章详细介绍如何建立货币系统、如何奖励矿工
3.1 比特币的交易
比特币交易的过程就是不停地创造区块地过程。
简单模式的账簿
建立一个以账户为核心的系统,可以创造新的币并放入某人的账号,然后可以转给他人。
缺点:任何人如果想要确认一笔交易是否真实,就必须跟踪每一个账户的余额。虽然可以增加数据字段来更新交易后的账户余额,但这增加了记账的工作量。
与比特币类似的基于交易的账本
类似于:财奴币。
每个交易都有一个输入值和输出值。
输入值可看成将被消耗掉的币(这些币是前一个交易创造出来的)
输出值看成是在本次交易中创造出来的币。
铸造新币时,只会创造新币,不会消费旧币。(只有输出,没有输入)
每个交易都有一个独一无二的ID。
地址转换
类似于财奴币,一个交易中输出的币,不存在只消费部分情况,要么在另一个交易中被完全消费掉,要么一个都不被消费。比如:该转换中Alice的8个币可以转换到另一个由Alice所有的地址,即地址转换。
有效验证
使用哈希指针,比如核查Alice引用的交易输出,从Alice所引用的交易开始核查到账本上最新记录的交易即可(不需从账本建立之初的交易开始核查),不需增加额外的数据结构。
资金合并
发起一个交易,交易里有多个输入和一个输出,输出的地址为发起人地址。
共同支付
发起一个交易,交易里有多个输入和一个输出,输出的地址为收款方的地址,多个输入所引用的“上一笔交易”的输出地址不同,需要多个签名:比如1的签名和2的签名。
交易语法
比特币在网络上传输的数据结构都是一串字符。一个比特币交易分成三部分:元数据、一系列的输入、一系列的输出。
元数据 存放一些内部处理的信息:包含这笔交易的规模、输入的数量、输出的数量、此笔交易的哈希值(即交易的独一无二的ID)。
我们可用哈希指针指向ID。锁定时间lock_time。
输入 所有输入排成一个序列,每个输入的格式都一样。输入需要明确说明之前一笔交易的某个输出:包括之前那笔交易的哈希值,让其称为指向那个特定交易的哈希指针
包括之前交易输出的索引和一个签名(我们必须有签名证明我们有资格去支配这笔比特币
输出 所有输出排成一个序列,每个输出的内容分成两部分:所有输出的金额之和必须 <= 输入的金额之和
输出的总金额 < 输入的总金额 时, 输入的总金额-输出的总金额=交易费(支付给这笔交易记账的矿工)
每个输出都要和一个特定的公钥(地址)对应,故scriptPubkey是个比特币脚本(公钥的哈希值,指令集合)。
3.2 比特币的脚本
每个交易输出确定了一个公钥,同时指定了一个脚本。
交易输出描述:凭借哈希值为X的公钥,以及这个公钥所有者的签名,才可以获得这笔资金
谁来执行这个脚本?交易的输入包括了脚本,只有把交易的输入脚本和上一笔交易的输出脚本串联起来,串联脚本必须被成功地执行后才可获取资金。
比特币脚本语言
为比特币开发的,在比特币中叫做”脚本“。
比特币脚本语言内生地支持加密操作,有目的性地指令用来计算哈希值和检验签名。
脚本语言是堆栈式地,每个指令只被执行一次,线性无法循环。
不是图灵完备的,不能随意运行强大函数功能。
注:图灵完备即语言有能力随意地执行强大的函数。
详情参见75页。
脚本执行只有两个结果:成功或者失败。
执行一个脚本
指令有两种:数据指令(把数据推到堆栈的最上面)和工作码指令(OP开头 用堆栈顶部的数据作为输入值)。
在比特币中,我们只对整个交易进行签名。
销毁证明
销毁证明 proof of burn 用于销毁比特币(防止资金被赎回)。使用OP_RETURN脚本抛出错误,其后指令都不会执行
支付给脚本的哈希值
比特币的工作机制要求币的发送者必须在交易时明确指定脚本。但是日常生活中会显得很复杂,如何解决?比特币使用:收款方告诉付款方请把比特币支付给某个脚本地址,脚本的哈希值是XX,取款时候我会提供上述哈希值对应的脚本,同时提供数据通过脚本的验证。付款方通过P2SH即可实现简单付款。
注:P2SH脚本只是对堆栈最顶层的数据进行哈希计算,检验与给定哈希值一致时再执行特殊核验:将堆栈最顶层的数据重新解读为一系列指令,然后将其作为脚本运行一次,同时,堆栈中的其他数据作为脚本的输入值。
3.3 比特币脚本的应用
第三方支付交易
利用MULTISIG(多重签名)来实现。三个人之中只有两个签名之后,资金才可被支走。但是涉及到情况便是发生纠纷时,由第三方判断完成支付还是撤销支付。
绿色地址
绿色地址:green addresses
问题描述:Alice想要转账给Bob(不在线),故Bob无法通过查看区块链的更新来确认转账是否完成。一般一个交易需要获得6次确认,时间约为1h,这对于买卖东西或者不在线不实用。
解决:第三方银行(可能是个交易所or其他的金融媒介)。银行保证它不会双重支付这个比特币,Bob相信,但是这是现实世界中银行的保证,故Bob只要相信银行即可。但是,如果银行出现双重支付事件,则人们不会相信他。现在,人们认为过分信任”银行“是由风险的。
高效小额支付
高效小额支付efficient micro-payments
例子:Alice先发起一个MULTISIG交易,把可能花费的最大金额转到MULTISIG地址。爱丽丝用流量时候,每隔一分钟签名一次,向Bob支付这分钟产生的费用,剩下的钱转给自己,直到挂机为止(目前这些交易只有Alice签名)。挂机之后,Alice不再支付费用,Bob在Alice的最后一个交易签名,把它放入区块链,而,最后一个交易会一次性向Bob支付所有的流量费,把剩余的币还给Alice(Alice单独签名的交易不会进入区块链,会被丢弃)。这些都是”双重支付“,但是运转正常情况下,Bob只会在最后一个交易上签名。
假如Bob没有在最后一个交易签名,那么Alice将会失去所有转入的比特币。可利用锁定时间来解决这个问题。
锁定时间
小额支付协议开始之前,须约定退全款(但是退款行为被锁定,锁定时间到了为止)锁定时间t到了,Bob还没在最后一个交易上签名的话,Alice可以通过退款收回所有的比特币。(t就是lock_time:告知矿工,需等待t时间之后才能把这笔交易记入区块链)
智能合约
智能合约 smart contracts 即不同于需要通过法律或者仲裁机构来保护执行的普通合约,是比特币系统里可以用技术手段来强制执行的合约。
3.4 比特币的区块
把大量交易组织起来放入一个区块,得到的哈希链更短,极大提高了验证区块链数据结构的效率。
区块链将两个基于哈希值的数据结构结合起来:
⑴是区块的哈希链,每一个区块都有一个区块头部,里面有一个哈希指针指向上一个区块。
⑵是树状数据结构,以树状结构把所有交易的哈希值进行排列存储即梅克尔树。为了证明某个交易在某个区块内,可以通过树内路径来进行搜索,树的长度就是区块内所包含的交易数目。
区块头部
区块头部还包含了相关挖矿谜题相关的信息
区块头部的哈希函数必须以一大堆0开头才有效
区块头部还包含:一个矿工可以修改的临时随机数,一个时间戳,一个点数(用来表示找到这个区块的难度)
区块头部是挖矿过程中唯一哈希值化的要验证一个区块的链,只要检查区块头部即可。
区块头部唯一的交易数据就是交易树的树根”mrkl_root“
每个区块的梅克尔树上都有一个币基交易,类似于财奴币中的造币交易。币基交易创造新的比特币,特点是:
①永远只有一个单一的输入和单一的输出
②交易不消耗之前交易输出的比特币,故没有指针指向”上一个交易“
③输出值目前是:25个币多点点 = 矿工的挖矿收入=奖励的25个币+所有交易的交易手续费。
3.5 比特币网络
比特币网络是一个点对点网络,所有节点都平等,运行在TCP网络上,有一个随意的拓扑结构,每个节点和其他的随机节点相连。只要一个节点由3h没有音讯,则会慢慢被其他节点忘记。
加入网络的好处是为了维护区块链,发起交易时候,通过泛洪flooding算法完成的(或者称为八卦gossip协议)。
例子:Alice转账给Bob,客户端发起一个交易,把这笔交易告诉所有与她客户端节点相连的节点。节点接收到一个交易信息后,会把交易放入交易池(交易池里的交易还未被打包进区块链),如果交易池中已经存在(通过交易的哈希值查询)该交易就不会将它再次传播(确保泛洪协议会自动终结)。
如何核验节点接收到的新交易信息?①交易验证(验证交易在当前的区块链中是有效的,节点会针对每个前序交易的输出运行核验脚本,确保脚本的返回值都为真)②检查是否有双重支付③检查这笔交易信息是不是已经被本节点接收过④节点只会接收和传递在白名单上的标准脚本。
竞态条件race condition:网络延迟会导致当有双重攻击时候,众多节点会对哪一个交易应该被纳入区块链产生分歧。对于比特币,打包下一个区块的矿工会打破这个僵局(决定哪个交易会最终打包进这个区块)。
零验证交易和费用替代策略replace-by-free
零验证交易:一旦交易在网络中广播,接收方就立即接收交易。该交易不是用来预防重复支付的,由于矿工的缺省行为是把最先接收到的交易放入交易池,故零验证交易很难实现重复交易。
费用替代策略:13年矿工的缺省行为变成了费用替代策略。节点遇到有冲突的交易时,会把交易手续费更高的交易放进自己的交易池,把手续费更低的替换出去。
存储空间需求
完全有效的节点必须永久在线,这样才能接收到所有的交易数据。
完全有效节点必须维护在交易中产生的交易的输出,未被消费掉的比特币的完整列表。
轻量节点
轻量节点neightweight nodes:除完全有效节点之外的另一种节点。也叫轻客户端或简单付款验证simple payment verification SPV。
一个SPV节点的安全等级远不如全节点。
详情参加92页。
3.6 限制与优化
比特币的总体数量与记账奖励很可能永远都不会改变。
关于比特币系统的交易处理能力,区块大小有硬性规定,每个区块大小限定在1MB,每个交易大约是250字节,故每块最多容纳4000个交易。平均每隔10min,有一个矿工获得记账权利,故每秒钟稚只能处理7个交易。
限制二是比特币用的密码算法。比特币使用的签名算法是ESDSA(一种secp256k1的椭圆曲线数字签名算法)。
修订协议
如何修订比特币协议并引入一些新特性呢?发布新版本,但我们无法假定所有的节点都会更新版本。协议修订会产生两种类型结果:硬分叉和软分叉。
硬分叉:运行新协议的节点认定为有效的区块,会被运行旧版协议的节点认定为无效。导致最长的区块链分支包含的某些区块会被老节点认定为无效区块,从而老节点会认为其他才是最长有效的区块链分支,并一直扩展直到它们有新版本。硬分叉导致原先链分裂为2个,并且不会再合并,只要老节点不更新版本,就永远的被排除在另一条链外。
软分叉:加入新的特性,让现有的核验规则更加严格。老的节点会接收所有的区块,新的节点会拒绝一些。
现在假定绝大部分节点都更新了新版协议并执行新的规则(老节点不会执行新规则,新节点数量要足够多才能够竞争最长的链)。老节点可能会挖到一些包含一些在新规则下无法核验通过的交易的无效区块,因此老节点知道它们核验有效的区块不被别的节点接收,故老节点的矿工会去更新协议。若新节点用它们区块扩展了老节点的分支,则老节点也会转而扩展这个分支。
比如:P2SH就是软分叉经典例子。(一个有效的P2SH交易也可核验通过因为它只验证这个哈希值跟前一笔交易输出哈希值是不是一样而已,并不知道还要进一步检验脚本是否合法)依赖新节点进行核验:脚本本身真的可以获取到前一个交易输出的币。
写于2018.5.23 17:26
第四章 如何储存和使用比特币
要使用比特币,必须要知道:一些公共信息(记录在区块链上的内容包括该比特币的识别信息、币值信息等)和一些私密信息(比特币持有人的私钥)。
公共信息可以随时调取,但是私钥需要好好保存。储存比特币其实就是如何保存和管理比特币私钥。
储存与管理私钥有三个目标:可获取性、安全性、便利性。不同的管理方法就是对这三个目标进行权衡。
4.1 简单的本地储存
本地设备
最简单的钥匙管理:把比特币存放在本地设备上。
分析:可获取性或安全性都不太好,日常花销很方便,但极易遗失或被盗。
比特币钱包软件
本地存放比特币,一般选择使用比特币钱包软件(一个管理比特币和私钥信息并让用户方便使用的一个应用软件)。钱包就是一个接口,告诉你钱包里面有多少比特币。
编码解码:Base58编码与二维码
要使用或接收比特币,需要与对方交换比特币送达的地址。目前有两种主流的方式将地址加密:字符串、QR码。
ⅰ 为了给地址赋予一个字符串,把密钥的字节从二进制字符转换为Base58法。Base58记号法用一个包含58个字符的字符集来编码。
ⅱ一个QR码代表一个真实的比特币地址,钱包应用会把QR码自动转换成代表比特币地址的字节。
虚荣地址
将地址转换成一些人能识别的字符。
地址都是通过哈希计算产生的随机字符串,如何获得指定的呢?只能不停重复生成私钥,直到私钥中包含所希望出现的字符串。这样的地址称为虚荣地址。
虚荣地址的加速生成。详情参加104页。
4.2 热储存与冷储存
热储存
把比特币放在你的个人电脑里就像把钱放在钱包里带着。(很方便但不安全)
冷储存
离线,把比特币锁在其余地方。(相对安全保险但不方便)
热储存直到冷储存的地址,随时可给冷储存转账。冷储存上线,就可接收到区块链的转账信息,并可随时处理这些比特币。
如何管理?私密性和其余考虑,采用不同地址(地址有不同密钥)收款,把比特币从热储存转到冷储存时候使用新的冷储存地址。
但冷储存不上线,如何能找到这样的地址?
直接方法是让冷储存一次性生成一批地址,并把地址列表发给热储存,热储存可以依次使用这些地址。
法一:分层确定性钱包
使用一个分层确定性钱包hierarchical deterministic wallet。
该方法让冷储存端制造无限制的地址数量,通过一个短暂的一次性的交换让热储存知晓所有的地址。使用密码学技巧。生成一个被称为地址生成信息的东西,就可生成一系列地址。生成私钥生成信息。就可生成一系列私钥。密码学中:对于每个i,第i个地址和第i个私钥相匹配。
比特币的电子签名算法ECDSA支持分层密钥。即冷储存端生成任意多个密钥,热储存端生成相应的地址。
注:冷储存端生成和保存私钥生成信息和地址生成信息,然后将地址生成信息一次性转给热储存端。热储存端要给冷储存端转账时,按次序生成新的地址。冷存储端上线后,也会按顺序生成地址,然后查收相应地址收到的款项,直到某一地址没有收款位置。如果冷储存需要向热存储端转账,它就会按顺序生成私钥序列。
法二:大脑钱包
大脑钱包brain walle:通过一个密钥就可支取比特币。
主要原理:用一个可预测的算法把一个口令变成一对公钥/私钥。
但是这个很不安全,一旦猜到你的口令,可以偷走你大脑钱包里所有私钥。如果忘记口令,则完蛋。
如何设置安全口令?使用自动程序生成一个80位的数字,将其转换为口令。实际操作中,可以使用密钥延展来让生成密钥速度变慢。
法三:纸钱包
把密钥印在纸上,将纸锁在保险箱里。可通过两种方法为公私钥匙编码:二维码与base58码。
法四:防损硬件
使用防损硬件tamper-resistant device用来保存密钥或生成密钥。
4.3 密钥分存和密钥共享
未完待续 2018.5.24 18:39
继续阅读 2018.5.25 10:07
密码学上:密钥分存技术可以使密钥的可获取性和安全性都得到提高。
4.3.1 密钥分存方法 4.3.1 密钥分存:如何生成子密钥 注:S(原密钥)被编码成一个大的整数,斜率随机。斜率上点为子密钥,S(连接任何两个点延长与Y轴交点)。故只有一个点,无法获得S。 扩展:我们可以用任何的K与N(K 分析:密钥分存数学原理 4.3.2 门限密码:threshold cryptography 如何解决?通过密码学 例子 4.3.3 多重签名:multisignatures 4.4.1 在线钱包 4.4.2 比特币交易所 交易所和银行面临一样的风险,主要包括三大类。 4.4.3 银行监管、准备金证明、负债证明 准备金证明proof of reserve:比特币交易所或其他提供比特币管理服务的机构,可以使用准备金证明的密码学技术向储户证明他们留存了一部分储备金。 继续更新 2018.5.26 9:10 用户核实: 5.1 比特币矿工的任务 要成为矿工,必须加入比特币网络并与其他节点相连。 建立链接之后,需要完成六个任务: 1)监听交易广播(验证其签名是正当有效的,交易输出没有被重复支付) 2)维护区块链网络和监听新的区块。 3)组装一个备选区块。(一旦拥有最新的全部区块链数据备份,则可以制造你自己的区块) 4)找到一个让你的区块有效的随机数。 5)希望你的区块被全网接受。(即使找到一个区块也不能保证该区块会成为共识链concensus chain的一部分。 6)利润。如果其他矿工接受了你的区块,则你可以获得利润。若在该区块里的任何交易都有交易费,则所有交易费是矿工所有的。 矿工的任务可分为两类: 1)验证交易和区块。 比特币网络赖以生存和运转的基础,比特币协议需要矿工的首要原因。 2)和其他矿工竞争,争取可以找到区块并因此获益。 不是比特币网络存在所必需的,是为奖励矿工去完成第一类任务而设置的。 综上:两个任务是使比特币成为一个数字货币的必要条件(矿工必须获得奖励才会去完成这些任务) 寻找有效区块 如何找到一个使区块有效的随机数? 区块链主要有两层基于哈希函数的结构:1)第一层在区块链上,每个区块的头部都有一个指针指向前一个区块。2)第二层是在每一个区块里,包括所有交易的梅克尔树。 矿工首先需要从其交易池中选出一系列有效的交易并且编译成梅克尔树。(只要不超过每个区块随机数的交易上限,可以选择编译的交易数量) 矿工之后需要组装出一个新的区块,让其头部(有一个32位的随机数区域)指向区块链上的前一个区块。(你需要不断试临时随机数找到能使整个区块的哈希值小于目标值(目标值特点是以零开头的特定位数的数值)) 随机数试过所有32位可能的取值后,还没找到一个有效的哈希值怎么办? 当你遍历区块头部随机数所有可能的取值后,可以改变币基(coin-base)里的随机数。(比如+1,然后再重新改变区块头部随机数来寻找) 改变币基里的随机数,整个梅克尔树上交易的哈希值都会改变(币基值的改变会向上传递)。 最终找到一对临时的随机数组合:头部随机数和币基随机数,用来产生符合哈希值要求的新区块,宣布,就有希望获得相应的区块奖励。 每个人都在运算同一个谜题吗? 每个矿工都会把或多或少不同的交易用不同的次序来放进区块内,因此不太可能走在完全相同的一个区块上进行计算。 就算两个不同的矿工组建的区块里包含了相同的交易,这两个区块的哈希值也不同(币基交易里,矿工会写自己的地址接收新铸币),除非两个矿工共享公开密钥。 只可能是两个矿工同在一个矿池,但是他们会互相通信,确保使用不同的币基临时随机数以避免重复工作。 找到一个有效区块很难吗?很难。挖矿的目标区域,任何有效区块的哈希值必须低于这个值。 决定难度 每挖出2016个区块,挖矿难度会改变一次(约为2周)。 难度的改变根据上2016个区块的挖矿效率来决定的。即: 下一个难度=(上一个难度201610min)/产生上2016个区块所花费的时间 5.2 挖矿所需硬件 矿工计算难度的核心在于对SHA-256哈希函数的运算。(SHA-256是一个通用的密码学哈希函数,SHA是安全哈希算法) SHA-256 SHA家族? SHA-256中256代表有256位状态和输出。技术上,SHA-256是SHA-2函数家族中几个密切相关的的函数成员之一,包括SHA-512(状态位更大更安全)。SHA-1(160位输出,目前认为安全性不高) SHA-256?是一个256位状态机,被分割成8个32位字段,可最优化运行在32位硬件上。(32位模加法,右位移,设计思路来自简单位的线形反馈移位寄存器) 下图展示了一轮SHA-256的压缩函数运算,一个完整的SHA-256运算要做64位这样的迭代运算。参见146页图。 比特币机制奇怪之处?比特币机制下,为得到供其他节点使用的哈希函数,实际上要求两轮SHA-256运算,原因不清楚。 CPU挖矿 第一代挖矿:电脑上通过CPU进行计算。(矿工知识简单的按照线性的方式尝试所有的临时随机数,在软件中进行SHA-256运算,检查结果确认是否找到一个有效区块) GPU挖矿 第二代挖矿:显卡或者图形处理器GPU挖矿。GPU有高吞吐量和高并行处理功能。显卡的并行性设计使其具备很多算术逻辑单元ALU,可以通过进行SHA-256运算。 2010年,OpenCL诞生,它可使GPU进行非图片处理类工作的通用语言。 缺点: 1)GPU大量的内置硬件进行图形处理,对比特币挖矿无用。 2)GPU没有很好的冷却处理设置。 3)GPU非常耗电。 现场可编程门阵列挖矿 2011年左右,用于现场可编程门列阵Field-Programma Gate Array 简称FPGA)硬件设计语言Verilog,第一次用于比特币挖矿。 利用FPGA代替GPU进行挖矿。 工作原理:追求定制硬件的最佳性能同时,用户可现场调试或者修改硬件参数。 优点: 1)性能比GPU好,特别是数位操作。 2)FPGA易冷却。 缺点:导致其只存在了几个月,就应运而生ASIC 1)FPGA挖矿其实更加困难(一直在超频使用),故经常看到各种报错和故障。 2)优化FPGA的32位加法处理上十分困难(而这个在SHA-256中非常重要) 3)FPGA难购买。 专用集成电路技术挖矿 当今的挖矿市场主要被ASIC所主导,这些IC芯片被设计制造优化,就为了比特币挖矿这唯一目的。 考虑到矿机运行所需耗费的电力成本以及冷却成本,大多数ASIC矿机都无法靠挖矿赚回成本。 如今:专业挖矿的天下 书中引用了Bitfury的挖矿中心图。 如何建立一个挖矿中心?首先需要具备:气候(气温偏寒,节省冷却费用)、电费、网络接入速度。冷却时比特币挖矿最大的挑战,其挖矿本身的耗电量,用单位面积来算要超过传统的数据中心。 与挖金矿的相似之处 比特币挖矿经历了:从CPU到GPU,到FPGA,最后到现在的ASIC。 5.3 能源消耗和生态环保 根据热力学里的蓝道尔原理,任何一个不可逆转的计算都会消耗一定的能源,该计算也可被认为是一种信息丢失的过程。原理之处:任何移位运算都会消耗一定量(k Tln 2)的焦耳,k是玻耳兹曼常数,T代表芯片以开尔文为单位的温度)。综上: 每进行一个不可逆的数位运算都会消耗一个最小量的焦耳,能源是永远不会被摧毁的,只会互相转变。
密钥被分为N个片段,只要获得其中K个片段,即可将原密钥重新还原。如果获取片段例子:
假定N=2,K=2 即将把原密钥转换为2个子密钥。
假设原密钥为S(S为很大数字比如有128位)
随机产生另一个128位数字R(作为其中1个子密钥),另一个为:S⊕R即密文(⊕为异或符号)。
将R与S⊕R保存在两个不同地方。
当N=K时:对于之前地K-1个子密钥,生成N-1个不同随机数,最后一个子密钥=原密钥⊕其他N-1个子密钥
注:把密钥简单地切分为若干片段不可取,一个片段就会透露密钥信息,并不需要所有片段即可猜出。
方法:①把S标记在Y轴(0,S),经过该点画一直线,斜率随机。
②在该线上挑点,要多少有多少。③得到N个子密钥,并且K=2.
图4.4 采用一条直线进行密钥分存。代数中:直线就是自由度为1的多项式。若K=3 利用抛物线实现,抛物线自由度为2的多项式。数学上:拉格朗日公式表明,如果要回归一条自由度为K-1曲线,至少需要K个点。
故:我们最多可以承受N-K个子密钥被泄露。
注意:若使用自由度为K-1
的曲线上的若干点进行密钥分存,则还原原密钥至少需得到K
个点的数据。
密钥分存依旧存在问题:密钥分存之后,要用原密钥签名必须取得子密钥将其还原成原密钥,该过程不安全可能会被黑客侵入盗取密钥。
克服密钥单点保存的缺陷方法一:门限签名
门限签名技术:子密钥储存在不同设备中,以去中心化方式还原原密钥。
门限签名将一个密钥切分成不同片段,分别储存,在交易签名时不需还原原密钥。
多重签名是比特币脚本的特性,把一个比特币账户的控制权交给多个密钥来共同保护账户安全。
门限签名与多重签名都能克服密钥单点保存的缺陷。
使用双重安全机制的电子钱包(N=2,K=2),若两个密钥分别存在电脑和手机上,可在电脑上发起付款(电脑会生成一个签名片段发送到手机),手机提示付款信息等待你确认。
若你确认,手机利用它的子密钥完成整个签名然后广播到区块链上。
克服密钥单点保存的缺陷方法二:多重签名
多重签名:通过比特币脚本,把一个比特币账户的控制权交给多个密钥(而非密钥分存),这些密钥保存在不同地点分别生成签名。4.4 在线钱包和交易所
在线钱包信息储存在云端,可通过网页或手机应用来读取。
15年初,比较流行的在线钱包服务是比特币基地公司Coinbase和区块链信息公司blockchain,info。
优点:方便。
缺点:风险。由于网站储存密钥,虽然通常情况下使用密码保护密钥,但是万一工作人员或者黑客入侵就可以窃取。
传统银行:存钱,银行答应在你提款时候给你钱,存钱期间银行通常会把钱用于投资。
比特币交易所:交易所可办理比特币存款,承诺日后按照你要求把钱(比特币、法币)还钱。
注意:交易所只是修改了和你的合约,不需要在区块链里把比特币从一个地址转为另一个地址。故交易前后,比特币没有真正在区块链中移动,只有你与银行合约变化。
优点:交易把比特币经济和法币经济相结合,自由转换。
缺点:风险。
风险一:挤兑(大家同时去银行提款,银行钱不够)
风险二:银行本身就是一个旁氏骗局(不断借新还旧)
风险三:黑客入侵(有人甚至是雇员)
倒闭的交易所包括门头沟(Mt.Gox)。
银行监管:政府对银行进行监管,政府首先要求银行有一个最低准备金要求,并在必要时为银行或储蓄者提供保护。准备金证明:
(1)证明你有多少准备金。交易所只需发起一笔向自己转账的交易,转账金额=公布的准备金金额即可。
(2)证明出具准备金证明的人至少知晓该私钥(即使不是私钥所有者)
注意:
准备金证明只能说明拥有这笔比特币的人愿意参与准备金证明的过程,即准备金只是证明了某人(交易所)可以控制这一笔钱
只能证明下限金额即证明某人有多少准备金。
负债证明 proof of liabilities:利用梅克尔树(一棵哈希值构成的二叉树)来证明存款规模。交易所构建完梅克尔树:把根节点的哈希指针和根节点的存款金额字段进行加密签名,然后在网络上广播。
交易所需要声明所有储户都可以对应到叶节点上,且存款数据无错。
1)子树根节点的哈希指针和存款金额字段,与交易所广播的值一致。
2)子树根节点遍历到叶节点,每个节点对应的哈希值确实是其所指向的子节点的哈希值。
3)每个叶节点对应的客户账号信息都是正确的。
4)每个节点的存款金额字段=与其最相近的子节点的存款金额之和。第五章 比特币挖矿bitcoin mining