作者(于文飞)长期致力于区块链行业分析,新媒体传播行业分析;在中国联通、北大金融培训班,区链财经私董会(清华大学深圳研究生院专场)等做过区块链专场培训,受到高度好评。 合作联系方式:ywf419001@163.com, 个人微信:wenfeiyu01
注:本连载省略了关于“数字代币”部分的分析,直接从区块链技术开始。
知识:区块链技术的专用名词解释
区块链是基于密码学的一种分布式存储方式的技术实现,它的意义在于可以保证信息流通过程的安全和可靠,但是区块链并不是绝对完美的,它取决于几个方面的限制:
1、区块链自身规模的大小。抛开创世链自身的技术壁垒,链条节点越多的区块链越安全,反之则并不安全。大家都知道,只要破解区块链的51%的节点,既可以攻破区块链的安全壁垒,所以说,只要黑客的收益大于成本,就有动力去破解。
2、公钥与私钥的安全问题。公钥存在于链条过程中,相对与私钥来讲,和用户的关系并没有那么紧密,但是私钥一旦被黑客知道,区块链的安全性甚至不如普通的社会诚信体系,因为区块链的基因就是一对一的开放。当然,基于区块链的信息流有可追溯性,但是这也是相对的安全,因为很难确定黑客的个人真实身份。
3、信息采集的初始数据的真实性。有时候,你很难保证采集数据的时候,被采集方给你的原始数据就是真实的,当然这并不属于区块链的范围,但这却是很重要的风险之一。
4、密码学与算法的制约。所有了解过区块链的朋友可能都听说过哈希密码,管技术的问题我们不去讨论,很多文章也有各种解释,我们只探讨一下,国内目前的密码学算法的技术有多高?区块链之间的信任沟通需要在线交互,除了几大牛逼的科技企业,又有多少团队有这么牛逼的技术或者资源?
5、参与者的目的性。任何新事物的发展都会引来投机者的搅局,区块链技术也不会独善其身。不良资产的参与会让整个行业在短时间内飞速膨胀,就像猪吃了四月肥和瘦肉精一样,看似华美的背后会是行业没有健康积累的虚胖,最后必定是留下一地鸡毛。
当然,很多朋友都想要了解这个行业,毕竟一个新的领域会带来更多更好的机会,所以,要了解这个行业,就必须了解这个行业的很多术语,这样你才能读懂行业文档,也才能更好的和行业人士交流。
下面这些专业术语是cooboys搜集整理自网络,这些内容是没有加工过的网络文字摘抄。版权属于网络作者。
图灵完备: 一切可计算的问题都能计算,这样的虚拟机或者编程语言就叫图灵完备的。图灵完备意味着你的语言可以做到能够用图灵机能做到的所有事情,可以解决所有的可计算问题。 图灵不完备也不是没有意义, 有些场景我们需要限制语言本身. 如限制循环和递归, 可以保证该语言能写的程序一定是终止的。 理解一下,就是说图灵完备的语言,有循环执行语句,判断分支语句等。理论上能解决任何算法。但有可能进入死循环而程序崩溃。 图灵不完备,应该是不允许或限制循环。可以保证,每段程序都不会死循环,都有运行完的时候。 比特币的脚本系统是图灵不完备的,而一些竞争币的智能合约系统是图灵完备的。 各有优缺点,图灵不完备会更安全些,图灵完备会更智能些。 虽然图灵机会受到存储能力的物理限制,图灵完全性通常指具有无限存储能力的通用物理机器或编程语言。简单来说,一切可计算的问题都能计算,这样的虚拟机或者编程语言就叫图灵完备的。 ---------------------------------------------------------------------------- 图灵测试 1945年到1948年,图灵在国家物理实验室负责自动计算引擎(ACE)的研究工作。1949年,他成为曼彻斯特大学计算机实验室的副主任,负责最早的真正的计算机---曼彻斯特一号的软件工作。在这段时间,他继续作一些比较抽象的研究,如“计算机械和智能”。图灵在对人工智能的研究中,提出了一个叫做图灵测试(Turing test)的实验,尝试定出一个决定机器是否有感觉的标准。 1952年,图灵写了一个国际象棋程序。可是,当时没有一台计算机有足够的运算能力去执行这个程序,他就模仿计算机,每走一步要用半小时。他与一位同事下了一盘,结果程序输了。 后来美国新墨西哥州洛斯阿拉莫斯国家实验室的研究组根据图灵的理论,在ENIAC上设计出世界上第一个电脑程序的国际象棋-洛斯阿拉莫斯国际象棋。 ---------------------------------------------------------------------------- 图灵机(英语:Turing machine) 又称确定型图灵机,是英国数学家艾伦·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。 所谓的图灵机就是指一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。 ---------------------------------------------------------------------------- 缺少图灵完备性 这就是说,尽管比特币脚本语言可以支持多种计算,但是它不能支持所有的计算。最主要的缺失是循环语句。不支持循环语句的目的是避免交易确认时出现无限循环。理论上,对于脚本程序员来说,这是可以克服的障碍,因为任何循环都可以用多次重复if 语句的方式来模拟,但是这样做会导致脚本空间利用上的低效率,例如,实施一个替代的椭圆曲线签名算法可能将需要256次重复的乘法,而每次都需要单独编码。 ---------------------------------------------------------------------------- 价值盲(Value-blindness)。 UTXO脚本不能为账户的取款额度提供精细的的控制。例如,预言机合约(oracle contract)的一个强大应用是对冲合约,A和B各自向对冲合约中发送价值1000美元的比特币,30天以后,脚本向A发送价值1000美元的比特币,向B发送剩余的比特币。虽然实现对冲合约需要一个预言机(oracle)决定一比特币值多少美元,但是与现在完全中心化的解决方案相比,这一机制已经在减少信任和基础设施方面有了巨大的进步。然而,因为UTXO是不可分割的,为实现此合约,唯一的方法是非常低效地采用许多有不同面值的UTXO(例如对应于最大为30的每个k,有一个2^k的UTXO)并使预言机挑出正确的UTXO发送给A和B。 ---------------------------------------------------------------------------- 缺少状态 : UTXO只能是已花费或者未花费状态,这就没有给需要任何其它内部状态的多阶段合约或者脚本留出生存空间。这使得实现多阶段期权合约、去中心化的交换要约或者两阶段加密承诺协议(对确保计算奖励非常必要)非常困难。这也意味着UTXO只能用于建立简单的、一次性的合约,而不是例如去中心化组织这样的有着更加复杂的状态的合约,使得元协议难以实现。二元状态与价值盲结合在一起意味着另一个重要的应用-取款限额-是不可能实现的。 ---------------------------------------------------------------------------- 区块链盲(Blockchain-blindness): UTXO看不到区块链的数据,例如随机数和上一个区块的哈希。这一缺陷剥夺了脚本语言所拥有的基于随机性的潜在价值,严重地限制了博彩等其它领域应用。 ---------------------------------------------------------------------------- 智能合约 (Smart Contract): 智能合约是一种存在于区块链上的程序。就如同区块链上的分布式账本一样,智能合约也拥有去中心化、透明、不可篡改的特性,另外智能合约也跟一般钱包一样,可以接受/发送虚拟货币,而执行的细节则可以在合约里面定义。 比如说我今天发布了一个智能合约到区块链上,里面放了 1 ETH,并且撰写程序代码指定如果有人呼叫了 trade() 函式并且带入 10 BAT (这是另外一种加密货币),我就把 1 ETH 跟他交换,这样我就可以用 1 ETH 换得 10 BAT。 📷 智能合约原理 重要的智能合约通常会公开其源码让所有人都可以检视这份合约,确认其运作是否安全与合理。 当然智能合约还可以做很多其他的应用不限于交换货币。而上述的交换加密货币是一个简化过的例子。 讲解完这两个基础概念,让我们来谈谈一般大众平常使用的加密货币交易所,也就是中心化交易所。 ---------------------------------------------------------------------------- “幽灵“协议("Greedy Heaviest Observed Subtree" (GHOST) protocol): 是由Yonatan Sompolinsky 和 Aviv Zohar在2013年12月引入的创新。幽灵协议提出的动机是当前快速确认的块链因为区块的高作废率而受到低安全性困扰;因为区块需要花一定时间(设为t)扩散至全网,如果矿工A挖出了一个区块然后矿工B碰巧在A的区块扩散至B之前挖出了另外一个区块,矿工B的区块就会作废并且没有对网络安全作出贡献。此外,这里还有中心化问题:如果A是一个拥有全网30%算力的矿池而B拥有10%的算力,A将面临70%的时间都在产生作废区块的风险而B在90%的时间里都在产生作废区块。因此,如果作废率高,A将简单地因为更高的算力份额而更有效率,综合这两个因素,区块产生速度快的块链很可能导致一个矿池拥有实际上能够控制挖矿过程的算力份额。 ---------------------------------------------------------------------------- 中心化交易所 (Centralized Exchange): 中心化交易所其实就是大家主流使用的交易所,无论是 Bitfinex, Poloniex, coincheck 等都是中心化交易所。大家使用这些交易所的方式,通常就是到网站上注册,根据不同国家的法规经过一连串的认证程序后,就可以开始把加密货币转入他们指定的钱包地址后,就可以开始在上面交易加密货币。 拿刚刚的例子来说,如果 使用者 A 要拿 1 ETH 交换 10 BAT,中心化交易所会在他们的系统的数据库当中,建立一笔卖单,内容是 1 ETH 交换 10 BAT。如果有另外一位 使用者 B 也建立了一笔买单,愿意用 10 BAT 买 1 ETH,系统就会自动搓合这笔交易,在 用户 A 的资产清单中扣掉 1 ETH,增加 10 BAT, 使用者 B 反之亦然。 这样的交易不见得会发生在区块链上真正的货币交换,取而代之的可能仅是修改交易所数据库内的资产数字,用户看到的只是账面上数字的变化,交易所只要在用户提款时准备了充足的加密货币汇出即可。 📷 中心化交易所 (Centralized Exchange) 当使用者把加密货币转到他们提供的钱包地址后,交易所就拥有了操作这些加密货币的权利,使用者必须要「信任」这个网站会保证货币安全,才能把加密货币转给交易所操作。 正因为中心化交易所拥有了存放大量加密货币的私钥,中心化交易非常容易吸引黑客 (Cracker) 的攻击,而他们的目标绝大部分就是这些存放大量加密货币的私钥,偷走了这些私钥就代表黑客盗走这些加密货币。 📷 中心化交易所 &黑客 以上就是基础概念以及中心化交易所简介,下半部分则会讲解去中心化交易所以及结论。 ---------------------------------------------------------------------------- 去中心化交易所 (Decentralized Exchange): 去中心化交易所跟一般中心化交易所最不一样的地方,就是交易行为发生在区块链上,就比如说 1 ETH 交换 10 BAT 来说,两者不一样的地方在于: 中心化交易所,在交易所本身的数据库中增减用户资产字段。 去中心化交易所,在区块链上直接交换,加密货币会直接发回使用者的钱包,或是保存在区块链上的智能合约。 这样直接在区块链上交换的好处在于交易所并不持有用户大量的加密货币,所有的加密货币会储存在区块链上使用者的钱包或智能合约控管。本来需要信任中心化的交易所,现在仅需要信任区块链以及智能合约即可。而用于交易所的智能合约大多会公开源码让所有人可以确认这份合约的细节。 ---------------------------------------------------------------------------- 远程攻击: ( Vitalik 在2014年5月发布的博文,提出了远程攻击(Long-Range Attacks)的概念。) 我们目前的工作量证明设计是基于区块链的工作量证明,这是我们第二次尝试构建保证不会给 CPU 造成负担并且长期来看是抗专用硬件(ASIC)挖矿的算法(编者按:即在长期挖矿的情况下,使用 ASIC 不能明显提高优势)。我们第一次尝试的是 Dagger,试图通过有向无环图构建一个计算时 memory-hard、验证时 memory-easy 的算法(译者按:即计算时会占用大量内存、验证时不会),从而进一步发展 Scrypt 等 memory-hard 算法的概念(从根本上来说是每个节点都有多个父节点的树)。我们目前的策略要严密得多:让工作量证明执行来自区块链的随机合约。由于以太坊采用的是图灵完备的脚本语言,能够执行以太坊脚本的 ASIC 从定义上来说是用于通用计算的 ASIC,也就是 CPU——技术宅一点来说就是“这是 memory-hard 算法,因此你没法并行处理太多指令”。当然还有“那么能否(对ASIC)进行特定优化,使得速度大大提升?”等问题,不过这些都是假以时日可以解决的小瑕疵。我们的解决方案很巧妙,因为它兼具经济实惠的特点:如果有人真的创建了一个 ASIC,那会激励其他人寻找该 ASIC 无法进行的计算类型并用这类合约充斥且污染区块链。不过遗憾的是,这类方案通常面临一个更大的障碍,从某种程度上来说还是一个根本障碍:远程攻击。 远程攻击的运行流程基本如下。在传统的51%攻击中,我先将100枚比特币存入一个全新的账户,再用这100枚比特币购买某个即时交付的数字商品(如莱特币)。我等待卖家交付(比方说要等到6次确认之后),之后我立即从100枚比特币的转让交易达成前的一个区块开始构建一条新的区块链,并且重新提交一份将这些比特币转回我的账户的交易。之后,我为自己的分叉链使用了超出剩余网络提供给主链的算力来挖矿,最后我的分叉链超越并取代了主链。结果是我将比特币和莱特币双双收入囊中。在远程攻击中,我开始制造分叉的地方不再提前6个区块,而可以提前60000个区块,甚至可以从创世块开始。 在比特币中,这种分叉是无效的,因为你只是在徒增赶上主链所需的时间。然而,这对基于区块链的工作量证明来说是一个严峻的问题。因为如果你直接从创世块开始制造分叉,尽管你的挖矿过程一开始会很缓慢,但在链接几百个区块之后就能够用很容易挖出的合约将这条区块链填满,而别人要想挖掘这些合约却难比登天。 关于这类合约,有一则简单的例子: i = 0 while sha3(i) != 0x8ff5b6afea3c68b6cd68bd429b9b64a708fa2273a93ea9f9e3c763257affee1f: i = i + 1 你清楚地知道该合约在与哈希值匹配之前将经历整整一百万轮计算,那么你就可以立刻准确地计算出该合约在这一过程中将经历几个步骤、消耗多少gas,最后又会变为什么状态,然而其他人别无选择,只能实实在在地运行代码。实际上,要构建一个不经过实际运行就能在一般情况下检测出这类投机取巧的合约的机制是不可能的(此处可经由数学证明,而非凭空臆断),这既是这类方案的一个重要特性,也是停机问题的必然结果。因此,远程攻击者可以用这类合约填补分叉链,“挖掘”这类合约,明明走了捷径,却让网络相信他做了大量工作。因此,不出几日,我们的攻击者的挖矿速度就会是主链的数十亿倍,其长度很快就超越了主链。 要注意的是,上述攻击没有对算法的实际运行方式作出假设;而只是假设了有效区块产生的条件取决于区块链本身, 而且每单位算力在区块链上可以产生的影响力程度具有广泛的可变性。一种解决方案是人为抑制这种可变性;这需要通过一个哈希树计算堆栈追踪合约算法来实现,这样一来就无捷径可走了,因为即使你知道计算会在一百万步之后终止并产生一个输出值,你依然需要亲自运行一百万步来计算出所有中间的哈希值。然而,虽然这解决了远程攻击问题,但也导致了主要计算并非通用计算,而是计算出许许多多SHA3哈希值——使得算法再度易于受到专用硬件的影响。 ---------------------------------------------------------------------------- 权益证明: 还有一种远程攻击是纯权益证明算法。在纯权益证明中, 假设在创世块产生之时或之后不久,攻击者持有代币总量的1%。之后,攻击者开始制造自己的分叉链并开始挖矿。虽然,攻击者在当时只有1%的概率被选中生产区块,他们轻易就能产生100倍数量的区块,以此创造出一条更长的区块链。我原本认为这是个根本问题,但它实际是可以变通解决的。 例如,一种解决方案是注意每个区块必须有对应的时间戳,而且用户要抵制那些时间戳远远早于他们自己时间戳的链。这样一来,远程攻击就必须合乎相同的时间长度,但是由于它涉及的代币单位少得多,其得分也会低得多。另一种解决方案至少需要代币总量的一定百分比(如30%)为每个区块或是每第N个区块背书,这样绝对能抵御少于该百分比的代币量的一切攻击。我们自己的权益证明算法 Slasher 很容易就能更新成上述任一解决方案。 因此从长期看来,纯权益证明或混合工作量/权益证明似乎都是区块链的发展方向。在采用混合工作量/权益证明的情况下,人们很容易就能找到一个方案,利用权益证明来解决上述通过基于区块链的工作量证明解决的问题。对于 Ethereum 1.0,我们可能会采用权益证明,可能会是一种混合型方案,可能还是那套老掉牙的 SHA3 算法。我们明白 ASIC 不会有所发展,因为 Ethereum 2.0 到来在即,ASIC 的生产商会认为此举无利可图。 ---------------------------------------------------------------------------- 分布式软件系统: 分布式软件系统(Distributed Software Systems)是支持分布式处理的软件系统,是在由通信网络互联的多处理机体系结构上执行任务的系统。它包括分布式操作系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等。 分布式操作系统负责管理分布式处理系统资源和控制分布式程序运行。它和集中式操作系统的区别在于资源管理、进程通信和系统结构等方面。 分布式程序设计语言用于编写运行于分布式计算机系统上的分布式程序。一个分布式程序由若干个可以独立执行的程序模块组成,它们分布于一个分布式处理系统的多台计算机上被同时执行。它与集中式的程序设计语言相比有三个特点:分布性、通信性和稳健性。 分布式文件系统具有执行远程文件存取的能力,并以透明方式对分布在网络上的文件进行管理和存取。 分布式数据库系统由分布于多个计算机结点上的若干个数据库系统组成,它提供有效的存取手段来操纵这些结点上的子数据库。分布式数据库在使用上可视为一个完整的数据库,而实际上它是分布在地理分散的各个结点上。当然,分布在各个结点上的子数据库在逻辑上是相关的。 分布式数据库系统是由若干个站集合而成。这些站又称为节点,它们在通讯网络中联接在一起,每个节点都是一个独立的数据库系统,它们都拥有各自的数据库、中央处理机、终端,以及各自的局部数据库管理系统。因此分布式数据库系统可以看作是一系列集中式数据库系统的联合。它们在逻辑上属于同一系统,但在物理结构上是分布式的。 分布式数据库系统已经成为信息处理学科的重要领域,正在迅速发展之中,原因基于以下几点: 1、它可以解决组织机构分散而数据需要相互联系的问题。比如银行系统,总行与各分行处于不同的城市或城市中的各个地区,在业务上它们需要处理各自的数据,也需要彼此之间的交换和处理,这就需要分布式的系统。 2、如果一个组织机构需要增加新的相对自主的组织单位来扩充机构,则分布式数据库系统可以在对当前机构影响最小的情况下进行扩充。 3、均衡负载的需要。数据的分解采用使局部应用达到最大,这使得各处理机之间的相互干扰降到最低。负载在各处理机之间分担,可以避免临界瓶颈。 4、当现有机构中已存在几个数据库系统,而且实现全局应用的必要性增加时,就可以由这些数据库自下而上构成分布式数据库系统。 5、相等规模的分布式数据库系统在出现故障的几率上不会比集中式数据库系统低,但由于其故障的影响仅限于局部数据应用,因此就整个系统来讲它的可靠性是比较高的。 特点 1、在分布式数据库系统里不强调集中控制概念,它具有一个以全局数据库管理员为基础的分层控制结构,但是每个局部数据库管理员都具有高度的自主权。 2、在分布式数据库系统中数据独立性概念也同样重要,然而增加了一个新的概念,就是分布式透明性。所谓分布式透明性就是在编写程序时好象数据没有被分布一样,因此把数据进行转移不会影响程序的正确性。但程序的执行速度会有所降低。 3、集中式数据库系统不同,数据冗余在分布式系统中被看作是所需要的特性,其原因在于:首先,如果在需要的节点复制数据,则可以提高局部的应用性。其次,当某节点发生故障时,可以操作其它节点上的复制数据,因此这可以增加系统的有效性。当然,在分布式系统中对最佳冗余度的评价是很复杂的。 分布式系统的类型,大致可以归为三类: 1、分布式数据,但只有一个总? 据库,没有局部数据库。 2、分层式处理,每一层都有自己的数据库。 3、充分分散的分布式网络,没有中央控制部分,各节点之间的联接方式又可以有多种,如松散的联接,紧密的联接,动态的联接,广播通知式联接等。 ---------------------------------------------------------------------------- 默克尔树: 默克尔树是一种二叉树,由一组叶节点、一组中间节点和一个根节点构成。最下面的大量的叶节点包含基础数据,每个中间节点是它的两个子节点的哈希,根节点也是由它的两个子节点的哈希,代表了默克尔树的顶部。默克尔树的目的是允许区块的数据可以零散地传送:节点可以从一个源下载区块头,从另外的源下载与其有关的树的其它部分,而依然能够确认所有的数据都是正确的。之所以如此是因为哈希向上的扩散:如果一个恶意用户尝试在树的下部加入一个伪造的交易,所引起的改动将导致树的上层节点的改动,以及更上层节点的改动,最终导致根节点的改动以及区块哈希的改动,这样协议就会将其记录为一个完全不同的区块(几乎可以肯定是带着不正确的工作量证明的)。 📷 默克尔树 默克尔树协议对比特币的长期持续性可以说是至关重要的。在2014年4月,比特币网络中的一个全节点-存储和处理所有区块的全部数据的节点-需要占用15GB的内存空间,而且还以每个月超过1GB的速度增长。目前,这一存储空间对台式计算机来说尚可接受,但是手机已经负载不了如此巨大的数据了。未来只有商业机构和爱好者才会充当完整节点。简化支付确认(SPV)协议允许另一种节点存在,这样的节点被成为“轻节点”,它下载区块头,使用区块头确认工作量证明,然后只下载与其交易相关的默克尔树“分支”。这使得轻节点只要下载整个区块链的一小部分就可以安全地确定任何一笔比特币交易的状态和账户的当前余额。 ---------------------------------------------------------------------------- 什么是共识机制: 区块链从本质上而言是一种分布式账本技术。传统的账本,通常会以数据库的形式,集中存储在银行或公司的服务器节点上。而在区块链的网络中,每个节点都会保有一份完整的账本,且所有节点的账本内容完全一致。每个节点都可以根据自己本地的账本去查找交易,也可以往账本中添加交易。 这样就带来了一个问题,如果所有节点同时一起写入账本数据,那么肯定数据会不一致。因此需要一种机制来保证区块链中的每一区块只能由一个节点来负责写入,并且让所有其他节点一致认同这次写入。如何选出写入账本数据的节点,这就是共识机制。 ---------------------------------------------------------------------------- 拜占庭将军问题: 拜占庭将军问题[1][2](Byzantine Generals Problem)是对上述场景的一种建模。拜占庭将军问题是一个共识问题: 首先由Leslie Lamport与另外两人在1982年提出,被称为The Byzantine Generals Problem或者Byzantine Failure。核心描述是军中可能有叛徒,却要保证进攻一致,由此引申到计算领域,发展成了一种容错理论,即拜占庭容错(BFT,Byzantine Fault Tolerance)。 拜占庭将军问题可以描述如下: 拜占庭帝国想要进攻一个强大的敌人,为此派出了10支军队去包围这个敌人。这个敌人虽不比拜占庭帝国,但也足以抵御5支常规拜占庭军队的同时袭击。基于一些原因,这10支军队不能集合在一起单点突破,必须在分开的包围状态下同时攻击。他们任一支军队单独进攻都毫无胜算,除非有至少6支军队同时袭击才能攻下敌国。他们分散在敌国的四周,依靠通信兵相互通信来协商进攻意向及进攻时间。困扰这些将军的问题是,他们不确定他们中是否有叛徒,叛徒可能擅自变更进攻意向或者进攻时间。在这种状态下,拜占庭将军们能否找到一种分布式的协议来让他们能够远程协商,从而赢取战斗?这就是著名的拜占庭将军问题。 解决问题的难点在于,将军中可能出现叛徒,叛徒可以通过选择性地发送消息,从而达到混淆进攻决策的目的。假设有9位将军投票,其中1名叛徒。8名忠诚的将军中出现了4人投进攻,4人投撤离的情况。这时候叛徒可能故意给4名投进攻的将领送信表示投票进攻,而给4名投撤离的将领送信表示投撤离。这样一来在4名投进攻的将领看来,投票结果是5人投进攻,从而发起进攻;而在4名投撤离的将军看来则是5人投撤离。这样各支军队的一致协同就遭到了破坏。 拜占庭将军问题对应到分布式系统中,可以表述为分布式的节点间需要对某一个message达成共识(只要过半数节点认同这个message即可)。节点之间可以交换信息,但是由于恶意节点的存在,恶意节点会发布错误的消息,或是给不同的节点发送不同的消息。在这样的场景下,怎样设计一种机制去让节点能够达成共识的问题。 拜占庭问题的传统解法 口头协议: 首先明确口头协议的定义。我们将满足以下三个条件的方式称为口头协议: 每个被发送的消息都能够被正确的投递 信息接收者知道是谁发送的消息 能够知道缺少的消息 Lamport论证得出结论:将军之间采用口头协议进行通信,若叛徒数少于1/3,则拜占庭将军问题可解。也就是说,若叛徒数为m,当将军总数n至少为3m+1时,问题可解。本文中不再详细介绍通信机制和论证过程,有兴趣的读者可以查阅文章[1]中“口头协议”一节和[2]中的“Early solutions”下的第一种。 书面协议: 在口头协议上加上一个条件,使之成为书面协议 发送者对消息加上签名,签名不可伪造,一旦被篡改即可发现,而叛徒的签名可被其他叛徒伪造; 任何人都可以验证签名的可靠性。 可以论证,在将军之间使用书面协议通信的基础上,不管将军总数n和叛徒数量m,忠诚的将军总能达到一致。书面协议的本质就是引入了签名系统,这使得所有消息都可以追溯到底有谁认同了它。这一优势,大大节省了成本,他化解了口头协议中1/3要求,只要采用了书面协议,忠诚的将军就可以达到一致。即恶意的节点不超过半数,分布式系统就能达成共识。对推导细节感兴趣的读者可以同样参照[1][2]。 ---------------------------------------------------------------------------- PBFT: 实用拜占庭容错协议(PBFT,Practical Byzantine Fault Tolerance)是Miguel Castro (卡斯特罗)和Barbara Liskov(利斯科夫)在1999年提出来的,解决了原始拜占庭容错算法(即上文中的口头协议)效率不高的问题,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。 PBFT算法的结论是n>=3f+1 n是系统中的总节点数,f是允许出现故障的节点数。换句话说,如果这个系统允许出现f个故障,那么这个系统必须包括n个节点,才能解决故障。这和上文口头协议的结论一样,或者这么说,PBFT是优化了口头协议机制的效率,但是结论并未改变。 比特币中对于拜占庭问题的解法 拜占庭问题之所以难解,在于任何时候系统中都可能存在多个提案(因为提案成本很低),并且要完成最终的一致性确认过程十分困难,容易受干扰。但是一旦确认,即为最终确认。 比特币的区块链网络在设计时提出了创新的 PoW(Proof of Work) 算法思路。一个是限制一段时间内整个网络中出现提案的个数(增加提案成本),另外一个是放宽对一致性确认的需求,约定好大家都确认并沿着已知最长的链进行拓宽。系统的最终确认是概率意义上的存在。这样,即便有人试图恶意破坏,也会付出很大的经济代价(付出超过系统一半的算力)。 或者通俗来说,比特币的PoW共识弱化了拜占庭问题中对于一致性的要求,在同一时刻访问不同比特币的节点,所得到的共识并不一致,且一致性还会随着时间改变(分叉的情况)。但是可用性和分支容错性都得到了提升。 后来的各种 PoX 系列算法,也都是沿着这个思路进行改进,采用经济上的惩罚来制约破坏者。 Bitcoin的共识协议,可以参照Mastering Bitcoin中有详细的描述。 其步骤如下: 本地维持所有未被确认的交易,称之为交易池,每新接收到一笔交易就加入到交易池中。 本地维持整个区块链,每新接收到一个block,则加入到区块链中,并根据最长链原则确定主链。 当新接收到的block加入到区块链的时候,开始挖矿。 构建一个空的block,选取交易池中费率最高的交易填充block,费率的定义为交易费/交易大小。 根据主链,填充block header中的previous block hash字段。 根据block中所有交易的交易费和挖矿奖励,构建coin base交易。挖矿奖励大约 每四年(或准确说是每210,000个块)减少一半,开始时为2009年1月每个区块奖励50个比特币。 修改block header中的nonce, timestamp, merkle root(通过修改coinbase data),让hash(block header) < difficulty,其中difficulty是根据近期block的产出时间来计算的,保证每个block产出的时间大致是10分钟左右。 由于满足hash要求的block head只能通过大量遍历获得,所以挖矿的过程需要消耗大量的算力,直到得到合适的字段取值为止。 发布得到的block,其他节点验证通过后加入区块链中。 2010 年左右,挖矿还是一个很有前途的行业。但是现在,建议还是不要考虑了,因为从概率上说,由于当前参与挖矿的计算力实在过于庞大(已经超出了大部分的超算中心),获得比特币的收益已经眼看要 cover 不住电费了。 从普通的 CPU(2009 年)、到后来的 GPU(2010 年) 和 FPGA(2011 年末)、到后来的 ASIC 矿机(2013 年初,目前单片算力已达每秒数百亿次 Hash 计算)、再到现在众多矿机联合组成矿池。短短数年间,比特币矿机的技术走完了过去几十年的集成电路技术进化历程,并且还颇有创新之处。 ---------------------------------------------------------------------------- Ethereum: 由于ASIC矿机被大量运用在比特币的挖矿过程中,所以如果出现其他基于hash运算达到共识的区块链,则很容易受到原本服务于比特币的ASIC矿机攻击。因此Ethereum在设计其PoW共识算法的时候,就意识到应该让算法在普通的个人电脑上运行更有优势,从而避免被ASIC进行攻击。 Ethash设计时就明确两大目标: 抵御矿机性能(ASIC-resistance),团队希望CPU也能参与挖矿获得收益。 轻客户端可快速验证(Light client verifiability)。 基于以上两个目标,开发团队最后倒腾出来的Ethash挖矿时基本与CPU性能无关,却和内存大小和内存带宽成正相关。不过在实现上还是借鉴了SHA3的设计思路,但是使用的”SHA3_256” ,”SHA3_512”与标准实现很不同。 Ethash基本流程是这样的[6]:对于每一个块,首先计算一个种子(seed),该种子只和当前块的信息有关;然后根据种子生成一个32M的随机数据集(Cache);紧接着根据Cache生成一个1GB大小的数据集合(DAG),DAG可以理解为一个完整的搜索空间,挖矿的过程就是从DAG中随机选择元素(类似于比特币挖矿中查找合适Nonce)再进行哈希运算。可以从Cache快速计算DAG指定位置的元素,进而哈希验证。此外还要求对Cache和DAG进行周期性更新,每1000个块更新一次,并且规定DAG的大小随着时间推移线性增长,从1G开始,每年大约增长7G左右。 ---------------------------------------------------------------------------- PoS: 可以看到,PoW会存在两点问题: 费电。无论是比特币的共识还是以太坊的Ethash,挖矿的过程中都带来了巨大的电力消耗。网上有报道称,现在每挖一个比特币的成本在6000-8000美元之间;比特币现在每天消耗的电量相当于一个小国家的耗电量。 矿池的优势。随着算力的不断提升,单个矿机挖出一枚币的概率降到了极低。因此,很多矿机的拥有者联合在了一起形成矿池。矿池中的矿机并行地分担计算量,当挖出新的block获得奖励后,再根据计算量的贡献分享奖励。矿池的出现导致了比特币的中心化。从下图中可以看出,65%的算力集中在了5大矿池的手里。如果这些矿池对比特币网络进行攻击,则网络会面临较大的风险。 因此,业内提出了PoS(Proof of Stake)[7]的思想: 把生产block的工作交给拥有更多token的人,拥有的越多,作为block producer的概率越高。 生产block的过程中得到token奖励,可以理解为持有token带来的利息。 拥有大量token的人如果攻击网络,则会造成token价格的下降,对这些人是不利的,所以这些block producer攻击网络的意愿较低。 生产block只需证明自己持有的token即可,不需要消耗多少算力,节约能源。 ---------------------------------------------------------------------------- Peercoin PoS v1: 最初的一版PoS由Peercoin设计实现[8]。其中,用户要产出block必须满足以下条件。 hash(stake_modifier, current_time, UTXO) < coin(UTXO) * age(UTXO) * difficulty 具体解释如下: 用户在每一秒时间(current_time),遍历自己所有的UTXO,代入上述公式中,看是否能满足不等式条件;如果满足,就把相应的UTXO记录在block中,并发布block。 stake_modifier是对前一个block中部分字段hash后的值,加入这一项是为了防止用户提前预知自己何时有权挖矿。 difficulty会根据近期的block产出时间动态调整,保证block产出时间间隔稳定 由于每秒只需要完成和自己UTXO数量相等的hash计算,所以需要的算力较低 从不等式可以看出,持有的UTXO越多、UTXO中token数额越大(coin(UTXO))、UTXO持有时间越长(age(UTXO),或称之为币龄),不等式越容易成立,越容易进行挖矿。 生成block的奖励设置为了coin(UTXO) * age(UTXO),即UTXO数额越大持有时间越长,奖励越高。 为了将符合条件的UTXO记录进block,并且兼容原本的PoW模式,Peercoin设计了coinstake的逻辑。 保留原本第一个transaction为coinbase,但要求输入数量必须等于1,且输入的prevout字段必须置空值,输出数量必须大于等于1。 令第二个transaction为coinstake,要求输入数量大于等于1,且第一个输入为满足条件的UTXO,输出数量大于等于2,且第一个输出必须置空值,第二个输出为block奖励。 该版本的PoS面临着如下的问题: 因为构造新的block没有算力成本,所以当区块链出现fork的时候,用户有可能会倾向于同时在多个branch一起挖矿来获得潜在更高的收益,这样制造了大量的分支,破坏了一致性。这个问题多次被以太坊团队提及,并称之为nothing at stake问题[12],以太坊在其PoS方案CASPER中致力于解决该问题,下文Ethereum Casper一节中将详细描述。 出现了攒币龄的现象,即关闭节点,直到age(UTXO)足够大的时候再启动节点挖矿,从而节省电力,这样引起了在线节点数太少系统脆弱的问题。 可以攒够足够的币龄后,保证自己有足够的UTXO能够连续生产block,从而发动double-spend攻击。 Ethereum在其白皮书中承诺最终将从PoW过渡到PoC,并且其PoC的方案,名叫CASPER[12],正在积极开发中。CASPER一个主要改进点是其将致力于解决nothing at stake问题,主要的方式是惩罚在多个分支上同时进行挖矿的用户,甚至让这些用户失去用于stake的那部分token。 其方案描述如下: 用户质押自己的一部分token进入智能合约,然后开始挖矿。 如果成功挖到block并被网络接受,则用户获得奖励。 如果用户被系统发现试图进行nothing at stake行为,则其质押的token将被销毁 但对于nothing at stake问题,业界一直是有争议的[13]。主要观点就是执行这种攻击的代价太高,而且对攻击者是毫无收益的。这和PoW的前提假设一样,拥有大量矿机的人可以对比特币发动double-spend等攻击,但是这样的攻击对其并无收益,且会损失大量算力,所以这种攻击并没有大量发生。 ---------------------------------------------------------------------------- Delegated Methods: 以上的PoW和PoS的挖矿过程,是全网所有节点共同参与的,每一时刻都有成千上万个节点同时去争取产出下一个block,因此会时有发生区块链分叉(fork)的问题。即同一时刻,两个节点同时产出了next block,但由于网络时延的问题,block产出的时候两个节点并不知道有其他节点已经产出了另一个block,因此这两个block都被发布到了网络中。[5]中对分叉的问题有详细的描述,可以进行参考。 正是由于分叉的存在,block的产出时间间隔不能太短。各区块链通过动态调整的挖矿难度,将block时间间隔稳定在自己期望的水平。例如最初比特币的间隔是10分钟,后续的以太坊是15秒左右。如果时间间隔进一步调短(即降低挖矿难度),分叉问题就会大量显现,不利于共识的达成和系统的稳定。 block产出时间过长导致了两个问题: 交易确认所需的时间过长。通常来说,一笔交易进入区块链后,都建议经过6个block之后才真正确认交易,因为6个block之后想要再分叉并且追赶主链的难度已经超乎想象了。因此,在区块链上确认交易需要分钟级别的时间。 TPS (Transactions Per Second) 受到制约。TPS受到了block generation time和max block size的共同制约。其中max block size的存在是为了防止DOS攻击等因素[14],有一定的天花板,因而缩减block generation time至关重要。 为了缩短block产出时间,delegated开头命名的系列方法被提了出来。其基本思想就是,选出少量的代表来负责生产block。这样即使缩短block的时间间隔,也不会有严重的分叉发生。甚至可以使用PBFT这种没有分叉的方法来达成代表之间的一致共识。 ---------------------------------------------------------------------------- EOS DPOS: EOS提出的DPOS方案[15],其步骤简述如下: 持有token的用户可以对候选的block producer进行投票;虽然没有看到对投票过程的详细设计,但是相关文章中提到了一种可选的方法,即用户在生成交易的时候,把自己的投票包含在交易中。 得票最高的n个用户被选为代表,在下一个周期中负责产出block,目前n=21 打乱代表的顺序后,各代表开始依次生产block。每个代表都有自己固定的时间区间,需要在自己的区间中完成block的生产发布。目前这个区间是3秒,即在正常情况下每3秒产出一个block。 每个代表在生产block的时候,需要找当时唯一的最长链进行生产,不能在其他分支上进行生产。 EOS论证了在这种机制下,只要n>=3f+1(n是系统中的总节点数,f是允许出现的恶意节点数),则共识能够达成。 通过上述方法,EOS保证了较短的block生产时间(3秒),且因为给每个生产者设置了固定的时间区间,则block的产出不会因为某个候选节点的延迟而延迟。EOS的文章中详细论述了各种节点异常情况下的共识达成,有兴趣可以参考。 ---------------------------------------------------------------------------- NEO DBFT: NEO的共识机制也是先选代表,和EOS的不同之处在于,代表之间是按照PBFT的方式达成共识的。 非拜占庭问题下的解法 以上的算法都是在拜占庭问题建模下的共识算法,以下将介绍“非拜占庭问题”。在拜占庭问题中,我们认为每个节点是可以进行恶意的攻击的,即节点在传递消息的过程中,可以给不同节点传递不同的消息,从而破坏共识。这种场景是符合开放的网络环境的。 而在较为封闭的网络环境中,比如我们常说的私有链,或是公司内部的一些分布式系统中,每个节点是可信的,不会存在恶意的攻击者。节点在传递消息的过程中,只会因为网络不稳定或是节点挂掉出现漏传、重传消息的情形。因此,有一类算法是用于解决在这种场景下的共识问题,因此我们称这种场景建模为非拜占庭问题。 ---------------------------------------------------------------------------- Paxos 早在1990年,Leslie Lamport(即 LaTeX 中的"La",微软研究院科学家,获得2013年图灵奖)向ACM Transactions on Computer Systems (TOCS)提交了关于Paxos算法的论文The Part-Time Parliament。几位审阅人表示,虽然论文没什么特别的用处,但还是有点意思,只是要把Paxos相关的故事背景全部删掉。Leslie Lamport心高气傲,觉得审阅人没有丝毫的幽默感,于是撤回文章不再发表。直到1998年,用户开始支持Paxos,Leslie Lamport重新发表文章,但相比1990年的版本,文章没有太大的修改,所以还是不好理解。于是在2001年,为了通俗性,Leslie Lamport简化文章发表了Paxos Made Simple,这次文中没有一个公式。 但事实如何?大家不妨读一读Paxos Made Simple。Leslie Lamport在文中渐进式地、从零开始推导出了Paxos协议,中间用数学归纳法进行了证明。可能是因为表述顺序的问题,导致这篇文章似乎还是不好理解。所以这里我摘录了一篇对Paxos描述的中文文档[17],供参考。 想要看懂Paxos中共识达成的机制较为简单,其基本来说就是一个二次确认的过程。 首先由用户向网络中所有节点发出提议n,n是提议的编号。节点收到提议n后,若编号n比之前接受的提议请求都要大,则承诺将不会接收提议编号比n小的提议,并且带上之前接受的提议中编号小于n的最大的提议{n0, v0},n0是编号,v0是内容(如果之前没接受过提议则返回空的消息),否则不予理会。 用户得到了多数节点的承诺后,如果发现承诺的节点返回的都是空,则向所有节点发送自己本次提议的{n, v},让大家接受。否则,从所有节点返回中选择n0最大的v0,作为提议的值,提议编号仍然为n,即向所有节点发送{n, v0}让大家接受节点接收到提议后,如果该提议编号不违反自己做过的承诺,则接受该提议。 Paxos证明了在这种机制下,只要挂掉的节点小于半数,则能实现系统的共识。 ---------------------------------------------------------------------------- Raft: Paxos协议是第一个被证明的一致性算法,但是Paxos的论文非常难懂,导致基于Paxos的工程实践和教学都十分头疼,于是Raft在设计的过程中,就从可理解性出发,使用算法分解和减少状态等手段,目前已经应用非常广泛。可以这么理解,Raft改进了Paxos的机制,便于理解和在实际场景中编程实现。 ---------------------------------------------------------------------------- 冷存储: 该术语指的是离线保存比特币。当比特币的私钥被创建,同时将该私钥存储在安全的离线环境时,就实现了冷存储。冷存储对于任何比特币持有者来说是重要的。在线计算机在黑客面前是脆弱的,不应该被用于存储大量的比特币。 ---------------------------------------------------------------------------- 染色币: 比特币2.0开源协议允许开发者在比特币区块链之上,利用它的超越货币的功能创建数字资产。 ---------------------------------------------------------------------------- 确认: 当一项交易被区块收录时,我们可以说它有一次确认。矿工们在此区块之后每再产生一个区块,此项交易的确认数就再加一。当确认数达到6及以上时,通常认为这笔交易比较安全并难以逆转。 ---------------------------------------------------------------------------- 共识: 当网络中的许多节点,通常是大部分节点,都拥有相同的本地验证的最长区块时,称为共识。不要与共识规则混淆。 ---------------------------------------------------------------------------- 共识机制: 比特币网络是公开的,因此一致性协议的稳定性和防攻击性十分关键。 比特币区块链采用了 PoW 的机制来实现一致性选择。 目前,Proof of 系列中比较出名的一致性协议包括 PoW 和 PoS,都是通过经济惩罚来限制恶意参与。 ---------------------------------------------------------------------------- 共识规则: 全节点与其他节点保持共识的区块验证规则。不要与共识混淆。 ---------------------------------------------------------------------------- 难度: 整个网络会通过调整“难度”这个变量来控制生成工作量证明所需要的计算力。 ---------------------------------------------------------------------------- 难度重定: 全网中每新增2016个区块,全网难度将重新计算,该新难度值将依据前2016个区块的哈希算力而定。 ---------------------------------------------------------------------------- 难度目标: 使整个网络的计算力大致每10分钟产生一个区块所需要的难度数值即为难度目标。 ---------------------------------------------------------------------------- 双重支付: 双重支付是成功支付了1次以上的情况。比特币通过对添加到区块中的每笔交易进行验证来防止双重支付,确保交易的输入没有被支付过。 ---------------------------------------------------------------------------- ECDSA: 椭圆曲线数字签名算法(ECDSA)是比特币使用的加密算法,以确保资金只能被其正确拥有者支付。 ---------------------------------------------------------------------------- 超额随机数: 随着难度增加,矿工通常在循环便利4亿次随机数值后仍未找到区块。因为coinbase脚本可以存储2到100字节的数据,矿工开始使用这个存储空间作为超额nonce空间,允许他们利用一个更大范围的区块头哈希值来寻找有效的区块。 ---------------------------------------------------------------------------- 矿工费: 交易的发起者通常会向网络缴纳一笔矿工费,用以处理这笔交易。大多数的交易需要0.5毫比特币的矿工费。 ---------------------------------------------------------------------------- 分叉: 分叉也被称为意外分叉,是在两个或多个区块拥有同一区块高度时发生的,此时使区块链产生了分叉。典型情况是两个或多个区块矿工几乎在同一时刻发现了区块。共识攻击的情况下也会出现分叉。 ---------------------------------------------------------------------------- 创世块: 创世区块指区块链上的第一个区块,用来初始化相应的加密货币。 ---------------------------------------------------------------------------- 硬分叉: 硬分叉,也叫硬分叉改变,是区块链中一个永久分歧。通常在已按照新的共识规则进行了版本升级的节点产生了新区块时,那些未升级节点无法验证这些新区块时产生硬分叉。不要与分叉、软分叉或者Git分叉混淆。 ---------------------------------------------------------------------------- 硬件钱包: 硬件钱包是一种特殊的比特币钱包,硬件钱包可以将用户的私钥存储在安全的硬件设备中。 ---------------------------------------------------------------------------- 哈希: 二进制输入数据的一种数字指纹。 ---------------------------------------------------------------------------- 哈希锁: 哈希锁是限制一个输出花费的限制对象,其作用一直持续到指定数据片段公开透露。哈希锁有一个有用的属性,那就是一旦任意一个哈希锁被公开打开,其他任何安全使用相同密钥的哈希锁也可以被打开。这使得可能创建多个被同意哈希锁限制的输出,这些支出将在同一时间被花费。 ---------------------------------------------------------------------------- HD协议: 层级确定性(HD)密钥创建和传输协议(BIP32),该协议允许按层级方式从父密钥创建子密钥。 ---------------------------------------------------------------------------- HD钱包: 使用创建层次确定的钥匙和BIP32传输协议的钱包。. ---------------------------------------------------------------------------- HD钱包种子: HD钱包种子或根种子是一个用于为HD钱包生成主私钥和主链码所需种子的潜在简短数值。 ---------------------------------------------------------------------------- 哈希时间锁定合约: 哈希时间锁定合约(HTLC)是一类支付方式,其使用哈希锁和时间锁来锁定交易。解锁需要接收方提供通过加密支付证明承认在截止日期之前收到了支付,或者接收方丧失了认领支付的能力,此时支付金额将返回给支付方。 ---------------------------------------------------------------------------- KYC: 充分了解你的账户(KYC,Know yourcustomer)是一个商业过程,用于认证和验证顾客的身份信息。也指银行对这些活动的监管。 ---------------------------------------------------------------------------- LevelDB: LevelDB是一个开源的硬盘键值对数据库。LevelDB是一个用于持久性绑定多个平台的轻量级、单用途的库。 ---------------------------------------------------------------------------- 锁定时间: 锁定时间(技术上来说是nLockTime)是交易的一部分,其表明该交易被添加至区块链中的最早时间或区块。 ---------------------------------------------------------------------------- 交易池: 比特币内存池是区块中所有交易数据的集合,这些交易已经被比特币节点验证,但为被确认。 ---------------------------------------------------------------------------- 随机数: 随机数是比特币区块中一个32位(4字节)的字段,在设定了该值后,才能计算区块的哈希值,其哈希值是以多个0开头的。区块中的其他字段值是不变的,因为他们有确定的含义。 ---------------------------------------------------------------------------- 离线交易: 离线交易是区块链外的价值转移。当在链交易(通常简单来说就是一个交易)修改区块链并依赖区块来决定它的有效性时,离线交易则依赖其他方法来来记录和验证该交易。 ---------------------------------------------------------------------------- 操作码: 操作码来源于比特币脚本语言,通过操作码可以在公钥脚本或签名脚本中实现压入数据或执行函数的操作。 ---------------------------------------------------------------------------- 开放资产协议: 开放资产协议是一个建立在比特币区块链纸上简单有效的协议。它允许用户创建资产的发行和传输。开放资产协议是颜色币概念的一个进化。 ---------------------------------------------------------------------------- OP_RETURN: 一个用在OP_RETURN交易中的一种输出操作码。不要与OP_RETURN交易混淆。 ---------------------------------------------------------------------------- OP_RETURN交易: OP_RETURN在比特币核心0.9.0中默认的一种被传播和挖出的交易类型,在随后的版本中添加任意数据至可证明的未花费公钥脚本中,全节点中无需将该脚本存储至他们的UTXO数据库中。不要与OP_RETURN操作码混淆。 ---------------------------------------------------------------------------- 孤块: 孤块由于父区块未被本地节点处理的区块,所以他们还不能被完全验证。 ---------------------------------------------------------------------------- 孤立交易: 孤立交易是指那些因为缺少一个或多个输入交易而无法进入交易池的交易。 ---------------------------------------------------------------------------- 交易输出: 交易输出(TxOut)是交易中的输出,交易输出中包含两个字段:1.输出值字段:用于传输0或更多聪;2.公钥脚本:用于确定这些聪需在满足什么条件的情况下才可花费。 ---------------------------------------------------------------------------- P2PKH: 支付到比特币地址的交易包含支付公钥哈希脚本(P2PKH)。由P2PKH脚本锁定的交易输出可以通过给出由相应私钥创建的公钥和数字签名来解锁(消费)。 ---------------------------------------------------------------------------- P2SH: P2SH是一种强大的、新型的、且能大大简化复杂交易脚本的交易类型而引入。通过使用P2SH,详细描述花费输出条件的复杂脚本(赎回脚本)将不会出现在锁定脚本中。相反,只有赎回脚本哈希包含在锁定脚本中。 ---------------------------------------------------------------------------- P2SH地址: P2SH地址是基于Base58 编码的一个含有20 个字节哈希的脚本。P2SH地址采用“5”前缀。这导致基于Base58 编码的地址以“3”开头。P2SH 地址隐藏了所有的复杂性,因此,运用其进行支付的人将不会看到脚本。 ---------------------------------------------------------------------------- P2WPKH: P2WPKH签名包含了与P2PKH花费相同的信息。但是签名信息放置于见证字段,而不是签名脚本字段中。公钥脚本也被修改了。 ---------------------------------------------------------------------------- P2WSH: P2WSH与P2SH的不同之处在于加密证据存放位置从脚本签名字段转变至见证字段,公钥脚本字段也被改变。 ---------------------------------------------------------------------------- 纸钱包: 在大多数特定含义下,纸钱包是一个包含所有必要数据的文件,这些数据用于生成比特币私钥,形成密钥钱包。然而,人们通常使用该术语来表达以物理文件形式离线存储比特币的方式。第二个定义也包括纸密钥和可赎回编码。 ---------------------------------------------------------------------------- 支付通道: 微支付通道和支付通道是 设计用于允许用户生成多个比特币交易,且无需提交所有交易至比特币区块链中。在一个典型的支付通道中,只有两个交易被添加至区块链中,但参与双方可以生成无限制或接近无限制数量的支付。 ---------------------------------------------------------------------------- 奖励: 每一个新区块中都有一定量新创造的比特币用来奖励算出工作量证明的矿工。现阶段每一区块有12.5比特币的奖励。 ---------------------------------------------------------------------------- RIPEMD-160: RIPEMD-160是一个160位的加密哈希函数。RIPEMD-160是RIPEMD的加强版,其哈希计算后的结果是160位哈希值。通过RIPEMD-160加密期望能实现在未来的10年或更长时间都是安全的。 ---------------------------------------------------------------------------- 中本聪: 中本聪有可能是一个人或一群人的名字。中本聪是比特币的设计者,同时也创建了比特币的最初实现,比特币核心。作为实现的一部分,他们还发明了第一个区块链数据库。在这个过程中,他们是第一个为数字货币解决了双花问题的人或组织。但他们的真实身份仍然未知。 ---------------------------------------------------------------------------- 脚本: 比特币使用脚本系统来处理交易。脚本有着类Forth语言、简单、基于堆栈以及从左向右处理的特点。脚本故意限定为非图灵完备的,没有循环计算功能。 ---------------------------------------------------------------------------- ScriptPubKey (公钥脚本): 脚本公钥或者公钥脚本是包含在交易输出中的脚本。该脚本设置了比特币花费需满足的条件。满足条件的数据可以由签名脚本提供。 ---------------------------------------------------------------------------- ScriptSig (签名脚本): 签名脚本是有支付端生成的数据,该数据几乎总是被用作满足公钥脚本的变量。 ---------------------------------------------------------------------------- 秘钥 (私钥): 用来解锁对应(钱包)地址的一串字符,例如5J76sF8L5jTtzE96r66Sf8cka9y44wdpJjMwCxR3tzLh3ibVPxh+。 隔离见证:隔离见证是比特币协议的一个升级建议,该建议技术创新性地将签名数据从比特币交易中分离出来。隔离见证是一个推荐的软分叉方案;该变化将从技术上使得比特币协议规则更严谨。 ---------------------------------------------------------------------------- SHA: 安全哈希是有NIST(国家标准技术研究所)发布的加密哈希函数族。 软分叉:软分叉是区块链中的一个短暂分叉,通常是由于矿工在不知道新共识规则的情况下,未对其使用节点进行升级而产生的。不要与分叉、硬分叉、软分叉或者Git分叉混淆。 ---------------------------------------------------------------------------- SPV (简化支付验证): 简化支付验证是在无需下载所有区块的情况对特定交易进行验证的方法。该方法被用在一些比特币轻量级客户端中。 旧块:旧块是那些被成功挖出,但是没有包含在当前主链上的区块,很有可能是同一高度的其他区块优先扩展了区块链长度导致的。 时间锁:时间锁是一种阻碍类型,用于严格控制一些比特币只能在将来某个特定时间和区块才能被支出。时间锁在很多比特币合约中起到了显著的作用,包括支付通道和哈希时间锁合约。 ---------------------------------------------------------------------------- 环签名: 环签名由 Rivest,shamir 和 Tauman 三位密码学家在 2001 年首次提出。环签名属于一种简化的群签名。 签名者首先选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的其他成员可能并不知道自己被包含在其中。 ---------------------------------------------------------------------------- 数字证书: 数字证书用来证明某个公钥是谁的。 对于数字签名应用来说,很重要的一点就是公钥的分发。一旦公钥被人替换,则整个安全体系将被破坏掉。 怎么确保一个公钥确实是某个人的原始公钥?这就需要数字证书机制。顾名思义,数字证书就是像一个证书一样,证明信息和合法性。由证书认证机构(Certification Authority,CA)来签发。 数字证书内容可能包括版本、序列号、签名算法类型、签发者信息、有效期、被签发人、签发的公开密钥、CA 数字签名、其它信息等等。其中,最重要的包括 签发的公开密钥、CA 数字签名 两个信息。 因此,只要通过这个证书就能证明某个公钥是合法的,因为带有 CA 的数字签名。更进一步地,怎么证明 CA 的签名合法不合法呢?类似的,CA 的数字签名合法不合法也是通过 CA 的证书来证明的。 主流操作系统和浏览器里面会提前预置一些 CA 的证书(承认这些是合法的证书),然后所有基于他们认证的签名都会自然被认为合法。 ---------------------------------------------------------------------------- 同态加密: 同态加密(Homomorphic Encryption)是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果,即对密文直接进行处理,跟对明文进行处理再加密,得到的结果相同。从代数的角度讲,即同态性。 如果定义一个运算符 $$\triangle{}$$,对加密算法 E 和 解密算法 D,满足: $$ E(X\triangle{}Y) = E(X)\triangle{} E(Y) $$ 则意味着对于该运算满足同态性。 同态性在代数上包括:加法同态、乘法同态、减法同态和除法同态。同时满足加法同态和乘法同态,则意味着是 代数同态,即 全同态。同时满足四种同态性,则被称为 算数同态。 同态加密的问题最早是由 Ron Rivest、Leonard Adleman 和 Michael L. Dertouzos 在 1978 年提出,但 第一个“全同态”的算法 到 2009 年才被克雷格·金特里(Craig Gentry)证明。 仅满足加法同态的算法包括 Paillier 和 Benaloh 算法;仅满足乘法同态的算法包括 RSA 和 ElGamal 算法。 同态加密在云时代的意义十分重大。目前,从安全角度讲,用户还不敢将敏感信息直接放到第三方云上进行处理。如果有了比较实用的同态加密技术,则大家就可以放心的使用各种云服务了。 遗憾的是,目前已知的同态加密技术需要消耗大量的计算时间,还远达不到实用的水平。 ---------------------------------------------------------------------------- 函数加密: 与同态加密相关的一个问题是函数加密。同态加密保护的是数据本身,而函数加密顾名思义保护的是处理函数本身,即让第三方看不到处理过程的前提下,对数据进行处理。 该问题已被证明是不存在对多个通用函数的任意多 key 的方案,目前仅能做到对某个特定函数的一个 key 的方案。 ---------------------------------------------------------------------------- 零知识证明(zero knowledge validation): 证明者在不向验证者提供任何有用的信息的前提下,使验证者相信某个论断是正确的。 例如,A 像 B 证明自己有一个物品,但 B 无法拿到这个物品,无法用 A 的证明去向别人证明自己也拥有这个物品。 ---------------------------------------------------------------------------- 侧链: 允许资产在比特币区块链和其它链之间互转。降低核心的区块链上发生交易的次数。也来自比特币社区, 2013 年 12 月提出,2014 年 4 月成立项目。通过简单地复用现有比特币的方式,实现比特币和其他帐簿资产在多个区块链间的转移。 ---------------------------------------------------------------------------- P2SH脚本: 输出脚本由支付者创建,他们(钱花出去之后)不怎么关心他们消费的比特聪的长期安全或者对别人是否有用。 收款人则关心输出脚本指定的条件。如果收款人愿意,他们可以请求支付者使用某种特定脚本。遗憾的是,定制的脚本没有短小的比特币地址方便,也不像P2PKH的公钥哈希方案( P2PKHpubkey hashes)那样容易保护。 为了解决这些问题,“支付到脚本哈希”(P2SH)交易在2012年被创建,它让支付者创建一个输出脚本,里边包含另一个脚本的哈希,另一个脚本称为“认领脚本”。