深入理解区块链之以太坊

Love-Ethereum

以太坊

区块链通常被定义为去中心的分布式记账系统,该系统中的节点无需互相信任,通过统一的共识机制共同维护一份账本。在前几年,大家会关注比特币而不会单独谈论区块链这个技术。直到2015年,区块链这一概念才被单独提出来为更多人所了解,且向着更广泛的应用场景发展。发生在这个时间点的主要原因之一是以太坊的出现和日益成熟。

简单地说,以太坊是一个有智能合约(Smart Contract)功能的公共区块链平台。用智能手机打个比方,如果说以太坊是智能手机的操作系统,那么智能合约就是上面搭载的应用(App)。有了以太坊,用户可以直接开发自己的区块链应用。

以太币(ETH)

以太币是以太坊发行的一种数字货币, 在以太坊上发起任何一笔交易都需要支付一定的以太币.

以太币来源包括: 矿前 + 区块奖励 + 叔区块奖励 + 数区块引用奖励, 具体分配大致如下:

  • 预付款的贡献者总共有6000万个ETH

  • 新区块的挖矿奖励5ETH

  • 如果一个矿工挖出一个新区块, 但不是在主链中,则该区块称为叔区块. 如果该叔区块在之后的区块链中被引用, 每个叔区块挖矿者有4.375个ETH, 引用者有0.15ETH.

以太币发行:

  • 以太币发行使用GHOST协议, 每年发1800w ETH

  • 2018年开始,以太坊将使用Casper来替代目前的Pow, 该协议运行效率更高且需要更少的挖矿补贴. 此时ETH的发行率可能会有所降低

交易(Transactions)

以太坊的交易指的是一个外部账户发送到区块链上另一账户的消息的签名数据包,该消息中主要包含 发送者签名, 接收者地址, 交易的ETH数量等内容.在以太坊上的每一笔交易都需要支付一定的费用, 该费用主要用于支付执行交易所需要的计算开销. 以太坊中Gas是执行开销的基本单位.

扫描二维码关注公众号,回复: 5553918 查看本文章

交易费用

以太坊中采用Gas和GasPrice来对交易所需的手续费进行定价:

  • Gas

    用来衡量一笔交易所需要消耗计算资源的基本单位, 当执行一笔交易所需的计算步骤越多或者需要消耗更多的内存,那么这笔交易就需要越多的Gas.一般,一个普通的转账交易会消耗 21000Gas, 而创建一个智能合约交易可能会消耗几万甚至几百万的Gas

  • GasPrice

    是指1 Gas所需要的以太币, 如果一个转账交易消耗21000Gas, 假设GasPrice为 0.000000001 wei/Gas,那么这笔交易的手续费为0.000021Ether.

  • GasLimit

    对于单个交易, GasLimit表示交易者愿意为这笔交易所支付的最大Gas数量,其可以保护用户可能由于错误的代码影响而支付过多的交易费;

    对于区块来说, GasLimit表示单个区块所允许包含的最大Gas数量, 其由矿工决定大小. 区块的GasLimit设置的越大, 那么矿工就可以获得越多的交易费,但是需要更多的带宽, 同时会加叔数区块出现的概率, 造成挖出的区块无法形成最长的交易链.根据以太坊协议, GasLimit只能在1到1024之间.

交易内容

一笔交易会包含一下内容:

  • from: 交易发送者地址
  • to: 交易接受者地址, 如果为空,则意味这是一个创建智能合约的交易
  • value:转移的ETH数量
  • data: 如果存在data字段,表明这是一个创建或者调用智能合约的交易
  • GasLimit: 这个交易允许消耗的最大Gas数量
  • GasPrice: 发送者愿意支付给矿工的Gas价格
  • nonce:用来区别同一用户发出不同交易的标志
  • hash:由以上信息生成的散列值,作为交易的id
  • r s v: 交易签名的三个部分, 由发送者的私钥对交易的hash进行签名生成

不同场景下, 交易的三种类型:

  • 转账交易

web3.eth.sendTransaction(from:sendAddress, to:receiveAddress, value:10000000000)

  • 创建智能合约

web3.eth.sendTransaction(from:sendAddress,data:“contract binary code”)

  • 执行智能合约

web3.eth.sendTransaction(from:sendAddress, to:“contract address”, data:“hash of the invoked method signature and encoded parameters”)

智能合约

现实生活中经常遇到这样的场景:买家与卖家要进行一笔交易,为了保证交易的顺利进行,双方签订了一份合约,合约中声明双方各自的身份、权利和义务(买家付钱、卖家交货的时间节点和方式等),一式两份,各自保存。这样,当交易出现纠纷时,合约将成为寻求法律援助的依据,而法律将成为确保合约执行的强制力保障。

