区块链技术概观(四):以太币运作模式拆解

时间:2019-07-27       来源:

在之前数篇文章中我们看到数位货币的元祖 Bitcoin 是如何从无到有定义了数位货币系统,现在也来看看其他货币是如何基于其上做了些改进,之后我们才能知道区块链适合在什幺场景使用。今天要来看的就是号称有美国五大企业支持,最近非常红的以太币(Ethereum)。

以太币身为区块链数位货币的一员,运作当然和比特币有相当类似性,包括利用 Hash 来链住每个区块、利用 PoW 保护资料、共识型决议协定、同样有一个快速的 P2P 网等。但以太币身为后进者,希望直接在链上达成智慧合约的目标,所以以太币的实做难度其实更高,如果运作无误,以太链也的确可提供更多方便的交易功能。

Ethereum 社群一直以来都很敢冲,套句中国一位挖矿名人对笔者讲的话:这群人真是无法无天,什幺都敢做!因此早期出现过一次相当失败的分裂(Hard fork),差点让它一蹶不振。现在我们看到的以太币分成两个,一个叫 Ethereum,另一个叫 Ethereum Classic ,基本上就是那次分裂的结果。目前 Ethereum 的价格仍然高过 Ethereum Classic(维持早期协议法的链系统),因此分裂事件还算有收尾。不过我们也可以看见一个大原则:愈多功能的东西愈难维持高安全性!甚至有人已公开宣称以太币将成为骇客天堂。

Ethash

目前以太币系统仍使用 PoW 技术来保护区块链,既然如此,就必须有一套 Hash 技术来确保区块验证码要花掉大量计算力才能找到。Ethash 就是以太币的 hash 技术,Ethash 鲜少人直接讲,因为它非常複杂,笔者在此先针对几个特性来讲:

    是基于 SHA3 的变形,对计算力的要求并不高,过程中尤其没用到什幺浮点运算。用了非常多层查表法,也就是 STRICT MEMORY HARD HASHING FUNCTIONS 做法,所以非常吃记忆体,无论是记忆体频宽、记忆体容量、读写的反应时间都非常重要。之所以如此做,在于许多新数位货币的开发团队看到当年 Bitcoin 只要靠一台挖矿机就抵过万颗 CPU 的可怕情况,因此希望设计出一套演算法可让 ASIC 无法得到大幅加速。至于用 ASIC 可加速到底带来什幺坏处?我们以后有机会再来讲。

由于 Ethash 的查表法极端複杂,所以过程基本就是不断产生新表,再去查表,做完得到结果再记下来,再查表,再相减看看能不能小于特定範围,所以 ASIC 基本上无法利用「改善运算线路架构」这种单纯的方法来加速运算。当然,利用改善记忆体控制器或根本利用超高频宽的记忆体(好比最暴力的 SRAM)的确可以得到一定效果,但恐怕无法像过去那样增加运算单元,塞个 1 千万个电晶体就把 CPU 和 GPU 活活打死。我们先做个小计算,如果今天真有人要搞多读写口的 SRAM 来增加效能,大概準备个 4GB 到 8GB 的 SRAM,且要能容许多个处理器以 64byte 的小区块读写。撇开控制器的複杂度不谈,光是电晶体数量,就会和在 CPU 内部塞进 48GB Cache 的难度一样,得到的加速大概只有使用 DRAM 的数倍而不是数千倍。

计算流程

使用目前的区块头为种子数,利用这个种子数产生一个高达 16MB 的假乱数表(Pseudo Random number),为什幺叫它假乱数呢?因为是由一个种子数套用一套数学规则产生出来看起来很像乱数的表。但是不保证中间的乱法没有规则可循,故称为假乱数表。

利用这个假乱数表为快取,产生高达 1GB 以上的 DAG 表,使用的演算法基本上是改良版 Dagger-Hashimoto 演算法。DAG 的全名是 Direct Acyclic Graph,基本上有点像资料迷官,但不会有回头路径,就像玩一种游戏,开头时选择一个入口,遇到分岔就转弯,看最后会进入哪个结果。

▲ Direct Acyclic Graph 示意图。

