【翻译】以太坊:一款安全的、去中心化的、概括性的交易账本(四)

4.区块,state和交易 在介绍完跟以太坊有关的基本概念后,我们将更加详细讨论交易、区块和state的含义。   4.1 world state. World state(state)是一个在地址(160-比特识别...

4.区块,state和交易

在介绍完跟以太坊有关的基本概念后,我们将更加详细讨论交易、区块和state的含义。

 

4.1 world state.

World state(state)是一个在地址(160-比特识别符)和账户state(一个类似RLP的串行数据结构,见附录B)中间的地图项。尽管没有被存储在区块链中,但可以认为系统将会在修正过的Merkle Patricia树(trie树,见附录D)当中保持这个地图项。Trie需要一个简单的数据库后端来维持从字节阵列到字节阵列的地图项功能;我们把这重要的数据库称为state数据库。它有很多优点;首先结构的根节点依靠所有的网络数据进行加密,这样对于全网state来说它的哈希值能够被作为安全身份。其次作为不可更改的数据结构,它允许任意前置state(根哈希值是被知晓的)能通过简单的修改根哈希值而召回。由于我们存储了所有的这类哈希值在区块链里头,我们能够一般性还原旧的state。

账户state包含如下的四个字段:

nonce:这一个标量价值等于一定数量交易从这个地址中发送,或者是在账户跟编码相关联情况下,这个账户中一定数量的合约创建。比如地址a在stateσ这一账户,可能被表示为σ[a]n。

余额(balance):这一个标量价值等于该地址当中含有多少Wei。一般表示为σ[a]b。

存储根(storageRoot):是在Merkle Patricia的根节点上的一个256位的哈希值,它对账户(一个介于256bit之间的正整数地图项)中的存储内容进行编码,编码的形式是trie,是一个从Keccak256-bit哈希正整数密钥到RLP-编码256-bit正整数值的地图项。

密码哈希(codeHash):该账户EVM密码的哈希值——即只有当该地址收到信息回复之后才能执行;这是不可改变的,所以不像其他字段那样,它在建立之后就不能更改。所有这类哈希片段都被包含在state库当中对应着它们的哈希值,等待被索取。这个哈希值一般表示成σ[a]c,假设KEC(b)=σ[a]c,那么密码就有可能表示成b

我特别希望提出这指的不是trie的根哈希值而是重要集合中的密钥/价值对存储,我定义一个方便的恒等式:

attachments-2017-08-Qp2JRwpe59916559e4319.PNG    

trie当中密钥/价值对集合的折叠函数被表示成基础函数LI的元素智能变换,下面给出:

attachments-2017-08-WvKmrNAL599165964fddf.PNG

8KB32    ^    VP

需要知道的是,σ[a]s不是账户的‘实体’成员,无助于其后的序列化。

如果密码哈希(codeHash)字段是空的字符串的Keccak-256哈希值,例如σ[a]c=KEC(()),那么代表简单账户的字节常常表示“没有达成协议”的账户。

让我们定义一个world-state折叠函数Ls

attachments-2017-08-1Zqxr0s1599165db28ca0.PNG

这里,

attachments-2017-08-C3ltRe2t5991662d371e6.PNG

4.2 Homestead.

跟公网兼容的一个重要的区块数字,是在平台上标注了从FrontierHomestead阶段转换过程的区块,我们用标记NH表示,定义为:

13NH 1,150,000

这一协议通过这个区块被升级,因此这个标记出现在很多方程当中用来解释变化。

 

4.3 交易.

    交易(一般用T表示)是一个单个的基于加密货币签名的指令,由参与者从以太坊范围的外部创建。

若假设最终外部行动者将是自然人,软件工具将被用来创建或者传播。有两种交易类型:那些以消息发出为结果,和那些以伴随着密码的新账户的产生(通常被认为是‘合约创造’)为结果。特别指出两种类型的交易的很多相同场景:

Nonce:一个标量价值,等于很多交易由发送者发送;形式为Tn

gasPrice:一个标量价值,等于衡量导致这个交易被执行的,所有计算成本的单个gasWei数值;形式为Tp

gasLimit:一个标量价值,等于必须被用来执行这笔交易的最大数量的gas。这在任何计算过程完成之前预先付款,并且过后不能增加;形式为Tg

to:对于消息发出的接收者,或者创造合同的交易的160比特位的地址,Ø在这里只用来表示B0这个元素;形式为Tt

value:一个标量价值,等于Wei数值被转移到消息发出的接收者,或者在创造合同时,作为对新账户被创建的激励;形式为Tv

Vrs:和交易的签名相关联的价值,被用来决定交易的发送者;形式为TwTrTs。见附录F为它们的扩展。

另外,一个合约被创造的交易包括:

init:一个无限长的字节阵列,在账户初始化的程序中特指EVM-码,形式为Ti

init是一个EVM-码片段;它返回body,码的第二片段,是用来保证每时每刻账户接收到消息发送(既通过交易也决定于密码的内部执行情况)init只在账户被创造时偶尔执行,在之后会被立即舍弃。

相反,一个消息发送交易包含:

data:一个无限长的字节阵列,特指消息发送时的输入数据,形式为Td

附录F提到一个函数S,它将交易描绘给发送者,通过SECP-256kl曲线中的ECDSA使用交易(除了最后三个签名字段外)的哈希值作为签名数据来发生。现在我们简单声称指定交易T的发送者可以用S(T)代表。

14

attachments-2017-08-WyCLWLas5991669573a80.PNG

4.4 区块.

以太坊的区块是由HTU构成,分别是相关联的信息片段(即所说的区块头)H,和集中相应的包含交易的信息T,以及其他区块头的集合UU被认为是有父节点等于当前区块的父节点的父节点(这种区块通常也叫作ommers)。区块头包含一些信息片段:

父哈希值(parentHash:在整体结构中父区块头的Keccak256-bit哈希值;形式为Hp

ommersHash:这个区块的ommers清单部分的Keccak256-bit哈希值;形式为Ho

受益人(Beneficiary160-bit的地址,该地址上所有的报酬来自于该区块上的成功挖矿集合的转化;形式为Hc

State根(stateRootstate trie上的Keccak 256-bit哈希值根节点,出现在所有交易被执行和确定应用;形式为Hr

交易根(transactionsRoot:用区块中的交易清单部分的每笔交易填充的,trie结构中的根节点的Keccak256-bit哈希值;形式为Ht

收据根(receiptsRoot:用区块中的交易清单部分的每笔交易的收据填充的,trie结构中的根节点的Keccak256-bit哈希值;形式为He

logsBloom:来自可索引的信息(记录地址和记录主题)的Bloom过滤器,这些信息包含在交易清单的每笔交易收据的每个记录入口处;形式为Hb

难度(difficulty:是一个标量价值,对应着区块的难度等级。它能够通过前一个区块的难度等级和时间戳计算出来;形式为Hd

数字(number:是一个标量价值,等于创世区块的数字。创世区块有一个数字零;形式为Hi

gasLimit:是一个标量价值,等于每个区块当前gas支出的极限值;形式为Hl

时间戳:是一个标量价值,等于这个区块初始端的Unix时间()的正确输出;形式为Hs

extraData:一个包含和区块相关数据的任意的字节阵列。它必须是32字节或者更短;形式为Hx

mixHash:一个256-bit的哈希值,证明和区块上执行足够数量的计算nonce相关联;形式为Hm

Nonce:一个64-bit哈希值,证明和区块上执行足够数量的计算的混合哈西值相关联;形式为Hn

区块中的其他两个组成元素简而言之就是ommer区块头(和上面的形式一样)的一个清单,和一串交易。正式说来,我们可以定义一个区块B

18BBH,BT,BU

 

4.4.1 交易收据.

为了对一个可能对形成零-认知证明或者指数、寻址有用相关联的交易信息进行编码,我们对每个包含着和它的执行相关联的确定信息的交易的单个收据进行编码。每个收据(用BR[i]表示,表示第i个交易)定位在index-keyed trie当中,其根记录在区块头中,用He表示。

交易收据是一个数组,包括四个条目,分别为Rσ,交易后的state,用于交易后很快出现的,包含交易收据的区块的gas积累,Ru,通过执行交易创造的记录的集合,Rl,以及那些记录中的信息组成的Bloom过滤器,Rb

19)RRσ,Ru,Rb,Rl

LR这一函数一般提供一份交易收据,以便可变化为一个RLP-连续的字节阵列:

20)LR(R)(TRIE(LS(Rσ)),Ru,Rb,Rl)

交易后的state,Rσ被编码成为一个trie结构,这个trie结构的根形成了首条。

我们声称Ru是正整数,用于gas积累,记录Bloom,Rb是一个2048bits长度的哈希值(256字节):

21)RvPRbB256

记录入口,Rl被称为一系列记录入口,例如(O0,O1,)。记录入口O,一个记录地址的数组Oa,一系列32-字节记录标题Ot,和数据的一系列字节Od

22)O(Oa,(Oto,Ot1,…),Od)

23)OaB20t∈Ot:t∈B32OdB

我们定义Bloom过滤器函数M,减少一个记录入口包含有一个单个的256-字节哈希值:

attachments-2017-08-j7b9gdsF599166d6243cc.PNG

4.4.2 整体的有效性.

如果并且当且仅当区块满足下列条件时,我们可以声称区块的有效性(合法性):当它在基础stateσ(从当前区块的最后state中获取)上被执行时,它必须和ommer,交易区块哈希值,以及给定的交易BT(具体我们会在第11部分讲到)保持一致,并导致一个新的state,其身份为Hr

29)

HrTRIE(LS(Π(σ,B)))                                 

HoKEC(RLP(L*H(BU)))                                  

HtTRIE({∀i<BT,iP:p(i,LT(BT[i]))})             ∧

He≡TRIE({∀i<BR,iP:p(i,LR(BR[i]))})             

Hbr∈BR(rb)

这里p(k,v)是成对的RLP变换的简化,在此情况下,前一个是区块中的交易指数,后一个是交易收据:

30)p(k,v)RLP(k),RLP(v))

