主页 > imtoken苹果闪退 > 重温:什么是以太坊

重温:什么是以太坊

imtoken苹果闪退 2023-01-18 10:21:15

大约两年前,我从一篇介绍“区块链”技术的文章中了解到“以太坊”项目,当然当时我没想到它会对我个人造成如此大的影响。在接下来的两年里,我投入了大量的时间和精力来学习它、研究它,做了大量的技术分享,甚至还写了一本解释智能合约开发的书,开发了一本关于智能合约开发的在线书籍。课程; 所以无论我们将来去哪里,以太坊都在我的生活中留下了印记。在我们相识两周年的时候,我觉得我必须写点什么。

前言

大年初一过得很充实:我只感冒了两次,每次半个月左右……本来打算年底写完技术题《工程师眼中的比特币和以太坊》月,可惜我被再教育:“年龄不是问题,但身体是问题。” 所以临近月底,我只能用这篇文章勉强做个作业。

2017年底,我在简书上发了一篇关于“什么是以太坊”的博客,不过是摘自以太坊家园官方文档的翻译。客观地说,当时我对以太坊的了解还不是很透彻,所以这篇原创的《重谈:以太坊是什么》还是有一定参考价值的。我相信这篇文章可能会比一年前更好。文章的翻译比较好理解,也确实道出了一些“本质”的基本概念。

当然,这不是一篇硬核技术文章。我的初衷是基于我自己对以太坊的理解,从概念上来说,给那些不知道“以太坊是什么”的朋友提供一个简单的扫盲。这也是我写这个新技术题目的初衷:希望更多的软件工程师能够理解区块链和智能合约,也希望更多的人能够真正理解一些最基本的概念,并以此为契机深入进入区块链和智能合约的世界。

由于本文主要内容选自我的技术专题《工程师眼中的比特币与以太坊》,因此文中对比特币系统技术细节的引用可能有点突兀,缺乏铺垫;如果您对比特币的技术细节不了解,也可能会造成一些混乱,对此我也深表歉意。尽管如此,我还是希望您喜欢这里的内容和解释方式;如果您能给我任何反馈,我将不胜感激。完整阅读这篇文章大约需要 15 到 20 分钟。

时间已经到了2019年1月,相信对于很多人来说,“区块链”这个词可能并不陌生,他们大概也听说过“比特币”这个名字;但是,如果有人问你:“什么是以太坊”,你能清楚准确的给他解释清楚吗?

我想如果你读过《以太坊白皮书》,你可能会用它的标题来回答这个问题:“A Next-Generation Smart Contract and Decentralized Application Platform”以太坊要崩盘了吗,中文翻译为“下一代智能合约和去中心化应用平台”去中心化应用平台”。是的,它是权威和准确的。但是,我猜这个答案中引入的两个新概念“智能合约”和“去中心化应用程序”即使对于软件工程师来说也不是那么“一目了然”。显然,我们不应该用未知的概念来解释其他未知的概念。但我觉得这还是一个好的开始,顺着这条线说一下“智能合约”和“去中心化应用”。

什么是智能合约

智能合约一词最早由美国计算机科学博士 Nick Szabo 在 1997 年发表的一篇论文中提出。智能合约是指基于计算机技术的交互式或可互操作的合约,可以自动执行、自动验证和自动响应。无需人工干预的外部指令;它的本质是一个计算机程序。. 这个概念本身是比较抽象的,所以 Nick Szabo 本人在后来的一些采访中使用 ATM 或自动售货机作为智能合约的物理实例;它们基于某些公共的、众所周知的规则。命令状态和实际业务数据提供可预测响应的应用程序。

自动售货机示例

例如,当我们去自动售货机购买某种产品时,我们首先要选择要购买的产品和数量。如果自动售货机库存不足,应给出相应提示;如果库存充足,会提示用户进行实际支付,如现金支付或电子支付;如果支付不足,会提示并等待支付足够或用户取消交易;如果付款足够,他们会吐出正确数量的物品并进行更改。自动售货机在整个过程中对用户操作的响应应该是确定性的、可预测的、自动完成的,当然也是正确的。那么一个能够根据实际情况给出这些正确响应的程序就可以被认为是一个智能合约。

当然,这个过程并不“聪明”,也不是某种意义上的“契约”。所以这个词自诞生之日起就存在一些争议,尤其是会给一些不知名的用户带来一定程度的误解。本质上,所谓的“智能合约”其实只是一个可以根据一些状态数据自动响应的应用程序。但是,由于历史原因,“智能合约”一词仍然被业界接受和使用。