这个 DAG File 每 3 万个区块(大约 100 小时)只产生一次,每次都会比之前的再长大一些,所以这表的查询难度就已经随着时间增加了。验算时,我们可以由快取的乱数表只产生出我们要用到的某几项,所以验算时可以不用把整张 DAG 表全部产生出来。目前产生 DAG File 大都是矿场主人的工作,矿工只要下载就好了。

挖矿时,代入 NONCE 后使用 SHA3 类型的方式不断查表求出 MIX 值,然后两两相减看能否找到小于规定大小的最终数值,若是可以,就算找到该块的解。由于系统等于是随机在 DAG 中读取一小块资料,所以对记忆体的效能要求至高,且这件事恐怕也不是利用小小的快取记忆体可以搞定,因为随机小区块读取通常会让快取的失误率拉得很高,反而可能变慢。以太币的 NONCE 长度已经固定在栏位中,不像比特币是浮动的,长达 64 位元。目前高档 GPU 为挖矿主力,因为效能最好,一般使用 N 牌 1070 通常可以达到近 29M Hash/秒的速度,不像比特币用 SHA1 型的杂凑函数,可以每秒几 G 在跑。也因此 NONCE 的长度 64bit 是足够的。

以太的区块格式

接下来仍然稍微花点心思看一下以太币的区块格式。了解了比特币的区块格式后,现在来看以太币应该会发现其实大同小异,有 87% 那幺像,只是以太币的区块有比较多功能且有支链能力,所以会多一些栏位。以太币同样使用 hash 值为区块代表,同样有随时可调整的难度,以及挖到矿的人是谁等等。但其中有一个比较特别的栏位是 GAS Liimit,也就是瓦斯。为什幺会设置瓦斯呢?为什幺不乾脆叫 gasoline(油水)呢?呃,这问题多了,基本上瓦斯值代表以太网路目前处理交易的能力,当挖矿者的处理能力愈大,或参与的人愈多,使计算力增加,GAS 值就会跟着增加。目前以太币所有交易动作都视为智慧合约执行,而执行智慧合约就需要计算力,当网路 GAS 用完就代表这个网路满了,无法再进行任何交易,否则会有执行错误的风险。

Block Number:4167982(a few seconds ago)Next

Hash:

0x3b0780cc9c2d7d481db3a64089ba4d81fe4e3ac366ff067b079066ae72153072

Difficulty:

1,728,563,025,185,747

Difficulty Bomb factor:

549,755,813,888 (0.032 %)

Miner:

ethermine

Gas Limit:

6,718,978

Gas Usage:

15.3% (1,029,488 of 6,718,978)

Minimum gas price:

4 GWei

Time:

2017-08-17 07:43:41 (a few seconds ago)

Uncle Hash:

0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347

Root:

0x5827b79c10f4c801131c645ebf6a2787bef2e5aadb7bcfce9e50d014f97dbc3b

Tx Hash:

0x325c85c3e9152e797a27c8b8872233c2a26886533d98b533ef715f0c8fdc9578

Size:

5779 bytes

Extra:

ethermine-eu1 (Raw: 0x65746865726d696e652d657531)

Nonce:

0x88b5245d90031a5f36

Reward:

5.013354348262915 Ether ($1,512.08)Transactions

Hash

From

To

Amount

Fee

0x00ec132f…0x59F68158eD1cc…0x089BACeeD3fFf…714.9785635654157 Ether ($215,644.68)0.000483586950861 Ether ($0.15)0x04070b92…0x544895d4aA1a4…0xde2b2C0702cEb…714.4275209323019 Ether ($215,478.48)0.000483586950861 Ether ($0.15)0x08e2dcdc…0x7B9Bc474667Db…0x011EfCeE2586e…0.00323616 Ether ($0.98)0.00021 Ether ($0.06)0x0ab02217…nanopool0x2969C6C6db419…0.2007292783757419 Ether ($60.54)0.000084 Ether ($0.03)0x0d9650d0…0x7B9Bc474667Db…0x5b7d130bFA1dB…0.00323616 Ether ($0.98)0.00021 Ether ($0.06)0x14131218…nanopool0xF4b628fd2137B…0.20558935288108643 Ether ($62.01)0.000084 Ether ($0.03)0x167ba1d3…nanopool0x9a7e9033bebe2…0.07793215496396376 Ether ($23.51)0.000084 Ether ($0.03)0x19acd3ef…nanopool0x331077Cd09209…0.21053147571349606 Ether ($63.50)0.000084 Ether ($0.03)0x263f485b…nanopool0x8184fD65b9A69…0.20702381089474336 Ether ($62.44)0.000084 Ether ($0.03)以太币的产生与使用

