主页 > 怎么退出imtoken钱包 > 科普 | 再聊:什么是以太坊

科普 | 再聊:什么是以太坊

怎么退出imtoken钱包 2023-06-13 07:53:59

大约两年前,我从一篇介绍“区块链”技术的文章中了解到“以太坊”这个项目。 当然,没想到对我个人影响这么大。 在接下来的两年里,我投入了大量的时间和精力去学习它,研究它,多次分享技术,甚至还写了一本解释智能合约发展的书,开发了一个关于智能合约开发的在线网站。 课程; 所以不管以后我们各自的方向如何,以太坊已经在我的生活中留下了很多。 在我们相识两周年之际,我想我必须写点东西。

大年初一的日子过得非常充实:只感冒了两次,每次大概半个月。 ”月底前,不幸又被教育:“年龄不是问题,健康才是问题。 所以临近月底,只能将这篇文章作为assignment勉强交上去了。

2017年底,我在简书发了一篇博客,介绍《什么是以太坊》,不过是以太坊Homestead官方文档的翻译节选。 客观来说,当时我自己对以太坊的了解还不是很透彻,所以这篇原著《再讨论:什么是以太坊》还是有一定的参考价值的。 我相信这篇文章可能比一年前更好。 翻译的比较好懂,确实把一些“必不可少”的基本概念都说出来了。

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

由于本文主要内容选自我的技术专题《工程师眼中的比特币和以太坊》,本文对比特币系统技术细节的引述可能有些突兀,缺乏铺垫; 如果您不熟悉Bitcoin Understand的技术细节,可能造成了一些困惑,对此我也深表歉意。 不过,我希望您喜欢本文的内容及其呈现方式; 我也很感激任何类型的反馈。

完整阅读本文大约需要 15 到 20 分钟。

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

我想如果你看过《以太坊白皮书(Ethereum White Paper)》,你很可能会用它的标题来回答这个问题:《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”。 因为本文只讲识字的本质,这里就不细说了。

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

什么是去中心化应用

理解了智能合约的概念之后,去中心化应用就更容易理解了。

以太坊官网如何获取钱包_以太坊交易信息获取_以太坊交易慢

对于目前绝大多数的网络应用来说,用户数据都存储在由公司、组织或个人控制的“服务器”或“服务器组”中,这些应用中的大部分业务计算也是由这些服务器或提供的服务器组; 所以这种模式可以认为是一种“中心化”模式。

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

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

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

好了,了解了智能合约和去中心化应用的基本概念后,相信你已经对以太坊是什么有了一个概念。 让我在这里重复一遍:以太坊是一个智能合约和去中心化应用程序的平台。 但是,我有第二个答案。 请大家保持冷静,让我试着根据以太坊的总体设计思路和技术方案慢慢为大家揭秘。

以太坊的诞生

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

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

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

2015年7月30日,以太坊主网正式上线,创世区块生成,全球首个成功的公共智能合约平台诞生。

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

区块链范式

以太坊交易慢_以太坊交易信息获取_以太坊官网如何获取钱包

