Py学习  »  区块链

区块链构架就是造房子!10分钟带你走遍构建全程

区块链大本营 • 5 年前 • 365 次点击  

你是否有这种感觉,虽然零零散散看过不少区块链知识,但还是感觉对区块链很陌生,也没有形成自己的知识结构。

 

本文作者Taylor Pearson,是The End of Jobs专栏作家、企业家,过去三年曾与数百名企业家互动交流。他喜欢研究创新型技术,对区块链技术有较深入的研究。

 

在这篇文章中,Taylor将带你了解基元、加密哈希函数、Merkle树、工作量证明等技术,帮助你构建区块链技术框架,对区块链有一个全面的认识。


好啦,有点等不及了?下面就让我们一起去了解区块链的完整技术吧。

作者 | Taylor Pearson

编译 | Eli



2008年,一个叫做中本聪(Satoshi Nakamoto)的人(或团体)定义了第一个区块链。


2009年1月,中本聪将区块链作为比特币的核心组成部分推出,它是网络上所有交易的公共分类帐。


由于使用了区块链技术,比特币成为了第一个解决双重支付问题的数字货币,它不再需要第三方信任机构,并且成为其他许多应用创新的技术基础。


我相信在一百年后,区块链将像今天的电力一样普遍。它会变得像经济体的基本组成部分一样,为每个人服务。也会像水一样平常,以至于我们往往会忽视它的存在。


可以预料的是,在接下来的几十年中,区块链应用和组织将呈爆炸式增长,就像几十年前的互联网或上世纪初的电气化一样。


如果上述一切成真,那么我们很有必要对区块链有一个基本了解,特别要知道它们的重要性以及它们的工作机制。



区块链为什么重要?


“许多名人发表演讲时都会提到一句名言,尽管这句话说的并不怎么正确:我们应该培养思考行为的习惯。但文明的进步却是由越来越多无需思索却得以运行的重要操作推动。”

——Alfred North Whitehead(艾尔弗雷德·诺思·怀特海,现代著名数学家、哲学家和教育理论家)


以区块链中一方将比特币发送给另一方的交易为例,该交易中诸如比特币来源、目的地和日期/时间戳等细节会被添加到区块中。


由于密码学的使用,区块链极大地提高了社会发展的可扩展性(social scalability),个体之间越来越多的合作,正成为文明的必要特征。


在过去的历史中,人类通常只以部落为单位,在小圈子里与有血缘关系的人交易,因为当时人类无法信任部落之外的个体。


在过去几千年中,各种各样的技术创新促使人类在更大的群体中进行合作,社交可扩展性被进一步提高。


现代法律制度的完善减少了暴力,盗窃和欺诈的发生几率,使没有预先存在关系(pre-existing relationship)的群体或个体以互动。


互联网则通过评级系统(rating system),促进了预先存在很少或根本没有社会关系的个体之间的交易。


区块链有潜力将社交可扩展性提高到以前技术所没有达到的水平。 这是我们第一次拥有一种不需要依赖可信的第三方,却能让一个互联网用户安全地将数字资产转移到另一个互联网用户的方式。如此伟大的交易创举是如何夸大也不为过的。


除此之外,数字合约、数字密钥,以及实物资产的数字所有权,包括汽车、房屋、股票、债券,以及数字货币也值得深思。



什么是区块链技术


我们先来给区块链技术下个定义:


区块链是一种分类帐,它使用加密技术和激励措施并以防篡改的方式记录交易。这使匿名双方进行信任最小化(trust-minimized)交易,而不需要可信中介。


现在,让我们整合这些零散的知识,以便你在文章的最后对区块链技术有一个完整认识。


基元


在我们深入研究区块链之前,需要建立一些基元。基元类似于建筑材料。如果你想建造一间房子,你需要木料、螺丝、电钻和锯子。在你开始建造之前,最好对每个工具都足够了解。区块链也类似。


区块链的基本构成要素就是加密基元


而密码学是研究在第三方(即敌人)的存在下安全通信的技术。