目前以太币的产生与比特币仍然 87% 像,也就是找到解的矿池或矿工自己分了!每次主链上找到一个解,就产生 5 个新以太币,而支链(Uncle Blocks)找到的解就得到 4.375 个以太币。就一般而言以太币的使用也没什幺特别之处,与比特币一样都是转帐而已,但以太币支援智慧合约,因此它的电子钱包就多了发送合约的功能,这点对于不会程式的人就是一大难题了,之后我们再来看什幺是智慧合约。

以太币本来预期是每 15 秒产生一个区块,但是最近两个月挖矿能力大增,许多人加入挖矿行列,因此网路总算力由 50G Hash/秒快速涨至 100G Hash/秒,开发社群就有人又开始动歪脑筋了。大部分数位货币升级都是为了技术提升,不过这次倒是为了让新货币产生速度慢下来的所谓经济面做法,因此很可能短期内产生区块的时间会由 15 秒拉长成 45 秒。未来更有可能直接走上废除 PoW 改採 PoS 的路,这对以太币的发展和未来价值影响都很大,就好好看着这个很敢玩的社群最终会如何收场。

GHOST 演算法

以太币的系统最重要的就是共识型协议 GHOST(Greedy Heaviest Observed Subtree),笔者有时真怀疑这些发明人是不是《攻壳机动队》的粉丝……

以太币的区块产生速度非常快,这代表交易速度也非常快,基本上开始之初是 12 秒产出一个区块,因此网路不同步的情况一定常常发生,所以它允许网路上有良性分支,叫做 Uncle chain,Uncle blocks 产生的因必然是合法交易在短时间内无法传遍整个网路,所以有些人现在收不到,但通常一至五个区块后都会收到,所以通常五、六个区块后大家整併一下,就会发现原来过去五、六个区块虽然每个区块内容都不同,但整併起来看后会一模一样,如果发生这种情况,Uncle block 就会整併回来,所以计算 Uncle chain 的人也会有奖励金。以太坊使用 Uncle 的意思很明显,就是虽然它不是目前主链的区块,但承认合法性,就好像你叔叔虽然不是你父母,但血统上他仍然是祖父母血缘传下来的,也算一家人。

所以原则上来说,系统同时看得到二条以上的支线,但通常会快速收敛回来不会一路分支出无限多条链。GHOST 目前可让一个同号码的区块同时存在两个 Uncle block,每个 Uncle chain 最长只到六个区块。Uncle 的产生情况通常都是两个挖矿机在接近同时间同时对全网广播说:我找到区块解了!结果大家一检查发现,两个区块竟然不一样!但偏偏两个区块的交易都通过合法性检验!这时就会自动记入 Uncle block。

目前有许多专家对 Uncle 的存在表示担心,因为认为 PoW 的设计在这种高速交易的系统已带来安全性问题,因为在不同步的情况下很有可能某人的钱只有 1 元,但那个 1 元发送了三、四次,会造成错帐。但是也有其他专家认为只要做好 Uncle block 的合法性检查,其实 Uncle 的存在反而让骇客更难欺骗系统。笔者也认为只要每个区块产生时,系统都紧盯所有 Uncle blocks,反而更容易得到全局视野。事实证明以太币发生过的重大安全问题,反而是在智慧合约而不是单纯的帐务链。试图改善帐务链而没有考量好智慧合约执行问题,反而会製造出更大危机。

(首图来源:shutterstock)

延伸阅读:区块链技术概观(一):让我们从历史文本说起区块链技术概观(二):资料分割与密码学区块链技术概观(三):多数决的运作结构