Ethereum 介绍

区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者汇集地算法

做者:吴寿鹤​数据库

来源:区块链兄弟编程

原文连接:www.blockchainbrother.com/article/5安全

著权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。网络

以太坊是什么?数据结构

以太坊是一个全新开放的区块链平台,它容许任何人在平台中创建和使用经过区块链技术运行的去中心化应用。就像比特币同样,以太坊不受任何人控制,也不归任何人全部——它是一个开放源代码项目,由全球范围内的不少人共同建立。和比特币协议有所不一样的是,以太坊的设计十分灵活,极具适应性。在以太坊平台上创立新的应用十分简便,随着Homestead的发布,任何人均可以安全地使用该平台上的应用。架构

下一代区块链编程语言

区块链技术是比特币的底层技术,这一技术第一次被描述是在中本聪2008年发表的白皮书“比特币:点对点电子现金系统”中。区块链技术更多的通常性用途在原书中已经有所讨论,但直到几年后,区块链技术才做为通用术语出现。一个区块链是一个分布式计算架构,里面的每一个网络节点执行并记录相同的交易,交易被分组为区块。一次只能增长一个区块,每一个区块有一个数学证实来保证新的区块与以前的区块保持前后顺序。这样一来,区块链的“分布式数据库”就能和整个网络保持一致。个体用户与总帐的互动(交易)受到安全的密码保护。由数学执行并编码到协议中的经济激励因素刺激着维持和验证网络的节点。分布式

在比特币中,分布式数据库被设想为一个帐户余额表,一个总帐,交易就是经过比特币的转移以实现个体之间无需信任基础的金融活动。可是随着比特币吸引了愈来愈多开发者和技术专家的注意,新的项目开始将比特币网络用于有价代币转移以外的其余用途。其中不少都采用了“代币”的形式——以原始比特币协议为基础,增长了新的特征或功能,采用各自加密货币的独立区块链。在2013年底,以太坊的发明者Vitalik Buterin建议可以经过程序重组来运行任意复杂运算的单个区块链应该包含其余的程序。区块链

2014年,以太坊的创始人Vitalik Buterin, Gavin Wood和Jeffrey Wilcke开始研究新一代区块链,试图实现一个整体上彻底无需信任基础的智能合约平台。

以太坊虚拟机

以太坊是可编程的区块链。它并非给用户一系列预先设定好的操做(例如比特币交易),而是容许用户按照本身的意愿建立复杂的操做。这样一来,它就能够做为多种类型去中心化区块链应用的平台,包括加密货币在内但并不只限于此。

以太坊狭义上是指一系列定义去中心化应用平台的协议,它的核心是以太坊虚拟机(“EVM”),能够执行任意复杂算法的编码。在计算机科学术语中,以太坊是“图灵完备的”。开发者可以使用现有的JavaScript和Python等语言为模型的其余友好的编程语言,建立出在以太坊模拟机上运行的应用。

和其余区块链同样,以太坊也有一个点对点网络协议。以太坊区块链数据库由众多链接到网络的节点来维护和更新。每一个网络节点都运行着以太坊模拟机并执行相同的指令。所以,人们有时形象地称以太坊为“世界电脑”。

这个贯穿整个以太坊网络的大规模并行运算并非为了使运算更高效。实际上,这个过程使得在以太坊上的运算比在传统“电脑”上更慢更昂贵。然而,每一个以太坊节点都运行着以太坊虚拟机是为了保持整个区块链的一致性。去中心化的一导致以太坊有极高的故障容错性,保证零停机,并且可使存储在区块链上的数据保持永远不变且抗审查。

以太坊平台自己没有特色,没有价值性。和编程语言类似,它由企业家和开发者决定其用途。不过很明显,某些应用类型较之其余更能从以太坊的功能中获益。以太坊尤为适合那些在点与点之间自动进行直接交互或者跨网络促进小组协调活动的应用。例如,协调点对点市场的应用,或是复杂财务合约的自动化。比特币使个体可以不借助金融机构、银行或政府等其余中介来进行货币交换。以太坊的影响可能更为深远。理论上,任何复杂的金融活动或交易都能在以太坊上用编码自动且可靠地进行。除金融类应用外,任何对信任、安全和持久性要求较高的应用场景——好比资产注册、投票、管理和物联网——都会大规模地受到以太坊平台影响。

以太坊如何工做?

以太坊合并了不少对比特币用户来讲十分熟悉的特征和技术,同时本身也进行了不少修正和创新。比特币区块链纯粹是一个关于交易的列表,而以太坊的基础单元是帐户。以太坊区块链跟踪每一个帐户的状态,全部以太坊区块链上的状态转换都是帐户之间价值和信息的转移。帐户分为两类:

  1.  外部帐户(EOA),由私人密码控制
  2.  合约帐户,由它们的合约编码控制,只能由外部帐户“激活”