更进一步的:

31)TRIE(LS(σ))=P(BH)Hr

这样TRIELS(σ)便是包含着stateσ的密-价值对的Merkle Patricia树结构的根字节哈希值,其中stateσ使用RLP编码形成价值,而P(BH)是直接定义的B的当前区块。

此价值源于交易的计算,特别是交易收据,BR,这个将在11.4中正式介绍,它是通过交易state-累积函数定义。

4.4.3 序列化(连载)

函数LBLH分别是区块和区块头的准备函数。正如交易收据准备函数LR一样,我们声称当需要RLP变换时其结构的类型和秩序是:

32)LH(H)(Hp,Ho,Hc,Hr,Ht,He,Hb,Hd,Hi,Hl,Hg,Hs,Hx,Hm,Hn)

(33)LB(B)(LH(BH),L*T(BT),L*H(BU))

L*TL*H的智能乘积序列变换得到:

34)

f*((x0,x1,…))f(x0),f(x1),…)对于任何函数f来说

组成元素的类型如下表示:

35)HpB32∧H0B32∧HcB20∧HrB32∧HtB32∧HcB32∧HbB256∧HdP∧HiP∧HlP∧HgP∧HsP256∧HxB∧HmB32∧HnB8

这里,

36)Bn={B:BBB=n}