从技术角度,我们可以抽象地把一个类似比特币的通过分布式共识进行“技术公证”的公共账本系统(即所谓“区块链”)理解为“状态转换系统”。 transition system)”。这类系统会维护一个“全局状态”(我们用S来表示),然后通过系统中的“交易”(我们用tx来表示)进行相应的状态转换来实现一个“新的全局状态”(我们用S'表示),那么这个状态转移可以抽象表示为:Apply(S, tx) = S',其中Apply是“状态转移函数”。

下图展示了比特币中的状态转换:

以太坊交易信息获取_以太坊交易慢_以太坊官网如何获取钱包

图中,采用:的形式表示某笔UTXO: 其中txid为交易哈希,用于标识某笔具体交易; output_index 是交易产生的输出(UTXO)的索引。

UTXO,即未花费的交易输出,是一个基于比特币数据模型的术语。 比特币中的交易由多个输入(Input)和多个输出(Output)组成。 根据约定,一个输入必须是对某个历史交易的某个输出的引用。 通过在输入中包含特定的“解锁脚本”,在历史交易的输出中指定的“锁定脚本”进行解锁,以便“消费/花费”相应的输出。那些没有被任何引用的“输出” “输入”是 UTXO。

如上图所示,比特币中的交易会消耗/使用多个UTXO,通过合并和拆分产生等量的新UTXO。 上图中的例子是通过7b53ab84交易的第一个输出和3ce6f712交易的第二个输出,分别产生3个新的UTXO,即输出0、1、2。这样一来,系统的整体状态发生了变化从 5 个 UTXO 到 6 个 UTXO。

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

考虑到像比特币这样的“区块链”系统,是以区块为单位来封装和记录交易的,我们其实可以定义“区块链”的下一个技术定义:“区块链”,其实就是一个通过交易触发状态变化的状态转换系统,记录块中的状态变化。 刚才介绍的状态转移范式,Apply(S, tx) = S',也就是所谓的“区块链范式(blockchain paradigm)”。

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

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

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

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

以太坊官网如何获取钱包_以太坊交易信息获取_以太坊交易慢

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

简单的说,参考目前业界的研究和工程实践的结果,基于UTXO模型来存储自定义状态数据大概是可行的,但是相对来说会很复杂,或者需要做一些特殊的简化或者限制. (由于篇幅原因,这里就不详细解释了。)因此,以太坊采用了一种简单直接的“账户模型(account model)”,这与我们现在大多数中心化软件系统所使用的数据模型非常相似已经很熟悉了。 相似。

在以太坊的账户模型中以太坊交易信息获取,以“地址(address)”作为账户的全球唯一标识,自定义状态数据与地址绑定,实现快速查找、增删改查; 这个思路类似于我们传统的业务系统中使用的账户数据模型,所有的业务数据都是通过唯一的用户账户标识关联起来的。 这可以说是为了实现通用应用平台而进行的工程设计折衷和技术简化。

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

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

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

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

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

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

以太坊中的“状态转换”

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

以太坊交易慢_以太坊交易信息获取_以太坊官网如何获取钱包

以太坊交易慢_以太坊官网如何获取钱包_以太坊交易信息获取

图中演示了以太坊中一笔交易引起的状态转换:初始状态State中,14c5f8ba、bb75a980、892bf92f和4096ad65代表4个账户地址,其中14c5f8ba和4096ad65为EOA,bb75a980和892bf92f为合约账户(由于相关代码)。 那么图中所示交易的逻辑含义也很简单,就是从14c5f8ba发送10个ETH到bb75a980,并附上一些额外的数据Data,也就是说目标合约的第二个“存储单元”设置好了到“CHARLIE”。这个交易的执行会产生一个新的状态State',其中14c5f8ba地址的余额减少10 ETH,bb75a980地址的余额增加10 ETH,第二个的值bb75a980地址的“存储单元”变为“CHARLIE”。

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

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

在以太坊协议中,我们可以在交易的数据字段中附加一个特殊的“可执行代码”来完成任何计算任务。 此“可执行代码”在虚拟执行环境中运行。 与比特币脚本系统的执行环境类似,以太坊的这个虚拟执行环境也是基于一个“栈”; 但是,以太坊的虚拟执行环境也提供了应用程序在运行时可以使用的临时存储空间“memory”和刚才介绍的持久化存储机制“storage”。 这使得以太坊的虚拟执行环境具有更强的计算能力,更像是一台“虚拟计算机”,这个虚拟执行环境就是大名鼎鼎的“以太坊虚拟机(Ethereum Virtual Machine,EVM)”,EVM也是以太坊被称为的由来“世界计算机”,也是以太坊相对于比特币最大的技术创新。

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

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

概括

至此,我想我又可以回答“什么是以太坊”这个问题了:以太坊其实就是“区块链”+“以太坊虚拟机”。 就本文而言,您记住这个答案就足够了。

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

复活节彩蛋:

本文中的两幅插图均复制自以太坊白皮书。 细心的你可能会发现以太坊的状态转换图中交易数据的From地址写错了! 是的,你没看错,只是打错了字。 如果你发现这个错误,我必须恭喜你,你是一个细心的人,估计是个技术人才。 还没找到的朋友可能需要复习一下....

当然,请大家不要想太多,我引用这个错误的图只是因为我不会PS,而且我比较懒,所以这个怪罪只能由V神来承担了。。。