标签 区块链 下的文章

编者按:本系列区块链文章改编自网络文章,本文主要基于 Vegard Nordahl & Meghana Rao 的文章,并补充修订了部分内容。

我们为什么要写这个博客?

想象一下,你穿越到 1990 年代早期。当时,互联网还处于起步阶段,老百姓几乎没有理解它是如何运作的。

1993 年,全球互联网用户总数约为 1400 万,整个互联网由大约 130 个网站组成(ourworldindata.org)。大多数人都听说过互联网,但是对于绝大多数人来说,还很难看到它的前景。

1995 年左右,风险投资开始意识到万维网的巨大潜力,互联网从默默无闻变为主流。数百万美元投入到初创公司中,通常只包括一小部分程序员和一个涉及互联网的想法。尽管如此,人们对互联网还是持怀疑态度,大规模采用似乎还远未确定。

“我预测互联网将很快成为超新星,并在 1996 年灾难性地崩溃。”
—— 以太网发明者 Robert Metcalfe,InfoWorld,1995 年

“事实上,在线数据库不会取代你的日报,光盘不会可以取代一个称职的老师,计算机网络也不会改变政府的工作方式。”

  • 新闻周刊,1995年

一年后,互联网拥有了 7500 万用户。到 1999 年,它已在全球范围内增长到 2.8 亿用户。

两年后 Robert Metcalfe 在万维网大会上不得不“吃掉他的话”,他将他的专栏副本与一些水混合,在观众面前吃下去(wired)。而新闻周刊于 2012 年停止了纸质印刷,改为纯在线方式发售……

那么, Robert Metcalfe 和新闻周刊在互联网趋势的判断上出了什么问题呢?我们认为,他们严重低估了互联网减少低效从而提高人类创造价值的能力。互联网现在渗透到我们生活的各个方面的真正原因是它使得个人和企业的效率大大提高了。

今天,由于区块链这个技术创新的出现,人类又一次站在一个潜在的效率飞跃的十字路口。风投已开始意识到区块链的巨大潜力,向初创公司投入大量资金,这些公司通常只包括一小组程序员和一个涉及区块链的想法(weusecoins.com)。与此同时,老百姓对区块链的运作方式几乎没有了解。

本博客试图向小白们介绍区块链,让他们了解这项技术并教他们如何成为参与者。在本博客的过程中,我们将深入探讨区块链的一些技术方面,探索其用例,分析不同的区块链,为初学者提供分步指南。

区块链,一场会计革命

虽然区块链通常被认为是计算机技术的进步,但它更容易被理解为会计的进步。本质上讲,会计的任务是追踪交易和价值所有权。仔细思考的话,你会发现所有权是一种模糊的概念。所有权不是物品的固有属性。相反,所有权完全由共识决定。你可以在一个物体上写下你的名字或在房产上插上你自己的旗帜,但你必须能说服你社会中的其他人同意这是真正属于你的资产。既然所有权不是内在属性,我们如何在任何时间确定所有权?我们如何建立一个系统来确保所有权信息是安全的,并且不会被恶意用户改变?

这不是一个简单的问题,随着我们的社会变得越来越复杂,人类发明了越来越聪明的解决方式。在现代社会,确定和记录所有权的方式因资产类型而异,但通常可归结为以下内容。

当前的所有权跟踪系统
当前,物品、资产或创意的所有权由我们的法律系统决定,通常涉及书面或数字的所有权记录(例如,土地所有权、收据、版权文件、专利等)。当两个非信任方之间发生所有权转让时,我们依靠银行或政府组织等中介机构来获取信任、真实性和确定性。对于数字或非实物资产(如货币、股票、知识产权或数字媒体)尤其如此。如果两个人都声称对同一资产拥有所有权,或者记录的合法性存在争议,则通过法院或法庭来解决争议,确定所有权。

我们目前的所有权跟踪系统复杂、效率低、不是特别可靠,而且往往不是很透明。这包括让中间人参与并使文档难以伪造/复制。这就是为什么许多国家要求您支付印花税或其他税款,以使结婚证书和土地所有权等文件具有法律约束力和可执行性。这也是为什么需要 3 天才能汇款给国外的亲戚。中间人必须确保资金进入和离开正确的账户,并确保适当的记录完整无缺。所有信息记账的情况都是如此,它们的准确性至关重要,例如支付和货币系统、资产管理、监管合规和审计、房地产、记录管理、身份管理、投票、税收等。
这就是区块链技术的用武之地。

区块链本质上是一种会计工具,它大大简化了这一过程,并提供了一个不依赖中介的记录保存系统,而且它具有以下特点:

  • 快速高效
  • 不受伪造/黑客攻击
  • 可靠
  • 不可更改(一旦信息被锁定,就无法更改)
  • 透明
  • 不需要双方之间的信任

区块链的内部运作

简而言之,区块链是一个数据库,它包含不断增长的安全加密信息链接块,这些信息块通过独立的分散节点网络进行复制和分发。

是不是有点拗口?下面简单介绍下。

在区块链术语中,“ block ”只是被认为同时发生的信息的集合。想象它的最简单方法是将单个块想象为一个电子表格。

电子表格中的每一行都包含一条信息,例如交易信息,例如“Vega 向 Meg 发送 4 美元”。最终,电子表格块“完成”并链接到链中的前一个块。

然后,新添加的块被广播到网络中的每个节点。节点是用于区块链的计算机。

结果是包含数百万行信息的长链电子表格,复制并存储在不同的节点上。由于任何人都可以将计算机设置为节点,因此您最终会在全球范围内建立庞大的公有计算机网络,这些都有助于整个区块链的健康和安全。

让我们看一个具体的例子来准确理解信息如何通过区块链传输。Joe 想要使用世界上最知名的区块链 —— 比特币区块链将 $5 发送给 Jane。要做到这一点,Joe 所要做的就是在他的计算机上写出这笔交易的代码并将其广播到比特币区块链网络。

随着区块链网络上的计算机收到此消息,它将进入一个称为 未确认事务云 unconfirmed transaction cloud 的特殊位置。

区块链网络中的每台计算机都在持续监听未确认事务云,尝试以解决特殊谜题的方式对消息进行排序(之后会详细介绍)。

当计算机设法找到解决特殊谜题的方法时,他们将其广播到区块链网络的其余部分,并获得对首个解决谜题的计算机的奖品。

然后,未确认事务云中的消息变成一个整齐的块(电子表格),并且每个计算机在验证该解决方案确实解决了特殊谜题之后,将此块附加到区块链。

每个计算机节点都将整个区块链存储在其硬盘驱动器上,并且可以独立于区块链网络上的其他节点来验证传入的消息和块。整个系统去中心化,没有单点故障。

这基本上就是比特币区块链的工作原理:

  1. 用户将交易广播到区块链网络
  2. 计算机节点以解决特殊谜题的方式竞争,获得打包事务权
  3. 当节点可以正确打包事务时,它们会将解决方案广播到网络上的所有其他节点
  4. 每个节点独立地验证解决方案
  5. 如果解决方案有效并且块中仅包含可信事务,每个节点就独立地将新块附加到区块链

