Skip to content

Commit

Permalink
fix
Browse files Browse the repository at this point in the history
  • Loading branch information
laalaguer committed Sep 5, 2019
1 parent 2b44663 commit 0a062e7
Show file tree
Hide file tree
Showing 35 changed files with 194 additions and 156 deletions.
Binary file modified _build/doctrees/ch1/highlight.doctree
Binary file not shown.
Binary file modified _build/doctrees/ch10/ethash.doctree
Binary file not shown.
Binary file modified _build/doctrees/ch3/dig.doctree
Binary file not shown.
Binary file modified _build/doctrees/ch3/interval.doctree
Binary file not shown.
Binary file modified _build/doctrees/ch3/life.doctree
Binary file not shown.
Binary file modified _build/doctrees/ch3/pow.doctree
Binary file not shown.
Binary file modified _build/doctrees/ch6/index.doctree
Binary file not shown.
Binary file modified _build/doctrees/environment.pickle
Binary file not shown.
Binary file modified _build/doctrees/index.doctree
Binary file not shown.
2 changes: 1 addition & 1 deletion _build/html/_sources/ch1/highlight.rst.txt
Expand Up @@ -45,7 +45,7 @@


作为一台全球巨型计算机,以太坊的记账出块速度决定了这台计算机的运行速度。
用户调用智能合约的所引发的状态转移随着每次合法出块而发生
用户调用智能合约所引发的状态转移随着每次合法出块而发生
目前以太坊的出块速度维持在 ``10-19`` 秒/块之间,
从前的“前哨”(Frontie) 版本维持在 ``12`` 秒/块左右。
以太坊的 EIP-1234 提案目前已经被以太坊团队所接纳,该提案将难度炸弹推迟 4200w 万秒(1.4年),
Expand Down
1 change: 1 addition & 0 deletions _build/html/_sources/ch10/ethash.rst.txt
@@ -1,4 +1,5 @@
:github_url: https://github.com/laalaguer/ethereum-compass/blob/master/ch10/ethash.rst
.. _reference-ethash-chapter:

ETHASH 挖矿算法
==============================
Expand Down
13 changes: 8 additions & 5 deletions _build/html/_sources/ch3/dig.rst.txt
Expand Up @@ -9,7 +9,7 @@

**谁是矿工?**

某些算力较强的节点出块速度较快,这些节点能够用比他人更快的速度计算出符合共识的区块,这些为社区贡献算力出块的计算机就俗称为 **矿工** 。它们打包交易进入区块,并将区块广播入网络进入区块链。成功完成上述步骤的矿工会获得相应的 **挖矿奖励**。
某些算力较强的节点出块速度较快,这些节点能够用比他人更快的速度计算出符合共识的区块,这些为社区贡献算力出块的计算机就俗称为 **矿工** 。它们打包交易,组成区块,并将区块向网络广播。成功进入区块链的区块能让矿工获得 **挖矿奖励**。

**矿工怎么收集交易?**