对于大部分用户来讲,二者基本的区别在于外部帐户是由人类用户掌控——由于他们可以控制私钥,进而控制外部帐户。而合约帐户则是由内部编码管控。若是他们是被人类用户“控制”的,那也是由于程序设定它们被具备特定地址的外部帐户控制,进而被持有私钥控制外部帐户的人控制着。“智能合约”这个流行的术语指的是在合约帐户中编码——交易被发送给该帐户时所运行的程序。用户能够经过在区块链中部署编码来建立新的合约。

只有当外部帐户发出指令时,合约帐户才会执行相应的操做。因此合约帐户不可能自发地执行诸如任意数码生成或应用程序界面调用等操做—只有受外部帐户提示时,它才会作这些事。这是由于以太坊要求节点可以与运算结果保持一致,这就要求保证严格肯定执行。

和比特币同样,以太坊用户必须向网络支付少许交易费用。这可使以太坊区块链免受可有可无或恶意的运算任务干扰,好比分布式拒绝服务(DDoS)攻击或无限循环 。交易的发送者必须在激活的“程序”每一步付款,包括运算和记忆储存。费用经过以太坊自有的有价代币,以太币的形式支付。

交易费用由节点收集,节点使网络生效。这些“矿工”就是以太坊网络中收集、传播、确认和执行交易的节点。矿工们将交易分组——包括许多以太坊区块链中帐户“状态”的更新——分红的组被称为“区块”,矿工们会互相竞争,以使他们的区块能够添加到下一个区块链上。矿工们每挖到一个成功的区块就会获得以太币奖励。这就为人们带来了经济激励,促令人们为以太坊网络贡献硬件和电力。

和比特币网络同样,矿工们有解决复杂数学问题的任务以便成功地“挖”到区块。这被称为“工做量证实”。一个运算问题,若是在算法上解决,比验证解决方法须要更多数量级的资源,那么它就是工做证实的极佳选择。为防止比特币网络中已经发生的,专门硬件(例如特定用途集成电路)形成的中心化现象,以太坊选择了难以存储的运算问题。若是问题须要存储器和CPU,事实上理想的硬件是普通的电脑。这就使以太坊的工做量证实具备抗特定用途集成电路性,和比特币这种由专门硬件控制挖矿的区块链相比,可以带来更加去中心化的安全分布。

以太坊核心概念

以太坊虚拟机(EVM)

以太坊虚拟机(EVM)是以太坊中智能合约的运行环境。它不只被沙箱封装起来,事实上它被彻底隔离,也就是说运行在EVM内部的代码不能接触到网络、文件系统或者其它进程。甚至智能合约之间也只有有限的调用。

帐户(Accounts)

以太坊中有两类帐户,它们共用同一个地址空间。外部帐户,该类帐户被公钥-私钥对控制。合约帐户,该类帐户被存储在帐户中的代码控制。 外部帐户的地址是由公钥决定的,合约帐户的地址是在建立合约时肯定的(这个地址由合约建立者的地址和该地址发出过的交易数量计算获得,地址发出过的交易数量也被称做”nonce”)

两类帐户惟一的区别是:合约帐户存储了代码,外部帐户则没有。

每一个帐户有一个key-value形式的持久化存储。key,value的长度都是256bit。

另外,每一个帐户都有一个以太币余额(单位是“Wei”),该帐户余额能够经过向它发送带有以太币的交易来改变。

交易(Transactions)

一笔交易是一条消息,从一个帐户发送到另外一个帐户。交易能够包含二进制数据(payload)和以太币。

若是目标帐户包含代码,该代码和输入数据会被执行。

若是目标帐户是零帐户(帐户地址是0),交易将建立一个新合约。正如上文所讲,这个合约地址不是零地址,而是由合约建立者的地址和该地址发出过的交易数量计算获得。建立合约交易的payload被看成EVM字节码执行。执行的输出作为合约代码被永久存储。这意味着,为了建立一个合约,你不须要向合约发送真正的合约代码,而是发送可以返回真正代码的代码。

Gas

以太坊上的每笔交易都会被收取必定数量的gas,gas的目的是限制执行交易所需的工做量,同时为执行支付费用。当EVM执行交易时,gas将按照特定规则被逐渐消耗。

gas price(gas价格,以太币计)是由交易建立者设置的,发送帐户须要预付的交易费用 = gas price * gas amount。 若是执行结束还有gas剩余,这些gas将被返还给发送帐户。