与传统会计系统相比,区块链的优点是:

  • 没有单点故障:如果一台计算机突然关闭或被黑客入侵,不会打扰或损害网络的其余部分。其余的计算机将继续向区块链添加电子表格块。
  • 去中心化系统:基于区块链技术的所有权记录不受某个实体或组织的控制。
  • 超级高效:在验证传入消息时不涉及人工。建立信任不需要中间人或中间人。一切都是通过计算机代码完成的,通过独立的公有计算机网络实现完整性。
  • 完全透明性:每个电子表格上的每一行都存储在网络上的每个节点上。因此,区块链中的所有信息都是公开的,如果怀疑存在不法行为,任何人都可以对其进行检查和审查。
  • 非实名 pseudo-anonymous :区块链中不存储任何姓名或个人信息。交易和账户余额是公开的;换句话说,非实名是指每个人在区块链上有一个和真实身份无关的虚拟身份,但是这个虚拟身份做的所有事情都是透明的。

区块链安全

上面这些可能听起来很诱人,但您可能仍有疑问。

世界上存在着无数超级聪明的恶意黑客,这个方案真的安全吗?

区块链公开存储,会有严重的隐私问题吗?

可以在区块链中使用的加密保护机制中找到这两个问题的答案。要了解破解区块链多么困难,您必须了解一些基础技术。大多数区块链使用两种加密技术的组合:加密哈希函数和数字签名,实现两个目标:

  • 确保块是不可变的。也就是说,确保每个块在区块链中的特定位置,并且改变顺序或改变块的内容是不可能的。
  • 由整个区块链网络验证广播的交易确实来自帐户的私钥持有者。

这些保护机制的内部工作非常有趣,将在之后详细介绍。

许多人认为网络安全本质上是不安全的,如果有足够的时间和激励,超级聪明的恶意黑客将总能找到窃取您信息的方法。

但事实并非如此。绝大多数区块链中使用的加密系统从未被破解。专家们普遍认为,目前的最佳加密方法对于普通计算机是不可击穿的。如果有人真的找到了方法来破解这些系统,区块链程序也无需太担心,因为我们的整个金融系统目前使用完全相同的加密技术。

以比特币为例来看区块链技术的安全性。比特币是世界上第一个也是目前最大的区块链加密货币,于 2009 年 1 月投入使用。从那时起,它的市值已经增长到 400 多亿美元(编者注:到2018年9月,市值已达一千多亿美元),每天大约有 300,000 个比特币交易。尽管如此,基本的比特币算法并没有出现过一次破坏。不过,对于这个行业来说,发生过多次比特币交易网站被黑客入侵。然而,比特币本身从未被黑客入侵,并且继续保持 100% 的跟踪记录,其表现完全符合其创建者的预期。

这并不是说比特币的处理没有风险。要正确处理任何加密货币,您需要采取一些预防措施,以确保那些超级聪明的恶意黑客无法访问您的帐户。区块链安全性将成为本系列的关键主题之一,因为我们坚信,赋予人们安全和自信地使用区块链技术的能力对于实现该技术的大规模采用至关重要。

随着区块链技术的成熟,我们希望您将来加入我们。我们确信这项技术将改变世界,也很高兴能够在这个早期阶段参与这一旅程。

所以,无论你以前从未听说过区块链,你是一个想要了解更多技术的爱好者,或者你是寻找新机会的投资者,你来对了地方。我们将努力定期更新我们的系列文章,并提供关于区块链技术各方面的细致,公正的观点。

你喜欢这篇博文吗?我们很乐意在下面的留言板上收到您的来信!如果您在我们的内容中发现任何错误或错误,请随时告诉我们,我们会及时更正。我们的下一篇文章将简要介绍区块链和比特币的历史。希望能在那里见到你!


via: https://www.myblockchainblog.com/blog/what-the-hell-is-blockchain

作者:Vegard Nordahl & Meghana Rao 选题:jasminepeng 译者:jasminepeng 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

经过这些年,比特币社区已经发生了非常大的变化;社区成员从闭着眼睛都能讲解 梅克尔树 的技术迷们,变成了被一夜爆富欲望驱使的投机者和由一些连什么是梅克尔树都不懂的人所领导的企图寻求 10 亿美元估值的区块链初创公司。随着时间的流逝,围绕比特币和其它加密货币形成了一股热潮,他们认为比特币和其它加密货币远比实际的更重要;他们相信常见的货币(法定货币)正在成为过去,而加密货币将从根本上改变世界经济。

每一年他们的队伍都在壮大,而他们对加密货币的看法也在变得更加宏伟,那怕是对该技术的新奇的用法而使它陷入了困境。虽然我坚信设计优良的加密货币可以使金钱的跨境流动更容易,并且在大规模通胀的领域提供一个更稳定的选择,但现实情况是,我们并没有做到这些。实际上,正是价值的巨大不稳定性才使得投机者赚钱。那些宣扬美元和欧元即将死去的人,已经完全抛弃了对现实世界客观公正的看法。

一点点背景 …

比特币发行那天,我读了它的白皮书 —— 它使用有趣的 梅克尔树 去创建一个公共账簿和一个非常合理的共识协议 —— 由于它新颖的特性引起了密码学领域中许多人的注意。在白皮书发布后的几年里,比特币变得非常有价值,并由此吸引了许多人将它视为是一种投资,和那些认为它将改变一切的忠实追随者(和发声者)。这篇文章将讨论的正是后者。

昨天(2018/6/20),有人在推特上发布了一个最近的比特币区块的哈希,下面成千上万的推文和其它讨论让我相信,比特币已经跨越界线进入了真正的邪教领域。

一切都源于 Mark Wilcox 的这个推文

#00000000000000000021e800c1e8df51b22c1588e5a624bea17e9faa34b2dc4a

— Mark Wilcox (@mwilcox) June 19, 2018

张贴的这个值是 比特币 #528249 号区块 的哈希值。前导零是挖矿过程的结果;挖掘一个区块就是把区块内容与一个 现时数 nonce (和其它数据)组合起来,然后做哈希运算,并且它至少有一定数量的前导零才能被验证为有效区块。如果它不是正确的数字,你可以更换现时数再试。重复这个过程直到哈希值的前导零数量是正确的数字之后,你就有了一个有效的区块。让人们感到很兴奋的部分是接下来的 21e800

一些人说这是一个有意义的编号,挖掘出这个区块的人实际上的难度远远超出当前所看到的,不仅要调整前导零的数量,还要匹配接下来的 24 位 —— 它要求非常强大的计算能力。如果有人能够以蛮力去实现它,这将表明有些事情很严重,比如,在计算或密码学方面的重大突破。

你一定会有疑问,为什么 21e800 如此重要 —— 一个你问了肯定会后悔的问题。有人说它是参考了 E8 理论(一个广受批评的提出标准场理论的论文),或是表示总共存在 2,100,000,000 枚比特币(21 x 10^8 就是 2,100,000,000)。还有其它说法,因为太疯狂了而没有办法写出来。另一个重要的事实是,在前导零后面有 21e8 的区块平均每年被挖掘出一次 —— 这些从来没有人认为是很重要的。

这就引出了有趣的地方:关于这是如何发生的理论

  • 一台量子计算机,它能以某种方式用不可思议的速度做哈希运算。尽管在量子计算机的理论中还没有迹象表明它能够做这件事。哈希是量子计算机认为安全的东西之一。
  • 时间旅行。是的,真的有人这么说,有人从未来穿梭回到现在去挖掘这个区块。我认为这种说法太荒谬了,都懒得去解释它为什么是错误的。
  • 中本聪回来了。尽管事实上他的私钥没有任何活动,一些人从理论上认为他回来了,他能做一些没人能做的事情。这些理论是无法解释他如何做到的。

