以太坊研究报告

一、前言

要了解以太坊,首先需要了解一下比特币和区块链;

1.比特币介绍

1.1 概念

比特币由中本聪在2009年提出;是构建在区块链技术之上的加密数字货币;比特币使用分布式账簿记录网络中出现的每一笔交易;分布式账簿就是说这个账簿会在很多网络机器上存储;比特币是一种P2P形式的数字货币,点对点的传输意味着一个去中心化的支付系统。与大多数货币不同,比特币不依靠特定货币机构发行,它依据特定算法,通过大量的计算产生,比特币经济使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为,并使用密码学的设计来确保货币流通各个环节安全性。它以一个“无信任”的交易系统来运行—一个个体在不需要信任任何第三方或对方的情况下进行点对点交易的架构。比特币发行总量将永远被限制在2100万个。比特币是基于区块链技术的第一个落地应用。

1.2 比特币利用到的核心如下:

(1)数字签名技术

        签名和验签保护了每一笔交易和用户账户的安全性;

(2)哈希技术 

       哈希技术构建了交易的账本,也就是区块,它具有不可篡改和可溯源的作用

(3)博弈论(共识算法)

        纳什均衡的稳定状态保证了没有节点可以通过不诚实的行为获得更高的回报。作恶成本高。 

1.3 关键术语解析:

矿工:其工作内容是产生初始账簿,收集交易、填写账簿、验证账簿有效性等,比特币是矿工工作量的一个报酬体现。从事虚拟货币挖矿的人,其实并不用亲自动手,买一台专用的计算设备,下一个挖矿软件,保证矿机电力供应和网络连接就可以进行挖矿了。

工作量证明:是一种对应服务与资源滥用、或是阻断服务攻击的经济对策。一般是要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以此耗用的时间、设备与能源做为担保成本,以确保服务与资源是被真正的需求所使用。工作量证明最常用的技术原理是散列函数

比特币挖矿:挖矿的本质则是在争夺记账权,是工作量证明的过程;

比特币中还涉及到公钥、私钥、地址的概念;每个交易都必须含有比特币持股人的私钥数字签名,否则该笔交易就是无效的;

私钥例子(纯数字16进制展示):1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

地址例子(包括数字和字母):1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

2.区块链介绍

2.1 区块链概念

区块链是多种技术整合的一个结果,包括数学、密码学、经济学、网络科学等,这些技术以特定方式组合在一起,形成一种新的去中心化数据记录与存储体系,如同一个分布式账本;区块链分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。区块链技术是比特币的底层技术,比特币是区块链的第一个应用。

区块链:由很多区块组成的链条,可以把区块链简单比喻为一本账本,把区块比喻为账本的一页记录

区块链具有“共享状态的加密安全单机”;

共享状态:在这一个系统中,存储的状态对每一个人都是透明和开放的;

加密安全:是指数字货币的创造是通过复杂的数学算法来保证的,很难破解;类似系统防火墙,这使得你无法在区块链创造虚假或删除交易记录

安全单机:是指有一个单机实例,就可以负责产生系统中所有的交易;

2.2 区块链系统结构

区块链系统由数据层、网络层、共识层、激励层、合约层和应用层组成

2.3 区块链特点

区块链具有如下特点:去中心化、开放性、自治性、信息不可篡改、数据可溯源、匿名性等特点;

a.去中心化:不存在中心化的硬件或管理机构,任意节点的权利和义务都是均等的;

b.开放性:系统是开放的,除了交易各方的私有信息被加密外,区块链的数据对所有人公开,任何人都可以通过公开的接口查询区块链数据和开发相关应用,因此整个系统信息高度透明。

c.自治性:区块链采用基于协商一致的规范和协议(比如一套公开透明的算法)使得整个系统中的所有节点能够在去信任的环境自由安全的交换数据,使得对“人”的信任改成了对机器的信任,任何人为的干预不起作用。

d.信息不可篡改:一旦信息经过验证并添加至区块链,就会永久的存储起来,除非能够同时控制住系统中超过51%的节点,否则单个节点上对数据库的修改是无效的,因此区块链的数据稳定性和可靠性极高。

e.数据可溯源:区块链是一个分散的数据库,分散数据库记录了区块链每笔交易的输入输出,从而可以轻松的追踪资产数量变化和交易活动

f.匿名性:由于节点之间的交换遵循固定的算法,其数据交互是无需信任的(区块链中的程序规则会自行判断活动是否有效),因此交易对手无须通过公开身份的方式让对方对自己产生信任,对信用的累积非常有帮助。

2.4 区块链技术

区块链主要解决的交易的信任和安全问题,因此它针对这个问题提出了四个技术创新:

第一个叫分布式账本,就是交易记账由分布在不同地方的多个节点共同完成,而且每一个节点都记录的是完整的账目,因此它们都可以参与监督交易合法性,同时也可以共同为其作证。