虽然合约为交易的顺利进行提供了一些保障,但是也存在很多不足之处。一旦交易中发生了纠纷,比如卖家拖延发货或者买家拒绝付款,即使在法律的援助下解决了纠纷,交易的效率也会大大降低。甚至在一些情况下,合约将会失去约束效力,比如合约中存在歧义或者合约丢失等。

那么有没有一种更有效的方式来保证交易的进行呢?假设有一个绝对可信和公正的交易代理人,卖家将商品交给代理人,买家与代理人进行一手交钱一手交货的当面交易。如果买家拒绝购买,卖家可以从代理人手中取回商品;买家也不会存在付钱后拿不到商品的风险。

智能合约就可以充当这样一个代理人。简单地说,智能合约就是区块链上一个包含合约代码和存储空间的虚拟账户,智能合约的行为由合约代码控制,而智能合约的账户存储则保存了合约的状态。

相比较传统合约,区块链智能合约在很多方面具有优势:

  • 智能合约的条款是由代码确定的。由于代码逻辑的明确性,比起自然语言,更加不容易产生歧义。

  • 智能合约存储和部署在区块链网络中,而网络中的节点相互独立,都拥有同一份副本,因此合约内容几乎不可能被篡改。同时区块链中也保存了合约的执行记录,可以作为永久的交易凭证。

  • 合约的创建和执行都依赖于区块链协议,所以合约执行的强制力可以保证。

理论上讲,任意计算复杂度的金融交互过程均可以由智能合约安全、自动地完成。除了金融方面的应用,以太坊平台还可以在如财产登记、投票、智能交通、物联网等任何需要信任、安全和性能兼顾的环境中进行部署和使用。

以太坊虚拟机(EVM)

在以太坊平台上,智能合约的代码运行在以太坊虚拟机(EVM)中,EVM是一个图灵完备的虚拟机,是以太坊协议的核心。在以太坊的点对点(P2P)网络中,每个全节点上都包含一个以太坊虚拟机,当节点需要打包或验证区块时,便将交易相关的可执行代码送入EVM中执行,执行的结果更新了以太坊账户的状态并被记录在区块链上。

以太坊网络中的每个节点都需要在各自的EVM中执行代码,这就导致了两个问题:

  • 一是这样会产生__大量的平行化计算__,每个节点都必须执行代码以验证区块中的结果状态。这虽然牺牲了一定的计算效率,但保证了分布式网络中更高的安全性。

  • 二是__EVM的执行结果必须有严格的确定性__,所有节点必须得到同样的运行结果。这就对智能合约以及EVM造成了一定的局限性,智能合约目前仍无法实现一些可能会带来不确定结果的简单操作,如生成随机数、调用操作系统API等,因为这些操作会因时间、系统等执行环境的差异而产生不同的结果,进而使以太坊节点无法对区块中的账户状态达成共识。

相关文章


重要的技术点

密码学

区块链的密码学算法为区块的生成,交易的传输等进行加密.

经济学

P2P网络

节点通信(TCP/IP)

Merkle Tree - 梅克尔树

Merkle Patricia Tree - 梅克尔帕特里夏树

共识算法介绍

区块链构造的去中心化账本需要解决的首要问题是如何确保不同节点上的账本数据的一致性和正确性,而共识算法正是解决这个问题。

相关文章

经典的共识算法

几种经典共识算法分析

POW

Pow即通过工作结果来证明你完成了相应的工作. 其工作工程是繁琐而低效的,而对工作结果的验证确实很容易的.比如: 我们可以用一份高考成绩单来衡量一个学生在高中三年中各学科的学习情况.Pow的目的是使得区块的创建变的困难,从而阻止“女巫“攻击者恶意重新生成区块链.

一般加密货币的Pow算法可以描述如下:

  • 节点打包经过验证的交易

  • 不断地更换随机数来探寻合适的散列值(该散列值小于系统提供的指定散列值)

  • 当节点计算出合适的散列值时, 如果其打包的快通过了其他共识节点的验证,则会被加入到区块链中.

节点想要计算出合适的散列值需要经过大量的散列计算, 计算时间则取决于机器的散列速度.所以一般矿机的性能越好,其成功计算出合适的散列值的概率就会越大.

Pos

Pos是基于网络参与者目前所持有的数字货币的数量和时间进行利益分配, 是一种对货币所有权的证明.

在以太坊中, Pos 算法可以描述如下:

  • 以太坊区块链由一组验证着决定, 任何持有以太币的用户都能发出一笔特殊的交易, 将他们的以太币锁定在一个存储中, 从而是自己成为验证者

  • 然后, 通过一个当前验证者都能参与的共识算法, 完成新区块的产生和验证过程.

验证者参与的共识算法有哪些?

  • 基于链的Pos

    该算法中在每个时间单位(比如说 10s )内伪随机地从验证者集合中选择一个验证者, 给予这个验证者创建新区块的权利, 但是该验证者要保证其所产生的块是在最长链上.

  • 基于BFT的Pos

    让每个验证者自己去提出块并给被提出的块投票, 该投票过程使用的BFT算法. 最后, 被BFT算法所确定出来的块将会被添加到区块链上.

