当前位置:首页> 书籍推荐 >以太坊专题 | 设计特点(从零开始学区块链 163)

以太坊专题 | 设计特点(从零开始学区块链 163)

2021-07-21 01:07:49

 从今天起,会连载Vitalik Buterin以太坊创始人的文章,让您深入理解以太坊的设计思想,便于触类旁通,我对译文进行了部分校定,使其更易阅读,相信看完这个专题,你会对以太坊有个全新的认识,也容易理解为什么以太坊现在如此大热


几乎在以太坊之前的所有区块链都有一个“历史”的概念,所有之前的交易、转账及其发生顺序的集合,以及“状态“,决定某个给定交易是否有效以及在交易处理后状态 将会如何改变的“当前相关的”数据。


区块链协议同时有一个“状态转换规则” 的概念:基于之前的状态,以及一个给定的交易,这个交易是有效的吗? 在交易发生后,状态会是什么?


我们可以用比特币给出一个例子。在比特币中,状态是账户余额的集合,例如:


地址 39BaMQCphFXyYAvcoGpeKtnptLJ9v6cdFY 有 522.11790015 个比特币


地址 375zAYokrLtBVv6bY47bf2YdJH1EYsgyNR 有 375 个比特币.


状态转换功能取得发送者的地址、目标地址以及一个值,然后询问这个交易已经由发 送者用密码学的方式正确签名了吗?还有发送者的账户里面有足够的比特 币用于本次的发送吗?如果其中一个问题的答案是否定的,那么交易就是无效的, 并且不能被包含到一个区块里面。如果一个区块包含了当前状态下的一个无效交易,那么这个区块就会被网络忽略掉。如果两个问题的答案都是正确的,那么 交易的价值就会从发送者的余额中抽离出来,并添加到接收者的余额中(UTXO机制)。


以太坊的设计特点


在以太坊中,相关的设计会更复杂一些。状态可以被视为是所有账户的集合, 而每一个账户要不就是“外部拥有的账户”(EOA,externally owned account) 或一个合约(contract)。如果账户属于 EOA,则状态会简单地存储这个账户的以太币余额(以太坊的内部加密代币其功能类似比特币或 XRP)以及一系列用于防止重放支付攻击的序列值。


如果账户是一个合约,则状态会存储合约的代码,以及合约的存储空间,一种键值数据库(k/v database),这点很重要是区别于传统加密货币的主要特点之一。


在以太坊中一个交易会指定(跟其他的一些所需信息一起)一个目标地址、用于交易的以太币数量,以及一个理论上能存储任何信息的 “数据”域(另外,还有一个发送人的地址,不过这在签名里已经指定了,因此 这里没有专门说明)。如果一个交易是对 EOA 或一个尚未存在的账户发出的,它除了简单地作为发送以太币的手段外,并没有其用途。如果一个交易被发送到 一个合约里,则会执行合约的代码。这些代码的主要功能如下:


  •  读取交易数据。

  •  读取交易中被发送的以太币余额。

  •  读取或写入合约自己的存储空间。

  •  读取环境变量(如时间戳,区块难度,前一个区块的哈希值)  向另一个合约发送一个“内部交易”。


本质上说,你可以将合约视为是存储在以太坊状态中的一类“虚拟对象(具备属性和操作)”, 它可以包含自己内部的永久存储空间,并拥有向外部用户发送其他合约的权限和关系的操作能力。内部交易是由合约创建的一种交易;就如普通的“外部”交 易一样,它也包含了一个明确的发送者、目标地址、以太币数量以及信息数据,如果一个内部交易被发送到一个合约,则合约的代码就会运行起来,在合约执行结束后,合约的代码将会返回 0个 或更多字节数的数据,可以让内部交易用于"询问”其他合约去获取特定的信息。同时一个交易(transaction)可以创建一个新的合约,通过将合约的代码放置在交易的数据中(目标地址不进行设置), 或通过 CREATE 这个操作代码(opcode)从合约的内部实现这个功能。


简单地说,在以太坊的公有链上,合约机制有以下用途:


  •  作为一个追踪用户发行资产(issuer-backed assets)的数据库;

  •  作为一个可控制其他资产的“智能合约“, 并将根据特定的条件将这些资产发送到特定的参与方;这通常会进一步分解成几个子类别,包括:

     (1)金融合约(如差价合约,二元期权,衍生品)

     (2)担保交易(实施“无需信任的数字资产原子化互换”)

     (3)多方协议,如拍卖,保险合约,鼓励披露特定信息的经济游戏等


  •  作为一个基于区块链的域名系统的注册记录管理;

  •  作为一个代表用户或机构的账户,拥有复杂的访问权限控制,如多重签名;

  • 作为软件库(DApp),让代码可以写入、发布到区块链上,并由其他的人使用;