第二个叫做非对称加密和授权技术,存储在区块链上的交易信息是公开的,但是账户身份信息是高度加密的,只有在数据拥有者授权的情况下才能访问到,从而保证了数据的安全和个人的隐私。

第三个叫做共识机制,就是所有记账节点之间怎么达成共识,去认定一个记录的有效性,这既是认定的手段,也是防止篡改的手段。区块链提出了四种不同的共识机制,适用于不同的应用场景,在效率和安全性之间取得平衡。

最后一个技术特点叫智能合约,智能合约是基于这些可信的不可篡改的数据,可以自动化的执行一些预先定义好的规则和条款。以保险为例,如果说每个人的信息(包括医疗信息和风险发生的信息)都是真实可信的,那就很容易的在一些标准化的保险产品中,去进行自动化的理赔。

2.5 区块链的应用

2.5.1 区块链1.0 

是以比特币为代表的虚拟货币的时代,代表了虚拟货币的应用,包括其支付,流通等虚拟货币的职能.主要具备的是去中心化的数字货币交易支付功能,目标是实现货币的去中心化与支付手段。比特币就是区块链1.0最典型的代表

2.5.2 区块链2.0

区块链2.0是指智能合约,智能合约与货币相结合,对金融领域提供了更加广泛的应用场景,区块链2.0的代表是'以太坊',以太坊 = 区块链 + 智能合约

2.5.3 区块链3.0

是指区块链在金融行业之外的各行业的应用场景.能够满足更加复杂的商业逻辑.区块链3.0被称为互联网技术之后的新一代技术创新,足以推动更大的产业改革。区块链3.0是为了解决各行各业的互信问题与数据传递安全性的技术落地与实现。

2.6 区块链总结

2.6.1 区块链的去中介化、数据不可篡改及可溯源、共识(信任)机制等特性都将对现有社会产生很大冲击;

信任角度看:

主流社会制度的“痛点”显然不止“中心化”这么一项,“信任”就是另外一个“痛点”,尤其是陌生人之间的信任。“信任”是个大问题,司法、货币、银行、公证、征信,甚至政府的存在等,几乎都是为了实现社会成员的守信和相互信任,“中心化”某种程度上也是因为“中心”更可信。

人们的信任都是建立在中介机构之上,这样势必相互之间交易的价值就会缩水;比如买卖房屋,买家和卖家之间达成交易的信任是建立在第三方房地产中介上的;势必买卖双方都需要支付一笔“信任”费用至第三方;假设第三方中介作假,那买卖双方交易就会产生问题,这就涉及到复杂的维权了;而区块链的出现对买卖双方的信任关系直接建立在区块链上;这样就解决了买家与卖家之间信任的问题。

激励机制

任何一种制度机制,首要的功能显然应当是“激励”,其次才是约束,有效的激励是社会进步真正的动力。比特币、以太币以及其他各种虚拟代币(token),正是区块链具备激励功能的体现。中本聪所设计的区块链是试验之作,本身并无商业价值,为了引起关注、发展联结点,同时激励参与者不断通过“挖矿”式计算来创建新的区块,共同维护链条的延展存续,他必须要给予为此而做出努力的人以“报酬”。

个人隐私看:

由于人们之间的信任是建立在第三方机构(中心机构)之上,也就是说人们的个人隐私就都全部裸露在中心机构里,不法分子很容易通过这些中心机构获取到你的个人隐私,进行作恶,想想这是多么可怕的事情;而区块链是完全去中心化的,所有数据也是经过加密的;所有人要窥看别人的隐私都必须经过他本人的授权;假设区块链个人私钥丢失,将无法找回其财产,这是区块链隐私方面需要解决的问题。

数据不可篡改及可溯源看:

假设某个事物从产生到使用,其过程均记录在区块链上;那么它在任何时候都能追溯到它之前发生变化的任何状态;它就起到了存证的作用;这就大大提高了现实社会存证难的问题;

从以上几点分析可以看到,区块链生来就可信、精准、不可篡改。区块链的出现改变的是人们之间信任的生活方式;当所有人习惯于这样的一个生产关系的时候,不会觉得有多么的不妥;就像在乔布斯发明苹果手机之前 ,人们从未觉得键盘手机有什么不适。在现实世界中,每个人的人生阶段都是处在各式各样的关系契约中,所有人在各种契约约定下参与社会的生产和生活。区块链技术最终将能促进生产关系虚拟化,推动生产力的发展。在此之前,区块链还有很长的一段路要走。

2.6.2 目前区块链的痛点

由于其去中心化特性,需要每个全量节点都存储完整数据,并达成共识;随着数据体量的增大,庞大的数据势必会产生一系列问题,比如TPS性能、网络传输等;程序一旦部署,更新难;