在历史上,军方已经进行了大量的密码学研究,以确保他们能够安全地进行通信,而不让敌人阅读他们的电报或无线电信息。


现代密码学被应用于网址、信用卡芯片和计算机密码之中。它用来阻止第三方(黑客,小偷等)窃取敏感数据,如信用卡信息。


第一个基本构成要素是哈希函数。


哈希函数


哈希函数是一种允许你对数据进行加密的数学函数。


哈希函数有三个属性:


它的输入可以是任意大小。


例如,我可以使用“我喜欢冰淇淋”这个短语作为输入,或者我也可以使用《战争与和平》的全部文本,两者都行。


不论使用任何大小的输入,哈希函数的特定散列算法决定了其固定大小的输出。为了让算法过于简单,我们将使用256位输出(它是比特币所使用的)。


不论我使用“我喜欢冰淇淋”这一短语作为输入,还是使用《战争与和平》的全文作为输入,两者都会产生相同大小的输出。


使用SHA 256算法,短语“我喜欢冰淇淋”(没有引号)创建输出:

138F4504A873C01D0864343FAD3027F03CA9BEA2F0109005FA4FC8C7DCC12634


从古腾堡计划(project Gutenberg)复制的整本《战争与和平》(全587,287词)创建输出:

57027F5B3877ABBE43ACB101D59E963BC2CC0E86A6EBCCC34DFD035BBF83B096


即使输入的文本长度相差146,821倍,你也可以获得相同大小的输出。这一点很酷也很有用。


函数是可高效计算的,对于任何给定的输入字符串,你可以在合理的时间内获得输出。


即使我使用《战争与和平》的整个文本作为输入,它仍然可以在较短时间内将其转换为输出。


以上是一般哈希函数的属性。一般哈希函数允许你将大量数据映射到一个小空间,这有助于存储和处理不同类型的数据。


不过,我们应把重点放在加密哈希函数上,因为它是区块链中使用的函数。


加密哈希函数有三个附加属性:


  • 抗碰撞性(Collision Resistance)

  • 确定隐匿性(Deterministic Hiding)

  • 难题友好性(Puzzle Friendliness)



加密哈希函数


抗碰撞性


这里的碰撞是指两个不同的输入产生相同的输出。虽然输出大小相同,但输出本身不会与其他输出相同。“我喜欢冰淇淋”与《战争与和平》的整个文本产生相同大小的输出,但字符不同。


如果它们产生完全相同的输出,你解密了我发送给你的加密文本之后,并不会知道我是想告诉你“我喜欢冰淇淋”还是你应该阅读《战争与和平》。


值得注意的是,两个“邻近”输入不会产生邻近的输出。《战争与和平》的哈希与改变了一个字符的《战争与和平》的哈希完全不同。


使用SHA 256,整本《战争与和平》生成哈希值:

57027F5B3877ABBE43ACB101D59E963BC2CC0E86A6EBCCC34DFD035BBF83B096


如果我删除最后一个句点,但保留其他所有内容,则会生成哈希值:

E2E2E4FFD582E20474F0310C2132EAE5F2D766C6A253C1BC4AF57861095B30FA


这非常类似于混沌系统中的两个“邻近”起点非常迅速地导致两个完全不同的未来轨迹。哈希函数的这种“混乱不规则性”会产生抗碰撞性。它的输出几乎随机(理论上并不随机),因此不太可能发生碰撞。我们还能压缩数据,因为它可以将「无穷大」映射到有限空间。


这一特性在汇款时尤其重要。钱包的公钥是使用加密哈希函数从私钥生成的。谁都不希望其他人能够通过逆向工程获取公钥来计算你的私钥(因为你的钱可能被偷)。


如果没有人能找到碰撞的情况,则可以认为哈希函数是抗碰撞的。从理论上讲,我们知道碰撞的存在是因为输入的数量是无限的,但输出的数量是有限的——只有有限种方法可以排列64个字符。