因此,总的来说(按我的理解)中本聪,为了知道和计算他做的事情,根据现代科学,他可能是以下之一:

A) 使用了一台量子计算机 B) 来自未来 C) 两者都是

— Crypto Randy Marsh REKT June 21, 2018

如果你觉得所有的这一切听起来像 命理学 numerology ,不止你一个人是这样想的。

所有围绕有特殊意义的区块哈希的讨论,也引发了对在某种程度上比较有趣的东西的讨论。比特币的创世区块,它是第一个比特币区块,有一个不寻常的属性:早期的比特币要求哈希值的前 32 bit 是零;而创始区块的前导零有 43 位。因为产生创世区块的代码从未发布过,不知道它是如何产生的,也不知道是用什么类型的硬件产生的。中本聪有学术背景,因此可能他有比那个时候大学中常见设备更强大的计算能力。从这一点上说,只是对古怪的创世区块的历史有点好奇,仅此而已。

关于哈希运算的简单题外话

这种喧嚣始于比特币区块的哈希运算;因此理解哈希是什么很重要,并且要理解一个非常重要的属性,哈希是单向加密函数,它能够基于给定的数据创建一个伪随机输出。

这意味着什么呢?基于本文讨论的目的,对于每个给定的输入你将得到一个随机的输出。随机数有时看起来很有趣,很简单,因为它是随机的结果,并且人类大脑可以很容易从任何东西中找到顺序。当你从随机数据中开始查看顺序时,你就会发现有趣的事情 —— 这些东西毫无意义,因为它们只是简单地随机数。当人们把重要的意义归属到随机数据上时,它将告诉你很多这些参与者观念相关的东西,而不是数据本身。

币之邪教

首先,我们来定义一组术语:

  • 邪教 Cult :一个宗教崇拜和直接向一个特定的人或物虔诚的体系。
  • 宗教 Religion :有人认为是至高无上的追求或兴趣。

币之邪教 Cult of the Coin 有许多圣人,或许没有人比 中本聪 Satoshi Nakamoto 更伟大,他是比特币创始者(们)的假名。(对他的)狂热拥戴,要归因于他的能力和理解力远超过一般的研究人员,认为他的远见卓视无人能比,他影响了世界新经济的秩序。当将中本聪的神秘本质和未知的真实身份结合起来时,狂热的追随着们将中本聪视为一个真正值得尊敬的人物。

当然,除了追随其他圣人的追捧者之外,毫无疑问这些追捧者认为自己是正确的。任何对他们的圣人的批评都被认为也是对他们的批评。例如,那些追捧 EOS 的人,可能会视中本聪为一个开发了失败项目的黑客,而对 EOS 那怕是最轻微的批评,他们也会作出激烈的反应,之所以反应如此强烈,仅仅是因为攻击了他们心目中的神。那些追捧 IOTA 的人的反应也一样;还有更多这样的例子。

这些追随者在讨论问题时已经失去了理性和客观,他们的狂热遮盖了他们的视野。任何对这些项目和项目背后的人的讨论,如果不是溢美之词,必然以某种程序的刻薄言辞结束,对于一个技术的讨论那种做法是毫无道理的。

这很危险,原因很多:

  • 开发者 & 研究者对缺陷视而不见。由于追捧者的大量赞美,这些参与开发的人对自己的能力的看法开始膨胀,并将一些批评看作是无端的攻击 —— 因为他们认为自己是不可能错的。
  • 真正的问题是被攻击。技术问题不再被看作是需要去解决的问题和改进的机会,他们认为是来自那些想去破坏项目的人的攻击。
  • 物以类聚,人以币分。追随者们通常会结盟到一起,而圣人仅有一个。承认其它项目的优越,意味着认同自己项目的缺陷或不足,而这是他们不愿意做的事情。
  • 阻止真实的进步。进化是很残酷的,死亡是必然会有的,项目可能失败,也要承认这些失败的原因。如果忽视失败的教训,如果不允许那些应该去死亡的事情发生,进步就会停止。

许多围绕加密货币和相关区块链项目的讨论已经开始变得越来越”有毒“,善意的人想在不受攻击的情况下进行技术性讨论越来越不可能。随着对真正缺陷的讨论,那些在其它环境中注定要失败的缺陷,在没有做任何的事实分析的情况下即刻被判定为异端已经成为了惯例,善意的人参与其中的代价变得极其昂贵。至少有些人已经意识到极其严重的安全漏洞,由于高“毒性”的环境,他们选择保持沉默。

曾经被好奇、学习和改进的期望、创意可行性所驱动的东西,现在被盲目的贪婪、宗教般的狂热、自以为是和自我膨胀所驱动。

我对受这种狂热激励的项目的未来不抱太多的希望,而它持续地传播,可能会损害多年来在这个领域中真正的研究者。这些技术项目中,一些项目成功了,一些项目失败了 —— 这就是技术演进的方式。设计这些系统的人,就和你我一样都有缺点,同样这些项目也有缺陷。有些项目非常适合某些使用场景而不适合其它场景,有些项目不适合任何使用场景,没有一个项目适合所有使用场景。关于这些项目的讨论应该关注于技术方面,这样做是为了让这一研究领域得以发展;在这些项目中掺杂宗教般狂热必将损害所有人。

[注意:这种行为有许多例子可以引用,但是为了保护那些因批评项目而成为被攻击目标的人,我选择尽可能少的列出这种例子。我看到许多我很尊敬的人、许多我认为是朋友的人成为这种恶毒攻击的受害者 —— 我不想引起人们对这些攻击的注意和重新引起对他们的攻击。]

(题图:news.bitcoin.com)


关于作者:

我是一个资深应用安全顾问、研究员和具有超过 15 年的经验的软件开发者。我主要关注的是应用程序安全、安全通信和加密, 虽然我经常由于无聊而去研究新的领域。我通常会写了一些关于我的研究和安全、开发和软件设计,和我当前吸引了我注意力的爱好的文章。


via: https://adamcaudill.com/2018/06/21/bitcoin-is-a-cult/

作者:Adam Caudill 选题:lujun9972 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

了解区块链是如何工作的最快的方法是构建一个。

你看到这篇文章是因为和我一样,对加密货币的大热而感到兴奋。并且想知道区块链是如何工作的 —— 它们背后的技术基础是什么。

但是理解区块链并不容易 —— 至少对我来说是这样。我徜徉在各种难懂的视频中,并且因为示例太少而陷入深深的挫败感中。

我喜欢在实践中学习。这会使得我在代码层面上处理主要问题,从而可以让我坚持到底。如果你也是这么做的,在本指南结束的时候,你将拥有一个功能正常的区块链,并且实实在在地理解了它的工作原理。

开始之前 …

记住,区块链是一个 不可更改的、有序的 记录(被称为区块)的链。它们可以包括 交易 transaction 、文件或者任何你希望的真实数据。最重要的是它们是通过使用哈希链接到一起的。

如果你不知道哈希是什么,这里有解释

