Transaction、Receipt和BloomFilters

By | 2018年10月3日

输出倒逼思考,还是要多写点东西才是。

本文主要写对Ethereum中transaction、receipt、Bloom Filters的一些比较玄学的、感性理解上面的东西,意识流预警。。。

 

Transaction

今早在某论坛上寻找关于receipt的分析时看到这么一个说法。

Transactions Tries:Record transaction request vectors

这个request用的真是妙极,虽说原来就理解这个概念,但从来没想出来过这么6的一个词来贴切描述这个意义——这句话直接体现了区块链本质上的一些东西——因为所发送的交易不能被成为既定事实。

窃以为,区块链存在的核心意义,就是为在彻底开放的环境中达成状态一致提供了一个暴力的解决方案。任何事情在成为既定事实——即完成全网状态更新——之前全都是未定的(Unconfirmed),因此,无论是作为一个个人通过一个节点广播的交易,还是已经被封包(seal)入块一起广播的块中交易,都不能称之为真正意义上的,成为既定事实的【交易】,而只能称作Request。

再附上两句话

  1. 所有的验证节点都将在其本地执行交易——包括普通交易和合约调用交易。
  2. 所有(诚实的)节点将从一个相同的状态陆续到达另一个相同的状态。

 

Receipt

Receipts Trie:Records transaction outcome

如同字面意义一样——收据,即记录交易结果。其参数:

  1. Post-transaction state
  2. Cumulate gas used
  3. Set of logs created through execution of the transaction and bloom filter composed from information in these logs

这么一看,其“记录结果”的意义就显而易见了。

注意:Receipts和Transactions在区块中被对应存储——即两者存储的内容相对应,顺序相同。

上面的第三点是TransactionReceipt中比较重要的东西——分别以LogBloom和LogEntries存在(其中,entries是entry的vector)。LogEntry是一个包含地址、topic、data的结构。

关于receipt,黄皮书中有这样的叙述,译文(我的渣译……)在此供参考:

为了编码可能被用于零知识证明、索引和搜索等的与交易相关的信息,我们为每个包含与其执行相关的信息的交易编码了其独有的收据。每个收据(第i个交易被记为BR[i])都被放入一个键索引的trie中,trie root记作He存入区块头。

 

 

Bloom Filters

这个东西是为了减少信息的存储量而产生的。简而言之,Bloom Filter的意义是——通过给出方向执行日志再生的方式来替代直接的日志存储,使可能的空间占用成数量级地下降。

在区块产生/验证时,交易执行产生的日志的日志合约、索引字段的地址将被添加进bloom filter并存入区块头。

此处存的都是地址——无论是合约还是字段,都没有存储具体的数据。当一个应用需要得到它要的合约/索引域的日志时,执行这个应用的节点就可以通过检查各区块头的bloom filter来检查是否可能包含相关的log。一旦找到,节点就开始执行该块的交易并重新生成log并给出返回值。

 

点击量:467

发表评论

邮箱地址不会被公开。 必填项已用*标注