真正杀手级应用程序向淘宝微信等,需要具备以下特性:

a.需要超高速的数据处理能力,每秒处理上万甚至几十万的交易

b.需要超大的存储来保存海量数据

c.需要方便易用,让一个咱们爸妈辈的人经过短时间的学习和练习也能使用,就如现在的微信聊天和支付一样

现有的区块链解决方案远远不能解决这三个问题

目前区块链行业提出了很多解决方案,比如EOS的分片,分层,比特币侧链、子链技术等。

二、以太坊

1.以太坊概念

以太坊(Ethereum blockchain)在2013至2014年间由V神(Vitalik Buterin)提出,是一个开源的有智能合约功能的公共区块链平台,通过其专用加密货币以太币(Ether)提供去中心化虚拟机(“以太虚拟机” Ethereum Virtual Machine)来处理点对点合约。以太坊通过一套图灵完备的脚本语言(EthereumVirtual Machinecode,简称EVM语言)来建立应用,它类似于汇编语言。

以太坊是一个平台,它上面提供各种模块让用户来搭建应用,平台之上的应用,其实就是合约,这是以太坊的核心;

2.名词术语解析

汽油(Gas):Gas, 是以太坊系统里对所有活动进行消耗资源计量的单位。在以太坊区块链上实现了一个EVM(以太坊虚拟机)的代码运行环境,在链上执行写入操作时,网络中的每个全节点都会进行相同的计算并存储相同的值,这种执行的消耗是昂贵的,为了促使大家将能在链下进行的运算都不放到链上进行,也为了奖励矿工,因此在链上每执行一个写入操作时,都需要支付一定的费用,用gas为单位来计数,每个在链上可以执行的命令都设置了一个消耗的gas值,例:PUSH操作需要消耗3个gas,一次转账一般要消耗21000gas,gas使用ETH来支付。

gas limit:即单个区块允许的最多gas总量,以此可以用来决定单个区块中能打包多少笔交易。我们每一次交易或合约调用都要设置一个gas limit,如果该次操作所使用的gas数量小于或等于您所设置的gas limit,则会被执行,但如果gas总消耗量超过gas limit,所有的操作都会被重置,但费用依旧会被收取。在执行中实际消耗的gas值总和叫gas used,没有使用完的gas会退还到原账号。

gas price:在发起交易或合约调用时,我们可以自己设置gas的价格,即gas price,一般以GWei(1 ETH = 1000000000 GWei)为单位。通过gas price可以节省矿工费用,但也会减慢矿工打包的速度,矿工会优先打包gas price设置高的交易,如果您想加快转账,您可以把gas price设置得更高,这样您就可以插队靠前。实际支付的费用 = gas used * gas price。

Gas Limit和Gas Price代表发送方愿意为执行交易支付的最大金额。

例如,发送方将Gas Limit设置为50,000,一个Gas Price设置为20 gwei。这意味着发送者愿意花费最多50,000 x 20 gwei,也就是:1,000,000,000,000,000 Wei(0.001以太币)来执行这一交易。

以太币(Ether):是Ethereum世界中使用的数字货币,也就是常说的以太币,Ethereum系统里所有的活动,都可以用Ether来计量(货币概念)

EVM:EVM代码是以太坊虚拟机代码,以太坊的区块链可以包含的编程语言的代码。与帐户相关联的EVM 代码在每次消息被发到这个账户的时候被执行,并且具有读/写存储和自身发送消息的能力。

3. 以太坊区块链工作原理

以太坊区块链,本质上是一个交易服务的状态机;以太坊状态机运行从一个元状态(空白石板),交易执行时,就转变成最终状态,任何时候的最终状态都代表着以太坊区块链的现状;

以太坊系统中运行着数百万笔交易,这些交易被分组归类为「区块」。一个区块包含一系列交易,每个块与其前面的区块串联在一起。

要从一个状态转到另一个状态,必须证明交易是有效的。如果一个交易被认为是有效的,就必须通过一个验证过程,这一过程称为「挖矿」。网络中任何声明自己是「矿工」的节点都可以尝试创建和验证区块,全世界有许多矿工试图同时创建和验证区块。如果要在主区块链上添加一个区块,矿工必须比其他竞争对手更快地对其证明。通过让矿工提供数学证明来验证每个区块的过程被称为「工作量证明」。一个矿工如果创建了新的区块,就会立即广播出去通知其他节点进行该区块有效性的验证,这个验证过程被称为「达成共识」。一个矿工创建的区块如果被验证通过了,那么这个矿工就会得到一定数额的价值回报(以太币)。

如果链条被分开,即产生了多条链「分叉」,如果拥有多个状态(或链条)会破坏整个系统,因此我们通常会避免分叉,迫使人们选择他们「相信」的链条。

