以太坊基础
以太坊是一种开源的公共区块链,被认为是比特币的替代货币。加拿大加密货币研究人员和程序员 Vitalik Buterin 在 2013 年底提出了这个想法。该平台由 2014 年年中的一次在线众筹成立,于 2015 年 7 月底上线。2016 年的道事件导致硬分叉,分裂成以太坊 ( ETH )和以太坊经典 ( 等)。
在这一章中,我们将讨论以下关于以太坊的主题:
- 以太坊概述
- 以太、ERC20 令牌、智能合约、EVM、天然气、账户和神谕等基本概念
- 以太坊的性能问题和正在努力解决的问题,如 PoS、Casper、Plasma 和 Sharding
以太坊概述
2013 年末,Vitalik Buterin 向区块链社区发送了一封电子邮件,宣布了一份概述以太坊想法的白皮书。他将其描述为一个具有内部语言的通用平台,因此任何人都可以编写应用程序。根据 Vitalik 的说法,以太坊的最初想法是为金融科技创造一个通用的区块链。以太坊是比特币的变种。与比特币不同,比特币是一种专注于支付的区块链,以太坊是一种可编程的通用区块链。智能合约的引入是区分以太坊和比特币的关键。
一个众所周知的比喻来描述以太坊和智能合约,它们将交易数字或数字化实物资产的不信任方聚集在一起,这是一个自动售货机,如第 12 章 、区块链技术简介的 结尾所述。
自动售货机制造出来后,包括机器所有者在内的任何人都不能改变规则。买方不需要担心所有者在交易之前或交易期间改变规则。因此,买家可以相信机器会以预期的方式运行,并感到足够舒适,可以继续进行交易。当然,自动售货机不一定能提供完美的解决方案。顾客偶尔会面对一台出故障的机器,插入 1 美元,但什么也没发生。如果自动售货机不提供退款解决方案,如张贴联系电话,顾客将永久失去 1 美元。另一方面,以太坊的解决方案要健壮得多。智能合约形式的规则被分发给所有节点。相同的智能合约将几乎同时在全球数千个(甚至更多)节点上运行。只要至少有一个节点运行,事务就会成功执行。换句话说,以太坊是真正的世界计算机。
一些区块链爱好者回复了 Vitalik 的邮件,并形成了一个核心小组来推进和执行这个想法。(这篇开创性的论文名为A Next Generation Smart Contract and Decentralized Application Platform,可在 https://github.com/ethereum/wiki%20Wiki/的获得,存档于 2015 年 3 月 28 日,截至 2018 年 8 月 22 日共有 169 次修订。)2014 年 1 月,以太坊基金会创建。不久(2014 年初),英国计算机科学博士加文·伍德(Gavin Wood)发表了一篇名为以太坊:一个安全的去中心化广义交易账本(https://ethereum.github.io/yellowpaper/paper.pdf)的黄皮书。Gavin 的论文统一了实施以太坊理念的多项举措,并作为未来开发工作的蓝图。
在说以太坊众筹事件之前,我们需要先解释一下众筹的概念。众筹是指通过从大量人群中筹集资金来资助一个项目或倡议的做法,通常在互联网上进行。众筹是为一个项目融资的另一种方式。在区块链项目的情况下,众筹通常以项目所有者出售流通中的硬编码(预印)数字硬币的一部分的形式进行,以法定货币或比特币等其他既定数字货币的形式交换。
2014 年 7 月至 8 月,进行了一次网络众筹销售。这一事件导致销售了 1190 万枚预设的以太币——以太坊的本地加密货币。这大约是总乙醚硬币供应量的 12%:102,431,467。在这次众筹销售所得的资助下,开发开始了。以太坊的核心团队由维塔利科·布特林、米哈伊·阿利西、安东尼·迪·约里奥和查尔斯·霍斯金森组成。以太坊项目的真正开发是由瑞士公司以太坊瑞士有限公司(EthSuisse)开始的。该平台于 2015 年 7 月 30 日上线。
前以太坊 Stephan Tual 于 2016 年 4 月 30 日成立了一家名为 The DAO 的公司。这个实体的目的是管理选择部署哪个智能合约的过程。道想出了根据投资选择合同的聪明主意。完成的智能合同张贴在互联网上。一个潜在的投资者将宣布一笔投资于智能合约的金额。金额最高的智能合同将被选择部署。DAO 通过众筹销售筹集了创纪录的 1 . 5 亿美元来资助该项目。DAO 在 6 月份被黑客攻击,由于其软件中的错误,损失了价值 5000 万美元的乙醚。黑客行为在以太坊社区引发了一场关于如何应对的激烈辩论。出现了两种对立的观点:
** 增强以太坊代码,使类似的攻击在未来不可行,并将代码部署到所有节点 * 不要修改以太坊的核心代码,并承担未来攻击的风险
Vitalik 呼吁硬分叉解决方案,并公开要求所有以太坊节点停止补丁代码部署的交易。几个小时内,全球数千个节点全部关闭。大多数节点投票赞成采用硬分叉方法,并使用补丁升级了他们的核心以太坊代码,但一小部分节点选择不使用补丁,仍然运行相同的代码。
这个硬分叉事件将以太坊区块链一分为二。运行旧代码维护原始区块链的节点成为以太坊经典,硬币符号为 ETC,而运行补丁代码维护分叉以太坊区块链的节点成为以太坊,硬币符号为 ETH。分叉正好发生在块号 1,920,000 处。这种强硬的分歧造成了两个网络之间的竞争。现在,ETH 的价格已经上涨了 130 多倍,而 ETC 的价值只有 ETH 的十分之一,因为它不受欢迎,而且担心未来会遭受 DAO T1 类型的攻击。
继刀硬叉之后,以太坊在 2016 年 Q4 两次分叉应对新的攻击。虽然硬分叉解决了过去的黑客攻击,但这显然不是可扩展的解决方案,因为人们不能总是依靠创建硬分叉来解决未来的每一次黑客攻击。因此,以太坊通过防止黑客发起新的垃圾邮件攻击增强了保护。
虽然硬分叉用于解决黑客攻击,但软分叉被以太坊用于协议升级,这是影响以太坊底层功能和/或激励结构的重要变化。一些值得注意的软分叉如下:
- Homestead 用于改善交易处理、天然气定价和安全性。软分叉发生在 2015 年 7 月 31 日。
- Metropolis part 1:Byzantium是为了减少 EVM 的复杂性,为聪明的合同开发者增加更多的灵活性。软叉发生在 2017 年 10 月 16 日。
- 未来还计划进行两次协议升级:Metropolis part 2T2:君士坦丁堡有助于为过渡到 proof-of-stake 奠定基础。
2017 年 3 月,区块链创业公司、研究团体、各大公司创建了由 30 名创始成员组成的企业以太坊联盟 ( EEA )。今年 5 月,该非营利组织扩大到包括 16 家家喻户晓的企业成员,如康乃尔大学的研究小组、三星 SDS、微软、英特尔、摩根大通、DTCC、德勤、埃森哲、桑坦德银行、BNY 梅隆、荷兰国际集团和加拿大国家银行。到 2017 年 7 月,该名单已增加到 159 名成员。
尽管以太坊自最初推出以来进行了许多改进,但它仍在继续发展。以太坊 2.0 旨在解决最薄弱的环节之一,可扩展性,根据 Vitalik 最近的评论,预计将于 2019 年分阶段推出。
以太坊基本概念
以太坊建立在比特币区块链之上,包括一些关键功能,如包含链式块的分布式账本、工作证明算法等。然而,它最大的增加是引入了智能合约,这是用图灵完全脚本语言编码的。由于这一新的补充,与比特币或其非智能合约近亲不同,以太坊允许开发者解决一般的商业问题。
在开始基本概念之前,我们总结一些以太坊的有用事实如下:
-
以太坊有三种主要成分:
- 分散:保证执行
- 哈希:用于保卫世界国家
- 签名:用于授权程序和交易
-
由于以太坊是一个区块链,它使用数学算法来取代中介实体,将不信任的各方聚集在一起做生意。
- 以太坊区块链带来了对数据的信任,因为它能够通过其共识机制来验证节点上数据的有效性。
- 它使用全面验证来取代中央控制。
- 与交易一样,部署智能合约也需要数字签名。部署的智能合约是永久的,不可更改的。
- 智能合同分配有地址。
- 假设智能合约有一个错误,需要修复。修补后的智能合约将使用新分配的地址进行部署,因此被视为与旧智能合约没有关系的全新智能合约。
- 2017 年 5 月,以太坊在全球拥有 25000 个可达节点,由全节点和轻节点组成。
- 完整节点下载并提供完整的区块链。以太坊总账可以修剪。完整节点验证正在构建的块中的事务。miner 节点必须是完整节点。
- 光节点不存储整个区块链,但是它存储来自它信任的人的它关心的部分。
- 合同代码的脚本通过以太坊虚拟机 ( EVM )在全节点上执行。智能合约的地址存储在 EVM 上运行的字节码,称为操作码。
- 由于智能合约在数万台机器上的完整节点上运行,它确实是全球性的。换句话说,给区块链写一个智能合约是全局的和永久的。
- 由于智能合约脚本以分散的方式存储,它提供了额外的安全层。这是真的,因为所有完整节点都知道其他节点存储相同的代码。对于黑客来说,将恶意脚本推送到世界范围内的所有良好节点并使它们崩溃是不可行的。
- 智能合同是一个脚本化的法律文件,并保证执行。由于智能合约是在其部署时签署的,并且调用它的事务也是签署的,因此在事务中的两个交易方之间不应该有争议。换句话说,有了以太坊这样一个去中心化的区块链,对法官的需求就消失了!节点,并可以发展成一个完整的网络。
- 由于永久性和不变性的本质,以太坊区块链的数据和程序是可审计的。这对于政府执行法规和合规性要求可能具有特殊意义。
-
以太坊是开源的。任何人都可以下载代码并创建他或她自己版本的以太网。当然,问题是如何让其他人相信它的价值,让他们加入这个网络。
-
以太坊是分散的。因此,没有主节点控制或支配整个网络。该网络按照其协议通过共识运行。
- 以太坊也提供容错功能。只要在灾难性攻击中至少有一个完整节点幸存,网络就可以从幸存的节点重建并发展成完整的网络。
- 虽然以太坊提供了极端的鲁棒性,但另一方面是当它失控时如何阻止它的问题。就像在 DAO 黑客攻击的例子中,网络不得不依靠 Vitalik 和他的权威来完全关闭它。与今天相比,那时的网络要小很多倍。随着网络规模的不断扩大,这种方法将变得更加困难。将来,网络可能会增长到数千万个节点或更多。只要有一个节点没有响应权威的呼叫,以太坊网络就仍然活着。换句话说,完全关闭一个网络变得极其困难。当然,这就是去中心化的区块链的全部含义:没有中央集权的权威对其他人发号施令!
- 以太坊允许递归调用其他智能合约。写得不好的智能契约会导致无限循环。为了解决这个问题,以太坊内置了一个断路器机制,Gas,后面会详细解释。
- 在大数据平台上,一项任务被划分为多个块,这些块被分配给网络上的节点,工作由节点分担。然而,以太坊的完整节点执行相同的脚本。这意味着以太坊区块链的每个完整节点都存储和计算相同的数据;这是可靠的,但不可扩展。可伸缩性问题是以太坊的主要批评之一。正如我们将在后面讨论的,正在进行多种努力来解决这个问题。
- 以太是以太坊的原生加密货币。以太坊允许用户发行他们自己的被称为代币的数字硬币。ERC-20/ERC-721/ERC 1400 是发行以太币时要遵循的通用技术标准。
- 以太坊可以看做是互联网的第三代。这可能是以太坊的 JS API 被称为 Web3 的一个原因。有人在讨论用区块链技术改写互联网。
- 在分散的互联网上提供集中服务的做法(如谷歌在分散的互联网上提供集中的搜索功能)也将适用于区块链。
醚
由于以太坊是建立在比特币之上的,所以被认为是一种比特币 altcoin。以太之于以太坊,类似于 BTC 之于比特币。以太坊是指协议、区块链、客户端软件和 mainnet 时使用的名称。
以太坊主网是客户端用于将数字资产从发送方传输到接收方的区块链网络。换句话说,它是一个网络,在这个网络中,实际的交易发生在一个分布式的分类账上。Mainnet 相当于一个生产环境。以太坊测试网用于开发。如https://www.ethernodes.org/network/2所述,截至 2018 年 10 月 8 日,mainnet 拥有 13662 个节点,testnet 拥有 29 个节点。由于实际的交易发生在主网上,以太只有在以太坊主网上才有实际价值。换句话说,在测试网上,它一文不值。以太币(ETH 和 ETC)在数万个数字货币市场上市交易。它们的价格相差很大。比如 2018 年 10 月 8 日,ETH 在 223 美元附近交易,ETC 在 11 美元。
以太可以在地址(账户)之间转移。它用于支付矿工的计算工作;他们被支付交易费以及执行交易产生的气体消耗。在这里,气体的概念对于以太坊来说是至关重要的,我们将在后面详细讨论。
乙醚是最大的单位。还有其他单位。最小的叫魏,以数字货币的创始人的名字命名,他也是电子货币的发明者。B-money 是他提出的一个匿名分布式电子现金系统。其他单位包括 Gwei、microether 和 milliether。他们都有第二个名字。例如,milliether 也被称为芬尼,以另一位数字货币先驱 Harold Thomas Finney II 的名字命名,他在 2004 年编写了世界上第一个实现的加密货币 RPOW(可重复使用的工作证明),先于比特币。下表给出了乙醚和其他单位之间的转换率:
| 单位 | 魏值 | 魏 | | Gwei(香农) | 10 9 魏 | One billion | | 微醚(szabo) | 10 12 魏 | 1,000,000,000,000 | | 中间(芬妮) | 10 15 魏 | 1,000,000,000,000,000 | | 乙醚 | 10 18 魏 | 1,000,000,000,000,000,000 |
ERC20 tokens
以太坊是一个通用的区块链。它允许开发者建立一个 DApp 和交易数字资产。相应地,它允许开发者定义一个称为令牌的用户专用硬币。这些令牌中的大多数是 ERC20 令牌。ERC 指的是以太坊的意见征询,20 是分配给该请求的号码。换句话说,ERC-20 是一种技术标准,用于以太坊区块链上的智能合约,以实现令牌。根据 Etherscan.io 的数据,截至 2018 年 10 月 8 日,以太坊主网络上共发现 125330 个 ERC-20 兼容令牌。
ERC 20 定义了以太币要遵循的一系列规则。通过这样做,它允许在更大的以太坊生态系统内的以太坊令牌之间的交互和转换。目前,乙醚不符合 ERC-20 标准。不过由于以太是以太坊的原生币,所以可以兑换成其他代币。ERC-20 规范定义了包含方法和事件的接口。
以下是所需方法的列表(github.com):
name
:返回令牌的名称,例如HelloToken: function name() view returns (string name)
。symbol
:返回令牌的符号,例如HTC: function symbol() view returns (string symbol)
。decimals
:返回令牌使用的小数位数;例如,8 表示将令牌量除以 100,000,000,得到其用户表示:function decimals() view returns (uint8 decimals)
。totalSupply
:返回总令牌供应量:function totalSupply() view returns (uint256 totalSupply)
。balanceOf
:返回另一个账户在address _owner: function balanceOf (address _owner) view returns (uint256 balance)
的账户余额。transfer
:将指定数量(_value
)的令牌转移到_to
地址,必须触发转移事件。如果_from
账户余额没有足够的代币来消费:function transfer(address _to, uint256 _value) returns (bool success)
,该函数将抛出一个错误。-
transferFrom
:将指定数量(_value
)的令牌从_from
地址转移到_to
地址,必须触发转移事件。该函数应该抛出一个错误,除非_from
账户通过某种机制故意授权消息的发送者:function transferFrom (address _from, address _to, uint256 _value) returns (bool success)
。 -
approve
:允许_spender
从您的账户中多次提款,最高可达_value
金额。如果再次调用该函数,它会用_value: function approve (address _spender, uint256 _value) returns (bool success)
覆盖当前余量。 allowance
:返回_spender
仍然可以从_owner: function allowance (address _owner, address _spender) view returns (uint256 remaining)
中提取的金额。
所需事件的列表如下:
transfer
:令牌转移时必须触发,包括零值转移。创建新令牌的令牌契约应该触发一个Transfer
事件,当创建令牌时_from
地址设置为 0x 0:event Transfer (address indexed _from, address indexed _to, uint256 _value)
。approval
:必须在任何成功的呼叫上触发以批准(address _spender
、uint256 _value): event Approval (address indexed _owner, address indexed _spender, uint256 _value)
。
虽然以太坊允许一个人创造他或她自己的钱,但以太坊的真正价值是它保证了智能合同的执行。Ether 和 ERC20 token creation 主要用于支持一个项目的初始众筹目的,并用于交易期间的支付,以规避银行。没有真正的业务用例,令牌一文不值。
智能合同
智能合同这个术语最初是由计算机科学家、法律学者、比特黄金的发明者尼克·萨伯在 1994 年创造的。他在加密货币领域是一个活生生的传奇,因为他对数字合同和数字货币的研究。有些人甚至认为他是小本聪,尽管他否认了这种说法。
Nick Szabo 最初对智能合约的定义如下:
“智能合同是执行合同条款的计算机化交易协议。智能合同设计的一般目标是满足常见的合同条件(如支付条款、留置权、保密性,甚至强制执行),最大限度地减少恶意和意外的例外,并最大限度地减少对可信中介的需求。相关的经济目标包括降低欺诈损失、仲裁和执法成本以及其他交易成本。”
对于自动售货机,交易规则内置于机器硬件中。数字资产的交易规则内置于脚本中。也就是说,智能合约由代码组成。以下是一些关于智能合约的有用事实:
- 智能合约是不可变的。
- 聪明的合同是永久的。
- 智能合同带有时间戳。
- 智能合同全球通用。
- 智能合同是数字化的法律文件。
- 智能合同是一种计算机协议,旨在以数字方式促进、验证或执行交易方之间的约定合同。
- 智能合同允许在没有第三方作为中介的情况下执行交易。这些交易是可审计的和不可逆的。
- 智能合约可以转移数字硬币、执行传统支付、转移数字资产,甚至交付现实世界的商品和服务。
- 对于涉及第三方的商业交易,例如,购买/出售房屋,托管账户通常用于临时存储交易方的资金。使用智能合同,不需要托管账户。智能合约消除了对托管账户的需要,因为它们保证在转移资金和资产时得到执行。
- 智能合同比传统合同法提供了更多的安全性,其交易成本只是与合同相关的其他交易成本的一小部分。
- 在以太坊基金会使用的解释中,智能合同不一定指合同的经典概念。它可以是任何一种计算机程序。
- 要部署和运行智能合约,必须对部署进行数字签名,类似于在以太坊区块链上发送其他数据或交易。
- 智能合约可以是公开的,对开发者开放。这导致了安全问题。如果智能合约有缺陷或安全漏洞,所有开发人员都可以看到。更糟糕的是,由于其不变性,这样的缺陷或漏洞不容易修复。这给了黑客足够的时间来探索弱点并对以太坊区块链发起攻击。DAO 事件是这一问题的一个引人注目的例子。
以太坊智能合约可以用四种语言之一开发:solidity(受 JavaScript 启发)、Serpent(受 Python 启发,不再使用)、LLL(受 Lisp 启发)和 Mutan(受 Go 启发,不再使用)。不管使用哪种语言,智能合同都是用高级编程语言编写的,需要编译成低级的机器可运行语言。在以太坊智能合约实现中,使用了类似于 Java VM (JVM)概念的 VM 方法。以太坊虚拟机被称为 EVM 。智能合同脚本被转换成 EVM 可运行的代码,称为字节码。操作码然后被部署到以太坊区块链用于执行。目前,一种面向研究的语言正在开发中,它被称为 Vyper,是一种基于 Python 的强类型语言。
以太坊虚拟机
在 60 年代,当计算机刚刚被发明的时候,编码是用一种低级语言,例如汇编语言(assembler)。例如,汇编代码行,添加 R1 R2 R3,是将寄存器 1 和寄存器 2 的内容相加的指令,结果放入第三个寄存器 R3。寄存器是 CPU 内置的临时存储区域。对于 32 位 CPU,寄存器的长度为 32 位。
汇编语言中的代码然后被转换成 0 和 1 序列的机器语言,这是机器可执行的。用低级语言编写代码既乏味又耗时。当 ALGOL 或 BASIC 等高级语言发明出来后,编码时间大大减少。然而,底层过程保持不变:以 0 和 1 序列将代码编译成机器可执行语言。Java、Python、JavaScript、C++是目前比较流行的高级语言。
虽然这种编译方法运行良好,但它确实有一个不便之处:缺乏可移植性。在计算机上编译的一段代码是机器相关的。换句话说,它是不可移植的。为了解决这个问题,引入了虚拟机的概念。一个虚拟机 ( VM )是一个计算机系统的仿真。有两种类型的虚拟机:系统虚拟机(也称为完全虚拟化),它提供了真实机器的替代品,以及进程虚拟机,用于在独立于平台的环境中执行计算机程序。这就是我们在前面的讨论中提到的价值管理过程。
用高级语言编写的程序被编译成 VM 可执行代码。只要计算机支持这样的虚拟机,编译后的代码就可以在上面运行,而不需要重新编译。例如,JVM 是一种众所周知的 Java VM,它使计算机能够运行编译成 Java 字节码的 Java 程序。
以以太坊为例,智能合约是用高级语言编写的,大多是 solidity。智能合约被编译成操作码,这些操作码可以在专门为以太坊构建的虚拟机上执行,即 EVM 。EVM 带来了可移植性和健壮性,因为 EVM 执行运行时检查来防止崩溃。不过,这些类型的检查确实有性能损失。
由于以太坊合约可以用四种语言中的任何一种来编写:solidity、serpent、LLL 和 Mutan,因此有四个编译器可以将四种语言编码的智能合约转换为运行在 EVM 上的操作码。另一个相关的概念是以太坊客户端,它指的是安装在一个节点上的软件集合,用于解析和验证区块链交易、智能合约以及所有相关的东西。以太坊客户端以八种语言中的一种实现:Python、C++、Go、JavaScript、Java、Haskell、Ruby 和 Rust。实现的 EVM 是以太坊客户端的重要组成部分。因此,操作码可以在八个客户端实现中的任何一个上运行。EVM 最初是为货币交易设计的,后来扩展到了其他数字资产。因此,对某些功能的支持是有限制的。开发人员面临一些严格的限制(例如,字符串或本地寄存器的使用)。
以太网气体
以太坊交易可以调用智能合约,智能合约又可以调用另一个智能合约,然后再调用另一个智能合约,以此类推。当智能合约有问题时,它会导致无限循环。在区块链之外,解决无限循环问题很容易。人们可以通过简单地关闭服务器、重启服务器、调试程序、修复代码中的错误逻辑、重新编译并重新部署来停止失控的程序。
对于以太坊区块链,这种方法根本行不通!想象一下,如果全世界成千上万的节点几乎同时进入无限循环。为了停止无限循环的智能合约,需要在短时间窗口内关闭所有节点。只要有一个节点不符合要求,无限循环的智能契约就会继续存在并运行。协调和关闭所有这些节点是一场后勤噩梦。
为了解决这个问题,引入了气体的概念。车辆依靠燃烧气体的发动机行驶。当发动机没有汽油时,车辆就会停下来。以太坊引入了气体概念来达到同样的效果。向以太坊区块链提交交易时,请求者需要提供最大气体量。例如,在以下示例中,提交了一个事务请求来调用 HelloWorld 智能合约,该合约的最大消耗量不超过指定的气体值:
当挖掘节点验证该请求时,将调用 HelloWorld 智能协定。在 EVM 上运行的每个操作消耗预定量的气体。例如,ADD(加法运算)消耗三种气体,MUL(乘法运算)消耗五种气体。为了便于说明,假设一个智能协定写得很糟糕,并且包含一个无限循环。此外,我们假设每个循环由一个加法运算和一个乘法运算组成。因此,一个循环将消耗八种气体(三种气体用于加法,五种气体用于乘法)。EVM 执行足够的循环后,指定的最大气体值将被消耗。因此,EVM 停止执行合同。因此,所有节点将几乎同时停止运行。gas 的另一个优势是使垃圾邮件变得昂贵,因此降低了黑客攻击的风险。
气体是一种计量单位,用于测量消耗量,正如千瓦是一种计量单位,用于测量用电量。假设,一个月,一个家庭用 210 KW。在向家庭发送账单之前,公用事业公司首先根据预定义的兑换率将 210 KW 转换为美元。假设单位千瓦成本为 0.2 美元,则该月的总费用为 0.2 * 210 = 42 美元。类似地,气体使用被转换成乙醚并向请求者收费。以太坊允许请求者在提交交易时指定兑换率。矿商有权通过给予较高费率的交易更高的优先权来选择性地处理交易。如果申请人未指定汇率,EVM 将使用默认汇率,该汇率会有所不同。例如,2016 年的比率为 1 天然气= 0.00001 ETH。2018 年一气= 0.00000002 ETH。
账户
在 第十二章 ,区块链技术介绍中,我们讨论了地址,一个类似账户的概念,它用来托管 BTC 的余额。比特币使用 UTOX 模型来管理 BTC 在地址之间的转移。然而,人们必须检索整个分类帐来找到地址的余额,这是非常不方便的。这种不便是由于比特币不支持链上图灵完全编程语言,并且它没有状态的概念。另一方面,以太坊区块链支持脚本语言和智能合约;它能维持状态。以太坊交易通过调用智能契约方法来管理状态转换。以太坊不再需要依赖 UTOX 来管理支付。相反,它通过状态转换使用帐户和余额来运行。状态表示所有帐户的当前余额,以及其他数据。状态不存储在区块链上。这是保存在一个 Merkle 帕特里夏树链外。这是因为状态是可变数据,而块是不可变的。与比特币一样,加密货币钱包可以用来管理公共和私人密钥或账户,用于接收或发送 ETH。换句话说,以太坊引入了账户的概念。
以太坊支持两种类型的帐户:外部拥有的帐户(由人类用户通过拥有私钥来控制)和合同帐户。
- 外部控制账户:
- 有乙醚平衡
- 可以为转移以太网或触发智能合约代码启动交易
- 由用户通过私钥控制
- 没有关联的智能合同代码
- 一个合同账户:
- 有乙醚平衡
- 具有关联的智能合同代码
- 智能合约代码的执行由从其他合约收到的交易或调用触发
- 对于这两种类型的账户,有四个组成部分:
nonce
:对于外部自有账户,是指从账户地址发出的交易笔数;对于合约帐户,每次该合约调用另一个合约时,nonce 都会增加balance
:是该地址拥有的卫的号码storageRoot
:账户存储内容的 256 位哈希codeHash
:该账户的代码哈希为 EVM;这是地址收到呼叫时执行的代码
当乙醚从合同帐户转移到外部拥有的帐户时,需要付费,例如 21,000 gas。当以太网从外部拥有的帐户发送到合同帐户时,费用更高,并且取决于在交易中发送的智能合同代码和数据。
以太坊地址具有以下格式:
- 以前缀 0x 开始,这是十六进制的通用标识符
- ECDSA 公钥的 Keccak-256 哈希(big-endian)最右边的 20 个字节
因为在十六进制中,一个字节存储两位数,所以一个 20 字节的地址用 40 个十六进制数字表示。一个示例地址是0xe99356bde974bbe08721d77712168fa074279267
。
神谕
正如我们已经了解到的,相同的以太坊智能合约在世界各地的节点上执行。我们还没有强调的是,所有这些节点都接受相同的输入集,并且应该产生相同的输出。这叫做决定论。以太坊依赖于这种确定性,因为为了验证智能合约和交易的有效性,挖掘节点必须在使用相同输入运行相同代码时产生相同的结果。
这种决定论提出了一个挑战。一方面,以太坊是一个通用平台,可用于传输任何数字或数字化资产。其智能合约需要来自外部来源(如互联网)的数据或输入,例如股票价格、宏观或微观经济指数等。如果无法访问这些信息来源,智能合约的用例将被限制在其潜力的很小一部分。另一方面,即使有微小的时间差,节点也可能从外部来源检索不同的信息。不同的输入,节点最终会有不同的输出。因此,决定论性质不成立。因此,不允许智能合约调用互联网 URL 或直接从外部来源提取数据。为了解决这个矛盾,实现了 oracle 的概念。
根据韦氏词典的说法,神谕的一个定义是一个神龛,神通过这样一个人揭示隐藏的知识或神的目的。在区块链世界中,oracle 指的是提供外部数据的第三方或分散的数据馈送服务。甲骨文提供了从现实世界到数字世界的接口。Oracle 数据不是区块链的一部分。它是离线保存的。
有不同类型的 oracle。其中两个是软件先知和硬件先知:
- 软件神谕:通常指易于获取的在线信息,如股票指数收盘价、外汇汇率、经济新闻或天气预报等。软件甲骨文是有用的,因为它们提供了种类繁多的智能合同和最新的信息。
- 硬件神谕:通常指 UPS 发货扫描、挂号邮件扫描、供应商发货扫描等扫描信息。此提要对于激活在事件发生时触发的智能合约非常有用。
其他概念
由于以太坊是建立在比特币之上的,所以很多基本概念已经在第十二章区块链技术简介中讨论过了。对于本小节的其余部分,我们将简要介绍其中的几个,重点放在关键差异上。
- 共识算法:
- 和比特币一样,PoW 是它的共识算法。与比特币不同,以太坊正致力于切换到另一种名为Proof-of-stage(PoS)的共识算法,以显著提高其下一个版本 serenity 标签的性能。
-
二等兵区块链:
- 一般来说,比特币和以太坊都是公共区块链,因为网络对任何人开放,节点可以自由加入。
- 以太坊在私有链上有变种。对于私有以太坊,节点在加入网络之前需要获得批准。这些区块链被称为私人区块链。私有区块链适用于企业应用程序。Hyperledger 和 JPM·摩根的 Quorum 是以太坊著名的私有区块链变体的例子。再比如 Brainbot 的 hydrachain。
-
链外数据:
- 对于比特币区块链,我们不太谈论链外数据的概念。与以太坊区块链,这个话题需要讨论。在多种情况下,数据无法存储在链上:
- 第一种情况是状态变量。存储在区块链中的所有数据都是不可变的,因为数据块的内容经过哈希处理,并且数据块通过这些哈希进行链接。一个区块内容的微小改变,会导致之后所有区块的重建,这显然是不可行的。然而,状态变量是用来保持平衡的。他们确实改变了内容以反映平衡的变化。一个解决办法是保存他们的外链。
- Oracles 是另一个例子,从外部来源提取的信息被离线保存以提供给智能合同。
- 以太坊的发明是为了允许通用数字或数字化资产的交易。描述底层资产的元数据是离线保存的。
- 使用比特币,分布式分类账必须保存在所有节点上,以便提供交易验证所需的信息。在以太坊的情况下,加密货币或数字资产的余额可以直接从状态变量中检索。不需要浏览分类帐以获得余额来确定 _from 地址是否有足够的资金。因此,一个完整的节点可以选择只保留一部分分类帐,即修剪一个分类帐。被修剪的块可以保存在链外的集中位置,以备将来查询。
- 对于比特币区块链,我们不太谈论链外数据的概念。与以太坊区块链,这个话题需要讨论。在多种情况下,数据无法存储在链上:
-
测试:
- 彻底测试、双重测试和三重测试智能合约至关重要。安全测试至关重要。正如前面所解释的,在以太坊短暂的历史中,已经发生了几次高调的黑客事件,这些事件主要是由于智能合约代码错误而发生的。
- 由于智能合约中引入的漏洞,以太坊不如比特币安全。以太坊智能合约保存在链式块中,没有加密。黑客可以很容易地发现和探索有缺陷的合同代码的漏洞,并参与攻击。另一方面,和比特币一样,以太坊上的数据和交易相对安全,不容易被黑客攻击。黑客可以构造恶意交易调用和滥用的只是契约。
- 智能合约部署后,它是永久的,不可更改的。修订代码的部署将成为一个地址不同的新合同。它有不同的状态变量和新的余额。
- 智能合同的部署不是免费的。它燃烧气体。
- 数字签名、加密和公钥/私钥:
- 比特币是一个多重签名的过程。为了执行交易,双方必须签字。以太坊也差不多。此外,部署智能合约也需要数字签名。
- 像比特币一样,通过以太坊区块链,人们可以使用钱包应用程序,同时生成一对公钥和私钥。地址是从公钥中导出的;也就是说,地址只是公钥的散列。发送方使用私钥对交易进行签名,接收方使用公钥验证签名的真实性。通常,一对公钥和私钥可用于支持以下两种类型的活动:
- 发送秘密消息:公钥用于加密消息,私钥用于解密消息。
- 签名:用私钥加密生成签名。公钥用于解密以进行签名验证。
- 比特币和以太坊的大宗交易内容目前都没有加密。另一方面,Zcash 中的块内容被加密。
- 由于每个以太坊交易,包括智能合同,都必须进行数字签名,节点只需要接受数字签名的请求,潜在地不需要验证整个交易历史。这种方法有助于提高性能。
- 道:
- 道指的是去中心化的自治组织。人们不应该将它与名为 The DAO 的组织相混淆,该组织因与导致以太坊分裂为以太坊 ( ETH )和以太坊经典 ( 等)的黑客事件有关而闻名。
- DAO 可以被认为是由智能合约组成,智能合约是以分散代码的形式建立的,即分散核心→智能合约→ DAO 的分层结构。
- 分散的代码保存在多个节点中。肯定会跑,停不下来。
- 智能合同转移资金和数字资产。
- DAO 由智能契约组成,并创建一个独立的实体或社区。
-
DAP:
- DApp 是一个大话题。由于书的篇幅限制,我们简单地提一下:
- DApp 指的是分散式应用,使用分散式代码。
- 以太坊是一个通用的 DApp 平台。
- 以太坊 DApp,像任何其他区块链 DApp 一样,有一个分散的后端(例如,智能合同)和一个集中的前端(用于与区块链交互的客户端应用程序)。这种架构是由于当今区块链的性能和局限性造成的。
- 如前所述,后端的很大一部分,即数据库和业务逻辑,是在异地托管的。
- DApp 是一个大话题。由于书的篇幅限制,我们简单地提一下:
-
以太坊问题:
- 以太坊受到比特币遗留问题的困扰:
- 由于分叉或分割,数据可能会丢失。当有两个竞争链时,为了在所有节点上保持数据一致性,必须丢弃无法快速增长的链。如果短链上的事务不包含在获胜链的块中,甚至不被它们的原始请求者所知,那么它们将会丢失!
- 由于链上数据没有加密,区块链不是匿名的,也不是机密的。
- 地址未经验证。这很糟糕。当一个接收者的地址输入错误,硬币将被转移到它将是永久的,因为交易是永久的,硬币被永远锁定!
- 功率算法消耗大量功率。据报道,中国的一些大型采矿作业需要专用电站供电。
- 以太坊受到比特币遗留问题的困扰:
表演
比特币继承的另一个问题是以太坊速度慢。它比托管事务数据的其他平台(例如传统数据库)慢很多倍。例如,比特币创造新纪录平均需要 10 分钟。根据经验,在等待构建六个新块之后,事务被认为是最终完成的(与数据库中的提交相同)。这意味着,平均而言,请求者将等待一个小时才能看到请求完成。在以太坊,矿工建造一个街区的平均时间是 17 秒,建议你在交易被确认之前等待 12 个街区。对于用户来说,这是 12 * 17 = 204 秒,即 3.4 分钟的等待时间。这里,在确认一个事务之前等待几个后续块的构建是有用的。在任何时候,以太坊都可以有竞争链。等待给以太坊足够的时间来解决竞争链的问题并达成共识。
生产能力
吞吐量是衡量系统在给定时间窗口内可以处理多少信息单元的指标。为了测量事务平台的性能,吞吐量用 TPS 表示,每秒事务数:
- 对于比特币,TPS 的计算方法如下。一个比特币区块通常包含 1500 至 2000 笔交易。还是用高端号吧,2000。由于确认这 2000 笔交易需要 60 分钟,其 TPS = 2000/(60 * 60)= 0.56;也就是每秒只有半个事务。以太坊的类似计算得出 TPS = 2000/204 = 9.8,几乎每秒 10 次交易——比比特币好得多。在 Vitalik 的领导下,以太坊基金会正在研究分片方法,目标是将 TPS 提高 80 倍。
- 相比之下,VISA 的平均 TPS 为 2000,峰值为 40000。像 VoltDB 这样的高性能数据库每秒可以处理一百万次以上的插入。一个证券交易所每秒可以匹配数千笔交易。
- 然而,这种比较并不完整。从商业角度来看,信用卡或外汇交易只有在清算和结算时才算完成。对于信用卡,账单周期通常为 2-3 个月。证券交易所需要三天时间来完成一笔交易。从这个意义上说,以太坊要快得多,因为在区块链交易和结算是同时发生的。
- 与数据库相比,以太坊处于劣势。数据库提交可以在插入、更新或删除事务后立即发生。
- 这些是造成以太坊缓慢的原因:
- 每个完整节点必须执行相同的智能合约代码。
- 随着以太坊网络变得更大,达成共识的时间将会更长,因为在越来越多的节点之间传输数据以验证交易、访问信息和通信需要时间。
- 有一些方法可以增加吞吐量。以下是一些例子:
- 当块大小增加时,块中可以承载更多的事务,并且可以获得更高的 TPS。
- 并行运行多个链。Hyperledger Fabric 和 R3 的 Corda 等企业链使用这种方法。
- 状态通道设计有助于提高吞吐量。以太坊的状态通道实现的一个例子是 Raiden。微雷电于 2017 年 11 月上线。状态通道背后的思想是在两方之间的交易中使用链外方式,在交易结算中使用链上方式。链外交易是另一个值得深入探讨的话题,但不在本书中。
利害关系证明
PoS 共识算法基于以下原则:当矿工拥有更多硬币时,矿工具有更多挖掘或验证交易的能力,构建新区块的机会更高,因此获得更多奖励硬币的机会也更高。PoS 是节能的,可以更快地达成共识。
为了避免总是选择最富有的矿工的情况,有几种随机化方法可用于选择矿工来建造下一个区块,而不仅仅是基于外部拥有的账户的乙醚余额:
- 随机区组选择 : 使用一个公式,结合赌注的大小寻找最低散列值,以选择矿工。
- 币龄选择 : 币龄足够长,比方说 30 天,才有资格争夺下一块。一个拥有更老更大硬币的矿工更有可能被授予这个角色。
- 委托的利害关系证明 : 该实现选择有限数量的节点向区块链提议和验证区块。
- 随机利害关系证明 : 随机选择每个节点,使用可验证的随机信标来构建新的块。
以太坊正致力于在一个新的标签版本中用 PoS 取代 PoW。
鬼马小灵精
PoS 正被用来替代计算效率低下的 PoW 算法。由于担心出现一组集中式超级节点(它们在构建新块的过程中发挥了巨大的作用)等问题,PoS 没有在 mainnet 上完全实现和升级。Casper 是以太坊社区从 PoW 过渡到 PoS 的努力。
在 Per Casper 协议中,验证者(相当于比特币矿工的以太坊)留出一部分以太作为赌注。当验证者识别要构建的候选块时,验证者在该块上下注。如果块确实被添加到链中,验证者根据他或她的赌注的大小得到奖励。恶意行为的验证者将受到惩罚,他们的木桩将被移除。卡斯珀有两个主要项目:卡斯珀 FFG 和卡斯珀 CCB。
卡斯帕·FFG(友好的终结小工具;Vitalik 的 Casper 版本)是一种混合算法,在 PoW 上运行,但将网络上每 50 个块视为一个 PoS 检查点。验证器对这些块的终结性进行表决,并将它们写入区块链。FFG 是向完全采用 PoS 过渡的中间步骤。FFG 已经在一个测试网络上运行。它将很快在 mainnet 上完全实现。 卡斯珀 CBC ( 更正由建筑,弗拉德的卡斯珀)更具戏剧性。CBC 专注于设计协议,其中可以扩展节点的安全估计的本地视图,以实现一致的安全。到目前为止,这种方法仅仅是研究,还没有发布计划可以用于以太坊。
血浆
2017 年,Buterin 和 Joseph Poon 提出了他们的想法,呼吁扩大以太坊的性能,即增加 TPS。与国家通道设计一样,plasma 是一种进行链外交易的技术,同时依靠底层以太坊区块链来提供其安全性。因此,等离子体属于链外技术群。Truebit 是这一组中的另一个例子。
等离子体的工作原理如下:
- 智能合同是在主链上创建的,是等离子子链的基础。它们为子链定义规则,并被调用来在主链和子链之间移动资产。
- 子链是用自己的一致性算法创建的,例如 PoS。
- 将定义实际业务规则的智能合同部署到子链。
- 在主链上创建的数字资产通过调用等离子体根源契约转移到子链上。
- 根据共识规则,子链上的块构建器定期向主链提交验证,证明子链的当前状态是有效的。用户无需与主链直接交互就可以发送和执行请求。
等离子体具有以下优点:
- 允许以太坊区块链处理更大的数据集
- 支持在区块链上运行更复杂的应用程序
- 极大地提高了吞吐量
以太坊社区正在积极致力于以太坊等离子体的实现。血浆-MVP(最小可行产品)正在首先进行,以获得经验并测试其可行性。有可能在 2018 年底发布 plasma-mvp。血浆将在一个或多个季度内释放。
分片
维塔利克最初提出了攀登以太坊区块链的想法。他的建议是将区块链切成成百上千个独立的碎片。所有碎片共享相同的一致算法和安全模型。这些碎片将不处理不同类型的任务,并且不需要被所有完整节点验证。相反,每个碎片服务于一个单一的目的,因此非常有效。总之,分片将网络状态分成多个分片,每个分片都有自己的事务历史和网络状态的一部分。为了在区块链上实现分片思想,需要一个验证器管理契约,这是一个智能契约。它验证每个碎片的块头,维护验证器的桩,并伪随机地在碎片之间选择验证器。分片提供了一种显著提高以太坊性能的替代方法,最早可能在 2020 年实现。
摘要
以太坊是在比特币的基础上通过引入智能合约以及 solidity 等图灵完整的脚本语言开发的。以太坊是 DApp 开发的通用平台。平台很受欢迎。然而以太坊还不成熟。与比特币相比,它更容易受到黑客攻击,因为任何人在编写智能合同时的错误都是显而易见的。它继承了比特币的性能问题。许多计划正在进行中,以解决这个可伸缩性问题。在下一章,我们将深入探讨 solidity 的细节,solidity 是编写以太坊智能合约最流行的语言。*