智能合约有什么用

以太坊为什么叫以太坊_以太坊要崩盘了吗_以太坊崩盘过吗

这里我只举两个最简单的例子来解释智能合约的含义。

租赁协议示例

第一个是租赁协议的示例。比如我和房东签了租房合同,规定我每个月付给房东1000元房租,合同期限为一年。在没有智能合约的情况下,这个合约的执行需要大量的人工干预,我支付的动作必须由我来完成;如果出现意外情况,也需要第三方的介入来解决,比如中介机构的调解。甚至民事诉讼、执行等。而如果有一个去信任的智能合约平台,整个流程可以变成如下:

房东和我可以在智能合约平台上签订智能合约。在创建合同时,我将租金锁定在合同中一年,然后从合同签订之日起,房东可以退出合同一个月。月租,直至合同期满或经双方确认终止合同,合同将自动退还剩余未付租金给我。这样的场景可以很容易地在像以太坊这样的智能合约平台上实现。整个过程不需要任何第三方干预,可以保证执行过程严格按照约定的条件完成。

请注意,此过程是“无需信任的”。也就是说,合约双方不需要相互认识甚至相互信任,而是基于不可篡改、不可抵赖、不可逆转的自动化技术方案来保证整个过程的可信度,并且不需要任何第三方干预。这是智能合约带来的最重要的特性。

当然,这个例子中的一些细节与我们一般使用人工处理的方式不同:比如我要交的一年房租需要在合同签订时锁定在合同中,而不是能够手动处理。每月提供操作方法;例如,当合同要终止时,需要双方确认。如果一方故意不确认,合约将被锁定。这需要提前考虑,并在合同中设计相应的解决方案。. 但即使存在实际差异,这种自动化的、不可否认的智能合约选项仍然是一种改进。

保险示例

第二个例子是简单的保险。例如,某地区的农民可以与保险公司签订合同,合同条款可能是:农民在今年6月30日前向保险公司缴纳x元保险费;如果平均降雨量小于100毫米,9月30日以后农民可以获得y元的保险补偿;否则,无需赔偿。

这种保险也可以通过以太坊这样的智能合约平台轻松实现:农户和保险公司可以在6月30日前签订合同,农户锁定x元,保险公司同时锁定y元;9月30日后,农户或保险公司可申请合同执行;合约可自动从不感兴趣的第三方公共服务(如气象站网站)获取7-9月的降水信息;如果降水量低于100毫米,则向农户支付x+y元,否则向保险公司支付x+y元。这整个过程也不需要人工干预,可以基于智能合约自动完成。

本例中提到的“无利害关系的第三方公共服务”,通常是通过区块链系统/智能合约平台以外的独立数据源提供的。这是因为区块链系统本身无法生成或直接获取一些特定的数据,例如天气数据、股票价格等,因此需要一个独立的“链下”数据提供者来提供特定的数据。这种提供链下数据的服务也被称为“Oracle”。因为这篇文章只是扫盲性质的,这里就不细说了。

因此,从逻辑概念上看,智能合约可以理解为一个状态存储和状态转换(即程序执行),会经过“技术公证”,保证这个过程是“去信任的”。(我稍后会从技术角度解释这个概念。)

什么是去中心化应用

以太坊崩盘过吗_以太坊为什么叫以太坊_以太坊要崩盘了吗

了解了智能合约的概念之后,就更容易理解去中心化的应用了。在目前绝大多数的Web应用程序中,它们的用户数据都存储在一个由公司、组织或个人控制的“服务器”或“服务器组”中。这些应用程序中的大部分业务计算也是由服务器或服务器组提供的;所以这个模型可以被认为是一个“中心化”模型。

那么“去中心化应用程序(DApp)”,即把数据保存到一个“基于点对点网络的时间戳服务器(即区块链)”,并不是一个由中心化的公司或组织控制的服务,提供的应用程序这种“去中心化”服务的具体业务数据计算能力。“去中心化应用”也可以简单理解为基于智能合约进行状态跟踪和计算的应用。

这里的“基于点对点网络的时间戳服务器”一词来自比特币白皮书,这也是“区块链”一词的原始来源。

当然,对于一个应用来说,并不是所有的操作都需要通过智能合约来实现,通常也不应该这样设计;相反,需要“全网公证”的状态应该根据业务需求在智能合约中计算。为了给应用程序一些“去信任”的可信赖性。