为了确定哪个路径是最有效的,并防止分叉的发生,以太坊使用了一种叫做「GHOST协议」的机制。简单地说,GHOST协议让我们必须选择在链上做最多计算的路径。确定该路径的一种方法是使用最新区块的数量,来表示当前路径中的区块总数(不计算起源块)。块数越多,路径越长,挖矿的难度越大,最终就一定会到达最新区块。使用这个方式让我们对当前区块链状态的唯一版本达成一致。

4.以太坊主要组成部分

  • 帐户

  • Gas与费用

  • 交易

  • 区块

  • 交易执行

  • 工作量证明

4.1 账户分两种:外部账户(私人密钥控制,无相关代码关联)、合约账户(合约代码控制,与代码关联),合约账户不能自行产生新交易,只能根据它们收到的其他交易进行交易;

4.2 Gas和费用:在以太坊中,费用的计算是一个非常重要的概念。在以太坊网络上进行的每一笔交易都会产生费用ーー没有免费的午餐!这笔费用被称为「Gas」。

4.3 交易可以看做是一个由外部拥有的帐户生成的序列化加密签名指令,然后提交给区块链

所有交易都包含以下组件:

  • Nonce:发送方发送的交易数量的计数;

  • gasPrice:发送方愿意支付每单位Gas所需执行交易的Wei数量;

  • gasLimit:发送方愿意支付的执行这一交易的Gas最大数量。这个数额是预先设定和支付的;

  • to:接收方的地址,在创建合约的交易中,合约帐户地址还不存在,因此使用了空值;

  • Value:从发送方转移到收件方的金额,在创建合约的交易中,这个Value作为新创建合约账户内的起始余额;

  • v, r, s:用于生成识别交易发送方的签名;

  • Init(只存在于创建合同的交易中):用于初始化新合约帐户的EVM代码片段,它只运行一次,然后被丢弃,当init第一次运行时,它会返回帐户代码的主体,这个代码是与合约帐户永久关联的一段代码;

  • data(只存在于消息调用中的可选字段):消息调用的输入数据(即参数)。例如,如果一个智能合约充当域名注册服务,那么对该合约的调用可能会有诸如域名以及IP地址等输入字段。

4.4 以太坊的区块:所有交易都被组合成为区块

区块头

  • Parenthash:一个父区块头的哈希(这就是为什么区块链被称为区块「链」);

  • Ommershash:当前区块ommer列表的哈希;

  • beneficiary:收取采矿费用的帐户地址;

  • Stateroot:状态树的根节点哈希;

  • transactionsRoot:包含在此区块中列出的所有交易树根节点的哈希值;

  • receiptsRoot :包含本区块中列出的所有交易树根节点的哈希的收据;

  • logsBloom:一个由log组成的Bloom过滤器(数据结构);

  • difficulty:这个区块的难度水平;

  • 编号:当前区块的记数(元区块的编号为0;每个后续区块的块数增加1);

  • gasLimit:当前每个区块的Gas限制;

  • gasUsed:本区块交易所使用的总Gas之和;

  • 时间戳:这个区块注入的unix时间戳;

  • extraData:与此区块相关的其他数据;

  • mixHash:当与nonce结合时,证明这个区块执行了足够计算的哈希值;

  • Nonce:当与mixHash结合时,证明这个区块已经执行了足够计算的哈希值;

每个区块头包含三个树结构:

  • 状态根(stateRoot);

  • 交易根(transactionsRoot);

  • 收据根(receiptsRoot)。

4.5 交易的执行:太坊协议中最复杂的部分

执行条件:

  • 交易必须是正确的RLP格式(RLP是「递归长度前缀」的缩写,是用于二进制数据编码嵌套数组的数据格式,RLP是以太坊使用的序列化对象的格式)。

  • 有效的交易签名。

  • 有效的交易nonce,回想一下,一个帐户的nonce是从该帐户发送的交易的统计,为了有效,交易nonce必须与发送方帐户的nonce相等。

  • 交易的Gas限额必须等于或大于交易所使用的内部Gas;

  • 发送方的账户余额必须有足够的以太币来支付前期的Gas费用

交易开始执行。在交易的整个执行过程中,以太坊都跟踪「子状态」。子状态记录交易中产生的信息,这些信息也是交易完成后所马上需要用到的。具体来说,它包含:

  • 自毁集合:交易完成后将丢弃的一组帐户(如果有的话);

  • 日志序列:虚拟机代码执行的存档和可索引的检查点;

  • 退款余额:交易完成后退还给发送者账户的余额。

一旦处理完交易中的所有步骤,并假定没有无效状态,则通过确定向发送方退还未使用的Gas数量,来最终判定最终状态。除了未使用的Gas外,发送方还从上文所的「退款余额」中退还了一些余额。

