以太坊黄皮书连载(三)

天露   |     |   675 次阅读

翻译作者:Jorden Gao 邮箱:gaotl33@126.com / tianlu.jorden.gao@gmail.com
微信账号:wa713714
本文作者:Dr. Gavin Wood,以太坊&Ethcore的创始者 邮箱:GAVIN@ETHCORE.IO

公式解释说明:由于网页不默认word公式的格式,以下为公式的解释说明:
1.B_20中为下角标;
2. f
^* ((x_0,x_1,…))≡( f_ (x_0),f_ ^ (x_1),…) 中^为上角标;
3. R_u∈P ∩〖 R〗b∈B_256 中〖 〗忽略不计;
4. D(H)≡ {(D_0^ if H_i^( )=0
{ max⁡〖(D_0^ ,P(H)
(H_d^ )^ +x*ε1+ϵ) if H_i^( )<〗 N_H^( )
{max⁡(D_0^ ,P(H)_(H_d^ )^ +x*ε2+ϵ) otherwise)

中3 { 是一个大个{
若有公式疑问,建议下载原文对应公式看;再次抱歉!

5. 燃料和支付(“Gas and Payment”)
为了避免网络滥用的问题和回避由于Turing不完整性而带来的一些不可避免的问题,在以太坊中所有可编程的计算都是需要费用。这个费用表在燃料单位(“units of gas”)中有特别说明(见附件G,不同的计算对应着不同的费用)。因此任意给定可编程计算的一部分(包括合约创建、信息调回、有用和可进入的账号存储和在虚拟机上的执行操作)都有一个普遍地同意的燃料消费方式。
每一个交易都有一个特别的燃料总额取决于:燃料限制。这个燃料总额是间接地从发送者的账号余额购买。这个购买力取决于燃料价格,特别是在交易中。如果这个账号余额不能支付这个燃料购买力,这个交易被考虑无效。它被命名为燃料限制,而且任何一个无用的燃料在交易之后都会被退回(以购买时的同样汇率)到这个发送者的账号。燃料不会被使用在交易执行之外。因此对于含有可信任代码的账号,相对下会被单独的设置为一个高的燃料限制。
通常来说,以太币(Ether)用作去购买不能被返回的燃料而且能被转到这个受益人的地址中,通常这个账号的地址都是用矿工控制。交易处理者可以任意地去具体说明他们想要的燃料价格,然而矿工也可以任意地去忽略他们可选择的交易。在一个交易中,高价格的燃料将消费这个发送者的以太币和运输一个更大价值给矿工,因此这个交易会被更多的矿工选择。通常来说,矿工将会选择去通知这是他们执行交易最小的燃料价格和交易者们将会免费去覆盖这些由燃料价格去提供的价格。因此这里将会有一个(加权过的)最小可接受的燃料价格分配,交易者们将必须去决定于一个在最低燃料价格和最大及时正确地被挖的机会中间权衡。

6.交易的执行(“Transaction Execution”)

交易的执行是以太坊协议中最复杂的部分:它定义这些状态交易函数γ。它被认为任何被执行的交易第一次都能通过内部有效性的初始测试。这些包含:
交易是一个结构完整的RLP,没有多余的后缀字节;
交易的签名是有效的;
交易的随机数是有效的(等于当前发送者账号的当前随机数);
燃料限制是不小于内部的燃料,g_0^ ,用来交易;
发送者账号的余额至少大于消耗量,v_0^ ,需要提前支付。
形式上来说,我们考虑这个函数γ,配合T 和状态σ成为一个交易:
(59) σ_ ^( ’)=γ(σ,T)
因此σ_ ^( ’)是交易后的状态。我们也定义γ_ ^( g)是去估计用于一个交易执行的燃料总额和γ_ ^( 1)去估计交易产生的日记数量,稍后它们都会被定义。
6.1子状态(“Substate”)。从交易执行全过程来看,我们产生一些特定被立即跟随这个交易执行的信息。我们称为交易子状态,用A来表示它的数组:
(60) A≡A_s,A_l,A_r
这个数组的内容包含A_s,一个自杀集合(“suicide set”):一个将在交易完成后被抛弃账号的集合。A_l是一个日记系列:这是一系列在允许通过以太坊内部旁观者容易追踪合约调用的VM代码执行的可存储和可索引的‘检查站’(“例如一个前期去中心化的软件”)。A_r,返回的余额,通过使用SSTORE结构上升为了重设合约存储从非0值到0。虽然不是立即的返回,它也是被允许去部分抵消整个执行消费。
简短来说,我们定义这个空的子状态A_ ^0是没有自杀函数、日记、和0返回余额:
(61) A_ ^0≡(∅,( ),0)
6.2执行(“Execution”)。我们定义内部燃料g_0^ ,这个交易需要去被首先支付给执行的燃料总额,如下:
(62) g_0^ ≡∑(i∈T_i^ ,T_d^ ){(G_txdatazero^ if i=0
G
txdatanonzero^ otherwise)┤

(63) + {(G_txcreate^ if T_t^ =∅∩H_i^ ≥N_H^
0 otherwise)┤

(64) + G_transaction^
其中T_i^ ,T_d^ 表示为一系列与交易相关数据的字节和初始化EVM代码,取决于它是合约交易还是信息调回交易。如果这个交易是创建合约而形成,而且不是EVM代码的一个结果或者在家园转换(“homestead transition”)之前,则G_txcreate^ 是会被添加。G完全定义在附录G。
这个预见支付的费用v_0^ 被计算为:
(65) v_0^ ≡ T_g^ T_p^ +T_v^
有效性是被取决于:
(66) S(T)≠∅ ∩
〖 σ[S(T) ]〗_ ^ ≠∅ ∩
〖 T〗n^ =〖σ[S(T)]〗n^ ∩

g_0^ ≤T_g^ ∩
〖 v〗0^ ≤〖σ[S(T)]〗b^ ∩

T_g^ ≤B_Hl^ –l〖(B_R^ )〗_u^
注意最后的那个公式;交易燃料限制的总和T
g^ 和前一个区块中有用的燃料值l〖(B
R^ )〗_u^ 都必须不能大于区块的燃料限制B_Hl^ 。
有效交易的执行开始于一个可取消变化的制造状态:发送者账号的随机数S(T),它是加1的增量而且余额是通过前段消费T
g^ T_p^ 被返回。算计的过程中有效的燃料g是被定义为T_g^ -g_0^ 。无论是合约创建还是信息调回,这个计算结果是一个最后的状态(合法下可能等于这个当前的状态),这个变化决定论的而且一直无效的:从这个观点看这里能存在一个无效的交易:
我们定义这个检查站状态为σ0^ :
(67) σ
0^ ≡σ
^ 除:
(68) σ0^ 〖[S(T)]〗_b^ ≡σ ^ 〖[S(T)]〗b^ -T_g^ T_p^
(68) σ0^ 〖[S(T)]〗n^ ≡σ
^ 〖[S(T)]〗n^ +1
从σ0赋值给σ_p取决于交易的类型;不管它是创建合约还是信息调回;我们定义这个过去执行暂时状态数组为σp,同时留下燃料g
^( ')和子状态A:
(70) (σp,g ^( '),A)≡ {(Λ(σ0^ ,S(T),T_0^ ,g,T_p^ ,T_v^ ,T_i^ ,0) if T_t^ =∅@Θ3^ (σ0^ ,S(T),T_0^ ,T_t^ ,T_t^ ,g,T_p^ ,T_v^ ,T_d^ ,0) otherwise)┤
其中g是扣除现有的交易需要去支付的基本燃料总和后剩余燃料总和:
(71) g≡T
g^ -g_0^
T_0^ 是原始的交易者,在这个情况下它和信息调用或者合约创建的发送者是不同的,它不去直接地触发交易但是它存在EVM执行代码中。
注意,我们使用Θ
3^ 仅仅去表示被用地函数值中的第一个前三个部分;它最后表示为信息调回的输出值(一个字节数组)和没有被用在交易赋值的内容中。
在信息调回或者创建合约被运行后,这个状态被决定通过被返回的决定值总和送给发送者(使用开始的货币汇率);g
^属于剩余燃料(g_ ^( '))加上一些来自于对立的偿还补贴:
(72) g_ ^
≡g_ ^( ')+min⁡{[(〖T_g^ -g〗_ ^(' ))/2],A_r^ }
可以返回的总值是合法的剩余燃料g_ ^( '),加上A_r^ ,和最后一个至少超过〖T_g^ -g〗_ ^(' )总和一样的部分的最大值。
用于燃料的以太币被给到在当前区块B中地址作为一个受益者的矿工。所以我定义在暂时状态数组σp^ 中最后状态的前一个状态为σ ^
(73) σ_ ^(
)≡σ(P )^ 除:
(74) σ
^(* ) 〖[S(T)]〗b^ ≡σ(P )^ 〖[S(T)]〗b^ -g ^(* ) T_p^
(75) σ_ ^* 〖[m]〗b^ ≡σ(P )^ 〖[m]〗b^ +〖(T_g^ -g〗 ^)T_p^
(76) m≡B_(H_c^ )^
在删除所有自杀名单中出现的账号后,最后的状态σ_ ^'是被得到:
(77) σ_ ^(' )≡σ_ ^
除:
(78) 〖∀i∈:σ〗 ^' [i]≡∅
最后,我们具体说明下γ_ ^(g )是在交易中使用燃料的总和,γ_ ^1是被这个交易创建的日记:
(79) γ_ ^(g ) (σ,T)≡T_g^ -g_ ^( ')
(80) γ_ ^1 (σ,T)≡A_l^
它们被使用去帮助定义这个交易收据(transaction receipt),以后还要讨论。

 
0 人喜欢