买币
行情
币币
合约
金融
活动
更多
新用户专区
登录

CoinEx研究院|你不能不知道的 ETH 基础概念

2021-05-06 01:33:19


本文将从什么是区块、什么是交易、智能合约是怎么一回事、ERC20 转账的本质以及 ETH 与 ERC20 转账的区别几个角度系统地介绍 ETH。

 

1. 什么是区块 

首先来讨论下什么是区块。相信大家对于区块还是有一定了解的,区块链嘛,就是一个一个区块像一条链子一样连接起来。

 

那么 ETH 的区块是由什么组成的呢 

这边列举了我们作为一个 ETH 的使用者,应该知道的一些 ETH 区块的组成部分。像是这个区块的所在高度、唯一的 Hash 值、父区块的 Hash 值、区块出块那一瞬间的时间戳、挖出这个区块的矿工地址、这个区块的区块大小、一共消耗了多少的 Gas 等等,这些概念都很简单,看他们的名字就能知道是什么意思,这里就不多赘述了。 

接下来将着重介绍以下挖矿收益与叔块地址的概念


1.1 关于挖矿收益

首先是挖矿收益,各个矿工们不停地耗费大量电费去计算下一个区块就是为了得到每个区块出块时的奖励,这些都是货真价实的 ETH,矿工们再通过出售挖出来的 ETH 获利。 

这里每个区块出块时的奖励主要由三部分组成,分别是出块奖励、手续费收益以及叔块奖励。

 

 1.2 出块奖励

出块奖励就是每产生一个新的区块时,挖出这个区块的矿工所能获得奖励(爆块奖励)。这个收益具体多少是写在共识里的,修改这个固定收益需要硬分叉升级。

截止到目前为止,这个固定收益已经变化了三次,首先是代号“边疆”的初始 ETH 主网版本,从 0 高度开始,每块的出块奖励为 5ETH。

到了第四百三十七万块的高度时,随着代号“拜占庭”的硬分叉升级,每块的出块奖励从 5ETH 降低到了 3ETH。 

最近一次变化是第七百二十八万块高度的“君士坦丁堡”硬分叉升级,每块的出块奖励从 3ETH 降低到了 2ETH。截止到目前为止,每块的出块奖励一直都是 2ETH。 

其次,还有手续费收益。这一部分的定义就简单多了,就是这个区块内所有交易手续费的总和。 

 

1.3 叔块奖励

最后一部分就是叔块奖励,这里需要了解的就是,每个区块最多可以包含两个叔块,当然也可以一个都不包含。

并且每包含一个叔块,就可以获得 1/32 的出块奖励,以现在每个区块的出块奖励为 2ETH 为例,那么每包含一个叔块,就可以得到 2 的 1/32,也就是 0.0625 个 ETH。如果包含两个叔块的话,就是 0.125 个 ETH。

 

1.4 叔块地址

介绍完挖矿收益,我们来了解一下刚才提到的叔块概念。这里放了一张图,能够比较清晰的帮助大家理解叔块的概念。

ETH 目前是 PoW 的挖矿模式,就有可能发生在极短时间内两个矿工同时得到新区块的情况,这时其中的一个新区块将因为慢了一点点,或者节点连接不好没有及时广播出去而作废。

在 BTC 网络中,这个作废的新区块被称为孤块,BTC 中的孤块是没有收益的。而 ETH 的出块速度要比 BTC 高很多,也就是发生孤块的概率要高很多,为了避免矿工过多的发生辛苦挖出的区块变成孤块而没有收益的情况发生,ETH 引入了叔块的概念。

如图所示,在 1 高度的区块之后产生了两个 2 高度的区块,其中绿色的区块成为了真正的 2 高度区块,而黄色的区块将面临被抛弃的危险。这时,后面的 3 高度区块就将这个黄色的区块包含为自己的叔块。叔块这个名字也非常的形象,叔叔就是自己父亲的兄弟。3 高度区块将因为包含了一个叔块而获得额外的叔块奖励。

同时这个叔块的矿工地址也将收到奖励,具体的奖励数额与出块高度和叔块高度有关,公式是叔块高度加 8(这个字符是 8 不是日),减去出块高度,再乘上每块的出块奖励,最后除以 8。以刚才那个图展示的情况为例,叔块高度为 2,出块高度为 3,也就是 2 加 8 减 3 再乘以 2,最后除以 8,得到 1.75 个 ETH。通过这个公式可以看出,叔块最多只能是上述 8 个高度以内的区块。


2. 什么是交易

 

了解完区块,接着来认识一下交易。交易就是区块链这个去中心化账本中具体的一条条记录。 