4.6 工作量证明(在核心技术中主讲)

5.以太坊关键技术

以太坊采用了许多信息安全及密码学的相关技术,大致有5个,工作量证明(POW),椭圆曲线密码,哈希函数,Merkle Tree,以及电子时间戳机制。

5.1 工作量证明 
工作量证明机制(Proof of Work, POW)为区块链关键技术。主要特征是工作者须要做出一定难度的工作才能得出结果,但验证方却可以根据该结果很容易的检查出工作者是否做了相对应的工作。

5.2 椭圆曲线密码

在区块链中使用的公钥密码算法是基于椭圆代数的特性开发的椭圆曲线算法。椭圆曲线算法的安全性依赖于著名的数学难题,离散对数问题。椭圆曲线密码的加解密过程如下图。 

用户Alice选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点P;用户A选择一个私有密钥k,并生成公开密钥L=kP;用户A将Ep(a,b)和点L、P传给用户Bob;用户Bob接到信息后,将待传输的明文编码到Ep(a,b)上一点M,并产生一个随机整数x(x小于r);用户Bob计算点C1=M+xL,C2=xP;用户Bob将C1,C2传给用户Alice;用户Alice接到信息后,计算C1-LC2,结果就是点M。 

椭圆曲线加密方法与RSA方法相比,有以下优点:(1)安全性能更高。加密算法的安全性能一般通过该算法的抗攻击强度来反映。ECC和其他几种公钥系统相比,其抗攻击性具有绝对的优势。如160bitECC与1024bitRSA、有相同的安全强度。(2)处理速度快,在私钥处理上(签名与解密),ECC远比RSA快。(3)存储空间占用小,ECC的密钥尺寸比RSA要小的多。

5.3 Merkle Tree

Merkle Tree多数是用来进行比对和验证处理。Merkle Tree协议对以太坊的长期持续性可以说是至关重要的。区块链网络中存储所有区块的全部数据的节点所需的内存空间急速增长。Merkle Tree协议使以太坊在运行过程中,只需下载区块头,使用区块头确认工作量证明,然后只下载与其交易相关的默克尔树“分支”。这使得节点只要下载整个区块链的一小部分就可以安全地确定任何一笔比特币交易的状态和账户的当前余额。

5.4 时间戳机制 
在以太坊中,要求参与交易各方不能否认其行为。这其中需要在经过数字签名的交易上打上一个可信赖的时间戳,从而解决一系列的实际和法律问题。时间戳服务工作流程大致如下:首先用户对文件数据进行Hash摘要处理;用户提出时间戳的请求,Hash值被传递给时间戳服务器;时间戳服务器对哈希值和一个日期/时间记录进行签名,生成时间戳;时间戳数据和文件信息绑定后返还,用户进行下一步电子交易操作。

5.5哈希函数

一个可靠的单向哈希函数必须具备以下特性:(1)输入任意长度数据必须输出固定长度的散列值;(2)能够快速计算出散列值;(3)输入数据有细小差别也要导致散列值差别很大;(4)具备单向性,无法根据散列值反推出原始数据。常见的单向散列函数包括MD4/MD5、SHA-1/SHA-256/SHA-384/SHA-512、RIPEMD/RIPEMD-160、以及以Keccak算法作为标准的SHA-3系列函数。其中MD4/MD5、SHA-1、RIPEMD已经存在攻破的算法,不推荐在极其敏感环境下使用。以太坊中常用的哈希函数有SHA-256,Keccak-256等。

6. 源码目录结构

accounts        	实现了一个高等级的以太坊账户管理
bmt			二进制的默克尔树的实现
build			主要是编译和构建的一些脚本和配置
cmd			命令行工具,又分了很多的命令行工具,下面一个一个介绍
	/abigen		Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages
	/bootnode	启动一个仅仅实现网络发现的节点
	/evm		以太坊虚拟机的开发工具, 用来提供一个可配置的,受隔离的代码调试环境
	/faucet		
	/geth		以太坊命令行客户端,最重要的一个工具
	/p2psim		提供了一个工具来模拟http的API
	/puppeth	创建一个新的以太坊网络的向导
	/rlpdump 	提供了一个RLP数据的格式化输出
	/swarm		swarm网络的接入点
	/util		提供了一些公共的工具
	/wnode		这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。