但在实践中,加密哈希函数SHA 256是抗碰撞的,因为没有人发现过碰撞,并且它发生的几率是天文数字。如果人类制造的每台计算机自宇宙开始以来一直试图发现碰撞,那么它发生的可能性低于地球在接下来的两秒钟内被巨大的流星摧毁的可能性。


所以,碰撞是可能发生的,但我们首先还有很多其他更重要的问题要解决。


确定隐匿性


哈希值看起来是随机的,但实际上是确定的。因此,它们的输出是可重现的,只要你使用相同的输入,就可以持续获得相同的输出。这意味着,知道输入的两方可以通过向第三方显示他们的哈希来验证对方是否知道输入


加密哈希函数的第二个属性是隐匿性。隐匿性意味着即便给出输出,也没有可行的方法来计算输入。


也就是说,第三方观察者无法知道

138F4504A873C01D0864343FAD3027F03CA9BEA2F0109005FA4FC8C7DCC12634

的意思是“我喜欢冰淇淋。”


但是,如果我知道输入是“我喜欢冰淇淋”,那么通过检查你的哈希,我可以轻松验证你是否知道输入。


然而,如果其他人看到哈希,他们就无法使用它来计算输入。这允许知道输入的人使用散列后的输出在公共频道中安全地进行通信,而不必担心第三方观察者获取信息。


难题友好性


第三个属性是加密哈希函数的难题友好性。这意味着如果有人想要生成一个与“我喜欢冰淇淋”相同的输出的哈希,那么找到一个完全符合这一输出的另一个值是非常困难的。


生成哈希的算法是尝试每个可能的字符串,按长度排序,然后按字母顺序排序,直到得到哈希为相同值的字符串。这等于是大海捞针,所以我们得到的概率表明,小行星消灭地球上的所有生命是一个更紧迫的问题。


另一方面是加密哈希函数难以逆转(reverse)。相较于数据结构或压缩算法中使用的哈希,这是加密哈希的主要特点。


这也是区块链军备竞赛的一部分——黑客在逆向推演哈希函数方面做得越来越好,因此密码学家总是得想出更强大的哈希函数。


除此之外,难题友好属性使区块链难以篡改。如果我想替换像“我喜欢冰淇淋”这样的项,我不可能在没有其他参与者知道的情况下做到。






被加密哈希函数散列后,输入的微小变化也会导致输出的显著不同,从而达到防篡改的目的。


加密哈希函数看起来是随机的(因此没有碰撞),无法逆转,并隐匿输入,但同时它们又是完全确定的。这就是它们有用的原因!


这就是加密哈希函数的基础知识,下面我们来谈谈如何用这些哈希函数来构建区块链。



区块链内的传递哈希函数


上面关于哈希函数的部分实际上只是对如何散列单个信息(例如书籍或密码中的单词)的详细介绍。


如果你想要散列数据集合(如一堆文档或一系列交易),该怎么办?


让我们从「连续散列的线性序列」讲起。首先从一些数据A开始,然后将其散列以获得A#。