它主要由这笔交易的 Hash、所在的区块高度、时间戳、From 和 To 地址以及这笔交易涉及的 ETH 金额组成,其次还有 Input、Nonce 以及交易手续费等属性。

前三个 Hash、高度与时间戳比较好理解,看名字就能知道是什么意思。因此接下来着重介绍一下后面的几个概念。


2.1 From、To 地址以及 ETH 金额

作为一个去中心化的账本,转账是最基本的功能,我们可以把每一笔交易当成是一笔 ETH 的转账,而一笔转账就是由发送方、接收方以及转账金额组成,这里对应的就是 From、To 地址以及 ETH 金额。

From 地址就是主动发出这笔交易的地址,To 地址可以是一个普通的用户地址,也可以是一个合约地址,如果是普通用户地址时这笔交易就是一个简单的 ETH 转账,如果是一个合约地址,那就是相对复杂一点的合约调用,最后的 ETH 金额,就是这笔 ETH 转账涉及到的转账金额。

作为一个支持智能合约的公链,ETH 可以在发送交易时额外填入 Input 数据,这里的 Input 数据就是调用合约时的调用参数。当然如果这是一笔普通的 ETH 转账交易,那么 Input 空着就好了。理论上这里的 Input 的内容可以随便填,只要前面的一部分数据能正确的调用合约即可。 

在开发 项目时有一个邀请返佣的功能,为了最大程度的降低用户的感知,通过在发送 Swap、下单等交易时,在正确的 Input 内容最后,添加用户的邀请码的方式来实现了这个功能。

下面来介绍Nonce,所谓 Nonce 就是 From 地址的交易顺序,本质上就是这个 From 地址发送的已打包的交易总数。同一个 From 地址的交易必须按照 Nonce 的顺序打包。

这里就产生了一个问题,如果前面的 Nonce 没有被打包的的话,后面的 Nonce 将永远不会被打包。因为这个用户前面发送的交易的手续费给的太低了,导致这笔交易迟迟没有被打包,而用户还不断的发送新的交易,然后用户就会感到疑惑,为什么我发的交易手续费给这么高还是打包不了。原因就在这里,用户前面的交易手续费太低了,阻塞了后面所有的交易。这时应该将前面阻塞的交易加速或者取消掉,后面被阻塞的交易就会依次被打包。

这里提到的交易加速和取消的功能也是通过 Nonce 来实现的,在一笔交易没有被打包前,其中的 Nonce 可以重复发送,只要新发送的交易的 Gas Price 比原来的高就可以将原来的交易覆盖掉,通常新交易的 Gas Price 要比原来的高 10%以上,具体要求高多少是由节点配置决定的。

 

2.2 如何计算交易手续费

在阐述如何计算交易手续费之前,先来介绍几个基本概念。

首先是 Gas,Gas是 EVM 在执行指令时所需要消耗的资源。Gas Limit 和 Gas Used 则分别表示用户在发送这笔交易时,预计需要消耗的 Gas 数量,以及这笔交易在执行时实际消耗的 Gas 数量,当一笔交易还没执行完就把 Gas Limit 消耗完时,这笔交易将会失败。最后是 Gas Price,表示这个用户愿意以多少 ETH 的价格,来购买 1 个单位的 Gas。

了解完这些基本概念,就能得出每笔交易的手续费是怎么来的了,计算方式也很简单,就是 Gas Used 乘以 Gas Price。

举个例子,一笔 ETH 转账需要消耗 21000Gas,而用户愿意出 120 的价格,这里 120 的单位是 Gwei,1 个 Gwei 是 10 的-9 次方个 ETH,那么完成这笔 ETH 转账交易用户就需要支付 21000 乘以 120 再除以 10 的- 9 次方,也就是 0.00252 个 ETH。

需要特别说明的是,越复杂的合约调用所需要消耗的 Gas 就越高,而矿工们将优先打包手续费更高的交易。


3. 智能合约是什么回事

 

 3.1 以太坊虚拟机

介绍智能合约之前,需要先了解一下 EVM,即以太坊虚拟机,我们知道 ETH 是一条区块链,这是一个去中心化的项目,那么可以把 EVM 理解成是运行在 ETH 这个去中心化项目中的一台超级计算机,负责向用户收取 Gas,然后执行区块上存储的代码。

这里提到的区块上存储的代码,就是智能合约。

ETH可以实现各种各样的逻辑。例如CoinEx去年投资的OneSwap就是基于ETH实现的一个去中心化交易所。在计算机的世界,想要实现各种各样的逻辑,就需要编写出各种各样的代码,而这里的代码,就是智能合约。