common			提供了一些公共的工具类
compression		Package rle implements the run-length encoding used for Ethereum data.
consensus		提供了以太坊的一些共识算法,比如ethhash, clique(proof-of-authority)
console			console类
contracts	
core			以太坊的核心数据结构和算法(虚拟机,状态,区块链,布隆过滤器)
crypto			加密和hash算法,
eth			实现了以太坊的协议
ethclient		提供了以太坊的RPC客户端
ethdb			eth的数据库(包括实际使用的leveldb和供测试使用的内存数据库)
ethstats		提供网络状态的报告
event			处理实时的事件
les			实现了以太坊的轻量级协议子集
light			实现为以太坊轻量级客户端提供按需检索的功能
log			提供对人机都友好的日志信息
metrics			提供磁盘计数器
miner			提供以太坊的区块创建和挖矿
mobile			移动端使用的一些warpper
node			以太坊的多种类型的节点
p2p			以太坊p2p网络协议
rlp			以太坊序列化处理
rpc			远程方法调用
swarm			swarm网络处理
tests			测试
trie			以太坊重要的数据结构Package trie implements Merkle Patricia Tries.
whisper			提供了whisper节点的协议。

7. 以太坊核心功能说明

7.1 以太坊智能合约账户

以太坊中的账户分两种:外部账户和合约账户。

账户状态由四个部分组成:nance(Number once的缩写)交易数量或合约数量、balance以太币数量、storageRoot 一个Merkle Patricia树根节点的哈希、codeHash:EVM(以太坊虚拟机)的哈希值代码。 对于合约帐户,这是一个被哈希后并存储为codeHash的代码。对于外部帐户,codeHash字段是空字符串的哈希。

以太坊智能合约就是在以太坊虚拟机上运行的计算机程序。以太坊虚拟机是为以太坊智能合约在容器沙箱中运行而设计的一个完全隔离的环境。这意味着在以太坊虚拟机中运行的每个智能合约都无法访问托管虚拟机的计算机上运行的网络架构,文件系统或其他进程。

以太坊网络中有两种帐户:智能合约账户和外部拥有帐户。每个帐户都由一个地址来标识,所有的帐户共享相同的地址空间,即以太坊虚拟机接受长度为160位的地址。

账户是160位字符索引;

每个帐户中都包含余额,随机数,字节码和存储的数据(简称存储,下同)四个部分。但这两种账户之间存在一些差异。例如,外部拥有帐户并没有代码部分和存储部分,而智能合约帐户的这两个部分分别存储它们的字节码和整个状态树的默克尔树( Merkle Tree)根哈希。此外,外部拥有帐户具有与其相应的私钥,而智能合约帐户却没有。智能合约帐户除了对每笔以太坊交易进行常规的密码学签名之外,所有的操作都由智能合约中的代码控制。

通过上图,你会了解到,外部拥有账户由私钥控制,且外部拥有账户中不包含以太坊虚拟机代码,而智能合约账户含有以太坊虚拟机代码,并由代码控制。

7.2 MPT树形结构

MPT实际上是三种数据结构的组合,分别是Trie树, Patricia Trie, 和Merkle树

每一个以太坊的区块头包含三颗MPT树,分别是

  • 交易树
  • 收据树(交易执行过程中的一些数据)
  • 状态树(账号信息, 合约账户和用户账户)

这三类数据先存储与缓存中,每次调用Commit操作的时候,会增加Trie树的cache时代。 cache时代会被附加在node节点上面,如果当前的cache时代 - cachelimit参数 大于node的cache时代,那么node会从cache里面卸载,以便节约内存。 其实这就是缓存更新的LRU算法, 如果一个缓存在多久没有被使用,那么就从缓存里面移除,以节约内存空间。

数据库存储db是后端的KV存储,trie的结构最终都是需要通过KV的形式存储到数据库里面去,然后启动的时候是需要从数据库里面加载的;

序列化主要是指把内存表示的数据存放到数据库里面, 反序列化是指把数据库里面的Trie数据加载成内存表示的数据。 序列化的目的主要是方便存储,减少存储大小等。

proof.go Trie树的默克尔证明

proof证明是从根节点到叶子节点的所有节点的hash值列表。 VerifyProof方法,接受一个roothash值、proofDb证明和key列表来验证key是否能够和数据库里面的能够对应上

以太坊中数据库:

在Ethereum的世界里,数据的最终存储形式是[k,v]键值对,目前使用的[k,v]型底层数据库是LevelDB;levelDB支持按照文件大小切分文件的功能,所以我们看到的区块链的数据都是一个一个小文件,其实这些小文件都是同一个levelDB实例。

上述数据单元如Block,stateObject,StateDB等,均大量使用Merkle-PatriciaTrie(MPT)数据结构以组织和管理[k,v]型数据。利用MPT高效的分段哈希验证机制和灵活的节点(Node)插入/载入设计,调用方均可快速且高效的实现对数据的插入、删除、更新、压缩和加密。

7.3 以太坊虚拟机(EVM)

7.3.1 执行模式

实际处理交易的部分是以太坊自己的虚拟机,被称为EVM。就像之前定义的那样,EVM是一个「图灵完备」的虚拟机。唯一的不同是EVM有内在Gas的约束。因此,可以完成的计算总量本质上受到所提供Gas数量的限制。