在Pos中对“胡乱”投票的行为会给予惩罚:

  • Slasher

    如果验证者在不同的链上创建块, 则在事后会将其行为记录在区块链上, 并扣除其押金.

  • Casper

    Casper有可能做到秒级别的共识, Casper中有很多抵押了一定代币的验证者, 这些验证者对新块进行投票已决定它是否有效, 最后根据投票的结果形成大多数人的意见. 投票新块有效的用户会获得奖励, 而作恶用户将会被没收押金。

权益证明

Casper

Sharding

整体来讲,如何提高一个单链区块链的tps性能就是__并行化__和__适当中心化__。并行化得一个思路就是分片sharding, 分片主要用于加快交易验证的速度。

什么是Sharding

如今,每个运行以太坊网络的节点都必须处理通过网络传输的每一笔交易。这使得区块链因每个区块都有很多的验证而具有很高的安全性,但与此同时这意味着整个区块链的速度最多只能与其单个节点一样快,而不是这些节点的总和。目前,EVM 上的交易不是并行的,每笔交易在全局范围内都是串行执行的。

解决可扩展性问题不得不面对这样一种理念,一条区块链最多只能拥有下列 3 种属性中的 2 种:

  • 去中心化
  • 可扩展性
  • 安全性

我们如何打破这种三难的局面,才能将扩展性包含到当前的模型中呢?我们不能仅仅通过增加区块大小,或者就以太坊来说,通过增大 GAS 的使用上限来提升吞吐量吗?理论上这是正确的方法,但是我们增加得越多,区块生产就会越来越集中在使用超级计算机来运行的节点中,进而为进入系统带来更高的障碍。

更明智的方法是区块链分片的理念,我们将网络的整个状态分割成一系列被称为Sharding的分区,其中包含自己独立的状态片及交易历史记录。在这种系统中,特定的节点只为特定的分片处理交易,从而允许在所有分片中处理的交易吞吐量比在单个分片中处理所有交易。

在每个Sharding上,使用__Collator(校对器)节点__来处理和验证该分片的交易,并将相关信息打包到__Collation(校对块)。每个校对块都有一个__校验头(Collation Header),是包含以下信息的数据片:

  • 关于校对块所对应的分片信息
  • 在所有交易生效前,分片的最新状态信息
  • 所有交易生效后,分片的状态信息
  • 分片上得到 2/3 的Collator的数字签名,则确认Collation是合法

即__每个Sharding上有许多Collator处理和验证交易__。

然后,__超级节点__将把所有Sharding中的校对块放到以太坊区块链中将要添加的区块中。他们的职责是处理所有校对块中的交易,并通过汇总他们的校验头来维护所有分片的状态。

如果交易跨分片进行该怎么办?

举个例子,我把钱从分片 1 中的地址发送给分片 10 中的地址,该怎么办?这个系统最重要的部分之一就是跨分片通信的能力,否则我们没有任何创新。以下是__收据__发挥作用的地方,以及它是如何允许上述场景工作的:

Alice(在分片 1 的地址)想要给 Bob(在分片 10 上的地址)发送 100 个以太币:

  • __一笔被发送到分片 1 的交易__扣除了 Alice 余额中的 100 个以太币,系统等待交易完成
  • 一份不在状态中存储、而在默克尔树中存储的、可被轻易验证的__交易收据__随后被创建
  • 一笔包括默克尔收据作为数据的交易被发送到分片 10。分片 10 检查此收据是否还未被花费
  • 分片 10 处理此交易并在 Bob 的余额中增加 100 个以太币。随后也会保存这份从分片 1 发送过来的收据已经被花费的事实
  • 分片 10 生成了一份新的可以在随后的交易中使用的收据

单片控制攻击

一旦我们考虑在网络上可能的攻击,分片区块链的问题就变得更加显而易见了。一个主要的问题是单片控制攻击的概念,即攻击者通过控制一个单一分片上的大多数校对器来创建一个可以提交无效校对块的恶意分片。我们该如何解决这个问题?

以太坊维基的分片 FAQ 建议在每个分片上对校对器进行随机采样。这样做的目的是让这些验证者事前无法知道他们所得的是哪个分片。每个分片都会分配到大量的校对器,并且实际验证交易的校对器会从中随机选取出来。随机源需要足够普遍(Common)以确保这种采样是完全强制性(Compulsory)的,并且不能被验证者操控。

此外,进行这种随机采样的排序会有一些潜在的延迟问题,因为当验证者作为校对器被重新分配时,可能都会需要重新下载新的分片,引入大量潜在的开销。

Sharding FAQs

Sharding

相关文章


欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n 1 ) ! n N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

Γ ( z ) = 0 t z 1 e t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

猜你喜欢

转载自blog.csdn.net/XFORG1992/article/details/88606425
今日推荐