我们都知道,每当有影响steem区块链数据的共识升级(HardFork),或者当前运行的节点状态数据遭到破坏时,都要进行重播(Replay),在steemit官方github中也叫做reindexing.
(图源 :pexels.com)
重播(Replay)到底是做什么操作的呢?
区块链的状态
简单来讲,区块链是由一堆首尾相连区块排列组成,这些块中包含着用户所作的操作等等(Oprations),比如编号888的区块中张三转账一笔钱给李四
,小红点赞了小刚的一个帖子
,等等等。
那么我们能从888区块中读出李四现在有了多少钱?小刚的那个帖子收益几何?小红还剩多少点赞能量?答案是显然不能。
所以我们需要按照一定的规则来处理区块数据,比如上述888区块中,张三的账户减掉一笔钱加到李四账户上,小红减掉一些点赞能量,小刚的帖子收益相应增加一些,等等等等。
这些随着区块的增加,被不断地处理,使得应用程序一直能够查询到区块的最新状态,比如说现在就可以用get_accounts
来查询我的账户:
{"jsonrpc": "2.0", "method": "condenser_api.get_accounts", "params": [["oflyhigh"]], "id": 1}
在我撰写本文时,上述API调用可以查询到我的SP(vesting_shares)等资产:
限于篇幅,不贴长图了。
同理,还可以用其它API查询帖子收益、查询内部市场行情等等等等,这些都依赖于区块链最新状态
,假如我们查询的节点状态不是最新,那么得到的数据可能就是陈旧过时的数据,可见这个最新状态多么重要。
什么是重播(Replay)?
好了,讲了这么多,好像也没说到底什么是重播(Replay)?
说到了区块链的状态,如果因为共识升级,区块链的之前的状态需要做一些修改,或者我们不小心把保存区块链状态的内存/文件破坏掉,这时候想简单的恢复状态是做不到的。
那么又要如何操作呢?简单来讲就是从创世块开始重新计算状态,一个块一个块的计算下去,比如第10个块,系统创建了@oflyhigh账户账户余额为0,第100个块@deanliu转给我10SBD,把所有的区块中的所有操作都重新计算一遍,建立起最新的状态。
这个从头把所有区块重新计算一遍来建立最新状态的过程,好像把区块链的过往操作重新上演了一遍,就叫做重播。
形象的比喻
假如你我有很多资金往来,今天我转给你一笔钱,明天你转给我一笔钱,后天我又转你一笔钱但是你又给我转回来一部分,每天转钱后我们都知道你欠我多少钱。
这里的每一天就好比一个区块,每天当中我们做的转钱操作就是Oprations(打包在transaction中,为了便于理解,不过多讲解),经过N天的操作后,你欠我多少钱,这个就是最新状态。
如果正常操作,我只需每天在前一天的状态上加减响应的金额,就会得到当前的最新状态。
但是有一天你不承认这个最新状态了,说这个不对,已经受到了破坏。这时候咋办?我们只需找到我们每天的转账记录,从第一天开始,一笔笔核对,计算每天的最新状态,直到今天。
这个从第一天开始核实转账记录最终算出当前最新状态的过程,就是重播。
以上为个人理解,如有错误,烦请不吝指正。
https://steemit.com/~witnesses type in
oflyhigh
and click VOTE
Vote @oflyhigh via Steemconnect
Thank you!
This page is synchronized from the post: ‘到底什么是重播(Replay)?我的理解’