现在你想“混入”数据B。所以只需要添加B(A#+ B)并获取整个数据的哈希值。现在你有了一个新的哈希(B#),它包含一些关于A(来自你使用的哈希A#)和B的信息。


你得到的是一个改变A或B的任何东西都会产生不同的最终哈希值的哈希函数。这是一个传递哈希函数。





当人们谈起区块链,其中一个被大量提到的词是“信任最小化”。


一般而言,哈希,特别是哈希指针,是区块链信任最小化属性的核心组件。哈希指针只是指向某些其他数据结构(如前一个区块)的哈希。


这是一个了不起的组件,因为它很容易看出是否有人篡改数据。


假设我们有一个包含100个区块的区块链,而第十个区块包含整个《战争与和平》文本的哈希,我在文本中更改了一个字母,它将改变该区块和所有后续区块中的哈希指针。


哈希指针确保分类帐的完整性(即不被修改)。区块链被称为三重登帐(triple entry accounting)的原因是哈希指针这种数据结构难以被篡改。


例如,如果有两个人在一个项目上进行协作,而一个人试图回去修改某些东西以便他们能赚更多的钱,那么他们的合作伙伴就会立即获悉他们正在作弊——他们最终得到的哈希是不同的。


Merkle树


现在,我们想要散列的不仅仅是一个线性序列,而是一系列集合,比如比特币在其区块序列中的交易集合。那么就需要构建的是遍历每组数据的规则,通过再次减少问题以加密连续的一系列事物(A#,B#等)。


这里就引出了Merkle树。Merkle树允许你对数据区块进行分组并将它们一起散列到一个树枝结构中。





与区块链一样,只要我们知道树的“根”处的哈希点,我们就可以知道树中任何数据是否被篡改过。


如果一个交易中的一个比特被更改,那么它会更改后续的每个哈希并显示篡改。


使用Merkle树优于仅使用记录所有交易的摘要,因为它能更快更简单地检测某特殊交易是否包含在所有交易的集合中。


区块链


在上文中,我们提到了哈希函数以及它的三个属性:抗碰撞性,确定隐匿性和难题友好性。那么接下来,我们就将加密哈希函数连接在一起以创建传递加密哈希函数。


首先,当我们将一个Merkle树添加到传递加密哈希函数时,会得到一个区块链。每个区块包含一组“merkleized”交易,并且这些区块被链接在一起。





区块链工作量证明


中本聪的伟大在于他制定了一个新规则:你必须先解决一个非常困难的数学问题,才能将一组新交易(即一个区块)添加到现有链中。


这就是“矿工”的工作。他们需要解决一个非常困难的数学问题,在解决问题后他们会收到相应的奖励。这也被称作“工作量证明”,它是解决问题所消耗计算量的证明。


“区块链工作量证明”的发明是中本聪的最大创新。


由于使用工作量证明,像比特币这样的区块链变得更有价值,矿工凭此赚到更多的钱,同时它激励更多的矿工进入网络,当然也会增加数学问题的难度。


任何人都可以在他们的计算机上下载区块链,并且连续验证每个区块是否可以正确地散列。


他们还可以通过读取每个区块的难度并验证矿工的解决方案来计算生成此数据所需的计算量。


具有最多累积工作量证明的区块链(即最困难和最昂贵的)被认为是真正的区块链。


如果你拥有包含整个当前比特币区块链的磁盘,你可以快速地估算出用于构建这些数据所消耗的巨大能量。


这样做的好处是如果没有达到相应的算力,没有人可以“伪造”比特币区块链


至2018年中,如果从头开始构建比特币区块链,可能需要花费数十亿美元购买计算机和电力。


数字签名(即私钥/公钥加密)


数字签名是架构区块链的最后基元。可行的数字签名方案与手写签名大致相同,它们都具有两个核心属性。


首先是可验证性。如果我使用私钥签署交易,则其他人必须能够使用我的公钥对其进行验证。类似的,只有你自己可以签署自己的签名,但任何人都可以看到它是你签署的。


私钥和公钥匹配为密钥对。私钥不与其他人共享,它用于签署并证明交易。


公钥则可以提供给每个人,他们用公钥验证你的签名,而无需他们自己签名。


你的公钥是私钥的哈希值。而你的地址(例如接收比特币的地址)是你的公钥的哈希值。


如下所示:

私钥==散列==>公钥==散列==>地址


由于加密哈希函数的隐匿性,你可以毫无顾虑地发布自己的地址,其他人可以向你发送比特币、以太币等加密货币,却无法反向找出你的私钥。


第二个属性是不可伪造性。你的签名与特定文档相关联。自然地,你不会希望其他人能够从一个文件中“剪掉”你的签名再将其粘贴到另一个文件的底部。


比特币使用椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm)来实现这两个属性。其他区块链和数字加密货币使用不同的数字签名方案,但都具有可验证性和不可伪造性这两个属性。


区块链类似于书籍


我认为将区块链视作书籍可能是研究它的最简单的方法。一本书是一系列页面:


  1. 数据——每页上的文字。

  2. 元数据——元数据是信息本身。在每一页的顶部或底部,有一些关于书籍的信息,如书名,章节标题和页码。


区块链是一系列的区块:


  1. 数据——区块的内容

  2. 元数据——对前一个区块的引用和该区块中包含的数据的哈希。


即便你撕下书中所有页面,你仍可以重新按照页码组合它们。


同样,在区块链中,每个区块都引用前一个区块的哈希值,从而可以验证交易发生的顺序。


哈希实际上比页码更强大,因为哈希包含该页面的所有数据。而撕下一本书中的某一页并涂改其他相关页码是有可能骗过你的。


然而在区块链“书”中执行相同的操作是极其困难的,因为更改页面上的任何一个字母都会改变哈希值。



区块链技术的演变


现在,让我们组合这些基元,看看它们如何构建简单的区块链。


以下这些类型的区块链是比特币和以太坊等数字加密货币的基础。了解它们的工作原理对理解其他所有区块链和数字加密货币都有帮助。


Goofy Coin


GoofyCoin是我们可以设想的最简单的区块链。


Goofy可以随时创造新的虚拟货币,并且这些新创造的虚拟货币归他所有。每一个币有Goofy用私钥签名的唯一ID,这样所有人都可以使用Goofy的公钥来确认币是有效的GoofyCoin。





拥有Goofycoin的人可以通过加密操作将其转移给其他人。如果Goofy想要将一枚虚拟货币转移给Alice,他会创建一个交易,说“将这笔钱(this coin)交给Alice”。 


因为Goofycoin只能通过加密操作发送,所以“this”是指向所讨论虚拟货币的哈希指针。Goofy用他的私钥签署此交易,使其成为有效的交易。任何人都可以通过确认Goofy的签名来检查它是否为有效的交易。





但是,事实上GoofyCoin存在安全问题,Alice可以用她刚获得的虚拟货币进行一项交易,比如向Bob支付三明治的费用。






但是,如果Alice又使用它来购买Chuck的奶昔呢?





Bob和Chuck都会认为他们现在拥有一枚GoofyCoin。它们看起来都像是有效的交易,因为Chuck和Bob可以看到Alice的签名并在区块链上追踪它,并发现它是有效货币。


这种情况被称为双重支付攻击。我们当然不能容忍用同一枚虚拟货币既买到三明治又买到奶昔。


双重支付攻击是功能性加密货币需要防范的主要问题之一。


为了解决双重支付问题,我们需要创建一个名为ScroogeCoin的新虚拟货币。


ScroogeCoin


ScroogeCoin类似于GoofyCoin,但有做出了一些不同的改变。


与GoofyCoin不同的是,Scrooge发布了一个包含所有交易历史的区块链。


Scrooge会签署区块链中每个区块的哈希指针。那么任何人都可以通过检查区块上的Scrooge签名来验证交易是否有效。





因为Scrooge查看过每笔交易,所以他可以确保没有人双重支付。如果Alice使用虚拟货币从Bob那里购买三明治,Scrooge能通过拒绝验证该交易来防止Alice使用该货币从Chuck处购买奶昔。


因为所有区块都由哈希指针连接到区块链中,所以Alice、Bob、Chuck和其他任何使用ScroogeCoin的人都可以监视Scrooge是否回去更改过数据。由于Scrooge是区块链的控制者,他们无法阻止Scrooge更改数据,但他们至少是知情的。


假设一年前,Alice买了Bob的三明治并支付了1个ScroogeCoin,Scrooge将交易记录改变成Alice支付了10个ScroogeCoin,那么后续每个区块的哈希指针都会发生变化。人们很容易知道Scrooge已经篡改了数据。这就是我们之前提到的难题友好属性。


这样做能提升人们对区块链中数据的信任。


ScroogeCoin的工作原理是让每个人知道哪些货币有效。只要Scrooge监控所有交易并拒绝双重支付,双重支付问题就不存在了。同时区块链上的所有参与者也可以确认Scrooge的验证。


ScroogeCoin的潜在问题在于Scrooge本人。如果Scrooge愿意,他可以通过几种方法让自己暴富。比如要求参与交易的每个人为交易支付大笔小费,或者他可以自己创建一堆ScroogeCoin,或者他可能仅仅是因为感到无聊而停止验证交易。


简而言之,问题出在中心化。尽管Scrooge很开心,但用户可能对系统并不满意。这个系统与我们现在使用的中心化系统没有什么不同。






Scrooge:“别担心,我很诚实的。”


你可以将“Scrooge”替换为其他许多银行的名字,Scrooge与现有银行系统的运作方式没有什么不同。在大多数情况下,我们相信银行或其他金融中介不会篡改交易,因为这些机构受到国家监管并与同业竞争。由于现存银行系统运作良好,许多人特别是发达国家的人不能看到区块链的价值所在。


但是,现存银行系统并不是百分之百可靠。当一个国家制造过多的钞票时会出现恶性通货膨胀。比如,20世纪30年代的魏玛共和国,2000年初的阿根廷和津巴布韦,以及2010年的委内瑞拉。


以上这些情况相当于Scrooge为自己制作大量的Scrooge货币。



区块链如何实现去中心化:公共区块链与私有区块链


区块链从中心化(例如ScroogeCoin)转向去中心化主要有两种方式。


  • 私有区块链(即Permissioned blockchains)

  • 公共区块链(即Permissionless blockchain)


公共区块链和私有区块链之间的区别,在于允许加入网络的身份限制。


公共区块链网络是完全开放的,任何人都可以加入。比特币和以太坊就是典型的公有链。


私有区块链网络则需要邀请。它对允许参与网络或交易的身份设置限制。MultiChain,R3的Corda,Hyperledger Fabric和Chain Core是典型的私有区块链。


身份限制如此重要是因为它影响了去中心化的实现程度。在ScroogeCoin的示例中,它遇到了同样的中心化问题,即单个的受信任第三方控制整个系统。


公共区块链由加密经济学和加密货币挖掘机制保证运行。(即,使用经济激励、博弈论、密码学和计算机科学等技术来保证分类账的一致性)。


私有区块链由其共识过程预先选定的一组参与者(例如,个人、公司和联盟成员)控制。例如,你可以拥有15个库,并且每个库都有权写入分类帐,每个库必须对每个区块进行签名才能使该区块有效。


它比仅使用单一方验证所有交易的区块链更加去中心化。



要点概括


文章开头我们讨论了区块链为何如此重要:它允许大量没有预先存在社会关系的个体进行交易。


接着我们探索了区块链的基元即加密哈希函数,它具有三个重要属性:


  • 抗碰撞性

  • 确定隐匿性

  • 难题友好性


然后,我们介绍了哈希函数如何串联成一个传递哈希函数。当我们将Merkle树添加到传递加密哈希函数时,我们得到一个区块链。每个区块包含一组“merkleized”交易,并且块被链接在一起。





紧接着我们讲解了比特币使用一种称为工作量证明的技术来确保区块链的安全性。


下一步,我们设计了Goofycoin和Scroogecoin,由此看到区块链技术如何进化并完美解决双重支付问题。


最后,我们谈到了私有链与公有链在实现去中心化机制上的区别。


区块链仍然是一项非常年轻的技术,在2009年才问世,我们可以预料到在未来几十年内,大量的区块链应用和网络会呈爆炸式增长。


目前已有数千个不同的项目致力于提升区块链技术并研究其在各领域的应用。相信读完这篇文章,你也已经对区块链技术背后的基本要素以及区块链的工作原理有了一个整体的认识。


最后,我认为,下一代区块链技术的最大创新尚未出现, 现在就是学习和投入区块链技术最好的时间。



原文链接:

https://hackernoon.com/how-does-blockchain-technology-work-ceeeee47eaba



最新热文:



扫码加入区块链大本营读者群,群满加微信 qk15732632926 入群





了解更多区块链技术及应用内容

敬请关注:


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/dtpOiH4EyO
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/21712
 
365 次点击