不管执行到什么位置,一旦gas被耗尽(好比降为负值),将会触发一个out-of-gas异常。当前调用帧所作的全部状态修改都将被回滚。

存储,主存和栈(Storage, Memory and the Stack)

每一个帐户有一块持久化内存区域被称为存储。其形式为key-value,key和value的长度均为256比特。在合约里,不能遍历帐户的存储。相对于另外两种,存储的读操做相对来讲开销较大,修改存储更甚。一个合约只能对它本身的存储进行读写。

第二个内存区被称为主存。合约执行每次消息调用时,都有一块新的,被清除过的主存。主存能够以字节粒度寻址,可是读写粒度为32字节(256比特)。操做主存的开销随着其增加而变大(平方级别)。

EVM不是基于寄存器,而是基于栈的虚拟机。所以全部的计算都在一个被称为栈的区域执行。栈最大有1024个元素,每一个元素256比特。对栈的访问只限于其顶端,方式为:容许拷贝最顶端的16个元素中的一个到栈顶,或者是交换栈顶元素和下面16个元素中的一个。全部其余操做都只能取最顶的两个(或一个,或更多,取决于具体的操做)元素,并把结果压在栈顶。固然能够把栈上的元素放到存储或者主存中。可是没法只访问栈上指定深度的那个元素,在那以前必需要把指定深度之上的全部元素都从栈中移除才行。

指令集(Instruction Set)

EVM的指令集被刻意保持在最小规模,以尽量避免可能致使共识问题的错误实现。全部的指令都是针对256比特这个基本的数据类型的操做。具有经常使用的算术,位,逻辑和比较操做。也能够作到条件和无条件跳转。此外,合约能够访问当前区块的相关属性,好比它的编号和时间戳。

消息调用(Message Calls)

合约能够经过消息调用的方式来调用其它合约或者发送以太币到非合约帐户。消息调用和交易很是相似,它们都有一个源,一个目标,数据负载,以太币,gas和返回数据。事实上每一个交易均可以被认为是一个顶层消息调用,这个消息调用会依次产生更多的消息调用。

一个合约能够决定剩余gas的分配。好比内部消息调用时使用多少gas,或者指望保留多少gas。若是在内部消息调用时发生了out-of-gas异常(或者其余异常),合约将会获得通知,一个错误码被压在栈上。这种状况只是内部消息调用的gas耗尽。在solidity中,这种状况下发起调用的合约默认会触发一我的工异常。这个异常会打印出调用栈。

就像以前说过的,被调用的合约(发起调用的合约也同样)会拥有崭新的主存并可以访问调用的负载。调用负载被存储在一个单独的被称为calldata的区域。调用执行结束后,返回数据将被存放在调用方预先分配好的一块内存中。

调用层数被限制为1024,所以对于更加复杂的操做,咱们应该使用循环而不是递归。

代码调用和库(Delegatecall / Callcode and Libraries)

存在一种特殊类型的消息调用,被称为callcode。它跟消息调用几乎彻底同样,只是加载自目标地址的代码将在发起调用的合约上下文中运行。

这意味着一个合约能够在运行时从另一个地址动态加载代码。存储,当前地址和余额都指向发起调用的合约,只有代码是从被调用地址获取的。

这使得Solidity能够实现”库“。可复用的库代码能够应用在一个合约的存储上,能够用来实现复杂的数据结构。

日志(Logs)

在区块层面,能够用一种特殊的可索引的数据结构来存储数据。这个特性被称为日志,Solidity用它来实现事件。合约建立以后就没法访问日志数据,可是这些数据能够从区块链外高效的访问。由于部分日志数据被存储在布隆过滤器(Bloom filter) 中,咱们能够高效而且安全的搜索日志,因此那些没有下载整个区块链的网络节点(轻客户端)也能够找到这些日志。

建立(Create)

合约甚至能够经过一个特殊的指令来建立其余合约(不是简单的向零地址发起调用)。建立合约的调用跟普通的消息调用的区别在于,负载数据执行的结果被看成代码,调用者/建立者在栈上获得新合约的地址。

自毁(Selfdestruct)

只有在某个地址上的合约执行自毁操做时,合约代码才会从区块链上移除。合约地址上剩余的以太币会发送给指定的目标,而后其存储和代码被移除。 注意,即便一个合约的代码不包含自毁指令,依然能够经过代码调用(callcode)来执行这个操做。

文章发布只为分享区块链技术内容,版权归原做者全部,观点仅表明做者本人,毫不表明区块链兄弟赞同其观点或证明其描述

相关文章
相关标签/搜索