此外,EVM 有一个基于栈机器的架构。栈机器是一种使用「后入先出」的堆栈来保存临时值的计算机。EVM中每个栈条目的大小为256位,最大为1024位。这就是EVM与典型的冯·诺伊曼结构的不同,冯·诺伊曼结构中程序代码是在内存或存储中。

EVM也有自己的语言——EVM字节码。当程序员在以太坊上写智能合约的时候,通常用高级语言写代码,比如Solidity。然后,可以编译成EVM字节码,以便EVM可以理解执行。

7.3.2 以太坊虚拟机架构图

a. 以太坊虚拟机在整个以太坊架构中的位置

b.以太坊虚拟机架构

c.以太坊的运行模型

7.4 消息调用机制

智能合约可以通过消息调用机制调用其他智能合约。

每当智能合约需要调用另一个智能合约的函数时,它都会通过生成一个消息调用。每个消息调用都有发送者,接收者,有效载荷,以太币传输数量和一定量的以太坊燃料。消息调用的深度被限制为小于1024级。

每个智能合约都可以决定在消息调用时发送的燃料数量。

由于每次消息调用都可以以燃料耗尽(out-of-gas,OOG)结束,为了避免安全问题,发送方要至少保留剩余燃料的1/64。

通过这种机制,发送者可以避免出现内部燃料耗尽异常,确保在耗尽燃料之前完成智能合约的执行。

以太坊虚拟机可以通过消息调用来输入外部数据,以太坊虚拟机可以输出日志,也可以给调用智能合约输出返回值

以太坊虚拟机的数据管理

除了智能合约代码,至少可以区分出四种主要类型的数据:堆栈,calldata,内存和存储。接下来依次对它们做出分析。

7.5 共识算法

目前以太坊采用 PoW 算法,并计划逐步替换成 PoS。

目前主流的共识算法主要包括:POW、POS、DPOS、PBFT、PAXOS、RAFT等

7.5.1 POW:Proof of Work,工作证明。(最终一致性,适用公有链)

要得到合理的Block Hash需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。寻找合理hash是一个概率事件。当节点拥有占全网n%的算力时,该节点即有n/100的概率找到Block Hash。

简单说明:pow主要是依靠计算机的机器的性能(计算能力)来出块,性能越高,出块概率越大;就是谁更有权,谁就更容易产生块;这会导致大量资源浪费、网络性能低、算力太集中偏离了去中心化轨道;

7.5.2 POS:Proof of Stake,股权证明。(最终一致性,适用公有链)

PoS 试图解决 PoW 机制中大量资源被浪费的情况。这种机制通过计算你持有占总币数的百分比以及占有币数的时间来决定记账权。每出一次块,时间会清零重新计算;PoS 就是资本主义,按钱分配,钱生钱。POS虽然解决了POW的能耗的问题,但全节点确认会让区块确认的效率提不起来,且时间越长,也越容易产生马太效应,即持有币越多的人会获得更多的币奖励,从而加大贫富差距,最终产生超过50%的中心化节点

7.5.3 DPOS:Delegated Proof of Stake,委任权益证明(最终一致性,适用公有链)

股份授权证明机制(又称受托人机制),它的原理是让每一个持有比特股的人进行投票,由此产生101位代表 , 我们可以将其理解为101个超级节点或者矿池,而这101个超级节点彼此的权利是完全相等的。DPOS有点像是议会制度或人民代表大会制度。优点是整个网络的能耗大大下降,网络运行成本更低;理论上更去中心化;缺点小散投票积极性不高,坏节点不能被即时处理,总是要经过一个选举才能清除坏节点。

7.5.4 PBFT:Practical Byzantine Fault Tolerance,实用拜占庭容错算法。(强一致性,适用私有链联盟链)

n是总投票人数,f是叛徒人数,由于多数者胜,所以只有当n-2f>f的情况下,将军才会做出正确的决定,即n>3f,n最小需要取3f+1。最终决定是由中心节点确定;

拜占庭容错系统一致性协议至少包括五个阶段:请求(request)、序号分配(pre-prepare)、相互交互(prepare)、序号确认(commit)和响应(reply)

7.5.5 PAXOS(强一致性,适用私有链联盟链)

Paxos解决这一问题利用的是选举,少数服从多数的思想,只要2N+1个节点中,有N个以上同意了某个决定,则认为系统达到了一致;

Paxos看上去是一个无主的协议,但实际上在paxos的第一个阶段,就是一个leader抢夺战,每个主机在第一阶段都会有一个提案编号,这个提案编号越大,则优先级越高。Paxos第一阶段要获得主动权,另外还需要把数据确定,这样才能展开第二个阶段

paxos共识系统包含五种角色:Client(客户端)、Proposer(提议者)、Acceptor(接收者)、Learner(学习者)、Leader(领导者)