3.2 智能合约 

智能合约是存储在区块上的,而智能合约的地址就相当于是这段存储在区块上的代码的调用入口,通过合约地址,就能方便的通过交易调用想调用的智能合约来实现预期的功能。 

这里拿手机做个类比,BTC网络就相当于是一台功能机,从最初的设计上来看只能实现转账这样的特定功能,而ETH网络就相当于是一台智能手机,可以通过不同的智能合约实现各种各样的功能,而这里的智能合约就相当于是ETH这台智能手机上的一个个APP。


3.3 ERC20转账的本质 

我们知道,一个 ERC20 Token 其实就是一个智能合约,而 ERC20 就是指这一类智能合约的通用规范。那么我们现在通过智能合约的角度来认识一下 ERC20 转账的本质是什么。

刚才说了,智能合约本质上就是存储在区块上的代码,那么我们先来看下 ERC20 合约的代码,这里只截取了其中转账部分的逻辑,代码非常简单,相信各位非技术朋友也能理解。 

首先我们看到第二行,这里定义了一个 Event,中文名称为事件,它的作用就是用来告知用户这段代码发生了什么事情。这里定义的是一个 Transfer 事件,顾名思义,它表示了一个转账行为的发生。这个 Transfer 事件有三个参数,分别用来告知用户这个转账行为的发送方地址、接收方地址以及转账的金额。 

再往下就是 ERC20 合约转账这个功能的完整实现了。这个转账函数只有接收方地址和转账金额两个参数而没有发送方地址,是因为发送方地址不需要特别声明,这个转账函数的调用者就是发送方地址,也就是代码中的 msg.sender。

首先这个函数会判断一下这个发送方的余额够不够,并且要求转账金额不能是一个负数,必须是一个大于 0 的数,否则就返回 False 表示这笔转账失败了。 

判断条件通过后就正式开始转账逻辑了,逻辑非常简单,首先把发送方的余额减去转账金额,然后在给接收方的余额加上转账金额就完成了。ERC20 转账本质上就这么简单,发送方的余额减去转账金额、接收方的余额加上转账金额。然后再将这个转账事件发送出来,最后返回 True 表示转账成功就可以了。 

我们来看一下 ERC20 合约的转账功能怎么调用的,还记得刚才介绍交易的时候有提到,如果这笔交易是一笔合约调用的话,那么交易的 To 地址就是被调用的合约地址。还有交易里面有一个 Input 属性,是调用合约时的调用参数。

上面的这个图就是一个 ERC20 转账功能的调用参数,它可以分成三个部分,我这里用红色线段隔出来了。最前面的一小段字符表示转账这个函数的摘要,一个智能合约可能有多个函数,而每个函数的摘要都是不同的,因此通过这个摘要就能指定合约中的不同函数。后面这一长串表示一个地址,就是转账这个函数的第一个参数——接收方地址。最后的这个长串表示一个数字,就是转账的金额。

而下面的这个图是浏览器根据上面的 Input 原始数据解析出来的,帮助用户清楚的看到个这笔交易调用了什么函数,每个参数又是什么。

这笔 ERC20 转账的交易被成功打包后,就可以在交易详情中查询到这样一个 Transfer 事件,通过这个 Transfer 事件,我们可以看到尾号 619 这个地址给尾号 9b0 这个地址转了这么多币,这里显示的数字还需要除以 Token 的精度才是真实的转账金额。这个 Token 是 ONES,精度是 18 位,因此这个数字表示 7200 个 ONES。  

最后我们就能通过这个 Transfer 事件解析出最终的 ERC20 转账记录,即一个尾号 619 的地址,给一个尾号 9b0 的地址转了 7200 个 ONES。

以上就是从智能合约的角度分析的一笔 ERC20 转账的本质。

 

4. ETH与ERC20转账的区别

 

我们最后来总结一下 ETH 转账和 ERC20 转账的区别。 

我们前面提到了,每笔交易天然就是一笔 ETH 转账,即使是一个合约调用,也能理解成是一笔 ETH 转账,只不过接收方地址不是普通的用户地址,而是一个智能合约地址,并且转账金额有可能是 0。 

除此之外,还有一种被称为内部交易的情况也可能是一笔 ETH 转账,例如一个智能合约在执行的时候发生了一个 ETH 转账行为,就是通过一个内部交易体现的。 

而 ERC20 转账就简单多了,它本质上就是一个 ERC20 合约的一个名为 Transfer 的事件。

ETH,你学会了么? 

上一篇
永无交割日的金融衍生品,一文读懂CoinEx永续合约
下一篇
CoinEx研究院:区块链游戏平台XAYA研究报告