本指南的目标读者是谁? 你应该能轻松地读、写一些基本的 Python 代码,并能够理解 HTTP 请求是如何工作的,因为我们讨论的区块链将基于 HTTP。

我需要做什么? 确保安装了 Python 3.6+(以及 pip),还需要去安装 Flask 和非常好用的 Requests 库:

pip install Flask==0.12.2 requests==2.18.4 

当然,你也需要一个 HTTP 客户端,像 Postman 或者 cURL。哪个都行。

最终的代码在哪里可以找到? 源代码在 这里

第 1 步:构建一个区块链

打开你喜欢的文本编辑器或者 IDE,我个人喜欢 PyCharm。创建一个名为 blockchain.py 的新文件。我将仅使用一个文件,如果你看晕了,可以去参考 源代码

描述一个区块链

我们将创建一个 Blockchain 类,它的构造函数将去初始化一个空列表(去存储我们的区块链),以及另一个列表去保存交易。下面是我们的类规划:

class Blockchain(object):
    def __init__(self):
        self.chain = []
        self.current_transactions = []

    def new_block(self):
        # Creates a new Block and adds it to the chain
        pass

    def new_transaction(self):
        # Adds a new transaction to the list of transactions
        pass

    @staticmethod
    def hash(block):
        # Hashes a Block
        pass

    @property
    def last_block(self):
        # Returns the last Block in the chain
        pass

我们的 Blockchain 类的原型

我们的 Blockchain 类负责管理链。它将存储交易并且有一些为链中增加新区块的辅助性质的方法。现在我们开始去充实一些类的方法。

区块是什么样子的?

每个区块有一个索引、一个时间戳(Unix 时间)、一个交易的列表、一个证明(后面会详细解释)、以及前一个区块的哈希。

单个区块的示例应该是下面的样子:

block = {
    'index': 1,
    'timestamp': 1506057125.900785,
    'transactions': [
        {
            'sender': "8527147fe1f5426f9dd545de4b27ee00",
            'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f",
            'amount': 5,
        }
    ],
    'proof': 324984774000,
    'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
}

我们的区块链中的块示例

此刻,链的概念应该非常明显 —— 每个新区块包含它自身的信息和前一个区域的哈希。这一点非常重要,因为这就是区块链不可更改的原因:如果攻击者修改了一个早期的区块,那么所有的后续区块将包含错误的哈希。

这样做有意义吗?如果没有,就让时间来埋葬它吧 —— 这就是区块链背后的核心思想。

添加交易到一个区块

我们将需要一种区块中添加交易的方式。我们的 new_transaction() 就是做这个的,它非常简单明了:

class Blockchain(object):
    ...

    def new_transaction(self, sender, recipient, amount):
        """
        Creates a new transaction to go into the next mined Block
        :param sender: <str> Address of the Sender
        :param recipient: <str> Address of the Recipient
        :param amount: <int> Amount
        :return: <int> The index of the Block that will hold this transaction
        """

        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

new_transaction() 运行后将在列表中添加一个交易,它返回添加交易后的那个区块的索引 —— 那个区块接下来将被挖矿。提交交易的用户后面会用到这些。

创建新区块

当我们的 Blockchain 被实例化后,我们需要一个创世区块(一个没有祖先的区块)来播种它。我们也需要去添加一些 “证明” 到创世区块,它是挖矿(工作量证明 PoW)的成果。我们在后面将讨论更多挖矿的内容。

除了在我们的构造函数中创建创世区块之外,我们还需要写一些方法,如 new_block()new_transaction() 以及 hash()

import hashlib
import json
from time import time


class Blockchain(object):
    def __init__(self):
        self.current_transactions = []
        self.chain = []

        # Create the genesis block
        self.new_block(previous_hash=1, proof=100)

    def new_block(self, proof, previous_hash=None):
        """
        Create a new Block in the Blockchain
        :param proof: <int> The proof given by the Proof of Work algorithm
        :param previous_hash: (Optional) <str> Hash of previous Block
        :return: <dict> New Block
        """

        block = {
            'index': len(self.chain) + 1,
            'timestamp': time(),
            'transactions': self.current_transactions,
            'proof': proof,
            'previous_hash': previous_hash or self.hash(self.chain[-1]),
        }

        # Reset the current list of transactions
        self.current_transactions = []

        self.chain.append(block)
        return block

    def new_transaction(self, sender, recipient, amount):
        """
        Creates a new transaction to go into the next mined Block
        :param sender: <str> Address of the Sender
        :param recipient: <str> Address of the Recipient
        :param amount: <int> Amount
        :return: <int> The index of the Block that will hold this transaction
        """
        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

    @property
    def last_block(self):
        return self.chain[-1]

    @staticmethod
    def hash(block):
        """
        Creates a SHA-256 hash of a Block
        :param block: <dict> Block
        :return: <str>
        """

        # We must make sure that the Dictionary is Ordered, or we'll have inconsistent hashes
        block_string = json.dumps(block, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()

上面的内容简单明了 —— 我添加了一些注释和文档字符串,以使代码清晰可读。到此为止,表示我们的区块链基本上要完成了。但是,你肯定想知道新区块是如何被创建、打造或者挖矿的。

理解工作量证明

工作量证明 Proof of Work (PoW)算法是在区块链上创建或者挖出新区块的方法。PoW 的目标是去撞出一个能够解决问题的数字。这个数字必须满足“找到它很困难但是验证它很容易”的条件 —— 网络上的任何人都可以计算它。这就是 PoW 背后的核心思想。

我们来看一个非常简单的示例来帮助你了解它。

我们来解决一个问题,一些整数 x 乘以另外一个整数 y 的结果的哈希值必须以 0 结束。因此,hash(x * y) = ac23dc…0。为简单起见,我们先把 x = 5 固定下来。在 Python 中的实现如下:

from hashlib import sha256

x = 5
y = 0  # We don't know what y should be yet...

while sha256(f'{x*y}'.encode()).hexdigest()[-1] != "0":
    y += 1

print(f'The solution is y = {y}')

在这里的答案是 y = 21。因为它产生的哈希值是以 0 结尾的:

hash(5 * 21) = 1253e9373e...5e3600155e860

在比特币中,工作量证明算法被称之为 Hashcash。与我们上面的例子没有太大的差别。这就是矿工们进行竞赛以决定谁来创建新块的算法。一般来说,其难度取决于在一个字符串中所查找的字符数量。然后矿工会因其做出的求解而得到奖励的币——在一个交易当中。

网络上的任何人都可以很容易地去核验它的答案。

实现基本的 PoW

为我们的区块链来实现一个简单的算法。我们的规则与上面的示例类似:

找出一个数字 p,它与前一个区块的答案进行哈希运算得到一个哈希值,这个哈希值的前四位必须是由 0 组成。
import hashlib
import json

from time import time
from uuid import uuid4


class Blockchain(object):
    ...

    def proof_of_work(self, last_proof):
        """
        Simple Proof of Work Algorithm:
         - Find a number p' such that hash(pp') contains leading 4 zeroes, where p is the previous p'
         - p is the previous proof, and p' is the new proof
        :param last_proof: <int>
        :return: <int>
        """

        proof = 0
        while self.valid_proof(last_proof, proof) is False:
            proof += 1

        return proof

    @staticmethod
    def valid_proof(last_proof, proof):
        """
        Validates the Proof: Does hash(last_proof, proof) contain 4 leading zeroes?
        :param last_proof: <int> Previous Proof
        :param proof: <int> Current Proof
        :return: <bool> True if correct, False if not.
        """

        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        return guess_hash[:4] == "0000"

为了调整算法的难度,我们可以修改前导 0 的数量。但是 4 个零已经足够难了。你会发现,将前导 0 的数量每增加一,那么找到正确答案所需要的时间难度将大幅增加。

我们的类基本完成了,现在我们开始去使用 HTTP 请求与它交互。

第 2 步:以 API 方式去访问我们的区块链

我们将使用 Python Flask 框架。它是个微框架,使用它去做端点到 Python 函数的映射很容易。这样我们可以使用 HTTP 请求基于 web 来与我们的区块链对话。

我们将创建三个方法:

  • /transactions/new 在一个区块上创建一个新交易
  • /mine 告诉我们的服务器去挖矿一个新区块
  • /chain 返回完整的区块链

配置 Flask

我们的 “服务器” 将在我们的区块链网络中产生一个单个的节点。我们来创建一些样板代码:

import hashlib
import json
from textwrap import dedent
from time import time
from uuid import uuid4

from flask import Flask


class Blockchain(object):
    ...


# Instantiate our Node
app = Flask(__name__)

# Generate a globally unique address for this node
node_identifier = str(uuid4()).replace('-', '')

# Instantiate the Blockchain
blockchain = Blockchain()


@app.route('/mine', methods=['GET'])
def mine():
    return "We'll mine a new Block"

@app.route('/transactions/new', methods=['POST'])
def new_transaction():
    return "We'll add a new transaction"

@app.route('/chain', methods=['GET'])
def full_chain():
    response = {
        'chain': blockchain.chain,
        'length': len(blockchain.chain),
    }
    return jsonify(response), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

对上面的代码,我们做添加一些详细的解释:

  • Line 15:实例化我们的节点。更多关于 Flask 的知识读 这里
  • Line 18:为我们的节点创建一个随机的名字。
  • Line 21:实例化我们的区块链类。
  • Line 24–26:创建 /mine 端点,这是一个 GET 请求。
  • Line 28–30:创建 /transactions/new 端点,这是一个 POST 请求,因为我们要发送数据给它。
  • Line 32–38:创建 /chain 端点,它返回全部区块链。
  • Line 40–41:在 5000 端口上运行服务器。

交易端点

这就是对一个交易的请求,它是用户发送给服务器的:

{
 "sender": "my address",
 "recipient": "someone else's address",
 "amount": 5
}

因为我们已经有了添加交易到块中的类方法,剩下的就很容易了。让我们写个函数来添加交易:

import hashlib
import json
from textwrap import dedent
from time import time
from uuid import uuid4

from flask import Flask, jsonify, request

...

@app.route('/transactions/new', methods=['POST'])
def new_transaction():
    values = request.get_json()

    # Check that the required fields are in the POST'ed data
    required = ['sender', 'recipient', 'amount']
    if not all(k in values for k in required):
        return 'Missing values', 400

    # Create a new Transaction
    index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])

    response = {'message': f'Transaction will be added to Block {index}'}
    return jsonify(response), 201