所以“智能合约”的概念可以被简单地定义为“一个直接控制与操作数字资产的程序”,这点是非常重要的。因为合约有它们自己的地址,所以可以像用户一样作为数字资产的持有者了,如果一个合约真的“拥有”了数字资产,这意味着:


(1)只有合约自己执行相关代码能够向另一方发送资产

(2)每一个参与方在区块链上可以看到并检验这个资产是否真的在程序的控制下。


例如,你可以在无需信任的情况下实现资产 A 与资产 B 的交易,通过资产 A 的拥有者将资产发送到一个程序里,这个程序的代码定义了“如果我在 24 小时内收到资产B,则我会将资产 A 发送到发送人的地址里,并将资产 B 发给我的创建者,否则我将会把资产 A 发送回我的创建者”。资产 B 的拥有者可以看到该合约确实控制了资产 A,而且知道一旦他们将资产 B 发送到合约的账户,合约将会进行一个公平、正确的交易。合约并没有“拥有者”(owner)这个概念;当资产 A 的原始拥有者把该资产发送到合约里,则他们就无法通过操纵这个合约把资产拿回来,而是只能等待交易成功完成并接收所交换到的资产 B,或者 24 小 时后,若交易还是没有成功,则他们会自动地拿回资产 A。





以太坊区块链在较高的层级上有点像比特币的区块链。其重要的特点是,区块链由一系列的区块所组成,每一个区块包含指向前一个区块的指针,以及一个经过排序的交易列表。区块是由工作量证明所维护的,“最长的链”(由整体难度决定)定义了一系列经过确认的交易及其执行的顺序。


为了到达以太坊区块链上的“当前状态”,节点可以从“初始状态”开始(这是一个内嵌在每一个以太坊客户端里的、所有人都认可的初始状态),并处理每 一笔交易,并按顺序执行由交易处理和代码执行过程所带来的余额/序列值/代码 /存储的变化。比特币里面也有同样的过程;虽然以太坊对交易执行过程“状态变化”模型的重视是独特的(在比特币中,交易通常被视为花费来自历史上前一 个交易的“输出项”,而不是状态里的某个对象)。但以太坊、比特币和瑞波、 狗狗币等协议里,代码在这部分工作中的运行模式大体上是一样的。


以太坊使用了内存需求较高的哈希函数、叔伯激励机制,难度调整算法,gas 限制调整算法等,这些都是以太坊的一些值得注意的不同之处,不过这些都是优化工作,可以说在以太坊的本质中并不是处于中心的地位。


以太坊中另一个值得注意的特性(比特币中没有的)是 Merkle 树的深度使用,让“轻客户端”可以只下载和校验区块的头信息,同时也能在有需要的时候决定并安全地对区块链状态的任何特定部分进行校验。而在比特币中,一个区块头只储存包含交易的 Merkle 树的根哈希值(root hash),在以太坊中每一个区 块投包含了一个“状态根”(state root),实质上是包括了整个当前状态(账户余额,序列号,代码和储存)的密码学哈希树的根哈希值。




因此,轻客户端通常可以只下载区块头(每 17 秒约 500 字节),如果轻客户端需要了解状态中的某个特定数值(如“账户 0x124b6f72 中的余额是多少?” 或“账户存储空间中键值为 178233 的记录对应什么数据?”),它就可以请求网 络中的任何“完全节点”提供一个“分支”,这是(Merkle)树结构中的数据区块构成的一系列哈希值,指定了直到树根部的特定信息,而轻客户端可以自己 验证该分支的完整性。如果该分支是正确的,它就接纳这个答案。“轻客户端” 模式对那些使用智能手机和物联网,嵌入式设备的以太坊用户是很有用的,对那些电脑性能较低、网络带宽较差的用户也是很有用的。


关于本文

VB大神在文章还是把以太坊的特点说的非常清楚的,以太坊的确是革命性的设计,它让区块链活了起来;您也可以将本文分享出去让更多人了解这些知识,您的支持和鼓励是我最大的动力,长按二维码关注


长按关注,探索未来


相关内容阅读

以太坊大事记,详细历史介绍(从零开始学区块链 146)

理解以太坊Serenity 深度抽象(从零开始学区块链 148)

以太坊POS机制问答节选一(从零开始学区块链 142)

以太坊POS机制问答节选二(从零开始学区块链 143)

以太坊POS机制问答节选三(从零开始学区块链 144)

从零开始学区块链(二十)现在说说以太坊了

系统了解以太坊(六)完结篇



友情链接