首页 > 其他分享 >bc-qk-ref-merge-0

bc-qk-ref-merge-0

时间:2024-05-01 15:45:35浏览次数:18  
标签:以太 代币 比特 网络 merge 钱包 qk 区块 ref

区块链快速参考(全)

原文:zh.annas-archive.org/md5/b5e57485b0609afbfba46ff759c5d264

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

这是 区块链快速参考,一本旨在全方位介绍新手进入区块链世界的书籍。它带你进入令人激动的区块链技术世界,旨在为那些希望完善其对区块链生态系统各支柱的现有知识的人提供帮助。

本书是你学习如何应用原则和理念以改善生活和业务的不二选择。在研究它们如何工作之前,你将涵盖架构、首次代币发行ICO)、代币、智能合约和术语。开始学习区块链技术只需有一颗好奇心。一旦你掌握了基础知识,你将探索以太坊的组成部分,比如以太代币、交易和智能合约,以构建简单的 Dapp。接下来,你将学习为什么 Solidity 特别用于基于以太坊的项目,然后通过易学的例子探索不同类型的区块链。所有这些都将帮助你应对挑战和问题。此外,你还将学习区块链是如何在物联网和机器学习方面进行革新,以及它如何影响业务流程。

在本书的结尾,你不仅将解决与区块链技术相关的当前和未来的问题,而且还能够构建高效的去中心化应用程序。

本书适合对象

本书是为那些对区块链感兴趣,但在这个领域的突然爆炸性增长所感到不知所措的人而写的。区块链技术不再仅限于比特币,已经渗透到许多领域和大量不同的技术中。这本书主要面向希望了解该技术、它是如何工作的、目前市面上的主要区块链类型以及在组织中使用它或计划发行 ICO 时能得到一些帮助的商务人士。

本书主要面向考虑使用基于区块链的项目的商务用户和开发人员。本书将帮助你对当前的区块链世界有所了解,介绍主要的软件项目和软件包,并介绍了当前影响该领域的一些法律背景。

本书涵盖内容

第一章, 区块链 101,解释了什么是区块链技术以及它们如何工作。我们还介绍了分布式分类账的概念。

第二章, 区块链的组件和结构,深入了解了区块链的技术基础,并探究了一个区块是什么以及链是如何创建的。

第三章, 去中心化与分布式系统,涵盖了不同类型的去中心化和分布式系统,并介绍了它们之间经常被忽视的区别。

第四章,加密学和区块链原理,探讨了对所有区块链正常运行至关重要的加密系统基础知识。

第五章,比特币,深入研究了比特币,第一个区块链,以及其具体的机制。

第六章,山寨币,介绍了在过去几年中备受欢迎的主要非比特币加密货币项目。

第七章,达成共识,探讨了区块链帮助实现共识的不同方式。这是区块链行为中最重要的方面之一。

第八章,高级区块链概念,详述了区块链技术、隐私和匿名性之间的相互作用,以及区块链技术的一些法律副作用。

第九章,加密货币钱包,介绍了用于保管加密货币安全的不同钱包解决方案。

第十章,备选区块链,检查了像 Tendermint 和 Graphene 等区块链创建技术,以及其他非货币类区块链技术。

第十一章,Hyperledger 和企业级区块链,检视了面向企业和公司使用的 Hyperledger 分布式账本技术系列。

第十二章,以太坊 101,深入了解如今第二大主导区块链技术——以太坊。

第十三章,Solidity 101,介绍了以太坊编程语言 Solidity 的基础知识。

第十四章,智能合约,介绍了不同区块链技术不同方式实现的智能合约。

第十五章,以太坊开发,介绍了为以太坊区块链编写应用程序。

第十六章,以太坊账户和以太币代币,本章将探讨以太坊账户的机制,以及以太坊系统中的代币。

第十七章,去中心化应用,全面讨论了去中心化应用,包括那些独立于区块链操作或与区块链技术协同的应用。

第十八章,挖矿,讲解了区块链挖矿以及如何用于保护区块链安全,挖矿中使用的不同类型硬件以及相关的不同协议。

第十九章,ICO 101,讲解了如何发行首次代币发售或首次代币提供的基础知识。

第二十章,创建你自己的货币,我们将介绍如何创建基于区块链的加密数字货币。

第二十一章,扩展性和其他挑战,涵盖了当前区块链技术所面临的困难和限制。

第二十二章,区块链的未来,我们将从技术、法律和社会等方面探讨行业可能的未来发展。

为了最大限度地利用本书的内容

  1. 摆脱炒作,真正试图理解区块链的功用和局限性。

  2. 查看所提及的项目,并看看哪些适用于你的计划。你可能会省下很多工作。

  3. 思考去中心化如何可能帮助或阻碍你的目标。

下载示例代码文件

你可以从 www.packtpub.com 的账户下载本书的示例代码文件。如果你在其他地方购买了这本书,你可以访问 www.packtpub.com/support 并注册,文件将会直接通过邮件发送给你。

你可以按照以下步骤下载代码文件:

  1. www.packtpub.com 登录或注册。

  2. 选择“支持”选项卡。

  3. 点击“代码下载 & 补正”。

  4. 在搜索框中输入书名,然后按照屏幕上的指示操作。

文件下载完成后,请确保使用最新版本的解压软件解压文件夹:

  • WinRAR/7-Zip 适用于 Windows

  • Zipeg/iZip/UnRarX 适用于 Mac

  • 7-Zip/PeaZip 适用于 Linux

本书的代码包也托管在 GitHub 上,链接为 github.com/PacktPublishing/Blockchain-Quick-Reference。如果代码有更新,它将会在现有的 GitHub 仓库上进行更新。

我们还有来自我们丰富书籍和视频目录的其他代码包可用,链接为github.com/PacktPublishing/。快去看看吧!

使用的约定

本书中使用了一些文本约定。

CodeInText:表示文本中的代码字词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户的输入以及 Twitter 用户名。这里是一个例子:"通过使用 geth --help 命令来检查各种选项和命令。"

代码块设置如下:

difficulty = difficulty_1_target/current_target
difficulty_1_target = 0x00000000FFFF0000000000000000000000000000000000000000000000000000

任何命令行的输入或输出都被写成了以下形式:

COMMANDS:
 list Print summary of existing accounts
 new Create a new account
 update Update an existing account
 import Import a private key into a new account

粗体:表示一个新术语、一个重要的词或你在屏幕上看到的词。例如,菜单或对话框中的字词在文本中会像这样出现。这里是一个例子:"从管理面板中选择系统信息"。

警告或重要注释是这样显示的。

提示和技巧是这样显示的。

联系我们

我们非常欢迎读者的反馈。

常规反馈:发送电子邮件至[email protected],并在主题中提及书名。如果您对本书的任何方面有疑问,请发送电子邮件至[email protected]

勘误:虽然我们已经尽最大努力保证内容的准确性,但错误是难免的。如果您在这本书中发现了错误,我们将不胜感激地接受您的报告。请访问www.packtpub.com/submit-errata,选择您的书籍,点击勘误提交表格链接,并输入详细信息。

盗版:如果您在互联网上发现我们作品的任何非法副本,请提供该位置地址或网站名称给我们将不胜感激。请通过[email protected]与包含该材料链接的邮件与我们联系。

如果您有兴趣成为作者:如果您在某个领域有专业知识,并且对撰写或为书籍贡献感兴趣,请访问authors.packtpub.com

评论

请留下评论。当您阅读并使用了这本书后,为什么不在购买书籍的网站上留下评论呢?潜在的读者可以看到并使用您公正的意见来作出购买决定,Packt 能够了解您对我们产品的看法,我们的作者也能看到您对他们书籍的反馈。谢谢!

欲了解更多关于 Packt 的信息,请访问packtpub.com

第一章:区块链 101

自 2008 年成立以来,区块链一直是金融、技术和其他类似产业中所有人的关注话题。除了为记录保存和共识带来新的概览外,区块链在大多数行业中都有巨大的颠覆潜力。初期采用者、爱好者,现在甚至包括政府和组织都在探索区块链技术的用途。

在本书中,我们将讨论使用法定货币进行金融交易的基础,以创建基于以太代币的加密货币,并在此过程中,尝试涵盖大多数区块链周围的主题。我们将讨论基于以太坊的区块链、超级账本项目、钱包、替代币等其他令人兴奋的主题,这些都是了解区块链的功能和潜力所必需的内容。

在本章中,我们将讨论以下内容:

  • 金融交易

  • 财务分类账

  • P2P 网络

  • 区块链的一般要素

  • 区块链的用途和好处

  • 各种类型的区块链

  • 引入共识系统

  • 区块链网络面临的挑战

让我们先讨论前述列出的各个主题及其周围的其他重要细节。

处理金融交易

在我们深入探讨基于区块链的交易之前,了解金融交易的实际发生方式和法定货币的运作是很有帮助的。

法定货币完全依赖经济信用;根据定义,它是政府宣布的合法货币。没有政府的保证,法定货币是毫无价值的。

另一种货币是商品货币;它源自制造好货币所用的商品。例如,如果制作银币,其价值将是以银的价值来衡量,而不是币值的定义价值。与以物易物相比,商品货币是贸易的一种便利形式。然而,它容易出现巨大的价格波动。

商品货币被证明不易携带,因此政府推出了印刷货币,可以从政府银行兑换成实际商品,但即使如此,这对政府管理来说也很困难,于是推出了法定货币,或信仰为基础的货币。

法定货币在其时间内产生了许多第三方共识;这有助于从系统中消除欺诈行为。有必要有一个严格的共识过程,以确保在系统内保持进程和隐私. 下图描述了基于信用卡的支付过程:

基于信用卡的支付过程以及需要多个第三方参考点来维护信任。

分类账

分类账是一种记录经济交易的记录,包括现金、应收账款、存货、固定资产、应付账款、应计费用、债务、权益、收入、成本、工资、薪水、费用、折旧等等。简而言之,账目保管的书籍称为分类账。它是银行和其他金融机构用来调节账面余额的主要记录。会计期间的所有借方和贷方都被计算以使分类账平衡。

银行、金融机构和企业的财务报表是使用分类账户编制的。

无信任系统的概念

在使用法定货币进行金融交易时,我们有一个维护有关每笔交易信息的第三方分类账。其中一些第三方信任系统是 VISA、万事达卡、银行等等。

区块链通过使每个人成为分类账的一部分改变了这种无信任系统的格局。因此,它有时甚至被称为分布式账本;在区块链的比特币系统中,进行交易的每个人都有其他交易的记录,这些交易已经发生或正在发生。这个去中心化的分类账为每笔交易提供了多个真实性点;此外,规则是预先定义的,并且对于每个钱包用户都不同。

进一步说明,区块链实际上并没有消除信任;它所做的是最小化信任的量,并将其均匀分布在网络中。使用各种规则定义了特定的协议,这些规则自动根据遵循的规则鼓励赞助者。我们将在后面的章节中对此进行深入讨论。

引入区块链

2008 年,比特币的创始人或一群创始人称为中本聪的白皮书描述了比特币作为纯粹的点对点电子现金的版本。区块链是随比特币一起引入的。在最初阶段,区块链仅用于比特币的比特币金融交易。

区块链不仅限制于比特币的金融交易,而且一般来说,任何由开放、去中心化账本维护的两方之间的交易。最重要的是,这种基础技术可以被分离并且可以有其他应用程序创建,从而引发了与之相关的实验和项目数量的激增。

许多受到区块链启发的项目开始了,比如以太坊、超级账本等,以及货币,比如莱特币、名称币、迅速币等等。

区块链本质上是一个分布式和去中心化的开放分类账,由其对等体之间的密码学管理和更新各种共识协议和协议。人们可以使用交易交换价值,而不需要任何第三方参与,并且维护分类账的权力分布在区块链的所有参与者或区块链的节点之间,使其成为一个真正分布式和去中心化的系统。

使用区块链的一些行业领域如下:

  • 加密货币:比特币是其中的最佳案例。除此之外,还有各种替代加密货币,如以太坊,莱特币,比特币等。

  • 网络安全:有各种公司和项目利用区块链的分布式特性来创建大规模使用的特殊认证协议。

  • 医疗保健:可扩展性是区块链的最佳催化剂之一;许多项目正在安全地存储数据,并使用分析来找到完美的解决方案。提供分散式的病人记录和认证已经在各种设施中得到应用。

  • 金融服务:许多保险和金融机构正在利用区块链来维护广泛的银行数据,如财务记录,分类账,担保,债券等等。

  • 制造业:供应链,样机和概念验证,以及商品的跟踪和追踪正以最佳效率利用区块链。

  • 治理:许多政府都在争相成为世界上第一个以区块链为动力的国家。区块链正在被应用于大多数政府部门,不仅仅局限于公共安全,交通,健康和运输等领域。

  • 零售:许多初创公司和项目旨在引入无中间人的开放生态系统;一些正在研究忠诚度系统和使用区块链衍生礼品卡系统。

  • 媒体:唱片公司可以使用区块链来保护其所有权网络和知识产权。

  • 旅行:有一些项目正在开展,以引入和革新车辆租赁,搭车共享等与旅行相关的问题。

  • 法律:区块链可以带来透明性,并解决当前复杂的法律体系中的规模问题。

此外,我们将讨论区块链的各种其他要素以及区块链可以解决的其他问题。

区块链的一般要素

现在是讨论区块链的一般要素的时候了,从其基本结构开始,到其构成以及进一步的细节。

对等网络

这是一种所有对等方都可以彼此通信并且享有同等权利的网络类型,无需服务器或主机的中央协调。在传统网络中,系统连接到一个中央服务器,这个服务器作为系统间通信的中心点。另一方面,在对等网络中,所有系统均等地相互连接,没有系统拥有中央权威。看一下这个图表:

客户端到服务器网络和对等网络之间的图像差异

区块

区块是区块链的最小单元;第一个区块称为创世区块。每个区块包含批量的经过哈希和编码的交易。区块以 Merkle 树形式存储。每个区块都包括链中上一个区块的哈希,将所有区块链接在一起。在比特币中,一个区块平均包含 500 多个交易。一个区块的平均大小约为 1 MB。一个区块由头部和交易列表组成。

区块头

比特币中的一个区块的区块头包含有关区块的元数据。考虑以下内容:

  • 比特币版本:此字段包含比特币版本号。

  • 上一个区块哈希:创建新区块哈希所需的上一个区块的哈希。

  • Merkle 根:这是当前区块交易的 Merkle 树根的哈希。

  • 时间戳:这是 UNIX 中的区块时间戳。

  • 挖矿难度:挖矿是比特币区块链生态系统的一个关键部分。在头部中提到了挖矿的难度目标。

  • Nonce:区块链在每个区块中添加偏差;这些称为随机数。看一下这张图表:

区块头的形成以及 Merkle 根和 Merkle 树的组成

地址

地址是用于在区块链上的交易中向另一个地址发送数据的唯一标识符;在比特币的情况下,地址是用于发送或接收比特币的标识符。比特币区块链地址已经从时间到时间演变。最初,IP 地址被用作比特币地址,但是这种方法容易受到严重的安全漏洞的影响;因此,决定使用 P2PKH 作为标准格式。 P2PKH 地址由 34 个字符组成,其第一个字符是整数 1。从字面上理解,P2PKH表示支付到公钥哈希。这是基于 P2PKH 的比特币地址的一个示例:1PNjry6F8p7eaKjjUEJiLuCzabRyGeJXxg。

现在,有另一种高级的比特币协议用于创建P2SH地址,这意味着支付到脚本哈希。 P2SH 地址与 P2PKH 地址的一个主要区别是,它始终以整数 3 开头而不是 1。

钱包

钱包是用于存储公钥或私钥以及交易地址的数字钱包。有各种类型的钱包可用,每种钱包都提供一定级别的安全性和隐私性。

以下是根据其功能的各种类型的钱包列表:

  • 软件:此钱包安装在实际计算机上;私钥访问由安装钱包软件的机器的所有者拥有。

  • 网络钱包:这些钱包基于云,并且可以在任何地方访问。私钥与钱包服务共享。

  • 纸钱包:该钱包的私钥被打印在纸上。

  • 硬件:这些是物理钱包,小巧便携。每个钱包的硬件用户都拥有私钥。

了解各种钱包的功能以及每种钱包的需求是非常重要的。

交易

交易是将数据从区块链中的一个地址转移到另一个地址的过程。在比特币中,它是指将比特币从一个地址转移到另一个地址。所有在区块链中发生的交易都从链的开始到当前时间都被注册;这些信息在网络和所有 P2P 节点之间共享。交易由矿工确认,他们会因为他们的工作而得到经济补偿。

区块链中的每笔交易都需要经过一定数量的确认,因为它们是交易的共识。没有确认,就无法验证任何交易。

节点

节点是区块链网络的一部分,并执行分配给它们的功能。连接到比特币网络的任何设备都可以称为节点。作为网络的积极组成部分并验证区块链所有规则的节点称为完整节点。另一种类型的节点称为超级节点,它充当高度连接的重新分配点和中继站。

区块链解决了什么问题?

区块链执行各种功能。我们将在这里简要讨论每一个功能,并稍后详细介绍:

  • 安全性:由于其共识结构和多个失败回退点,故障的可能性最小。其分布式性质提供了更好的安全性和可靠性。

  • 更快的结算:传统的银行协议非常耗时,并且产生相当大的外汇费用;另一方面,基于区块链的比特币提供了几乎即时的速度,为整个金融行业节省了时间和成本。

  • 透明度:由于其分散性质,无需第三方,因为区块链与所有拥有钱包的人共享,使其成为一个透明的、可信赖的系统。

  • 经济性:没有第三方,账本由所有人共享,这意味着没有开销或审计费用。

以下图表显示了中心化、分散化和分布式网络之间的区别:

由于区块链具有分布式的特性,它提供了许多开箱即用的功能,如高稳定性、安全性、可伸缩性和先前讨论过的其他功能。

区块链的类型

考虑到区块链的发展方式,我们可以将区块链分类为多种类型;这些类型定义了区块链的进程,并使其超越了 P2P 货币的使用范围。以下图表显示了当前可用或提出的不同类型的区块链网络。

现在我们将详细讨论每种类型的区块链网络。

公开区块链

公共区块链是一种任何人都可以成为交易过程节点的区块链。加密验证的经济激励可能存在,也可能不存在。这是一个完全开放的公共分类账系统。公共区块链也可以称为无许可分类账

这些区块链由加密经济学保护,即采用 PoW 或 PoS 或任何其他共识机制的经济激励和加密验证机制。这种区块链的一些流行例子包括比特币、以太坊、莱特币等。

半私有区块链

半私有区块链通常由单个组织或一群个人运行,他们授予任何用户访问权限,这些用户可以是直接消费者或用于内部组织目的。这种区块链有对公众开放的公共部分,任何人都可以参与。

私有区块链

在私有区块链中,写入权限由一个组织或一定群体的个人拥有。读取权限对公众开放或限制在大量用户中。这种区块链中的交易要由系统中很少的节点进行验证。

私有区块链的一些典型例子包括 Gem Health 网络、Corda 等。

联盟区块链

在这种类型的区块链中,正如其名称所示,共识权被限制在一组人或节点之内。这也被称为许可私有区块链。由于节点较少,在这些类型的区块链中,交易审核时间很快。挖矿的经济回报在这些区块链中是不可用的。

一些以联盟为基础的区块链的例子有德国交易所和 R3(金融机构)。

拜占庭将军问题

这是各种计算机网络近期才有确定解决方案的经典问题之一。这个问题被称为拜占庭将军问题BGP)。这个问题的根源在于一种关于共识的问题,这是由于对网络节点的不信任。

让我们假设各种将军正在指挥拜占庭军队,计划进攻一座城市,每位将军都有自己的军队。他们必须同时发起进攻才能取胜。问题在于一个或多个将军可能是不忠诚的,并传递错误的信息。因此,必须找到一种有效的解决办法,以便进行无缝沟通,即使遇到欺诈性的将军。

这个问题是由卡斯特罗和利斯科夫解决的,他们提出了实用拜占庭容错性PBFT)算法。后来,2009 年,通过发明比特币并开发 PoW 作为实现共识的系统,第一个实用的实现得以实现。

我们将在后面的章节详细讨论 BGP。

共识

共识是在区块链内的节点之间达成一般协议的过程。当它是一个分布式网络,并且需要对一个值达成一致意见时,有各种可用的算法。

共识机制:每个区块链都必须有一种机制,可以处理网络中存在的各种节点。一些区块链的主要共识机制如下所示:

  • 工作量证明PoW):这是最常用的共识机制,也是第一个加密货币比特币使用的机制。这种算法已经被证明最能抵抗 Sybil 攻击。

  • 权益证明PoS)这使得那些拥有最多加密货币的人更容易挖掘新的区块。

  • 委托权益证明DPOS)与 PoS 相比的一个小变化是,每个拥有权益的节点都可以通过投票将交易的验证委托给其他节点。

  • 重要性证明POI)旨在节能,并且也可以在相对较低功率的机器上运行。它依赖于权益以及代币的使用和流动来建立信任和重要性。

  • 时间过度证明PoET)这是由英特尔创建的一种区块链算法,使用可信执行环境TEE)来在保证等待时间的情况下实现随机性和安全性。

  • 燃烧证明PoB)这主要用于将一种加密货币引导到另一种加密货币。其基本概念是矿工必须证明他们已经销毁了硬币,也就是说,他们已经将其发送到一个可验证的不可花费的地址。

  • 活动证明PoA):在这种算法中,从整个网络中随机选择一个节点来签署一个必须是防篡改的新区块。

所有先前的算法以及一大批已经可用或正在研究中的算法都确保实现了完美的共识状态,并且网络上不存在可能的安全威胁。

区块链简介

是时候讨论区块链技术所面临的益处以及挑战或限制,以及整个社区正在采取的措施了。

益处

如果一切都关乎信任和安全,即使一切已经高度安全和私密,我们真的需要一个可信赖的系统吗?让我们来看看现有生态系统中每个存在的限制,以及区块链完全匹配的地方所面临的主要问题。

银行记录

银行业的记录保留和分类账维护是一个耗时且消耗资源的过程,仍然容易出现错误。在当前系统中,州内资金的转移很容易,但是当我们需要跨境转移资金时,主要面临的问题是时间和高昂的成本。

即使大多数资金只是数据库中的一项记录,它仍然产生很高的外汇成本,并且速度非常慢。

医疗记录

即使有电子记录,全球范围内的记录管理、验证和传输问题在实际应用时仍然很困难。由于没有通用的第三方,很多记录都是纸质保存的,并且容易损坏或丢失。

在流行病学病例中,有必要访问和挖掘特定地理位置患者的医疗记录。在这种情况下,区块链是一大福音,因为如果医疗记录存储在区块链上,那么这些记录就可以轻松获取,并且对于需要的用户来说也是安全和私密的。

政府记录

任何政府机构都必须处理其所有部门的大量记录;可以在区块链上进行新的备案,确保数据在分布式系统中始终保持安全。

数据存储的透明和分布式性使得系统无腐败,因为共识确保区块链中的参与者在需要时使用所需的标准。

创意和版权记录

版权和创意记录可以得到安全认证,以控制版权滥用和许可。

其中一个主要例子是 KodakCoin,这是基于区块链的面向摄影师的加密货币,旨在用于支付许可摄影作品。

大学学位记录

验证、认证和检查很困难。极易遭到盗窃和滥用。区块链可以为记录提供半私密访问,确保数字签名使用获得所需标准的区块链。

渐进地记录学位和成绩将有助于资源的有效利用,以及适当的分配和检查流程的便利性。

除了比特币和替代加密货币之外,上述只是区块链的各种用例。在接下来的章节中,我们将更详细地讨论这些观点。

挑战

与任何技术一样,区块链技术都存在各种挑战和局限。有必要解决这些挑战,并提出更健壮、可靠和富有资源的解决方案。让我们简要讨论每个挑战及其解决方案。

复杂性

区块链具有复杂性,但易于实施。

然而,随着广泛的意识和讨论,这可能在未来变得更容易。

网络可扩展性

如果区块链没有稳固的节点网络,维护区块链并为持续交易提供明确的共识将变得困难。

速度和成本

虽然基于区块链的交易速度非常快,而且比任何其他传统方法便宜,但是随着每个区块中交易数量的减少,这变得困难,速度也会减慢。

就成本而言,需要大量硬件,这反过来导致巨大的网络成本和节点之间的间歇网络的需求。

社区已提出了各种扩展解决方案。最好的方法是增加区块大小以实现更多的交易量每个区块,或者采用动态区块大小系统。除此之外,还提出了各种其他解决方案,以保持速度降低和成本控制。

双重支付

这是对区块链网络的一种攻击方式,即给定一组硬币在多个交易中被花费;比特币创始人在推出时提到的一个问题是51 攻击。在这种情况下,如果某个矿工或矿工组控制了超过一半的区块链计算能力,由于区块链的开放性质,任何人都可以成为节点的一部分;这会触发 51 攻击,在这种情况下,由于对网络的主导控制,该人可以确认一个错误的交易,导致同一硬币被花费两次。

另一种实现这一目标的方法是在区块链网络中快速连续进行两笔相互冲突的交易,但如果获得了大量确认,那么这种情况可以避免。

还有其他各种功能将在接下来的章节中讨论,值得注意的是,所有这些功能都存在于现有系统中,但考虑到活跃的社区支持,所有这些限制正在以很高的速度得到缓解。

总结

本章介绍了区块链。首先,讨论了分布式网络、金融交易和 P2P 网络的概念。然后,我们讨论了区块链的历史和各种其他主题,如区块链的元素、区块链的类型和共识。

在接下来的章节中,我们将更详细地讨论区块链;我们将讨论区块链背后的机制、比特币。我们还将更详细地了解如何达成共识,以及深入探讨基于区块链的应用,如钱包、以太坊、Hyperledger,一直到创建自己的加密货币。

第二章:区块链的组成部分和结构

区块链不是单一技术,而是更多的一种技术。区块链是一种架构概念,有许多构建区块链的方法,每种变体都会对系统运行产生不同的影响。在本章中,我们将讨论所有或大部分目前实施的区块链技术的方面。

在本章结束时,您应该能够描述区块链的各个部分,并在架构层面上评估一种区块链技术对另一种的能力。

以下是我们将要覆盖的概念:

  • 区块

  • 区块之间的链

  • 哈希和签名

  • 区块结构

  • 区块矿工

  • 区块验证者

  • 智能合约

  • 区块链速度

区块

区块链是一种特定的技术,但有许多形式和变种。例如,比特币和以太坊是工作量证明的区块链。以太坊有智能合约,并且许多区块链允许自定义代币。区块链可以通过它们的共识算法(PoS、PoW 和其他)来区分,在第七章——达成共识中有所涵盖以及它们的功能集,比如能够运行智能合约以及这些智能合约在实践中的运作方式。所有这些变体都有一个共同的概念:区块。区块链技术的最基本单位是区块。想象一个基本的电子表格,可以简单地将区块视为其。在这个电子表格中,您可能会看到这样的条目:

账户 交易额 新余额 旧余额 操作
账号-9234222 −$2,000 | $5,000 $7,000 向账号-12345678 发送资金
账号-12345678 $2,000 | $2,000 0 从账号-9234222 接收资金
账号-3456789 -$200 | $50 $250 向账号-68890234 发送资金
账号-68890234 $200 | $800 $600 从账号-3456789 接收资金

一个区块是区块链网络中的交易条目集,存储在充当参与者的计算机上。每个区块链网络都有一个区块时间,或者每个区块表示交易的大致时间,以及一个区块大小:无论如何,一个区块可以处理的总交易量。如果一个网络的区块时间为两分钟,那两分钟内只有四笔交易,那么该区块就只包含这四笔交易。如果一个网络有 1,000,000 笔交易,那么可能有太多交易无法适应区块大小。在这种情况下,交易必须等待它们的轮次,等待一个有剩余空间的空区块。一些区块链通过网络费的概念解决了这个问题。网络费是发送者愿意支付的金额(以区块链的原生代币计量),以便将交易纳入一个区块中。费用越高,优先级越高,可以立即被纳入链中。

区块之间的链

除了交易分类帐,每个块通常还包含一些附加元数据。元数据包括以下内容:

  • 对先前区块的引用

  • 网络的元数据

  • 交易的默克尔根,作为块有效性的检查

这些基础知识通常适用于所有的区块链。以太坊、比特币、莱特币等都使用这种常见模式,而这种模式也是链的本质。每个链还倾向于包含特定于该生态系统的其他元数据,这些差异将在以后的章节中讨论。以下是比特币区块链的一个示例:

作者:中本聪,http://Bitcoin.org/Bitcoin.pdf,麻省理工学院,https://commons.wikimedia.org/w/index.php?curid=24542868

如果你问,Merkle 根是什么?那就引出了我们下一组关键概念:哈希和签名。

哈希和签名

假设你有两个各 50 页长的文本文件。你想知道它们是否相同或不同。你可以使用哈希值来实现这一点。哈希(或哈希函数)是一种数学过程,它将任何输入转换为固定长度的输出。有许多这样的函数,最常见的是 SHA-1、SHA-2 和 MD5。例如,以下是一个名为MD5的哈希函数的输出,输入是两页文本:

9a137a78cf0c364e4d94078af1e221be

哈希函数的强大之处在于当我在末尾添加一个字符并运行相同的函数时会发生什么:

8469c950d50b3394a30df3e0d2d14d74

如你所见,输出完全不同。如果你想快速证明某些数据在任何方面都没有被改变,哈希函数就能胜任。在我们的讨论中,哈希函数的重要部分如下:

  • 计算机运行速度非常快。

  • 这个函数是单向的。你可以轻松地获得哈希值,但实际上你不能使用哈希值来恢复原始数据。

  • 它们可以被递归使用。例如,我可以取哈希的哈希;例如,MD5(8469c950d50b3394a30df3e0d2d14d74)变成了705b003fc9b09ecbeac0b852dfc65377

哈希的递归性质使我们引入了默克尔树的概念,这个概念是以专利命名的。默克尔树是一种数据结构,如果你在白板上画出它,它往往像一棵树。在树的每一步中,根节点包含其子节点数据的哈希值。以下是默克尔树的图示:

原始插图作者为 David Göthberg,瑞典,已释放至公共领域

在区块链中,这意味着存在着一个递归的哈希过程。递归哈希是指我们对哈希值进行哈希运算的过程。例如,想象一下我们有以下单词及其哈希值。这里,我们将使用 MD5 算法,因为在网络上很容易找到 MD5 哈希代码,所以你可以自己尝试一下:

Salad: c2e055acd7ea39b9762acfa672a74136
Fork: b2fcb4ba898f479790076dbd5daa133f
Spoon: 4b8e23084e0f4d55a47102da363ef90c

要计算递归哈希或根哈希,我们将把这些哈希值相加,如下所示:

c2e055acd7ea39b9762acfa672a74136b2fcb4ba898f479790076dbd5daa133f4b8e23084e0f4d55a47102da363ef90c

然后我们将对该值进行哈希,结果如下:

189d3992be73a5eceb9c6f7cc1ec66e1

这个过程可以一次又一次地发生。最终的哈希可以用来检查树中的任何值是否已更改。这个根哈希是一种数据高效且有效的方式,可以确保数据的一致性。

每个区块都包含了所有交易的根哈希。由于哈希的单向性,任何人都可以查看这个根哈希,并将其与区块中的数据进行比对,并知道所有数据是否有效和未更改。这使得任何人都可以快速验证每笔交易是否正确。每个区块链对这种模式都有小的变化(使用不同的函数或以稍微不同的方式存储数据),但基本概念是一样的。

数字签名

现在我们已经介绍了哈希,是时候来介绍一个相关的概念:数字签名。数字签名利用哈希的性质,不仅证明数据没有改变,还提供了谁创建了数据的保证。数字签名利用哈希的概念,还添加了一个新的概念:数字密钥

数字密钥是什么?

所有常见的数字签名方法都使用所谓的公钥密码学。在公钥密码学中,有两把密钥:一个公钥和一个私钥。为了创建签名,首先对原始数据进行哈希,然后使用私钥对该哈希进行加密。加密后的哈希,以及其他信息,如用于加密的方法,都被附加到原始数据中,形成签名。

这就是公钥发挥作用的地方。公钥和私钥之间的数学连接允许公钥解密哈希,然后可以用哈希来检查数据。因此,现在可以检查两件事情:谁签署了数据以及被签名的数据是否已被更改。以下是同样的图解表示:

由 Engelbert Niehaus 制作,用户 Bananenfalter 制作的 SVG 色彩方案 - 使用 Bananenfalter 制作的插图的 SVG 颜色,并使用 Inkscape 进行编辑,CC BY-SA 3.0,https://en.wikiversity.org/w/index.php?curid=226250

这种密码学形式对区块链技术至关重要。通过哈希和数字签名,区块链能够记录行为(代币的移动)以及证明是谁发起了这些行为(通过数字签名)。

让我们举个例子,Jeremy 和 Nadia 希望互相安全地发送消息。每个人都公布了一个公钥。Jeremy 的公钥将如下所示(使用 1,024 位的 RSA 算法):

-----BEGIN PUBLIC KEY-----
MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgH+CYOAgKsHTrMlsaZ32Gpdfo4pw
JRfHu5d+KoOgbmYb0C2y1PiHNGEyXgd0a8iO1KWvzwRUMkPJr7DbVBnfl1YfucNp
OjAsUWT1pq+OVQ599zecpnUpyaLyg/aW9ibjWAGiRDVXemj0UgMUVNHmi+OEuHVQ
ccy5eYVGzz5RYaovAgMBAAE=
-----END PUBLIC KEY-----

有了这把密钥,他将保持私有另一把密钥,其外观如下:

-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgH+CYOAgKsHTrMlsaZ32Gpdfo4pwJRfHu5d+KoOgbmYb0C2y1PiH
NGEyXgd0a8iO1KWvzwRUMkPJr7DbVBnfl1YfucNpOjAsUWT1pq+OVQ599zecpnUp
yaLyg/aW9ibjWAGiRDVXemj0UgMUVNHmi+OEuHVQccy5eYVGzz5RYaovAgMBAAEC
gYBR4AQYpk8OOr9+bxC6j2avwIegwzXuOSBpvGfMMV3yTvW0AlriYt7tcowSOV1k
YOKGqYdCflXwVTdtVsh//KSNiFtsLih2FRC+Uj1fEu2zpGzErhFCN2sv1t+2wjlk
TRY78prPNa+3K2Ld3NJse3gmhodYqRkxFFxlCmOxTzc4wQJBAOQ0PtsKCZwxRsyx
GAtULHWFIhV9o0k/DjLw5rreA8H3lb3tYZ5ErYuhS0HlI+7mrPUqzYaltG6QpJQY
YlMgktECQQCPClB1xxoIvccmWGoEvqG07kZ4OBZcBmgCzF6ULQY4JkU4k7LCxG4q
+wAeWteaP+/3HgS9RDQlHGITAmqhW6z/AkBaB16QzYnzC+GxmWAx//g2ONq0fcdw
eybf4/gy2qnC2SlDL6ZmaRPKVUy6Z2rgsjKj2koRB8iCIiA7qM8Jmn0xAkBzi9Vr
DqaNISBabVlW89cUnNX4Dvag59vlRsmv0J8RhHiuN0FT6/FCbvetjZxUUgm6CVmy
ugGVaNQgnvcb2T5pAkEAsSvEW6yq6KaV9NxXn4Ge4b9lQoGlR6xNrvGfoxto79vL
7nR29ZB4yVFo/kMVstU3uQDB0Pnj2fOUmI3MeoHgJg==
-----END RSA PRIVATE KEY-----

与此同时,娜迪亚将采取相同的步骤,得到以下两个密钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHWwgTfI5Tic41YjUZqTmiKt+R
s5OMKIEdHPTyM8FZNaOBWIosFQbYk266V+R7k9odTnwCfi370GOt0k5MdTQilb9h
bK/lYiavIltgBd+1Em7xm7UihwO4th5APcg2vG4sppK41b1a9/I5E6P/jpQ320vF
BMuEtcnBoWawWcbXJwIDAQAB
-----END PUBLIC KEY-----

这是她的私钥:

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDHWwgTfI5Tic41YjUZqTmiKt+Rs5OMKIEdHPTyM8FZNaOBWIos
FQbYk266V+R7k9odTnwCfi370GOt0k5MdTQilb9hbK/lYiavIltgBd+1Em7xm7Ui
hwO4th5APcg2vG4sppK41b1a9/I5E6P/jpQ320vFBMuEtcnBoWawWcbXJwIDAQAB
AoGBAKz9FCv8qHBbI2H1f0huLQHInEoNftpfh3Jg3ziQqpWj0ub5kqSf9lnWzX3L
qQuHB/zoTvnGzlY1xVlfJex4w6w49Muq2Ggdq23CnSoor8ovgmdUhtikfC6HnXwy
PG6rtoUYRBV3j8vRlSo5PtSRD+H4lt2YGhQoXQemwlw+r5pRAkEA+unxBOj7/sec
3Z998qLWw2wV4p9L/wCCfq5neFndjRfVHfDtVrYKOfVuTO1a8gOal2Tz/QI6YMpJ
exo9OEbleQJBAMtlimh4S95mxGHPVwWvCtmxaFR4RxUpAcYtX3R+ko1kbZ+4Q3Jd
TYD5JGaVBGDodBCRAJALwBv1J/o/BYIhmZ8CQBdtVlKWCkk8i/npVVIdQB4Y7mYt
Z2QUwRpg4EpNYbE1w3E7OH27G3NT5guKsc4c5gcyptE9rwOwf3Hd/k9N10kCQQCV
YsCjNidS81utEuGxVPy9IqWj1KswiWu6KD0BjK0KmAZD1swCxTBVV6c6iJwsqM4G
FNm68kZowkhYbc0X5KG1AkBp3Rqc46WBbpE5lj7nzhagYz5Cb/SbNLSp5AFh3W5c
sjsmYQXfVtw9YuU6dupFU4ysGgLBpvkf0iU4xtGOFvQJ
-----END RSA PRIVATE KEY-----

有了这些密钥,杰里米决定给娜迪亚发送一条消息。他使用她的密钥并加密以下消息:我爱比特币,结果如下所示的数据:

EltHy0s1W1mZi4+Ypccur94pDRHw6GHYnwC+cDgQwa9xB3EggNGHfWBM8mCIOUV3iT1uIzD5dHJwSqLFQOPaHJCSp2/WTSXmWLohm5EAyMOwKv7M4gP3D/914dOBdpZyrsc6+aD/hVqRZfOQq6/6ctP5/3gX7GHrgqbrq/L7FFc=

除了娜迪亚以外,没有人能读到这个。她使用相同的算法,输入这些数据和她的私钥,得到以下消息:

I love Bitcoin.

我们将在第四章中讨论更多关于这个话题的内容,密码学和区块链背后的机制

示例区块数据

在本节中,我们将研究区块链中使用的数据结构。我们主要将关注以太坊、比特币和比特股区块链,以查看关键的共同点和不同点。

示例以太坊区块

这是来自示例以太坊区块的数据,来自区块 5223669:

如果你记得,在本章的开头,我们说有三件事是区块链的共同点:对先前区块的引用,区块中交易的哈希值,以及特定于网络的元数据。在这个来自以太坊网络的区块中,这三者都存在。对先前区块的引用包含在区块高度和父哈希值中。交易的哈希值是哈希条目,元数据是其他所有内容,这将是网络特定的。

比特币区块

这是比特币区块的快照:

比特币和以太坊都是 PoW 链;现在让我们来看一个股权证明POS)生态系统:比特股。

这是来自比特股区块的一些数据:

尽管架构完全不同,但基本原理仍然存在:对先前区块的引用,默克尔根和网络元数据。在比特股中,您还可以看到有一个见证签名。作为 PoS 区块链,比特股有验证者(它们被称为见证人)。在这里,我们看到负责计算此区块的计算机的见证和签名。

全局状态

区块链技术的一个关键特性是它可以作为一个可信任的全局状态。有许多应用场景中,可信任的全局状态是重要但困难的,比如金融技术和物流。

例如,几年前,我在线订购了一些摄像机设备。几天后,我回家时惊讶地发现我的设备已经到货了。我非常感激,因为那些昂贵的设备没有被偷走。直到第二天我才收到卖家发来的一封邮件,提醒我包裹已经发出。

这里清晰地列出了全局状态的细节。事实上,摄像机已经在一辆卡车上了,但我和货运商都没有妥善地存储这些信息。如果我的摄像机设备从我门口被盗走了,那将会很难发现发生了什么。

如果卖方、物流公司和我都从区块链中写入和读取数据,这将是不可能的。当物流公司登记货物时,物体的状态会发生变化,一旦下一个区块被确认,卖方和我都会立即知道。

区块时间和区块大小

正如之前讨论的,每个区块链都有一个区块时间和一个区块大小。每个网络可能具有非常不同的值和处理区块时间的方式。例如,在比特币中,区块时间是 10 分钟,而在以太坊中,区块时间是 20 秒。在恒星网络中,区块时间约为 4 秒。这些区块时间是由运行网络的代码确定的。对于比特币、莱特币和以太坊等网络,区块时间实际上是一个平均值。因为这些是 PoW 网络,一旦矿工解决了挖矿难题,他们就可以证明该区块已完成。在这些网络中,难题的难度会自动调整,以便平均达到所需的区块时间。

区块大小是每个区块中可以存储的最大信息量。对于比特币来说,这是价值 1 MB 的交易数据。对于以太坊来说,限制实际上是以 GAS 为单位衡量的,GAS 是一种特殊的计量单位,用于衡量处理能力(因为以太坊具有智能合约)以及存储。与比特币不同,每个区块的 GAS/存储限制不是固定的,而是由矿工动态调整的。

需要注意的是,区块中只包含可能的信息,直到被网络确认为止。例如,可能会发生 1000 笔交易,但如果只有 500 笔被记录在下一个区块中,那么只有这 500 笔交易是真实的。剩余的交易将继续等待被包含到未来的区块中。

区块链矿工

区块链矿工和区块链验证者(见下面的部分)都与共识有关,这将在第七章 实现共识 中深入探讨。通常,区块链矿工与区块链相关联。PoW 链通过让矿工的计算机竞争执行证明链中的区块所需的工作来运作。目前,唯一主要的 PoW 区块链是比特币、莱特币和以太坊。大多数其他系统使用 PoS 共识的变体,我们将在下一节 区块链验证者 中讨论。我们将在第十八章 挖矿 中详细介绍挖矿的工作原理。

区块链验证者

区块链验证者被 PoS 系统使用。 PoS 系统通过要求希望参与网络的计算机拥有股份(大量代币)来帮助区块链运作。与 PoW 算法不同,计算机不能加入网络并期望在共识中发挥任何作用。相反,他们必须通过代币所有权来购入。根据网络的不同,验证者的命名约定可能不同。Tendermint 有验证者,Steemit 和 Bitshares 有见证人,Cardano 有股东等。验证者是允许参与网络并这样做的具有正股份(代币数量)的计算机。每个链都有自己的规则来解决这个问题,这将在第七章 实现共识中更加深入地讨论。

智能合约

一些区块链被称为具有智能合约,当它们能够根据链的变化执行操作和行为时。这将在第十四章 智能合约和第十七章 去中心化应用程序中深入讨论。

区块链速度

区块链系统的一个持续关注点是性能。公共区块链是全球性系统,其系统资源同时由全球所有用户共享。由于用户基数庞大,资源约束是一个真正的问题,并且已经导致了真正的问题。例如,一个名为CryptoKitties的热门游戏在以太坊上推出,导致网络拥塞。其他应用程序几乎无法使用,因为来自 CryptoKitties 的负载使网络不堪重负。

如何计算区块链吞吐量

计算区块链吞吐量的快速粗略方法如下:

对于比特币,交易吞吐量约为7tx/second。这是因为区块相对较小,而且区块时间非常长。以太坊具有较短的区块时间,但区块非常小,因此最终达到约14tx/second。像 Stellar、Bitshares 和 Waves 这样的区块链可以达到每秒超过1000tx/second的速度。

与传统网络的比较

VISA 是全球首要的支付处理网络。在公司的一篇博客中,透露 VISA 每秒可以处理超过 40,000 笔交易。这是峰值容量,除了在诸如圣诞节之类的时候,它通常不会处理这么多交易。然而,应清楚地看到,区块链在能够与 VISA 相媲美的规模上处理全球支付之前还有很长的路要走。然而,像 EOS 和 COSMOS 这样的新网络正在尝试,通过创新的多线程设计和分段区块链区域。

摘要

现在你应该理解了区块链的基本组成部分。区块是一组被聚合在一起的交易,并充当区块链的基本单位。在 PoW 区块链上,矿工是创建新区块的计算机。在 PoS 区块链上,验证者,也称为见证人和其他名称,是创建区块的计算机。数字签名由公钥和私钥组成,并利用数学来证明数据的作者。

哈希的关键思想是使用数学函数将任意数据映射到一个单一、易处理的值。对数据的任何更改都将使最终值大不相同。

  • 从哈希值构造原始数据基本上是不可能的,但从原始数据创建哈希值却很容易。

  • 你可以利用这些属性来证明数据未被更改。

在下一章中,我们将学习这些系统是什么,以及区块链如何同时具备这两种特性。我们将学习如何区分这两个系统,并且为什么这些概念对区块链如此重要。

第三章:分散化与分布式系统

区块链领域最大的误解之一在于分布式系统与去中心化系统之间的区别。在本章中,我们将讨论这两种类型的系统,它们为什么重要,它们的相似之处,它们的不同之处,以及区块链技术如何适用于这两个类别。

通过本章结束时,你应该能够做到以下事情:

  • 定义分布式系统

  • 定义去中心化系统

  • 了解分布式系统的优缺点

  • 了解去中心化系统的优缺点

分布式系统

分布式系统是指应用程序及其架构分布在大量机器和最好是物理位置之间。更简单地说,分布式系统是指系统的目标分布在不同位置的多个子系统之间。这意味着多台计算机在多个位置上必须协调以实现整个系统或应用程序的目标。这与单片应用程序不同,单片应用程序将所有内容捆绑在一起。

让我们以一个简单的 Web 应用程序为例。基本的 Web 应用程序会在单个 Web 服务器上运行处理、存储和其他所有内容。代码往往以单体形式运行——所有内容都捆绑在一起。当用户连接到 Web 应用程序时,它会接受 HTTP 请求,使用代码处理请求,访问数据库,然后返回结果。

优点是这样很容易定义和设计。缺点是这样的系统只能扩展到一定程度。要添加更多用户,必须增加处理能力。随着负载的增加,系统所有者不能只是添加额外的机器,因为代码没有设计成可以同时在多台机器上运行。相反,所有者必须购买更强大、更昂贵的计算机来跟上。如果用户来自全球各地,还有另一个问题——一些接近服务器的用户将获得快速响应,而距离更远的用户将会有一些延迟。下图说明了单一的、单片代码构建到单一构件的情况:

如果运行此应用程序的计算机出现故障、停电或被黑客入侵会发生什么?答案是整个系统会完全崩溃。出于这些原因,企业和应用程序变得越来越分布式。分布式系统通常分为客户端-服务器、三层、多层或点对点几种基本架构。区块链系统通常是点对点的,因此我们将在这里讨论这一点。

分布式系统的优点有很多,如下所示:

  • 弹性:如果系统的某个部分出现故障,整个系统不会失败

  • 冗余性:系统的每个部分都可以构建备份,以便在出现故障时可以使用另一个副本,有时可以立即使用

  • 并行性:工作可以有效地分割,这样就可以使用许多廉价的计算机而不是一个昂贵的快速计算机

弹性

弹性是系统适应和持续工作以应对变化和挑战的能力。弹性只能讨论在系统具有弹性的事件类型的情况下。系统可能对关闭一些计算机具有弹性,但对核战争可能没有弹性。

弹性可以分解为不同的子类别:

  • 容错:系统处理无效状态、错误数据和其他问题的能力

  • 故障隔离:系统的一部分出现问题不会影响到系统的其他部分。某处出现的错误数据或系统故障不会导致其他地方出现问题

  • 可伸缩性:在高负荷下能够提供额外容量的可伸缩系统对负载具有弹性

  • 复杂性管理:一种有办法管理复杂性的系统有助于使其对人为错误有弹性

现在我们将更详细地讨论容错。

容错能力和故障隔离

当某些部分出现故障或失灵时,系统仍能够运行的系统被认为是具有容错能力的。通常,容错是个依赖程度的问题:子组件的故障水平要么被系统的其他部分抵消,要么是逐渐退化而不是绝对的关闭。故障可能发生在许多不同的层次:软件、硬件或网络。具有容错能力的软件需要在这些层次的任何部分出现部分中断时继续运行。

在区块链中,个别硬件层面的容错是通过每个功能的存在多个重复计算机来处理的-比特币或工作证明系统中的矿工或 PoS 和相关系统中的验证者。如果计算机出现硬件故障,那么它要么不会有效地签署与网络一致的交易,要么它将停止充当网络节点——其他计算机会接管。

一致性和协调

区块链的最重要的方面之一就是共识的概念。我们将在第七章中讨论区块链实现共识的不同方法,实现共识。暂时来说,理解大多数区块链网络都有协议,允许它们只要网络上的计算机有三分之二到略高于一半正常运行,就能正常工作就足够了,虽然每个区块链网络都有不同的方法来保证这一点,这将在未来的章节中介绍。

备份

在大多数区块链中,每台计算机作为网络中的全参与者,保存了自网络启动以来发生的所有交易的完整副本。这意味着,即使在灾难压力下,只要网络中的一小部分计算机保持正常运行,就会存在一个完整的备份。

在 PoS 链中,通常会有更少的全参与者,因此备份和分布的数量要少得多。到目前为止,这种减少的冗余级别还没有成为问题。

一致性

正如之前的章节中所讨论的,区块链上的哈希和所有交易和行为的 Merkle 根允许轻松计算一致性。如果区块链上的一致性被打破,将会立即被注意到。区块链被设计为永远不会不一致。但只因数据一致,并不意味着它正确。这些问题将在第二十一章《可扩展性和其他挑战》中讨论。

对等系统

今天大多数使用的计算机系统都是客户端-服务器。一个很好的例子是你的网络浏览器和典型的 web 应用程序。你打开 Google Chrome 或其他浏览器,访问一个网站,你的计算机(客户端)连接到服务器。系统上所有的通信都是在你和服务器之间进行的。任何其他连接(比如在 Facebook 上与朋友聊天)都是由你的客户端连接到服务器,然后服务器再连接到另一个客户端,服务器起到中间人的作用。

对等系统是关于剔除服务器的。在对等系统中,你的计算机和你朋友的计算机会直接连接,中间没有服务器。

以下是说明对等架构的示意图:

分散式系统

所有分散系统都必须是分布式的。但分布式系统不一定是分散的。这对很多人来说是困惑的。如果一个分布式系统是分布在许多计算机、位置等等之间,那么它怎么可能是集中的呢?

这种差异涉及到位置和冗余与控制。在这种情况下,集中化涉及到控制。一个很好的例子来展示分布式和分散式系统的区别是 Facebook。Facebook 是一个高度分布式的应用程序。它在全球范围内拥有服务器,运行着数千种的软件变体进行测试。它的任何数据中心都可能出现故障,但大部分网站功能仍将继续运行。它的系统是分布式的,具有容错性、广泛协调、冗余等等。

然而,这些服务仍然是集中化的,因为在没有其他利益相关者的参与的情况下,Facebook 可以改变规则。数百万小型企业使用并依赖 Facebook 进行广告。迁移到 Facebook 的群体可能会突然发现他们的旧信息、工作和连接能力被撤销,而且没有追索权。Facebook 已经成为其他人依赖但没有相互依赖协议的平台。对于所有依赖 Facebook 平台的群体、企业和组织来说,这是一个可怕的情况,部分或全部地依赖 Facebook 平台。

过去十年间,出现了大量高度分布但高度集中的平台公司——Facebook、Alphabet、AirBnB、Uber 等,它们为同行之间提供了一个市场,但几乎完全不受其用户的约束。由于这种情况,人们越来越希望去中心化的应用和服务。在去中心化系统中,没有中央压倒性的利益相关者有能力在没有其他网络用户许可的情况下制定和执行规则。

原则上的去中心化系统

像分布式系统一样,去中心化更多地是一个滑动的比例,而不是绝对的状态。要评判一个系统的去中心化程度,有许多因素需要考虑。我们将要考虑对区块链和去中心化应用和组织特别相关的因素。它们如下:

  • 开放式访问

  • 非层次化

  • 多样性

  • 运作透明

开放式访问

按定义,任何实际上或逻辑上封闭的系统都至少在某种程度上是集中化的。一个封闭的系统自动地集中在先前的行为者身上。正如去中心化系统的所有其他方面一样,这不是二进制的是/否,而更像是可能性的滑动比例。

早期的互联网被认为是革命性的一部分,部分原因是由于它的开放式访问性质和任何人(只要有电脑、时间和接入)都可以上网并开始交换信息的能力。同样,迄今为止,区块链技术一直保持着开放式的创新和访问。

非层次化

层次结构系统通常在公司和组织中普遍存在。在层次结构的顶端的人拥有压倒性的权力来指导资源和事件。层次结构有不同的极端。在一个极端,你可能有一个仲裁者拥有绝对权力的系统。在另一个极端,你可能有一个每个系统成员都拥有相同直接权力的系统,因此控制是通过影响力、声誉或某种其他形式的组织货币来实现的。

在区块链领域,出现了几种非层次结构的形式。首先是在工作量证明挖矿系统中。所有矿工在区块链中基本上是平等的参与者,但他们的影响力与他们向网络提供的计算资源成比例。

在 PoS 区块链系统中,权力是基于特定协议的投资/股份水平分布的。在这种情况下,去中心化是通过大规模采用以及与其他链的竞争实现的。如果一个链变得过于集中化,没有什么可以阻止用户迁移到另一个链。

这些系统随着时间的推移将保持多么去中心化是一个开放的问题。

生态系统多样性

开放访问自然而然地导致去中心化系统的另一个特性:多样性。多样性系统与单一文化相对立。在技术上,单一文化是单一系统的压倒性优势,比如在美国企业界长期存在的 Windows 的主导地位。

透明度

在一个系统中,权力集中的一种方式是通过信息主导,即一个系统中的某一组参与者拥有比其他参与者更多或更大的信息访问权。在大多数当前的区块链技术中,链上的每个参与者获得相同数量的信息。也有一些例外。比如,Hyperledger Fabric 有能力让参与者隐藏信息。

具有完全强制性透明度的能力是人们对区块链系统感兴趣的驱动因素之一。通过创建透明且不可忘记的记录,区块链在物流和法律记录方面具有明显的实用性。在区块链上的记录,可以确保数据未被更改。透明的区块链还确保了公平性水平——参与者都可以确信,至少有一个共享的真相水平供所有人使用,而这种水平不会改变。

弊端

去中心化系统并非没有其缺点。以下是与区块链相关的去中心化系统的一些关键问题:

  • 速度

  • 抗审查性

  • 混乱/非确定性

速度

集中化系统和去中心化系统在处理某些类型事件时往往会更快或更慢。区块链是分布式的记账系统。理解基本区块链,比如比特币,可以认为它是一个仅能追加的数据库。比特币每秒可以处理大约七笔交易。相比之下,Visa 和 MasterCard 是分布式(但不是去中心化)的交易处理系统,每秒可以处理超过 40,000 笔交易。区块链系统的速度继续增加,但通常以一定程度的中心化或对访问的限制作为交换。一些 PoS 系统,如 Tendermint 或 Waves,理论吞吐量超过 1,000 tx/秒,但仍远远低于其传统对应系统的峰值容量。

抗审查性

去中心化系统由于缺乏中央权威机构进行审查而往往更难以审查。对于言论自由和信息自由的纯粹主义者来说,这一点根本不被视为缺点。然而,一些信息(儿童色情、仇恨言论、制造炸弹的指令)被视为危险或不道德的公开传播,因此应该被审查。作为一种技术,一旦包含该信息的区块完成,写入区块链的任何内容都是不可变的。例如,Steemit 是一个基于区块链的社交博客平台,每篇帖子都保存在链上。一旦每个区块被最终确定,数据就无法删除。系统的客户端可以选择不显示信息,但信息仍然存在,供想要查看的人使用。

对审查的渴望延伸到自我审查。写入区块链的内容是不可变的,即使对于其作者也是如此。例如,通过比特币进行的金融交易永远无法向当局隐藏。虽然比特币是匿名的,但一旦一个人与比特币钱包相关联,就可以轻松追踪自区块链开始以来的每一笔交易。

因此,基于区块链的国家货币将允许完美的税收——由于对链的完美财务监控。因此,抗审查性质具有双重性。

混沌和非确定性

去中心化系统往往比集中式系统更加混乱,这是它们的天性。在去中心化系统中,每个参与者都按照自己的意愿行事,而不是按照一个全面性权威的要求。因此,去中心化系统很难预测。

总结

在本章中,我们讨论了分布式系统与去中心化系统之间的区别,并介绍了一些关键特性。您现在应该了解到每个去中心化系统也是一个分布式系统,以及每个概念的一些关键方面。

在下一章中,我们将开始研究这些东西在实践中的运作。

第四章:区块链背后的密码学和机制

区块链的使用依赖于密码学。数值密码学可以被视为一种近代发明,过去的密码依赖于交换单词和字母。正如我们将看到的,现代密码学是一种非常强大的工具,用于保护通信,并且,对于我们的主题非常重要的是,确定数字签名的来源和数字资产的真实性。

本章将涵盖以下主题:

  • 安全原则

  • 历史视角 - 古典密码学

  • 密码签名

  • 散列

安全原则

密码学保护了信息安全的三个原则,可以通过记忆设备中央情报局CIA)来记忆:

  • 保密性:确保信息与适当的方当共享,并且敏感信息(例如,医疗信息,某些财务数据)仅在适当方的同意下共享。

  • 完整性:确保只有授权方可以更改数据,并且(根据应用程序的情况)所做的更改不会威胁数据的准确性或真实性。这一原则可以说是与区块链最相关的,尤其是公共区块链。

  • 可用性:确保授权用户(例如,持有代币的用户)在需要或想要时可以使用数据或资源。区块链的分布式和去中心化特性极大地有助于实现这一点。

与区块链和加密货币的相关性立即显而易见:例如,如果区块链没有提供完整性,那么用户试图花费的资金或代币是否存在将无法确定。对于区块链的典型应用,其中链可能持有房地产或证券的产权,数据完整性确实非常重要。在本章中,我们将讨论这些原则与区块链的相关性以及如何通过加密来保证诸如完整性等内容。

历史视角 - 古典密码学

密码学是指用于保护信息或通信的任何方法或技术,特别是指用于安全通信方法和协议的研究。过去,密码学是指加密,这是一种指代用于编码信息的技术。

在其最基本的形式中,加密可以采用替换密码的形式,即根据双方预先共享的代码,对消息中的字母或单词进行替换。经典示例是凯撒密码,其中个别字母根据它们在字母表中的位置索引,并向前移动给定数量的字符。例如,字母A可能会变成字母N,密钥为 13。

这种具体形式的凯撒密码被称为 ROT****13,它可能是唯一继续定期使用的替换密码——它为用户提供了一种轻松可逆的方式来隐藏粗言秽语或静态网站上的谜题解答(当然,同样的功能也可以非常简单地用 JavaScript 实现)。

这个非常简单的例子介绍了两个重要概念。第一个是算法,它是对具有可预测、确定性结果的特定计算的正式描述。取消息中的每个字符,并在字母表中向前移动 n 个位置。第二个是密钥:在这个算法中 n 是 13。在这种情况下,密钥是一个预共享的秘密,一种双方(或更多)已经同意的代码,但正如我们将看到的,这并不是唯一的密钥类型。

密码学类型

密码学主要分为对称加密和非对称加密。对称加密是指密钥是预共享或协商的加密方式。AES、DES 和 Blowfish 是对称加密中使用的算法的示例。

对称密码学

大多数精通计算机的用户都熟悉 WEP、WPA 或 WPA2,这些是 Wi-Fi 连接中使用的安全协议。这些协议存在的目的是防止无线连接上传输的数据被截取和篡改(或者换句话说,为无线用户提供保密性和完整性)。现在的路由器通常都会在上面打印无线密码,这是一个非常直接的预共享密钥的例子。

对称加密中使用的算法通常非常快速,并且与非对称加密相比,生成新密钥(或使用它加密/解密数据)所需的计算能力相对较少。

非对称(公钥)密码学

非对称密码学(也称为公钥密码学)采用两个密钥:一个公钥,可以广泛共享,一个私钥,保持秘密。公钥用于加密传输到私钥持有者的数据。然后使用私钥进行解密。

公钥密码学的发展使得诸如电子商务网上银行等事物得以发展,并补充了经济的很大一部分。它使电子邮件具有一定的保密性,并使财务报表可通过网络门户获得。它还使电子税务申报成为可能,并使我们能够信任地与也许是完全陌生的人分享我们最私密的秘密——你可能会说它使整个世界更加紧密地联系在一起。

由于公钥不需要保密,它允许诸如证书颁发机构和 PGP 密钥服务器之类的东西存在——发布用于加密的密钥,只有持有私钥的人才能解密使用该发布密钥加密的数据。用户甚至可以发布加密文本,这种方法会享有一定程度的匿名性——将加密文本放在新闻组、电子邮件邮件列表或社交媒体上的群组中会使其被众多人接收,而任何窃听者都无法确定预期的接收者。这种方法在区块链世界中也会很有趣——成千上万个节点镜像着一个没有已知接收者的密文,也许永远,无法撤销,而且接收者绝对否认。

公钥密码学比对称密码学的计算成本更高,部分原因是使用的密钥大小巨大。美国国家安全局目前要求商业应用中密钥大小为 3,072 位或更大,这是公钥密码学的主要用途。相比之下,128 位加密通常被认为对大多数加密应用足够了,256 位是美国国家安全局对保密性的标准。

大多数情况下,虽然可以仅使用公钥算法,但公钥密码学最常见的用途是为其余会话协商对称密钥。在大多数实现中,对称密钥不会被传输,因此,如果攻击者夺取了一个或两个私钥,他们将无法访问实际的通信内容。这个特性被称为前向保密性。

有些协议,比如 SSH,用于远程访问计算机,非常积极主动。在一个会话期间,SSH 会定期更改密钥。SSH 还展示了公钥密码学的基本属性——可以将您的公钥放在远程服务器上进行身份验证,而不会有任何固有的保密问题。

如今大多数使用的加密技术都不是不可破解的,只要有极大(或无限)的计算资源。然而,适用于保护需要保密性的数据的算法被认为是计算上不太可能的——也就是说,破解加密所需的计算资源不存在,并且在不久的将来也不会存在。

签名

值得注意的是,尽管在对数据进行加密以发送到特定接收者时,使用私钥进行解密,但通常可以反向操作。对于加密签名,使用私钥生成一个可以使用给定用户发布的公钥解密(验证)的签名。这种公钥加密的反转用法允许用户以明文发布消息,并高度确信签署者是写下这条消息的人。这再次引出了完整性的概念——如果由用户的私钥签署,消息(或交易)可以被假定为真实的。通常,在涉及区块链的情况下,当用户希望转移代币时,他们会用钱包的私钥签署交易。然后用户广播该交易。

现在多重签名钱包也相当常见,在这种情况下,交易最常由多个用户签名,然后广播,要么在托管钱包服务的网络界面上,要么在本地客户端中。这在具有分布式团队的软件项目中是一个相当常见的用例。

哈希化

与加密概念不同(并且存在于许多加密机制中,例如加密签名和身份验证)的是哈希,它指的是一种确定性算法,用于将数据映射到固定大小的字符串。除了确定性外,加密哈希算法必须具有几个其他特征,本节将介绍这些特征。

正如我们将在接下来的部分看到的那样,哈希函数必须难以反向操作。大多数通过高中代数的读者会记得被因式分解折磨过。乘法是一个容易完成的操作,但是很难反向操作——找到一个大数的公因数需要更多的努力,而不是将该数作为乘法的乘积创建出来。这个简单的例子实际上享有实际应用。适当大的数,它们是两个质数的乘积——被称为半素数或(较少见的)双质数——在 RSA 中得到了应用,这是一种广泛使用的公钥密码算法。

RSA 是公钥加密中的黄金标准,使得 SSH、SSL 和诸如 PGP 等电子邮件加密系统成为可能。基于这样的操作——单向容易,反向非常困难——才使得加密技术如此强大。

雪崩效应

坚固的哈希算法的一个理想特征称为雪崩效应。输入的微小变化应导致输出的剧烈变化。例如,使用输出重定向和大多数 Linux 发行版中都有的 GNU md5sum 实用程序,以下是三个示例:

$ echo "Hills Like White Elephants by Ernest Hemingway" | md5sum
86db7865e5b6b8be7557c5f1c3391d7a -
$ echo "Bills Like White Elephants by Ernest Hemingway" | md5sum
ccba501e321315c265fe2fa9ed00495c -
$ echo "Bills Like White Buffalo by Ernest Hemingway"| md5sum
37b7556b27b12b55303743bf8ba3c612 -

将一个单词改为完全不同的单词与改变一个字母的结果相同:每个哈希都完全不同。在密码哈希的情况下,这是一个非常理想的属性。一个恶意的黑客无法接近它,然后尝试类似密码的排列。然而,我们将在接下来的章节中看到,哈希并不完美。

碰撞

理想的哈希函数不会发生碰撞。碰撞是两个输入产生相同输出的情况。碰撞会削弱哈希算法,因为可能通过错误的输入获得预期的结果。由于哈希算法用于根证书的数字签名、密码存储和区块链签名,一个具有许多碰撞的哈希函数可能允许恶意黑客从密码哈希中检索密码,从而用于访问其他帐户。一个具有许多碰撞的弱哈希算法可能有助于中间人攻击,使攻击者能够完美地欺骗安全套接字层SSL)证书。

MD5,上面示例中使用的算法,被认为不适用于加密哈希。区块链幸运地大部分使用更安全的哈希函数,如 SHA-256 和 RIPEMD-160。

哈希一个块

在 PoW 系统中,向区块链添加新条目需要计算哈希值。在比特币中,矿工必须对块中的当前交易计算两个 SHA-256 哈希值,并且其中包括上一个块的哈希值。

对于哈希算法来说,这相当简单。让我们简要重申一下:理想的哈希函数接受预期输入,然后输出唯一的哈希值。它是确定性的。只有一个可能的输出,并且使用不同的输入无法获得该输出(或者在计算上几乎不可能)。这些属性确保了矿工可以处理一个区块,并且每个矿工可以返回相同的结果。正是通过哈希,区块链获得了对其采用和当前流行至关重要的两个属性:分散性和不可变性。

将当前块链接到前一个块和后续块在某种程度上是使区块链成为一个不断增长的交易链表(为其提供不可变性属性)的原因之一,哈希算法的确定性特性使得每个节点都能够毫无问题地获得相同的结果(为其提供了分散性)。

Hashing 在 PoW 之外

除了工作量证明外,PoS 和 DPoS 也利用哈希,而且在很大程度上是出于相同的目的。已经有大量讨论专门讨论 PoS 是否会取代 PoW 并阻止我们运行数千台计算机执行耗费巨大的碳足迹的繁琐哈希计算。

尽管 PoW 系统的功耗和环境影响相当大,但似乎仍然存在。可以说,其原因是非常简单的经济学原理:矿工有动机通过计算哈希来验证交易,因为他们可以获得新产生的代币中的一部分。对于权益证明或分布式权益证明的更复杂的代币经济方案,通常不经得起检验。

举个例子,股票照片区块链项目的想法——我们称之为 Cannistercoin。用户向股票照片网站贡献照片,作为回报他们会收到代币。这个代币也可用于从网站购买股票照片,并且该代币在交易所上交易。

这样看起来似乎可行,而且是一个完整的市场——Cannistercoin 已经确定了买家和卖家,并且有一种机制来匹配它们,但也许这不是一个功能性的市场。这里的准入壁垒很高:买家可以使用任何普通的股票照片网站,并使用他们的信用卡或银行账户。在这个模式中,买家需要注册一个交易所,并交换加密货币以换取代币。

要真正地去中心化,这种经济模型还缺少一个重要组成部分——这就是激励系统。是什么激励见证者或验证者运行他们的机器并验证交易呢?

你可以给他们一些代币的份额,但为什么他们不会立即出售他们的代币以便收回运行机器的成本呢?可以合理地预期,这种不断的抛售压力会压低许多应用币加密货币的代币价格,这是一件遗憾的事情。在处理能力方面,权益证明系统通常更为优雅(以牺牲更为优雅的经济模型为代价)。

股权证明(或其他机制)很可能仍然会占据世界,但不管怎样,可以肯定地期望加密世界将做大量的哈希计算。

总结

区块链和加密货币的世界主要得益于上个世纪密码学的创新。我们已经介绍了密码学的概念和具体的加密操作,尤其是哈希操作,在区块链背后起着巨大作用。

在下一章中,我们将在此基础上介绍比特币,这是第一个(也是最显著的)区块链应用。

第五章:比特币

在早期章节中,我们详细讨论了区块链、其组成部分以及其结构。我们还讨论了加密学,区块链背后的机制,以及区块链如何改变网络世界。在本章中,我们将讨论比特币的起源。

我们将讨论比特币的介绍,它的历史以及它是如何在很短时间内成为金融历史上最大的革命之一。我们还将深入探讨比特币的其他方面,如其编码系统,交易过程,网络节点,以及我们将简要介绍比特币的挖矿过程。

本章我们将涵盖的主题包括以下内容:

  • 比特币的历史

  • 为什么比特币如此波动

  • 密钥和地址

  • 交易

  • 区块

  • 比特币网络

  • 钱包

比特币的历史

比特币是区块链技术的第一个也是迄今为止最成功的应用程序。比特币是在 2008 年推出的,由中本聪编写的一篇名为《比特币:一个点对点的电子现金系统》的论文中首次提出的。(bitcoin.org/bitcoin.pdf)。

比特币是世界上第一个去中心化的加密货币;它的推出预示着一场革命,仅用了约十年的时间,它就证明了自己的实力,拥有庞大的社区支持和广泛的采用。

自 2010 年起,一些全球企业已开始接受比特币,除了法定货币之外。许多货币交易所成立,让人们可以用法定货币或其他加密货币兑换比特币。 2012 年 9 月,比特币基金会成立,以加速比特币的全球增长,通过标准化、保护和推广开源协议。

许多支付网关(如 BitPay)开始帮助商家接受比特币作为支付方式。流行服务 WordPress 于 2012 年 11 月开始接受比特币。

比特币一直以来作为全球支付中的首选支付方式不断增长,尤其是企业对企业的供应链支付。 2017 年,比特币在金融公司和政府组织中获得了更多合法性。例如,俄罗斯合法化了包括比特币在内的加密货币的使用;挪威最大的银行宣布启动了比特币账户;日本通过了一项法律,允许比特币作为合法支付方式。 全球最大的自由经济区迪拜已开始向公司颁发交易加密货币的许可证。

2017 年 8 月 1 日,比特币分裂为两种衍生数字货币;一种保留了传统的名称比特币,另一种有着 8MB 区块大小的被称为比特币现金(BCH)。之后,在 2017 年 10 月 24 日,又发生了另一次硬分叉,产生了一种名为比特币黄金(BTG)的新货币。然后,在 2018 年 2 月 28 日,又发生了另一次硬分叉,产生了一种名为比特币私人(BTCP)的新货币。原本还有一个硬分叉预计在 2017 年 11 月发生,但由于缺乏社区共识而取消了。

然而,比特币的推广者对价格波动和由于需要大量确认才能批准交易而导致交易放缓有一个主要关切。

为何比特币会波动

当我们说比特币是波动性时,指的是比特币的价格波动。各个交易所的比特币现货价格每时每刻都在变动,并且运行 24/7。因此,任何比特币的用户或社区成员都会受到比特币价格的不断变化而困扰。以下图表显示了过去一个财政年度比特币价格的波动情况:

比特币的波动性是最被讨论的话题,自比特币交易所出现以来,一直是投资者、矿工和比特币支持者关注的问题。造成这一现象的一些主要原因如下:

  • 安全漏洞:一直以来,比特币价格波动的主要问题之一就是安全漏洞;每当交易所端存在安全漏洞的消息传出时,比特币价格就会受到冲击,因为这会让投资者开始对某个交易所或比特币网络产生怀疑。

  • 法律问题:全球立法者对比特币价格提出了许多疑虑,甚至试图将比特币定性为非法实体。政府的各种声明也影响了比特币的价格。

  • 心理上的适应变化:尽管比特币得到了迅速的采用和支持,但它依然是一种新型的货币,与之前的任何货币都非常不同;这就让人们对采用它感到谨慎。而且任何负面新闻直接影响了比特币的采用情况,有时会导致价格出现下行螺旋,直到出现关于比特币的正面新闻。

上述要点只是造成比特币市场巨大波动的一些主要因素。还有许多其他因素在不同时期对比特币价格的形成起到至关重要的作用。

密钥和地址

比特币作为一种纯数字货币,可以通过在文件或比特币钱包中保留或存储来拥有。地址用于将比特币从一个钱包转移到另一个钱包,而密钥用于保障交易的安全性。

比特币中的密钥是成对使用的。一个是公钥,另一个是私钥。私钥需安全保管,因为它控制着一个钱包。这些密钥由比特币钱包存储和控制。

地址是用于从一个钱包发送或接收比特币的字母数字字符串。地址大多以Base58Check的形式编码,使用 Base58 数字进行地址转录。比特币地址也编码为 QR 码,用于快速交易和共享。

货币单位

比特币有一个广泛使用的度量单位系统,可用作比特币的单位。比特币的最小单位称为Satoshi,以其创造者的名字命名。以下表显示了比特币的单位,从其最小单位Satoshi兆比特

虚荣地址

这些是包含可读地址的有效地址。例如:1BingoAuXyuSSoYm6rH7XFZc6Hcy98zRZz 是包含可读单词(Bingo)的有效地址。生成虚荣地址需要创建和测试数百万个私钥,直到找到所需的 Base58 字母地址。

虚荣地址用于娱乐,并提供与任何其他地址相同级别的安全性。虚荣地址的搜索时间随所需模式的长度增加而增加。

基于 58 的检查编码

这种编码将二进制字节数组转换成人类可读的格式。该字符串是通过使用一组 58 个字母数字字符创建的。

与 Base58 不同,也可以使用 Base64,但那可能会导致一些字符看起来相同,从而导致相似的数据。比特币中使用的 Base58 符号表是比特币特定的,仅在比特币创建时使用。以下表显示了 Base58 编码中的值和相应的字符:

数值 字符 数值 字符 数值 字符 数值 字符
0 1 1 2 2 3 3 4
4 5 5 6 6 7 7 8
8 9 9 A 10 B 11 C
12 D 13 E 14 F 15 G
16 H 17 J 18 K 19 L
20 M 21 N 22 P 23 Q
24 R 25 S 26 T 27 U
28 V 29 W 30 X 31 Y
32 Z 33 a 34 b 35 c
36 d 37 e 38 f 39 g
40 h 41 i 42 j 43 k
44 m 45 n 46 o 47 p
48 q 49 r 50 s 51 t
52 u 53 v 54 w 55 x
56 y 57 z - - - -

交易

这是比特币系统的主要部分。交易不加密,因为比特币是一个公开分类账。任何交易都可以在区块链上公开查看,使用任何在线区块链浏览器。由于地址是加密的并鼓励对每笔交易使用唯一的地址,跟踪用户变得困难。

比特币中的区块由区块链浏览器查看的交易组成;每个区块都包含最近发生的交易。每个新区块都位于区块链的顶部。每个区块都有一个高度编号,下一个区块的高度比前一个区块高度大一。共识过程通常称为区块链浏览器上的确认

类型

有各种类型的脚本可用于管理从一个钱包向另一个钱包的价值转移。这里讨论了一些标准类型的交易,以清楚地理解地址以及交易之间的区别。

支付至公钥哈希

大多数比特币网络上的交易都是使用这种方法进行的。脚本如下所示:

OP_DUP OP_HASH160 [Pubkey Hash] OP_EQUALVERIFY OP_CHECKSIG

签名脚本如下所示:

[Sig][PubKey]

这些字符串被连接在一起以执行。

支付至脚本哈希

支付至脚本哈希P2SH)过程用于向脚本哈希发送交易。使用脚本哈希支付的地址必须以 3 开头。脚本如下所示:

OP_HASH160 [redeemScriptHash] OP_EQUAL

签名看起来像这样:

[Sig]...[Sig][redeemScript]

与 P2PKH 一样,这些字符串也被连接在一起以创建脚本签名。

区块

交易数据记录在文件中,这些文件称为区块。区块叠放在彼此之上,最近的区块位于顶部。以下表格描述了区块的结构和区块中各元素的大小:

比特币网络中的每个区块几乎具有相同的结构,并且每个区块都链接到最新的区块。这些是区块的字段:

  • 幻数:此数字是区块链网络的标识符。其值始终为0xD9B4BEF9。它确认区块的开始并验证数据来自生产网络。

  • 区块大小:这表示区块的大小。

  • 区块头:头部包含区块的元数据。它包括多个数据项,如比特币版本、上一个区块哈希、默克尔根、时间戳、挖矿难度和随机数。

  • 交易计数器:它是区块中交易的计数。

  • 交易列表:它存储该区块中交易的哈希。

创世区块

创世块是比特币区块链中的第一个块。 创世块的创建标志着比特币的开始。 它是区块链中所有块的共同祖先。 它在比特币客户端软件中静态编码,无法更改。 比特币区块链中的每个节点都确认创世块的哈希和结构,其创建时间以及其中包含的单个交易。 以下是比特币源代码中编写的静态代码片段,描述了使用静态参数pszTimestampgenesisOutputScriptnTimenNoncenBitsnVersion创建创世块的过程。 这是比特币存储库中此代码的片段:

static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
 {
 const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
 const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
 return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
 }

比特币网络

网络基于点对点P2P)协议。 各种节点在此网络中交换交易和区块。 比特币网络中的每个节点都被视为平等的。 这样做的一个优点是,每个节点都有选择在比特币网络中扮演不同角色的选项,具体取决于每个人对如何参与比特币网络的偏好。

节点类型

在讨论节点类型之前,让我们讨论一些节点执行的主要功能:

  • 钱包

  • 挖掘

  • 完整的区块链

  • 路由

在比特币网络中,主要有两种类型的节点。 我们现在将简要介绍每种节点的一些详细信息。

完整节点

完整节点由钱包、矿工、完整的区块链和路由网络组成。 这些节点维护区块链的完整最新记录。 完整节点验证区块链网络上的每笔交易。

轻量级节点

轻量级节点在区块链上执行交易。 它们不包含整个区块链,而只是区块链的一个子集。 它们使用称为简化支付验证SPV)的系统来验证交易。 这些节点有时也被称为SPV 节点

其他节点

比特币网络中还有各种其他节点,每个节点执行比特币网络提供的一组特定功能中的特定功能集。 有些节点只包含区块链和路由功能。 有些节点仅作为矿工工作,不包含钱包。

还有其他非标准节点称为池协议服务器。 这些节点使用诸如stratum 协议之类的替代协议。 stratum 协议使用 TCP 套接字和 JSON-RPC 在节点之间进行通信。

网络发现

比特币中的网络发现在任何节点第一次启动时都是必需的; 节点必须发现网络中的其他节点才能参与区块链。 在节点启动时,它必须与网络中至少一个现有节点连接。

为此,节点通过 TCP 协议建立连接,在端口8333上进行或如果有其他端口,则在其他端口上进行。接下来,通过传输某个消息来执行握手。该消息称为 版本消息,其中包含基本的识别信息。

查找节点

节点主要通过两种方法在网络中找到。一种是通过查询 DNS 使用 DNS 种子,这基本上是提供比特币节点 IP 列表的 DNS 服务器。另一种方法是比特币核心尝试连接到的 IP 地址列表。另一种早期使用的方法是通过 IRC 向节点播种,但由于安全问题而停止使用该方法。

DNS 种子

DNS 种子是包含 IP 地址列表的服务器。这些种子是 Berkeley Internet Name DaemonBIND)的定制实现,并返回由比特币节点收集的随机子集。大多数比特币客户端在尝试建立第一组连接时使用 DNS 种子进行连接。最好有各种种子存在,以便客户端与网络中的节点建立更好的连接。在比特币核心客户端中,使用 DNS 种子的选项由 -dnsseed 参数控制,默认设置为 1。以下是比特币源代码的chainparams.cpp文件中表示 DNS 种子的方式:

 vSeeds.push_back(CDNSSeedData("bitcoin.sipa.be", "seed.bitcoin.sipa.be")); // Pieter Wuille
 vSeeds.push_back(CDNSSeedData("bluematt.me", "dnsseed.bluematt.me")); // Matt Corallo
 vSeeds.push_back(CDNSSeedData("dashjr.org", "dnsseed.bitcoin.dashjr.org")); // Luke Dashjr
 vSeeds.push_back(CDNSSeedData("bitcoinstats.com", "seed.bitcoinstats.com")); // Christian Decker
 vSeeds.push_back(CDNSSeedData("xf2.org", "bitseed.xf2.org")); // Jeff Garzik
 vSeeds.push_back(CDNSSeedData("bitcoin.jonasschnelli.ch", "seed.bitcoin.jonasschnelli.ch")); // Jonas Schnelli

上述种子目前正在比特币核心中使用,用于连接到种子客户端,以建立与第一个节点的连接。

静态 IP

这些是静态的 IP 地址列表。如果比特币客户端能够成功连接到一个 IP 地址,它将能够通过共享该节点的 IP 地址连接到其他节点。命令行参数-seednode用于连接到一个节点。连接到种子节点后,客户端将使用该种子自身发现新的种子。

钱包

比特币钱包是比特币节点的一个重要功能;它们包含私钥和/或公钥以及比特币地址。有各种类型的比特币钱包,每种都提供不同级别的安全性和功能,根据需要。

有一个常见的误解,即电子钱包可以包含比特币,但比特币钱包只能包含密钥。每个比特币都记录在比特币网络的区块链上。比特币钱包包含密钥,这些密钥授权使用与密钥相关联的比特币。用户或钱包所有者使用钱包中的密钥签署交易,证明他们拥有比特币。实际上,这些比特币以**txout**的形式存储在区块链上,表示为 交易输出

类型

主要有两种类型的钱包,这取决于钱包中包含的密钥是否相互关联。

确定性钱包

这是一种钱包类型,其中所有的密钥都是从一个称为种子的单个主密钥派生出来的。这种钱包中的所有密钥都彼此关联,并且可以借助种子轻松地再次生成。在某些情况下,种子允许在不知道私钥的情况下创建公钥地址。大多数情况下,种子被序列化为人类可读的单词,称为助记词短语。

在确定性钱包中使用了多种密钥派生方法,这些方法在以下小节中描述。

确定性钱包

确定性钱包保存从共同种子派生的私钥。为此使用了单向哈希函数。在确定性钱包中,此种子是恢复所有派生密钥所必需的,因此在创建时进行一次备份就足够了。以下图表显示了一个单一种子如何与钱包生成的所有密钥连接/相关:

HD 钱包

HD 钱包是确定性钱包的最先进形式之一。它们包含从树结构派生的密钥,因此主密钥可以具有多个一级密钥,进一步可以包含多个深度无限的二级密钥。以下图表显示了种子如何生成主密钥,进而以分层形式创建多个密钥:

非确定性钱包

在这种类型的钱包中,每个密钥都是从一个随机数独立生成的。在这个钱包中生成的密钥之间没有关联。由于难以维护多个不相关的密钥,因此非常重要定期备份这些密钥并保护它们以防止被盗或丢失。

摘要

在这一章中,我们讨论了比特币的基础知识,其历史以及与法定货币相比的定价。我们还讨论了比特币地址、它们的编码、它们的交易类型和区块。最后,我们讨论了比特币网络以及网络包含的节点类型。

现在我们已经在本章中讨论了世界上第一个加密货币,下一章中,我们将讨论受比特币启发的各种其他加密货币,也被称为替代货币。*我们将讨论替代货币,有时也称为替代币

第六章:山寨币

在比特币发布后,一直有着庞大的支持加密货币的社区。而且,由于比特币和区块链是开源的,社区内的许多人开始创建自己的加密货币,提供类似的服务,但提供不同的共识方法等,与比特币相比。

由于比特币是第一个且迄今为止最主导的加密货币,所有其他加密货币被称为另类币山寨币。第一个山寨币是Namecoin,于 2011 年推出。之后,许多山寨币被推出;其中一些很受欢迎,也开始被用作主流货币,而其他一些则不那么受欢迎。截至目前,已经存在超过 1500 种加密货币。另类加密货币领域有两个广泛的类别。如果要创建一种另类区块链平台,则通常称为另类链,但如果硬币的目的是引入一种新货币,则可以称为山寨币

许多山寨币直接从比特币源代码中分叉,甚至有些是从零开始编写的。山寨币旨在解决比特币的一些限制,例如共识方法、挖矿限制、区块时间、分配、隐私,或者有时甚至在硬币上添加功能。

本章将涉及的主题如下:

  • 介绍山寨币

  • 讨论代币和各种代币平台

  • 另类货币和广泛使用的另类货币简介

  • 如何获取加密货币

介绍山寨币

现有超过 1600 种流通中的加密货币;它们每一种都提供比特币的改进或修改。有各种在线交易所可以在其中交换加密货币或与法定货币(如美元、欧元、英镑等)交换,类似于货币交易或股票交易门户。以下是一些热门山寨币的列表:

  • 莱特币

  • 以太坊

  • 零币

  • 达世币

  • 瑞波币

  • 门罗币

  • EOS

  • IOTA

  • 波场

  • 泰达币

  • 以太坊经典

  • 比特币现金

  • 星际币

  • 尼欧币

  • 新经币

  • 卡尔达诺

根据其区块链,山寨币有两个广泛的类别,因为区块链定义了硬币的特性、安全性和其他方面。

确定市场上有这么多加密货币以及货币交易所意味着,现在需要大量的关键财务和市场指标来区分这些货币。以下是讨论山寨币时需要考虑的一些关键因素:

  • 硬币的总市值

  • 用法币购买时的硬币单价

  • 流通中的山寨币总数

  • 每小时和 24 小时周期内交易的硬币数量

  • 硬币单位价格在小时、日和周基础上的变化

  • 接受山寨币的交易所和商家

  • 支持硬币的总钱包数

  • 任何可能影响硬币价格或声誉的最新消息

Altcoin 可以有自己的区块链,也可以建立在另一个区块链之上,通常称为代币

代币

建立在另一个区块链之上的 Altcoins 称为代币。代币不能独立存在,它们建立在的平台上。以下是可以创建代币的一些平台列表:

  • 以太坊

  • Omni

  • NEO

  • Omni

  • Qtum

  • Counterparty

  • Waves

  • Stellar

  • Bitshares

  • Ubiq

  • Ardor

  • NXT

以太坊

以太坊是创建代币的最常用选择;基于以太坊平台的代币超过 600 种。作为公开和开源的,使得任何人都可以基于以太坊区块链创建代币;此外,由于得到庞大社区的支持,这使得任何基于加密货币的交易所更容易接受这些代币。

在以太坊平台上构建的一些热门代币包括 EOS、TRON、VeChain 等。

Omni Layer

作为 2013 年的 MasterCoin,Omni Layer 协议是基于比特币区块链的最流行的元协议之一。Omni Layer 提供了一个类似比特币客户端的不同钱包和一个类似比特币核心的 Omni Layer。

在 Omni Layer 平台上构建的一些热门代币包括 Tether、MaidSafeCoin、Synereo 等。

NEO

NEO最初是 Antshares;它是由 Onchain 公司建立的,这是一家位于中国的公司。它于 2014 年初开始提供服务于银行和金融领域。Antshares 于 2017 年 6 月更名为 NEO。

在 NEO 平台上构建的一些热门代币包括 Ontology、Gas、DeepBrain Chain 等。

Waves

常被描述为开放区块链平台的waves是一个平台,不仅可以交换加密货币,还可以交换所有类型的现实世界商品,完全去中心化地发行和转让。

Waves 平台上构建的一些代币包括 Wager、Mercury、Incent 等。

Counterparty

Counterparty是另一层协议,实现在比特币协议层之上,就像 Omni Layer 一样,在 2014 年发布,它声称除了比特币之外还提供了各种功能,这使它成为一个有价值的代币创建平台。

Counterparty 上构建的一些代币包括 Triggers、Pepe Cash、Data bits 等。

替代货币

除了在现有区块链上构建的代币之外,还有各种由拥有自己的区块链和/或任何其他改进或差异化因素推动的替代货币。

以下是 Altcoins 相对于比特币所做的一些修改的一些因素:

  • 货币替代品

  • 共识替代品

我们将详细讨论这些替代方案,然后再讨论一些广泛使用的 Altcoins 及其相对于比特币的修改。

货币替代品

比特币限制在 2100 万枚,其发行速度逐渐下降,包括 10 分钟的区块生成时间,需要很长时间来确认;在进一步的币生成过程中也需要很长时间。很多山寨币修改了一些主要参数以获得升级的结果。一些修改货币参数的主要币种有莱特币、狗狗币、以太坊、NEO 等等。

共识替代方案

共识机制是比特币交易的根源;比特币中使用的机制基于工作证明,使用 SHA256 算法。由于共识机制需要挖掘块,这变得非常计算密集,导致了专门用于解决比特币块的比特币挖矿硬件的创建,这就是指定的 Application-Specific Integrated Circuit ChipsASICs)。

这导致了具有创新算法的山寨币的创建,例如以下这些:

  • Scrypt:这被广泛用于莱特币、狗狗币等等

  • Scrypt - N:这被用于 vertcoin、Execoin 等等

  • Skein:这被用于 DigiByte、Myraid 等等

  • Groestl:这被用于 Groestlcoin、securecoin 等等

  • SHA3:这被用于 Maxcoin、Slothcoin 等等

  • X1****1:这被用于 Dash、CannabisCoin 等等

  • Blake:这被用于 Netko、Trumpcoin 等等

  • X13:这被用于 Navcoin、Cloakcoin 等等

  • CryptoNight:这被用于门罗币、Bytecoin 等等

  • QuBit:这是 Geocoin、DGB-Qubit 等等

  • Dagger Hashimoto:这被用于以太坊、以太经典等等

  • Lyra2RE:这被用于 Verge、Zcoin 等等

  • X15:这是 EverGreenCoin、Kobocoin 等等

除了创新算法外,还有很多创新的共识类型,通常被称为证明类型,例如以下这些:

  • Proof of WorkPoW):这是最常用的证明类型;在这种证明类型中,网络节点需要进行计算来通过挖矿形成分类帐。

  • Proof of StakePoS):这最初在 Peercoin 中使用。通过股份证明,节点不挖矿,而是持有硬币并验证所有权。通过使用算法搜索与股份大小结合的最低哈希值来预测新的块创建者。节点可以预测哪个股份将创建下一个块。在这种类型的系统中不需要挖矿。

  • Proof of Stake AnonymousPoSA):这是 POS 算法的一种变体,最初在 Cloakcoin 中引入;通过股份证明,交易被其他节点隐藏,这些节点因帮助过程而获得奖励。节点为交易提供输入和输出,使得无法确定指定交易的目标或来源。

  • 授权权益证明 (D****PoS):通过授权权益证明,用户充当代表,有权利从运行区块链的完整节点中赚取收益。比特股引入了这种证明类型;一些更多使用它的硬币包括 Steem、EOS、Lisk 等。

  • 重要性证明 (POI):通过重要性证明,区块链上的每个账户都被赋予一个重要性评分;这个评分会影响每个节点如何收获区块链。区块链上的收获者的任务是为了一个小经济刺激而在区块链上添加交易。随着重要性评分的增加,获取奖励的机会也会增加。

  • 容量证明或空间证明 (PoSpace):在这种类型的证明中,不使用区块链,而是使用存储。由于存储的通用性和存储所需的更便宜的能源成本,这种类型被认为是一种经济且更环保的选择。一些 PoC 的理论和实际实现包括 Burstcoin、SpaceMint 等。

  • 权益时间证明 (PoST):在这种方法中,通过引入一个权益时间组件形成共识,其中权益随着时间增加。这提供了一个激励权益过程,并增加了网络的安全性。这种证明类型的目标是避免常见的权益证明方法,其中拥有更多硬币的节点会获得更多经济奖励。

  • 权益速度证明 (PoSV):在这种方法中,奖励是基于节点拥有的硬币数量和节点上交易活动的活跃程度来分配的。

  • 活动证明 (POA):在这种证明类型中,采用了一种混合方法,将工作证明与基于股权的系统相结合。在这个系统中,挖矿就像在 PoW 系统中一样发生。虽然挖出的块不包含任何交易,只有头部和挖矿者的奖励地址。然后,系统切换到 PoS,在这里随机选择一组验证者;只要所有验证者签署了区块,该区块就会立即成为一个完整的区块。

  • 燃烧证明 (PoB):在这种证明中,我们必须证明在向一个不可依赖的地址发送交易的过程中硬币被燃烧了。尽管这只适用于从 PoW 货币中挖掘的硬币。简而言之,硬币通过销毁另一种 PoW 硬币的价值来启动。

由于另类币的数量很多,而且更多硬币定期释放,重要的是要了解每种硬币所提供的差异。现在是时候讨论各种另类币以及它们各自所提供的内容了。

莱特币

这是最初的另类币之一,发布于 2011 年。莱特币相对比特币的主要修改是使用脚本算法而不是比特币中使用的 SHA-256。此外,莱特币的硬币限制为 8400 万,而比特币为 2100 万。

莱特币于 2011 年 10 月由一名前谷歌工程师创建,其主要目标是将比特币的区块生成时间从 10 分钟缩短到 2.5 分钟。由于区块生成更快,与比特币相比,莱特币交易的确认速度更快。

以太币

以太币(Ether)基于以太坊平台,提供了脚本功能。代号为 ETH,区块时间为 14 到 15 秒。它基于使用 Ethash 算法的 PoW。流通限制建议约为 1.2 亿个币。

瑞波币

瑞波币(Ripple)是由一家名为瑞波(Ripple)的公司支持的加密货币,它是一个实时毛额结算系统(RTGS)。它的标志是 XRP。它采用瑞波协议共识算法(RPCA),该算法每隔几秒钟由网络中的所有节点应用一次,以维持网络的一致性。支持瑞波的组织计划创建不超过 1000 亿个瑞波。按计划,其中一半将用于流通,另一半将由公司保留。

比特币现金

于 2017 年 8 月 1 日,比特币开发者社区继续将区块链分割为两部分。这种分割称为分叉,并引入了新的区块链功能。比特币现金是首次分叉的结果,以分割比特币。与比特币相比,比特币现金具有相对较低的交易费用,以及较低的挖矿难度。

获得加密货币

有多种方式可以获得替代币或比特币;如果币支持挖矿,主要是基于 PoW 算法的币属于这一类别,这些币可以通过挖矿过程获得。比特币、莱特币、以太币、比特币现金、门罗币等币支持挖矿。正如前面讨论的,有各种交易所可以交换加密货币,以法定货币,甚至其他加密货币;这是另一种广泛使用的方法。

加密货币的挖矿

挖矿是将新区块添加到区块链的过程。交易通过挖矿节点的挖矿过程进行验证,并保存在区块中,然后这些区块被添加到区块链中。这是一个高度耗费资源的过程,以确保矿工花费了所需的资源才能接受该区块。

每种加密货币都有不同的挖矿难度,这由区块高度、挖掘该加密货币的矿工数量、该货币的总交易量和区块时间定义。

比特币挖矿

比特币的区块创建时间为 10 分钟。矿工在创建新区块时会获得奖励,并且还会根据包含在被挖掘的区块中的交易支付交易费用。区块时间维持在 10 分钟,以确保区块以固定的速率被创建。挖矿区块的奖励每产生 210,000 个区块就减半一次,大约每四年一次。当比特币最初引入时,区块奖励为 50 比特币,2012 年减半至 25 比特币。2016 年 7 月,每个区块的挖矿奖励再次减半至 12.5 个比特币。下一次减少区块奖励的日期是 2020 年 7 月,将把币的奖励减少到大约 6.25 个比特币。

由于减半事件,比特币存在的总数量不会超过 2100 万个。选择减少供应是因为它类似于黄金和白银等其他商品。最后一个比特币将在 2140 年挖出,并且在那之后将不会再有新的挖矿奖励,尽管交易费用仍将被分配给包含交易费用的区块的代代相传。

挖矿难度

这是挖矿哈希率的度量;比特币网络有一个全局的区块难度。有效区块的哈希率需要低于此目标。网络中的难度每产生 2,016 个区块就会改变一次。其他货币有自己的难度或实施了修改版的比特币难度算法。以下是比特币的难度调整公式:

difficulty = difficulty_1_target/current_target
difficulty_1_target = 0x00000000FFFF0000000000000000000000000000000000000000000000000000

在这里,difficulty_1_target是 SHA256 使用的最大目标,这是可能的最高目标,也是比特币创世区块挖矿的第一个难度。

比特币中难度调节的原因是,由于区块时间保持在大约 10 分钟,2,016 个区块需要大约两周的时间。如果挖掘 2,016 个区块需要的时间超过两周,则需要降低难度;如果挖掘 2,016 个区块需要的时间少于两周,则应增加难度。

比特币创世区块的难度,以下是区块头:

$ Bitcoin-cli getblockhash 0
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

$ Bitcoin-cli getblockheader 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
{
 ...
 "height": 0,
 ...
 "bits": "1d00ffff",
 "difficulty": 1,
 ...
}

正如你所看到的,创世区块的难度为1,比特币的目标哈希值为1d00ffff。以下是比特币源代码中的此重新定位难度算法的代码:

 // Go back by what we want to be 14 days worth of blocks
 int nHeightFirst = pindexLast->nHeight - (params.DifficultyAdjustmentInterval()-1);
 assert(nHeightFirst >= 0);
 const CBlockIndex* pindexFirst = pindexLast->GetAncestor(nHeightFirst);
 assert(pindexFirst);

以下是比特币源代码中相同pow.ccp文件中的限制调整步骤:

 // Limit adjustment step
 int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
 if (nActualTimespan < params.nPowTargetTimespan/4)
 nActualTimespan = params.nPowTargetTimespan/4;
 if (nActualTimespan > params.nPowTargetTimespan*4)
 nActualTimespan = params.nPowTargetTimespan*4;

   // Retarget
    const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
    arith_uint256 bnNew;
    bnNew.SetCompact(pindexLast->nBits);
    bnNew *= nActualTimespan;
    bnNew /= params.nPowTargetTimespan;

    if (bnNew > bnPowLimit)
        bnNew = bnPowLimit;

在两周的单个周期内,重新定位调整应小于 4 倍。如果难度调整超过 4 倍,则不会按最大因子调整。进一步的调整应在下一个周期的两周内完成。因此,非常大和突然的哈希率变化需要多个两周周期来在难度方面平衡。

由于 ASIC 的引入,哈希功率呈指数增长,随之挖矿难度增加。

挖矿池

由于巨大的挖矿算力,矿业社区的人们汇集在一起共同挖掘区块,并决定根据每个人贡献的算力来分配奖励。在矿池中,每个人都按照投入的资源成比例地获得区块奖励的份额。现在存在许多矿池。一些知名的矿池除以下几个:

  • BTC.com:这是最大的矿池之一,截至 2018 年 6 月,负责挖掘约 25%的比特币区块。该矿池于 2016 年 9 月推出,目前由比特大陆科技有限公司拥有。

  • Antpool:这个矿池由拥有 BTC.com 的同一公司所有,是最大的矿池之一。Antpool 和 BTC.com 在最大矿池中占据前列。总部位于中国北京的比特大陆公司。

  • ViaBTC:成立于 2016 年 5 月,由 Viabtc Technology 所有。总部位于中国。

  • SlushPool:这是世界上第一个矿池。它始于 2010 年 11 月 27 日,当时名为比特币矿池服务器。该矿池自推出以来已挖掘了超过 100 万个比特币。它是一个可靠稳定的矿池,具有准确支付历史。

以下图表显示了 2018 年 6 月 1 日至 6 月 2 日期间各个比特币矿池挖掘的比特币百分比:

除我们提到的之外,还有许多积极挖矿的矿池,不断添加更多功能,以成为最大的矿池。

另类币挖掘

正如我们讨论过的,各种另类币具有不同的算法;每种另类币都有修正和改进,以增加难度并避免中心化。目前,除比特币挖矿外,还定期挖掘各种其他另类币。几乎每个矿池现在都支持另类币;截至 2018 年 6 月,一些最常挖掘的另类币包括以太坊、莱特币、Zcash、达世币、比特币现金、以太经典等。

有关挖矿盈利能力的讨论很多;由于比特币挖矿的难度非常高,其他另类货币成为矿工以及矿池的流行选择。现在,ASIC 矿机也开始用于莱特币、现金、以太坊等另类币的挖掘。

由于比特币和其他基于 SHA-256 的硬币对 GPU 和资源的需求很高,基于脚本创建了很多 CPU 友好的挖矿硬币。

加密货币交易所

有许多交易所用户可以购买或出售比特币和其他另类币。交易所可以交易法定货币、比特币、另类币、大宗商品或所有这些货币。这些交易所通常对其平台上进行的交易收取一小笔费用。一些知名的加密货币交易所如下:

  • Binance:世界顶级交易所之一,上市超过 150 种另类币,并日益增加。它是活跃度最高的加密货币交易所之一。

  • 火币网(Huobi):另一家流行的交易所,成立于 2013 年 9 月。它是中国最大的交易所之一。在火币交易所上列出了超过 250 种币种。

  • Bithumb:总部位于韩国的最大加密货币交易所之一,每日交易量巨大。Bithumb 并未列出大量的币种;截至目前,只有 20 种币种列在了 Bithumb 上。

  • Bitfinex:总部位于香港的加密货币交易所,由 iFinex,Inc.拥有。Bitfinex 上列出了 75 多种币种。

  • OKEx:最大的加密货币交易所之一,在其平台上列出了 500 多种币种。成立于 2014 年,也以比特币期货交易而闻名,其每日交易量巨大。

  • Kraken:最早的比特币交易所之一,成立于 2011 年。在 2017 年中期经历了许多安全漏洞,但在那之后一直保持稳定。Kraken 向彭博终端提供比特币定价信息。

  • Cex.io:成立于 2013 年的一家知名加密货币交易所。曾以云挖矿服务而闻名。Cex.io 的挖矿池名为 Ghash.io,2014 年贡献了超过 42%的比特币挖矿算力。

  • Bitstamp:成立于 2011 年的最古老的交易所之一。最为知名的是法币兑换加密货币。

  • HitBTC:一家总部位于英国的加密货币交易所,成立于 2015 年。它支持的货币种类繁多。

  • Upbit:一家位于韩国的加密货币交易所,提供韩元存款。

  • Bittrex:一家总部位于美国的加密货币交易所,成立于 2013 年。它与大量的加密货币合作。

除了这里提到的之外,还有许多其他流行的交易所,一些主要专注于法定货币兑换加密货币,而另一些则仅处理加密货币。其他一些知名的交易所包括 Upbit、Bittrex、Lbank、Bit-Z、HitBTC、coinbase、BCEX、GDAX、Gate.io、Bitstamp、EXX、OEX、Poloniex、Kucoin、Cobinhood、Yobit 等等。

加密货币钱包

加密货币钱包是管理这些私钥并将它们从一个钱包转移到另一个钱包的私钥集合。比特币钱包是根据安全性、匿名性、易用性、功能、可用平台和支持的币种进行比较的。通常,所有加密货币都有自己的官方钱包,但也可以根据需求选择其他第三方钱包。一些知名的加密货币钱包包括以下几种:

  • Coinbase:这是一个于 2011 年 7 月成立的数字钱包,除了存储货币外,还提供买卖加密货币的服务。支持的货币包括比特币、比特币现金、以太币和莱特币。

  • Blockchain.info:这是一个广泛使用的比特币钱包,同时也是区块浏览器服务。它于 2011 年 8 月推出。支持比特币、比特币现金和以太币。

  • Jaxx:一种多币种钱包,创建于 2014 年,支持比特币、以太币、以太经典、达世币、莱特币、Zcash、Augur 等多种币种。

以下是一些提供多币种支持的加密货币钱包列表:

  • Trezor

  • 区块链钱包

  • Metamask

  • 开源总账

  • Exodus

  • 钱包 Nano

除了我们提到的第三方钱包外,还有许多其他钱包提供不同的功能。需要注意的是,一些钱包收取更高的交易费,以覆盖他们的开发成本,而不是实际的网络费用。

以下截图显示了 Jaxx 加密货币钱包:

摘要

在本章中,我们讨论了替代货币以及硬币和代币之间的区别。我们详细讨论了基于哪些平台可以创建平台。此外,我们还讨论了替代币相对于比特币提供的各种选择。我们详细了解了莱特币、以太坊、瑞波币和比特币现金等货币。

我们还讨论了获取加密货币的各种方式。我们了解了挖掘加密货币以及比特币和替代币在挖矿方面的区别。我们讨论了交易所以及如何在钱包中存储比特币以外的替代币。我们还了解了在比特币中重新定位算法的难度。

第七章:实现共识

共识的概念很简单:共识是当网络就网络中存储的信息的真实性达成一致意见时,应该保留什么信息,以及什么信息不真实,不应该保留。对于比特币来说,达成共识就是要就网络中要发送和接收的比特币集合达成一致意见。对于其他网络,达成共识还涉及就区块链上存储的智能合约的最终状态或任何其他网络信息达成一致意见。

共识算法已经成为研究对象数十年。分布式系统的共识算法必须对多种类型的故障和问题具有弹性,如错误的消息、网络的部分连接和断开、延迟等。在金融系统中,特别是在区块链中,系统中存在谋利的和恶意的行为者的风险。对于区块链网络中的每个算法,达成共识确保网络中的所有节点就区块链的一致全球状态达成一致意见。任何分布式共识协议都具有三个关键属性:

  • 安全性:分布式网络上所有节点保证具有相同的状态或一致性的能力

  • 活跃性/可用性:协议保证成功并使不同节点产生最终结果

  • 容错性:协议处理节点生成错误或敌对结果的能力

恰巧,Fischer、Lynch 和 Paterson 的一篇著名论文指出,在同一个异步分布式系统中不可能同时满足这三个条件。因此,任何区块链设计都必须在这些属性之间做出权衡。这些权衡通常是在安全性和活跃性之间进行的,因为容错性通常被认为是全球分布式网络的必备条件。

在区块链系统中,目前有四种主要方法可以实现共识。它们如下:

  • 实用拜占庭容错算法

  • 工作量证明算法

  • 权益证明算法

  • 委托式权益证明算法(DPoS)

这些方法将在本章中依次介绍。

实用拜占庭容错算法

实用拜占庭容错PBFT)算法。许多算法被称为拜占庭容错。这个名字来源于提出原始问题的寓言。

想象一支古代的拜占庭军队正在进攻一座城市。攻击的想法是从各个方向进攻。一旦军队的将军们到达城市,他们必须就何时以及如何进攻达成一致意见。难点在于如何达成一致。将军们只能通过信使进行通信,但信使可能会被敌人抓获,而且还有一个额外的担忧,即一个或多个将军或他们的指挥官可能是叛徒。

将军们需要一种方法来确保所有忠诚的将军都同意相同的计划,并且少数可能的叛徒不能导致任务失败。

忠诚的将军会按照方法所说的去做,但叛徒可能会做任何事情。将军们如何创建一种方法,以确保只要他们中的大多数人是忠诚的,他们的计划就会成功?

这个寓言有时也被称为中国将军问题,以及其他几个名字,但问题仍然相同:当通信渠道可能不安全时,不同方如何安全地进行通信并达成协议,甚至可能在他们中间有叛徒的情况下。

在区块链的情况下,故事中的将军是参与运行区块链的分布式网络上的计算机。信使代表了这些机器正在运行的数字网络以及这些机器使用的消息协议。目标是让好的计算机或将军决定网络上的哪些信息是有效的,同时根除坏行为者,并防止错误信息被记录在区块链上。

故事中的忠诚将军代表了对确保区块链及其基于其上的应用程序的完整性感兴趣的诚实节点的运营者,因此他们致力于确保仅记录正确数据。叛徒代表了世界上许多坏行为者,他们愿意为了个人利益或代表其他对抗性方的某种利益而篡改数据(尤其是财务数据)。坏行为者的动机可能各不相同,可以是花费他们并非真正拥有的比特币,摆脱合同义务,甚至试图以破坏网络的方式进行货币控制来自对抗性政府的形式。

拜占庭故障

要理解 PBFT 和随后出现的所有其他共识算法,首先需要定义拜占庭故障是什么。拜占庭故障是指任何可能破坏分布式系统一致性的事件或结果,例如以下情况:

  • 未返回任何结果

  • 返回错误或不一致的结果

  • 故意返回误导性的结果

  • 任何事先未定义的行为

如果发生了任何这些事件,就会说发生了拜占庭故障。因此,拜占庭容错系统能够处理一定程度的不一致输入,但仍然能够在最后提供正确的结果。关键在于这样的系统是容错的,而不是免疫的。所有容错系统只能容忍一定程度的故障,超出容忍范围后,系统就会以某种方式失败。

PBFT 的工作原理

超级账本是主要使用 PBFT 的区块链。以下是 PBFT 在超级账本中的工作原理。每个验证节点(运行区块链软件并努力维护一致性的计算机)都保存区块链的内部状态的一个副本。当节点接收到消息时,它使用消息与其内部状态一起对新状态进行计算。然后节点决定如何处理该消息:将其视为有效、忽略它,或者采取其他行动。一旦节点对新消息做出决定,该节点就会与系统中的所有其他节点分享该决定。一致性决定基于所有节点提交的总决定:

  1. 提交:网络上的一个或多个节点提交发送到其他节点的交易。例如,如果有十个参与节点,其中三个发送消息,看起来如下:

    • 十台计算机都看到三个交易

    • 这些交易被分发,以便每个节点都拥有所有交易的完整副本

    • 这些交易可能在不同的时间到达节点,因此顺序可能不一致

  2. 排序:通过其他节点的投票,其中一个验证节点被选为领导者。这个验证的领导者选择交易的顺序并将其发送给其他参与节点。其他验证节点然后将它们已经拥有的交易重新排列成验证领导者设置的顺序。

  3. 执行:验证节点然后执行新排序的交易。每个节点都独立执行所有更改,并将这些更改添加到以前区块的全局状态中。如果无法达成共识,交易将被回滚并拒绝。

对每个区块都重复这个过程。PBFT 的优势是非常快并且相对可扩展。缺点是参与者必须是已知的——不是任何人都可以加入网络。

工作证明

区块链中使用的第一种共识算法是比特币的工作证明PoW)。工作证明的基本功能是利用某些密码学函数的特性:有一些很难解决的数学问题,但一旦解决了,检查起来就很容易。正如之前所讨论的,其中一个问题就是哈希:很容易从数据中计算出哈希,但从哈希中发现输入数据却非常困难。PoW 最显著地被比特币、莱特币和以太坊使用。

PoW 具有以下特点:

  • 相对可预测的解决时间:比特币的网络协议预期每个区块解决约需要十分钟。如果网络开始太快地解决工作证明问题,网络将自动增加难度。

  • 对计算能力的大幅增加或减少具有抵抗力:摩尔定律表明,计算机的工作量预计每两年增加一倍。此外,由于网络是开放的,任何人都可以随时向网络添加大量的计算资源。为了保持网络的稳定,算法必须自动调整自身。同样,如果网络不再盈利,那么正在使用的计算能力将会下降,因为这些资源会被重定向。这是通过算法中自动调整难度来实现的。任何网络参与者都必须能够快速检查他们是否拥有正确的链条,以及该链条是否有效。这是通过散列函数来实现的。

工作量证明算法只要没有任何一组参与者控制 50%以上的整个网络计算能力,就能维护网络的完整性。能够操控链条的坏参与者的可能性被称为51%攻击。如果单一组织控制了超过一半的网络计算能力,他们可以通过停止支付或甚至双花来控制网络和网络交易。攻击组织将能够阻止确认新的交易(随意停止用户的支付),甚至在他们控制网络后发生的交易。

比特币中的工作量证明问题的原理

工作量证明算法首先采取最长的链。在比特币中,区块可以通过多种方式最终确定(取决于包括的交易)。因此,比特币节点可以选择多个可用的“已解决”链作为基础。作为算法的一部分,比特币采取最长的链,因此接受了最多的计算能力。以下图表说明了工作量证明链:

比特币中的难题是找到一个输入,当加到先前的区块哈希和交易列表中时,会产生一个以特定数量零开始的哈希。

通常,该函数的输入是所有交易的默克尔根和先前的块哈希。为了简化说明,假设我们有一个简单的输入,例如I love Blockchains。同时假设系统的难度是最简单的:哈希起始位置只有一个零。I love Blockchains的 SHA-256 哈希如下:

ef34c91b820b3faf29104f9d8179bfe2c236d1e8252cb3ea6d8cb7c897bb7d96.

你可以看到,它不是以0开始的。为了解决这个输入的区块,我们需要找到一个字符串(称为随机数)可以加到这个字符串上,以便将这个组合(随机数+ I love Blockchains)的哈希结果为以0开始的字符串。事实证明,我们只能通过测试来完成。例如,如果我们在开头加上1,我们得到1I love Blockchains,哈希如下:

b2fc53e03ea88d69ebd763e4fccad88bdb1d7f2fd35588a35ec6498155c702ed

没有运气。 那么 2 和 3 呢? 这些也将无法解决谜题。 恰巧,4I love Blockchains 的哈希以 0 开头:

0fd29b2154f84e157d9f816fa8a774121bca253779acb07b07cfbf501825415d

这只用了四次尝试,但这是一个非常低的难度。 每增加一个零,找到一个能计算出正确哈希的适当输入的挑战就会加倍。 截至目前,一个有效的比特币区块需要 18 个零才能有效。

尝试找到产生正确哈希的随机数的过程称为挖矿。 每台挖掘 PoW 链的计算机都在竞争看谁能最先找到正确的随机数。 获胜者有权创建链中的下一个区块,并且以代币的形式获得奖励。 更多细节,请参阅 第十八章,挖矿

PoW 的优势在于任何人都可以加入 PoW 网络,并且它已经被证明是一种功能性共识机制。 PoW 网络的主要缺点是速度慢和财务成本高:运行所有计算机进行这些计算非常昂贵,并且输出没有被用于任何真正的生产性用途。 这被认为对环境不利,并且可能导致在进行大量区块链挖掘的地方能源价格上涨。 由于这个原因,一些地区已经禁止了区块链挖掘。

由于这些缺点,权益证明PoS)被发明出来。

股权证明

PoS 与 PoW 具有相同的目标,即保护网络免受攻击,并允许在开放网络中达成共识。 第一个使用此方法的数字货币是 Peercoin,随后是许多其他数字货币,如 NXT,Dash,PIVX 等。 在 PoW 网络中,解决谜题决定了哪个节点可以创建链中的下一个区块。 在 PoS 网络中,区块被称为被锻造而不是被挖掘,因为它们在 PoW 区块链中。 在 PoS 链中,验证者通过获得每个区块的交易费用来获得奖励,并且有时在每次创建区块时自动创建额外的代币。 在 PoS 链中,成为下一个区块的创建者的机会取决于节点在网络中的投资金额。

看看以下示例:

PoS 网络中有五个节点。 它们具有以下余额:

  1. 10,000 枚代币

  2. 200 枚代币

  3. 300 枚代币

  4. 4,000 枚代币

  5. 20,500 枚代币

代币的总数为 35,000 枚。 假设每个节点都抵押了他们代币的 100%,每个区块和其中的节点被认为是下一个区块签名者的可能性如下:

  1. 28.57%

  2. 0.57%

  3. 0.86%

  4. 11.4%

  5. 58.6%

很明显,如果单个节点控制大多数代币(甚至是大部分),那么他们将对网络有很大的控制权。在这种情况下,节点 #5 将创建超过半数的区块。此外,由于节点 #5 将定期签署区块,它还将获得大多数交易费用和新创建的硬币。在某种程度上,PoS 以额外代币的形式奖励验证者对其投资的利息。对 PoS 网络的一项批评是富者更富,这可能导致网络的中心化和控制不断增加。

无所不在的利益攻击

PoS 系统中的一个问题是无所不在的利益攻击威胁。在无所不在的利益攻击中,验证者实际上创建多个区块,以多次消费代币。由于在 PoS 系统中创建区块的成本很低,网络没有财务激励来阻止所有交易的批准,导致共识崩溃。

举例来说,想象一下,一个名为 Cain 的不良行为者,只拥有 100 个代币。他决定尝试欺骗,向网络发送两条消息:一条是他将他的 100 个代币发送给 Sanjay,另一条是他将他的 100 个代币发送给 Eliza。网络应该接受任一交易,但不接受两者。通常,节点必须就哪个交易有效或拒绝两者达成共识。但是,如果验证者与 Cain 合作(或由 Cain 自己运行),那么批准两个区块对他们的财务利益是有利的。

在下图中,预期价值代表EV。它显示如果验证者接受两个区块,它可以有效地双重花费而不受惩罚:

为了避免这个问题,PoS 系统引入了各种各样的对策,如抵押存款。在区块链分叉或双重消费攻击的情况下,参与的验证者面临失去他们的代币的风险。通过财务处罚和抵押代币的损失,认为双重花费和验证所有区块的激励会降低或消除。

变种

基本 PoS 方法有许多变体。每种变体都会有不同的要求,如拥有股权的最低余额、不良行为的潜在处罚、网络的利益相关者的权利和能力,以及修饰符,例如账户需要拥有抵押余额多长时间才能计算。

委托型股权证明(Delegated Proof of Stake)

DPoS 与 PoS 共识有关,但存在一些关键区别。这个新系统是 Bitshares、Steemit 以及目前的 EOS 的创始人 Dan Larimer 的创造。这两个网络以及 Lisk(另一个常用的区块链)目前是唯一使用这种方法的主要区块链。在 DPoS 中,代币持有者不是进行区块验证的人。相反,他们可以使用自己的代币选举一个节点来代表他们进行验证——他们的代表(也称为验证者)。正是这个代表/验证者帮助操作网络。可用验证器插槽的数量往往锁定为一个特定的数量,通常是 21 个。要成为代表,节点的所有者必须说服网络的其他用户信任他们,让他们负责通过将他们在网络上的整体代币份额委托给他们来保护网络。基本上,网络上的每个代币都充当一票,而获得最高选票的人被允许操作网络。目前,只有 Bitshares、Steemit、EOS 和 Lisk 是使用这种方法的主要区块链。

在 DPoS 中,每个代表都有一个有限的指定时间来发布新的区块。如果一个代表持续错过他们的区块创建时间或发布无效交易,使用他们投票权的代币持有者可以投票将他们替换为更好的代表。以下图表显示了这个结构如下所示:

DPoS 的主要批评是它在某种程度上是中央集权的,并且对背叛网络没有真正的即时财务惩罚。违反网络规则的后果是被代币持有者投票淘汰。人们认为,违反网络规则的声誉成本以及竞选代表股份的损失将超过试图负面影响网络的财务收益。由于只有少数的代表插槽,代币持有者更容易关注个体验证节点的行为。

Tendermint 共识

Tendermint 使用自定义共识引擎,由 Jae Kwon 的博士论文的一部分设计而成。它类似于 DPoS,参与网络的人可以将他们的投票权委托给一个验证账户。然而,为了这样做,他们必须债券化或锁定他们的代币。为此,他们必须发出一个特殊的债券交易,其中他们的硬币被锁定到一个验证节点。如果他们的代表行为不端,那么代表和借出他们硬币的账户都将放弃一部分他们债券化的代币。要释放他们的代币,必须向网络发布另一个特殊的解除债券交易,而且这样的提款会受到长时间的延迟。

让我们看看这些交易是如何发生的。以下图表摘自 Tendermint 文档:

让我们更详细地看一下前面的图。代表通过签署投票来信号下一个区块。有三种类型的投票:预投票、预提交和提交。每个区块都有一个特殊的验证器,称为提案者。提案者首先提出一个基于之前锁定区块的有效区块状态的建议。这个提议在其他验证器之间点对点共享,如果有 2/3 或更多的验证器同意锁定区块(在预投票阶段),那么它们将进入下一个阶段:预提交。在预提交阶段,同样,如果有 2/3 的人同意预投票条件,他们将表示他们准备提交。最后,区块的实际提交发生:节点必须已经收到了区块,并且必须已经收到了 2/3 的有效投票来进行预提交。

如果这个 2/3 投票序列看起来不寻常,那是因为异步网络的性质,验证器可能会在不同的时间收到区块和投票。这个序列以及在未达到 2/3 多数时处理边缘情况的方式,使得在不可靠的网络上能够有效快速地达成共识。

权威证明

权威证明PoA)网络仅在所有区块链参与者都已知的情况下使用。在权威证明中,每个参与者都被区块链知道并注册。这样的区块链称为许可链,因为只有属于批准的权威列表的计算机才能锻造区块。因此,至关重要的是,没有一个权威计算机被破坏,每个操作者都必须努力确保其验证器的完整性。这种方法最初由 Parity Technologies 的 Gavin Wood 分享,作为运行基于以太坊的区块链的不同方式。

建立权威

必须满足的三个主要条件以建立验证器如下所述:

  • 身份需要经过正式验证并上链。

  • 获得资格应该是困难的。例如成为公证人,接受背景调查和提供保证金等事项。

  • 对每个权威所需的事项集应该有良好的文件记录,一致,并值得网络的信任。

一旦建立了权威,可能会通过将该权威添加到区块链的有效验证器列表中来授予锻造新区块的权利。

虽然 PoA 主要用于私有链,但也可以用于公共链。两个公共以太坊测试网络,Rinkleby 和 Kovan,是使用 PoA 作为其共识机制的公共区块链网络。

PoA 的明显缺点在于每个验证器操作者的身份必须为人所知和信任,并且滥用信任的惩罚必须是真实的。对于全球区块链而言,这可能并不理想,因为区块链技术的吸引力之一就是能够匿名交换价值。

已过时的证据

Hyperledger Sawtooth 项目推出了一种名为proof-of-elapsed-timePoET的新共识机制。Hyperledger 主要涉及许可链,只有指定数量的参与者被允许进入网络,类似于 PoA 链。

基本方法很简单:

  • 每个节点必须等待一段随机的时间

  • 首个停止等待的节点将创建一个区块

我们必须做两件事情才能使其工作。首先,我们必须能够验证所有参与者的等待时间实际上是随机的,否则一个简单的攻击就是假装等待一段随机的时间,然后立即创建一个新的区块。其次,必须能够验证不仅选择时间的长度是随机的,而且节点实际上在采取行动之前等待了整个时间段。

这些问题的解决方案来自英特尔(他们创造了 PoET 算法),并依赖于特殊的 CPU 指令,以确保只运行受信任的代码。强制信任的代码负责处理块时间,确保抽奖公平。

摘要

到此为止,您应该对区块链使用的不同机制达成共识具有坚实的基础。每种共识算法在速度、可用性、一致性和容错性之间进行了一定的权衡。最常见的共识机制仍然是 PoW 和 PoS,但区块链的发展非常迅猛,新的、改进的方法可能会被开发出来。共识算法的改进将提高区块链的可扩展性和可靠性,并扩大技术的潜在应用范围。

参考文献

  1. groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf

  2. www.microsoft.com/en-us/research/publication/byzantine-generals-problem/?from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fum%2Fpeople%2Flamport%2Fpubs%2Fbyz.pdf

  3. github.com/tendermint/tendermint.com/blob/5c111743a03d2c6ed2e0b14bd3091cac8974c8da/docs/tendermint_v02.pdf

  4. peercoin.net/assets/paper/peercoin-paper.pdf

  5. github.com/ethereum/guide/blob/master/poa.md

  6. medium.com/poa-network/proof-of-authority-consensus-model-with-identity-at-stake-d5bd15463256

第八章:先进的区块链概念

在科技界,隐私问题被频繁讨论,特别是现在社交媒体高管不情愿地穿上西装,在美国参议院委员会面前作证。

同时,虽然区块链的支持者很高兴看到这项技术促进人类福利并分散资金转移,但考虑到所有交易都在链上公开,用户是否真正能够保持隐私是个值得关注的问题。

本章将涵盖以下主题:

  • 区块链作为公司治理工具

    • 未受银行监管的公司

    • 去中心化自治组织(DAO)

  • 区块链的社会用途

  • 在区块链的社会目的背景下的隐私问题

  • 零知识加密系统作为解决隐私问题的方案

区块链与银行

在加密货币生态系统中,隐私迫切需要。加密货币可以帮助发展中国家的人们摆脱贫困,并通过增加资金转移来推动经济——或者它们也可能成为压迫性政权追踪每笔交易的工具,并提供更多机会指控无辜者犯错。

区块链技术对具有反权威倾向的人们有明显的吸引力。美国许多人对银行系统心怀不满。30 年代,联邦住房管理局负责为抵押贷款提供保险,该机构绘制了它愿意开展业务的地区地图,排除了贫困和少数民族社区。这种做法持续了一代人,对许多美国城市的核心产生了毁灭性的影响,破坏了数千亿美元的财富。

最近,2008 年全球金融危机源于对未来衍生品和不正当借贷行为的投机,导致房地产价格暴涨(然后暴跌)。

一些法规是针对这些不当行为而制定的,但与 20 世纪 80 年代的储蓄和贷款危机不同,几乎没有人因此面临刑事处罚。从那时起,许多竞选公职的候选人都批评了银行家(获得了政府救助)相对于被指控对社会犯罪的其他人的待遇不公,例如低级毒品犯罪者。

从不那么政治化的角度来看,广泛存在对银行和支付解决方案的不满。任何在国外居住一段时间的人都会发现很难获取他们的钱。任何旅行的人都会遇到信用卡或借记卡因欺诈警告而被冻结。要为没有国内办事处的新企业开设银行账户?祝你好运。为了增加难度,试试从这个新公司银行账户发国际电汇。

虽然很容易说银行业还没有赶上时代,但这并不完全正确。建立一家商业银行账户比以往更加困难。因此,一些初创公司选择不办理银行业务,包括本书几位作者合作的一些公司。这种方法在管理费用方面具有一些优势(没有银行费用、没有无休止的声明和披露、没有因欺诈警报而封锁支付卡用户),但也存在风险,正如我们将在随后的章节中看到,不办理银行业务将需要一些发展才能成为可行的替代方案。

未加银行账户 - 走向纯加密货币

把一个纯加密公司视为银行业问题的解决方案似乎是自然的 - 为什么不只运行一个完全由比特币或以太坊组成的实体?正如我们将看到的,大多数解决方案涉及无法接受的不确定性水平。

修正固定汇率

支付某些费用所需的法定货币是重要的 - 企业最终的大部分支出不会基于比特币或以太坊的价格,而是基于这两种货币其中一种或两种兑美元或欧元的价格。在你能够用加密货币支付电力和食物之前,加密货币对美元或欧元的价格变得无关紧要几乎是不可能的。

有些人认为发展所谓的稳定币可以解决这个问题。可以使用各种机制来确保资产的买入或售出压力,例如后盾在价值低于承诺价值时回购代币。然而,一个更简单一些的解决方案可能是以主权政府发行的货币为基准的代币。

固定汇率是一种特定类型的固定汇率制度,发行国断言其货币价值取决于另一种货币,理想情况下愿意用其货币兑换另一种货币。

经济学家往往不赞成谈论固定汇率。1994 年墨西哥的所谓龙舌兰危机就是一个货币被高估的著名例子。墨西哥政府发行的以墨西哥比索计价的债券可兑换成美元,汇率约为 1 美元兑换 3 比索。很少有人相信墨西哥比索价值那么高。最终,做空(借比索抛售以获取美元)和资本外逃(投资者抛售其比索资产)导致比索价值急剧下跌,随后造成了严重的衰退。

墨西哥央行试图通过提高利率控制通货膨胀。与美国和欧洲大陆不同,墨西哥许多抵押贷款是浮动利率的,这意味着房主付款中的利息占比大幅上升,从而导致许多情况下违约和被收回。

一些国家,例如柬埔寨,尽管存在这些缺点,仍然继续使用固定汇率,但难以找到其他被广泛认为是一个糟糕主意的事情。

尝试将加密货币与美元挂钩的努力不可避免地在加密货币中筹集资金,然后使用它来购买主权债务。断言是,代币的一个单位等于一美元,或一美元的某个分数。代币由发行者持有的债务支持,在理论上,发行者能够通过漂浮赚钱。

如果发行者试图最小化风险,仅购买 1-3%的国债,嗯,数十亿美元的 1-3%可能足以支付你的员工。商业模式非常简单。PayPal 著名地也试图免费,并用浮动资金支付所有开支,但并未成功。

最著名的稳定币尝试是泰达币(代码:USDT),其价格围绕 1 美元左右。泰达币聘请了纽约会计事务所 Friedman LLP,并承诺进行定期审计。这些审计没有出现,而 Friedman(可能是出于对委托方利益的尊重)没有发表任何关于泰达币每个单位是否由现金或等值现金支持的声明。

这种性质的固定汇率在加密空间中有点奇怪;最终,这种交易的基础是信任。这几乎与无信任、去中心化生态系统的概念相对立;但存在替代方案。

购买期权

未来,相对于美元或欧元的汇率风险可能将由金融期权而不是稳定币来管理——这些是为用户提供购买或出售资产的权利,但不是义务。希望管理风险的用户将支付略微溢价来购买针对他们的加密货币头寸的保护性 put。

Put 是以特定价格出售资产的权利。保护性 put 是针对你已经拥有的资产购买的 put,价格低于现在的价值。如果资产的价格跌破行权价格(即期权可以执行的价格),则该期权可用于为基础资产获得更高的价格。

现有交易所的问题在于,在发生问题时没有强制执行期权的机制。传统上,大宗商品被认为是最具风险的投资形式。你可以以 20:1 的杠杆交易,并且如果市场走向相反方向,你只有 5%的保证金要求!要么投入更多资金,要么全部损失。

至少就商品而言,如果生产者未能交付其小麦、大豆或石油的合同,交易所将承担责任。期权将需要通过托管(交易所持有写有期权的加密货币)或其他机制强制执行。购买针对其他人本地钱包中持有的以太币的期权将具有所谓的对手方风险,即市场朝相反方向走时,其他一方无法达到预期的风险。

其他合同,比如期货和期货协议,也存在交易对手风险,可能未来,与其依赖 Tether 或 bit USD 来处理我们的法币对冲,我们会有受监管的交易所,其中有加密货币或现金托管准备支付,如果事情进展不如人意。

为什么需要受监管的交易所?

宇宙趋向于最大的讽刺——人们想要宣称d 操烂正规d 并摆脱主权货币,但多数人同意政府有合法权益来保护人们免受欺诈和暴力。

加密货币的无信任性质在交易点失败。如果你想将一种加密货币兑换为另一种,这笔交易经常需要你信任交易所。同样,如果你希望另一方执行一项可能让他们损失金钱的交易,那么另一方要么需要你熟悉他们,这样你就可以在法庭上寻求补救,要么法律需要交易所承担支付索赔的责任。

最有可能的结果是,在美国,证券交易委员会或商品期货交易委员会将开始批准交易所,并且交易所将有一定的流动性要求。这将使无银行公司成为一个较不太风险的选择。

无银行账户,无法结成公司?

我们已经确立了一个没有银行账户的公司是可能的(而且也是合法的——在许多司法管辖区没有具体要求法律实体必须拥有银行账户)。但是没有法律结构的组织,或者拥有高度非传统的法律结构又该如何?

任何考虑投资于没有法律实体的组织或资产的人都应该非常谨慎,因为假设是你的个人资产处于危险之中。一般来说,人们使用实体来保护他们的个人资产并获得某种组织或税收优惠。

没有实体,组织可能没有有限责任,法律可能选择将所有者视为合伙人。就责任而言,没有实体的合伙关系可能是你能要求的最糟糕的对待方式。这在普通法司法管辖区(拥有有限责任公司、合伙有限公司、公司、信托、基金会和其他形式)和民法司法管辖区(拥有类似形式,如卢森堡的 SARL,德国的 GmbH 和法国的 SA 等)都成立。

根据美国法律,合伙人的成员可对合伙关系的违法行为承担连带和有分别责任。参与加密实体的人,即使只是一点点,也没有公司或其他实体可以承受损失并陷入困境,如果其他人对它提出索赔。

有限责任就是这样的——你的责任仅限于你的投资,组织通常区分被动参与实体的人(有限合伙人或股东)和积极参与的人(普通合伙人或官员)。

有限责任不会保护组织成员免受刑事责任的追究。如果一家公司的高管对股东或公众实施欺诈行为,有限责任也不能保护他们。

需要极度谨慎地考虑任何加密项目的运作是否合法,到目前为止,监管行动主要关注的是欺诈性筹资活动,而不是投资者参与一家欺诈公众的组织。这并不意味着投资者是安全的。

考虑是否能确定管理团队的身份(例如,你是否至少能查看某人的领英资料并确认他们的存在?),以及实体是否可辨认(你能找到公司声称注册的司法管辖区吗,以便我可以核实其是否真实存在?)。

DAO

去中心化自治组织(DAO)是一种试图建立的非银行实体,尽管没有组成公司。它组织为瑞士 SARL,筹集了大约 1150 万以太币。DAO 应该是一个基于智能合约运行的基金,并且将向以生产性方式使用资金的实体提供贷款。

DAO 的理念是投资者将对所有决策进行投票,并且完全使用智能合约进行治理,以造福投资者,这样可以消除任何董事或经理可能存在的不正当激励。所有决策都将符合投资者的利益。

DAO 的一个智能合约中的一系列漏洞使恶意黑客窃取了价值 5000 万美元的以太币,相当于 DAO 资金的三分之一。

DAO 在 2016 年底被主要交易所下市,这也就是它的结束。为了取回资金,以太坊区块链经历了一次备受争议的硬分叉。

以太坊社区的一派人士反对对 DAO 的资金进行退款,声称硬分叉违反了不可变性原则和“法律即代码”的概念,即用户应该遵守的原则。这导致了以太坊经典的诞生。

下市约一年后,美国证券交易委员会表示,筹资行为很可能违反了美国证券法,尽管它拒绝对 DAO 采取行动。没有人受到刑事处罚。

这很可能是专业管理人员被移除出组织运营流程的第一个实例。消除企业董事会和董事的中间层,并允许利益相关者直接发言似乎是个好主意,至少在表面上是这样的。区块链提供了各种共识机制,如股权证明和委托股权证明(在上一章中更详细地讨论),这些机制非常适合解决这类问题,而且智能合约提供了无限的可能性。

去中心化组织

通过智能合约来管理一个组织的可能性仍然存在。该组织很可能仍需要一个或多个董事来执行用户的指示,并承担运营组织的职责。DAO 声称零员工,这在某种程度上可能是真的。考虑到它实际上已经消失了,现在确实是零。

要使一个去中心化资产组织合法,一个好的起点是让它拥有一个法律实体,正如先前建议的那样——为投资者提供有限责任。为了筹集资金,它最好承认自己是一个证券发行,而不是声称自己是一个实用令牌。然后,该发行需要向适当的监管机构注册为证券,或者申请豁免。

像 DAO 这样的发行的许多法律问题也许可以通过遵守形式来避免——一个代币作为证券并没有固有的问题,除了要开始,我们可能应该承认,大多数人在投机性购买的代币实际上是证券。

在美国进行 506(c) 规则下的发行允许在认可投资者之间进行无限筹款,并且允许一般征求意见——你可以宣传你的发行。如果你想在除认可投资者之外的投资者中筹集资金,你可以通过另一种豁免方式,即 Reg A+,尽管存在某些限制和大量的成本。

用户在公司治理上进行投票的核心概念是一个好主意。像 DAO 这样的组织形成法律实体只是为了与现实生活兼容,这表明了加密社区某些成员的巨大傲慢。

公司存在是为了股东的利益。在实践中,层层管理和普遍的寻租使组织失去了大量的生产力。然而,认为消除组织中的人就能解决问题的想法基本上是错误的。

算法是由人编写的。智能合约是由人编写的。的确,一个零员工的组织没有工资支出,但是如果它被 5000 万美元的失窃费用所取代,很难说这是一个进步。

不过,一个真正由利益相关者管理的组织的基本概念,在这种情况下,每一笔交易都经过那些资本应该被增长和保护的人的审查,这可能在某些情况下确实有效。关于流行智慧的大量著作平均起来确实很好。

就像主动管理的共同基金在扣除所有费用后往往表现不佳一样,投资于特定资产的基金的专业经理可能无法赚取自己的工资。一家加密房地产基金,其投资者主要是经验丰富的房地产投资者,他们以前曾参与过联合交易等,可能会产生良好的结果。

在这种情况下,区块链的价值在于利益相关者可以通过运行专门的软件或点击网页界面,以一种快速、一致、可验证的方式参与董事选举或自己运行整个组织。

将公司放入区块链

我们已经讨论了区块链作为利益相关者更好控制企业治理的一种机制。股东能控制什么?

像本杰明·格雷厄姆这样的人喜欢接管表现不佳的公司,并迫使它们支付股息。这是股东激活的一个例子。公司的存在是为了你的利益 - 如果它对你没有效果,让它为你工作。

运行大额现金盈余?让它支付现金股息。

高管薪酬失控?削减薪酬,重新谈判并解雇,依法允许。

你的公司是一家 Radio Shack 或一家 Blockbuster,明显缺乏竞争力?清算它。将它转换为以太币。

拥有激活股东的公司往往表现比没有这些股东的公司更出色。如果通用电气公司拥有对公司财务有良好透明度的激活股东,那么首席执行官就不会有机会让一架额外的专机跟随他的私人飞机以防他的私人飞机出故障(是的,很严肃)。

机构惯性和资本的缓慢消亡在这样一个环境中似乎不太可能,在这个环境中,股东有选择随时将实体从生命支持中脱离的选项。

消除中间人

普遍认为股东激活会提高回报率,也有一些证据支持这一点 - 但是如果你有一个非常技术性的商业模式,不指望你的投资者能理解呢?

假设你的业务涉及抵押支持证券、不良债务、互换交易或其他权宜之计?其中一些涉及到非常复杂的金融模型,有真正的风险是股东(或代币持有者)不会理解。在这样一个迅速、残酷的环境中会是怎样的情况?利益相关者会过早地终止实体吗?

幸运的是,代币不一定是股份。没有任何技术障碍会阻止这些代币成为其他证券。

代币可以是 revshare(一种债务形式,代表实体收入的一部分,直到偿还本金的多倍),票据、债券或其他具有利息的工具。利息可以基于法定价格或以太或其他普遍可替代的加密货币的固定利率支付。

甚至可以代表某项特定资产的收入或利润的一部分,代表着基于加密货币组合的未来衍生品的回报,硬资产组合、租金或特许权。在撰写时,一家名为Swarmsales的公司正在准备创建一个资产,从数千个软件销售单位的销售收入中获取一部分收益,这些销售业绩来自一个大型且不断增长的去中心化自由销售团队。预期使用这种工具支付销售专业人员将为他们提供一个新的收入来源,取代他们的基本薪水,并提供超出雇佣期限的收入来源。Swarmsales 期望能够利用这种方法打造全球最大的 B2B 销售团队。

区块链让这成为了可能。原本需要证券转让代理、无数次会议以及非常专业昂贵的员工的集资,如今可以在互联网上通过少量的技术和法律工作以及在华尔街可能荒谬的营销预算下完成。

提供资金

有一种看法认为首次代币发行ICO),以及越来越多的证券代币发行STO),是一种简单、低成本的筹款方式。对于合适的团队可能是真的,但预算已大幅增长。一个名为Financecoin的项目直接从 BitcoinTalk 上的 DogeCoin 的 README 文件中复制粘贴,成功筹集了 400 万美元。作者不清楚他们用这笔资金做了什么有用的事情,这再次引出了该领域的另一个问题。

那些日子已经过去了,在这个竞争日益激烈和受到监管的领域中,进行 ICO 或 STO 的成本已经广泛认可为 20 万到 50 万美元之间。不过,好项目可能本来也不会有资金筹集的问题。

非常多的代币销售用于支持非常时尚的科技项目,其中一些项目同样适合于传统募资。要进行首次公开发行IPO)或经 reg A+ 公开募股,离不开投资银行或证券公司的帮助,而这些公司主要涉趋向科技和医疗保健。可以断言区块链并没有改善对于具有强大团队、良好概念和前期创业经验的项目这方面的资金获取。

当然,对于投资银行来说,DAO(去中心化自治组织)很大程度上不感兴趣;这些仍然仅限于进行 ICO 或 STO 的分布式团队的范围。

一些具有社会目的的项目通过传统渠道成功筹集资金,例如 Lemonade,作为纽约 B Corp 组织的非传统保险公司,去年完成了一次非常成功的 C 轮融资。专门公司似乎是主流风险资本公司(比如 Andreessen Horowitz 和 Founders Fund)的新宠。

这似乎也适用于区块链——受益公司和慈善机构同样需要现金,但可能不适合进行多轮筹款和最终退出,这是风险投资所要求的。2017 年,Fidelity Charitable 收取了价值 2200 万美元的比特币和其他加密货币,预计慈善捐款的这一部分将继续增长。

社会目的 - 区块链作为平衡者

作为筹集资本的手段,区块链有可能改善环境影响和长期存在的贫富差距。一家名为非洲棕榈公司的澳大利亚公司正在努力推出一种加密货币,每单位以一吨可持续来源的棕榈油作为支撑。

当本书出版时,欧盟正准备禁止进口印度尼西亚和马来西亚的棕榈油——目前供应的 85%。种植棕榈油的方式造成了大规模的栖息地破坏。相反,这项 STO 旨在购买已经种植棕榈树的四百万公顷土地,有望在四个西非国家大规模减少失业率。

海地孤儿院创始人领导的另一个项目有可能改善税收征收并为大量弱势群体提供物质安全保障。加勒比加密委员会是一个旨在创建一种由某种加密实体使用的硬币的项目;政府将允许形成一个加密公司,以大幅降低税率来换取该实体拥有公开财务报表。将该业务的交易公开记录在区块链上将使公司能够创建可验证的资产负债表和损益表。受 15%税率约束的实体将优于名义上有 40%税率的实体(在实践中不支付任何税款)。

这个概念还为生活在地震频发的海地临时住房中的人们提供了物质安全保障,在那里银行很昂贵,现金被存放在帐篷和房屋中——使居住者面临被抢劫的危险。另一种选择?在您的智能手机上的短信钱包。通过网关,您手机上的一个程序可以发送和接收文本消息,可以为离线钱包记账,甚至没有移动数据也可以。

让无银行账户者入银行系统

缺乏融资和银行服务的获取使人们不得不使用高利贷。发薪日贷款承诺提供资金解决迫切需要关注的问题——被扣押的车辆,释放出狱的保释金,即将被银行取消的抵押贷款。

对借款人和放款人来说,贷款成本很高——据说有 25%的本金损失到期违约。然后,对这些违约贷款的收回权被出售给了收款机构,这些机构享有恶名昭著的恶劣和滥用行为。

按时偿还的贷款同样也不受到公平或合理对待的待遇。利率范围从 50%到 3000%以上年化,一些放贷人把每笔还款都视为再融资并写入新贷款,让他们再次收取最高利率。

据说有些人完全没有银行账户——除了贷款之外,银行的部分准备金模型为贷款人提供了一种避免对一些服务收费的选择。因为之前透支、地理隔离或成本高等原因没有支票账户的人被切断了这个系统的联系,通常不得不使用支票兑现服务和预付借记卡。这是另一种不便宜的产品,服务费率在 1%到 4%之间——如果一个工人被迫以这种方式兑现工资,这是一笔可观的费用。对于最贫困的人来说,尽管同样的人可能反对税收,但在所有抵免之后,支付支票兑现费用比支付所得税更不寻常。

一些公司已经开始使用替代传统银行业务的方式,不管是好是坏。现在,令人遗憾的是,企业向员工提供预付借记卡作为银行业务的便利替代方案已经不是不寻常的事情了,尽管其服务更差,成本却大大增加。

然而,另一种选择是各种电子招标。DHL 现在用 Safaricom、M-PESA 支付其肯尼亚承包商,这是一种与肯尼亚先令挂钩的手机钱包。对于那些最近的银行可能在 50 或 60 英里之外的人来说,这代表着一个巨大的进步。

这比拥有加密货币的安全性更低——加密货币的属性,特别是去中心化,确保没有一个中央机构能够轻易地夺取或撤销资金的所有权。这在本质上只能通过应用程序使用的银行账户上并不适用。

同样,加密货币的一个很大的优势是现金不受像资产没收这样的幽灵所困扰,法律执法机构可能会在所谓的rem 程序中没收财产,在此程序中,财产的所有权归财产所有者证明。区块链不仅提供了所有权可以被证明的手段,还提供了财产的产权链——在大多数情况下,可以追溯到资产创建的日期。

丝绸之路有限责任公司——隐私与道德

新兴技术的一个奇怪的矛盾是,它同时被赞扬和谴责。好坏的可能性被考虑和衡量。

可能我们对道德主义有些偏向太多了——几乎每个对区块链感兴趣的人都被告知它只用于毒品。这有一定道理:许多人最初听说比特币是在暗网市场上使用的,比如丝绸之路,而这种比特币的使用可以说是加密货币流行的原因。然后同样的人可能会惊讶地发现,事实上,你已经用比特币领到了工资有六七个月的时间了。

每个狂热者都必须真诚地考虑其不足之处——比如,在比特币中,隐私仍然是一个大问题。截至本文撰写时,这似乎很不可能改变。拿出一个能为透明度做出如此多努力的想法——比如,一个加密公司,其交易,或者至少其资产负债表,都是公开的,供所有人查看。这个想法在概念上是合理的,并且它将改善税收的收集和合规性问题。

之前没有记录的员工可能享受社会保障积分。可能会实现不同种族和民族群体之间的工资平等。用于洗钱的组织将受到更严格的监管。财务报表欺诈将容易被发现。保险费率将会大幅下降——或者至少我的差错和遗漏保险会变得更便宜。

所有这些听起来都很不错,直到你考虑到每个人都干涉到其他人生活的明显不足之处,人们希望建立和传播任何技术,不仅仅是区块链的人,停下来仔细考虑隐私的价值。

再举一个例子:电动智能表能够提高公共事业公司的效率。它消除了大量的人力劳动。而不是每个房子定期派人来读表,表定期传输用电数据。从理论上讲,这对消费者也是有好处的:把冰箱拔掉插座 20 分钟,看看它用了多少电。不那么直接地(也许是出于天真),我们还会假设,公用事业公司的节约会以更低的电费形式传递给消费者。

那么,哪里是问题呢?这些最不复杂的表能够识别到,比如,微波炉的使用。举个例子,突然功率使用量提高了大约 1000 瓦,持续一分钟。假设你发现某个家庭在斋月期间每天日落前使用了 1000 瓦,你很可能识别出了一个遵循古老斋戒传统的穆斯林家庭。如果你发现从周五晚上到周六晚上根本没有用电,也许你已经识别出了一个虔诚的正统犹太人。

无论当局看起来多么仁慈,信息都有粘性,对有不良意图的人极具威慑力。考虑一下,虽然在荷兰,大屠杀特别严重,但只在阿尔巴尼亚杀死了一个家庭。前者国家擅长保留记录。后者则相反。

追踪一切

区块链作为解决社会问题的解决方案具有潜力。从防止血钻进入流通到保证最低收入,都可以通过区块链实现。任何工具都有被滥用的潜力,这也不例外。

考虑销售——在每颗钻石上放置一个微小的芯片。它有一个带有可撤销私钥的小芯片,类似于信用卡上的 EMV 芯片。理论上,这可以用来确保你戒指上的每颗钻石都不是所谓的冲突钻石,即用于资助战争的钻石之一。

还可能会导致其他人无法进入市场。通过诸如美国宝石学院(GIA)之类的组织认证宝石的珠宝商现在必须签署一份声明,声明他们不知情地出售血钻,并提交与反洗钱法规相关的个人信息。

不愿意遵守这一方案的钻石供应商在很大程度上并不需要这样做,代价是被淘汰出局——专门销售未经记录的钻石意味着提供较低质量产品的业主。无论代价多大,企业都会竭尽全力展现自己的合法性,即使是最精明的消费者也不太可能对业主的隐私过多在意。

通过零知识证明打败一些隐私问题

尊重人类的局限性,无论是知识还是道德品质,都比那种挥手一切都会好起来的态度更加道德、更加强大。承认,尽管有些人会滥用匿名性,但现金和物物交换已经存在了数千年,没有任何一种中央机构对其进行监管,人们往往有合法的隐私甚至匿名性要求。

零知识密码系统可能在某些使用情况下提供解决方案——诸如 Zcash 和 Monero 等加密货币更像现金。比特币和(目前的)以太坊并不提供批评者所认为的匿名性和隐私性。

区块链本质上具有许多对于寻求隐私和匿名性的人来说非常理想的特性,其中分散化是最重要的特性之一。更广泛地说,在区块链之外,作者怀疑用户是否愿意为确保短暂性、暂时性、甚至可被遗忘性的技术支付一些额外费用。

我们把最私密的个人生活细节托付给了由可犯错的人类设计的机制,尽管不断发生数据泄露和偶发事件,公众仍然大多信任诸如 Facebook 聊天和始终开启的麦克风等设备。然而,无论区块链的狂热传道者看起来多么狂热,对于那些拥有集中式物联网和移动设备的公司的信任依然是最显著的傲慢。

零知识证明(和零知识论证)允许网络验证某些计算(如代币所有权)而不了解任何关于它的信息。除了我们使用区块链的特性(区块链是一致的、不可改变的和去中心化的)之外,零知识的具体实现也可以是可否认的,并且避免记录可能危及用户隐私的信息在区块链上。

揭开零知识证明的概念

从概念上讲,零知识证明类似于随机响应研究。研究人员可以理解地担心,人们是否会诚实地回答有关禁忌行为的问题——比如吸毒或与性工作者的交往。

为了消除偏见,统计学家提出了一种方法,通过在个体回答中引入随机性,同时保持整体结果的含义。想象一下,你正在试图通过采访妇女来确定堕胎的患病率,在一个堕胎是非法的地区。让受访者抛一枚硬币。如果是正面,诚实回答问题。如果是反面,就说是。

研究人员不需要知道硬币抛出的结果,或者每个人的真实回答,他们只需要知道,通过足够的样本量,将超过 50%的边际翻倍可以得到实际的实践患病率。这种方法既保护了个体受访者的隐私,又不损害数据质量。

零知识证明(和论证)是非常技术性的,其细枝末节超出了本出版物的范围,但它们在概念上类似于我们正在讨论的内容。根据具体的实现方式,零知识可能允许用户在不让网络上的其他用户知道钱包中的内容的情况下花费其钱包的内容。这是加密货币可以真正类似于现金的一个方面:除了强盗抢走你的钱包之外,没有其他人知道你拥有什么,直到你公开它。这种方法成功地解决了比特币和以太坊等加密货币中的最大问题之一。

摘要:

区块链是一项具有变革性的技术,其影响类似于互联网、疫苗接种或动力飞行:其社会影响广泛、微妙,并且在某些方面可能是有害的。它有可能进一步破坏隐私,极大地改善企业治理,或者使数十亿人摆脱贫困。这项技术的具体应用将定义它作为一种塑造世界的工具。

在下一章中,我们将讨论一些区块链的应用,从其中最基本的开始,即加密货币钱包。

第九章:加密货币钱包

在本章中,我们将详细讨论加密货币钱包。在之前的章节中,我们已经介绍了钱包以及加密货币钱包的类型;在本章中,我们将进一步详细讨论钱包、它们的来源以及如何加强钱包的安全性。

钱包用于存储私钥、公钥以及比特币地址。可以使用钱包发送或接收货币。钱包可以将数据存储在数据库中或结构化文件中。例如,比特币核心客户端钱包使用 Berkeley DB 文件。

本章我们将涵盖的主题如下:

  • 加密货币钱包的重要性

  • 软件钱包

  • 硬件钱包

  • 纸质钱包

  • 脑钱包

  • 加密货币钱包中的密钥派生方法

  • 记忆代码

加密货币钱包简介

任何加密货币的钱包都可以存储多个公钥和私钥。加密货币本身并不包含在钱包中;相反,加密货币是去中心化存储和维护在公共分类帐中的。每个加密货币都有一个私钥,用它可以在公共分类帐中写入,这使得在加密货币中进行消费成为可能。

了解钱包的重要性很重要,因为保护私钥安全对于保护货币安全至关重要。钱包是公钥和私钥的集合,每个都对于货币持有者的安全性和匿名性都很重要。

加密货币钱包中的交易

钱包之间的交易不是价值转移;相反,钱包中存储着私钥,该私钥用于签署交易。交易的签名是从私钥和公钥的组合中生成的。安全存储私钥是非常重要的。

钱包可以存储多个私钥,并生成与私钥相关联的多个公钥。

因此,保持钱包安全以保护私钥的安全非常重要;如果私钥丢失,与该私钥相关的硬币将永远丢失,没有可行的方法来恢复这些硬币。

加密货币钱包的类型

根据其特征,钱包可以分为各种类型。钱包可以根据支持的货币数量、可用性、软件或硬件、密钥派生方法等进行分类。我们将在下面的子章节中查看要涵盖的加密货币钱包类型。

货币支持

区分钱包的一个主要特征是钱包支持的货币数量;例如,可以有支持单一货币或多货币的钱包。每种货币都有一个包含钱包的核心客户端。

官方钱包通常只支持单一货币,但现在,许多第三方钱包开始支持多种货币,这些钱包执行与常规钱包相同的功能,唯一的区别在于它们支持的货币种类。

一些支持多种货币的钱包如下所示:

  • 无限钱包

  • Jaxx 钱包

  • Electrum

  • Trezor

  • Coinbase 钱包

以下是支持各种货币的 EXODUS 钱包的截图:

有时,会有各种其他的钱包涌现,提供多种货币。有时,支持单一货币的现有钱包开始引入多种货币,以增加其受欢迎程度,甚至以支持另一种加密货币。

租约

钱包还可以根据它们是基于软件、硬件、纸质还是云的来区分。让我们详细讨论这些钱包。

软件钱包

这些钱包是基于本地计算机或手机的。这些可以进一步分为桌面或移动钱包。这些钱包受限于本地机器;它们通常会按顺序下载完整的区块链或记录公共分类帐的信息:

  • 桌面软件:它们在桌面或笔记本电脑上本地存储密钥。这为加密货币提供了完全的控制权,尽管安全责任由托管钱包的人员承担,因此,即使机器的硬盘发生故障且没有备份,也有永久丢失货币的风险。没有必要在每时每刻都更新区块链,因此,在这种情况下,也可以使用未连接到计算机的机器。

  • 移动钱包:这些钱包通过手机上的应用程序运行。这使用户可以轻松访问他们的货币。这些钱包将货币或密钥存储在手机上,就像桌面软件钱包一样,或者它们只是一个云钱包的界面;我们稍后将讨论该类型的钱包。以下截图是移动钱包的示例:

大多数加密货币的核心客户端最初提供软件钱包,并初步支持桌面钱包。

硬件钱包

私钥应存储在可能的最安全位置。硬件钱包将私钥存储在专为存储私钥设计的自定义硬件中。无法以纯文本形式导出私钥,这增加了另一层安全性。只有在需要时,硬件才连接到计算机,而在其他所有时候,私钥都保持安全。硬件钱包于 2012 年由 Trezor 首次推出。

目前可用的一些流行的硬件钱包包括 Trezor、Ledger 和 KeepKey 钱包。以下快照显示了一个连接到计算机的硬件钱包的示例:

纸钱包

纸钱包,顾名思义,只是公钥和私钥一起打印出来。密钥通常以二维码形式打印,也作为地址。任何人都可以通过打印密钥来创建纸钱包,但也要确保他们将密钥从计算机中删除,否则任何人都可以访问密钥。纸钱包应只存储在纸上,没有其他地方的备份。有各种在线服务可生成纸钱包,例如 www.walletgenerator.net。以下屏幕截图是纸钱包的示例,以下图片可打印,以接收支付,公钥地址是共享的,但标记为秘密的私钥必须保密:

大脑钱包

大脑钱包是一个简单的钱包,通过对口令进行哈希运算生成地址以生成私钥和公钥。要生成大脑钱包,我们选择一个简单的口令来生成公钥和私钥对。以下屏幕截图显示了如何生成公共地址和私钥。输入要记住的口令,如下图所示:

使用频率

钱包还可以根据使用情况区分;在这个基础上,主要有两种类型的钱包:冷钱包和热钱包。简单来说,冷钱包不连接到互联网,而热钱包则始终连接到互联网,可以随时用于发送相应的加密货币。即使未连接到互联网,冷钱包也可以用于接收货币,但在将其连接到互联网之前,不可能将货币发送到其他地址。

硬件钱包不连接到互联网,除非连接到设备;它们可以被视为冷钱包。

密钥派生

私钥由钱包生成以存在于区块链上,主要有两种方法可以生成密钥。密钥生成方法对于钱包的安全性至关重要,也对于在丢失钱包时恢复钱包至关重要。

非确定性钱包

这些是比特币客户端的最初迭代版本;钱包具有随机生成的私钥。这种类型的钱包因一个主要缺点而被停用,即如果丢失钱包,则无法访问随机密钥。由于建议在网络上维护匿名性时每次交易使用不同的地址,而随机密钥过多,因此难以维护,因此地址容易被重复使用。尽管在比特币核心客户端中,有一个实现为类型-0 钱包的钱包,但其使用受到普遍不鼓励。

确定性钱包

在这些钱包中,密钥是从单个主密钥或一个可以说是共同种子派生的。在这种类型的钱包中,所有私钥都链接到一个共同的种子。只备份种子即可恢复在这种类型的钱包中派生的所有密钥。

分层确定性钱包

这是确定性钱包的最高级形式。这些是在比特币改进提案系统的 BIP0032 中引入的。这些钱包遵循树结构,也就是说,种子创建主密钥,进一步创建子密钥,每个密钥都可以派生更多的孙子密钥。因此,在这些类型的钱包中,可以有多个分支的密钥,并且分支中的每个密钥都能够按需创建更多的密钥。以下图表显示了在这种钱包中创建的密钥和地址层次结构:

图片

助记码

这些是用于表示确定性钱包中用于派生种子的随机数的英文单词。这些单词充当密码;这些单词可以帮助恢复种子,以及随后从种子派生的密钥。助记码对钱包用户来说是一个很好的备份系统。

创建钱包时,钱包显示一个包含 12 至 24 个单词的列表。这些单词序列用于备份钱包,并在钱包无法访问时恢复所有密钥。

这是根据 BIP0039 标准生成助记码和种子的过程:

  1. 初始随机熵ENT比特在允许的 128-256 比特大小之间生成。

  2. 校验和是通过取其 SHA256 哈希的前几位生成的。校验和长度由ENT/32公式定义。

  3. CS标识的校验和添加在初始熵的末尾。

  4. 创建的序列分割成 11 位;每个都被编码为一个在 0 和 2,047 之间的数字,该数字充当预定义单词列表中的索引。

  5. 创建代表助记码的 12-24 个单词列表。

助记码长度,也称为助记句(MS),由MS = (ENT + CS) / 11定义。以下屏幕截图显示了单词长度和与其相关联的熵:

图片

从助记序列生成的 512 比特种子使用PBKDF2函数,其中助记句用作密码,字符串助记句+密码用作盐。密码是用户用来保护自己助记句的内容;如果未设置,则使用""

从这个过程派生的密钥长度是 512 位;不同的钱包可以使用自己的过程来创建单词列表,并且拥有任何所需的单词列表。尽管建议使用 BIP 中指定的助记词生成过程,但钱包可以根据需要使用自己版本的单词列表。

HD 钱包的密钥生成过程

我们将详细讨论密钥生成过程,从主密钥到私钥,以及钱包为交易目的创建的各种地址。

初始过程是创建根种子,它是一个 128、256 或 512 位的随机数。根种子由助记句表示,这使得在丢失钱包访问权的情况下更容易恢复完整的钱包。

根种子是使用助记句和根种子生成的,根种子的长度选择在 128 到 512 位之间,尽管建议使用 256 位。使用(P)RNG 生成。生成的哈希值用于创建主私钥和主节点。主密钥的生成是层级系统中的深度级别 0;随后的钱包或密钥由深度 1、2 等表示。

子密钥派生

HD 钱包广泛使用子密钥派生CKD)函数从父密钥创建子密钥。使用以下元素使用单向哈希函数派生密钥:

  • 父密钥

  • 作为种子的链码,256 位

  • 索引号,32 位

子密钥可以从已经存在的密钥中生成的方式有多种;以下是关键派生序列:

  • 从私有父密钥生成私有子密钥

  • 从公共父密钥生成公共子密钥

  • 从私有父密钥生成公共子密钥

让我们详细讨论前面提到的每个序列。

私钥生成

父密钥、链码和索引号被组合并使用HMAC-SHA512算法进行哈希运算,生成一个 512 位的哈希值,使用以下公式:

I = HMAC-SHA512(Key = Cpar ,Data = serp (point(kpar )) || ser32 (i))

生成的哈希值被分成两个哈希值,I[L] 和 I[R]。哈希输出的右半部分成为子节点的链码,哈希的左半部分及其索引号用于生成子私钥以及推导子公钥。

通过更改索引,我们可以按顺序创建多个子密钥。

扩展密钥

如前所述,可以从父密钥派生出许多子密钥,考虑到已有的三个必需输入。我们还可以创建另一种类型的密钥,称为扩展密钥,它由父密钥和链码组成。

此外,有两种类型的扩展密钥,区别在于所使用的父密钥是私钥还是公钥。扩展密钥可以创建子项,子项可以进一步在树结构中创建子项。

扩展密钥使用Base58Check进行编码,这有助于在钱包之间轻松导出和导入。这些密钥基本上是父密钥的扩展,因此共享任何扩展密钥都可以访问整个分支中的所有内容。

扩展私钥在密钥的Base58Check中具有xprv前缀,而扩展公钥在密钥的Base58Check中具有xpub前缀。以下图表显示了扩展密钥是如何形成的:

图片

摘要

在这一章中,我们详细讨论了加密货币钱包和各种类型的加密货币钱包,我们阅读了基于这些货币钱包可以区分的各种特征,并且我们谈论了钱包的使用、每种钱包类型的好处以及在使用特定钱包类型时可能会遇到的问题。我们讨论了关键派生方法及其在安全性、可访问性和钱包的其他方面的重要性。

第十章:替代区块链

在前几章中,我们学习了区块链、其结构、组成部分、机制以及区块链的最大用例——比特币。在最后一章中,我们讨论了加密货币钱包及其在区块链中的角色和用途。我们的讨论大部分围绕比特币和其他加密货币展开。

比特币的成功吸引了很多关注,不仅是技术上的,还有底层的区块链分类账系统,社区开始创建基于区块链的替代加密货币,每次都在试图在某种程度上改进。随后,各种组织开始通过对比特币的参数进行轻微修改或变更,但保持区块链的核心定义不变,即公共分类账。一些试图创建替代区块链的项目并没有引起太多关注,但其他项目则得到了很多关注和社区支持。

在这一章中,我们将讨论以下主题:

  • 区块链在政府、医疗保健、医学研究、供应链、艺术品、航运、能源、企业等各个行业的用途

  • 瑞波支付系统

  • 星际支付网络

  • Tendermint

  • Monax

区块链的各种用途

分布式分类账技术被称为互联网之后计算机领域最大的革命;区块链正在并将在未来几年影响和改变每个个体。

区块链在货币相关应用中如比特币和山寨币中使用,但除此之外,区块链在其他行业中有各种完全不同的货币使用的用例。以下图表展示了一些正在使用区块链的行业:

政府

全球各地的各个政府正在利用区块链存储公共记录或其他各种政府部门的信息,例如医疗保健、身份管理、税收、投票和金融服务等。

通过拥有去中心化的数据库,政府可以轻松减少欺诈,并在数据输入分布式分类账系统之前引入某些检查。

医疗保健

个人的医疗记录需要进行正确信息的认证,并且有权访问各方面完整的健康记录非常重要。区块链可用于促进数据共享和记录保管。敏感的医疗数据可以方便地被医生和其他医疗社区相关人员访问。

医学研究

医学界的研究人员一直在努力开发更好的创新和技术,以改善临床护理。由于数据存在于区块链上,研究人员可以轻松访问真实数据,并根据适当的批准周期添加理论/结果。系统的互操作性可以在多个层面上提供帮助,并提供精确性和真实性。

供应链

供应链管理是业务流程中最分散的瓶颈之一。一直以来,供应链管理需要更高的效率。由于使用了多个软件系统,它们之间的不兼容性是存在的,每个系统都需要各种数据点以进行更顺利的运转。区块链可以为供应链过程中的每个参与者提供访问相关信息的可能,减少沟通或数据错误,正如下图所示:

图片

版权

区块链可以用于解决版权索赔,因为在基于区块链的系统中,只有在经过共识系统批准后才能引入任何条目,从而确保版权得到维护。

艺术品

艺术产业依赖于艺术品的鉴定;尽管区块链不能鉴定艺术品,也不能确认一幅画是否是原作还是赝品,但它可以用于鉴定所有权。

运输

许多项目正在利用区块链在海运物流业内带来透明度来提高国际贸易。各个全球船东正出于同样的原因使用区块链,以引入基于区块链的技术,并消除分布式分类账技术为该行业解决的任何瓶颈。

能源

区块链能够通过跟踪能源分配和实施高效分配来最大限度地提高能源分配部门的效率。能源生产和在新可持续资源方面的研究可以通过使用区块链来监测真实性和共识的维护,正如下面所示:

图片

计算和数据存储

计算资源在全球范围内被浪费。数据中心和数据湖一直需要高效的数据维护。使用区块链可以确保安全性和改善。

身份和社会保障

用户识别是政府中使用区块链的一个重要用例,但也可以被其他组织用于社会保障和其他需要的身份识别过程。

企业

企业可以在各种情况下使用区块链,例如部门间的协调、办公室内部和办公室间的沟通、数据迁移和其他各种任务。微软、IBM、谷歌、亚马逊等公司已经开始在各种企业部门进行区块链使用的 Beta 测试。

涟漪

Ripple 由 Ripple 公司于 2012 年创建的实时毛额结算和汇款网络。它允许各方之间的支付在几秒钟内完成。它使用自己的货币,称为RippleXRP),也支持非 XRP 支付。Ripple 提出了一个新的分散式全球银行和支付提供者网络,称为 RippleNet。该网络在其核心使用 Ripple 的交易结算技术。RippleNet 拟定独立于银行和支付提供者,为实时支付结算设置了一个标准化网络。

Ripple 网络由执行各自定义任务的各种节点组成。促进系统的第一个节点称为用户节点。用户节点使用 Ripple 进行支付和交易,例如进行付款和接收付款。Ripple 中的第二种节点是验证节点。这些节点是 Ripple 网络中共识机制的一部分。唯一节点列表UNL)中的节点是 Ripple 网络的一部分,并且受到共识机制的信任。任何人都可以成为验证节点或用户节点。以下图显示了 Ripple 网络中发生的交易流程。交易从收集阶段开始,然后通过共识阶段进行移动。最后阶段是账本关闭阶段,为下一组交易创建确定交易的区块以接收:

对于共识机制,Ripple 使用Ripple 协议共识算法RPCA)。RPCA 既不基于工作量证明PoW)也不基于股权证明PoS)系统;相反,其共识机制基于基于正确性的系统运作。共识过程通过向验证节点循环地寻求接受来运作投票系统,以便获得所需数量的投票。一旦收到所需数量的投票,就会验证更改并关闭账本。一旦接受账本中的更改并关闭账本,就会向网络发送警报。

Ripple 网络由各种元素组成,这些元素共同使 Ripple 中的交易成功:

  • 验证器:此元素是共识协议中的参与者。

  • 账本:其中包含账本编号、账户设置、交易、时间戳和账本验证标志等元素。

  • 开放账本:这是进行投票的账本。开放账本包含了提议的交易。

  • 唯一节点列表:这是验证服务器用来寻求投票并推进共识的节点列表。

  • 提议者:此元素提议要成为共识过程一部分的新交易。

交易

Ripple 网络节点创建交易,以更新分类账。交易需要进行数字签名和验证,以便成为共识过程的一部分。每笔交易都需要支付一小笔 XRP,就像以太坊中的 Gas。Ripple 网络有各种类型的交易:与付款相关的、与订单相关的和与账户相关的。

Ripple 网络还提供了各种开发者 API,用于处理交易和付款,以及在 RippleNet 上的集成。Interledger 与 RippleNet 合作,实现与不同网络的兼容性。下图描述了 Ripple 网络中一个区块包含的内容:

Stellar

星际网络用于任何货币的交换,包括自定义代币。星际具有更常被称为星际共识协议SCP)的共识系统,它基于联邦拜占庭协议FBA)。SCP 与 PoW 和 PoS 不同,其主要焦点是为了提供低延迟的更快交易。

它有四个主要特性:

  • 去中心化属性:它允许任何人参与,没有任何中心化的一方。

  • 低延迟:它解决了快速交易处理的急需需求。

  • 灵活的信任:它允许用户选择他们信任的特定目的方。

  • 渐进式安全性:它利用数字签名和哈希函数来提供网络所需的安全级别。

星际网络维护着一个分布式分类账,保存了每一笔交易,并在连接到网络的每个星际服务器上进行复制。共识是通过服务器验证交易,并使用同一交易的更新更新分类账来实现的。星际分类账也可以作为分布式交易所订单薄,因为用户可以存储他们的购买或出售货币的报价。

Tendermint

Tendermint 提供了一种安全且一致的状态机复制功能。它的主要任务是开发一个安全且高性能、易于复制的状态机。它是拜占庭容错的,即使其中三分之一的机器出现故障,Tendermint 也能继续工作。

Tendermint 的两个主要组成部分如下:

  • Tendermint Core:Tendermint Core 能够在网络中的每个节点上安全复制交易。它是一个共识引擎。

  • Tendermint 套接字协议TMSP):TMSP 是一种应用接口协议,允许与任何编程语言进行接口,并有助于处理交易。

Tendermint 共识算法是一种基于轮次的机制,其中验证节点在每个轮次中启动新的块。使用锁定机制来确保当两个不同的块被选定用于在区块链的同一高度关闭时不会出现问题。每个验证节点同步包含交易的块的完整本地复制分类帐。每个块包含一个标头,其中包含前一个块哈希、建议块的时间戳、当前块高度以及该块中包含的所有交易的 Merkle 根哈希。

以下图表显示了共识引擎和客户端应用程序通过 Tendermint Socket 协议之间的流程:

Tendermint 协议的参与者通常被称为验证者。每个验证者轮流提议交易块。他们也像之前讨论过的 Ripple 投票系统一样对其进行投票。如果一个块无法提交,协议将进入下一轮。然后新的验证者为同一高度提议一个块。投票需要两个阶段才能成功提交一个块。这两个阶段通常称为预投票和预提交阶段。只有三分之二以上的验证者为同一块在同一轮进行了预提交,块才会被提交。

由于各种原因,验证者无法提交一个块。这可能包括当前的提议者离线,或者网络质量或速度的问题。Tendermint 还允许验证者确认是否应跳过一个验证者。每个验证者等待一小段时间以从相关的提议者那里收到一个提议块。只有在这之后才能进行投票,他们才能进入下一轮。尽管协议的其余部分是异步的,并且只有听到超过三分之二的验证者集的消息后,验证者才能进展,但这种对时间段的依赖使得 Tendermint 成为一种同步协议。Tendermint 的一个简化要素是,它使用相同的机制来提交一个块,以及跳过到下一轮。

假设少于三分之一的验证节点是拜占庭节点,Tendermint 可以保证不会破坏安全性。这意味着验证节点永远不会在同一高度提交冲突的块。有一些锁定规则来调节可以遵循的路径。一旦一个验证者预提交一个块,它就会锁定在那个块上。在这种情况下,它必须为它将要锁定的块进行预投票,并且它只能解锁并为一个新块进行预提交。

Monax

Monax 是一个成立于 2014 年的区块链和智能合约技术。它最初名为 Eris Industries,但在 2016 年 10 月更名为 Monax。

Monax 有很多可以提供的东西。其中包括各种框架、SDK 和工具,可加速区块链的开发和部署以用于企业。Monax 应用平台背后的理念是实现使用区块链作为后端的生态系统应用的开发。它还允许与多个区块链集成,并使各种第三方系统能够与其他区块链系统交互,并提供高度兼容性。该平台使用以太坊或比特币等区块链上编写的智能合约。它可以与多个区块链进行交互。所有命令对不同的区块链都是标准化的,并且可以在整个平台上使用相同的命令。

Monax 目前积极用于以下应用:

  • 车队租赁

  • 公司治理

  • 知识产权

  • 法律流程

摘要

在本章中,我们介绍了另类区块链。我们讨论了除加密货币以外的区块链的各种用途。其中一些包括政府、医疗保健、医学研究、供应链、版权、美术、航运、能源等。另外,我们讨论了瑞波币(Ripple),这是一种用于快速支付的新区块链,与比特币区块链相比提供了各种修改和改进。接着,我们讨论了恒星支付协议及其主要特性,这有助于加速恒星的支付。Tendermint 是另一种区块链软件,我们讨论并引起了我们的注意。

在下一章中,我们将详细讨论 Hyperledger 及一些基于 Hyperledger 协议的重要项目。我们还将讨论 Hyperledger 协议的详细信息和其他参数。

第十一章:Hyperledger 和企业区块链

与本书讨论的大多数其他区块链系统不同,Hyperledger 从未进行首次 代币发行(ICO),也没有公开交易的代币。这是因为 Hyperledger 本身并不是一个区块链,而是一组用于创建新区块链的技术。此外,这些区块链技术专门设计和构建用于企业用例,而不是公共市场。

在本章中,我们将涵盖以下内容:

  • Hyperledger 的历史

  • 六个当前 Hyperledger 项目的关键细节

  • 支持生态系统使用的 Hyperledger 工具概述

  • 如何选择项目中的 Hyperledger 技术的建议

Hyperledger 的名称不适用于单一技术,而是适用于所有捐赠给 Linux 基金会的区块链技术的集合。

Hyperledger 项目成员包括 Consensys、R3 和 Onchain 等主要区块链公司,以及百度、思科、富士通、日立、IBM、英特尔、NEC、红帽和 VMware 等许多企业技术公司。除了这些公司,许多金融服务公司也加入了,因为区块链在金融科技领域的明显应用。金融服务成员包括澳新银行、美林银行、摩根大通、SWIFT 和富国银行。为了成为下一波商业软件咨询机会的一部分,主要的整合商也加入了——例如安永、CA 科技、普华永道和 Wipro,以及其他许多公司。

最近,亚马逊、IBM 和微软都发布了基于 Hyperledger 技术的区块链即服务产品。

Hyperledger 的历史

Hyperledger 项目成立于 2015 年,当时 Linux 基金会宣布了创建 Hyperledger 项目。它是与 IBM、英特尔、富士通和摩根大通等许多企业玩家合作成立的。其目标是改进并在技术、金融和供应链等主要适合区块链颠覆行业的领域,促进区块链技术的行业合作,使其适用于复杂的企业用例。

该项目在 2016 年获得实质性进展,当时进行了首次技术捐赠。IBM 捐赠了后来成为著名的Hyperledger Fabric的内容,而英特尔捐赠了成为 Hyperledger Sawtooth 的代码库。

与区块链领域的大多数项目不同,Hyperledger 从未发行自己的加密货币。事实上,Hyperledger 的执行董事公开表示永远不会发行加密货币。

Hyperledger 项目

如前所述,超级账本并不是单一的区块链技术,而是由成员公司捐赠的技术集合。虽然有更好的集成长期目标,但目前大多数超级账本项目都是独立运行的。每个项目的核心代码库是由一个或多个超级账本成员组织捐赠的,基于他们在向 Linux 基金会开放源代码和移交所有权之前正在试图解决的问题。

超级账本 Burrow

超级账本 Burrow 是以太坊虚拟机(EVM)和区块链技术的重新实现,但有一些关键变化。首先,Burrow 不使用公共以太坊链使用的工作量证明共识算法,而是设计围绕 Tendermint 共识算法(参见第七章,实现共识)。这意味着在基于 Burrow 的项目中没有矿工,也没有挖矿活动。

其次,超级账本 Burrow 是许可的——允许参与超级账本 Burrow 网络的计算机是已知的并获得授权的,而签署块的计算机(称为验证者,如 Tendermint 中的)也都是已知的。这与以太坊非常不同,任何人都可以匿名下载以太坊软件并加入网络。

为 EVM 编写的智能合约仍然大部分能够工作。由于共识的改变,Gas 的使用方式也有所改变。在公共以太坊区块链中,每笔交易都要根据交易的复杂性付出 Gas 的代价,并且每个区块都有一个 Gas 限制。根据网络负载的不同,参与者必须支付 Ether 的可变成本来获取所需的 Gas。在 Burrow 中,这些复杂性大多被摒弃了。每笔交易都自动获得一定数量的 Gas。由于 Gas 仍然是有限的,Burrow 能够保证所有交易最终完成——要么成功,要么因为 Gas 耗尽而失败。

有关 EVM、solidity 语言以及与超级账本 Burrow 分享的以太坊的其他方面,请参见第十二章,以太坊 101,直至第十五章,以太坊开发

超级账本锯齿状

超级账本锯齿状,与超级账本家族的其他成员一样,是为许可(私有)网络而建立的,而不是公共网络,例如以太坊、比特币等。作为面向企业的区块链系统,它旨在允许不同公司使用区块链和智能合约进行协调。最初由英特尔开发,Sawtooth 使用一种称为时间逝去的证明PoET的独特共识算法。

PoET 使用基于抽奖的系统进行领导者选举。使用特殊的英特尔技术,称为 可信执行环境TEE),以及一些英特尔芯片组上可用的 软件保护扩展SGX),每个节点通过生成随机等待时间来选择领导者,最短等待时间优先。由于生成等待时间的代码位于 TEE 中,因此可以验证每个节点是否运行适当的代码,并且没有通过跳过由随机时间生成器生成的时间来成为领导者。因此,领导者(和区块发行者)的选举非常快速,从而使区块链能够快速运行。

锯齿状架构

Sawtooth 具有可插拔的架构,由 Sawtooth 核心、应用级别和事务族以及共识机制(通常是 PoET,但理论上可以插拔其他机制)组成。我们将在以下章节中详细研究它们。

事务族

因为 Sawtooth 旨在成为可插拔的企业级架构,所以应用层是高度可配置的。每个基于 Sawtooth 的区块链都允许根据所谓的事务族进行交易。事务族确定了在 Sawtooth 区块链上允许进行的操作类型。例如,可以使用 Seth 事务族允许智能合约,就像在以太坊中一样。在 Seth 下,所有可能的基于以太坊的合约和基于以太坊的合约交易都是可允许的,以及由此自由带来的所有可能的错误和问题。

基于 Sawtooth 的区块链可以同时运行多个事务族。事实上,这是常见的,因为 Sawtooth 随附的其中一个事务族是设置族,它直接将系统范围的配置设置存储到区块链上。在大多数情况下,这个事务族和其他几个由业务用例组成的事务族将同时运行。此外,由于可以同时运行多个事务族,这意味着业务逻辑可以被隔离并在多个区块链实现中作为独立的事务族被重用。

由于许多企业只有少数有效的业务规则和业务结果,因此可以通过创建自定义事务系列来定制区块链上的可用操作。例如,一个运输公司可以使用 Sawtooth 来跟踪包裹的位置,而唯一有效的事务可能是新包裹、包裹已接收、包裹已释放、包裹在运输中、更新包裹位置和包裹已交付。通过限制可用事务,可以减少错误和失误的数量。以运输公司为例,网络参与者可能是卡车公司、仓库等。为了使包裹在卡车和仓库之间移动,这两个网络参与者将分别在区块链上的一批中发行包裹已释放和包裹已接收的事务。这引出了 Sawtooth 中的下一个概念:事务批处理

事务和批处理

在 Sawtooth 中,事务始终是批处理的一部分。批处理是一组一起到达并且要么全部成功要么全部失败的事务。如果某个事务需要单独处理,则它将位于仅包含该事务的单个批处理中。使用运输公司的示例,事务包裹已释放和包裹已接收可以被编程为只有在它们的对应事务也在同一批处理中时才成功,从而强制执行成功的交接或抛出错误。下图显示了事务批处理的数据结构:

Sawtooth 中的事务和批处理在高层次上进行抽象,以便可以由自定义事务系列和任意编程语言创建。由于这一点,可以使用 Java、Python、Go、C++ 和 JavaScript 编程智能合约和事务系列。对于任何语言,事务还有另一个限制:序列化,或者从计算机上的内存结构转换为可以通过网络发送的固定二进制。无论使用哪种语言,序列化方法的输出都必须相同。在 Sawtooth 中,所有事务和批处理都以一种称为协议缓冲区的格式进行编码,这是 Google 在内部创建的一种格式,于 2008 年发布。协议缓冲区是在计算机之间具有固定且高性能的数据交换方法,不受编程语言和计算机体系结构的限制。

关键要点

在 Sawtooth 中,事务系列和事务需要开发人员创建一些东西。考虑以下内容:

  • 首先,您需要为将存储的每个事务的数据模型定义协议缓冲区。

  • 其次,您需要一个事务处理程序来处理属于事务系列的传入事务。

  • 最后,需要使用核心 SDK 将处理程序注册到事务处理器中。

Sawtooth 包括基于 Python 的示例源,用于在 GitHub 上的设置和基于身份的交易族。接下来,我们将介绍另一种面向企业的区块链技术 Hyperledger Fabric。

Hyperledger Fabric

Hyperledger Fabric,像 Sawtooth 一样,旨在成为高度模块化和可定制的面向企业的区块链解决方案。Hyperledger Fabric 既是私有的又是许可的。这意味着,默认情况下,Hyperledger 区块链不会对公众开放,也不会在交易所上有可交易的代币。区块链的用户必须具有经过验证的身份,并通过使用成员服务提供商MSP)加入区块链。这些 MSP 在系统上配置,并且可以有多个,但所有成员必须通过一个或多个 MSP 成功获得访问权限。Fabric 还有许多特殊工具,使其功能特别齐全,我们稍后会进行介绍。

架构选择和特性

Hyperledger Fabric 是围绕着几个关键特性和用例设计的,被视为企业用户至关重要。

在核心是账本本身。账本是一组区块,每个区块包含一组交易。交易是更新区块链状态的任何事物。交易是通过安装在区块链上的智能合约代码(称为 链码)执行的。让我们看看区块和交易是如何形成的。

每个区块按顺序排序,每个区块内部都包含一组交易。这些交易也按照特定顺序存储。与其他区块链不同,交易的创建和最终给予的顺序不一定在同一时间或在同一台计算机上执行。这是因为交易的排序和执行是分开的。在 Hyperledger Fabric 中,用于操作区块链的计算机可以运行三种不同模式的节点;它们如下:

  1. Client:客户端代表区块链用户提交操作和事件到网络,作为应用程序的一部分。

  2. Peer:对等节点处理传入的交易以进行验证,并处理由于交易和链代码执行而引起的状态更改。一旦他们执行了交易,他们就会将结果广播给网络,以便交易可以由一个排序者处理(参见下一个角色)。

  3. Orderer:虽然对等节点执行交易,但排序节点查看所有已执行的交易,并决定它们在区块链中被视为发生的最终顺序。排序服务节点决定事件的最终排序,从而决定将写入下一个区块的事件的最终集合。

重要的是要注意,单个计算机可以在 Fabric 区块链上扮演这三种节点类型中的任意一种,但这并非必须。在 Hyperledger 网络上,同一台计算机可以执行交易并排序它们的顺序,但 Hyperledger 可以通过提供这些作为不同服务来实现更好的扩展性。为了说明这一点,请看下面的图表(摘自 Hyperledger 文档):

如您所见,进入的交易首先发送到对等体,对等体使用链码/智能合约执行交易,然后将成功的交易广播到排序服务。一旦被接受,排序服务决定交易的最终顺序,然后将结果交易集重新传输给对等节点,对等节点将最终区块写入链上。

组织重点

作为面向企业的系统,Fabric 在对等体和排序者(区块链网络上的节点)以及拥有它们的组织之间进行了区分。Fabric 旨在在组织之间创建网络,运行区块链的节点代表该组织。通过这种方式,每个节点及其权限都与其代表的组织相关联。以下是来自 Hyperledger 的另一个图表:

如您所见,每个网络节点代表贡献组织运行区块链网络。这与以太坊和比特币等网络不同,在这些网络中,网络由一组独立贡献资源的计算机创建,或者至少在网络看来是独立贡献资源的计算机创建,无论谁拥有它们。在 Hyperledger Fabric 中,是组织创建了共享账本,并通过提供对等体和排序节点的资源来为网络做出贡献。这种区别微妙但至关重要。在大多数公共网络中,想法是让计算机协调,但在 Fabric 中,想法是让公司协调。拥有组织为每个对等体提供了签名的数字证书,证明其是某个组织的成员。然后,该证书允许每个节点通过 MSP 连接到网络,从而获得对网络资源的访问权限。组织与私有计算机的区别将我们带到了 Hyperledger Fabric 的另一个面向企业的特性,这是满足许多公司要求所必需的一个特性:私有通道

私有通道

Hyperledger Fabric 具有一个关键且独特的功能,称为私有渠道。私有渠道允许基于 Fabric 的区块链上的成员子集创建一个新的区块链,该区块链只对他们可见且可互操作。这意味着,虽然 Fabric 已经是私有且有权限的,但私有区块链的成员可以创建一个更小、更独特的链来交换信息,这些信息在整个成员网络上无法交换。因此,Fabric 能够支持关键的用例(例如法律通信),即使在相对独特的网络上也无法广播。

例如,如果 Hyperledger Fabric 被用于建立一个物流网络,主要的区块链可以用于跟踪包裹,但定价竞标可以在私有渠道上进行。网络的参与者将包括许多运输提供商、材料提供商和一组买家。买家可以向区块链发出通知,表示他们接受竞标进行某些物资的转移,然后他们可以在自己和所有运输商和供应商之间创建私有渠道。供应商和运输公司可以向买家提供时间和成本价格,而不将这些信息公开给竞争对手。虽然是私有的,但所有这些交易都会被编码到区块链上进行记录、法律遵从等。此外,如果公司政策是类似于接受第二低价的竞标,整个过程可以通过智能合约自动化。

资产

在 Hyperledger Fabric 中,资产被定义为可以赋予价值的任何东西。虽然这可以用来交换不同的法定货币,但资产也可以被设计为表示一些抽象的东西,比如知识产权,或者更具体的东西,比如一批新鲜鱼的运输。

在 Fabric 中,资产在内部被处理为简单的键值对,其状态存储在分类账上,并可通过链码进行修改。Hyperledger 中的资产可以完成以太坊中由 ERC-20 和 ERC-721 代币执行的所有职责,甚至更多。任何可以以代币格式描述的东西都可以作为资产存储在 Hyperledger Fabric 中。

智能合约

在 Hyperledger Fabric 中,智能合约被称为链码。与以太坊不同,链码不直接嵌入在分类账中。相反,链码安装在每个对等节点上,并与分类账交互,读取和更新链码控制的资产的状态信息。因为链码被所有对等方签名和批准,并且因为使用链码的每个对等方必须验证分类账上的任何状态变化,所以这个系统仍然允许分布式和可信的共识,使用智能合约。为了提供一致性,链码本身在隔离的 Docker 容器中运行。

由于分布式分类帐和链代码的模块化性质,可以使用多种编程语言来开发智能合约;但是,目前支持的选项有限。只有 Go 和 Node.js 有全功能的 SDK 包,但最终计划添加 Java 支持。

Fabric 的优势

Fabric 是最受欢迎的 Hyperledger 项目之一,原因很多。它高度模块化,设计用于跨公司协调,并且私有通道功能使得在公共链上、甚至大多数私有链上都不可能实现的安全功能成为可能。此外,Hyperledger Fabric 还有Composer—一个用于构建区块链应用程序的可视化工具。我们将在后面的 Hyperledger 工具部分讨论 Composer。

接下来,我们将介绍Iroha,这是一个旨在将区块链带入移动设备的 Hyperledger 项目。

Hyperledger Iroha

Hyperledger Iroha是一个由 Soramitsu 贡献的用 C++编写的项目。该项目的目标是提供一个基于可移植 C++的区块链实现,可用于移动设备。iOS 和 Android 操作系统以及诸如树莓派等小型计算机都能够高效地运行紧密编写的 C++代码。为了使事情更加简单,Iroha 为开发人员提供了 iOS、Android 和 JavaScript 库。

与以太坊相比,Hyperledger Iroha 的一个主要区别在于允许用户通过使用系统中预先构建的命令执行常见功能,例如创建和转移数字资产。这消除了编写繁琐且难以测试的智能合约以完成最常见功能的需求,使开发人员能够更快地完成简单任务并减少风险。例如,在 Iroha 上创建新的令牌类型只需一个命令—crt_ast。为了使事情更加简单,Iroha 还有一个命令行界面,将指导新用户在完全不编写代码的情况下创建资产。

如果 Sawtooth 和 Fabric 的目标是完整性,那么 Iroha 更倾向于易用性和设备兼容性。

Hyperledger Indy

区块链技术的更常见的用例之一是身份验证和授权。您可能已经在网络上遇到了问题,您需要记住许多用户名和密码来向其他提供商(例如 Google 或 Facebook)确认您的身份。这里的问题是您必须信任 Google、Facebook 或其他提供商来管理您的身份并保护它。这会造成单点故障,并允许集中式机构控制哪些身份是有效的以及他们拥有什么权限。这个生态系统是显而易见的分散和去中心化的目标。

Hyperledger Indy 是围绕分散、自我声明的身份构建的区块链项目。Indy 的目标是提供用于创建可在区块链上管理并与其他应用程序和需要身份验证的用例互操作的数字身份的工具和库。

虽然 Fabric、Sawtooth 和 Iroha 都内置了一定程度的身份机制,但 Indy 是专门围绕身份管理而设计的,并且可供不运行在区块链上的应用程序使用。因此,Indy 可用于为 Web 应用程序、公司资源等提供身份服务。现有公司包括 Sovrin(捐赠了原始 Indy 代码库)和 Every。

Hyperledger 中的工具

任何应用程序常被忽视的一个方面是需要有助于管理该应用程序生命周期的有用工具。诸如用于简化部署、调试和设计的软件工具可以极大地提高系统的易用性,对开发人员和用户都是如此。大多数公共区块链严重受限于缺乏高质量的工具和支持。然而,Hyperledger 生态系统继续投资于构建优秀的支持工具。

Hyperledger Caliper

任何系统的常见需求之一是基准测试。Hyperledger Caliper 是一个面向区块链的基准测试工具,旨在帮助区块链架构师确保系统性能足够快,以满足托管组织的需求。使用一组预定义的常见用例,Hyperledger Caliper 将报告一系列关键性能指标,例如资源使用情况、每秒交易数TPS)、交易延迟等。

使用 Caliper,一个致力于区块链应用程序的团队可以在构建智能合约和交易逻辑时持续进行测量,并使用这些测量结果监控性能变化。Caliper 可与 Sawtooth、Indy 和 Fabric 区块链系统兼容。

Hyperledger Composer

Hyperledger Composer 是一个用于在区块链上构建智能合约和业务应用程序的设计工具。它旨在快速原型化用于 Hyperledger Fabric 的链码和资产数据模型。作为一个 Fabric 特定的工具(到目前为止),它主要设计用于帮助理解 Hyperledger Fabric 特定的概念,例如资产、身份管理、交易以及用于驱动所有这些项之间业务规则的链码。

它不是设计成一个“建立完整生态系统并投入生产”的工具,而是设计成用于快速可视化原型制作,以便快速启动可测试的应用程序,并在代码库中直接迭代细节。IBM 在 composer-playground.mybluemix.net/editor 上提供在线演示。

Composer 的主要用户将是区块链开发人员(特别是新开发人员)和一些技术业务用户。它作为开发区块链应用程序的敏捷流程的一部分,可以让开发人员、网络管理员和技术业务用户可视化网络和在其上运行的代码。

超级账本 Cello

如果 Composer 用于辅助构建基于 Fabric 的区块链的某些方面,那么 Cello 就是用于将该区块链部署到各种服务器和云服务的工具。Cello 可用于管理区块链基础设施或以区块链即服务的方式启动新的区块链。常见的生命周期和部署任务包括启动、停止和删除区块链,将新节点部署到现有区块链中,并将区块链操作抽象化,以便在本地机器、云中、虚拟机中等运行。Cello 还允许监视和分析。

Cello 主要是用于所谓的 DevOps,或者说是开发团队和生产运营之间的连接工具。它主要针对 Hyperledger Fabric 项目,但是未来的发展也将支持 Sawtooth 和 Iroha。

超级账本资源管理器

超级账本资源管理器是一个区块链模块,是由 Linux 基金会托管的超级账本项目之一。设计为创建用户友好的 Web 应用程序,超级账本资源管理器可以查看、调用、部署或查询区块、交易和相关数据,网络信息(名称、状态、节点列表)、链码和交易系列,以及存储在分类帐中的任何其他相关信息。超级账本资源管理器最初由 IBM、Intel 和 DTCC 贡献。

超级账本 Quilt

有时候,多个区块链能够进行通信是有意义的。这就是 超级账本 Quilt 发挥作用的地方。Quilt 是一个通过实现 Interledger 协议ILP)来促进跨区块链通信的工具。ILP 是一个通用规范,可供所有区块链使用,以允许跨分类帐通信,最初由 Ripple Labs 创建。借助 ILP,两个分类帐(它们不必是区块链)可以协调,从而将一个分类帐中的值交换到另一个分类帐中。

ILP 是一个协议,可以使用任何编程语言或技术来实现,只要符合标准即可。由于这个原因,它可以用于连接多个完全独立的分类帐,甚至是具有完全不同架构的分类帐。这些分类帐不需要是区块链,可以是任何会计系统。在 ILP 中,跨分类帐通信主要通过称为 连接器 的角色来进行。参见来自 interledger.org 的下图:

ILP 通过一组连接器连接账本。连接器是提供向其目的地转发跨账本通信服务的系统,类似于互联网上的数据包是如何点对点转发的。ILP 的通信数据包从发送者发送到一系列连接器,最终到达接收者。

连接器是此序列中值得信任的参与者,发送者和所有中间连接器必须明确地互相信任。与其他面向区块链的技术不同,ILP 不涉及无需信任的交换。但是,发送者和每个连接器只需信任它们链中最近的链接才能正常工作。

Quilt 是 ILP 的实现,已经代表 Ripple Labs、Everis 和 NTT DATA 捐赠给了 Hyperledger 项目。这些组织还赞助了持续的专职人员,帮助改进 Quilt 代码库,主要使用 Java 语言。

工具之间的关系

Fabric、Cello、Composer、Explorer 和 Caliper 之间的区别可以描述如下:

  • Fabric 是应用程序本身,也是业务逻辑最终所在地

  • Composer 是一个帮助构建此逻辑和最终链码的工具

Fabric 和 Composer 主要参与了区块链项目的开发阶段,紧随其后的是 Caliper 用于性能测试:

  • Cello 和 Explorer 更多地涉及项目的运营方面。Cello 由 DevOps 团队用于在服务器和虚拟机上部署和扩展区块链应用程序

  • Explorer 是一个监控工具,用于检查不同账本之间的运行情况

最后,Hyperledger Quilt 可以用于连接不同的账本和区块链。例如,Quilt 可以用于从基于 Fabric 的系统通信到公共以太坊网络,或者到 ACH 银行系统,或者以上所有情况。

因此,Hyperledger 项目具有用于端到端创建、运行和区块链应用生态系统互操作性的工具。

你应该使用哪个 Hyperledger 项目?

在 Hyperledger 内部存在许多专注于业务用例的子项目,如果存在一些混淆使用的情况也就不足为奇了。这是可以理解的,但好消息是,对于大多数情况,选择适当的项目是清晰的。

到目前为止,最受欢迎和文档最全面的框架是 Hyperledger Fabric。Fabric 还得到了亚马逊和微软的区块链即服务的支持。此外,Composer、Cello 和 Caliper 工具都与最新版本的 Fabric 兼容。对于绝大多数项目来说,Hyperledger Fabric 将是最感兴趣的项目。

第二个最明显的选择是 Sawtooth。对于供应链解决方案,Sawtooth 已经有了一个参考实现。除此之外,Sawtooth 更好地支持用多种语言编写智能合约,而 Hyperledger 仅支持 Go 和 JavaScript。此外,Sawtooth 核心是用 Python 编写的。Python 是数据科学中非常流行的语言,而数据科学经常与区块链技术搭配使用。

最终的选择是 Burrow,它将与从以太坊迁移的技术或需要与公共以太坊网络进行接口的项目很匹配,以及 Iroha,它将与需要在移动设备或其他小型机器上运行区块链的项目更匹配。

使用 Hyperledger

就像许多区块链技术一样,Hyperledger 生态系统相对较新,许多项目甚至还没有达到完整的 1.0 版本。虽然有大量的开发活动和多个已经在生产中使用的工作系统,但整个系统还是分裂的。例如,Sawtooth 是用 Python 编写的,Fabric 是用 Go,Quilt 是用 Java,等等。即使在 Hyperledger 家族内部,要想使用一组同质的技术进行端到端实现也是困难的。

此外,Hyperledger 对私有网络的关注是那些希望拥有公共组件的项目的一个问题。区块链技术的吸引力之一是透明度。一个通过公共使用其技术寻求最大透明度的项目可能需要寻找其他地方或找到一种在 Hyperledger 和公共网络之间建立桥梁的方式——可能是使用 Quilt 和 ILP。

同样,通过 ICO 筹集资金的项目可能应该寻找其他方案。很少有项目尝试将 Hyperledger 作为 ICO 的一部分,据我们所知,其中没有一个项目实际上成功筹款。Hyperledger 仍然主要面向私有网络,而在这方面取得了巨大成功。

总结

现在你对构成 Hyperledger 的不同子项目有了一个很好的了解,并且意识到了可以用来构建基于 Hyperledger 项目的工具。Hyperledger 是一组用于构建企业私有区块链网络的技术,与以太坊和比特币等公开可交易的网络相对。Hyperledger 家族由六个项目和一套支持工具组成,它们都有略微不同的关注点和优势,以适应不同的项目。

随着时间的推移,预计不同的项目将变得更加一致和互操作。例如,Hyperledger Burrow 和 Hyperledger Sawtooth 已经与 Seth 交易族跨界交流,这使 Sawtooth 能够运行以太坊智能合约。预计像 Cello 和 Composer 这样的工具将在适当的时候被扩展以支持更多的 Hyperledger 项目,从而使生态系统变得越来越健壮。

接下来,我们将深入讨论以太坊。以太坊是一个公共区块链网络,也是第一个和最受欢迎的支持完全可编程智能合约的公共网络。

第十二章:以太坊 101

在前几章中,我们详细研究了区块链,比特币,替代加密货币和加密钱包。我们讨论了区块链在不仅是基于货币的应用程序中的用途和好处,而且在其他类似领域中的用途。我们还讨论了比特币如何改变了用于货币利益的区块链使用的格局以及它如何塑造了全球经济。

在本章中,我们将深入研究以太坊区块链。它当前是最大的社区支持的区块链项目,仅次于比特币,支持者和各种项目和代币在其上运行。在本章中,我们将讨论以下主题:

  • 以太坊账户

  • 以太坊网络

  • 以太坊客户端,比如 Geth

  • 以太坊区块链项目的执行环境

  • 以太坊区块

  • 以太坊虚拟机

  • 在以太坊交易中使用燃气

  • 以太和以太获取方法

介绍以太坊

以太坊是一个基于区块链的系统,具有特殊的脚本功能,允许其他开发者在其上构建分散和分布式应用程序。以太坊在开发者中主要以易于开发分散应用程序而闻名。以太坊和区块链之间存在差异。最重要的区别是以太坊区块链可以运行大多数分散应用程序。

以太坊概念于 2013 年底由加密货币研究员和开发者 Vitalik Buterin 构想。它是通过 2014 年 7 月至 8 月间的众筹出售获得资金。以太坊内建了 Turing 完全编程语言,即用于解决任何计算复杂性的编程语言。这个编程语言被称为 Solidity,用于创建合约,有助于在以太坊上创建分散应用程序。

以太坊于 2015 年 7 月 30 日上线,预挖了 11.9 百万枚代币进行众筹,用于资助以太坊的发展。以太坊的主要内部加密货币被称为以太。它被称为首字母缩写ETH

以太坊的组件

让我们讨论一下以太坊的一些通用组件,其主要货币,网络以及其他细节。这将有助于更好地理解以太坊,也可以帮助我们看到与比特币的区别,以及为什么它拥有一个庞大的社区,目前使它成为最重要的加密货币和区块链项目,仅次于比特币区块链。

以太坊账户

以太坊账户在以太坊区块链中起着重要作用。这些账户包含钱包地址以及其他细节。有两种类型的账户:外部拥有账户EOA),由私钥控制,和合约账户,由它们的合同代码控制。

EOAs 类似于比特币中由私钥控制的账户。合约账户与代码相关联,并带有私钥。外部拥有账户具有以太余额,并且可以发送交易,以消息的形式,从一个账户发送到另一个账户。另一方面,合约账户可以有以太余额和合约代码。当合约账户接收到消息时,代码会被触发以执行对内部存储的读取或写入功能,或者向另一个合约账户发送消息。

以太坊网络

只有两个以太坊节点具有相同的创世区块和相同的网络 ID 才能连接。根据使用情况,以太坊网络分为三种类型:

  • MainNet:这是以太坊当前的实时网络;目前最新版本的 MainNet 称为homestead

  • TestNet:这用于测试目的,供开发人员在将合约部署到区块链之前测试智能合约和 DApps。最新版本的 TestNet 称为Ropsten

  • PrivateNet:这用于通过生成新的创世区块来创建权限区块链。

所有前述类型相同,除了它们每个都有不同的创世区块和网络 ID;它们有助于区分各种合约账户和外部拥有账户,如果任何合约正在运行不同的创世区块,那么它们将使用不同的网络 ID 来区分它与其他合约账户。

以太坊正式使用一些网络 ID。其余的网络 ID 可以由合约账户使用。以下是一些已知的 ID:

  • 0:这是以太坊公共预发布测试网,以项目名称奥林匹克(Olympic)而闻名。

  • 1:此 ID 是以太坊公共主网络;它已经有许多版本:Frontier、Homestead 和 Metropolis。我们将在未来的部分中更多地讨论公共 MainNet。

  • 2:这是最初的测试网所使用的 ID;在 2016 年末被弃用。

  • 3:这是书写本书时最新的测试网。它于 2016 年末启动,因为旧的测试网出现了多个问题。

  • 4:这是一个公共测试网,正在尝试 PoA 共识。它被称为Rinkeby

以太坊公共 MainNet

公共 MainNet 的网络 ID 为 1,但由于以太坊拥有一个非常活跃的社区支持,因此以太坊区块链正在进行各种更新和升级;主要有四个阶段的以太坊网络;让我们详细讨论每个阶段:

  • Frontier:这是第一个正式的公共主网络;于 2015 年中期启动。

  • Homestead:这是 2016 年 3 月的一次重大升级。

  • Metropolis:这个升级阶段将给以太坊区块链带来许多升级。这个升级将通过硬分叉实施,分为两个阶段,拜占庭君士坦丁堡

  • Serenity:以太坊的这一版本将共识从 PoW 转移到权益证明PoS)。这本质上是为了降低以太坊网络的功耗。

以太坊客户端

客户端是以太坊区块链的实现;它们具有各种功能。除了拥有常规钱包外,用户还可以观察智能合约、部署智能合约、清理多个以太币账户、存储以太币余额,并进行挖矿以参与 PoW 共识协议。

有各种各样的客户端使用不同的编程语言,一些由以太坊基金会官方开发,一些由其他开发者支持:

  • Geth:基于 Go 编程语言,有时也被称为go-ethereum

  • Parity:基于 Rust 编程语言,由 Ethcore 开发

  • cpp-ethereum:基于 C++构建,由以太坊基金会官方开发

  • Pyethapp:基于 Python 编程语言,由以太坊官方开发

  • ethereumjs-lib:基于 JavaScript 编程语言

  • 以太坊(Java):由 Ether camp 开发的基于 Java 的客户端

  • ruby-ethereum:由 Jan Xie 开发的基于 Ruby 的客户端

  • ethereumH:由 BlockApps 开发和维护的基于 Haskell 的客户端

上述列表包括目前在生产中使用的一些最显著的以太坊特定客户端。除了这些之外,还有许多其他客户端,它们不是由社区大力支持,或者处于开发阶段。现在让我们讨论最显著的以太坊客户端——Geth,或go-ethereum

Geth

这是目前在 Golang 上构建的最广泛使用的以太坊客户端之一;它是运行完整以太坊节点的命令行界面。它是 Frontier 版本的一部分,目前也支持 Homestead。Geth 可以允许其用户执行以下各种操作:

  • 挖矿以太币

  • 创建和管理账户

  • 在两个以太坊账户之间转移以太币

  • 创建、测试和部署智能合约

  • 探索区块历史

安装 Geth

可以使用以下命令在 Ubuntu 系统上安装 Geth:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

安装完成后,运行geth account new来在你的节点上创建一个账户。可以使用geth --help命令来查看各种选项和命令。

在基于 Windows 的系统上,通过从geth.ethereum.org/downloads/下载最新版本,然后下载所需的zip文件,解压缩zip文件,并打开geth.exe程序,可以更容易地安装 Geth。

管理账户

Geth 提供账户管理,使用account命令。有关 Geth 上与账户管理相关的最常用命令如下:

COMMANDS:
 list Print summary of existing accounts
 new Create a new account
 update Update an existing account
 import Import a private key into a new account

以下截图是执行上述代码后生成的输出:

当我们运行创建新账户的命令时,Geth 会在我们的区块链上提供一个地址:

$ geth account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat Passphrase:
Address: {168bc315a2ee09042d83d7c5811b533620531f67}

当我们运行list命令时,它会提供与自定义密钥存储目录关联的帐户列表:

$ geth account list --keystore /tmp/mykeystore/
Account #0: {5afdd78bdacb56ab1dad28741ea2a0e47fe41331} keystore:///tmp/mykeystore/UTC--2017-04-28T08-46-27.437847599Z--5afdd78bdacb56ab1dad28741ea2a0e47fe41331
Account #1: {9acb9ff906641a434803efb474c96a837756287f} keystore:///tmp/mykeystore/UTC--2017-04-28T08-46-52.180688336Z--9acb9ff906641a434803efb474c96a837756287f

我们将在后续章节讨论挖矿和合约开发。

以太坊气体

以太坊区块链上的每个交易都需要支付计算成本;这是通过向交易发起者支付气体来实现的。交易执行的每个操作都与一定数量的气体相关联。

每个交易所需的气体量直接取决于要执行的操作数,基本上是为了覆盖整个计算。

简单来说,以太坊区块链上的每个交易都需要用气体付费。气体的最低价格是 1 Wei(以太币的最小单位),但这根据各种因素而增加或减少。以下是显示以太坊气体价格波动的图表:

以太坊虚拟机

以太坊虚拟机EVM)是一个简单的基于堆栈的执行机器,充当智能合约的运行环境。EVM 的字长为 256 位,这也是每个堆栈项的大小限制。堆栈的最大大小为 1,024 个元素,并且采用后进先出LIFO)队列系统。EVM 是一个图灵完备的机器,但受到运行任何指令所需的气体量的限制。气体充当一种推进剂,具有计算信用,这确保了任何错误代码或无限循环都无法运行,因为一旦气体用尽,机器将停止执行指令。以下图表显示了一个 EVM 堆栈:

EVM 在发生异常、气体不足或指令无效时支持异常处理。在这种情况下,EVM 会停止并向执行节点返回错误。气体耗尽时的异常通常称为耗尽气体OOG)异常。

合约和 EVM 可用的存储有两种类型:一种是内存,另一种称为存储。内存就像 RAM 一样,并且在代码完全执行时清除。存储永久存储在区块链上。EVM 是完全隔离的,存储在存储或内存访问方面是独立的,如下图所示:

EVM 直接可访问的存储是字数组,它是非易失性的,并且是系统状态的一部分。程序代码存储在虚拟 ROM 中,可以使用CODECOPY访问,它基本上是将代码从当前环境复制到内存中。

执行环境

除了系统状态和气体外,还需要在执行环境中提供执行节点必须的各种其他元素和信息:

  • 拥有执行代码的帐户的地址。

  • 交易发起方地址。

  • 执行的起始地址。

  • 发起执行的交易的燃气价格。

  • 输入数据或交易数据,取决于执行代理类型。如果执行节点是一个交易,则交易数据将被包含为输入数据。

  • 发起代码执行或交易发起方的帐户地址。如果启动是通过交易,则为发送方的地址,否则为帐户的地址。

  • 交易价值——此金额以 Wei(以太最小单位)表示。如果执行代理是一个交易,则它是交易的价值。

  • 要执行的代码,呈现为迭代函数可以循环执行的字节数组。

  • 当前区块的区块头。

  • 在执行中的消息调用或合约创建交易的数量——即,在当前执行周期中正在执行的 CALL 或 CREATE 数量。

以太坊区块

以太坊区块链是一组类似于比特币区块链的必需参数的集合;以下是以太坊区块的主要元素:

  • 区块头

  • 交易列表

  • 未确认叔/OMMer 的标题列表

区块头

区块头是各种宝贵信息的集合,定义了区块在以太坊区块链中的存在。看看以下内容:

  • 父哈希:父区块头的 Keccak 256 位哈希。

  • 叔/OMMer 哈希:该区块的叔/OMMer 列表的 Keccak 256 位哈希。

  • 受益人:此区块挖矿收集所有费用的 160 位地址。

  • 状态根:状态 trie 根节点的 Keccak 256 位哈希。它在所有交易被处理和执行后计算。

  • 交易根:trie 结构根节点的 keccak 256 位哈希。交易 trie 表示包含在此区块中的交易列表。

  • 收据根:这是基于 trie 结构根节点的 keccak 256 位哈希。这个 trie 由包含在区块中的所有交易的收据组成。收据是在每个交易成功执行后生成的。

  • 日志布隆:这是由包含区块的每个交易收据的日志记录器地址和日志主题组成的布隆过滤器。

  • 难度:每个区块的难度级别。这是通过前一个区块的难度和时间戳计算的。

  • 编号:这是先前区块的总数;创世区块的编号为零。

  • Gas 限制:当前区块的燃料消耗上限。

  • 已使用 Gas:包含在区块中的交易消耗的总燃料。

  • 时间戳:这是区块初始化时间的时代 Unix 时间。

  • 额外数据:此文件可用于存储与此区块相关的任意数据。它的大小必须不超过 32 个字节。

  • Mixhash:这包含一个 256 位哈希,与 nonce 结合使用;它用于证明已消耗足够的计算能力来挖掘块,是 PoW 机制的一部分。

  • Nonce:这是一个 64 位哈希,用于证明(与 mix hash 字段一起)已花费足够的计算工作来创建此块。

以下图表显示了一个块头的结构:

乌姆和叔叔

当挖掘出一个块时,以太坊激励矿工包含一个姑妈或叔叔列表,直到达到一定的限制。尽管在比特币中,如果在相同高度挖掘出一个块,或者如果一个块不包含交易,那么它被认为是无用的;但在以太坊中并非如此。包括叔叔并将它们作为以太坊区块链的一个重要部分的主要原因是,它们减少了发生攻击的可能性,因为它们阻止了中心化。

消息

消息是在两个账户之间传递的数据和价值。此数据包含数据和价值(乙醚金额)。消息可以在合同账户或外部拥有的账户之间以交易的形式发送。

Ethash

Ethash 是以太坊中使用的工作证明PoW)算法。它是 Dagger–Hashimoto 算法的最新版本。它类似于比特币,尽管有一个区别—Ethash 是一种内存密集型算法;因此,难以为其实施 ASIC。Ethash 使用 Keccak 哈希函数,该函数现在已标准化为 SHA-3。

乙醚

乙醚是与以太坊区块链相关联的主要加密货币;每个合同账户都可以创建自己的货币,但在以太坊区块链内使用乙醚支付对 EVM 上合同的执行。乙醚用于购买 gas,而乙醚的最小单位用作 gas 的单位。

由于 Wei 是最小的 Wei 单位,因此这里列出了一个表格,列出了各种面额及其常用名称,以及相关值:

采购乙醚

有各种方式可以获得乙醚进行交易、构建智能合约或分散应用程序:

  • 通过加入挖矿池或进行独立挖矿来挖掘乙醚

  • 使用加密货币交易平台进行交易,并与任何其他加密货币交换

  • 从任何法定货币购买乙醚—有各种交易所允许从法定货币购买乙醚

交易

由于其庞大的社区支持和主要的积极发展,乙醚一直是每个人首选的投资机会。已知有超过 500 个交易所支持乙醚与其他加密货币或法定货币的交换。这里有一个价格图表,显示了从 2018 年 4 月 17 日到 2018 年 5 月 17 日的乙醚价格波动情况:

摘要

在本章中,我们讨论了以太坊的各种组成部分,包括其执行、网络和账户,还对以太坊的客户端进行了详细研究。我们还讨论了燃气和 EVM,包括其环境以及执行过程的工作原理。最后,我们讨论了以太坊块及其块头,以太坊算法,以及以太的获取。

在下一章中,我们将学习Solidity,这是以太坊区块链上合约编写的官方标准语言。学习 Solidity 将帮助我们更好地理解智能合约的开发和部署。

第十三章:Solidity 101

在前几章中,我们详细了解了以太坊。我们了解了以太坊网络、客户端、燃气、以太坊虚拟机和以太坊区块链的其他元素。有关以太坊的一个有趣事实是,任何人都可以使用以太坊创建自己的区块链。

以太坊在其平台上运行智能合约;这些是利用区块链技术执行所需操作的应用程序,使用户能够创建自己的区块链并发行自己的另类加密货币。这是通过使用 Solidity 编码实现的,它是一种用于编写将在以太坊区块链上执行并执行程序化任务的智能合约的合约导向编程语言。

Solidity 是一种静态类型的编程语言,运行在以太坊虚拟机上。它受到 C++、Python 和 JavaScript 的影响,于 2014 年 8 月提出,并由以太坊项目的 Solidity 团队开发。完整的应用部署在区块链上,包括智能合约、前端界面和其他模块;这被称为 DApp分散式应用

我们将在本章中涵盖以下主题:

  • Solidity 基础知识

  • Solidity 文件的布局

  • 智能合约的结构

  • 变量和函数

  • 数据类型

  • 引用类型

  • 键值映射

Solidity 基础知识

Solidity 并不是唯一用于以太坊智能合约的语言;在 Solidity 之前,还有其他语言,但它们并不成功。以下是当前(截至 2018 年 8 月)与以太坊兼容的语言的简要列表:

  • Mutan:受 Golang 启发,于 2015 年 3 月被弃用。

  • LLL:Lisp-like 语言的缩写。虽然它仍然受支持,但很少使用。

  • Serpent:虽然这种语言类似于 Python,但不再推荐使用。

  • Solidity:以太坊基金会引入的第四种语言,迄今为止最成功的用于开发智能合约的语言。它是最有文档记录、最稳定且拥有庞大社区支持的。

  • Vyper:新引入的,比 Solidity 简单易懂得多,尽管它目前没有太多社区支持。它受 Python 的影响。

Solidity 也被称为合约导向语言,因为合约类似于面向对象语言中的类。Solidity 语言 loosely 基于 ECMAScript(JavaScript);因此,了解 ECMAScript 将有助于理解 Solidity。以下是开发、测试和部署以 Solidity 编写的智能合约所需的一些工具:

  • 测试网:选择要工作的测试网,要使用的指定网络 ID。

  • 编译器:选择所需的编译器,例如 solc,它是 Solidity 编译器;它包含在大多数节点中,并且还作为一个独立的软件包提供。

  • Web3.js:连接以太坊网络和我们的 DApp 的库,通过 HTTP 或 IPC 网络连接。

  • 框架:从可用于合约编译、部署和其他任务的框架中选择一个是很重要的。一些常用的框架包括 Truffle、Embark、Dapple 等。

除了我们已经提到的关键工具之外,还有各种其他工具可用于开发在以太坊区块链上运行的智能合约,例如理解合约流程、发现安全漏洞、运行测试应用程序、编写文档等等。请看下面的图示:

在 Solidity 上工作的基础知识

如果你经常编程,你应该已经了解到代码编辑器或集成开发环境IDE)。目前已经有一系列各种 IDE 的集成工具列表;除此之外,以太坊基金会还发布了一个基于浏览器的 IDE,其中包含了集成编译器和 Solidity 运行环境,无需服务器组件即可编写和测试智能合约。你可以在 remix.ethereum.org 找到它。

使用编译器

对于小型和基于学习的 DApps 项目,建议使用以太坊基金会的基于浏览器的编译器:Remix。另一种方法是将 Solidity 编译器安装到您的计算机上。可以使用以下命令从 npm 安装 solc

npm install -g solc

Solidity 也可以通过克隆 GitHub 链接上的 Git 存储库来构建:github.com/ethereum/solidity.git

在 Solidity 中编程

在本节中,我们将讨论 Solidity 源文件的结构和元素;我们将讨论布局、结构、数据类型、类型、单位、控件、表达式以及 Solidity 的其他方面。Solidity 文件的格式扩展名是.sol

设计 Solidity 文件的布局

Solidity 正在进行积极的开发,并且有大量来自庞大社区的常规更改和建议;因此,在源文件的开头指定 Solidity 文件的版本是很重要的,以避免任何冲突。这通过 Pragma 版本来实现。这在 Solidity 文件的开头定义,以便任何打算运行该文件的人都知道先前的版本。看看这段代码:

pragma solidity ⁰.4.24;

通过指定版本号,该特定源文件将与指定版本号之前或之后的版本一起编译。

导入文件

与 ECMAScript 类似,Solidity 文件使用import语句声明,如下所示:

import "filename.sol";

上述语句将把filename.sol文件中的所有符号导入到当前文件中作为全局语句。

在导入文件时也支持路径,因此您可以像 JavaScript 一样使用 /...

注释

单行(//)注释和多行(/* ... */)注释被使用,尽管除此之外还有另一种称为Natspec 注释的注释样式,这也是可能的;在这种类型的注释中,我们可以使用////** ... */,它们只能在函数声明或语句之前使用。

Natspec 是自然规范的简称;根据最新的 Solidity 版本(0.4.24),这些注释不适用于变量,即使变量是公开的也是如此。以下是一个小的代码片段,其中包含了这些类型的注释的示例:

pragma solidity ⁰.4.19;

/// @title A simulator for Batman, Gotham's Hero
/// @author DC-man
/// @notice You can use this contract for only the most basic simulation
/// @dev All function calls are currently implement without side effects
contract Batman {
 /// @author Samanyu Chopra
 /// @notice Determine if Bugs will accept `(_weapons)` to kill
 /// @dev String comparison may be inefficient
 /// @param _weapons The name weapons to save in the repo (English)
 /// @return true if Batman will keep it, false otherwise
 function doesKeep(string _weapons) external pure returns (bool) {
 return keccak256(_weapons) == keccak256("Shotgun");
 }
}

标签

它们用于 Natspec 注释;每个标签根据其用法具有自己的上下文,如下表所示:

标签 用于
@title 智能合约的标题
@author 智能合约作者
@notice 函数的解释
@dev 开发者的解释
@param 参数的说明
@return 返回类型的解释

合约的结构

Solidity 中的每个合约类似于类的概念。合约可以从其他合约继承,类似于类。一个合约可以包含以下的声明:

  • 状态变量

  • 函数

  • 函数修饰符

  • 事件

  • 结构类型

  • 枚举类型

状态变量

这些值被永久存储在合约存储中,例如:

pragma solidity ⁰.4.24;

contract Gotham {
 uint storedData; // State variable
 // ...
}

函数

函数可以在内部或外部调用,例如:

pragma solidity ⁰.4.24;

contract Gotham {
 function joker() public Bat { // Function
 // ...
 }
}

函数修饰符

函数修饰符可用于在声明中修改函数的语义。也就是说,它们被用来改变函数的行为。例如,它们被用于在执行函数之前自动检查条件,或者根据需要在给定时间段内解锁函数。它们可以被派生合约覆盖,如下所示:

pragma solidity ⁰.4.24;

contract Gotham {
 address public weapons;

modifier Bank() { // Modifier
 require(
     msg.sender == coins,
     "Only coins can call this."
     );
     _;
 }

    function abort() public coinsbuyer { // Modifier usage
 // ...
 }
}

事件

事件允许通过 DApp 前端方便地使用 EVM。事件可以被监测和维护。请看以下代码:

pragma solidity ⁰.4.24;

contract Attendance {
      event Mark_attendance(string name, uint ID); // Event

    function roll_call() public marking {
             // ...
                 emit Mark_attendance(Name, ID); //Triggering event
         }
}

类型

在 Solidity 中,每个变量的类型都需要在编译时指定。复杂类型也可以通过组合复杂类型在 Solidity 中创建。在 Solidity 中有两类数据类型:值类型引用类型

值类型

值类型被称为值类型,是因为这些类型的变量在自己分配的内存中保存数据。

布尔

这种类型的数据有两个值,要么为真,要么为假,例如:

bool b = false;

上述语句将false赋给布尔数据类型 b

Solidity 中的运算符与 JavaScript 运算符相似,例如算术运算符、赋值运算符、字符串运算符、比较运算符、逻辑运算符、类型运算符和位运算符。这些运算符可以根据允许的用法与各种值类型一起使用。

整数

这个数值类型分配整数。整数有两个子类型,分别是intuint,分别是有符号整数和无符号整数类型。内存大小在编译时分配;使用int8int256来指定,在这里数字代表内存中分配的大小。只使用intunit来分配内存,默认情况下分配最大的内存大小。

地址

这个数值类型保存了一个 20 字节的数值,这个大小等同于以太坊地址的大小(40 个十六进制字符或 160 位)。看看这个:

address a = 0xe2793a1b9a149253341cA268057a9EFA42965F83

这个类型有几个成员可以用来与合同交互。这些成员如下:

  • balance

  • transfer

  • send

  • call

  • callcode

  • delegatecall

balance 返回地址的 wei 单位的余额,例如:

address a = 0xe2793a1b9a149253341cA268057a9EFA42965F83;
uint bal = a.balance;

transfer用于从一个地址转账到另一个地址,例如:

address a = 0xe2793a1b9a149253341cA268057a9EFA42965F83;
address b = 0x126B3adF2556C7e8B4C3197035D0E4cbec1dBa83;
if (a.balance > b.balance) b.transfer(6);

当我们使用transfersend成员时,消耗的燃气几乎相同。transfer是从 Solidity 0.4.13 开始引入的,因为send不发送任何燃气,也不传播异常。transfer被认为是从一个地址安全地发送以太到另一个地址的一种方式,因为它会抛出一个错误并允许某人传播该错误。

callcallcodedelegatecall用于与没有应用程序二进制接口ABI)的函数交互。call返回一个布尔值,指示函数是否在 EVM 中成功运行或终止。

a调用b时,代码在b的上下文中运行,使用的是b的存储。另一方面,当abcallcode时,代码在a的上下文中运行,并使用a的存储,但是a的代码和存储会被使用。

delegatecall函数用于委托一个合同使用另一个合同的存储,如有需要。

所有这些成员:calldelegatecallcallcode都不建议使用,除非真的有必要,因为它们倾向于破坏 Solidity 的类型安全性。有可能callcode将在不久的将来被弃用。

数组数值类型

Solidity 有固定和动态数组数值类型。关键字从bytes1bytes32在固定大小的字节数组中。另一方面,在动态大小的字节数组中,关键字可以包含字节或字符串。bytes用于原始字节数据,strings用于用UTF-8编码的字符串。

length 是一个成员,用于返回固定大小的字节数组或动态大小的字节数组的长度。

固定大小数组初始化为test[10],动态大小数组初始化为test2[

文字

文字用于表示一个固定的值;有多种类型的文字被使用;它们如下:

  • 整数字面值

  • 字符串字面值

  • 十六进制字面值

  • 地址文字

整数字面量由从 0 到 9 的数字序列组成。八进制字面量和以 0 开头的字面量无效,因为以太坊中的地址以 0 开头。看一下这个:

int a = 11;

字符串字面量使用一对双引号("...")或单引号('...')声明,例如:

Test = 'Batman';
Test2 = "Batman";

十六进制字面量以关键字 hex 为前缀,并用双引号 (hex"69ed75") 或单引号 (hex'69ed75') 包围。

通过地址校验和测试的十六进制字面量是address 类型的字面量,例如:

0xe2793a1b9a149253341cA268057a9EFA42965F83;
0x126B3adF2556C7e8B4C3197035D0E4cbec1dBa83;

枚举

枚举允许在 Solidity 中创建用户定义类型。枚举可转换为所有整数类型。下面是 Solidity 中一个枚举的示例:

enum Action {jump, fly, ride, fight};

函数

有两种类型的函数:内部函数和外部函数。内部函数只能从当前合约内部调用。外部函数可通过外部函数调用方式调用。

函数修饰符

有各种可用的修饰符,对于基于 Solidity 的函数,你不必使用。看看这些:

  • pure

  • constant

  • view

  • payable

pure 函数不能从存储中读取或写入;它们只是根据其内容返回一个值。constant 修饰符函数不能以任何方式在存储中写入。尽管,自 Solidity 版本 0.4.17 起,constant 被废弃以为pureview 函数腾出位置。view 的作用就像constant ,它的函数不能在任何方式改变存储。payable 允许函数在调用时接收以太币。

函数可以通过指定每个之间用空格分隔的修饰符来使用多个修饰符;它们按照编写顺序进行评估。

引用类型

这些是通过引用传递的;它们非常消耗内存,由于分配了它们构成的内存。

结构体

结构体是在一个逻辑组下声明的复合数据类型。结构体用于定义新类型。结构体不能包含自己类型的成员,虽然一个结构体可以是映射成员的值类型。下面是结构体的一个示例:

struct Gotham {

address Batcave;
uint cars;
uint batcomputer;
uint enemies;
string gordon;
address twoface;

}

数据位置

这指定了特定数据类型将被存储的位置。它与数组和结构体一起使用。数据位置使用 storagememory 关键字来指定。还有第三种数据位置,calldata,是不可修改且非持久的。外部函数的参数使用 calldata 存储器。默认情况下,函数的参数存储在 memory 中;其他局部变量使用 storage

映射

mapping 用于键值映射。mapping 可以被视为虚拟初始化的哈希表,使得每个可能的键都存在并映射到默认值。默认值为全零。键从不存储在 mapping 中,只有 keccak256 哈希用于值查找。mapping 定义方式与任何其他变量类型相同。看一下这段代码:

contract Gotham {

    struct Batman {
        string friends;
        string foes;
        int funds;
        string fox;
    }

    mapping (address => Batman) Catwoman;
   address[] public Batman_address;
}

前面的代码示例显示了 Catwoman 被初始化为 mapping

单位和全局变量

全局变量可以被任何 Solidity 智能合约调用。它们主要用于返回有关以太坊区块链的信息。其中一些变量还可以执行各种功能。时间和以太的单位也可以全局使用。没有后缀的以太货币数被假定为 wei。与货币类似,时间相关的单位也可以使用,并且它们之间可以进行转换。

摘要

在本章中,我们详细讨论了 Solidity,了解了编译器,进行了关于 Solidity 编程的详细研究,包括研究 Solidity 文件的布局、合约的结构以及值和引用类型。我们还学习了关于映射的内容。

在下一章中,我们将运用本章的新知识来开发一个实际的合约,并将其部署到测试网络上。

第十四章:智能合约

智能合约的概念最早是由研究人员尼克·萨博在 1990 年代中期构想出来的。在他的论文中,他将智能合约描述为一组承诺,以数字形式指定,其中包括各方执行这些承诺的协议。这个描述可以分为四个部分:

  • 一组承诺

  • 数字形式

  • 通信和执行的协议

  • 自动触发的行动的性能

如您所见,在此过程中并没有直接指定区块链,因为区块链技术当时尚未发明,直到另外 13 年才被发明。然而,随着区块链技术的发明,智能合约突然变得更加可行。

智能合约和区块链技术是独立的概念。区块链可以存在而没有智能合约(例如,比特币实际上没有内置真正的智能合约能力),而智能合约可以在没有区块链的情况下构建。但是,区块链是一种非常适合开发智能合约的技术,因为它允许无信任、去中心化的交换。基本上,区块链提供了智能合约所需的四项中的两项:数字形式和在不同方之间进行通信和执行操作的协议。

在本章中,我们将介绍一些不同的区块链网络及其对智能合约技术的方法。本章将涵盖以下主题:

  • 为什么使用智能合约?

  • 智能合约的方法

  • 智能合约的局限性

通常,各种智能合约方法可以分为不同类型:图灵完备受限指令链下执行链上执行,如下图所示:

在系统上执行的智能合约类型决定了性能,系统上可以执行和不能执行的内容,复杂性,以及当然,安全性的水平。

在我们进一步探讨之前,让我们讨论一下为什么智能合约备受追捧,甚至被认为是具有革命性的。

为什么要使用智能合约?

在智能合约出现之前的世界充满了不确定性。法律合同,即使是简单的合同,也不一定会被遵守,而且在大多数法律体系中寻求救济的成本非常昂贵,即使在法律体系不腐败的国家也是如此。在世界许多地方,合同几乎一文不值,通常只有具有重大政治或财务实力的各方才能强制执行。对于经济或政治体系中较弱的行动者来说,这是一种可怕而不公平的境遇。

我们之前提到的问题主要源于人为因素。只要一个人参与合同的执行,他们就可能是腐败的、懒惰的、误导的、偏见的等等。相比之下,智能合约是以代码编写的,并且旨在无论涉及哪些方都能忠实执行。这为更安全、更便宜、更快速、更公平的结果提供了机会。

让我们更深入地了解智能合约的关键优势,在以下小节中进行讨论。

自动化各方之间的流程和解决方案

智能合约最直接的优势是它们减少了即使是成功和忠实执行的协议所涉及的劳动和痛苦。举个例子,考虑两家公司之间的一个简单的采购订单和发票。想象一下,一个名为FakeCar Inc.的公司决定从他们的供应商 Wheelmaster 那里购买 1000 辆轮子。他们之间达成协议,每个轮子的价格是 $20,支付将在轮子送到 FakeCar 时进行。一开始,轮子可能会通过货运公司运送,途中经过多个人的手。一旦到达,FakeCar 需要扫描和检查每个轮子,做笔记,然后向 Wheelmaster 发出支票或电汇。根据涉及的距离,轮子可能由多家公司承运:一家货运公司,洲际航运,另一家货运公司,最后是 FakeCar 的制造设施。在每个阶段,都存在损坏、丢失或交付错误的可能性。一旦交付完成,FakeCar 就需要发出转账以支付发票。即使一切顺利,这个过程也可能需要几周。在此期间,FakeCar 和 Wheelmaster 都不得不担心他们是否能得到他们的轮子或他们的钱。

现在让我们看看这个流程如何通过智能合约来工作:

  1. FakeCar 在区块链上发布了一个采购订单,购买 1000 辆轮子,每辆轮子价格为$20,有效期为 1 个月。

  2. Wheelmaster 从他们的供应商那里发出了一个交货请求,要求一个月内交货,并接受了采购订单。

  3. FakeCar 在智能合约托管中拨款采购订单;Wheelmaster 可以确信如果轮子到货,他们将会得到支付。

  4. Wheelmaster 看到有资金可用于支付轮子费用,并与一个跟踪每个步骤的公司合作,在区块链上记录每个步骤,并接受支付任何遗失的轮子的条款。他们(或其保险公司)还向一个装运托管合同提供足够的资金,以支付可能遗失的装运事件。一旦 FakeCar 签署收据,合同将自动退还运输商的款项。

  5. 轮子已发货并送达,FakeCar 的托管被释放,保险金返回给运输公司。这发生在 FakeCar 登记收据并运输公司签署变更监护权的时刻。

在这种情况下,如果所有参与方都参与到基于区块链的智能合约生态系统中,支付和保险可以得到即时验证和处理,即使跨越国界、文化和语言,结果是所有参与方的结果确定性大幅增加,效率随之增加。例如,如果 Wheelmaster 能够确信他们的发票将被支付,那么他们可以更有效地做出业务决策。

实例:

截至目前,使用区块链和智能合约完成的第一笔重大物流交易在 Corda 区块链上由汇丰银行和荷兰银行完成,涉及从阿根廷到马来西亚的大豆运输。据银行称,这种转移过去非常耗时,需要五到十天。通过区块链,整个金融问题在不到 24 小时内就得到解决了。

智能合约的使用仍处于起步阶段,然而这项技术已经使跨境金融服务的摩擦减少了 80-90%。随着技术和周围生态系统的改善,优势可能会变得更加极端。

提高透明度

如前所述,全球组织经历的负面因素之一是,对于许多交易,信任是必需的。这在金融交易中尤其如此,采购订单、发票和货物在多个方之间移动。这里的信任问题很多。不仅是是否有人会付款的问题,还有他们是否根本就付不起?他们是否有准时付款的历史,如果没有,他们的付款历史有多糟糕?在许多情况下,任何市场中的买家和卖家都拥有非常有限的信息。这在国际上尤为真实。这就是区块链和智能合约可以发挥作用的地方。

结束集中式数据

在美国,每个人都有一个信用评分,由三家大型信用机构计算。这些机构及其方法是不透明的。购买此信息的人以及被报告的人都不被允许深入了解评分是如何计算的,也不能直接更新此信息。信用机构的错误可能对某人融资购买房屋或汽车的能力造成毁灭性影响,给消费者带来宝贵的时间和金钱损失。尽管如此,如果消费者在其信用报告中发现错误,他们必须请求发行者更新,如果该组织拒绝,他们几乎没有选择。更糟糕的是,这些发行者已经证明他们不良地保管了他们收集的私人财务信息。例如,2017 年,Experian 遭受了一次大规模数据泄露事件,泄露了超过 1 亿人的记录。如果这些机构被区块链系统和智能合约取代,人们将能够直接看到规则并更新记录,而不必支付可能不诚实的中间人。

在当前市场上,大公司具有优势:他们既可以支付这些第三方服务的金融数据,也可以支付需要随时间跟踪信息的人员和系统。较小的公司没有获得这样的规模经济,使他们处于竞争劣势,并增加了他们的开销,甚至可能因为缺乏信息而使糟糕的决策使他们破产。然而,即使对于较大的公司来说,汇编这些数据的成本和费用也是累积的。随着越来越多关于信任的数据变得公开并由智能合约自动化,市场竞争格局将会平衡,希望能将市场上的不诚实行为排除在外。这应该会带来市场信心的增加,以及开销的降低,从而增加利润、降低价格,或者两者兼而有之。

增加公平性

在美国,曾经有一个被称为红线的过程,特定族裔的人们被拒绝贷款和获取金融服务,尤其是抵押贷款。这些不公平的做法在某种程度上仍在继续,因为贷款的标准和流程以及利率计算方式都隐藏在中心化组织中。这种现象并不局限于美国;世界上许多地区的种族、宗教和其他偏见扭曲了原本应该是客观决策的事实。通过基于智能合约的系统,规则将会是公开的和可审计的,以确保公平和准确性。

智能合约方法

智能合约的一种方法是允许全功能软件嵌入或与区块链并行,能够响应区块链事件。这是 Hyperledger Fabric、Ethereum、NEO 等公司采取的一种方法。这种方法提供了最大的灵活性,因为基本上没有什么是不能写入区块链系统的。这种权力的缺点是存在出错的风险。可用选项越多,就必须测试的边界情况和排列组合越多,代码中就可能存在未发现的漏洞的风险就越高。

智能合约的另一种方法是为了增加安全性和降低错误成本而大幅减少可能发生的范围。目前的权衡是灵活性与安全性。例如,在恒星生态系统中,智能合约被制作为一组操作。在恒星中,只有十一种操作:

  • 创建账户

  • 支付

  • 路径支付

  • 管理报价

  • 创建被动报价

  • 设置选项

  • 更改信任

  • 允许信任

  • 账户合并

  • 通货膨胀

  • 管理数据

这些操作本身有多种选项和排列方式,因此能够实现相当多的行为。然而,使用这些操作来执行像 DAO 或其他链上治理组织之类的功能并不容易。相反,这种功能必须托管在链下。同样地,在 Stellar 中没有明确的方法来管理类似于 ERC-721 代币,这些代币将跟踪类似于交易卡或甚至是房地产的等价物。Stellar 的智能合约系统专注于可互换资产的转移,如货币。因此,它可以非常快速地扩展,轻松处理多重签名账户和托管,并且以非常高的吞吐量在几秒钟内处理交易。以太坊更灵活,但多重签名功能、代币本身等都需要用 Solidity 编写的软件来创建。以太坊显然更灵活,但需要更多的代码,因此存在更高的缺陷风险。

以太坊智能合约示例

最广泛使用智能合约的区块链是以太坊。在这里呈现的所有具备智能合约能力的网络中,它不仅是使用最广泛的,而且拥有最大的公共分布式应用生态系统。以太坊如此受欢迎的一个原因是,它对智能合约的表示相对直观且易于阅读。在本节中,我们将看一个常见的基于以太坊的智能合约,它满足前面四个条件,并且相对容易理解:一个代币销售合约。以下代码将用 Solidity 编写;有关更多详情,请参阅 Chapter 13,Solidity 101,以及 Chapter 15,以太坊开发

承诺

智能合约的第一个方面是它必须做出一系列的程序性承诺。我们选择查看代币销售合约的原因是它有一个非常简单的承诺:如果你向合约发送以太坊,合约将自动向您的账户发送一个新代币。让我们看一些基本代码,这是明确不是用于生产的;这是简化的代码,以使某些概念更清晰。这段代码来自于StandardToken合约,这是基于 OpenZeppelin 项目的一部分(你将在 References 部分找到相关链接),该项目具有全功能且经过审计的代码来实现相同的效果,但更复杂一些。

首先,这里是一个ERC20代币的接口合约,我们将其保存为名为ERC20.sol的文件:

pragma solidity ⁰.4.23;
interface ERC20 {
 function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

接下来,我们将在我们的众筹合约中引用该代币接口,该合约将在以太币支付后发送一个ERC20代币:

pragma solidity ⁰.4.23;
import "./ERC20.sol";

contract Crowdsale {

 // The token being sold, conforms to ERC20 standard.
 ERC20 public token;

 // 1 tokens per Eth, both have 18 decimals.
 uint256 public rate = 1; 

 constructor(ERC20 _token) public {
    token = _token;
 }

 function () external payable {
    uint256 _tokenAmount = msg.value * rate;
    token.transfer(msg.sender, _tokenAmount);
 }
}

这是一个非常简化的合约,但再次强调,这对于完整的真实的 Crowdsale 是不够的。然而,它确实说明了智能合约的关键概念。让我们看看每一部分。constructor 方法需要一个对 ERC20 代币的引用,这是将发送以太坊的购买者所得到的代币,如以下代码所示:

constructor(ERC20 _token) public {
    token = _token;
}

由于 Solidity 的工作方式,除非加载了代币,否则此合约无法运行。因此,这段代码隐含的第一个承诺是:必须有一个可供购买的ERC20代币。第二个承诺是转换率,这里设置为非常简单的 1。对于每一个 wei(以太坊中的最小货币单位),购买此代币的人将获得 1 单位的新代币。以太坊有 18 个小数位数,大多数代币也是如此,因此可以假定这将使以太坊与此代币的转换率现在是 1:1。这带我们来到智能合约必要方面的第 4 点:自动执行。以下代码处理此问题:

function () external payable {
    uint 256 _tokenAmount = msg.value * rate; //Calculate tokens purchased
    token.transfer(msg.sender, _tokenAmount); //Execute send on token contract.
}

由于这是代码,智能合约应该以数字形式存在的要求是显而易见的。这里的自动化方面也很简单。在以太坊中,msg.value保存发送命令的以太币货币的价值。当合约接收到以太币时,它会计算购买者应该收到的代币数量并发送它们:无需人类交互,也不需要或可能有可信的方。同样,没有人能够干预,因为一旦部署到网络上,以太坊中的代码是不可变的。因此,使用此智能合约的发件人可以绝对确保他们将收到他们的代币。

安全注意事项

重要的是要了解智能合约所在的领域:分散的、异步的网络。由于生活在这个生态系统中,存在着并不总是显而易见的安全注意事项,可能会导致问题。为了说明这一点,我们将研究 ERC20 标准的两个相关函数:approvetransferFrom。以下是来自 OpenZeppelin 的 approve 函数的代码:

function approve(address _spender, uint256 _value) public returns (bool) {
   allowed[msg.sender][_spender] = _value;
   emit Approval(msg.sender, _spender, _value);
   return true;
 }

approve 函数允许代币所有者表示他们已经批准将其代币转移到另一个帐户。然后,针对不同的事件,可以进行未来的转移。这如何发生取决于应用程序,但是例如代币销售,通过批准转移,区块链应用程序可以随后调用 transferFrom 并移动代币,也许是为了接受支付然后执行操作。让我们看看那段代码:

function transferFrom(address _from,address _to,uint256 _value) public returns (bool) {
   require(_to != address(0)); // check to make sure we aren't transfering to nowhere.

   // checks to ensure that the number of tokens being moved is valid.
   require(_value <= balances[_from]); 
   require(_value <= allowed[_from][msg.sender]);

   // execute the transfer.
   balances[_from] = balances[_from].sub(_value);
   balances[_to] = balances[_to].add(_value);
   allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);

   //Record the transfer to the blockchain.
   emit Transfer(_from, _to, _value); 
   // let the calling code or app know that the transfer was a success.
   return true;
 }

这两个函数共同工作。希望使用该应用程序的用户使用 approve 允许支付,应用程序调用 transferFrom 以接受。但由于调用的异步性质,存在缺陷是可能的。

想象一个应用,在这个应用中,用户可以支付代币来加入数字俱乐部——40 代币可以获得基本会员资格,60 代币则可以获得增强会员资格。用户也可以将代币交易给其他人,或者根据他们的意愿出售代币。这两个功能的理想情况是,用户批准了 40 代币,应用程序将此注册并调用transferFrom来移动这 40 代币,然后作为智能合约的一部分授予用户访问权限。到目前为止一切顺利。

需要牢记的是,这里的每个操作都需要时间,并且事件的顺序是不固定的。实际上,发生的是用户向网络发送消息,触发approve,应用程序发送另一条消息,触发transferFrom,然后一切会在区块被挖掘时解决。如果这些交易的顺序出现错误(transferFromapprove之前执行),交易将失败。此外,如果用户改变主意,决定将批准的代币从 40 个更改为 60 个呢?用户意图如下:

  1. Userapprove 40 (block 1)

  2. Userapprove 60 (block 1)

  3. ApptransferFrom 60 to App (block 1)

  4. App: Grant enhanced membership (block 2)

最终,用户支付了 60 代币,并得到了他们想要的东西。但因为这些事件都是异步的,并且订单是由矿工决定的,所以这个顺序并不是保证的。在这里,可能会发生以下情况:

  1. Userapprove 40 (block 1)

  2. ApptransferFrom 40 to App (block 1)

  3. Userapprove 60 (block 2,因为矿工没有在块 1 中包含它)

  4. ApptransferFrom 60 to App (Block 2)

现在用户意外支付了 100 代币。以下是另一个排列组合:

  1. Userapprove 40 (block 1)

  2. Userapprove 60 (block 1)

  3. ApptransferFrom 40 to app (block 2)

  4. App: Grants basic membership (block 2)

  5. ApptransferFrom 60 to app (block 3) | 失败

在这个顺序结束时,用户仍然批准了 20 代币,而尝试获得增强会员资格失败了。虽然可以并且应该编写应用程序来避免这些问题,比如允许用 20 代币升级会员资格,并在调用transferFrom之前检查最大批准数量,但这种对细节的关注并不是应用程序作者所保证或自动的。

重要的是要了解的是,在以太坊中,竞争条件和顺序问题是非常重要的。用户无法控制区块链上事件的顺序,应用程序也不行。相反,决定哪些交易发生在哪个块中以及什么顺序的是矿工。在以太坊中,燃料价格影响矿工为交易给出的优先级。其他影响可能涉及最大块燃料限制,已经在块中的交易数量,以及成功解决块的矿工是否已经在网络上看到了交易。因此,智能合约不能假设事件的顺序就是预期的那样。

处理智能合约中的威胁

每个去中心化网络都将不得不处理由不同排序引起的竞态条件。关键是要仔细评估智能合约是否可能存在竞态条件和其他攻击。判断竞态条件错误是否可能的方法就是判断是否涉及到多个函数调用,直接或间接都可以。在前述情况中,用户和应用程序都调用了函数;因此,竞态条件是可能的,还可能发生一种称为前端运行的攻击。单个方法内也可能存在竞态条件,因此智能合约开发者不应放松警惕。

每个网络都有不同的合约执行模型,因此每个网络都有不同的最佳实践。对于以太坊,Consensys 在 consensys.github.io/smart-contract-best-practices/ 维护着智能合约最佳实践清单。

在发布任何智能合约之前,强烈建议组织编写广泛的单元测试和模拟测试,然后根据该网络的最佳实践审计智能合约。

智能合约的局限性

智能合约拥有巨大的权力,但它们确实有局限性。重要的是要注意,这些系统只有建造它们的人一样好。到目前为止,许多智能合约系统由于未预料到的错误和不属于初始设计的事件而失败。在许多情况下,这些只是技术缺陷,可以在时间内至少修复。然而,随着最近急于将区块链技术用于一切,我们可能会开始看到更多实质性的失败,因为人们未能理解技术的限制。要使区块链真正发挥最大的商业影响,必须解决其优点和局限性。

数据质量和错误

像所有系统一样,智能合约的效果取决于其作用的数据。智能合约从网络接收到错误或不正确的信息仍将执行。在区块链系统中,这可能是一个巨大的问题,因为大多数由人类或合约发起的交易都是不可撤销的。因此,如果在区块链上放置了错误、欺诈或其他缺陷的信息,那么智能合约仍将忠实执行。智能合约现在不是在促进网络的正常运行,而是在帮助传播错误。

以前在 FakeCar 和 Wheelmaster 之间运输轮胎的例子中,如果在运输途中装载轮胎的箱子被破坏并被替换了,那该怎么办?如果 FakeCar 的工人扫描收货的箱子而不检查每一个箱子,智能合约会看到这个更新并释放托管资金。承运人会收回他们的保险金,Wheelmaster 会收到付款,而 FakeCar 仍然没有他们订购的轮子。对于智能合约的纯粹主义者来说,这才是事情应该的样子。但在这些情况下,公司可能会拒绝使用智能合约,或者要求额外的批准层——基本上重建旧系统。

因此,在设计智能合约系统时,设计者们努力设想所有可能发生错误的方式至关重要。就像 DAO 和迄今为止使用的其他智能合约系统,在这些系统中,小错误可能带来重大后果。

许多智能合约涉及一定程度的人为干预。例如,多重签名钱包要求多人授权交易才会执行。这些接触点引入了与旧系统同样会出现错误的可能性,但会带来不可撤销的后果。

法律有效性

智能合约执行其程序设计的功能。如果法院判定一个智能合约无效,那么该问题将如何解决?目前的答案是没有人真正知道,但这种情况可能发生,而且很可能会发生。世界上大多数国家对合同可以达成的内容和不可达成的内容,以及合同中可以合法使用的条款有所限制。例如,在美国,对某些金融产品可以收取的利息金额有所限制。其他法规则定了特定行业中支付条件和条款。违反当地和国家法律的智能合约可能面临被取消的风险,导致参与组织进行赔偿、赔偿损害或其他后果,甚至可能是合同的作者。

意义的稳定性

在前面我们看到的代币出售合同中,用户可以确保他们将收到他们购买的代币。但他们无法确定这些代币将来是否有价值或仍然有用。此外,如果这些代币代表其他东西(进入系统,现实资产或其他东西),则这些代币的存在并不意味着这种进入将持续下去,人们将继续接受代币换取资产(请参阅前面提到的法律有效性问题),等等。对于国家货币,货币的使用和接受是由拥有实质权力的政府强制规定的。对于代币,代币的接受和使用没有强制要求。对一些人来说,这正是吸引人的地方——代币的价值更可信赖,因为它建立在社会批准和使用而不是政府的强制执行上。

随着时间的推移,法律框架和贸易可能会变得更加稳定,这将不再是一个问题。

总结

智能合约是在代码中编写的各方之间的协议。智能合约的关键方面是它们包含以数字形式表达的承诺。所有这些承诺都可以使用数字协议进行通信性能执行。合同的结果会自动触发。

此时,您应该对智能合约是什么,它们如何工作以及它们的优势和局限有了扎实的理解。您应该能够理解智能合约生态系统中固有的风险,并能够评估基于智能合约的系统开发中可能的风险。至少,您应该意识到出于安全原因需要仔细而彻底地评估智能合约。请记住,使用智能合约,代码几乎不需要人工干预就可以执行。智能合约中的错误意味着错误造成的损害将与代码运行的速度同步增加。

接下来,我们将深入探讨以太坊开发的智能合约章节。

参考资料

  1. firstmonday.org/ojs/index.php/fm/article/view/548

  2. 尼克·萨博(Nick Szabo),《智能合约:数字市场的构建模块》,1996 年

  3. www.cnbc.com/2018/05/14/hsbc-makes-worlds-first-trade-finance-transaction-using-blockchain.html

  4. fortune.com/2017/12/22/experian-data-breach-alteryx-amazon-equifax/

  5. github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/StandardToken.sol

第十五章:以太坊开发

在过去的几章中,我们一直在学习以太坊区块链及其用途以及它如何塑造了分散式技术,不仅仅是基于货币的用途,也适用于其他行业垂直领域。此外,我们还了解了在以太坊区块链上开发的内容,使用智能合约。

在上一章中,我们讨论了 Solidity —— 以太坊基金会推出的编程语言。Solidity 是一种使在以太坊区块链上创建去中心化应用成为可能的语言,无论是用于创建另一种加密货币代币还是区块链可以发挥重要作用的任何其他用例。

在这一章中,我们将专门讨论以太坊开发,其中包括创建代表智能合约的代币。我们将创建一个在以太坊区块链平台上运行的硬币或代币。我们将学习使用 Solidity 进行代币的开发、测试和部署,并讨论智能合约开发阶段的重要方面,这将有助于将智能合约应用于其他应用和行业。

简言之,我们将涵盖以下主题:

  • 准备智能合约开发

  • 智能合约开发

介绍

在这一章中,我们将前进并在以太坊区块链上创建一个代币。我们还将简要介绍 DApp 的开发,它将充分利用智能合约。以下是开发流程所需的工具列表:

  • 代码编辑器或 IDE:与上一章一样,选择一个您喜欢使用的代码编辑器;在本章中,我们选择 Sublime 文本。虽然,也可使用官方在线 IDE Remix。

  • 以太坊钱包:这对在 TestnNet 上部署和测试智能合约是必需的。

  • Solc 编译器:这用于编译智能合约,将 Solidity 语言代码转换为字节码以供 EVM 读取。

  • Truffle 框架:这使得测试和部署智能合约变得更容易。

  • Web3:这是一个 JavaScript 库,用于与以太坊节点通信;例如,如果我们的应用程序有一个前端界面供用户与区块链交互,那么 Web3 允许用户界面与部署在区块链上的合同进行交互。

准备智能合约开发

在我们深入智能合约的开发以及后续测试和部署流程之前,重要的是准备好工具和其他模块,以及准备开发过程,这将有助于创建期望的结果。

Remix

Remix 是目前可在网上使用的官方 IDE;如果您更喜欢使用其他 IDE,可以检查 Solidity 是否是受支持的语言,并开始使用。以下是 Remix 的样式截图:

Remix 是一个功能齐全的在线 IDE,具有诸如代码编译、运行、连接本地主机、在 GitHub 上发布代码等必要功能。

当 Remix 第一次打开时,会加载 Ballot 合约。

Geth 和 Mist

我们可以使用 Geth 运行测试节点,尽管连接和挖掘以太在 TestNetprivate net 中的任务也可以使用官方以太坊客户端完成,该客户端是在 Geth 节点上运行的 Mist 浏览器。

Mist 客户端具有各种功能,例如能够创建以太坊帐户并连接到 MainNetTestNet。我们可以使用 Mist 在区块链上部署或监视已部署的合约。以下截图说明了 Mist 的外观:

MetaMask

MetaMask 是以太坊钱包和以太坊浏览器。MetaMask 使我们能够通过网络浏览器与 DApps 和智能合约进行交互,而无需下载完整的以太坊区块链。它作为 Chrome、Firefox 和其他浏览器的浏览器扩展程序提供。

它允许网站从区块链获取数据,还允许用户从扩展本身发送交易。有了 MetaMask,通过浏览器与以太坊 DApp 进行交互变得更加容易。以下是以太坊钱包的示例截图:

代币标准

使用以太坊,可以创建去中心化应用程序,并且我们还可以在以太坊区块链上发行代币。就像比特币改进提案BIPs)一样,在 GitHub 上托管了一份以太坊改进提案EIPs)的在线列表,可以在此处找到:github.com/ethereum/EIPs。在 EIP-20 中,于 2015 年底左右引入了一个新的代币标准。这个代币标准被称为 ERC20ERC 代表 以太坊请求评论。ERC 是由社区开发者编写的;在社区和核心团队的批准后,该提案成为标准。除了 ERC20 外,还有其他各种标准,例如 ERC223 和 ERC721 也在使用中。

在 EIP 中定义了必须遵循的方法,以便代币可以成为 ERC20 代币合约的一部分。

ERC20 中的方法

下面是 ERC20 合约类型中指定的方法;重要的是要遵循给定的方法/事件,以便合约可以属于 ERC20 家族。尽管其中一些规范是可选的,不一定要存在。看一下这个列表:

  • name: 它应该返回合约的名称,例如:BaToken

  • symbol: 返回代币的符号,例如:BATN

  • decimals: 返回代币使用的小数位数,例如:18。

  • totalSupply: 返回代币的总供应量。这是一个必需的方法。

  • balanceOf(address _owner): 返回另一个地址_owner的帐户余额。这是一个强制性方法。

  • transfer(address _to, unit256 _value): 将_value数量的令牌发送到地址_to。这是一个强制性方法。

  • transferFrom(address _from, address _to, uint256 _value): 此方法将_value数量的令牌从地址_from转移到地址_to。智能合约中必须有此方法才能成为有效的 ERC20 合约。

  • approve(address _spender, uint256 _value): 此方法允许地址_spender多次从给定账户提取;它可以提取的最大金额为_value。这也是一个强制性方法;建议首先将 allowance 设置为 0,以防止任何漏洞。

  • allowance(address _owner, address _spender): 返回_spender仍然可以从_owner提取的金额。智能合约中必须有此方法。

  • event Transfer(address indexed _from, address indexed _to, uint256 _value): 当令牌转移时,即使转移的令牌价值为零,也必须触发此事件。

  • event Approval(address indexed _owner, address indexed _spender, uint256 _value): 每当调用approve方法时,也会调用此事件。

Web3

Web3.js是一个 JavaScript 库;它可以通过 JSON RPC 调用与以太坊节点通信,通过连接到 HTTP 或 IPC 连接。Web3.js通过暴露已在 RPC 上启用的方法来工作。

可以使用以下命令通过npm安装Web3

npm install web3

Truffle 框架

Truffle是一个开发框架,可以简化测试和部署以太坊智能合约。可以使用以下命令通过npm安装 Truffle:

npm install -g truffle

Truffle 通过 Mocha 和 Chai 提供的自动化测试框架来帮助合约编译和链接。使用 Truffle,我们可以轻松地将合约部署到任何TestNet、MainNet 或私有 Network ID。Truffle 在 DApp 中完成所有工作,如编译合约、将其注入用户界面并进行测试以检查漏洞。

Ganache

Ganache是由 Truffle 基金会引入的工具,用于在创建的以太坊区块链上运行测试。它具有命令行界面,但在需要时也可以使用图形界面。以下屏幕截图显示了Ganache工具:

在智能合约上工作

让我们深入了解创建智能合约的任务,以及在TestNet上测试智能合约的过程。运行以下讨论的代码的最简单方法是使用 Remix。只需按照以下步骤进行操作:

  1. 当您在浏览器中打开 Remix 时,默认情况下会打开ballot.sol文件;您可以创建一个新文件并开始编辑您的第一个智能合约。看一下这个:
pragma solidity ⁰.4.24;

//This is a test comment, details about the contract can be added here
/*details like Total supply, contract address, Name, Symbol an decimals which will help someone knowing about the contract instead of finding these details within the source code 

*/

contract Gotham{

 string public name;    
    string public symbol;
    uint8 public decimals;
    //most suggested decimal places in 18
   uint256 public totalSupply;

}
  1. 在前面的代码片段中,我们创建了一个使用 Solidity 版本 0.4.24 并命名为Gotham的合约。现在让我们创建一个构造函数,它将初始化我们定义的变量。现在我们的contract代码应该如下所示:
contract Gotham{

    string public name;    
    string public symbol;
    uint8 public decimals;
    //most suggested decimal places in 18
    uint256 public totalSupply;

//Constructor

    constructor() public {
        symbol = "GOTH";         //This is the symbol of our Token
        name = "GothCoin";       //This is the name of our Token 
        decimals = 12;           /* These are the number of decimal places it can have,  it is suggested to have 18 decimal places */
        totalSupply = 100000;    //total supply of coins allowed 
        }

}
  1. 现在,让我们将标准的 ERC20 方法添加到一个单独的合约中;这些方法必须存在于以太坊智能合约中。看看这段代码:
contract ERC20 {

     function totalSupply() public constant returns (uint);
     function balanceOf(address tokenOwner) public constant returns (uint balance);
     function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
     function transfer(address to, uint tokens) public returns (bool success);
     function approve(address spender, uint tokens) public returns (bool success);
     function transferFrom(address from, address to, uint tokens) public returns (bool success);

     event Transfer(address indexed from, address indexed to, uint tokens);
     event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
  1. 此外,为了避免任何溢出或类似问题,重要的是实现一些具有检查机制的基本数学函数,以避免任何函数溢出。以下是可以创建的合约:
contract Arithmetic {

   function Addition(uint a, uint b) public pure returns (uint c) {
        c = a + b;
        require(c >= a);
    }
    function Subtraction(uint a, uint b) public pure returns (uint c) {
        require(b <= a);
        c = a - b;
    }
    function Multiplication(uint a, uint b) public pure returns (uint c) {
        c = a * b;
        require(a == 0 || c / a == b);
    }
    function Division(uint a, uint b) public pure returns (uint c) {
        require(b > 0);
        c = a / b;
    }
}
  1. 我们的合约必须有所有者的地址;当合约部署时,这将有助于转移代币。为此,我们在 Solidity 文件中创建了一个名为Im_owner的合约。看看下面的内容:
contract Im_owner {

    address public owner;
    address public newOwner;
    event OwnershipTransferred(address indexed _from, address indexed _to);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function transferOwnership(address _newOwner) public onlyOwner {
        newOwner = _newOwner;
    }
    function acceptOwnership() public {
        require(msg.sender == newOwner);
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
        newOwner = address(0);
    }
}
  1. 现在是时候在contract Gotham上工作,以添加各种将返回总供应量、获取账户中可用代币余额、转移代币和其他重要功能所需的函数。此外,由于此contract Gotham是主要合约,因此我们 Solidity 文件中的其他合约应该在此合约中继承。现在,contract Gotham应如下所示:
contract Gotham is ERC20, Im_owner, arithmetic {

    string public symbol;
    string public name;
    uint8 public decimals;
    uint public totalSupply;

    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) allowed;

    // Constructor

    constructor() public {
        symbol = "GOTH"; //This is the symbol of our Token
        name = "GothCoin"; //This is the name of our Token 
        decimals = 12; /* These are the number of decimal places it can have, it is suggested to have 18                             decimal places */
        totalSupply = 100000; //total supply of coins allowed 
        }

    // Total supply

    function totalSupply() public constant returns (uint) {
        return totalSupply - balances[address(0)];
    }

    // Get the token balance for account tokenOwner

    function balanceOf(address tokenOwner) public constant returns (uint balance) {
        return balances[tokenOwner];
    }

    // Transfer the balance from token owner's account to to account
    // - Owner's account must have sufficient balance to transfer
    // - 0 value transfers are allowed
    //This function returns true when this is successful

    function transfer(address to, uint tokens) public returns (bool success) {
        balances[msg.sender] = safeSub(balances[msg.sender], tokens);
        balances[to] = safeAdd(balances[to], tokens);
        emit Transfer(msg.sender, to, tokens);
        return true;
    }

    // Token owner can approve for spender to transferFrom(...) tokens
    // from the token owner's account
    //
    // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
    // recommends that there are no checks for the approval double-spend attack
    // as this should be implemented in user interfaces 

    function approve(address spender, uint tokens) public returns (bool success) {
        allowed[msg.sender][spender] = tokens;
        emit Approval(msg.sender, spender, tokens);
        return true;
    }

    // This function transfers tokens from the from account to the two account
    // 
    // The calling account must already have sufficient tokens approve(...)-d
    // for spending from the from account and
    // - From account must have sufficient balance to transfer
    // - Spender must have sufficient allowance to transfer
    // - 0 value transfers are allowed

    function transferFrom(address from, address to, uint tokens) public returns (bool success) {
        balances[from] = safeSub(balances[from], tokens);
        allowed[from][msg.sender] = safeSub(allowed[from][msg.sender], tokens);
        balances[to] = safeAdd(balances[to], tokens);
        emit Transfer(from, to, tokens);
        return true;
    }

    // Returns the amount of tokens approved by the owner that can be transferred to spender's account
    // transferred to the spender's account

    function allowance(address tokenOwner, address spender) public constant returns (uint remaining) {
        return allowed[tokenOwner][spender];
    }

    }
}

前面的代码具有成为有效 ERC20 标准代币的 Solidity 文件所需的最小功能。一旦代码完成,您可以通过按 Remix 右侧面板上的“开始编译”按钮来运行它。编译选项卡旁边还有一个名为“运行”的选项卡,它可以帮助在TestNet上部署智能合约,如下图所示:

在您的浏览器上使用 Remix 运行的 BrowserHello_World.sol 文件

总结

在本章中,我们学习了智能合约开发、测试和部署所需的工具。我们了解了 Remix,以太坊基金会的官方在线集成开发环境;Mist,官方以太坊钱包和浏览器;以及 MetaMask,这是一款帮助以太坊智能合约开发的工具。我们学习了 ERC20 代币标准、Web3 和 Truffle 框架。此外,我们还介绍了智能合约的创建,以及在 Ropsten 上部署智能合约的各种细节。

在接下来的章节中,我们将更深入地学习去中心化应用程序和以太坊账户。我们还将深入研究挖掘、ICO、通过分叉比特币存储库创建我们自己的货币,以及我们将讨论区块链技术面临的挑战。

第十六章:以太坊账户和以太代币

在之前的章节中,我们讨论了以太坊、智能合约,以及智能合约的开发过程,包括基于以太坊区块链开发 ERC20 代币。我们还讨论了以太坊的开发过程以及在以太坊区块链上部署智能合约和代币的过程。

在本章中,我们将详细讨论以太坊账户,还将研究一种以太代币;这个讨论将帮助我们更好地理解去中心化应用。我们还将简要讨论一些热门的以太坊代币和智能合约。我们还将讨论一些重要的话题,比如交易子状态,以太坊区块的验证以及区块最终化过程中涉及的各个步骤。随后,我们将简要讨论以太坊智能合约和货币的一些缺点。

本章涵盖了以下主题:

  • 以太坊状态转换函数

  • 创世区块

  • 交易收据

  • 交易子状态

  • 区块验证

  • 以太坊代币的缺点

介绍以太坊账户

以太坊中的状态由对象组成,每个对象称为一个账户。以太坊中的每个账户包含一个 20 字节的地址。每次状态转换都是各个账户之间的价值和信息的直接交易。在账户之间或对账户进行的每次操作被称为状态 转换。以太坊中的状态转换是通过以太坊状态转换函数完成的。

以太坊区块链中的状态变化从区块链的创世区块开始,如下图所示:

每个区块包含一系列交易,每个区块都与其前一个区块链接在一起。要从一个状态转换到下一个状态,交易必须是有效的。利用共识技术进一步验证交易的有效性,这是我们在前几章已经讨论过的。

为了避免以太坊中的陈旧区块,引入了GHOSTGreedy Heaviest Observed Subtree)协议。这是为了避免任何节点的随意分叉和其他节点的不恰当验证。当两个节点同时发现一个区块时,就会产生陈旧区块。每个节点都发送区块链中的区块进行验证。这在比特币中不会发生,因为在比特币中,区块时间为 10 分钟,区块传播到大约 50%的网络大约需要 12 秒。 GHOST 协议还包括称为叔区块的陈旧区块,并将它们包含在链的计算中。

如前几章所讨论的,在以太坊区块链中有两种类型的账户。即合约账户CA)和外部拥有账户EOAs)。合约账户是具有与其关联的代码以及私钥的账户。EOA 具有以太币余额;它能够发送交易并且没有关联的代码,而 CA 具有以太币余额和关联的代码。合约账户和外部拥有账户各有其特点,新代币只能由合约账户发起。

以太坊状态转换函数

在状态转换函数中,以太坊中的每笔交易都遵循以下过程:

  • 通过确保签名有效、nonce 与发件人账户中的 nonce 匹配以及语法来确认交易的有效性和结构。如果有任何问题,则返回错误。

  • 交易费用的计算是使用燃气价格进行的,并使用签名确定发件人地址。然后,检查并相应减少发件人的账户余额,同时增加 nonce。如果余额不足,则会出现错误。

  • 为了支付交易的费用,需要使用一定数量的燃气。根据交易的大小,按字节逐步收费。

  • 在此步骤中,发生实际价值的转移。流程从发件人账户到接收者账户。如果接收账户不存在,则会创建该账户。另外,如果接收账户是合约账户,则执行合约的代码。如果有足够的燃气可用,则合约代码会完全运行,或者在燃气用尽时停止。

  • 如果由于余额不足或燃气而导致交易失败,则所有状态更改都将被撤销,除了支付给矿工的费用之外。

  • 如果有余额可用,则在支付矿工所需的费用后将其发送回发件人作为找零。函数在此时返回结果状态。

以下图表描述了状态转换流程:

该函数在以太坊的每个客户端中独立实现。

创世区块

这是以太坊区块链的第一个区块,就像比特币区块链的创世区块一样。创世区块的高度为 0。

创世区块于 2015 年 7 月 30 日被挖掘,标志着以太坊区块链的第一个区块。创世区块的难度为 17,179,869,184,如下图所示:

交易收据

收据用于存储事务执行后的状态。这些结构用于记录事务执行的结果。每次事务执行后都会产生收据。所有收据都存储在一个索引为眼树中。其根据置于块头中作为收据根。

元素

元素由四个主要元素组成;让我们在查看收据结构之前讨论以太坊事务收据的每个元素。

事务后状态

事务后状态是在事务执行后保存状态的一种 trie 结构。它被编码为一个字节数组。

已使用燃气

已使用燃气表示包含事务收据的块中使用的总燃气量。它可以为零,但不是负整数。

日志集合

日志集合显示由事务执行产生的日志条目集合。日志包含记录者的地址、日志主题和其他日志数据。

布隆过滤器

布隆过滤器是根据讨论的日志中包含的信息创建的。日志条目被减少为 256 字节的哈希,然后嵌入到块的头部作为日志布隆。日志条目由记录者的地址、日志主题和日志数据组成。日志主题被编码为一系列 32 字节的数据结构,而日志数据由一些字节的数据组成。

结构

以下是事务收据结构:

  Result: {
    "blockHash": "0xb839c4a9d166705062079903fa8f99c848b5d44e20534d42c75b40bd8667fff7",
      "blockNumber": 5810552,
      "contractAddress": null,
      "cumulativeGasUsed": 68527,
      "from": "0x52bc44d5378309EE2abF1539BF71dE1b7d7bE3b5",
      "gasUsed": 7097057,
      "logs": [
        {
          "address": "0x91067b439e1be22196a5f64ee61e803670ba5be9",
          "blockHash": "0xb839c4a9d166705062079903fa8f99c848b5d44e20534d42c75b40bd8667fff7",
          "blockNumber": 5810552,
          "data": "0x00000000000000000000000000000000000000000000000000000000576eca940000000000000000000000000fd8cd36bebcee2bcb35e24c925af5cf7ea9475d0100000000000000000000000000000000000000000000000000000000000000",
          "logIndex": 0,
          "topics": [
            "0x72d0d212148041614162a44c61fef731170dd7cccc35d1974690989386be0999"
          ],
          "transactionHash": "0x58ac2580d1495572c519d4e0959e74d70af82757f7e9469c5e3d1b65cc2b5b0b",
          "transactionIndex": 0
        }
      ],
      "root": "7583254379574ee8eb2943c3ee41582a0041156215e2c7d82e363098c89fe21b",
      "to": "0x91067b439e1be22196a5f64ee61e803670ba5be9",
      "transactionHash": "0x58ac2580d1495572c519d4e0959e74d70af82757f7e9469c5e3d1b65cc2b5b0b",
      "transactionIndex": 0
    }
    Transaction cost: 7097057 gas. 

还需注意,收据在待处理事务中不可用。

事务子状态

事务子状态是在事务执行期间创建的。此事务在执行完成后立即处理。事务子状态由以下三个子项组成。

自杀集合

自杀集合包含在事务执行后处置的账户列表。

日志系列

日志系列是一个索引系列的检查点,允许对以太坊环境外部实体的合约调用进行监控和通知。日志是对智能合约中事件的响应而创建的。它也可以用作更便宜的存储形式。

退款余额

退款余额是发起执行事务的事务中的燃气总价。

消息

消息是在两个账户之间传递数据的事务。这是在两个账户之间传递的数据包。消息可以通过合约账户CA)发送。它们也可以是已由发送者数字签名的交易形式的外部拥有账户EOA)。

消息从不存储,类似于事务。以太坊消息的关键组成部分包括:

  • 发送消息调用者

  • 事务发起者

  • 事务接收方

  • 合约账户,其代码在消息调用期间执行,如果有此目的的账户

  • 最大可用燃气

  • 燃气价格

消息是使用CALLDELEGATECALL方法生成的。

调用

CALL不会在区块链中广播任何内容;相反,它是对指定的合约函数的本地调用。它在节点中本地运行,就像本地函数调用一样。它不消耗任何 gas,是一个只读操作。调用仅在节点上本地执行,不会导致任何状态更改。如果目标账户有关联的 EVM 代码,则虚拟机将在接收到消息后启动以执行所需的操作;如果消息发送者是一个独立的对象,则调用将传递从 EVM 返回的任何数据。

以太坊区块验证

在矿工挖掘后,以太坊区块在被视为有效之前要经过几轮检查;以下是它经过的检查:

  • 所有的伯爵/叔父都必须验证其身份,考虑到叔父的 PoW 是有效的。

  • 上一个区块的存在和有效性

  • 区块的时间戳有效性,即当前区块的时间戳必须高于父区块的时间戳。此外,当前区块和父区块之间的时间间隔应不超过 15 分钟。所有区块时间都以 Unix 时间计算。

如果前面的任何检查失败,则区块被拒绝。

叔父验证

在这个过程中,伯爵或叔父会被验证。首先,一个区块最多可以包含两个叔父,其次,头部是否有效以及叔父与当前区块的关系是否满足最大深度为六个区块。

区块难度

以太坊中的区块难度与比特币区块链中的区块难度计算并行。如果两个区块之间的时间缩短,则区块的难度增加。这是为了保持一致的区块生成时间。以太坊 Homestead 版本中的难度调整算法如下:

block_diff = parent_diff + parent_diff // 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99) + int(2**((block.number // 100000) - 2))

在这个算法中,区块的难度是根据区块生成时间来调整的。根据这个算法,如果父区块和当前区块的生成时间差小于 10 秒,则难度增加。如果时间差在 10 到 19 秒之间,则难度保持不变。当两个区块的生成时间差大于 20 秒时,难度降低。难度的降低与时间差成正比。

除了基于时间戳的难度增量外,根据算法,每挖掘 100,000 个区块后,难度将呈指数增长。这被称为以太坊网络中引入的难度定时炸弹,因为这将使在以太坊区块链网络上挖矿变得非常困难。这就是为什么 PoS 是以太坊在不久的将来提出的共识机制的原因。

区块最终化

以太坊区块的最终化涉及以下四个阶段的操作:

  • 伯爵的验证

  • 交易的验证

  • 奖励的应用

  • 状态和区块 nonce 的验证

基于以太坊的代币的缺点

我们在之前的章节中讨论了以太坊及基于以太坊区块链的货币的优点和用途;现在让我们讨论一下基于以太坊的代币的一些缺点:

  • 不稳定:以太坊区块链仍在经历许多变化;这也包括将共识机制从 PoW 转移到 PoS 系统。

  • 可靠性:ERC20 代币或任何其他代币都是基于以太坊构建的。这带来了威胁,因为以太坊本身大多数时候都在频繁变化。

  • 硬分叉:依赖于另一个区块链意味着,由于硬分叉,可能会出现意想不到的问题。

  • 主权:由于代币基于以太坊区块链,对这些代币未来发展没有发言权。选择是否使用 ERC20 应该基于应用和用例。

  • 支持:在智能合约发布到区块链后,对其进行改进或需要支持的任何要求都只能在以太坊区块链上完成,并且对于区块链中提出的任何改变/改进都必须得到整个以太坊社区的批准。

  • 以太作为主要货币:尽管可以创建自己的货币、符号和供应限制,但以太仍然是以太坊区块链中使用的主要货币,因此任何时候,以太都会因为你的代币所做出的努力而得到增值。

摘要

在本章中,我们讨论了以太坊状态转换函数、起源块和交易收据。我们还讨论了交易子状态。除了这些话题之外,我们还讨论了以太坊区块验证以及所涉及的步骤,正如以太坊黄皮书中所讨论的那样。最后,我们简要讨论了使用基于以太坊的代币的一些缺点。

在下一章中,我们将讨论去中心化应用程序,并学习如何创建DApp,以及如何发布一个。我们还将讨论 DApp 的未来以及其对用户的影响。

第十七章:去中心化应用程序

去中心化应用DApps)是在去中心化网络上运行的应用程序,不受集中式权威机构的拥有或控制。它们与分布式应用程序主要在所有权方面有所不同。分布式应用程序可能在成千上万台计算机上运行,但这些计算机和运行在它们上面的软件的管理受到中央机构的控制 - 亚马逊、微软等。去中心化应用程序运行在通常是点对点网络上,并且设计得以一种使得没有任何人或组织可以控制应用程序功能的方式。去中心化应用程序不需要区块链。在区块链之前有多个去中心化应用程序:BitTorrent、Tor 和 Mastodon 都是没有使用区块链而存在的去中心化应用程序。

在本章中,我们将涵盖以下内容:

  • 去中心化应用程序的主要特点

  • 当今运营的最大的去中心化应用程序

  • 非基于区块链的去中心化应用程序

本章的目标是让您了解去中心化应用程序及其开发,以及让您了解已经存在的生态系统和代码。如果您有兴趣构建去中心化应用程序,与已经存在的生态系统的互操作性将极大地提高您的成功机会。

让我们首先看一下是什么使一个应用程序去中心化。

什么使一个应用程序去中心化

在本书的前面,我们讨论了分布式与去中心化系统。分布式系统是由许多计算机组成的系统,系统的工作分布在所有这些机器上。通常,分布式网络中的计算机被放置在不同的地理区域,以防止系统受到停电、自然灾害或军事事件等停机的影响。去中心化网络不仅在地理上分布,而且在权威和控制方面也是如此。例如,亚马逊云这样的分布式系统可能在全球范围内,但仍然受到中央机构的控制。而去中心化系统则没有中央权威。

定义去中心化应用程序

一个关于基于区块链的去中心化应用程序的知名资源是由大卫·约翰逊撰写的名为去中心化应用程序、DApps 的一般理论的白皮书。在这篇白皮书中,他确定了成为 DApp 的四个关键标准:

  1. 应用程序必须是完全开源的;它必须自主运行,并且没有任何实体控制其大部分代币。该应用程序可以根据提出的改进和市场反馈来调整其协议,但所有变更必须由其用户的共识决定。

  2. 应用程序的数据和操作记录必须以加密方式存储在公共、去中心化的区块链中,以避免任何中心化的故障点。

  3. 应用程序必须使用加密代币(比特币或其系统内部的原生代币),这对于访问应用程序和任何矿工/农民贡献价值都是必要的,并且应该用应用程序的代币奖励。

  4. 应用程序必须根据标准的加密算法生成代币,作为节点为应用程序做出的贡献的价值的证明(比特币使用 PoW 算法)。

然而,这个定义非常狭隘。大卫只考虑了在区块链上运行的去中心化应用程序,而且只考虑了可以通过代币激励的应用程序。有许多早于区块链的去中心化应用程序,并不使用或需要代币。在本章中,我们将讨论区块链和非区块链的去中心化应用程序,但重点是与区块链生态系统相关的应用程序。我们还将讨论那些虽然在去中心化网络上运行,但并不是去中心化的区块链应用程序。

对于本书,我们将使用以下四个标准来描述一个去中心化的应用程序:

  • 应用程序必须是完全开源的。

  • 应用程序必须自主运行,没有个人、组织或组织团体控制应用程序的运行。应用程序可以根据提出的改进和市场反馈调整其协议,但所有更改必须由其用户共识决定。

  • 应用程序的数据必须以公开的、去中心化的方式存储,可以进行检查,没有单一的故障点。

  • 应用程序必须提供一种方式,来调整所有关键用户群体对应用程序使用的激励。

正如你所见,这个简化的定义保留了去中心化的所有关键原则,而不依赖于区块链或代币,因为有许多方式可以构建或使用带有或不带有区块链的去中心化应用程序。当我们看到 IPFS 时,就会发现完全可以在没有区块链的情况下拥有去中心化的应用程序,并且可以有激励而不需要代币。

去中心化应用程序与区块链

去中心化应用程序是一个特定目的的去中心化系统。例如,虽然以太坊是一个去中心化网络,因为任何人都可以加入,节点都是对等的,但去中心化应用程序将在网络之上运行,为用户提供特定的服务或一组服务。在某种程度上,这种区分是没有意义的——你可以把以太坊看作是提供智能合约服务和本地代币转账的分布式应用程序。无论如何,关键的区别在于权力。

使用区块链并不意味着应用程序是去中心化的

一个单一实体或小团体对应用程序拥有更多权力,它就越是中心化的。任何一个群体对应用程序的命运和功能控制力越小,它就越是去中心化的。正如去中心化应用程序不需要区块链一样,运行在区块链上也不意味着应用程序是去中心化的。这意味着今天在区块链上运行的许多应用程序可能仍然不是真正的去中心化应用程序。即使应用程序完全开源也是如此。

为了说明,让我们考虑一个小型示例应用程序SpecialClub,用 Solidity 编写。它非常简单,只是保持一个成员列表(存储为地址),这些成员是Special Club的一部分:

pragma solidity ⁰.4.23;

contract SpecialClub {
    // Centralized owner of this application
    address public owner;
    // we set members to true if they are a member, false otherwise.
    mapping(address => bool) public members;
    mapping(address => bool) internal requests; 

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
      require(msg.sender == owner);
      _;
    }

    function approveMembership(address _address) onlyOwner external {
        members[_address] = true;
        requests[_address] = false;
        emit GrantedMembership(_address);
    } 

    function requestOwnership() external {
        requests[msg.sender] = true;
        emit RequestToJoin(msg.sender);
    }

    event RequestToJoin(address _address);
    event GrantedMembership(address _address);
}

尽管这段代码是用 Solidity 编写的,并且部署在区块链上,但它是完全中心化的。它仍然是分布式的,因为如果部署,成员列表将被公开分布到整个以太坊网络中。然而,控制权仍然掌握在一个地址上——所有者所有者地址对谁有资格被添加到SpecialClub成员名单拥有绝对控制权。任何基于此成员列表的进一步功能通常会因此而集中化。一个继续存在的优势是透明度——通过将代码和其状态都写入区块链,每个人都清楚规则和成员列表。然而,要成为真正的去中心化应用程序,该应用程序需要进行修改,以便例如现有成员可以投票决定接受或拒绝谁。

这是一个非常基本的示例:

pragma solidity ⁰.4.23;

contract SpecialClub {
    address public owner;
    // we set members to true if they are a member, false otherwise.
    mapping(address => bool) public members;
    mapping(address => bool) internal requests;
    mapping(address => mapping(address => bool)) votedOn;
    mapping(address => uint8) votes;

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
      require(msg.sender == owner);
      _;
    }

    modifier onlyMember() {
        require(members[msg.sender] == true);
        _;
    }

    function approveMembership(address _address) onlyOwner external {
        members[_address] = true;
        requests[_address] = false;
        emit GrantedMembership(_address);
    } 

    function requestOwnership() external {
        requests[msg.sender] = true;
        emit RequestToJoin(msg.sender);
    }

    function voteInMember(address _address) onlyMember external {
        //don't allow re-votes
        require(!votedOn[_address][msg.sender]);
        votedOn[_address][msg.sender] = true;
        votes[_address] = votes[_address] + 1;
        if (votes[_address] >= 5) {
            members[_address] = true;
            requests[_address] = false;
            emit GrantedMembership(_address);
        }
    }

    event RequestToJoin(address _address);
   event GrantedMembership(address _address);
}

这个版本允许如果至少有五个现有成员投票赞成,新成员可以被添加进来。虽然这样的应用程序一开始是中心化的,但在五名成员之后,所有者将不再能够对成员名单施加任何控制。随着时间的推移,去中心化的程度将增加。

主要的去中心化区块链应用程序

假设本书的读者可能正在考虑启动自己的去中心化应用项目或为现有项目做贡献。在构建新的去中心化应用程序时,重要的是要意识到已经存在的内容,以便您的应用程序可以利用现有的功能。目前有许多运行和生产的现有去中心化应用程序,并且已经经历了大量开发。一般来说,这些应用程序提供服务,以帮助其他去中心化应用程序蓬勃发展。此外,这些应用程序都是开源的。如果您评估其中一个项目并发现它缺少某些内容,则通常需要的努力较少,以便为现有功能做出贡献或贡献给其他功能。

IPFS

IPFS代表星际文件系统。IPFS 旨在成为一种可以从 Web 访问的分散式点对点文件系统。IPFS 是一个分散式应用程序,但不涉及区块链。相反,它使用了一种称为有向无环图DAG的相关技术。

典型的 Web 通信

要理解 IPFS,最好从典型的 Web 通信方式开始,然后建立区别。在普通的 Web 通信中,有两个主要角色:客户端和服务器。服务器托管应用程序、文件等,客户端连接到服务器。客户端通常不会彼此连接。如果两个客户端进行通信,它们会首先连接到服务器,让服务器充当中间人。

这种方法易于理解,并且企业已经学会了如何可靠地扩展它。企业可以转向像亚马逊网络服务这样的服务,或者使用诸如 OpenStack 之类的软件,通过增加服务器容量来处理大量流量。

然而,这种方法也非常低效。例如,想象一下,一个建筑物里有 10 个人都在自己的笔记本电脑上观看同一部电影。与其让所有 10 个客户端都访问服务器并下载 10 份副本,为什么不让每个客户端下载电影的 1/10,然后与其他人分享呢?这样可以大大降低总带宽,并且类似地提高速度。

点对点文件传输

这种由对等方下载单个文件的不同片段然后分享的方法是一种称为 BitTorrent 的技术的核心。BitTorrent 允许对等方相互交换文件和文件片段。这种方法的缺点是几乎没有动机不下载你想要的文件,然后断开连接,从而阻止其他人做同样的事情。为了避免这种情况,IPFS 从 BitTorrent 协议中汲取了灵感,并将其概括为一种称为Bitswap的技术。Bitswap 的工作方式类似于 BitTorrent,但受到了比特币及其工作证明激励系统的进一步启发。Bitswap 具有自己的激励系统,如果客户端下载并存储稀有数据——即在网络上尚不高度可用的数据——以保持全球可访问性高。

区块链项目的价值

尽管区块链提供了一种分散式的价值和数据交换方法;但并不适合存储大文件或内容,如图像和视频。考虑到现代客户和网络用户的期望,这是一个真正的问题。这些类型内容的大多数存储解决方案都是集中式的且昂贵的。有了 IPFS,分散式应用程序有了一种存储和访问这些内容而不失去分散性的方法。

Aragon

Aragon是一个围绕分布式自治组织DAO的项目。以下是 Aragon 白皮书的摘录:

  • Aragon 是一个 DApp,允许任何人在以太坊区块链上创建和管理任何类型的组织(公司、开源项目、非政府组织、基金会、对冲基金等)。

  • Aragon 实现了组织的基本功能,如股权表、代币转移、投票、角色分配、筹款和会计。通过更改章程,Aragon 组织的行为可以轻松定制。此外,Aragon 组织可以通过与组织合约交互的第三方模块进行扩展。

  • Aragon Core 是用 Solidity 编写的一组智能合约,允许分布式团队自组织,并轻松处理典型集中式组织的活动,例如处理工资单、内部仲裁等。

  • Aragon Core 中的智能合约已被其他项目使用,例如 districtOx,作为更高级功能的基础。如果你的项目涉及任何形式的分布式治理,那么研究一下 Aragon Core 是有意义的。

district0x

districtOx 网络建立在以太坊、Aragon 和 IPFS 之上。它利用了所有这些系统的能力,并为更具体的功能进行了扩展。在这种情况下,districtOx 提供了在以太坊区块链和分布式治理下以去中心化方式操作在线市场或社区所必需的核心功能。

什么是地区?

地区是建立在 districtOx d0xINFRA代码库之上的去中心化市场/社区。d0xINFRA代码库由一组以太坊智能合约和基于浏览器的工具组成,可以与以太坊和 IPFS 互动。这两个代码库相互交互,并呈现一组对于人们在中心化网络上习惯的体验至关重要的关键功能:发布和列出内容、搜索、声誉管理、支付和发票。

d0xINFRA基础上构建的每个地区都将具有这些基本功能。这一基线代码库使得未来项目更容易更快地发展成为功能齐全的产品。

以太坊命名服务

以太坊地址通常被写成十六进制字符串,例如,0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0。这对于人类来说不太可读,如果你不得不在电话中读出来,打字等等,很容易出错。替换成另一个地址也很容易,而不让别人知道。事实上,这在几次 ICO 攻击中已经发生过。以太坊命名服务,或 ENS,是一个基于智能合约的系统,用于解析人类可读名称,例如mytoken.ens到地址。通过注册 ENS 地址,以太坊网络上兼容的应用程序和钱包可以将可读名称,例如MyTokenContract.eth,映射到一个以太坊地址,类似于 DNS 将域名映射到互联网上的 IP 地址。

强烈建议通过 Ethereum 获得适当的 ENS 名称来保护任何建立在以太坊上的项目。这不仅对用户更加清晰,而且有助于防止黑客利用名称试图从您的用户那里窃取。

Civic/uPort

Civic 和 uPort 都是以太坊上的身份提供者 DApp。目前,您的身份信息通常由一个集中实体持有:政府、Facebook、Google 等等。在网络上的许多地方,您可能会被要求使用 Facebook 或 Google 进行登录。实际上,网站会联系其中一个提供者,交出身份认证,然后您就被允许登录。这样做的缺点是,您所放弃的信息受到第三方的控制和管理。如果这些提供者之一决定不再为您提供服务,或者提供虚假信息,您几乎无能为力。

Civic 和 uPort 都是身份的去中心化解决方案,在这里,身份所有者在区块链上管理他们的身份,并通过一个他们控制的服务提供者授予和撤销权限。

许多即将推出的 DApp 具有区块链行为、web 活动和移动应用程序行为的混合。通过使用这些提供商之一,您可以连接到新兴的去中心化身份生态系统,还能支持中心化提供者。

Gnosis

Gnosis是以太坊上首个重要的去中心化应用。Gnosis 提供了一个去中心化的预测市场和治理工具。预测市场可以在各个行业发挥作用,比如股票市场、事件赌博等等。通过采用去中心化的预测方法,希望这样的预测更加准确,因为市场接收了更多信息来调整预测。

作为以太坊最早的采用者之一,Gnosis 团队还致力于各种工具,比如多重签名钱包。

Steemit

Steemit是一个社交博客应用,类似于 Blogger 或 Tumblr。然而,内容、评论和投票都存储在区块链上并得到了保护。Steemit 是一个自带区块链的 DApp。其核心源自 Bitshares v2.0,但经过大幅修改以适应应用的需求。

在 Steemit 中,用户提交和投票内容也会得到奖励代币。每个用户的投票权力与他们在网络中的股份相等,被称为Steem Power。如果一个用户吸引了大量追随者,或者追随者拥有大量 Steem Power,那么奖励可能是可观的。奖励通常很小(从几分钱到几美元不等),但一些作者由于吸引了被称为鲸鱼的权力用户的青睐,已经能够获得数千美元的支付。在某些情况下,一个鲸鱼的投票本身就可能价值数百甚至上千美元。

如前所述,Steemit 不是建立在以太坊上,也不能使用 Solidity 进行编程。但是,它确实拥有一系列应用程序,这些应用程序与 Steemit 区块链进行通信,并以不同的方式对 Steemit 内容进行筛选、显示和货币化。任何考虑博客、社交媒体或类似内容应用的人都应该仔细评估 Steemit 及其代码库。所有代码都是开源的,已经创建了一些修改过的克隆版本,例如 Golos(用于俄罗斯市场)和 Serey(用于柬埔寨市场)。

CryptoKitties

CryptoKitties 是另一个基于以太坊的去中心化应用程序。CryptoKitties 是一个虚拟宠物模拟器,用户可以在区块链上购买、交易和繁殖小猫。CryptoKitties 对以太坊来说是一个重要的里程碑,因为为 CryptoKitties 开发的技术对可能使用区块链的所有视频游戏都有应用。使用类似于 CryptoKitties 的技术,玩家的装备、角色等都可以存储在区块链上。

这很重要,因为许多在线视频游戏,例如 Minecraft、魔兽世界等,都存在一些漏洞,其中游戏中的某些装备可以被复制,人们可以制作无限的克隆品。使用区块链,每个物品都被分配了一个唯一的参考,并且可以像真实商品一样跟踪和交易。

受到 CryptoKitties 的启发,许多视频游戏正在使用这些系统来创造真正稀缺和真正经济的世界,即将进入市场。

摘要

您现在应该了解去中心化应用程序和分布式应用程序之间的区别。分布式应用程序是指分布在许多服务器和系统上的应用程序,理想情况下,涉及的计算机也分布在多个地理区域,用于备份、处理和可用性。DApp 是一种没有单个公司、个人或团体控制应用程序运行的应用程序。

尽管市场上有许多区块链应用程序,但并不是所有这些应用程序都是真正的去中心化。在许多情况下,这些应用程序仅仅是通过依附于公共区块链网络来实现不同的分布式方式。如果一个公司或少数关键用户仍然控制应用程序的操作和功能,那么即使它在一个去中心化网络上运行,该应用程序也不是真正的去中心化。

您现在应该了解到目前存在的许多最大的面向区块链的去中心化应用程序,它们之间的相互关系,并且您应该能够利用这些知识来为未来的项目提供信息,并避免重新发明现有的代码。

接下来,我们将详细讨论两个最大的区块链网络——比特币和以太坊——如何在第十八章中确保网络的安全,挖矿

参考

[1] github.com/DavidJohnstonCEO/DecentralizedApplications

第十八章:挖矿

在之前的章节中,我们讨论了工作证明PoW)共识系统以及挖矿的重要性。我们还讨论了比特币和其他替代币,以及矿工在 PoW-based 硬币中发挥的重要作用。

在本章中,我们将深入讨论挖矿,以及基于 PoW 的硬币和代币中挖矿的必要性。然后,我们将讨论挖矿池以及它们如何给挖矿生态系统带来革命。此外,我们将继续学习如何使用现有的各种矿工开始挖矿。我们将深入了解 CPU 和 GPU 挖矿,以及研究搭建挖矿设备和双挖概念。最后,我们将研究每一种可用于挖矿的 PoW 算法,并讨论基于可用硬件资源而选择的最佳算法。

在本章中,我们将涵盖以下主题:

  • 挖矿过程及其阶段

  • 挖矿算法

  • 各种类型的挖矿硬件

  • 矿工类型

  • 挖矿设备

  • 挖矿池类型

  • 挖矿软件

加密货币挖矿

加密货币挖矿由全节点执行,这些节点是区块链的一部分;挖矿仅由具有基于 PoW 的共识系统的区块链执行。交易由共识系统确认,并创建这些交易的区块以添加到区块链中;一旦新区块被添加到区块链中,通常被称为找到区块,就会有一定的奖励,这是给予矿工的,因为他们执行了将区块添加到区块链中的任务;不过,这个过程并不简单。在添加区块之前,必须执行一个资源密集型的验证过程来验证交易。资源密集型任务基本上就是与货币相关的某些算法的哈希。

由于区块生成时间保持在约 10 分钟左右,当矿工的散列功率增加时,难度必须以相同的比例增加。这是通过难度调整和重新定位算法来完成的,如前几章中所讨论的。

当矿工连接到网络时,有各种任务需要矿工执行以跟上网络。每种货币对矿工都有不同的规格;以下是比特币环境下矿工执行的一些主要任务:

  • 交易验证:这是通过验证签名和输出来验证交易的过程。

  • 区块验证:一旦验证了块中的每个交易,就会验证随机数,以完成区块验证过程。

  • 新区块创建:矿工可以通过在网络上验证的交易后,将那些不属于任何其他区块的交易添加到区块链中的较高高度来创建新的区块。

  • 工作量证明算法解决方案:在任务中,矿工通过解决所需算法找到区块的上链:比特币中使用 SHA256。区块头部包含一个 32 位的随机数字段,矿工必须使用暴力破解技术对其进行散列,直到哈希匹配。

  • 支持奖励系统:当一个节点对算法进行散列时,结果会通过区块链网络发送。完成后,网络中的其他矿工会验证区块,以确保区块中的交易高度不与任何先前区块冲突。一旦网络接受了区块,矿工将以货币形式获得一定的奖励。

让我们详细讨论每个步骤,以及挖掘加密货币涉及的过程。

挖矿过程

挖矿主要在 PoW(工作量证明)基础上的区块链中进行,但正如前文讨论的那样,PoW 并不是仅有的共识系统;还有各种其他共识机制。然而,PoW 是加密货币中最广泛使用的共识系统。

PoW 的概念早在其在比特币中的使用之前就存在了。这些系统先前用于限制拒绝服务攻击,垃圾邮件以及当前系统中持续存在的其他与网络相关的问题,因为它们要求请求者在提供所需服务之前提交计算工作的证明。这使得此类与网络相关的攻击变得不可行。

为了使 PoW 系统足够具有成本效益,请求者执行的计算任务应该具有适度的难度,但对于服务提供方来说却很容易进行检查。Hashcash 是最早开始使用基于 PoW 的协议利用 SHA-256 算法的系统之一。用户必须在提供所需服务之前提交计算数千个哈希操作的证明;这反过来限制了 DoS 和垃圾邮件攻击。

比特币也使用 SHA-256 散列算法,尽管这是一个随机算法,但其性质是确定性的,这意味着对于任何给定的输入,输出都将始终相同,并且可以轻松通过使用相同算法和相同输入的任何人进行验证。

在加密货币挖矿中,矿工需要两样东西来获得 SHA-256 散列算法的输入:

  • 新生成区块的头部

  • 随机数(Nonce

矿工使用暴力破解的方法,直到哈希输出与难度目标匹配;这是一个作为上限的 256 位数,而且 SHA-256 的输出必须低于或等于当前区块的难度目标,以便网络接受该区块。例如,这是比特币区块链上第528499高度的一个区块的哈希:

00000000000000000021524523382d300c985b91d0a895e7c73ec9d440899946

每个区块中的第一笔交易是挖矿奖励,因此在交易中没有要从中扣除资金的输入地址,这些是创建为区块链网络的一部分的硬币。这种独特类型的交易称为 coinbase 交易。此外,在比特币区块链中,coinbase 交易中创建的硬币在区块链中至少接收到 100 次确认之前无法花费。由于区块时间为 10 分钟,100 次交易大致需要 16 小时 40 分钟。coinbase 交易只能在矿工自己的地址上发生。

算法

比特币使用 SHA-256,但在 PoW 共识类型中可以使用各种算法,以下列出了一些这些算法,并在下一张截图中进行了说明:

  • base Quark: Dimecoin, AnimeCoin

  • CryptoNight: AeonCoin, Monero

  • Dagger-Hashimoto: Ethereum, Krypton

  • Equihash: Zcash, Komodo

  • Groestl: AidBit, GroestlCoin

  • Keccak: 365Coin, Wecoin

  • Lyra2RE: Lyrobar, MondaCoin

  • SHA-512: MemoryCoin, ProtoShares

  • NeoScrypt: Feathercoin, Ufocoin

  • NXT: CoinoIndex, SuperNet

  • Scrypt: Litecoin, Dogecoin

  • Scrypt-jane: QQcoin, ThorCoin

  • Scrypt-N: Caishen, Elacoin, GenesisCoin

  • Skein-SHA2: SkeinCoin, XedoCoin

  • X11: Dash, Chipcoin, Karmacoin

  • X13: Cloakcoin, Zipcoin, PioneerCoin

  • X15: CrystalCoin, Halcyon, HTML5coin

  • Yescrypt: BitZeny, GlobalBoostY

每个算法都对其他算法进行了特定的修改。

挖矿硬件

加密货币挖矿社区经历了许多创新和阻力并进,以照顾区块链的核心原则。挖矿可以使用家用计算机和专用硬件完成。常用于加密货币挖矿的硬件类型在以下部分中讨论。

基于 CPU 的挖矿

这是官方比特币客户端中提供的第一种挖矿类型。在比特币的最初阶段,家用计算机能够挖矿。随着更强大和专用硬件的出现,比特币挖矿不再是挖掘比特币的首选。其他硬币仍然支持 CPU 挖矿,但随着时间的推移,这些类型的硬币的难度增加,挖矿也变得不可行。

基于 GPU 的挖矿

由于区块链网络的难度随时间逐渐增加,CPU 挖矿变得不可行,有时使用 CPU 挖矿变得不可能。考虑到这一点,矿工开始使用 GPU,因为它们提供更快速和更高并行处理能力。GPU 制造公司如 AMD 和 Nvidia 定期发布新硬件,除了游戏性能外,这些硬件还能产生出色的挖矿结果:

基于 FPGA 的挖矿

现场可编程门阵列FPGA)包括在制造后可以配置的集成电路。配置的编程使用硬件描述语言HDL)指定。可编程设备可以在不拆卸设备的情况下进行修改;该设备包含一系列门阵列,用于创建真值表,以便从数据流中计算输入,如下面的截图所示:

由于 FPGA 支持核心的并行性,据称其效率是基于 GPU 挖矿的十五倍。

基于 ASIC 的挖矿

特定应用集成电路ASIC)矿工比基于 CPU、GPU 和 FPGA 的矿工要好得多,因为它们设计用于执行一项特定任务,即加密货币的挖矿。下图是一台 Algorithm-specific 的 ASIC 矿机:

这些硬件专门设计用于产生高散列率。有各种知名公司生产一些性能最佳的矿工,如比特大陆、阿瓦隆、蚂蚁矿机等。

矿工类型

如今有两种类型的矿工——根据是自行获取硬件,还是在线购买散列功率来进行分类。

云挖矿

在这种类型的挖矿中,矿工不拥有硬件,而是远程从其他矿工那里购买散列功率。云挖矿相比自购硬件有各种优点,如低门槛入门和风险较小。对于想投资加密货币但不想从交易所购买或者没有足够的技术知识的人来说,这是他们最好的选择。现在有许多组织在各个地方设有大型数据中心,可供人们购买基于 GPU、ASIC 或 FPGA 的矿工。其中一些组织有 Genesis Mining、SkyCoinLabs、Nicehash、hashflare 等。

硬件挖矿

爱好者总是对设置自托管硬件进行挖矿感兴趣;可以通过高端家用计算机进行挖矿,或者获取 ASIC 或 FPGA 设备。如今,人们还在设置专门的挖矿设备,可以连接多个 GPU、ASIC 或 FPGA 到一台机器。人们通常通过购买扩展机箱,然后将多个硬件连接在一起来自行搭建一个矿机以达到所需的结果。矿机最好的一部分是可以添加更多硬件,并尝试新的 ASIC,以查看是否实现了预期的结果。

挖矿设备

由于很多 GPU 或 ASIC 器件被串联在一起,它们往往会产生大量热量,因此有必要保证有适当的空气流通。以下是一个基本矿机的要求,任何人都可以自行搭建:

  • 主板:需要专门的主板,可以支持多个 PCI-E 插槽,用于连接多个 GPU。

  • 硬盘:最低容量的硬盘就够了,但最好选择 SSD 以获得更好的性能。

  • 内存:挖矿机至少需要 8 GB 或 4 GB 的内存,因为挖矿更多是计算密集型工作。

  • GPU、ASIC 或 FPGA:这些是挖矿机中最重要的组件,可以选择任何一种配置,如基于 GPU 的挖矿机或基于 ASIC 的挖矿机或基于 FPGA 的挖矿机。也可以尝试在挖矿机上混合使用所有这些设备,以找出哪种设备能产生最高的结果。

  • 机箱:由于大量的计算设备连接在一起,它们往往会产生大量热量,因此需要适当的机箱将它们连接在一起;机箱内部的气流应该是足够的,因为大量的热量可能导致硬件的损失或系统资源的减少。

  • 电源供应:台式电脑中的标准电源无法在挖矿机中使用;多个 GPU 需要大量的电力,因此需要一种能够支持如此大量电力的电源。

现在也可以购买预构建的挖矿机;这些挖矿机是即插即用的类型,无需设置。以下是一些最常用的预构建挖矿机:

  • 鲨鱼挖矿:这是一家知名的供应商,创建支持多种加密货币挖掘的基于 GPU 的挖矿机。他们提供各种选项,从紧凑型到大型挖矿机。

  • 挖矿洞穴:他们有适用于 Nvidia 或 AMD 基于显卡的各种挖矿机的选项:

挖矿矿池

随着越来越多的矿工开始挖矿,货币的难度逐渐增加。矿池是一群矿工聚集在一起挖掘一个区块,一旦成功挖掘了区块并获得了奖励,奖励将分配给在矿池中挖矿的矿工;奖励的支付方式有很多种,我们将在下一节讨论这些方法。之所以有各种奖励分配方法,是因为哈希是一种纯粹基于蛮力的机制,因此对于任何矿工来说,找到正确的随机数并成功地提交一个区块进入区块链过程,都是纯粹的运气,因此如果他们的哈希和挖矿工作没有计入,其他矿工就会感到不公平。因此,奖励是根据哈希算力来分配的,但仍然有各种方法来精确计算每个矿工的份额。

每份矿工支付 - PPS

PPS 是一种将风险转移到矿池的方法。对于矿工来说,这是最受欢迎的方法,因为他们根据他们挖掘的哈希份额数量得到支付;每个挖掘的份额的奖励都是有保障的,现在很少有矿池支持这种系统。矿工从矿池的现有货币余额中得到支付。

比例分配 - PROP

这被称为比例方法,顾名思义,在这种方法中,奖励根据每个矿工找到的区块份额的数量按比例分配给矿工。

每份最近 N 份分享报酬 - PPLNS

PPLNS 类似于比例方法,不过在这种方法中,不管矿工贡献的总份额有多少,最后的N份份额都是重要的。

双几何方法 - DGM

DGM 是一种混合方法,风险在矿池和矿工之间分配。在这种情况下,在进行短期回合时,矿池获得一部分挖矿奖励,而长期回合进行时将返回相同的奖励。

分享最大每份分享报酬 - SMPPS

SMPPS 类似于 PPS,但矿池在单个回合中不会支付超过向矿池奖励的总硬币。这消除了矿池在 PPS 方法中所承担的风险。

均衡共享最大每份分享 - ESMPPS

ESMPPS 类似于 SMPPS;它在参与本回合挖矿的所有矿工之间平均分配支付。

最近的共享最大每份分享 - RSMPPS

RSMPPS 类似于 SMPPS,但这种方法首先优先考虑最近的矿工。

限制的每份最大分享与最近回溯支付 - CPPSRB

CPPSRB 采用了最大每份分享的方式,以便考虑到矿池不需要备用资金时,使用区块奖励的收入支付给矿工最大奖励。

比特币合并挖矿 - BPM

BPM 也被称为斯拉什系统,因为它最初是在名为斯拉什矿池的矿池中使用的。在这种支付计算方法中,从区块轮开始的旧份额与最近的份额相比重要性较小。由于社区成员开始报告矿工能够在回合进行时切换矿池,因此引入了这种系统。

针对目标支付 - POT

POT 是一种基于高方差的 PPS 支付系统,根据矿工向矿池返回的工作难度而不是整个矿池矿工挖掘的工作难度进行支付。

SCORE

这是一种比例奖励系统,根据提交份额的时间来计算。该流程使较晚提交的份额比较早提交的份额更有价值;这些份额按时间打分,以及将分别给予个别矿工的奖励基于得分比例而不是系统中提交的份额。

除此之外,矿池和社区仍在提出各种新的奖励系统;诸如 ELIGUIS、Triplemining 等系统仍然存在并被各种开发人员使用。

流行矿池

目前有各种各样的矿池存在,并且任何人都可以成为感兴趣的矿池的一部分并立即开始挖矿。矿池可以支持任何加密货币或同时支持多种货币。以下是矿池列表,以及它们支持的货币:

  • BTC.com:这是一个总部位于中国的矿池,是 Bitmain 组织的一部分。它支持比特币和比特币现金。

  • Antpool:Bitmain 组织拥有的另一个矿池。它支持比特币、莱特币、以太坊、以太坊经典、Zcash、Dash、比特币现金、Siacoin、门罗经典和 Bytom。

  • BTC.TOP:一个总部位于中国的支持比特币的矿池,截止目前。

  • SlushPool:世界上第一个矿池,也是迄今最可靠的矿池。它挖掘约占所有比特币区块的 3%。它支持比特币和 Zcash。

  • F2Pool:一个总部位于中国的矿池,支持比特币、莱特币、Zcash、以太坊、以太坊经典、Siacoin、Dash、门罗币、门罗经典、Decred 币、Zcoin 和 Aion 币等多种货币。

  • ViaBTC:一个针对中国矿工的总部位于中国的矿池。它支持比特币、比特币现金、莱特币、以太坊、以太坊经典、Zcash 和 Dash 等货币:

图片

除了列出的矿池外,还有各种其他矿池,有些支持单一币种,有些支持多个币种。其中一些是 BTCC、Bitfury、BW Pool、Bitclub.network、Suprnova、minergate 等等。下图显示了比特币网络的算力分布,可以在 www.Blockchain.info/pools 找到:

图片

挖矿软件

挖矿硬件负责挖矿过程,但拥有高效的软件也很重要,以获得最佳结果并消除任何瓶颈。

挖矿软件的任务是在网络上分享硬件的挖矿任务。除此之外,它的任务还包括接收来自网络上其他矿工的工作。根据硬件运行的操作系统,有各种挖矿软件可供选择,如 BTCMiner、CGMiner、BFGMiner、Nheqminer 等等:

图片

挖矿软件应基于操作系统、硬件类型和其他因素进行选择。大多数挖矿软件是开源的,并且有大量积极的社区,以帮助矿工选择适合可用硬件的正确软件并澄清任何疑问。

总结

在本章中,我们学习了加密货币的挖矿;从研究各种算法开始,我们讨论了挖矿硬件及其各种类型。然后,我们讨论了挖矿矿池,矿池如何将奖励分配给矿工以及目前各种流行的矿池。

在下一章中,我们将讨论首次代币发行ICO),这是为推出的代币或货币筹集资金的过程。ICO 是区块链社区的重要组成部分,并帮助区块链项目的利益相关者从社区本身筹集资金。

第十九章:ICO 101

ICO 代表 首次代币发行,也称为 代币销售首次代币发售。ICO 是一个事件,新的区块链项目通过向潜在买家提供网络代币来筹集资金。与 IPO 不同,没有股权出售。买家在网络上收到代币,但不拥有底层项目的知识产权、法律所有权或其他传统的股权特征,除非作为销售的一部分明确承诺。如果有的话,获利的预期来自持有代币本身。如果新网络的使用需求增加,那么拥有代币的价值也将相应增加。

在本章中,我们将介绍 ICO,它们是如何产生的,以及作为执行的关键方面。ICO 仍在不断发展,但许多事件和可交付成果已成为预期甚至是成功所必需的。

第一个 ICO 是由 Mastercoin 在 2013 年开发的。Mastercoin 认为他们的代币,如比特币,会增值,至少有一些人同意。Mastercoin 进行了一个为期一个月的筹款活动,最终筹集了约 50 万美元,而后来 Mastercoin 的整体市值增长到了高达 5000 万美元。无需通过传统渠道就能筹集大量资金的能力开始引发一系列活动。

第二年,以太坊网络诞生并举行了其代币销售。随着这个网络的诞生,推出新代币的难度大幅降低。一旦以太坊网络稳定并建立了临界质量,ICO 就开始定期举行。在接下来的两年里,ICO 的频率越来越高。

一些值得注意的早期项目包括:

  • Ethereu****m:1800 万美元

  • ICONOMI:1006 万美元

  • Golem 项目:1000 万美元

  • Digix DAO:550 万美元

图片

2017 年,ICO 的速度加快,筹集的资金也增加了。以下是 2017 年的一些重要项目:

  1. Filecoin:约 2.57 亿美元

  2. Tezos:约 2.36 亿美元

  3. EOS:约 2 亿美元

  4. Bancor:约 1.53 亿美元

现在已有超过 1500 种加密货币,而且还有更多新项目定期发布。每个月发布的新项目约有 100 个左右。本章我们将涵盖以下主题:

  • 当前 ICO 市场的现状

  • ICO 活动的典型方面

  • ICO 和区块链项目存在的问题

当前 ICO 市场的现状

早期 ICO 市场和当前行业状况之间的差异显而易见。起初,只有少数几个 ICO,并且这些 ICO 是由相对在区块链社区内较为知名的团队举办的,他们在进行 ICO 前花费了相当多的时间和精力来实现一个项目。以太坊的推出后,进行 ICO 的准入门槛大幅降低,新代币的数量激增。

ICO 数量不断增加

在以太坊网络之前,大多数 ICOs 都是针对新的区块链的。有了以太坊,代币现在可以使用智能合约来启动,而不是从头开始创建整个区块链基础设施。有关如何实现这一点的更多信息,请参阅有关 Solidity 和智能合约的章节(请参见 Chapter 13, Solidity 101,和 Chapter 14, 智能合约)。

目前,2018 年有望产生超过 1,000 个新的 ICOs:

  • ICOs 的募集资金总额不断增加

  • 非常大规模的资金筹集变得越来越少见

  • 现有公司开始进行 ICO

ICO 活动的典型方面

大多数 ICOs 的营销活动都有一个典型的轨迹。这些活动存在的目的是吸引对公司的兴趣和投资,并向全世界展示项目。

白皮书

对于大多数项目来说,最关键的部分是白皮书。项目白皮书介绍了项目的目的,它试图解决的问题,以及它如何解决这些问题。

一份好的白皮书会讨论代币和市场的实用性。大多数白皮书的关键部分包括:

  • 项目介绍

  • 市场和先前解决方案的历史

  • 使用区块链介绍新解决方案

  • 代币的实用性和代币经济学

  • 未来的应用和协同效应

  • 解决关切和风险

  • 团队和团队背景

  • 总结

大多数白皮书都会包含这些部分,以及其他部分,具体取决于项目的性质和目标市场。白皮书将被广泛用于所有未来的营销活动,因为它将成为幻灯片演示、提案等的信息来源。

私募

私募是将大块代币出售给私人投资者的艺术,通常是在这些代币在公开市场上可用之前。这种做法有很多原因。首先,私人投资者往往更加复杂,能够进行大额购买。一个成功的、有成功记录的、知名投资者的真正参与,尤其是那些创业风险最高的购买,将会鼓励未来的购买。

私人买家在很多情况下会提供早期资金,如果他们真的相信团队的实力,甚至可能在白皮书最终确定之前就提供资金。此外,在许多司法管辖区,包括美国,在法律不确定的环境中,认可的大型投资者也享有特殊的法律地位。这种地位使得在面对 ICOs 的不确定法律环境中向他们出售资产要安全得多。

私募可以通过多种方式进行:

  1. 创始人要么已经认识,要么认识高净值个人或组织,他们进行私募购买,比如家族办公室

  2. 创始人雇用能够将他们与私人买家联系起来的顾问

  3. 项目在投资之前就已经产生了足够的关注和兴趣,以至于买家主动寻找它们

如果创始人没有广泛的人脉,他们需要尽可能地建立人脉。这可以通过参加会议、发表演讲、参加聚会和建立真正的人际关系来实现。这个过程可能需要很长时间,鼓励创始人立即开始这项活动。即使在公司成立之前,这样的人际关系也应该有所发展,如果你甚至考虑过区块链初创公司或 ICO。同样重要的是建立真正的关系——一旦这些人投入,他们实际上就是合作伙伴。他们的成功就是公司的成功,所以他们将非常有动力地帮助推广公司。同时,公司的失败也是他们的失败和损失,所以他们希望对创始人的能力有很强的信任。这样的关系很少是一夜之间建立起来的。

进行这个过程的下一步是找到合适的顾问。拥有投资者资源的顾问希望得到报酬,通常是提前和筹集的一部分。太多人想要接触投资者,所以没资源的人没必要打扰。此外,这些顾问必须对项目有信心。顾问把投资人引入糟糕的项目会失去对该投资人的影响力,影响他们的关系。因此,负责任的顾问会拒绝引入项目,直到这些项目真正做好了投资准备。

私募销售发生的最后一种方式是项目在公开市场得到足够的关注,投资者主动寻求该项目。因为项目的炒作与代币价格强相关,所以购买高度炒作和公关的代币被认为是更安全的投资。聪明的投资者仍然会对项目和团队进行严格的审查,但这种早期的迹象使事情变得更容易。

许多团队开始他们的筹资方法是通过私人配售轮。在少数情况下,这可能是团队所需的一切。

进行私募配售的知名基金有 Crypto Capital Group、Digital Currency Group、Blockchain Capital、Draper Associates、Novotron Capital 和 Outlier Ventures。

预售

代币预售通常是在公开代币销售的官方启动日期之前进行的。它处于私人配售和完全公开销售之间。代币通常以某种折扣价出售,而且可能存在比公开销售更高的最低购买金额。

与私人配售一样,预售在购买者方面通常有一定的限制。如果一个项目能够建立一些社区参与度,预售通常首先提供给该社区。

例如,如果每个代币的公开销售价格是$0.10,最低购买额为$300(或等值的以太币或比特币),私人预售价格可能是$0.08,但最低购买额为$1,000。

良好的预售实践

在理想的世界中,进行预售的代币项目应该具备以下条件:

  • 准备好测试和使用的演示或 Alpha 版本

  • 一个成熟的社区

  • 一个经过充分补充的团队,拥有适当的背景

  • 已采取强有力的网络安全措施,以防止盗窃

  • 获得法律意见和适当的监管合规性

  • 设置系统 24/7 监控所有通信,以防止欺诈和不良行为者侵入预售

  • 具备强大的营销团队和营销计划

  • 一个周密的资金使用计划

  • 对筹款设有清晰合理的硬顶,无论是一般的还是预售的

拥有所有这些特点的项目在成功的预售中处于更有利的位置。而有著名的私人投资者或背后的基金支持的项目则具有额外的优势。

公开销售

公开销售是 ICO 的最终阶段。到此时,团队应该在社区建设、早期筹款、公关活动(见下文)等方面花费了大量时间。这一切的原因是,最成功的 ICO 往往非常快速,数分钟或数小时内就销售一空。有三种主要的不同销售结构方法。

定价销售

定价销售是最常见的 ICO 结构。在定价销售中,通常设有软顶和硬顶。软顶是团队为建设项目寻求的最低筹资额。硬顶则是作为筹资的最大接受值。一旦代币销售开始,通常会按先到先得的原则执行。代币以预设的价格出售。在某些情况下,该价格可能包括奖金。例如,前 20 名购买者(或前$20,000)购买的代币数量将获得 10%的奖金。随着销售的进行,奖金会下降。此结构旨在奖励初期行动者,并激发 FOMO(害怕错过)。

无上限销售

无上限销售旨在尽可能筹集资本。方法是确定销售时间和通常的代币数量。随着人们的投资,他们将获得与其投资总额相等的代币份额。每个人会收到的代币数量通常直到 ICO 结束都不能确定。例如,如果在第一天,一名投资者投入了$10,000,并且没有其他竞标,那么他们将拥有所有可用的代币。然而,第二天,另一名投资者也投入了$10,000。如果这是销售的结束,那么这两名投资者将分别拥有可用代币的一半。

就像定价销售一样,还有许多变体。EOS 代币销售可能是最知名的无上限销售的版本。EOS 代币在 341 天内销售,每天都有更多的代币可供购买。

荷兰式拍卖

荷兰式拍卖是 ICO 提供的最罕见形式之一,但也是最公平的形式之一。荷兰式拍卖从高价开始拍卖,价格逐渐下调,直到参与者加入或达到预留价格。反向荷兰拍卖从低价开始,然后在固定间隔时间内慢慢提高价格。无论采用哪种方式,只要有足够数量的买家,都能够找到一种适当的令牌市场价格。使用荷兰式拍卖方法进行最著名的 ICO 项目是 Gnosis 项目。

Gnosis 团队并不打算出售总代币的固定百分比。相反,释放的代币数量会随着拍卖时间的延长而增加,直到达到售出 9 百万美元 GNO 代币或筹集 1250 万美元的上限。尽管拍卖设置旨在减缓参与活动,但售卖时间不到 15 分钟就结束了。

影响者营销

区块链是一种新技术,初创公司本质上是相当具有风险的。由于这两个原因,投资者经常寻求已建立的领域专家的意见、建议和观点。在这个新领域,专家通常是一些知名人士,或者最近公开发表了一些准确的预测。

在社交媒体时代,出现了许多 YouTube 频道、播客和其他组织,它们充当 ICO 生态系统的守门人和评论员。这些成功的节目中,有超过 10 万名对加密货币和 ICO 项目感兴趣的订阅者。

因此,成功的 ICO 非常有动力上这些节目以提高他们项目的知名度。反过来,这些节目的运营商可以根据市场情况收取任何数量的费用来获得曝光。对于高曝光的节目和播客来说,单次露面收取 5-20,000 美元美元的费用并不罕见,费用可以用法定货币、加密货币和项目代币的组合来支付。

公关活动

主流媒体的关注对每个项目都有帮助。公关可能是 ICO 营销中最耗时的环节之一,因为很少有 ICO 团队拥有必要的媒体联系。公关代理可以提供帮助,但往往价格昂贵。不管是否使用公关代理,ICO 在开始之前应该先仔细安排好其他一切。主流媒体的关注将带来很多关注,这也意味着会有更多的人寻找缺陷。一个精心执行的白皮书、稳固的网站、一个良好清晰的计划和出色的团队简介都是重要的。

一般情况下,一旦项目稳固,就应该开始一些公关活动。通常来说,较小的场所和出版物会更受欢迎。一个聪明的 ICO 团队将与当地媒体、本地播客、区域性商业中心、通讯等等开始合作。一旦 ICO 有了一些媒体曝光,就会更容易吸引更大的出版物。

当然,这种公关活动需要与内容营销和社区建设活动相辅相成。

内容营销

ICO 通常至少有一人,通常是整个团队,至少在某种程度上进行内容营销。内容营销的目标是提供有关项目、其目标以及它将如何影响世界的信息,通常与销售无关。内容营销通常通过公司博客和平台进行,比如 Medium 或 Steemit,这些平台上会有许多可能通过不同文章介绍项目的普通用户。

内容营销的另一个方面是社交内容——Twitter、LinkedIn 帖子、Facebook 等。其目的是相同的——与可能不会得知该项目的人建立联系,并建立一种联系、信任和目的感。

内容营销通常发布来自团队成员,不管他们是否实际写下了内容。这有助于让团队显得可接触且真实——当一些 ICO 欺诈项目虚构团队成员时,这是一个严重的问题。

良好的内容营销还有助于推动社区的增长和参与度。拥有出色内容营销的 ICO 团队比没有的团队更有可能取得成功。

ICO 评论者

随着 ICO 营销的增长和项目数量的增加,市场开始寻找更好的评估项目的方式。许多公司纷纷涌现,提供 ICO 项目的公正评价。自封的专家们会根据不同的标准评价项目,以推荐项目在技术和投资成功方面的优劣程度。然而,许多项目已经开始向评论者支付费用,或者至少提出支付费用,以获取更高的评级。

虽然有很多 ICO 评级网站,但目前最知名的是ICOBenchICORating。许多项目都在努力获得这些网站的高分,以便将评级纳入其营销材料中。这些评级是否准确仍在讨论中,并且可能会发生变化。然而,ICO 能获得的每一个信任标志都一定会有所帮助,所以许多项目都在努力(公平或不公平地)获得良好的评级。

智能合约和原型开发

在 ICO 狂热的开始阶段,项目通常只需要白皮书、一个团队和一个涉及区块链的想法就能筹集资金。很快,许多项目筹集了资金,但要么失败,要么卷入了漫长的法律纠纷。因此,市场变得更加成熟,越来越多的投资者希望在购买 ICO 之前看到一定程度的工作原型。在许多司法管辖区中,拥有一个实际运作的产品使得实用性代币与证券代币的情况更具有可能性,并减少了后期法律问题的潜在风险。

原型的需求对于资金不足或非资助项目而言构成了一个准入壁垒,使它们更接近于传统的与风险投资公司和天使投资者筹款。在许多情况下,这些项目需要在进行 ICO 之前获得天使或种子资金。

由于原型的需求,一些公司已经开始提供区块链原型设计服务,他们与没有自己的开发团队的业务利益相关者合作,建立可以推向市场的东西。

根据所使用的区块链系统的不同,还需要进行智能合约和代币开发工作。特别是在以太坊中,需要进行仔细的测试,因为一旦部署,代码就是不可变的——错误无法修复。

代码审计

对于许多以太坊的 ICO 项目,最后一步之一是代码审计。在代码审计中,会引入信任的第三方来检查代码是否存在可能的安全问题或违反最佳实践。通常,这种审计会公开发布,同时发布修复任何重要问题的更新代码。

赏金活动

赏金活动是指项目承诺以其本地代币支付服务的情况。这些服务通常在某种程度上是推广性的,例如将白皮书翻译成不同语言、在 Medium 或 Steemit 上撰写文章,或者其他有助于传播消息的任务。通过提供赏金,团队既传播了代币(从而传播了生态系统),又激励人们宣传该项目。毕竟,通过持有代币,执行赏金的人如果项目成功将受益。

对于什么可以、什么不能成为赏金没有真正的限制。对于每个团队来说,重要的是确保执行赏金的人得到奖励,否则很容易把支持者变成敌人。

空投

空投是一种推广方法,团队向网络上符合特定条件的所有账户发送免费代币,通常涉及最低余额和活动要求。空投旨在实现两个目标:提高对项目的认识和兴趣,并为生态系统建立用户群。

空投变得流行的原因之一是它们也被视为一种在没有被视为证券的情况下分发代币的方法,因为没有金钱交易。这种方法在法律上仍未经测试。

路演

路演是指一个项目的核心团队从一个会议到另一个会议,再到世界各地的其他活动中宣传他们的项目。目标是将项目展示给尽可能多的人,并与尽可能多的投资者和其他影响者见面。路演是耗费精力和金钱的,但对于项目获得强大的投资者支持通常是必要的。许多投资者,尤其是大投资者,希望了解创始人,并看看他们是什么样的人。如果投资者和影响者对项目领导层有强烈的信心,他们更有可能投资。通过面对面建立关系是一个方法,对于许多项目来说,与投资者见面的最简单方法是通过参加多个活动,有时是几个月的时间。理想情况下,这个过程应该在 ICO 之前很长时间开始,以便项目团队成员有足够的时间建立这些关系,并在不显得贫乏或索要钱财的情况下获得对想法的反馈。

ICO 和区块链项目存在的问题

ICO 市场正在经历成长的痛苦。作为一个全球性的、大部分不受监管的市场,存在着许多传统筹资所不存在的问题和挑战。对 ICO 项目进行了许多批评。

产品市场适配和吸引力的证明

在更传统的由风投支持或自筹资金的项目中,项目必须通过某种形式的营销来证明其价值是必要的。通常情况下,这将涉及到拥有客户、收入和增长,如果不是盈利的话。然而,对于 ICO 项目来说,资金是在大多数项目推出或展示 MVP 之前筹集的。在许多情况下,根本没有证据证明团队的交付能力。因此,ICO 买家无法确信项目能否成功地解决市场上的真正问题。

所有这些脆弱项目的结果是高失败率。bitcoin.com 的一项调查发现,仅在 2017 年,几乎一半的项目已经失败、停止运营或仅仅消失了。

低准入门槛

ICO 吸引人的一个原因是,传统的风投资金对世界上大多数地方来说都非常难以获得。如果一个人不住在纽约市、旧金山或其他一些主要的技术中心,那么他们接触到严肃的投资者网络的可能性就要小得多。通过 ICO,任何人、任何地方都有可能尝试吸引早期投资。然而,缺点是,进行投资的尽职调查水平和技能可疑,可靠信息的数量也很少。

一个 ICO 通常以白皮书的发布开始,这是一份相对简短的文件,概述了网络的价值、代币和未来计划。由于技术是新的,并且典型的 ICO 活动时间较短(3-4 个月),投资者几乎没有机会进行广泛的尽职调查。此外,因为基于区块链的初创企业不需要展示财务状况(因为他们没有任何财务状况)、牵引力或产品市场契合度(因为还没有产品),所以很难基于哪些数据进行评估。

随着时间的推移,对评估区块链初创企业和 ICO 的一致标准可能会逐步形成,但当前尚不存在。

一个项目是否真的需要区块链?

由于准入障碍低且可用资本数量巨大,公司要尽可能进行 ICO 会面临巨大的财务压力。能够筹集大量资本而不发行股权,并且没有明确定义的法律义务,这一机会被视为绝佳,不容错过。

在许多情况下,项目并不真正需要区块链或代币。事实上,除非区块链的特性对项目绝对至关重要,否则没有区块链会更便宜、更容易前进。要求区块链,项目将需要充分利用区块链功能:去中心化治理、不可变性、真实数字稀缺性等。同样,将代币发布在公共区块链上的项目必须牺牲隐私和速度。任何评估区块链项目的人务必记住这些问题。

误导性代币实践

尽管 ICO 和 IPO 在名称上相似,但区块链代币与公司股份之间实际上没有真正的联系。持有由公司支持的区块链代币不提供对公司利润、行为或业务的所有权、影响或权利。代币的价值完全由网络本身的价值以及网络所能实现的内容驱动。此外,如果一家公司创建了一个区块链项目然后放弃了它,代币持有者可能无法申诉。

因此,代币释放方式对公司支持区块链项目的方式有很大影响。例如,如果一个团队在 ICO 中出售了网络代币的 90%,那么在未来,他们将只获得代币价值上涨的 10%的好处。相比之下,他们可能手头有数百万美元的现金。因此,团队可能决定只对区块链项目进行有限的关注,并且在改善网络方面没有太大的紧迫感。一个拥有数千万美元的小团队可以支付自己丰厚的薪水直到他们去世并且非常安全。

另一方面,只释放 10%的代币的团队会受到强烈的激励,以增加代币的价值,但会出现不同的问题:中心化。一小群人会极大地控制网络。在大多数情况下,这将击败区块链技术的大部分目的,导致前面的问题——他们真的需要区块链吗?

代币的另一个问题是它们的流动性。高流动性的代币可能会激励投资者团队制造网络炒作,而非实质性内容。如果一个项目能够制造足够的轰动,他们的代币价值可能会增加十倍。如果代币具有流动性,团队成员和早期投资者可能会倾销代币获得巨额利润,然后离开。项目失去了利益关系,可能会被抛弃。

出于这些原因,高质量的项目通常有一些投资者和团队锁定系统,防止团队成员和大型投资者在一段时间内完全出售代币,然后进行缓慢的分配,逐步释放代币。通过阻止流动性,团队必须专注于长期价值而不是短期操纵。

合法性

在讨论区块链 ICO 的法律问题之前,重要的是要明确指出,本书的作者都不是律师,本书中的任何内容都不能构成或替代优质的法律建议。区块链技术的规则在各国之间差异巨大,并且正在迅速发展。对于任何区块链项目,我们建议您咨询一位在该领域有经验的熟练的当地律师。

区块链代币的创建导致了一个全新的资产类别,这一类别与现有的股票、货币或股权类别并不相符。而且,由于公共区块链是全球性的,不清楚如何将本地法律应用于区块链的使用。

实用性与证券

在美国,有一个区分实用代币和证券的区别。实用代币可以被描述为诸如游乐场代币、漫画书或棒球卡之类的东西。虽然该项物品的市场价值可能会上下波动,但购买它的根本原因(以及它的宣传方式)与谋求利润无直接关系。有人购买游乐场代币玩游戏,购买漫画书阅读,购买棒球卡收藏。

许多代币试图定位自己为实用性,以避免触发严重限制销售并要求与 SEC 正式注册以及向投资者进行其他披露的美国证券法。

在其他情况下,ICO 发行SAFTSimple Agreement for Future Tokens。SAFT 绝对是一种证券,发行人接受这一点是为了在网络启动之前向认可投资者出售。一旦网络启动,这些 SAFT 协议将转换为网络上的代币。

安全与实用代币分类的复杂性受到了美国证券交易委员会(SEC)的声明的影响,该声明称代币可能随着时间的推移变得更像或更少像证券 —— 一开始作为证券或实用代币,然后逐渐演变为另一种类别。对于试图合法运作的项目来说,这种模糊的定义可能令人沮丧。

其他考虑因素

除了证券法外,区块链项目还可能被视为货币,因此可能会遇到另一套法律:监管银行和其他货币处理企业的法律。在美国和其他地方,从事汇款、支付和其他常见区块链用例的公司可能被视为货币传输者。在美国,这类企业必须按州进行许可。其他用例可能需要银行牌照。

对于利用区块链的全球企业来说,要完全遵守各种法律和法规的监管压力可能是巨大的 —— 包括了解您的客户法、反洗钱法、货币传输法、银行法、证券销售和营销法等等。

由于这些原因,许多区块链公司倾向于在友好的司法管辖区设立总部,希望在其主要运营地合法,并在以后(如果有必要的话)再处理其他地区的问题。

可持续性

ICO 空间中的项目(例如区块链本身)以独特的方式运作。根据项目的不同,它们可能按照传统企业的方式运作,但也可能像中央银行一样 —— 增加和减少流通中的货币。对于传统公司来说,盈利至关重要且简单明了,因为公司提供产品并从销售中获得回报。然而,如果你还要从无中创造一种货币,并将其出售和交易为其他产品,或者如果这种货币本身就是产品,那么情况就会更加复杂。如果项目的可持续性来自于销售货币,那么市场需求的下降可能会导致灾难性的后果,因为购买货币的人减少,网络价值可能会出现巨大波动,几乎瞬间就会发生。就像失败的国家经济一样,货币信任可能会消失,因此超级通货膨胀会随之而来,因为个别代币几乎变得毫无价值,无法作为交换媒介。

由于基于公司的区块链项目还是非常新颖的,对于这些公司而言,长期可持续模式究竟是什么样子还不太清楚。早期项目,如比特币和以太坊,并不需要成为传统项目,而只需要吸引足够的货币兴趣来支付一小部分开发人员。

ICO 的优势

尽管存在各种问题,ICO 具有传统筹资方式所没有的优势。实际上,繁荣的 ICO 市场带来的一个启示是,对于初创科技公司来说,传统的资本途径过于严格限制了。人们对于获得早期阶段科技公司的投资机会有着明显的渴望。

流动性

ICO 投资者最大的优势是潜在的流动性。在传统的股权融资中,支持者需要等待一个流动性事件——要么是并购,要么是上市。其中任何一种选择可能需要很长时间,甚至可能永远不会发生。多年过去了,没有任何流动性并不罕见。而使用代币,销售可以在初始筹资完成后迅速进行。许多代币仅在初始发行后几个月就会进入市场。这使得成功的投资者可以部分退出他们的头寸,获取利润,并重新投资。退出的能力也使这些投资者能够重新进入,从而增加了总体早期阶段资金的可用池。

缺乏门户守卫

传统的股权投资受到严格监管。这旨在保护投资者,但也作为一个阻碍较小参与者进入市场的障碍,这些人可能有多余的资本可以投资,但由于他们的财富不足,无法投资。因此,这些投资者直到一家公司上市才能进行投资。结果,较小的投资者错过了风险高,回报高的选项,而风险投资家则可以获得这些选项。

较小投资者参与的能力意味着投资者粉丝,那些投资的原因不仅仅是纯粹的利润动机的人,可以成为一个更强大的力量。值得问的是,哪种投资更好——一个能够说服风险投资家向他们提供 1000 万美元的公司,还是一个能够说服 1000 人交出 10000 美元的公司。

最低投资额

许多 ICO 的最低投资额都在数百美元甚至低到数千美元。这远远低于传统股权融资中种子轮所需的数十万甚至数百万美元。因此,可能的投资者群体呈指数增长。此外,通过将投资分散到更大范围的人群中,任何一个投资者的风险都更为有限。总的来说,ICO 提供了一种更容易受到欺诈的资金模式,但也更加民主,更适合那些可能并不把利润动机作为首要考虑的项目。对于社会公益的项目,这些项目可能从不可能对风险投资家产生经济意义中得到支持,但可能会在 ICO 中得到支持,因为有人愿意支持该事业,并将获利机会视为额外奖励。

著名的欺诈行为

在短短几个月内仅凭一份白皮书和一些广告就能筹集大量资金的能力自然会引发一些想要捞一把的坏人。许多 ICO 开始涌现出来,有假团队、假项目,甚至是质量可疑的项目。一旦项目筹集到了资金,团队就会消失。虽然已经有一些人被逮捕,但仍然有很多骗子和欺诈者迄今为止逃脱了投资者的资金。

Onecoin

OneCoin 是一个假扮成区块链项目的国际庞氏骗局。这个项目被印度称为骗局,而来自中国、保加利亚、意大利、越南、泰国、芬兰和挪威的官方警告投资者。在全球范围内已经发生了多起逮捕和查封事件,但 OneCoin (www.onecoin.eu/en/) 网站仍在运营。

Pincoin 和 iFan

Pincoin 和 iFan 是两个声称来自新加坡和印度的项目,但实际上由越南一家名为现代科技的公司秘密支持,总部位于胡志明市。它目前被认为是 ICO 历史上规模最大的骗局,成功骗取了 32,000 人超过 6.6 亿美元的资金。骗局的领导者举办了活动和会议,并竭尽全力说服投资者项目的可行性。实际上,这是一个庞氏骗局,早期投资者是用后来投资者的钱支付的。一旦筹集到资金,团队就会消失,资金也随之消失。

Bitconnect

Bitconnect 长期被指责为庞氏骗局,因为他们向其 BCC 币的持有者承诺了巨额回报。Bitconnect 运营着一个交易所和借贷计划,用户可以将 BCC 币借给其他用户以获取贷款利息。在州议员发出停止信函后,该公司停止了运营。该计划崩溃了,与此同时,币值也崩溃了,导致大多数投资者蒙受巨大损失。一起集体诉讼正在进行中。

其他问题

除了明显的欺诈行为之外,ICO 还遭受了其他问题的困扰。由于涉及的资金数额以及大部分资金是通过无法撤销或拦截的加密货币交易筹集的,ICO 成为了黑客的完美目标。

重大黑客事件

致作者 请在这里添加一些内容

DAO

早期的一个去中心化项目被称为DAO,或去中心化自治组织。DAO 旨在为区块链项目提供一种类似风投基金的功能,并建立了这样一个机制,人们可以使用以太坊购买组织的股份(及其利润)。该项目本身是使用以太坊区块链和智能合约来控制资金和管理投票的。这个项目取得了巨大成功,成功筹集了约 2.5 亿美元的资金,当时以太坊的交易价格大约为 20 美元。

不幸的是,DAO 运行所使用的智能合约代码存在漏洞,使得黑客能够利用其中的一个漏洞。由于智能合约中存在微妙的错误,攻击者能够在余额更新之前多次提取资金。黑客随后能够随心所欲地提取资金,迅速耗尽价值数千万美元的以太币。这次黑客攻击彻底改变了以太坊项目的走向,导致了一次硬分叉——大多数用户投票决定分割网络并退还被盗资金。少数人创立了以太经典,其中所有攻击行为都被允许继续存在。这两个网络仍然独立运行。

Parity

Parity 团队是整个以太坊生态系统中最受尊敬的团队之一。由以太坊创始人之一 Gavin Wood 领导,他们是世界上经验最丰富、技能最高超的区块链开发者之一。不幸的是,每个人都是人,Parity 钱包产品存在漏洞。这个漏洞允许攻击者远程清空钱包,导致数百万美元的以太币被盗。值得庆幸的是,这次攻击没有自动化,这给了生态系统时间去发现并做出响应。

漏洞已经修复,但修复过程中产生了一个新的错误。这个错误允许新的攻击者向钱包发出 kill 命令,冻结所有资金。截至撰写时,超过 2.6 亿美元的以太币仍然被锁定。社区仍在努力寻找一种解救资金的方法。

从 Parity 钱包的黑客攻击中可以得出的教训是,即使是最好的团队也会犯错误,并且任何在以太坊上运行的代码都必须有某种升级路径至关重要。很明显,在生态系统改进之前,任何在以太坊上运行的代码都应被视为有风险。如果连创始人都不完美,这就告诉你正确做事的难度。

安全 ICO

如果考虑进行 ICO,那么确保尽一切努力保护资金免受攻击至关重要。在这里,我们将讨论一些常见的攻击以及如何防范它们。

SSH 密钥锁定服务器

理想情况下,ICO 团队使用的所有服务器都应该将登录访问权限限制为已知的 SSH 密钥白名单。这意味着只有团队知道的计算机才能登录服务器。更好的情况是,这些相同的计算机在 ICO 开始前和期间保持关闭并断开与互联网的连接。因此,即使该计算机被入侵,也无法用于攻击 ICO。

DNS 安全

ICO 被攻击的一种方式是攻击者创建 ICO 网站的克隆,然后通过黑客 DNS 将域名重定向到攻击者控制的计算机。 新网站看起来与官方网站完全相同,除了发送资金的地址被更改。由于大多数地址是十六进制的而且不容易区分,这是一个容易忽略的细节。 如果在繁忙的 ICO 期间甚至只发生几分钟,黑客就可以带走数十万甚至数百万美元。

许多 DNS 提供商有不同的方式来锁定 DNS,所有这些安全措施都应该启用。此外,应该使用 DNS 检测服务,例如 DNS Spy,定期实时检查是否有任何变化。采取这些对策有助于确保试图劫持 DNS 窃取资金的攻击者不会成功。

入侵检测

用于运行 ICO 网站的任何机器都应具有某种程度的入侵检测软件作为备份。如果因某种原因错过了某些细节,团队被通知在关键服务器上发现任何可疑行为是至关重要的。市场上有许多入侵检测产品。要寻找的关键功能是权限修改检测和文件修改检测(例如,更改 HTML 文件以更改以太坊地址以发送资金的地方)。

购买相关的域名

通过购买听起来或看起来相似的域名,黑客还可以攻击 ICO。例如,如果一个团队正在使用myIcoDomain.io,攻击者可能会购买myIcoDomain.net。 团队应该尽可能购买尽可能多的相关域名,特别是最常见的扩展名。如果攻击者拥有这些相关域名中的一个,他们可以轻松地向潜在买家发送电子邮件,在社交媒体上发布消息等等,以一种可能会混淆一些买家的方式。 就像 DNS 攻击一样,攻击者通常会建立一个外观一样的网站,除了关键的付款细节。

此外,ICO 团队应明确官方域名,并定期和主动告知用户不信任其他任何域名。

监控社交媒体渠道

攻击者还可以尝试通过向 Facebook 组,电报组,discord 频道和其他通讯平台注入信息来窃取资金。例如,一个用户可能会出现并宣称他们正在帮助团队,所有人都可以填写一些调查或其他。 调查收集电子邮件地址,自然地,然后这些电子邮件地址会收到看起来像来自相关域的电子邮件,以便发送资金或获得特别销售。

谁可以代表 ICO 讲话,谁不可以应该非常清楚,任何声称代表 ICO 团队但事实并非如此的人应该立即被标记和禁止。

多重签名钱包

ICO 募集的资金应该转移到多重签名钱包中。这是因为另一个可能的攻击是篡改持有资金的钱包,使攻击者可以将所有资金转移到自己名下。大多数主要加密生态系统都存在多重签名钱包,并且极大地增加了攻击者的难度。他们现在不再只需窃取一个人的私钥,而是必须同时窃取多台计算机上的多个密钥并将它们全部使用。在以太坊生态系统中,Gnosis 钱包在这方面被证明是健壮而可靠的,已被多个成功团队使用而未发生事故。

代码审计

尽管这在一般情况下是最佳实践,但对于任何众筹销售代码进行公开代码审计有助于降低被黑客攻击的可能性。通过积极主动地与技术娴熟的第三方寻找并清除漏洞,团队不仅增加了对项目的信任,还减少了漏掉黑客可能利用的东西的机会。

结论

到目前为止,您应该已经对 ICO 中涉及的内容有了一个很好的了解,并对其中所需的巨大工作有了一些了解。一个典型的 ICO 可能持续数分钟至数月,但为了为公众和私人投资者完成营销材料,需要做大量的准备工作。任何 ICO 项目都应该非常小心安全问题,因为一个被黑客攻击并且失去资金的 ICO 将很难激发对项目和未来项目的信心。

许多 ICO 项目失败了,要么是因为缺乏营销,要么是因为团队不合适,要么是因为无法吸引社区。轻松获得资金的早期时代已经结束。尽管如此,ICO 平均而言比传统的获得资金方法(例如接触风险投资家)成功得多。

在下一章中,我们将研究如何创建自己的代币或加密货币。

参考文献

第二十章:创建您自己的货币

到目前为止,我们已经广泛讨论了区块链、比特币和替代币。我们讨论了比特币、其区块链和组成区块链的其他元素的各种复杂性。到目前为止,以太坊一直是本书大部分内容的主要讨论对象。我们还阅读了其他基于区块链的项目,其中包括基于货币的项目。

尽管对区块链和比特币的开发知识有限,以太坊已经实现了制作去中心化应用程序的可能性。在交易所上有各种基于以太坊和其他类似项目构建的代币,得到了支持者和社区的认可。

在本章中,我们将讨论以下主题:

  • 加密货币的类型

  • 设置 Litecoin

  • 分叉 Litecoin 存储库

  • 在 Litecoin 存储库顶部创建自己的代币

理解加密货币的类型

有三种方式可以创建自己的加密货币。每种方式都比其他方式有其自身的优势。在创建货币之前,重要的是了解涉及其中的所有复杂性,以及您的货币与当前在交易所上可用的其他现有货币相比提供了什么。您可以在coinmarketcap.com找到流行的货币列表。

基于现有区块链的代币

这些代币是基于现有区块链平台的,例如以太坊、Omni、NEO 等。我们已经在之前的第十五章中讨论了代币的开发,以太坊开发。代币有助于更快地创建代币,并支持快速的上市策略,以便大部分时间可以投入到自托管区块链的进一步开发中。

有各种区块链项目的示例,它们开始作为代币,一旦它们启动了拥有完整支持的区块链和代币的项目,就会成功进行 ICO。由于与货币相比,开发代币更快且更容易,因此这类项目可以很容易地获得动力,并且在很短时间内启动,大部分时间可以投入到其他重要任务中,例如白皮书的创建、ICO 等。

从头开始创建一个新的区块链

在这种方法中,可以从零开始创建自己的区块链。借鉴比特币和其他区块链平台的经验将有助于创建代币,这将允许您集成新功能,并使用不同的共识技术。

具有自己起源块的分叉区块链

本章的主要焦点是关于这种类型的货币开发;我们将在引入以太坊、Counterparty、NEO 等平台后,创建完整的具有自己区块链的代币。通过采用比特币、Litecoin 等现有货币的分叉来创建自己的区块链资源有限。

Litecoin 的开发

莱特币是基于比特币构建的首批加密货币之一。莱特币的源代码从比特币的核心代码中分叉,包括比特币的钱包和其他资源。莱特币相对于比特币的主要变化是 PoW 算法是脚本而不是比特币的 SHA-256。此外,莱特币的硬币供应限制为 84,000,000 LTC,区块时间为 2.5 分钟。

这个过程

在这一章中,我们将从莱特币源代码中分叉并在其基础上进行工作。以下是涉及步骤的简要概述:

  • 制定项目的布局和要求。

  • 选择算法,有多种算法可供选择。在这一章中,我们将使用脚本算法,这是莱特币本身使用的。

  • 共识类型:可以根据社区支持使用 PoW、PoS 或其他共识类型。在这一章中,我们将使用 PoW 共识类型,这需要矿工为硬币挖矿并确认交易。

  • 硬币名称:必须决定硬币的名称。

  • 硬币缩写:例如,比特币使用 BTC,莱特币使用 LTC;类似地,硬币需要一个缩写,所以最好让缩写与硬币名称相似。

  • 连接端口:重要的是选择与网络连接的端口;这个端口将由连接到区块链网络的每个节点使用。

  • 区块奖励:重要的是设置区块奖励,即在矿工挖矿成功时获得的硬币数量。

  • 区块减半时间:这是区块奖励减半的时间,例如,在比特币中,每隔 210,000 个区块奖励减半,这控制了硬币的生产。

  • 硬币供应限制:这是所有矿工总共生产的硬币数量的限制;这通常由区块减半时间控制,因为在一定数量的区块后,挖矿更多区块将不可行。

  • Coinbase 成熟度:重要的是设置在区块挖矿奖励中获得的硬币在可以花费之前需要挖矿的区块数量。

  • 确认:这是在确认交易之前需要挖矿的区块数量。

  • 难度重新调整时间:例如,比特币的难度重新调整时间是两周;类似地,在开发过程中也需要设置这个时间。

  • 区块挖矿时间:挖一个区块所需的总时间。

  • 种子节点:这是硬币的起始节点;重要的是要有一个始终在线的节点,直到足够多的节点同步并连接到网络为止。可以接受多个种子节点地址的存在。我们还可以选择 DNS 种子,它们只不过是包含区块链网络种子节点地址的 DNS 服务器。

  • 钱包 UI:核心钱包建立在 QT 框架上,其 GUI 可以根据需求更改。

  • 图形资源:可以在 Litecoin 源代码中选择并替换加密货币的图标和其他图形资源;建议保持图标的尺寸属性。

创建自己的加密货币

一旦定义了先前列出的参数,就是时候处理源代码并进行必要的更改了。

设置 Litecoin

在本地机器中设置 Litecoin 环境是很重要的;源代码在 GitHub 上可用:github.com/litecoin-project/litecoin

平台选择

选择要设置环境的构建平台是很重要的。您可以在源代码的doc子文件夹中找到所需的构建指令。那里为您提供了每个首选平台的所需指令文件,以便您按照这些步骤安装 Litecoin 核心和钱包。

在本节中,我们将使用 Max OS X 构建指令,尽管还提供了其他平台的指令。

准备工作

编译所需依赖项需要安装xcode。应在终端中执行以下命令:

xcode-select --install

接下来需要安装在 macOS 上的软件包管理器brew。以下命令用于安装brew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

依赖项安装

安装了brew之后,下一步是使用以下命令安装所需的依赖项:

brew install automake berkeley-db4 libtool boost miniupnpc openssl pkg-config protobuf python3 qt libevent

上述命令将根据需要安装所有必要的依赖项:

构建指令

第一步是在根目录或其他目录中克隆 Litecoin:

git clone https://github.com/litecoin-project/litecoin
cd Litecoin

使用以下命令执行BerkleyDb的安装:

./contrib/install_db4.sh .

Litecoin-core 的构建使用以下 make 命令:

./autogen.sh
./configure
make

您可以运行单元测试,确保构建成功且没有任何错误:

make check

展示了包含.app包的.dmg的部署:

make deploy

设置我们自己的加密货币

现在,是时候着手处理我们自己的加密货币了;为此,重要的是检查克隆目录和 Litecoin,并进行备份,以防有任何步骤出现致命错误。

根据我们在之前某个部分列出的参数,现在是在必要的位置替换参数的时候了。

src目录包含 Litecoin 核心源代码,大多数参数需在其中设置。在chainparams.cpp文件中,将缩写从LTC更改为我们选择的缩写。同样,建议更改其他文件中看起来合适的缩写。

端口选择

现在,需要更改端口,以便我们的区块链在网络中的所有节点的相关端口上运行。

init.cpp文件中应更改连接端口。

bitcoinrpc.cpp文件中应更改 RPC 端口。

区块相关参数的设置

validation.cpp文件中,应编辑以下参数:

  • 区块价值

  • 区块奖励

  • 区块时间

  • 难度重新定位时间

  • 难度重新定位比例

GetBlockSubsidy()函数中应更改区块值:

CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
 int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
 // Force block reward to zero when right shift is undefined.
 if (halvings >= 64)
 return 0;

 CAmount nSubsidy = 50 * COIN;
 // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
 nSubsidy >>= halvings;
 return nSubsidy;
}

金额限制

现在,是时候设置硬币限制和最小值了,可以在amount.h文件中完成相同的操作:

typedef int64_t CAmount;

static const CAmount COIN = 100000000;
static const CAmount CENT = 1000000;

static const CAmount MAX_MONEY = 84000000 * COIN;
inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }

#endif // BITCOIN_AMOUNT_H

coinbase 成熟度数字

要更改 coinbase 的成熟度,在qt子文件夹中,应更改transactionrecord.cpp文件以设置在挖矿的硬币可花费之前要找到的所需区块数:

  if (nNet > 0 || wtx.IsCoinBase())
    {
        //
        // Credit
        //
        for(unsigned int i = 0; i < wtx.tx->vout.size(); i++)
        {
            const CTxOut& txout = wtx.tx->vout[i];
            isminetype mine = wallet->IsMine(txout);
            if(mine)
            {
                TransactionRecord sub(hash, nTime);
                CTxDestination address;
                sub.idx = i; // vout index
                sub.credit = txout.nValue;
                sub.involvesWatchAddress = mine & ISMINE_WATCH_ONLY;
                if (ExtractDestination(txout.scriptPubKey, address) && IsMine(*wallet, address))
                {
                    // Received by Bitcoin Address
                    sub.type = TransactionRecord::RecvWithAddress;
                    sub.address = EncodeDestination(address);
                }
                else
                {
                    // Received by IP connection (deprecated features), or a multisignature or other non-simple transaction
                    sub.type = TransactionRecord::RecvFromOther;
                    sub.address = mapValue["from"];
                }
                if (wtx.IsCoinBase())
                {
                    // Generated
                    sub.type = TransactionRecord::Generated;
                }

                parts.append(sub);
            }
        }
    }
    else
    {
        bool involvesWatchAddress = false;
        isminetype fAllFromMe = ISMINE_SPENDABLE;
        for (const CTxIn& txin : wtx.tx->vin)
        {
            isminetype mine = wallet->IsMine(txin);
            if(mine & ISMINE_WATCH_ONLY) involvesWatchAddress = true;
            if(fAllFromMe > mine) fAllFromMe = mine;
        }

        isminetype fAllToMe = ISMINE_SPENDABLE;
        for (const CTxOut& txout : wtx.tx->vout)
        {
            isminetype mine = wallet->IsMine(txout);
            if(mine & ISMINE_WATCH_ONLY) involvesWatchAddress = true;
            if(fAllToMe > mine) fAllToMe = mine;
        }

        if (fAllFromMe && fAllToMe)
        {
            // Payment to self
            CAmount nChange = wtx.GetChange();

            parts.append(TransactionRecord(hash, nTime, TransactionRecord::SendToSelf, "",
                            -(nDebit - nChange), nCredit - nChange));
            parts.last().involvesWatchAddress = involvesWatchAddress; // maybe pass to TransactionRecord as constructor argument
        }

我们必须将transactionrecord.cpp文件中的交易确认计数更改为设置此参数,根据我们的要求。

创世块创建

创世块是从validation.cpp文件中的LoadBlockIndex()函数创建的:

bool CChainState::LoadBlockIndex(const Consensus::Params& consensus_params, CBlockTreeDB& blocktree)
{
    if (!blocktree.LoadBlockIndexGuts(consensus_params, this{ return this->InsertBlockIndex(hash); }))
        return false;

    boost::this_thread::interruption_point();

    // Calculate nChainWork
    std::vector<std::pair<int, CBlockIndex*> > vSortedByHeight;
    vSortedByHeight.reserve(mapBlockIndex.size());
    for (const std::pair<uint256, CBlockIndex*>& item : mapBlockIndex)
    {
        CBlockIndex* pindex = item.second;
        vSortedByHeight.push_back(std::make_pair(pindex->nHeight, pindex));
    }
    sort(vSortedByHeight.begin(), vSortedByHeight.end());
    for (const std::pair<int, CBlockIndex*>& item : vSortedByHeight)
    {
        CBlockIndex* pindex = item.second;
        pindex->nChainWork = (pindex->pprev ? pindex->pprev->nChainWork : 0) + GetBlockProof(*pindex);
        pindex->nTimeMax = (pindex->pprev ? std::max(pindex->pprev->nTimeMax, pindex->nTime) : pindex->nTime);
        // We can link the chain of blocks for which we've received transactions at some point.
        // Pruned nodes may have deleted the block.
        if (pindex->nTx > 0) {
            if (pindex->pprev) {
                if (pindex->pprev->nChainTx) {
                    pindex->nChainTx = pindex->pprev->nChainTx + pindex->nTx;
                } else {
                    pindex->nChainTx = 0;
                    mapBlocksUnlinked.insert(std::make_pair(pindex->pprev, pindex));
                }
            } else {
                pindex->nChainTx = pindex->nTx;
            }
        }
        if (!(pindex->nStatus & BLOCK_FAILED_MASK) && pindex->pprev && (pindex->pprev->nStatus & BLOCK_FAILED_MASK)) {
            pindex->nStatus |= BLOCK_FAILED_CHILD;
            setDirtyBlockIndex.insert(pindex);
        }
        if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS) && (pindex->nChainTx || pindex->pprev == nullptr))
            setBlockIndexCandidates.insert(pindex);
        if (pindex->nStatus & BLOCK_FAILED_MASK && (!pindexBestInvalid || pindex->nChainWork > pindexBestInvalid->nChainWork))
            pindexBestInvalid = pindex;
        if (pindex->pprev)
            pindex->BuildSkip();
        if (pindex->IsValid(BLOCK_VALID_TREE) && (pindexBestHeader == nullptr || CBlockIndexWorkComparator()(pindexBestHeader, pindex)))
            pindexBestHeader = pindex;
    }

    return true;
}

此外,在chainparams.cpp中,应将释义更改为所需的参数选择。在 Litecoin 中,使用以下参数:

    const char* pszTimestamp = "NY Times 05/Oct/2011 Steve Jobs, Apple’s Visionary, Dies at 56";

钱包地址

钱包地址是区块链的重要组成部分,如果没有正确的私钥和公钥,就无法对 Litecoin 的源进行相关更改。起始字母可以在base58.cpp文件中设置。

检查点

检查点被硬编码到 Litecoin Core 客户端中。设置检查点后,所有交易都有效直到检查点条件有效。这是为了以防有人想要分叉区块链并从完全相同的区块开始;检查点将会失效,并且不会接受任何进一步的交易。checkpoints.cpp文件帮助管理区块链源代码中的检查点:

namespace Checkpoints {

    CBlockIndex* GetLastCheckpoint(const CCheckpointData& data)
    {
        const MapCheckpoints& checkpoints = data.mapCheckpoints;

        for (const MapCheckpoints::value_type& i : reverse_iterate(checkpoints))
        {
            const uint256& hash = i.second;
            BlockMap::const_iterator t = mapBlockIndex.find(hash);
            if (t != mapBlockIndex.end())
                return t->second;
        }
        return nullptr;
   }

创意和图形

可以从src/qt/res/icons目录设置和替换图标和其他图形,该目录包含所有图像和硬币的主标志。

文件bitcoin.pngabout.png包含特定硬币的标志。

总结

通过遵循上述要点,可以使用 Litecoin 源代码创建和运行硬币;一旦硬币被创建并运行,下一步将是测试实际生产级别的使用。进一步的步骤包括编译硬币源代码并使用基于 QT 的钱包:

摘要

在这一章中,我们讨论了创建我们自己的加密货币,因为我们已经在第十五章 以太坊开发 中讨论了基于以太坊平台的代币的创建。在本章中,我们致力于创建我们自己的区块链,通过对 Litecoin 进行分叉,然后进行必要的更改,以创建具有相关参数的所需硬币。

在接下来的章节中,我们将就区块链未来的两个方面进行讨论,即可扩展性和区块链面临的其他挑战。此外,我们将讨论区块链的未来,以及它将如何塑造互联网和技术的未来,不仅仅是在基于货币的行业方面,还包括其他行业,在这些行业中,区块链充当了一个颠覆者。

第二十一章:可扩展性和其他挑战

尽管区块链技术被誉为一项重大突破,但并非没有其自身的问题。区块链技术仍处于发展的早期阶段,出现了许多问题仍在等待某种程度的解决。去中心化网络诸如区块链具有自己独特的挑战。

在本章中,我们将探讨区块链中以下关键问题:

  • 可扩展性和分散性

  • 可扩展性和成本

  • 可用性

  • 51% 攻击

  • 网络分叉

  • 灾难性的错误

  • 缺乏互操作性

  • 区块链技能的低可用性

可扩展性和分散性

区块链的一个关键优势是分散化,即消除任何单一机构来控制网络。不幸的是,这对系统性能有负面影响。区块链系统通过让网络的所有节点保持同步,通过努力达成共识,以便每台运行区块链的计算机看到相同的系统状态。网络上的更多节点通常会导致较少的中心化。这也意味着必须做更多的工作以确保所有网络参与者彼此达成一致,这限制了性能和可扩展性。

较大数量的节点妨碍性能的几个原因:

  • 每个节点通常都必须处理所有交易。要处理的交易数量越多,每个节点需要的处理能力和网络吞吐量就越多。随着需求的增加,网络变得越来越不太分散,因为能够负担必要机器的群体越来越少。在某些地区,带宽可能有限。一旦这种有限带宽被超出,该地区的人们就无法参与网络。

  • 更多节点也会导致更多的延迟,因为随着每个节点在网络上传播消息的数量增加,对等通信也会增加。尽管对等通信对这一目的非常高效,但仍可能导致滞后,并限制最大吞吐量。

  • 许多区块链要求参与节点在本地硬盘上存储整个区块链。存储需求和从网络下载链所需的极长时间作为参与的障碍,尤其是在网络不太稳定的地区。例如,以太坊区块链现在已经超过 400 GB。没有压缩,这对于大多数个人笔记本电脑和许多较旧的台式计算机来说太大,需要专用机器来运行区块链。

已经有一些尝试来提高区块链系统的性能。其中大部分都涉及一定程度的去中心化程度降低。例如,Bitshares 衍生的一套系统使用一组称为见证人的受限完整节点,这些节点仅有 21 个。只有这些计算机被用来处理和批准交易;网络上的其他机器仅提交交易到网络或观察。除了 Bitshares 团队做的许多性能优化外,他们声称理论吞吐量高达每秒 100,000 次交易。这导致了区块链的第二个问题,即与传统方法相比的成本。

区块链在商业领域

尽管 Bitshares 团队建议理论上限为每秒 100,000 次交易,他们正在使用来自 LMAX 交易所的技术和教训,后者声称能够每秒处理超过 6 百万笔交易。大多数区块链系统在实际应用中无法达到理论性能水平,大多数区块链实际上每秒的交易量都远低于 1,000 次。例如,比特币大约每秒处理七笔交易,以太坊大约每秒处理 14 笔。一台运行 MySQL 的良好服务器能够每秒处理 10,000-20,000 笔类似复杂性的交易。因此,传统方法比区块链系统更容易扩展到更大的交易量范围。

传统数据库系统的性能成本,包括分布式数据库系统,从各个方面来看都远远低于区块链系统。对于任何企业来说,雇佣这些系统的经验丰富的人员更便宜、更容易,风险更小,因为这些系统更为熟知和有文档支持。在考虑使用区块链的企业必须问自己区块链系统是否以某种方式提供了必不可少的功能,因为如果没有,其他方法更便宜、更容易、更快或所有这些方式。

考虑使用区块链的企业在使用区块链时应密切关注其扩展需求和成本模型。随着时间的推移,成本和性能可能会提高,但如果当前方法不够,不能保证它们会提高得足够快。

可用性

相对于其他系统,当前的区块链系统相对难以使用。例如,使用任何基于以太坊的 DApp 需要安装特殊浏览器或 Chrome 的 MetaMask 插件,或者在公开市场购买和转移以太币,然后学习所需应用程序的界面。每个动作都需要花费以太币,确切金额事先不一定知道,而且根据网络负载而变化。

一旦设置完成,通过基于区块链的系统发送价值相对容易,但容易出现地址错误。对于一个人来说,很难知道他们是否将价值发送到0x36F9050bb22d0D0d1BE34df787D476577563C4fC还是0xF973EE1Bcc92d924Af3Fc4f2ce4616C73b58e5Cc。事实上,ICO 被黑客攻击者在访问 ICO 主网站并简单更改目的地地址的情况下被洗劫了数百万。

一些区块链,比如 Bitshares 和 Stellar,拥有为具名账户提供直观和人类可读的规定。希望这一趋势会持续下去,可用性也会得到改善。

缺乏保护

区块链网络遭到黑客攻击时,用户通常无法申诉。无论用户是否有任何过错,这一点都是真实的。当中心化交易所被黑客攻击时,其中一种回应是用户不应该相信中心化的权威。然而,像是 parity 钱包和 DAO 的事件中,用户甚至在不信任中心化权威的情况下也可能丧失对资金的访问权。尽管一个回应可能是他们应该选择更好的钱包或项目,但实际上不清楚用户能否真实地期望这样做。对于任何 Parity 钱包的黑客事件,Parity 团队涉及了以太坊世界中一些最著名的开发者。对于这些持续存在的问题更有可能的回应是不使用区块链。要实现主流接受,区块链系统将需要更易于使用,并在遭受攻击、黑客和其他损失的情况下提供某种高级保护。

51% 攻击

所有的区块链都可能遭受共识攻击,通常被称为 51%攻击,因为比特币原始共识攻击就是可能的。每个区块链都依赖于大多数用户或利益相关者是良好的行为者,或者至少不协调反对网络的其余部分。如果大多数(甚至是大少数)强大的网络参与者在区块链系统中协调反对其余部分,它们将能够发动双花攻击,并未经同意从网络中提取大量价值。

虽然曾经是理论性的,但最近已经发生了多起成功的针对不同区块链的 51% 攻击,例如 Verge(在参考资料中找到链接)。在更为集中的系统中,例如可能存在少数极大利益相关者的权益证明系统中,如果关注的利益相关者有足够的激励,完全有可能发生类似的协调。这些激励不一定需要是经济方面的,也不一定完全在链上:政治或国际关系可能会导致一组爱国利益相关者相互勾结支持或反对其他用户。例如,大量的挖矿硬件和网络设备来自中国,许多区块链开发也源自中国。如果中国利益相关者在与地区对手的国际斗争中发现他们拥有多数股权,这些利益相关者可能会利用他们的网络力量单方面惩罚属于对手地区的网络用户。

网络分叉

公共区块链面临的另一个问题是网络分叉的存在。比特币曾经分叉两次,分别演变成比特币和比特币现金,然后再次分叉成比特币黄金。现在有三个独立的网络声称拥有比特币的地位。虽然原始网络仍然是最主要的,但所有分叉都是由于主要网络参与者对技术未来的意见分歧而导致的。

以太坊遭遇了类似的命运,因为如何应对 DAO 黑客而分裂成以太坊和以太坊经典。大多数人认为 DAO 应该恢复被黑客攻击的资金,但是有一个强大的少数派持不同意见,问为什么这次黑客攻击要获得特殊对待?结果就是出现了两个网络,一个网络恢复了被黑客攻击的资金(以太坊),另一个则坚持无论如何都要遵循网络协议(以太坊经典)。

灾难性的漏洞

不可变账本的好处是什么都无法隐藏或更改。不可变账本的缺点是什么都无法隐藏或更改——包括漏洞。在像以太坊这样的网络中,智能合约代码被写入链中,这意味着代码漏洞不能轻易修复;原始代码将永远保留在区块链上。唯一的解决方法是模块化代码,其中每个部分都引用其他部分,并且这些指针有编程方式可以更新。这使得 DApp 的作者可以上传新的代码片段并适当调整指针。然而,这种方法也存在问题。进行这些更新需要特定的权限来更新代码。

有一个必要用于更新的中央权威只会制造新问题。要么这个权威对去中心化应用有着集中控制(这意味着它不再是去中心化的),要么一个治理系统也必须被写入区块链。这两种选择都有安全性方面的权衡。中央权威可能会被黑客攻击或私钥被盗,导致系统灾难性损失。去中心化的治理系统需要更多的代码,并且本身也面临黑客攻击的风险,DAO 黑客事件正是这样一个例子。

互操作性不足

当前的区块链技术不容易互操作。虽然可以编写一个可以与多个区块链通信的应用程序,但这些区块链本身没有与彼此通信的自然能力。在许多情况下,交易和治理的基本方法可能不兼容。例如,在以太坊网络中,任何用户都可以向任何其他用户发送任何代币,接收者无需获得权限。接收者可以选择忽略新代币,但它们仍然拥有这些代币(这引发了一些有趣的税收问题)。然而,在恒星网络中,用户必须向其他用户发行信任线才能接收由该用户发行的自定义代币。

同样,许多网络在链上提供多重签名和多用户钱包。然而,没有一个位于区块链之外的中心化应用程序,用户无法轻松地在一个地方管理所有这些网络。这也是中心化交易所的吸引力所在——不管底层协议是什么,用户都可以获得可预测的、通用的接口,能够发送和接收代币而不考虑底层技术。

区块链技能的低可用性

就像任何新技术一样,熟练人员的数量是有限的。在区块链的情况下,这种自然秩序变得更糟,因为系统的数量庞大且不断增长。仅看主要的链,系统使用的编程语言有 C、C++、Java、Scala、Golang 和 Python。所有这些系统都有不同的架构和协议。具有智能合约的区块链具有不同的合约模型、合约 API 和完全不同的编程语言,如 Solidity 和 Serpent。

在安全方面,每个区块链系统都有微妙不同的安全模型和挑战。系统越简单,满足这些需求就越容易,但区块链能做的事情就越少。此外,由于最近对区块链技术的兴趣激增,区块链技能在市场上非常昂贵。特别是,具有经过验证的顶尖人才非常难找到。

隐私

区块链被认为具有的一个优势是可以匿名运行。然而,如果这种匿名性被破坏,那么不可变的账本意味着每一笔交易都可以完美地被追踪到。保持完美的匿名性非常困难,即使一个人成功了,如果他们做生意的人也不是匿名的话,统计技术也可以被用来大大缩小他们身份的可能性。

虽然许多人在考虑匿名性时考虑的是如何避开执法或课税,但不仅仅是政府可能对这些信息感兴趣。例如,有很多犯罪组织都希望能够识别富裕但不起眼的人。一个组织可以追踪加密资产的大额持有或交易到特定的个人,并将其作为绑架或敲诈的目标方法。加上加密交易的不可变性,这可能会使这种攻击变得非常有吸引力。

有一些项目试图解决这个问题,比如 Zcash 和 Dash,它们隐藏了交易的来源和终点。希望更多的系统会添加深思熟虑的协议来解决安全和隐私问题。

能源消耗

一些最大的区块链,比如比特币和以太坊,仍然采用工作证明模型。工作证明方法极度耗能且效率低下。一则新闻报道指出,仅比特币网络消耗的电力就已经超过了爱尔兰国。其他消息源认为这是夸张的,但即便如此,它也说明了运行这些系统的巨大成本。

然而,越来越多的系统出于这个确切的原因而从工作证明系统转移到其他系统。新的共识算法,比如股权证明和委托权证明,使这种极端能源成本变得不必要。

总结

在本章中,我们已经介绍了使用和实施区块链系统的当前主要挑战。希望使用区块链的企业应该了解技术的当前状态,与其他技术方法相比的成本,以及区块链世界存在的安全和人员配备问题。

好消息是,这些问题都不是无法克服的,而且其中许多问题肯定会随着时间的推移而得到改善。许多项目正在进行中,以改善不同区块链网络的可用性和安全性。额外的工具和培训资源降低了编写新的区块链应用程序的难度。

参考资料

  1. bitshares.org/technology/industrial-performance-and-scalability/

  2. news.bitcoin.com/proof-of-work-coins-on-high-alert-following-spate-of-51-attacks/

  3. www.theguardian.com/technology/2017/nov/27/bitcoin-mining-consumes-electricity-ireland

第二十二章:区块链的未来

在本章中,我们将讨论区块链技术的未来。有许多趋势和发展可能会推动区块链技术的发展和其在未来几年的应用。和任何预测一样,我们将讨论的内容都不是铁板钉钉的。

特别是,区块链将受到以下几个关键主题的推动:

  • 持续的分散化和专业化

  • 法律和监管的演变

  • 技术的稳定

  • 与人工智能和物联网的交叉

持续的分散化和专业化

区块链始于只有一个实现:比特币。现在有成千上万的区块链和数百种区块链技术。在如此拥挤的市场中,技术自然会开始有更多具体目的的实现。区块链系统的许多缺点,如速度、易用性等,使用具体目的的区块链系统更容易解决。

我们已经看到了这一开始。Steemit 是一个基于比特股/石墨技术构建的区块链社交网络。它具有基于见证人和投票的共识算法,整个操作都围绕着托管社交和博客内容而设计。虽然仍然具有许多公共区块链的特征,但通过具体目的,Steem 区块链更能够在其期望的生态系统中发挥作用。

我们预计将会出现更多具体目的的链技术。专门针对物流、追踪艺术作品的来历、法律工作等方面的区块链分叉都是一个良好的团队提供市场特定区块链产品的肥沃土壤,易于使用并且易于集成到现有系统中。

成功为传统企业提供节省成本、有效解决方案的公司将会最容易获得成功。在本节中,我们将探讨一些已经在发展的具体用例。

视频游戏

全球最受欢迎的游戏之一是在线角色扮演游戏,例如《魔兽世界》。在许多这类游戏中,玩家可以积累和交易装备。游戏创建者普遍面临的问题是游戏内经济:如何在线上保证稀有物品的稀缺性?许多游戏都存在副本漏洞的问题,玩家可以一次又一次地复制稀有物品然后出售,从而获得可观的利润。区块链技术解决了数字稀缺性的问题。

已经有一些视频游戏在尝试使用区块链技术。然而,虽然有一些基于以太坊的游戏代币,但尚无专门用于视频游戏的区块链。我们预计这种情况将发生变化,因为一些最赚钱的游戏通过出售游戏内物品赚钱。

房地产

房地产是另一个区块链技术绝对合理的领域。已经有许多以房地产为基础的项目在进行中。然而,房地产世界很复杂,关于产权所有权和转让的法律在不同的司法管辖区之间差异很大。一个为管理土地转让的私人/公共互动而构建的链有可能成功地取代现有的传统系统。这样的系统将大大提高房地产市场的效率。当前市场依赖于许多不完全信息的不同因素,包括政府机构持有土地所有权记录、保险公司检查洪水区域和其他问题、发布价格以及房地产销售公司进行价格发现和广告。多个不相连的方需要在一个可信系统中分享是区块链技术的完美适应。改进房地产将是困难的,但对于成功的公司来说可能是非常有利可图的。

物流

区块链领域已经有大量资金充裕的物流项目。其中大多数在像以太坊或 NEO 这样的公共网络上运行。然而,行业特定的区块链可能会发展,因为区域性货运公司的法律需求和要求与国际跨境运输的需求截然不同。每个空间的系统要求可能会非常不同,但这些系统需要进行通信和协调。在这里,联邦化的多链网络可能是一个很好的选择。处理跨链转移的技术仍在发展。然而,尽管在多个区块链上追踪代币存在困难,像 Tendermint 团队(Cosmos 的开发者)这样的团队正在努力实现这一点。

许可

目前,软件许可和其他知识产权的权利是使用大量专有系统管理和转移的,甚至还有老式的纸质工作。确定某些知识产权的所有权可能是困难的,甚至是不可能的。在美国,您自动拥有您创建的任何知识产权;然而,这种所有权没有记录在任何地方。可以注册您的所有权,但这绝非易事。由区块链驱动的知识产权系统将使 YouTube、DeviantArt 和 ModelMayhem 等网站能够代表其用户自动注册作品的能力。一旦注册,这些相同的网站可以帮助用户无缝地发出和撤销许可证。这样的方案将需要这些大型互联网站的合作,但这并不是第一次发生这种事情;网络的许多技术基础是通过行业联盟的努力而创建的,这些联盟旨在提高行业的效率和互操作性。

行业联盟

尽管区块链技术变得越来越分散,但不可避免的将出现整合。区块链整合的一种方式是不同的行业。与其他标准化流程一样,每个发现区块链有盈利用途的行业很可能会开始标准化一到两项关键技术或实施,然后将其作为默认选择。例如,在物流行业,有许多竞争项目和标准用于包裹的追踪和交付。其中一些项目是建立在以太坊上,另一些是建立在 NEO 上,还有一些是建立在他们自己的私有链上。这些方法中的某一个,或者是一个还没有被看到的新方法,将打入行业的最佳选择并成为标准。这是因为区块链技术非常适合团结不信任彼此的不同因素。这种最佳选择的技术几乎肯定是一批公司的成果,而不是启动的企业。财团有更容易认为不是威胁性竞争对手的时间,而是有机会汇集资源并成为一个成功团队的一部分。

可能会使用区块链的财团包括银行、保险、包裹投递和追踪等行业。而文档和法律追踪等行业更有可能存在多个私人竞争对手,原因是不同的市场力量。医疗追踪将受益于标准化的方法,但市场力量和监管问题使其更加困难。

大量的亏损项目

当前的区块链生态系统被比作 90 年代的互联网繁荣。结果可能会类似:一些关键项目会生存并繁荣,而其他项目会失败并成为投资者的负担。然而,与互联网繁荣不同的是,区块链项目从普通大众那里获得了远远更多的投资。这可能会导致一些有趣的结果。其中一个可能性是一个类似于互联网泡沫破灭的事件:资金短缺相当长一段时间,不管项目的质量如何。随着零售投资者承受了一定的损失,同时仍有机会继续投资,区块链崩溃的后果可能不会那么糟糕。然而,可能会对零售投资者造成严重伤害的严重崩溃更可能引起监管的反应。

法律和监管的演变

区块链技术的某种近期变化将来自监管。几乎每个主要国家都在审视 ICO 市场并设法最好地监管或利用区块链。在美国,证券交易委员会似乎越来越多地将 ICO 视为证券发行,这将使公司不得不进行 ICO 并提供更加典型与股票发行有关的财务和其它文件。

其他国家,比如白俄罗斯,正在采取非常实际的方法,希望吸引区块链公司和投资进入他们的国家。

安全令牌发行

针对持续的 SEC 行动和大量区块链项目的失败,越来越多寻求资金的项目将发行安全令牌。投资者将不可避免地开始寻求和要求更高质量的项目,因为低成本的机会已经被抢占,进入门槛将会增加。此外,安全令牌发行往往伴随着财务披露规则和其他要求,这将成为对那些明显还没有准备好获得资金支持的项目的门槛。当然,负面影响是,对于没有独立资金来源的未知参与者,甚至尝试进入市场都将更加困难。

目前,还没有专门用于安全令牌的交易所,事实上,许多现有交易所不希望交易这种代币,以避免自身受到安全法的影响。一旦安全令牌成为市场的一个较大部分,STO 交易平台将出现,或者有可能被添加到主要交易所和银行的现有股票交易平台中。

总和和保险产品

区块链代币的一个常见批评是个体资产的高波动性。为了应对这一点,已经有一些尝试创建代币池或代表其他代币的一篮子代币以减少波动性和风险,就像 ETF 和共同基金为股票做的一样。

我们预计会有进一步的尝试构建更稳定和更好对冲的代币产品。一个可能的选择是一种新的保险产品,以一定费用保护免受负面波动的影响。虽然在实际层面上可以通过期货和期权实现类似的效果,但保险是一个更熟悉的概念,对于对代币市场感兴趣的普通消费者和零售投资者更为熟悉。我们预计会有尝试将所有这些带到市场上。

技术稳定化

技术往往呈波动式发展。通常会有一个增长和实验的时期,然后是整合和标准化,然后周期重新开始。目前,有几种技术明显处于标准化目标的领先地位。

以太坊和 Hyperledger

以太坊、Neo 和 Hyperledger 都是已经吸引了不同项目的大量关注的技术。任何新来者不仅必须在区块链层面提供更优越的技术,而且还必须应对已经正在开发的一系列工具、现有库和教程。特别是,以太坊和 Hyperledger 生态系统已经有大量投资投入其中,并获得了大量企业支持。这两个项目是微软和亚马逊作为区块链即服务(BaaS)提供的唯一选择。

服务整合和产品提供

随着区块链技术的发展,提供区块链服务的公司数量也在增加。就像个别区块链项目一样,我们可以预期其中许多公司将消失,而更成功的公司将在其生态系统内占主导地位。在某些情况下,这是最初的经济策略:IBM 编写了大部分 Hyperledger 框架并将其作为开源提供,并且现在在该领域提供广泛的咨询服务。

随着亚马逊和微软提供区块链服务,企业的现成产品数量将增加。目前,许多企业自定义区块链开发成本过高,风险也很大。一旦标准和主导的参与者变得更加清晰,初创公司将更容易提供面向企业的定向区块链服务和区块链集成。在这个阶段,区块链的采用将真正成为主流。

跨链通信

区块链世界面临的一大挑战是跨链通信。一些项目,如 Cosmos,将这个问题置于其方法的核心。高效准确的跨链通信是使区块链能够扩展的关键能力,同时提供不同生态系统将需求的定制服务。虽然有一些方法正在开发中,但它们都还没有在典型的商业条件下在现实世界中真正得到证明。一旦找到一个好的解决方案,该区块链生态系统将比其他生态系统拥有巨大的优势。

与人工智能和物联网的交叉

当下另外两个主要的技术热点词汇是人工智能(AI)和物联网(IoT)。这些技术之间有许多可能的重叠和交叉点。

区块链交叉人工智能

人工智能需要大量数据才能发挥作用。这就是为什么许多大公司如此热衷于推进人工智能项目的一部分原因。较大的公司可以获取更多的数据,因此能够比拥有较少数据的公司产生更优秀的人工智能结果。因此,如果能够有效利用人工智能专业知识,较大的公司就会对小公司拥有巨大的竞争优势。公共区块链消除了这一优势,因为所有人都可以获得相同的数据。在这个领域,更灵活、毫无顾忌的小型初创公司可以利用这些公共数据通过专有或高度定向的提供新服务和产品。

同样,预计联合区块链将进一步加强现有的主要参与者,他们可以相互共享数据以排挤新的竞争对手。现有的卡特尔将拥有比任何个体行为者更庞大的数据宝库,围绕其行业形成了一道防御屏障。尽管联合会成员之间可能仍然相互竞争,但他们的数据优势将有助于保护他们免受新的市场进入者的侵害。

区块链与物联网的交集

物联网的持续威胁之一是安全性。数百万个网络设备导致了数百万个潜在易受攻击的物品,这些物品可能会被攻击者利用。使用区块链传递软件更新,以及诸如可信计算模块等系统,物联网设备可能至少部分地免受攻击,因为这需要攻击者中断整个链路,而不仅仅是特定设备。然而,这需要仔细的工程设计,而这种安全性的初次尝试很可能会因为实施错误而失败。

区块链与物流等领域的其他交互包括,公司将其交付车辆的移动与一个贸易联盟网络相结合,该网络将每个包裹的移动广播到整个网络,从而改善了交付并识别了问题。例如,一辆卡车碰到路障并在一组物流公司的贸易联盟中更新其行程,将使其他卡车能够绕行,从而提高了可交付性。

摘要

在本章中,我们讨论了区块链技术的近期可能未来。未来是不可预知的,但可以从中感知到的是,这些是塑造当今技术的行业趋势和力量。对于那些正在调查区块链的企业来说,这三个主要趋势中的每一个都将起到鼓励区块链采用或引起回避的作用。我们希望世界各国政府尽快发布清晰、经过深思熟虑的法规,并建立防范欺诈的保障措施。有了这些措施,这种技术进化将更加有指导性,以安全、更少风险地将区块链产品推向市场。

区块链技术总体上将继续应用于不同的行业。目前尚不清楚新网络如 EOS 和 Cosmos 将会带来什么样的变革,因为目前尚无主要链拥有这些系统力图提供的广泛治理模型。如果大规模、去中心化的治理能够良好运作,对于许多系统来说,这将是一个令人鼓舞的发展。例如,爱沙尼亚政府已经在一些政府职能上进行了区块链试点。

最有可能的情况是,当前的区块链系统最终不会成为主导。与大多数技术一样,主导系统将是根据当前一系列失败所得到的教训构建的系统。

标签:以太,代币,比特,网络,merge,钱包,qk,区块,ref
From: https://www.cnblogs.com/apachecn/p/18169372

相关文章

  • bc-etp-merge-0
    面向企业的区块链教程(全)原文:zh.annas-archive.org/md5/71bd99f39f23fd60e3875318ad23711a译者:飞龙协议:CCBY-NC-SA4.0前言区块链正在迅速增长,并改变着商业的运作方式。领先的组织已经在探索区块链的可能性。通过本书,你将学会如何构建端到端的企业级去中心化应用程序(DApps)......
  • bc-dev-hplg-merge-0
    Hyperkedge区块链开发教程(全)原文:zh.annas-archive.org/md5/7f932e9670331dae388d1a76f72881d8译者:飞龙协议:CCBY-NC-SA4.0前言这个学习路径是你探索和构建使用以太坊、HyperledgerFabric和HyperledgerComposer的区块链网络的简易参考。它从区块链的概述开始,向您展示......
  • adv-bc-dev-merge-0
    区块链高级开发教程(全)原文:zh.annas-archive.org/md5/64e2728fdd6fa177d97883a45d7dec42译者:飞龙协议:CCBY-NC-SA4.0前言区块链技术是一种分布式分类账,应用于金融、政府和媒体等行业。本学习路径是您构建使用以太坊、JavaScript和Solidity构建区块链网络的指南。您将首......
  • eth-proj-bg-merge-0
    面向初学者的ETH项目(全)原文:zh.annas-archive.org/md5/5b197ea4ae8836b6854907e58ea8a1dc译者:飞龙协议:CCBY-NC-SA4.0前言本书旨在让你深入了解以太坊区块链世界,并让你使用以太坊制作自己的加密货币。在本书中,你将学习各种概念,并直接应用这些知识,同时还将介绍以太坊区块......
  • C++指针与引用(Pointers OR References)
    一、PointersPointer是指针,可以用来指向任何一个objects,包括一般变量:1inti=3;2int*pi=&i;3cout<<pi<<endl;//0x0064FDF04cout<<*pi<<endl;//3此时pi本身内含i的地址,要取出pi所指向的object,可以使用*运算符(dereferenceoperator).Pointer......
  • react中什么使用定义变量,需要使用useRef,什么时候直接定义即可?
    在React中,决定使用useState、useRef或是直接定义变量,主要取决于你希望变量如何与组件的渲染周期互动以及是否需要持久化某些值。直接定义变量场景:如果你只是需要一个在函数内部临时存储数据的变量,而且这个变量的值不需要在组件重新渲染时保持不变,或者它并不直接影响UI的渲染逻......
  • Reflexion: Language Agents with Verbal Reinforcement Learning
    发表时间:2023(NeurIPS2023)文章要点:文章提出Reflexion框架,通过交互的方式获得反馈,并变成细致的语言feedback的形式作为下一轮的prompt,以此强化languageagents的能力,同时避免了更新大模型的参数。这样的好处有1)轻量,不需要finetuneLLM,2)feedback相比一个reward信号更加细致,3)充分......
  • C - Merge the balls
    C-Mergetheballshttps://atcoder.jp/contests/abc351/tasks/abc351_c 思路使用stack记录序列路径对栈顶两个元素尝试做缩减处理。 Codehttps://atcoder.jp/contests/abc351/submissions/52873456intn;stack<longlong>sq;intmain(){cin>>n;......
  • 组件的使用、父子通信、ref属性(父子通信)、动态组件、 keep-alive、插槽
    【组件的使用】1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<title>Title</title>6<scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">&......
  • Intel Pentium III CPU(Coppermine, Tualatin) L2 Cache Latency, Hardware Prefetch
    这几天,偶然的机会想到了困扰自己和其他网友多年的IntelPentiumIII系列处理器缓存延迟(L2CacheLatency),以及图拉丁核心版本是否支持硬件预取(HardwarePrefetch)问题。手头的支持图拉丁核心处理器的i815主板还在正常服役中,铜矿和图拉丁核心处理器也都有,所以就专门做了这一期调查,感......