创建交易的方法

挖矿端点

我们的挖矿端点是见证奇迹的地方,它实现起来很容易。它要做三件事情:

  1. 计算工作量证明
  2. 因为矿工(我们)添加一个交易而获得报酬,奖励矿工(我们) 1 个币
  3. 通过将它添加到链上而打造一个新区块
import hashlib
import json

from time import time
from uuid import uuid4

from flask import Flask, jsonify, request

...

@app.route('/mine', methods=['GET'])
def mine():
    # We run the proof of work algorithm to get the next proof...
    last_block = blockchain.last_block
    last_proof = last_block['proof']
    proof = blockchain.proof_of_work(last_proof)

    # We must receive a reward for finding the proof.
    # The sender is "0" to signify that this node has mined a new coin.
    blockchain.new_transaction(
        sender="0",
        recipient=node_identifier,
        amount=1,
    )

    # Forge the new Block by adding it to the chain
    previous_hash = blockchain.hash(last_block)
    block = blockchain.new_block(proof, previous_hash)

    response = {
        'message': "New Block Forged",
        'index': block['index'],
        'transactions': block['transactions'],
        'proof': block['proof'],
        'previous_hash': block['previous_hash'],
    }
    return jsonify(response), 200

注意,挖掘出的区块的接收方是我们的节点地址。现在,我们所做的大部分工作都只是与我们的 Blockchain 类的方法进行交互的。到目前为止,我们已经做完了,现在开始与我们的区块链去交互。

第 3 步:与我们的区块链去交互

你可以使用简单的 cURL 或者 Postman 通过网络与我们的 API 去交互。

启动服务器:

$ python blockchain.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

我们通过生成一个 GET 请求到 http://localhost:5000/mine 去尝试挖一个区块:

使用 Postman 去生成一个 GET 请求

我们通过生成一个 POST 请求到 http://localhost:5000/transactions/new 去创建一个区块,请求数据包含我们的交易结构:

使用 Postman 去生成一个 POST 请求

如果你不使用 Postman,也可以使用 cURL 去生成一个等价的请求:

$ curl -X POST -H "Content-Type: application/json" -d '{
 "sender": "d4ee26eee15148ee92c6cd394edd974e",
 "recipient": "someone-other-address",
 "amount": 5
}' "http://localhost:5000/transactions/new"

我重启动我的服务器,然后我挖到了两个区块,这样总共有了 3 个区块。我们通过请求 http://localhost:5000/chain 来检查整个区块链:

{
  "chain": [
    {
      "index": 1,
      "previous_hash": 1,
      "proof": 100,
      "timestamp": 1506280650.770839,
      "transactions": []
    },
    {
      "index": 2,
      "previous_hash": "c099bc...bfb7",
      "proof": 35293,
      "timestamp": 1506280664.717925,
      "transactions": [
        {
          "amount": 1,
          "recipient": "8bbcb347e0634905b0cac7955bae152b",
          "sender": "0"
        }
      ]
    },
    {
      "index": 3,
      "previous_hash": "eff91a...10f2",
      "proof": 35089,
      "timestamp": 1506280666.1086972,
      "transactions": [
        {
          "amount": 1,
          "recipient": "8bbcb347e0634905b0cac7955bae152b",
          "sender": "0"
        }
      ]
    }
  ],
  "length": 3
}

第 4 步:共识

这是很酷的一个地方。我们已经有了一个基本的区块链,它可以接收交易并允许我们去挖掘出新区块。但是区块链的整个重点在于它是 去中心化的 decentralized 。而如果它们是去中心化的,那我们如何才能确保它们表示在同一个区块链上?这就是 共识 Consensus 问题,如果我们希望在我们的网络上有多于一个的节点运行,那么我们将必须去实现一个共识算法。

注册新节点

在我们能实现一个共识算法之前,我们需要一个办法去让一个节点知道网络上的邻居节点。我们网络上的每个节点都保留有一个该网络上其它节点的注册信息。因此,我们需要更多的端点:

  1. /nodes/register 以 URL 的形式去接受一个新节点列表
  2. /nodes/resolve 去实现我们的共识算法,由它来解决任何的冲突 —— 确保节点有一个正确的链。

