高级区块链功能中快照的重要性

766 阅读6分钟

自其诞生以来,区块链的常见用例和应用已经发生了巨大的变化。 如今,区块链技术在金融支付、供应链、身份验证、保险和医疗保健等方面发挥着作用,仅举几例。

然而,为了保持长期的相关性,区块链平台可能有必要做出某些改变。例如,流行的加密货币Tron正在将其代币从以太坊迁移到自己的主网,从而为一个完全去中心化的互联网创建基础设施,能够承载去中心化的应用程序。

因为区块链网络以存储大量数据而闻名,所以任何一个区块链的节点所保存的数据量很可能是巨大的,并将继续扩大。这对于加入网络的新节点来说可能是令人生畏的,它们在加入网络之前必须从整个网络中下载数据。

在这篇文章中,我们将探讨区块链应用程序中快照和反向状态的重要性,学习如何利用它们来管理我们应用程序的存储。

介绍快照

快照是一个包含区块链在任何特定时间的当前状态的文件。快照捕获了完整的区块链账本,包括所有现有的地址及其相关数据,如交易、费用、余额、元数据等。它被保存在你的硬盘上的一个目录中。

当一个节点加入一个网络时,它必须下载整个区块链,从创世区块到最后生成的区块,其大小从1.5GB到140GB不等。另一方面,快照允许节点通过只获得最新的状态来追赶网络。

为了更好地理解快照,考虑一下收集源区块链上所有账户和智能合约的最新状态和交易需要多少人力。还要记住,只要网络在运行,全局状态就会随着新交易的接收而改变。

区块链快照:使用案例

让我们回顾一下区块链快照的一些常见用例。其一,空投指的是将数字资产转移到区块链社区的活跃成员的钱包里,通常是免费的或作为社区服务的回报。在这种情况下,快照被用来寻找在特定时间点持有代币的社区的坚定成员。

代币迁移指的是将代币持有人的余额从一个区块链传输到一个完全不同的区块链的过程。它主要用于硬分叉期间,原区块链中的代币持有人将被授予新区块链中的代币。

阿尔法币,是一种加密货币的衍生品或改进版,是由于原始加密货币被认为有缺陷而创建的。在创建一个替代币之前,对加密货币区块链进行快照,提供对原始区块链初始分布的洞察力。一个替代币的例子是比特币现金,它是基于比特币的。

开始使用

Ganache是一个用于在本地开发Ethereum和Corda DApps的工具。通过Ganache,你可以在一个安全和可预测的环境中建立、部署和测试你的DApps

以编程方式使用Ganache

要安装Ganache,请运行以下命令:

npm install ganache

接下来,在你现有的Ganache项目中添加以下代码:

const provider = ganache.provider();
const [from, to] = await provider.send("eth_accounts");
const startingBalance = BigInt(await provider.send("eth_getBalance", [from] ));

// take a snapshot
const snapshotId = await provider.send("evm_snapshot");

// send value to another account (over-simplified example)
await provider.send("eth_subscribe", ["newHeads"] );
await provider.send("eth_sendTransaction", [{from, to, value: "0xffff"}] );
await provider.once("message"); // Note: `await provider.once` is non-standard

// ensure balance has updated
const newBalance = await provider.send("eth_getBalance", [from] );
assert(BigInt(newBalance) < startingBalance);

// revert the snapshot
const isReverted = await provider.send("evm_revert", [snapshotId] );
assert(isReverted);

// ensure balance has reverted
const endingBalance = await provider.send("eth_getBalance", [from] );
const isBalanceReverted = assert.strictEqual(BigInt(endingBalance), startingBalance);
console.log({isBalanceReverted: isBalanceReverted});

在上面的代码中,我们创建了一个提供者,并检查了一个账户的余额,作为一个起始参考点。然后,我们使用evm_snapshot RPC方法对当前区块链的状态进行了快照;它不需要参数,并返回一个ID,我们将其存储为snapshotId

接下来,我们订阅一个事件,我们命名为newHeads 。订阅是通过一个普通的RPC调用来创建的,eth_subscribe 作为方法,订阅名称作为第一个参数。如果成功,它会返回订阅的ID。对于每一个与订阅相匹配的事件,都会发送一个包含相关数据的通知和订阅ID。

接下来,我们将价值从一个账户发送到另一个账户,模拟区块链上的活动。之后,我们确认我们开始时的余额与现在的余额不同。

最后,我们使用evm_revert RPC方法,将区块链的状态恢复到之前的快照。它需要一个参数,即要恢复的快照ID。如果没有传递快照ID,它将恢复到最新的快照。 值得注意的是,在一个成功的evm_revert ,相同的快照ID不能再次使用。

然后,我们通过检查我们的起始余额是否与当前余额相同来确认我们的恢复是成功的,这意味着我们先前进行的交易被恢复了。

使用Ganache命令行

Ganache CLI是以太坊开发工具Truffle套件的一部分,是Ganache的命令行版本。要安装Ganache CLI,请运行以下命令:

npm install -g ganache-cli

要确认安装是否成功,请运行下面的命令:

ganache-cli --version

如果Ganache CLI安装成功,屏幕上会出现一个版本号。你可以通过Ganache CLI运行下面的命令来进行快照:

ganache-cli --database.dbPath="./data/save/" -i="5777" -d -m="YOUR_12_WORDS_HERE"

--database.dbPath 指定一个保存链式数据库的目录的路径。如果数据库已经存在,Ganache CLI将初始化该链,而不是创建一个新的。

-I 指定由RPC方法返回的网络ID。它默认为当前时间或分叉区块链的网络ID,如果配置了的话。 ,根据预先定义的确定性种子生成确定性地址, ,使用特定的HD钱包助记符来生成初始地址。-d -m

如果成功,一些文件将被生成并保存到./data/save 目录中。如果数据已经存在于该目录中,它将返回到相同的状态。

总结

区块链行业是一个快节奏的行业。利用区块链技术的平台必须以极快的速度适应,以保持相关性。因此,这些平台可能不得不从一个区块链实例迁移到另一个,以保持竞争力和安全性。

区块链上的数据迁移涉及从源区块链上复制数据,并在目标区块链上重新创建。然而,这些数据可能非常大,强调了减少区块链下载时间的必要性。

快照是一个包含区块链在任何特定时间点的状态的文件。快照允许新节点通过只从区块链上下载最近的状态来赶上网络,它们通常被用来引导区块链、侧链和新节点。比特币论坛中介绍了一个比特币替代币的快照文件格式和引导程序。我希望你喜欢这个教程,如果你有任何问题,请务必留言。编码愉快!