概念
以太坊是一个可编程区块链,那么允许用户创建属于他们自己的复杂的操作,且作为一个去中介化的平台,提供不同的区块链应用服务。
区块链去中介化的系统,验证区块是否有效是最为关键的一个环节。这里会有一个“状态”的概念,状态的改变来记录区块的一种现状,状态不以编码的方式写进区块链中,而是去中介化系统中,每个节点来验证后的一种抽象的表现,这个表现从创世区块开始,一个个串联的区块进行安全的验证计算,保证每一次交易的正常。
从区块链鼻祖比特币来看,比特币中通过以下的模式来检查区块的正常:
检查上一个区块是否存在且是有效的
检查时间戳是否大于上一个区块,且在2个小时之内
检查工作量证明
检查最后的区块的状态
检查区块内的交易
那么以太坊能做的不单单只是交易,允许用户创建复杂操作,核心为以太坊虚拟机(EVM),实现图灵完备,开发者使用编程语言来创建应用,且通过P2P的网络模式,全网节点进行确保一致性的计算,去中介化的强容错,也实现了永不宕机(只要有节点运行)。
效率问题:应该很多人听过把以太坊比作是一台“世界计算机”,那么其实全网进行大规模的并行计算,并没有提高运算效率,为了保证全网络中节点状态的一致性,效率和成本和之前的计算机还是有差距的。
账户、交易、消息
以太坊有两种类型的账户:
外部账户 外部账户没有代码,可以通过创建和签名一笔交易从一个外部账户发送消息。简称EOA,私钥控制。
合约账户 与外部拥有的账户不同,合约账户不能自行发起新的交易,合约帐户只能触发交易以响应其他交易。每当合约账户收到一条消息,合约内部的代码就会被激活,允许它对内部存储进行读取和写入,和发送其它消息或者创建合约。
通俗点理解,用户通过私钥掌握外部账户,那么合约账户由合约代码来控制,用户通过外部账户可通过代码来控制合约账户,实现智能合约。通过把代码部署到区块链中创建一个新合约,也就是外部账户创建了一个新的合约账户。
外部账户与合约账户的比较:
一个外部拥有账户可以通过创建和用自己的私钥来对交易进行签名,来发送消息给另一个外部拥有账户或合约账户。
在两个外部拥有账户之间传送的消息只是一个简单的价值转移。
从外部拥有账户到合约账户的消息会激活合约账户的代码,允许它执行各种动作。
不像外部拥有账户,合约账户不可以自己发起一个交易。相反,合约账户只有在接收到一个交易之后(从一个外部拥有账户或另一个合约账户接),为了响应此交易而触发一个交易。
因此,在以太坊上任何的动作,总是被外部控制账户触发的交易所发动的。
账户状态
以太坊的账户包含四个部分:
nonce:用于确定每笔交易只能被处理一次的随机数。如果账户是一个外部拥有账户,nonce代表从此账户地址发送的交易序号;如果账户是一个合约账户,nonce代表此账户创建的合约序号
balance:账户目前的以太币余额
storageRoot:Merkle树的根节点Hash值。Merkle 树会将此账户存储内容的Hash值进行编码,默认是空值
codeHash:此账户EVM代码的hash值,对于合约账户,就是被Hash的代码并作为codeHash保存;对于外部拥有账户,codeHash域是一个空字符串的Hash值
交易
以太坊的交易最直观解释:从外部账户发送到区块链上的另一个账户的消息和签名的数据包。
包含如下内容:
发送者的签名
接收的地址
转移的数字货币数量等内容
以太坊上的交易都是需要支付费用,和比特币以比特币来支付一定的交易费用不同,以太坊上固定了这个环节,那么这个间接理解是以太坊的一种安全防范错误,防止了大量的无意义的交易,保证一定的安全性,特别是智能合约的创建、执行、调用都需要消耗费用,那么也保证了整个系统的稳定性,防止了一些链上无意义的恶意行为。
交易手续费
以太坊的核心是EVM,以太坊虚拟机,那么在EVM中执行的字节码都是要支付费用。也就是经常看到的Gas、Gas limit、Gas Price这几个概念。
Gas:字面理解就是汽油,以太坊和日常的汽车一样需要Gas才能运行。Gas是一笔交易过程中计算消耗的基本单位。有一个列表可以直观看到在以太坊中操作的Gas消耗量:
操作Gas消耗具体内容
step1执行周期的默认费用。
stop0终止操作是免费的。
suicide0智能合约账户的内部数据存储空间,当合约账户调用suicide()方法时,该值将被置为null。
sha320加解密
sload20在固定的存储器中去获取
sstore100输入到固定的存储器中
balance20账户余额
create100创建合约
call20初始化一个只读调用
memory1扩充内存额外支付的费用
txdata5交易过程中数据或者编码的每一个字节的消耗
transaction500交易费用
contract creation53000homestead中目前从21000调整到53000
所以有些公司或者个人觉得区块链技术去中介化,不需要中心服务器,这种开发模式是比较便宜的,但是事实上区块链的开发不比之前的那些传统软件开发来的便宜。
Gas Price:字面理解汽油价格,这个就像你去加油站,95#汽油今天是什么价格。一个Gas Price就是单价,那么你的交易费用=Gas*Gas Price,然后以以太币来ether来支出。当然你觉得我不想支付费用,你可以设置Gas Price为0,但是选择权在矿工手中,矿工有权选择收纳交易和收取费用,那么最简单的想想很难让一个矿工去接收一个价格很低的交易吧。另外提一句,以太坊默认的Gas Price是1wei。
Gas Limit:字面理解就是Gas的限制,限制是必要的,没有限制就没有约束。这个Gas Limit是有两个意思的。首先针对单个交易,那么这个表示交易的发起者他愿意支付最多是多少Gas,这个交易发起者在发起交易的时候需要设置好。还有一个是针对区块的Gas Limit,一个单独的区块也有Gas的限制。
假设几个场景来说明Gas的使用:
用户设置Gas Limit,那么在交易过程中,如果你的实际消耗的Gas used < Gas Limit,那么矿工只会收取你实际消耗的Gas used。在交易结束后返回 Gas Limit-Gas Used。
用户设置Gas Limit,那么交易过程中,如果你的实际消耗的Gas used > Gas Limit,那么矿工肯定发现你的Gas不足,这个交易就无法执行完成,这个之后会回滚到执行之前的状态,这个时候矿工会收取Gas Price*Gas Limit。
区块的Gas Limit,区块中有一个Gas上限,收纳的交易会出现不同的用户指定的Gas Limit。那么矿工就会根据区块限制的Gas Limit来选择,“合理”选择打包交易。
具体交易
以太坊上交易可以是简单的以太币的转移,同时也可以是智能合约的代码消息。列个表格看下交易的具体内容:
代码内容
from交易发起者的地址、不能为空,源头都没有不合理。
to交易接收者的地址(这个可以为空,空的时候就表示是一个合约的创建)
value转移的以太币数量
data数据字段。这个字段存在的时候表示的是,交易是一个创建或者是一个调用智能合约的交易
Gas Limit字面理解就是Gas的限制,限制是必要的,没有限制就没有约束。这个Gas Limit是有两个意思的。首先针对单个交易,那么这个表示交易的发起者他愿意支付最多是多少Gas,这个交易发起者在发起交易的时候需要设置好。还有一个是针对区块的Gas Limit,一个单独的区块也有Gas的限制。
Gas Price一个Gas Price就是单价,那么你的交易费用=Gas*Gas Price,然后以以太币来ether来支出。以太坊默认的Gas Price是1wei。
nonce用于区别用户发出交易的标识。
hash交易ID,是由上述的信息生成的一个hash值
r、s、v交易签名的三部分,交易发起者的私钥对hash签名生成。
交易分三种类型
转账:简单明了的以太坊上的以太币的转移,就和比特币类似,A向B转移一定数量的以太币。这种交易包含:交易发起者、接收者、value的数量,其余类似Gas Limit、hash、nonce都会默认生成。所以你会看到一段代码:
web3.eth.sendTransaction({
from: "交易发起者地址",
to:“交易接收者地址”,
value: 数量
});
智能合约创建:创建智能合约就是把智能合约部署到区块链上,那么这个时候to是一个空的字段。data字段则是初始化合约的代码。所以看到代码:
web3.eth.sendTransaction({
from: "交易发起者地址",
data: "contract binary code"
});
智能合约执行:合约创建部署在区块链上,那么执行就是会加上to字段到要智能合约执行的地址,然后data字段来指定调用的方法和参数的传递,所以看到代码:
web3.eth.sendTransaction({
from: "交易发起者地址",
to:“合约执行者地址”,
data:“调用的方法和参数的传递”
});
以上大致就是交易的类型。
消息
合约之间可以发生“消息”,消息是虚拟对象,不会序列化,存在于以太坊的执行环境中,消息一般包括如下:
发送者
接收者
以太币数量
可选数据字段
一个startgas
消息类似交易,但是交易是由一个合约产生,在以太坊环境中,但执行某些代码的合约的时候,在call函数时候,会产生并执行一个消息。消息触发接收方账户运行代码,理解为合约之间的互相作用。
状态函数
以太坊中转移状态,需要有相关验证来保证。
检查交易、签名是否合法,检查Gas余额是否足够。
交易过程中,账户转移以太币,那么接收者账户检查,如果不存在就创建,如果是一个合约,那么运行合约代码,正常完成或者等待Gas消耗完。
转移过程过程中如果Gas消耗完,或者发送者没有足够的余额,那么就认为转移失败,回复支付费用外的状态。
执行完成,退还相关剩余Gas。
举例
1.交易发生,那么检查格式有效性。
2.计算余额,发送者有足够支付Gas的以太币,那么扣除发送的数值。
3.初始化,计算交易的字节长度,计算相应的Gas。
4.发送者账户减去相应发送的金额,或添加至合约账户。(如果没有合约,那么就是外部账户之间的直接交易)
5.运行合约代码,计算Gas总的消耗,减去计算余额。
6.返回Gas余额给发送者。
7.返回结果正常状态。
以太坊挖矿
以太坊挖矿者在区块链状态中获取随机数据,计算一些从区块链最后的N个区块中随机选择的交易,然后返回结果散列。
先来看看以太坊的挖矿流程:
每一个区块中,通过区块头来生成一个seed,这个seed称为种子,种子只和当前的区块有关。
种子产生一个16MB的伪随机缓存。
基于上述的缓存,那么再生成一个1GB的DAG数据集。缓存和数据集存在依赖关系,一般来说数据集依赖缓存的某些元素,那么简单来说的话,就是只要有缓存,即可计算出数据集DAG中指定位置的元素。
矿工所做的事情,就是在数据集DAG中随机去选择元素,且对其进行散列的一个过程。就个比特币中区寻找nonce一样的模式。
那么对比比特币的挖矿,以太坊目前只需要验证者花费一定数量的缓存即可,验证指定元素的散列是不是小于某个散列值。
缓存和数据集DAG每增加30000个区块更新一次,故矿工的精力应该是在读取数据集上而不是去改变。
这种方式的优点,以太坊中的智能合约会有任何种类的计算,这样ASIC就是一个提供计算的的专门的集成电路。就类似一个全球计算机的CPU。然后挖矿中要求保存全节点完整的区块链。
以太坊在计划过度到POS机制,那么以太坊的POS机制先用V神的一段话来说明:POS协议中,每个人都是“矿工”,因此,除非他们选择通过放弃以太币来违反规则,否则每个人都必须承担确认和验证交易的责任,从本质上来说,这才是去中心化的管理模式,能够提高利益相关者在网络中的参与度。
POS有两种模式:一种是POS、一种是BFT(Byzantine fault tolerant)风格的POS。
POS:基于链的POS,那么在每个时间阶段从验证者集中选择一个验证者,给与区块创建的权力,但必须要求验证者要指向最多的块,最长链上。
BFT-POS:分配给验证者一定的权利,那么他们通过提出块生成,对提出块进行投票。就是一个投票机制,每一轮中对一个新块进行投票,在线的验证者最后商量块的生成添加,且这个意见结果不可改变。
当然以太坊的POS机制还是带有惩罚机制。
以太坊的casper:区块链中难免会出现相互竞争的链,那么为了保证大多数验证者都在主链上去生成区块,那么必须要有一个机制来保证,之前的POS机制是没有惩罚的,一旦出现攻击者,那么区块链就存在可能无法共识,甚至没有出现攻击者,也有可能因为准主链的选择而会出现分歧。那么假设在验证在不同的区块链准主链上,在事后的一个时间节点对验证错误行的记录行为包含在区块链中并给与一定的惩罚,或者直接惩罚验证者的在错链上出块的行为,casper采用抵押一定代币的验证人,那么这些验证人去投票,最后根据投票的结果形成大多数人的意见,对之前投票的人有效用户给与押金退还且给予奖励,对那些攻击或者出错用户将没收押金。
以太币来源
那么以太币的来源包括以下几部分:
矿前奖励:预付款给与贡献者6000万个以太币
区块的奖励:目前挖出一个区块奖励5个以太币给矿工。
叔块奖励:这个和比特币不同,矿工在挖出一个区块后,但是并不是在主链上,那么这个区块叫做叔区。如果这个叔区块在后续挖矿中作为叔区块被引用了,那么挖出这个区块的矿工获得7/8的区块奖励,也就是4.375个以太币,且另外引用这个区块的矿工获得0.15个以太币,注意,这里的引用最多两个。
比特币的总量是2100万个,那么以太币也不是无限生成的,每年以太币发行1800万。之前笔者文章中有提到过,这个数字货币因为密钥的丢失,所以每年的发行和意外的丢失会达到一个动态的平衡。并不是你看官方数据有多少就真正有多少在流通,这个应该能理解。
以太坊在不久将来会采用casper的机制,这个和目前的GHOST机制不一样。具体的机制还待看。
矿工角度来看
从矿工的角度来看待以太币,那么就分为三块:
挖矿的奖励,这个还是5个以太币。(固定收益)
交易的手续费,之前就有人一直在问万一哪天比特币2100万挖完之后,挖矿如何获得收益,那么交易费就是其中的一项收益,以太坊上交易都会带上交易费用,那么这个也就是矿工的一部分所得。(动态收益)
叔区块收益,上文就提到过的,这个区块如果有叔区块,那么从叔区块中获得1/32个以太币也就是0.15个以太币的收益。且每个区块至多引用两个叔区块,被引用过的区块不能再被引用。(动态收益)
以太币的单位:
基本单位为wei,下表具体是各个比例:
单位维度个数 (wei)
wei1 wei1000
Kwei1e3 wei1000000
Mwei1e6 wei1000000000
Gwei1e9 wei1000000000000
microether1e12 wei10000000000000000
milliether1e15 wei10000000000000000000
ether1e18 wei10000000000000000000000
叔区块奖励
回过头感觉有必要再说下叔区块的奖励:
叔区块顾名思义是区块的父区块的兄弟区块。那么区块链只有一条主链,故叔区块不在主链上,导致叔区块的原因,由于是网络的延迟没有同步,那么一个叔区块如果引用在有效的主链上,挖出叔区块的矿工获得4.375个以太币(区块奖励的7/8)。上文说到叔区块的引用获得奖励,那么这个奖励对挖到叔区块的矿工也是有一个间隔层数的关系。具体如下:
间隔的层数获取的比例以太币
17/84.375
26/83.75
35/83.125
44/82.5
53/81.875
62/81.25
网友评论