我们需要去修改我们的区块链的构造函数,来提供一个注册节点的方法:

...
from urllib.parse import urlparse
...


class Blockchain(object):
    def __init__(self):
        ...
        self.nodes = set()
        ...

    def register_node(self, address):
        """
        Add a new node to the list of nodes
        :param address: <str> Address of node. Eg. 'http://192.168.0.5:5000'
        :return: None
        """

        parsed_url = urlparse(address)
        self.nodes.add(parsed_url.netloc)

一个添加邻居节点到我们的网络的方法

注意,我们将使用一个 set() 去保存节点列表。这是一个非常合算的方式,它将确保添加的节点是 幂等 idempotent 的 —— 这意味着不论你将特定的节点添加多少次,它都是精确地只出现一次。

实现共识算法

正如前面提到的,当一个节点与另一个节点有不同的链时就会产生冲突。为解决冲突,我们制定一个规则,即最长的有效的链才是权威的链。换句话说就是,网络上最长的链就是事实上的区块链。使用这个算法,可以在我们的网络上节点之间达到共识。

...
import requests


class Blockchain(object)
    ...

    def valid_chain(self, chain):
        """
        Determine if a given blockchain is valid
        :param chain: <list> A blockchain
        :return: <bool> True if valid, False if not
        """

        last_block = chain[0]
        current_index = 1

        while current_index < len(chain):
            block = chain[current_index]
            print(f'{last_block}')
            print(f'{block}')
            print("\n-----------\n")
            # Check that the hash of the block is correct
            if block['previous_hash'] != self.hash(last_block):
                return False

            # Check that the Proof of Work is correct
            if not self.valid_proof(last_block['proof'], block['proof']):
                return False

            last_block = block
            current_index += 1

        return True

    def resolve_conflicts(self):
        """
        This is our Consensus Algorithm, it resolves conflicts
        by replacing our chain with the longest one in the network.
        :return: <bool> True if our chain was replaced, False if not
        """

        neighbours = self.nodes
        new_chain = None

        # We're only looking for chains longer than ours
        max_length = len(self.chain)

        # Grab and verify the chains from all the nodes in our network
        for node in neighbours:
            response = requests.get(f'http://{node}/chain')

            if response.status_code == 200:
                length = response.json()['length']
                chain = response.json()['chain']

                # Check if the length is longer and the chain is valid
                if length > max_length and self.valid_chain(chain):
                    max_length = length
                    new_chain = chain

        # Replace our chain if we discovered a new, valid chain longer than ours
        if new_chain:
            self.chain = new_chain
            return True

        return False

第一个方法 valid_chain() 是负责来检查链是否有效,它通过遍历区块链上的每个区块并验证它们的哈希和工作量证明来检查这个区块链是否有效。

resolve_conflicts() 方法用于遍历所有的邻居节点,下载它们的链并使用上面的方法去验证它们是否有效。如果找到有效的链,确定谁是最长的链,然后我们就用最长的链来替换我们的当前的链。

在我们的 API 上来注册两个端点,一个用于添加邻居节点,另一个用于解决冲突:

@app.route('/nodes/register', methods=['POST'])
def register_nodes():
    values = request.get_json()

    nodes = values.get('nodes')
    if nodes is None:
        return "Error: Please supply a valid list of nodes", 400

    for node in nodes:
        blockchain.register_node(node)

    response = {
        'message': 'New nodes have been added',
        'total_nodes': list(blockchain.nodes),
    }
    return jsonify(response), 201


@app.route('/nodes/resolve', methods=['GET'])
def consensus():
    replaced = blockchain.resolve_conflicts()

    if replaced:
        response = {
            'message': 'Our chain was replaced',
            'new_chain': blockchain.chain
        }
    else:
        response = {
            'message': 'Our chain is authoritative',
            'chain': blockchain.chain
        }

    return jsonify(response), 200

这种情况下,如果你愿意,可以使用不同的机器来做,然后在你的网络上启动不同的节点。或者是在同一台机器上使用不同的端口启动另一个进程。我是在我的机器上使用了不同的端口启动了另一个节点,并将它注册到了当前的节点上。因此,我现在有了两个节点:http://localhost:5000http://localhost:5001

注册一个新节点

我接着在节点 2 上挖出一些新区块,以确保这个链是最长的。之后我在节点 1 上以 GET 方式调用了 /nodes/resolve,这时,节点 1 上的链被共识算法替换成节点 2 上的链了:

工作中的共识算法

然后将它们封装起来 … 找一些朋友来帮你一起测试你的区块链。


我希望以上内容能够鼓舞你去创建一些新的东西。我是加密货币的狂热拥护者,因此我相信区块链将迅速改变我们对经济、政府和记录保存的看法。

更新: 我正计划继续它的第二部分,其中我将扩展我们的区块链,使它具备交易验证机制,同时讨论一些你可以在其上产生你自己的区块链的方式。(LCTT 译注:第二篇并没有~!)


via: https://hackernoon.com/learn-blockchains-by-building-one-117428612f46

作者:Daniel van Flymen 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

从比特币到下一代区块链。

当开源项目开发下一个新版本时,用后缀 “-ng” 表示 “下一代”的情况并不鲜见。幸运的是,到目前为止,快速演进的区块链成功地避开了这个命名陷阱。但是在这个开源生态系统的演进过程中,改变是不断发生的,而好的创意以典型的开源方式在许多不同的项目中被采用、交融和演进。

在本文中,我将审视不同代次的区块链,并且看一看在处理这个生态系统遇到的问题时出现什么创意。当然,任何对生态系统进行分类的尝试都有其局限性的 —— 和不同意见者的 —— 但是这也将为混乱的区块链项目提供了一个粗略的指南。

始作俑者:比特币

第一代的区块链起源于 比特币 Bitcoin 区块链,这是以去中心化、点对点加密货币为基础的 总帐 ledger ,它从 Slashdot 网站上的杂谈变成了一个主流话题。

这个区块链是一个分布式总帐,它对所有用户的 交易 transaction 保持跟踪,以避免他们 双重支付 double-spending (双花)货币(在历史上,这个任务是委托给第三方—— 银行 ——来做的)。为防范攻击者在系统上捣乱,总帐被复制到每个参与到比特币网络的计算机上,并且每次只允许一台计算机去更新总帐。为决定哪台计算机能够获得更新总帐的权力,系统安排在比特币网络上的计算机之间每 10 分钟进行一场竞赛,这将消耗它们的(许多)能源才能参与竞赛。赢家将获得将前 10 分钟发生的交易写入到总帐(区块链中的“区块”)的权力,并且为赢家写入区块链的工作给予一些比特币奖励。这种方式被称为 工作量证明 proof of work (PoW)共识机制。

这就是区块链最有趣的地方。比特币以开源项目的方式发布于 2009 年 1 月 。在 2010 年,由于意识到这些元素中的许多是可以调整的,围绕比特币聚集起了一个社区 —— bitcointalk 论坛,来开始各种实验。

起初,看到的比特币区块链是一个分布式数据库的形式, Namecoin 项目出现后,建议去保存任意数据到它的事务数据库中。如果区块链能够记录金钱的转移,那么它也应该能够记录其它资产的转移,比如域名。这正是 Namecoin 的主要使用场景,它上线于 2011 年 4 月 —— 也就是比特币出现两年后。