好了,在了解了智能合约和去中心化应用的基本概念之后,相信你已经知道以太坊是什么了。再说一遍:以太坊是一个智能合约和去中心化的应用平台。但是,我有第二个答案。请耐心等待,让我尝试慢慢的向大家揭示基于以太坊的总体设计思路和技术方案。

以太坊的诞生

与比特币不同,以太坊白皮书的作者并非匿名,其初稿由 Vitalik Buterin 于 2013 年底完成。维塔利克 1994 年出生于俄罗斯,随父母移居加拿大。撰写以太坊白皮书时,他年仅 19 岁,刚从滑铁卢大学大一退学。然而,在他撰写以太坊白皮书之前,他已经是著名的比特币研究员和作家,并且还是 2011 年推出的全球第一本加密货币期刊比特币杂志的联合创始人。可以说,以太坊白皮书并没有像比特币白皮书那样“凭空出现”。自 2013 年下半年以来,Vitalik 本人一直在思考如何扩展比特币的脚本系统以支持“通用”计算任务。

2013 年 12 月,Vitalik 完成了以太坊白皮书并小范围分享,引起了一些业内人士的关注,其中包括《精通比特币》一书的作者 Andreas M. Antonopoulos,但他忙于写作,精通当时在比特币,所以早期没有直接参与以太坊的具体工作。真正帮助 Vitalik 实现以太坊在工程上的伟大构想的是 Gavin Wood 博士。

英国约克大学计算机科学博士 Gavin Wood 博士是以太坊项目前两年对工程的最大贡献者:他完成了以太坊的 PoC-1(第一个于 2014 年 1 月)。一个概念验证程序,也是以太坊C++客户端的初始原型);随后于 3 月发表了以太坊黄皮书(即以太坊协议的详细说明和技术手册,是实现以太坊客户端的基础技术资料。具有极其重要的指导意义,也是我们了解和学习以太坊协议技术细节的主要参考);同年8月,专为智能合约开发而设计的高级语言Solidity问世。2015 年 7 月 30 日,

以太坊的开创性意义在于它借鉴了比特币系统创建的“基于点对点网络的时间戳服务器,通过工作量证明算法达成共识”(即所谓的“区块链”),构建一个可以执行“通用”计算任务的基础设施,将“区块链”可编程性提升到一个新的水平;打造真正的“智能合约”平台。

区块链范式