7.5.6 RAFT

raft的第一阶段(选主)则不涉及到数据的问题,raft的第一个阶段直选主,因为leader一旦确定,那么数据也就随之确定了,因为raft的数据是单向的从leader向follower流动的。

(1)Leader在时。由Leader向Follower同步日志
(2)Leader挂掉了,选一个新Leader,Leader选举算法。

7.6 以太坊分析

7.6.1 以太坊Gas

以太坊整个系统的运行围绕着Gas燃料,Gas相当于以太坊的血液;每笔交易都必须设定一定Gas,区块链每笔交易的确定都需要消耗一定的Gas;Gas简单理解就是交易费用的手续费,也可理解为小费。Gas只存在于Ethereum虚拟机的内部,作为执行多少工作的计算数量。

初看这个会觉得有点奇怪。 为何不直接在以太网络中计算出手续费?

答案是,以太网络,如比特币,拥有快速变化市场价格!但计算成本不会因为以太网络币价的变化而上涨或下降。 所以将计算的价格与以太币token的价格分开是有帮助的,每次币价市场走动时,操作的成本都不必改变。

而以太坊每笔交易收取费用的目的是使整个网络不会因用户的不当使用而变得负担过重。

7.6.2 智能合约

一个智能合约是一套以数字形式定义的承诺(Promises),包括合约参与方 可以在上面执行这些承诺的协议。定义中的一套承诺指的是合约参与方同意的(经常是相互的)权利和义务。这些 承诺定义了合约的本质和目的。以一个销售合约为典型例子。卖家承诺发送货物,买 家承诺支付合理的货款。数字形式意味着合约不得不写入计算机可读的代码中。这是 必须的,因为只要参与方达成协定,智能合约建立的权利和义务是由一台计算机或者 计算机网络执行的。在区块链技术出现以前,智能合约由于没有可信的执行环境,一直 没有流行起来。区块链为智能合约提供了可信的执行环境,所以智能合约的概念在区 块链领域重新流行起来,并被应用到实践之中。这也就是以太坊如此流行重要原因之一。

四、目前以太坊问题

目前的以太坊存在的问题还很多,比如一直都存在的可扩展性问题,由于以太坊节点需要存储这个区块链网络上发生的所有事情,因此存储成本非常昂贵,并且这种成本可能会随着系统的扩展而呈现指数增长。针对这一问题,以太坊的创始人提出了“分片”的解决方案,具体思想是标是将状态以某种形式进行分片, 从而让多个在大多数情况下独立的应用程序以并行的方式处理。很自然地,我们会怀疑,在分片之后,发起一笔交易将就只会在涉及到的几个节点间引起波动,还能确保它们相互之间传递的信息的真实性吗?针对这一问题,以太坊是依靠验证管理合约来保证真实性的。每一个区块,和每一个分片,都会经过随机可靠的验证管理合约核实查证。

三. 未来区块链看法

基于目前区块链的火热,未来会出现格式各样的区块链产品:

一类是各式各样的数字货币,势必会产生一堆需要解决的问题,比如大家的区块链产品都基于自己发行数字货币为激励制度,随着区块链产品的不断增加,那么矿工的选择有有限,那是否会产生很多被节点遗弃区块链产品呢?那是否会出现一种统一的发币链激励制度呢?

二类是公有链、私有链、联盟链等在种类的多样性;另外由于多种链的存在,就涉及TPS性能问题以及链与链之间交互问题;会不会出现一种专门用于链接它们的独立链呢?

三类是技术标准:日前有专家表示,区块链就像是1992年的互联网,标准化还没有完全做完,应用和推广还会受到限制,处在早期的技术储备阶段,一旦有了标准,各种技术研发才能走得下去。区块链技术的突破也是影响它发展重要因素,所以在技术的深究上对于技术开发人员将是一个空前的机会。

理论上言,可以将现实生活中互联网可及的所有事物都装在一个巨大的区块链中,从而彻底解决平等、公平、失信、犯罪等一切问题,区块链技术似乎也蕴含了这样远大的理想。但这种理想无异于“乌托邦”,不仅科技水平不支持,世俗国家林立的世界也不允许存在这样的“链”。

区块链目前的实用价值尚且不高。但在多方当事人参与,且呈流程化延展的交易场景里,比如供应链交易、票据流通,乃至诉讼程序等场合,区块链无疑具有明显的应用优势,实践中成功的案例也在不断涌现。

技术从不因人而停滞,人却因技术而解放。未来,随着互联技术的不断进步,信息传输速度和软硬件性能的不断提高,相信区块链终将克服所有障碍,而成为最有效、最流行的技术方案,其所蕴含的全新的制度机制也必将绽放出人类文明之花。

 

转载于:https://my.oschina.net/u/2322635/blog/1930346

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值