Namecoin 调整的地方是区块链的内容, 莱特币 Litecoin 调整的是两个技术部分:一是将两个区块的时间间隔从 10 分钟减少到 2.5 分钟,二是改变了竞赛方式(用 scrypt 来替换了 SHA-256 安全哈希算法)。这是能够做到的,因为比特币是以开源软件的方式来发布的,而莱特币本质上与比特币在其它部分是完全相同的。莱特币是修改了比特币共识机制的第一个分叉,这也为其它的更多“币”铺平了道路。

沿着这条道路,基于比特币代码库的各种变种越来越多。其中一些扩展了比特币的用途,比如 Zerocash 协议,它专注于提供交易的匿名性和可替换性,但它最终分拆为它自己的货币 —— Zcash

虽然 Zcash 带来了它自己的创新,使用了最近被称为“ 零知识证明 zero-knowledge proof ”的加密技术,但它维持着与大多数主要的比特币代码库的兼容性,这意味着它能够从上游的比特币创新中获益。

另外的项目 —— CryptoNote,它萌芽于相同的社区,但是并没有使用相同的代码,它以比特币为背景来构建的,但又与之不同。它发布于 2012 年 12 月,由于它的出现,导致了几种加密货币的诞生,最著名的 门罗币 Monero (2014)就是其中之一。门罗币与 Zcash 使用了不同的方法,但解决了相同的问题:隐私性和可替换性。

就像在开源世界中经常出现的案例一样,做同样的工作有不止一个的工具可用。

下一代:“Blockchain-ng”

但是,到目前为止,所有的这些变体只是改进加密货币或者扩展它们去支持其它类型的事务。因此,这就引出了第二代区块链。

一旦社区开始去修改区块链的用法和调整技术部分时,对于一些想去扩展和重新思考它们未来的人来说,这种调整花费不了多长时间的。比特币的长期追随者 —— Vitalik Buterin 在 2013 年底建议,区域链的事务应该能够表示一个状态机的状态变化,将区域链视为能够运行应用程序(“ 智能合约 smart contract ”)的分布式计算机。这个项目 —— 以太坊 Ethereum ,上线于 2015 年 4 月。它在运行分布式应用程序方面取得了巨大的成功,它的一些非常流行的分布式应用程序( 加密猫 CryptoKitties )甚至导致以太坊区块链变慢。

这证明了目前的区块链存在一个很大的局限性:速度和容量。(速度通常用每秒事务数来测量,简称 TPS)有几个提议都建议去解决这个速度问题,从 分片 sharding 侧链 sidechain ,以及一个被称为“ 第二层 second-layer ”的解决方案。这里需要更多的创新。

随着“智能合约”这个词开始流行起来,并且用已经被证实仍然很慢的技术去运行它们,那么就需要实现其它的思路: 许可区块链 Permissioned blockchain 。到目前为止,我们所介绍的所有区块链网络有两个没有明说的特征:一是它们是公开的(任何人都可以看到它们的功能),二是它们不需要许可(任何人都可以加入它们)。这两个部分是运行一个分布式的、非基于第三方的货币应该具有的和必需具有的条件。

随着区块链被认为出现与加密货币越来越明显的分离趋势,开始去考虑一些隐私、许可场景是很有意义的。一个有业务关系但不需要彼此完全信任的财团类型的参与者,能够从这些区块链类型中获益 —— 比如,物流链上的参与者,定期进行双边结算或者使用一个清算中心的金融、保险、或医疗保健机构。

一旦你将设置从“任何人都可以加入”变为“仅邀请者方可加入”,进一步对区块链构建区块的方式进行改变和调整将变得可能,那么对一些人来说,结果将变得非常有趣。

首先,设计用来保护网络不受恶意或者垃圾参与者的影响的工作量证明(PoW)可以被替换为更简单的和更少资源消耗的一些东西,比如,基于 Raft) 的共识协议。在更高级别的安全性和更快的速度之间进行权衡,采用更简单的共识算法。对于更多群体来说这样更理想,因为他们可以用基于加密技术的担保来取代其它的基于法律关系的担保,例如为避免由于竞争而产生的大量能源消耗,而工作量证明就是这种情况。另外一个创新的地方是,使用 股权证明 Proof of Stake (PoS),它是公共网络共识机制的一个重量级的竞争者。它将可能像许可链网络一样找到它自己的实现方式。

有几个项目可以让创建许可区块链变得更简单,包括 Quorum (以太坊的一个分叉)和 HyperledgerFabricSawtooth,这是基于新代码的两个开源项目。

许可区块链可以避免公共的、非许可方式的区块链中某些错综复杂的问题,但是它自己也存在一些问题。正确地管理参与者是其中的一个问题:谁可以加入?如何辨别他们?如何将他们从网络上移除?网络上的一个实体是否去管理一个中央公共密钥基础设施(PKI)?

区块链的开放本质

到目前为止的所有案例中,有一件事情是很明确的:使用一个区块链的目标是去提升网络中的参与者和它产生的数据的信任水平,理想情况下,不需要做进一步的工作即可足以使用它。

只有为这个网络提供动力的软件是自由和开源的,才能达到这种信任水平。即便是一个正确的、专用的、分布式区块链,它的本质仍然是运行着相同的第三方代码的私有代理的集合。从本质上来说,区块链的源代码必须是开源的,但仅是开源还不够。随着生态系统持续成长,这既是最低限度的担保也是进一步创新的源头。

最后,值得一提的是,虽然区块链的开放本质被认为是创新和变化的源头,它也被认为是一种治理形式:代码治理,用户期望运行的任何一个特定版本,都应该包含他们认为的整个网络应该包含的功能和方法。在这方面,需要说明的一点是,一些区块链的开放本质正在“变味”。但是这一问题正在解决。

第三和第四代:治理

接下来,我正在考虑第三代和第四代区块链:区块链将内置治理工具,并且项目将去解决棘手的大量不同区块链之间互连互通的问题,以便于它们之间可以交换信息和价值。


关于作者

axel simon: 长期的自由及开源软件爱好者,就职于 Red Hat ,关注安全和区块链技术,以及分布式系统和协议。致力于保护互联网及其成就(知识分享、信息访问、去中心化和网络中立)。


via: https://opensource.com/article/18/6/blockchain-guide-next-generation

作者:Axel Simon 选题:lujun9972 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这三个问题可以帮你避开不实宣传。

不错,“区块链”这个概念异常的火热。

众所周知,我一直关注区块链及相关技术的成熟度发展情况,思考我们是否对其评价过高了;但从目前的情况来看,还没有这个迹象。我在文中提到的区块链技术是广义上的,包含了狭义上不属于区块链的分布式账本技术(DLT)。我对私有链permissioned blockchain更感兴趣,其中私有链的定义可以参考我的文章《区块链是安全性方面的话题吗?》。简而言之,我对加密货币之外的区块链业务应用特别感兴趣 注1

我们对区块链的技术成熟度的判断应该有一部分可以得到证实 注2 。如果我们判断正确,未来将会出现海量的区块链应用。这很可能会变成现实,但并不是所有的应用都是优秀的区块链应用,其中一部分很可能是非常糟糕的。