我们现在对区块的结构有了一个严格的陈述。RLP函数RLP(见附录B)为把这种结构变换为字节序列,以便传输确保在传输连接上和当地存储,提供了规范化的方案。

 

4.4.4 区块头的有效性.

我们将PBH)定义为当前的B区块,形式为:

37P(H)B:KEC(RLP(BH))=Hp

区块的数字是当前的区块数增加1

38HiP(H)Hi+1

区块头H的规范性difficulty(难题)用D(H)来定义:

39)

attachments-2017-08-RxrEYHw55991673a7307e.PNG

attachments-2017-08-hGzvXYjj599167760fc3e.PNG

47)Hl125000

Hs是区块H的时间戳,且须满足以下关系:

48)Hs>P(H)HS

这个机制要求两个区块之间关于时间的一个动态平衡;上两个区块之间的周期太短会导致难题等级增加,从而导致另一个计算需要的下一个周期变长。相反,如果周期太长,难题等级和下个区块的期望时间就会减少:

attachments-2017-08-eEdm0kPd599167c79dc61.PNG
    

55)Hl≥125000∧

56)Hs>P(H)HS

(57)Hi=P(H)Hi+1∧

(58)Hx║≤32

这里,(n,m)=PoW(HN,Hnd

超额数据必须最多在32字节,无一例外。

  • 发表于 2017-08-14 17:06
  • 阅读 ( 765 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
涂晶

75 篇文章

作家榜 »

  1. 社区运营-小以 562 文章
  2. 社区运营-小链 244 文章
  3. 于中阳Mercina-zy 79 文章
  4. 涂晶 75 文章
  5. 李晓琼 44 文章
  6. 兄弟连区块链培训 42 文章
  7. 吴寿鹤 36 文章
  8. John-smith 25 文章