Expand All @@ -20,14 +20,17 @@
以太坊区块链的等待池子中的交易可以从 :guilabel:`etherscan.io` [#]_ 网站中查询 ,数据是完全公开、透明的。

.. WARNING::
但是绝大部分交易被记入区块的顺序是取决于交易费高低的。低交易费等待的时间会比较久,也可能因为交易数量太多而被暂时剔除出该池子,这个现象在交易发送方看来,就是过了数小时交易也没有被“挖掘”。在这种情况下,该交易很可能无法进入区块,更不用提进入最终的区块链。所以在发送交易的时候,我们不要设置过低的Gas交易费,以防止转账超时而影响业务。
绝大部分交易被记入区块的顺序是取决于交易费高低的。

低交易费等待的时间会比较久,也可能因为交易数量太多而被暂时剔除出该池子,这个现象在交易发送方看来,就是过了数小时交易也没有“确认”。在这种情况下,该交易很可能无法进入区块,更不用提进入最终的区块链。所以在发送交易的时候,我们不要设置过低的Gas交易费,以防止转账超时而影响业务。

**万一两个矿工都挖出了块呢?**

矿工在打包出块后,通过网络广播这个好消息,试图让自己打包的块入选最终的区块链。
其他矿工可以选择基于此基础挖掘新高度上的块,也可以不承认该块,试图自己重新计算另一份同一高度的块
其他矿工可以选择基于此基础挖掘新高度上的块,也可以自己重新计算另一份同一高度的块

如下图所示,在同一高度上,矿工竞争出块,在 :guilabel:`高度2` 上可能有两个区块被用几乎相同的时间挖掘出来,并且它们都进入了候选区,
如下图所示,在同一高度上,矿工竞争出块,在 :guilabel:`高度2` 上可能有两个区块在几乎相同的时间挖掘出来。
并且它们都进入了候选区。
此时区块链在这个高度临时面临“分叉”危机。但是最终承认哪个区块为 :guilabel:`高度2` 的块呢?

.. figure:: /img/Picture23.png
Expand All @@ -49,7 +52,7 @@

高度3区块基于某一个高度2区块挖掘,另一个高度2区块被放弃

正因为新挖掘的区块是否最终留在主链的不确定性,在实践中,虚拟货币交易所提示充值时要等待数个区块的确认时间,保证我们发出的交易被收容,处在最高的链条上
正因为新挖掘的区块是否最终留在主链的不确定性,在实践中,虚拟货币交易所提示充值时要等待数个区块的确认时间,保证我们发出的交易处在最高的链条上

在以太坊上是 ``30`` 个确认,耗时约 ``10分钟``。在比特币中 ``6`` 个确认(高度)后,我们才认为账本真实有效,耗时约 ``60 分钟``。

Expand Down
2 changes: 1 addition & 1 deletion _build/html/_sources/ch3/interval.rst.txt
Expand Up @@ -5,7 +5,7 @@

从拥有一个账户,到签署一笔交易发出去,想必读者此时心里已经开始犯嘀咕:

**那究竟常说的进入区块链(上链),打包挖矿是怎么回事呀**
**那究竟常说挖矿是怎么回事**

这部分扩展阅读将简介以太坊挖矿、共识、工作量证明方面的知识。

Expand Down
12 changes: 7 additions & 5 deletions _build/html/_sources/ch3/life.rst.txt
Expand Up @@ -14,6 +14,7 @@
一笔交易的流转过程

从最源头开始,一笔交易的流转过程如下所示。

- 客户端软件在收集完交易信息,组织成相应的结构体,需要使用用户的私钥来签名该交易。
- 交易后编码为一个公开消息,通过节点网络发出并逐渐扩散到网络中各个节点。
- 挖矿节点和众多其他普通节点同时收到该消息,矿工将其暂时缓存起来。
Expand All @@ -24,11 +25,9 @@
.. DANGER::
若该笔交易费过低,则可能被调低优先级,在矿工的交易等待池(pending transaction pool)中等待较长的时间,或者在等待时,被其他高交易费的交易挤出等待池子。

若该消息是智能合约调用,且所调用的智能合约在执行时 Gas花费过高,超过用户在结构体中指定的的Gas 上限,则会导致交易未能完整执行而失败。

然而,期间也可能因为多种原因而未能入选最终的区块链中,此时交易失败,需要重传该交易。
若所调用的智能合约在执行时\ **Gas**\ 花费过高,超过用户在交易中指定的的\ **Gas**\ 上限,则会导致交易失败。

实际世界里,在以太坊网络的拓扑结构中,普通的节点运行着不同厂家出品的节点程序,比如 Geth、Parity 等。节点之间通过“广播”的形式互相传递信息,用户的交易请求作为一种信息,在初始阶段经由某一个联网节点传递入网络中,如图所示。
实际世界里,在以太坊网络的拓扑结构中,普通的节点运行着不同厂家出品的节点程序,比如 Geth、Parity 等。节点之间通过“广播”的形式互相传递信息,用户的交易请求,在初始阶段经由某一个联网节点传递入网络中,如图所示。


.. figure:: /img/Picture20.jpg
Expand All @@ -38,8 +37,11 @@
一笔交易在以太坊网络的节点间传播过程

以太坊上最常见的交易是:

- 以太币转账
- 智能合约调用
- 智能合约创建

这三种交易在交易发送时经历的步骤是 **一模一样** 的,区别仅在于填写交易时选择传递数据 :guilabel:`data` 还是传递价值 :guilabel:`value` 。传递数据的即为合约相关操作,传递价值即为转账操作。我们将在第6章中用动手实践的方式为读者展示具体的操作方法。
这三种交易在交易发送时经历的步骤是\ **一模一样**\ 的,区别仅在于填写交易时选择传递数据 :guilabel:`data` 还是传递价值 :guilabel:`value` 。
传递数据的即为合约相关操作,传递价值即为转账操作。
我们将在 :ref:`reference-deploy-contract` 中用动手实践的方式为读者展示具体的操作方法。
57 changes: 31 additions & 26 deletions _build/html/_sources/ch3/pow.rst.txt
Expand Up @@ -26,69 +26,74 @@

#. 单一区块所包含的交易集合在执行哈希后的 ``256bits`` (32字节) 的哈希值必须是一个特殊数值,它的开头必须满足一定数量的 ``0000...`` 作为起始。
#. 区块串联形成区块链,每个链条环节(称为高度)有且仅有一个区块。
#. 一旦找到符合条件的区块,立即广播给所有节点,区块进入该高度的候选区
#. 若候选区内有区块,则新的区块可以从它基础上往后计算新区块
#. 最长的链才是最终的区块链账本,其他较短的分支链条都不被承认。
#. 一旦找到符合条件的区块,立即广播,该区块进入该高度的候选区。候选区内可以包含多个候选者
#. 可以从任一候选者基础上,往后计算新区块
#. 最高的链才是最终的区块链账本,其他较短的分支链条都不被承认,优胜劣汰

这几条规定相辅相成,解决了甄别真假消息和统一共识的难题。它通过 **牺牲巨大电力和交易速度,保障了共识与安全性。** 具体分析如下:
这几条规定相辅相成,解决了甄别真假消息和统一共识的难题。它通过\ **牺牲巨大电力和交易速度,保障了共识与安全性。** 具体分析如下:

**第 1 条规定** 即为PoW:矿工需要反复排列组合,选取合适的交易加入区块进行 **SHA-256** 哈希试算计算哈希值,直到符合开头 0 数量多寡的规定。例如比特币区块链上高度为 **#286819** 的合法区块的哈希值为:(开头有16个 0
**第 1 条规定** 即为PoW:矿工需要反复排列组合,选取合适的交易加入区块进行 **SHA-256** 哈希试算计算哈希值,直到符合开头 0 数量多寡的规定。例如比特币区块链上高度为 **#286819** 的合法区块的哈希值 (开头有16个 0):

.. centered:: 0000000000000000e067a478024addfecdc93628978aa52d91fabd4292982a50

区块链选取的散列函数也称之为哈希函数,这个函数的特性是输入任意长的字符串,该函数都能将其映射为固定长度的散列值,例如比特币选取的 SHA3-256 函数即为第三代散列函数,输出定长为 ``256`` 位(256bits)。
散列函数满足以下特性:
.. Note::

哈希函数的特性是输入任意长的字符串,该函数都能将其映射为固定长度的散列值,例如比特币选取的 SHA3-256 函数即为第三代散列函数,输出定长为 ``256`` 位(256bits)。

哈希函数满足以下特性:

#. 碰撞不易:不同的输入值,产生不同的输出值,微小的输入改动也会引起输出的巨大变化。
#. 单向性:给定输入值,可快速计算输出值;给出输出值,却无法推断输入值。
#. 穷举性:若要输出值介于某范围,没有比穷举输入更好的尝试方法。
#. 碰撞不易:不同的输入值,产生不同的输出值,微小的输入改动也会引起输出的巨大变化。
#. 单向性:给定输入值,可快速计算输出值;给出输出值,却无法推断输入值。
#. 穷举性:若要输出值介于某范围,没有比穷举输入更好的尝试方法。

在区块链的领域中,利用哈希函数对不同的输入产生的输出迥异,且无法通过规律预测的特性,无法投机取巧来猜测,只能通过耗费 CPU 算力与电力的方式反复排列输入参数来尝试。
需要计算出特定的结果,必定付出了艰巨的工作,此称为 **工作量证明** (PoW,Proof of Work)。
在区块链的领域中,利用哈希函数对不同的输入产生的输出迥异,且无法通过规律预测的特性,来保障矿工确实花费了大量资源来进行计算。矿工无法投机取巧来猜测,只能通过耗费 CPU 算力与电力的方式反复排列输入参数来尝试。
此称为 **工作量证明** (PoW,Proof of Work)。

比特币算力的中心化问题
-------------------------

比特币网络规定每个区块头的哈希值必须符合一定数量的 ``000...``,这就给找到符合条件的区块制造了难度。
但这个难度并非 **一成不变** ,输出结果的开头 0 数量的要求会随着全球全网算力而动态调整。
但这个难度并非\ **一成不变**\ ,输出结果的开头 0 数量的要求会随着全球全网算力而动态调整。
每隔 ``2016`` 个块根据全网算力提升或下降自动动态调整难度,调整周期大约为 ``2周``。
动态调整的结果是控制这个计算难度维持在 ``10分钟`` 左右出一个块
动态调整的结果是控制这个计算难度维持在 ``10`` 分钟左右出一个块

正因为有 PoW 机制的存在,区块链的 **转账是缓慢的** ,无法和支付宝等互联网支付工具实时性到账相媲美。
正因为有 PoW 机制的存在,\ **转账是缓慢的**\ ,无法和支付宝等互联网支付工具实时性到账相媲美。

两者在中心化模式和分布式模式、在效率与公开透明上是各有取舍的。

**中心化的模式** 的假设前提是“信任”。需要各个使用者相信中央节点的可靠与权威(例如相信支付宝系统的诚实可靠、权威),换来的优势就是近乎瞬间的转账效率。

**分布式系统** 的假设前提是“互不信任”。则需要在协调各节点达成共识后才能完成转账,这是需要付出昂贵的时间代价的,换来的优势就是转账账本的可靠性极高且没有中央节点作弊的嫌疑
**分布式系统** 的假设前提是“互不信任”。则需要在协调各节点达成共识后才能完成转账,这是需要付出昂贵的时间代价的,换来的优势就是账本的可靠性较高且没有中心化风险

.. figure:: /img/Picture22.png
:align: center
:width: 600 px

中心化支付系统,与去中心化支付系统的拓扑结构

比特币的共识机制被证明是单纯依赖高性能 CPU 就可提升算力的
比特币的共识机制被证明是单纯依赖高性能 CPU 就可提升算力
各个参与的玩家都在千方百计提升自己在全网算力中所占的比例,
有 ``n%`` 的算力占有率就有 ``n%`` 的概率挖到合法区块。
为了提升算力来获得更大的概率,市场中有层出不穷的高性能比特币专用 **ASIC** 芯片矿机,
它们的出现让算力集中于买得起矿机的高端玩家手中,而设备制造也被少数高端矿机生产厂商所垄断,
ASIC 矿机的出现让普通的家庭计算机一夜之间被淘汰出局,耗尽数十年也挖不到一个比特币,
违背了中本聪设计网络时的初衷:“人人参与,家庭计算机就可挖矿”。目前还没有很好的解决方案。
ASIC 矿机的出现让普通的家庭计算机一夜之间被淘汰出局,数十年也挖不到一个比特币。

这违背了中本聪设计网络时的初衷:“人人参与,家庭计算机就可挖矿”。目前还没有很好的解决方案。


以太坊的Pow/Pos机制
----------------------------------------

**以太坊在前三个阶段采用 PoW 的共识机制** ,核心是自以太坊1.0起推出的 **Ethash** 算法 [#]_ (代码赏析本书第10章)。
**以太坊在前三个阶段采用 PoW 的共识机制** ,核心是自以太坊1.0起推出的 **Ethash** 算法 [#]_ (代码赏析见 :ref:`reference-ethash-chapter`)。

为了克服比特币的算力中心化问题,Ethash算法做了诸多调整。

该算法依赖一个预先生成的大型数据集(1GB),在计算的过程中需要反复、分片地读取该数据集,这部分数据集体积远超过 **ASIC/GPU/FPGA矿机** 的内部寄存器体积,较慢的内存读写 I/O 操作时间抵消了 ASIC 矿机厂商的专用芯片集成化带来的计算时间优势,具体的算法规则如下。
该算法依赖一个预先生成的大型数据集(1GB),在计算的过程中需要反复、分片地读取该数据集,这部分数据集体积远超过\ **ASIC/GPU/FPGA矿机**\ 的内部寄存器体积,
较慢的内存读写 I/O 操作时间抵消了 ASIC 矿机厂商的专用芯片集成化带来的计算时间优势,具体的算法规则如下。

- 每一个区块通过区块头计算一个 **种子** ,该种子仅与本区块有关。
- 基于种子生成一份16MB 的伪随机 **缓存**。
- 基于缓存生成一份大型数据集,称为 **DAG** (有向无环图),体积 1 GB。DAG的数据可由伪随机缓存快速地推导出来,而且 DAG 的数据分块,每块都和对应的缓存块有关。
- 每一个区块通过区块头计算一个\ **种子**\ ,该种子仅与本区块有关。
- 基于种子生成一份16MB 的伪随机\ **缓存**\
- 基于缓存生成一份大型数据集,称为\ **DAG**\ (有向无环图),体积 1 GB。DAG的数据可由伪随机缓存快速地推导出来,而且 DAG 的数据分块,每块都和对应的缓存块有关。
- 矿工挖矿的过程是不断地从 DAG 中取出数据作为输入值,再配合反复更改 nonce 试探,达到满足一定难度的输出值的运算。
- 校验者仅需在得到输出值后,经由缓存推断出对应的DAG数据,代入计算验证输出值,轻客户端也能快速执行该任务。
- 和比特币一样,Ethash 是一个”挖矿难,检测易”的算法。
Expand All @@ -100,12 +105,12 @@ ASIC 矿机的出现让普通的家庭计算机一夜之间被淘汰出局,耗

在 **第四阶段的以太坊经济模型采用PoS机制** ,PoS全称 Proof of Stake,任何持有以太币的参与者都可以发起特殊交易,将自己的币锁定在一个存储中,让自己获得打包交易的资格,然后通过一个当前验证着都能参与的共识算法,完成新区块的打包和广播。PoS 算法的特点如下。

- 不需要耗费大量电力资源来“苦劳”,挖块奖励可以减少,理论上发行总量可以被控制。
- 不需要耗费大量电力资源来“挖矿”。理论上发行总量可以被控制。
- 不需要购买昂贵设备,持有以太币即可参与挖矿。
- 出块速度更快,不受制于PoW挖矿带来的时间延迟。
- 减少挖矿工具中心化带来的风险。

预计当第四阶段启动时,众多以太坊爱好者已经进入以太坊世界并持有了以太币,他们可以根据自己持币数量和轮转规则,竞争上岗,打包区块数据进行挖矿。目前已经有了代号 **Casper** 的测试网络可以运行、试用该共识机制。Casper网上的共识算法有惩戒措施,出块人取得资格需要质押一定数量的以太币,大家根据共识对新产出的块进行投票来判定该块是否有效,经过大部分人认可后,该块就能合法有效,但若在该过程中有少数人“作恶”被揪出,这些人就会被罚没所抵押的以太币以示惩戒。
预计当第四阶段启动时,众多以太坊爱好者已经进入以太坊世界并持有了以太币,他们可以根据自己持币数量和挖矿规则,竞争上岗,打包区块数据进行挖矿。目前已经有了代号 **Casper** 的测试网络可以运行、试用该共识机制。Casper 网上的共识算法有惩戒措施,出块人取得资格需要质押一定数量的以太币,大家根据共识对新产出的块进行投票来判定该块是否有效,经过大部分人认可后,该块就能合法有效,但若在该过程中有少数人“作恶”被揪出,这些人就会被罚没所抵押的以太币以示惩戒。


.. [#] Ethereum Community Authors (2018) ‘Ethash’, The Ethereum Wiki, Available at: https://github.com/ethereum/wiki/wiki/Ethash
1 change: 1 addition & 0 deletions _build/html/_sources/ch6/index.rst.txt
@@ -1,4 +1,5 @@
:github_url: https://github.com/laalaguer/ethereum-compass/blob/master/ch6/index.rst
.. _reference-deploy-contract:

第 6 章 手把手教你部署智能合约
===============================
Expand Down

0 comments on commit 0a062e7

Please sign in to comment.