但区块链所处的技术成熟度意味着,大量业务将快速拥抱新技术 注3 ,但对于可能的前景却一知半解。促成这种情况的原因可以大致分为三种:

  1. 对于涉及多用户数据存储的业务应用,在投入精力的情况下,几乎都可以改造为基于区块链的版本;
  2. 很多区块链相关的会议和“专家”呼吁尽快拥抱区块链,否则可能会在半年内被淘汰 注4
  3. 完全理解区块链技术是很难的,支持其在企业中落地的往往是工程师。

对于最后一条,我必须补充几句,不然很容易被引起众怒 注5 。作为一名工程师,我显然无意贬低工程师。但工程师的天性使然,我们对见到的新鲜事物(亮点)热情澎湃,却对业务本身 深入 fully grok 注6 不足,故对于新技术给业务带来的影响理解可能并不深刻。在业务领导者看来,这些影响不一定是有利的。

上面提到的三种促因可能导致一种风险,即在没有充分评估利弊的情况下,将业务改造为区块链应用。在另一文(区块链:每个人都应该参与进来吗?)中提到几个场景,用于判断一个业务什么情况下适合采用区块链技术。这些场景是有益的,但更进一步,我坚信人们更加需要的是,业务完全不适用区块链的几种简单的场景判定。我总结了三种场景判定,如果对于其中任何一个问题你给出了肯定的回答,那么很大概率上区块链不适合你。

场景判定 1:业务是否需要集中式的管控或授权?

如果你给出了肯定的回答,那么区块链不适合你。

例如,假设你是一个普通销售商,具有唯一的订单系统,那么对于何时发货你有唯一的授权,显然区块链不适合你。假设你是一个内容提供商,所有提供的内容都会经过唯一的编辑和发布过程,显然区块链不适合你。

经验总结:只有当任务对应的执行流程及相应的认证流程是分布于众多主体时,区块链是有价值的。

场景判定 2:业务使用经典数据库是否工作良好?

如果你给出了肯定的回答,那么区块链不适合你。

该场景似乎与上一个场景是强相关的,但并不总是如此。在一些应用中,处理流程是分布的,但信息存储是中心化的;在另外一些应用中,处理流程需要中心化的授权,但信息存储是分布的,即总有一个并不是分布式的。但如果业务使用经典数据库可以工作量良好的话,使用经典数据库是一个好主意。

经典数据库不仅性能良好,在设计与运营成本方面低比区块链或分布式账本,而且我们在这方面技术积累丰厚。区块链让所有人 注8 可以查看和持有数据,但间接成本和潜在成本都比较高昂。

场景判定 3:业务采用新技术是否成本高昂或对合作伙伴有负面效果?

如果你给出了肯定的回答,那么区块链不适合你。

我曾听过这种观点,即区块链会让所有人获益。但这显然是不可能的。假设你正在为某个流程设计一个应用,改变合作伙伴与你及应用的交互方式,那么你需要判断这个改变是否符合合作伙伴的想法。不论是否涉及区块链,可以很容易的设计并引入一个应用,虽然降低了你自己的业务阻力,但与此同时增加了合作伙伴的业务阻力。

假设我为汽车行业生产发动机配件,那么使用区块链追溯和管理配件会让我受益匪浅。例如,我可以查看购买的滚珠轴承的生产商、生产时间和钢铁材料供应商等。换一个角度,假设我是滚珠轴承生产商,已经为40多个客户公司建立了处理流程。为一家客户引入新的流程会涉及工作方式、系统体系、储藏和安全性标准等方面的变更,这无法让我感兴趣,相反,这会导致复杂性和高开销。

总结

这几个场景判定用于提纲挈领,并不是一成不变的。其中数据库相关的那个场景判定更像是技术方面的,但也是紧密结合业务定位和功能的。希望这几个判定可以为区块链技术引进促因带来的过热进行降温。

  • 注 1. 请不要误解我的意思,加密货币显然是一种有趣的区块链业务应用,只是不在本文的讨论范畴而已。
  • 注 2. 知道具体是哪些部分是很有意义的,如果你知道,请告诉我好吗?
  • 注 3. 坦率的说,它其实更像是一大堆技术的集合体。
  • 注 4. 这显然是不太可能的,如果被淘汰的主体是这些会议和“专家”本身倒十分有可能。
  • 注 5. 由于比方打得有些不恰当,估计还是会引起众怒。
  • 注 6. 我太喜欢 grok 这个单词了,我把它放在这里作为我的工程师标志 注7
  • 注 7. 你可能已经想到了,我读过Stranger in a Strange Land一书,包括删减版和原版。
  • 注 8. 在合理的情况下。

原文最初发表于爱丽丝, 夏娃和鲍勃 – 一个安全性主题博客,已获得转载许可。


via: https://opensource.com/article/18/3/3-tests-not-moving-blockchain

作者:Mike Bursell 译者:pinewall 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Red 语言在其官网宣布,其于 2018 年 1 月在法国巴黎建立了基金会。Red 基金会托管在 法国高等研究实践学院(EPHE) ,由 François Jouen 所领导的“人与人工认知研究”部门所管理,François Jouen 是 Red 语言中著名的图像处理框架 RedCV 的作者。

基金会的职能如在其宣告RED 白皮书中所说,是管理整个 Red 开源项目,并使用 RED 通证来建立一个新的开源项目经济模式。为达成此目标,位于 GitHub 上的 Red 代码库中的所有版权拥有者都被要求将其权力让渡到基金会。而 Nenad 作为其源代码中最大的版权拥有者,将率先让渡(即修改源代码中的文件头和许可证文件)。

据 Red 基金会去年底发布的消息,Red 语言将发起多个支持区块链的子项目,包括用于智能合约编程的 Red/CCC,可以直接编译成支持以太坊虚拟机的字节码,也将会支持其它链,如 NEO;更小的运行时环境(大约 1mb,压缩后约 300kb)的 Red DApp,而采用 Electron) 框架的 DApp 需要 50 ~ 150 Mb。

Red 基金会由以下几个部门组成:

  • 管理团队

    • Nenad Rakocevic,总裁
    • Francois Jouen,副总裁
    • Azouz Guizani,财务主管
  • Gregg Irwin 领导的运营团队。Peter W A Wood 是首位成员,将来还会有更多正式成员。
  • 由荣誉会员组成的顾问团队。

运营团队当前正在进行如下工作:

  • 基金会网站,功能包括:

    • 定期发布报告的博客平台。
    • 关于 RED 通证的全部信息(使用情况、奖励规则和金额)。
    • 悬赏的贡献任务(支付 RED 通证)。
  • 制定为之前的贡献者的既往贡献发放 RED 通证的规则(从 2011 年 Red 的 GitHub 仓库建立开始算起)。当规则和要奖励的通证数量确定之后会尽快发放。这需要收集贡献及贡献者的列表。
  • 确定运营团队的决策流程。
  • 确定基金会的成员资格规则。
  • 负责重新设计 red-lang.org 网站,并将其移动到新平台。

出于信息传递和透明度的考虑,所有这些任务及结果都将发布到基金会的网站上。

此外,Red 基金会也在寻求合作伙伴,以实现其简化人类编程的愿景,特别是在区块链领域。目前大部分这些工作都由其合作伙伴如 NEO 委员会Enuma(一家领先的香港区块链服务公司)来完成。