从技术的角度,我们可以将一个像比特币一样通过分布式共识“公证”的公共账本系统(即所谓的“区块链”)抽象地理解为“状态转换系统”。system)”。这样的系统维护一个“全局状态”(记为 S),然后通过系统中发生的“事务”(记为 tx)进行相应的状态转换,从而实现一个“新的全局状态”(我们记为它由S')。那么这个状态转换可以抽象地表示为:Apply(S, tx) = S',其中Apply是“状态转换函数”。

以太坊为什么叫以太坊_以太坊要崩盘了吗_以太坊崩盘过吗

下图是比特币中状态转换的示意图:

比特币中的状态转换示意图

图中使用

<txid>:<output_index>的形式来表示某个 UTXO:其中 txid 即交易哈希,用来标识某个具体的交易;output_index 即交易生成的输出(UTXO)的索引。

UTXO,Unspent Transaction Output,是一个源自比特币数据模型的术语。比特币交易由多个输入和多个输出组成。根据协议,输入必须是对历史交易输出的引用。通过在输入中包含特定的“解锁脚本”,在历史交易的输出中指定的“锁定脚本”是“解锁”,以“花费/花费”相应的输出。那些没有被任何引用的“输出” “输入”是 UTXO。

如上图所示,比特币中的一笔交易会消耗/使用多个 UTXO,并通过合并和拆分生成等量的新 UTXO。上图中的例子是通过7b53ab84交易的第一个输出和3ce6f712交易的第二个输出生成3个新的UTXO,即交易bb75a980的输出(即上图中的交易)< @0、1 和 2。结果,系统的整体状态从 5 个 UTXO 变成了 6 个 UTXO。

因此,比特币系统实际上是当前系统中所有可用 UTXO 的状态记录。它通过特定交易合并和拆分几个当前可用的 UTXO 来生成新的 UTXO,并将系统状态转换为新的。同时,这个过程在点对点网络中“全网公证”。

考虑到像比特币这样的“区块链”系统是以区块为单位来打包和记录交易的,我们其实可以定义“区块链”的下一个技术定义:“区块链”,实际上是一个状态转换系统,通过交易并记录区块中的状态变化。刚刚引入的状态转换范式 Apply(S, tx) = S',也就是所谓的“区块链范式”。

请注意,这是适用于比特币和以太坊的通用范例,同样适用于其他基于“区块链”的分布式共识分类账系统,如比特币和以太坊。不同区块链系统的区别在于系统中的状态如何表示,以及状态转换函数(即交易)如何定义。

那么,对于以实现“智能合约平台”为目标的以太坊来说,使用比特币的UTXO模型来保存系统状态和构建交易数据是否可行呢?

以太坊的“账户模型”和“存储”

我在刚刚介绍智能合约的概念时提到过:智能合约其实可以看成是一个记录和修改“状态”的应用程序。从计算机科学的角度来看,这实际上是一个“状态机”。每个智能合约都可以被视为一个自定义状态机。那么对于“智能合约平台”来说,最关键的特性就是允许用户自定义状态机,同时保证这些自定义状态机能够自动、正确、不可篡改地执行,执行过程应该是“技术公证” “ ”,以确保合约参与者之间的“不信任”。

以太坊要崩盘了吗_以太坊崩盘过吗_以太坊为什么叫以太坊

显然,“技术公证”的问题已经被比特币解决了:我们只需要将所有自定义状态机的状态数据保存到区块链上,通过工作量证明算法达成共识,实际上实现了“定义网络”国家数据的广泛公证”。但是如何将“自定义状态”保存到区块链中呢?比特币的UTXO模型能做到吗?

总之,参考目前业界的研究和工程实践成果,基于UTXO模型保存自定义状态数据大概是可行的,但是会比较复杂,或者需要一些特殊的简化或者限制。(由于篇幅原因以太坊要崩盘了吗,这里不再详细解释。)因此,以太坊采用了一种简单明了的“账户模型”,这与我们已经非常熟悉的大多数中心化软件系统中使用的数据模型非常相似。 . 相似。

以太坊账户模型

在以太坊的账户模型中,“地址”作为账户的全局唯一标识,自定义状态数据与地址绑定,实现快速查找、增删改查;这种思路就像我们传统的业务系统中使用的账户数据模型一样,所有的业务数据都与一个唯一的用户账户标识符相关联。这可以说是为了实现通用的应用平台而进行的工程设计折衷和技术简化。

在账户模型中,每个账户都有一个表示其可用“余额”的字段来记录其以太币数量(以太坊协议中的代币)。在比特币系统中,一个所谓的“账户”可以持有(使用)多个UTXO,而我们在客户端或者钱包中看到的“账户余额”实际上就是这个账户持有(可以使用)的总和所有 UTXO 的比特币。比特币中的交易是对可用的 UTXO 进行合并和拆分,而不是像账户模型中那样直接增加或减少余额值。

以太坊中的“账户”在逻辑上分为两种:EOA(External Owned Account,即基于椭圆曲线数字签名由外部用户的私钥控制的账户,可称为外部账户)和合约账户(即合约账户)。但是从底层基础数据来看,这两类账户是一样的,唯一的区别就是账户是否关联了合约代码:如果账户没有关联代码,就是EOA(外部账户);否则为合约账户。

以太坊存储结构 Merkle Patricia Tree

需要注意的是,对于自定义状态机,需要持久化的应该是自定义状态数据和用于修改状态数据的可执行代码,也就是所谓的“合约状态”和“合约代码”。对于智能合约平台来说,它必须能够持久化这两种数据。以太坊基于账户模型,使用全局数据结构来存储所有合约状态和合约代码。因为合约可以由用户自定义,所以存储这些数据的数据结构必须是高效的、可动态搜索、增删改查、易于验证的。以太坊使用一种名为 Merkle Patricia Tree(简称 MPT)的数据结构来实现这一点。

MPT类似于比特币系统使用的Merkle Tree,也是“哈希树”,所以它们具有相同的特点:任何叶子节点数据的变化都会导致根节点的哈希值发生变化,所以根节点的哈希值可用于标识树中所有数据的特定版本。基于这个原理,所有自定义状态数据、账户余额和代码数据的版本一致性可以通过每个客户端维护的全局 MPT 根节点哈希在点对点网络的参与者之间进行验证。这个全局的 MPT 也被称为以太坊的“状态树”,相当于比特币系统中所有可用 UTXO 的完整集合。

以太坊中用来保存所有自定义状态数据的全局MPT称为“存储”,它是另一个独立于“状态树”的全局MPT,但是因为它的根节点哈希作为一个账户的一个字段来存储,所以它实际上是“状态树”的一部分。

以太坊中的每个合约账户在“存储”中可以使用多个“存储槽”:在每个合约的代码中可以自定义多个状态数据,每个状态数据对应一个或多个“存储槽”。单元”;这些存储单元可以通过简单的寻址算法访问。这是以太坊的持久数据存储解决方案。

以太坊中的“状态转换”

以太坊为什么叫以太坊_以太坊要崩盘了吗_以太坊崩盘过吗

基于“账户模型”和“存储”,以太坊中的状态转换自然有不同的形式。下图是以太坊中状态转换的示意图:

以太坊中的状态转换示意图

图中展示了以太坊中一笔交易引起的状态转换:初始状态State,14c5f8ba、bb75a98<@0、892bf92f和4096ad65代表4个账户地址,其中14c5f8ba和4096ad65是EOA外部账户,bb75a980和892bf92f是合约帐户(因为有关联的代码)。那么图中交易的逻辑意义也很简单,就是从14c5f8ba向bb75a980发送了10个ether,并附加了一些额外的data数据,意思是第二个“目标合约的存储单元”设置为“查理”。本次交易的执行会产生一个新的状态State',其中14c5f8ba地址余额减少10ETH,bb75a980地址余额增加10ETH,第二个“

显然,由于底层数据模型的变化,以太坊的状态转换与比特币的状态转换几乎完全不同。相应地,构建交易、验证数据等的逻辑自然会完全不同。当然,这只是示意性的介绍。实际上,附加在以太坊交易上的数据是一种“可执行代码”,用户可以自定义,用户可以使用这些特定的代码来执行任意的计算任务;这种方法类似于将脚本代码附加到比特币交易的输入和输出。

以太坊中的“可执行代码”——EVM

在以太坊协议中,我们可以在交易的数据字段中附加一个特殊的“可执行代码”来完成任意计算任务。这个“可执行代码”在虚拟执行环境中运行。类似于比特币脚本系统的执行环境,以太坊的这个虚拟执行环境也是基于一个“栈”;但是,以太坊的虚拟执行环境也提供了可供应用程序在运行时使用的临时存储空间“内存”和刚刚介绍的永久存储机制“存储”。这使得以太坊的虚拟执行环境拥有更强的计算能力,更像是一台“虚拟计算机”。这个虚拟执行环境就是著名的“以太坊虚拟机(Ethereum Virtual Machine,

可以在 EVM 中运行的以太坊协议中的这种“可执行代码”就是所谓的“EVM 字节码”。EVM 字节码是以太坊计算能力的基础,是一个“图灵完备”的操作码系统。Solidity 是以太坊的高级开发语言,可以编译成 EVM 字节码,然后在 EVM 中运行;这种方法和其他编译的高级语言类似,就像Java语言和Java虚拟机字节码的关系一样。.

EVM 字节码的图灵完备性也是它与比特币脚本系统最大的区别。图灵完备意味着EVM字节码可以用来完成任意计算任务。同时,由于 EVM 还提供了临时存储机制和永久存储机制,这使得以太坊成为真正的“通用”(general purpose)。提议)》计算任务《智能合约平台》。

概括

至此,我想我可以回答“什么是以太坊”的问题了:以太坊其实就是“区块链”+“以太坊虚拟机”。出于本文的目的,您应该牢记这个答案。

当然,以太坊并没有这篇文章那么简单。有很多技术细节等着你去学习和理解。本文中提到的大多数术语也可以从技术上进行解释。但正如我在介绍中所说,本文的目的只是试图解释一些最基本和最重要的概念,以帮助您进入区块链和智能合约的世界。我希望您在阅读本文后有所收获。还要感谢有耐心看到这里的朋友们!

彩蛋:本文中的两幅插图均来自以太坊白皮书。细心的话,你可能会发现以太坊状态转移图中交易数据的From地址是错误的!是的,你没看错,只是打错了。如果你发现了这个错误,我必须恭喜你,你是一个细心的人,可能是一个技术人。还有没找到的朋友可能需要复习一下....当然,请不要想太多,我引用了这张错误的图片只是因为我不会PS,然后我就偷懒了,所以这个锅只能被神念了....

编者按:本文作者冯靖陆文平(作者简书),以太坊资深专家,经作者本人授权转载。

通晓区块链——打造优质区块链技术博客,学习区块链,来这里,关注知乎和微博,掌握区块链技术动态。