ASCH区块链防数据篡改的情景演示

背景:部署三个节点(A/B/C)的区块链,对节点A上的数据库直接进行修改,将用户Ⅰ的balance和u_balance由1000增加修改成2000,另外两个节点(B、C)上面的数据保持不变,仍然是1000。

数据篡改之后的现象:用户Ⅰ登陆节点A的系统,查看余额为2000;而登陆节点(B/C)的系统,查看余额为1000。

交易操作:用户Ⅰ登陆节点A的系统,然后发起向用户Ⅱ转账1500的操作,转账交易成功,该笔交易进入节点A的待确认交易数据列表中,同时进行广播。此时,

交易数据的广播:节点(B/C)在收到交易数据的广播消息之后,对交易进行重新执行,发现用户Ⅰ的余额不足,故不接受该笔交易数据,无法进入待确认交易数据列表中。

创建新区块E之前的数据情况:在节点A上,用户Ⅰ的余额变为500(忽略手续费),用户Ⅱ的余额未变化;能查到此条待确认交易数据。在节点(B/C)上,用户Ⅰ和Ⅱ的余额未变化;待确认交易数据列表中无此条交易数据。

创建新区块E并上链:节点A上的受托人创建一个新区块E,该区块E包括了此条交易数据,并将此区块E在本地进行上链,同时广播给其他节点(B/C),其他节点收到该区块E之后,由于对该区块E中包含的交易数据在其他节点(B/C)上无法执行通过,故其他节点将忽略此区块E。至此,节点A的区块链高度要大于节点B/C的区块链高度。

创建新区块E之后的数据情况:在节点A上,用户Ⅱ的余额增加了1500,已经没有此条待确认交易数据。在节点(B/C)上,用户Ⅰ和Ⅱ的余额未变化;待确认交易数据列表中无此条交易数据。

继续创建新区块X/Y/Z:由于每个节点创建区块的间隔时间为10秒,创建下一个区块的节点可能是节点A或者节点B/C(B或C创建新区块的逻辑一样)。按以下情况来假设分析:

1、若是节点A上的受托人继续获得了创建区块的权利,先将创建区块的新高度及ID等提议信息广播给其他节点B/C,节点B/C收到提议之后,发现该提议的区块高度不等于本地区块链的最后一个区块的高度+1,则不回复投票信息给节点A;节点A由于获得的赞成票数不足三分之二,则无法创建新的区块。

但是,此时节点B/C发现收到的区块高度已经大于了本地区块链的高度了,为了防止区块链落后,则发起同步区块链的操作,随机的从某个节点进行同步。假设选择了节点C,由于区块高度一样则无需同步;假设选择了节点A,则将区块E同步到节点B中,但是在同步过程中该区块的交易数据无法执行通过,则直接结束同步,无任何实质性的同步数据。

2、假设节点B上的受托人创建下一个区块X,由于节点B在创建新区块时得到了节点C的共识(即达到了三分之二),故成功创建新区块X并上链,同时节点C也将新区块X上链。而节点A在收到新区块X之后,发现区块X的前一个区块ID等于节点A本地链中最后一个区块(区块E)的前一个区块ID,并且区块X的高度等于本地区块E的高度,但是区块X与区块E的ID不同,从而判断存在分叉(相同的高度和前区块而不同的ID),节点A将忽略区块X。

3、假设节点C上的受托人继续创建下一个区块Y,此时逻辑跟节点B创建区块X一样,节点B与节点C达成共识,同时将区块Y上链,而节点A收到区块Y之后,发现区块Y的前区块ID不等于本地链的最后一个区块E的ID,但是本地链最后一个区块E的高度+1等于区块Y的高度,说明存在分叉(高度正确但是不同的前区块),节点A将忽略区块Y。

4、假设接下来由节点A上的受托人创建下一个区块Z,经过第2、3步其他节点创建区块之后,此时节点A上的区块链高度与其他两个节点的区块链高度达成了一致,在创建新区块的过程中通过提议的个数能达到三分之二,则在节点A中能将区块Z上链,但是在同步区块Z到其他节点时,由于区块Z的前区块ID不等于其他节点最后一个区块的ID,则也会认为是分叉,被忽略。

5、假设接下来由节点B上的受托人创建新的区块W,与节点B创建新区块X时一样,在节点C上能达成共识并上链,节点A收到区块W之后,发现区块W的高度已经大于了本地区块E的高度+1,则从其他节点(B或C)执行区块同步。

在同步过程中,将以前的区块E删除并将区块E包含的交易数据进行回滚操作。

创建至少三个新区块之后的数据情况:用户Ⅰ登陆节点A的系统,查看余额为2000,用户Ⅱ的余额被还原;而登陆节点(B/C)的系统,查看用户Ⅰ的余额为1000,用户Ⅱ的余额未变化。即用户数据恢复成了数据篡改之后的情况,所有与篡改相关的交易均被回滚。

你可能感兴趣的:(区块链)