主页 > imtoken苹果版钱包 > 区块链“状态”是什么意思?数据将如何存储在以太坊网络中以便区块链系统运行?

区块链“状态”是什么意思?数据将如何存储在以太坊网络中以便区块链系统运行?

imtoken苹果版钱包 2023-01-17 04:37:29

在本文中,我们将深入讨论以太坊数据存储层。我们将介绍区块链“状态”的概念。还将讨论 Patricia 前缀树结构背后的理论,并将使用 Google 的 leveldb 数据库演示以太坊前缀树的具体实现。

在存储层,我们存储的是什么?

首先,我们需要了解我们需要存储什么才能使区块链系统正常运行。让我们简单看一下 Alice 向 Bob 发送 10 美元的例子。

我们可以看到其中的状态可以通过执行传输来改变。

我们必须跟踪不同人(状态)的余额和其他细节,以及区块链之间发生的细节(转移)。不同的平台会以不同的方式处理它。我们可以看到如何处理比特币和以太坊。

比特币

比特币的状态是通过 UTXO 实现的。比特币价值的转移是通过转账来实现的。更具体地说,比特币用户可以通过创建转账来花费 1 个或多个 UTXO,并输入他们的 UTXO 作为转账。

UTXO 模型是比特币与以太坊的区别。我们可以查看这些示例以了解其中的区别。

首先,比特币 UTXO 不能被部分使用。如果比特币用户花费了 0.5 BTC(使用他们唯一的 UTXO,价值 1 BTC),他们需要故意退回 0.5 BTC。如果他们不发送这部分,0.5 个比特币将丢失并交给挖掘转账的矿工。

区块链“状态”是什么意思?为了让区块链系统运行数据将如何存储在以太坊网络?

其次,在最基本的层面上,比特币不包含用户账户余额。使用比特币,用户可以简单地持有他们的私钥并在任何时间点进行一个或多个 UTXO。数字钱包看起来允许比特币区块链自动存储和管理用户账户余额,但事实并非如此。

区块链“状态”是什么意思?为了让区块链系统运行数据将如何存储在以太坊网络?

比特币的 UTXO 系统运行良好,因为数字钱包能够执行大多数转账任务。这些包括但不限于:

a) 处理 UTXO

b) 存储密钥

c) 设置转会费

d) 提供退货地址

e) 描述 UTXO 状态(显示可行性、待处理转账和完全余额)

UTXO 模型中的转账可以类比为纸币的转账。为每个账户跟踪钱包添加的账单 (UTXO)。当我们想花钱时,我们会使用一张或多张钞票(现在是 UTXO),这足以支付成本并且可能会得到一些零钱。(新的 UTXO)。每张账单只能使用一次,一旦使用,UTXO就会从池中移除。

综上所述,我们知道:

• 比特币区块链不持有账户余额

• 钥匙

• 如果包含在传输中,将花费完整的 UTXO(有时,部分将获得新的 UTXO 作为更改)

以太坊

与上述信息相反,以太坊的状态可以管理账户余额等等。以太坊的状态不是一个抽象的概念。它是以太坊底层协议的一部分。根据黄皮书的描述,以太坊是基于传输的状态机;可以创建基于状态机的传输技术。

以太坊区块能挖出多少个

让我们从头开始。与其他区块链一样,以太坊区块链也是从创世区块开始的。从那时起,转账、合约和挖矿等事情一直在改变以太坊区块链的状态。例如,在以太坊中,它是账户余额(存储在状态树中),它随着转账而变化并与账户相关联。

重要的是,账户余额等数据并不直接存储在以太坊区块链的区块中。只有根节点哈希传输、状态数据和收据数据直接存储在区块链上。从下图中可以看出。

区块链“状态”是什么意思?为了让区块链系统运行数据将如何存储在以太坊网络?

您可能还从上图中注意到,存储树(存储所有智能合约数据)的根哈希实际上指向状态树,从而指向区块链。接下来,我们将讨论更多细节。

以太坊中有两种不同的数据类型:永久数据和临时数据。永久数据的一个示例是传输。转账一经确认,即记录在区块链中;那么它就再也不能改变了。瞬态数据的一个例子是特定以太坊账户地址的余额。帐户的余额存储在状态树中,并在向特定帐户进行转账时更改。永久数据是有意义的,就像挖矿转账一样,而临时数据,比如账户余额,应该单独存储。以太坊使用数据树结构来管理数据。

以太坊数据记录就像在银行里。类似于使用 ATM 机和存储卡。银行会跟踪每张借记卡,以确保在完成转账之前有足够的余额。

UTXO 和账户计划的比较

UTXO 模型的好处:

• 可扩展性——因为可以同时处理多个 UTXO,所以可以完成同时传输,并鼓励扩展创新。

• 隐私——虽然比特币不是一个完全匿名的系统,但 UTXO 可以提供更高级别的隐私,只要用户每次转账都使用一个新地址。如果需要提高隐私性,也可以考虑更复杂的结构,例如环形结构。

账户/余额模型的好处:

• 简化——以太坊使用的模型,可以帮助开发人员实施复杂的智能合约,尤其是那些需要状态信息或涉及多方的合约。

例如,跟踪状态并根据它处理不同任务的智能合约。UTXO 的无状态模型将允许传输包含状态信息,这将与合约的设计不必要地保持一致。

• 效率——除了简单之外,账户/余额模型更高效,因为每次转账只需要验证发行金额的账户是否有足够的余额来支付转账。

账户/余额模型的缺陷是双花攻击。可以添加增量随机数来抵消这种类型的攻击。在以太坊中,每个账户都有一个公开可见的随机数,每次转账时,随机数都会增加。这可以帮助防止相同的传输被进行两次。(注意这个随机数不是工作量证明中的随机数,是随机数)

像大多数计算机架构一样,这两种模型都有自己的优点和缺点。一些区块链,例如 Hyperledger,也使用 UTXO,因为它们来自比特币区块链的创新。接下来,我们看看基于这两个模型的更多技术。

以太坊中的数据树结构是什么?

让我们更深入地看一下状态、存储和传输的树结构是什么样的。

状态前缀树 - 是唯一且唯一的。

在以太坊中,只有一棵唯一的网络状态前缀树。

这个网络状态前缀树是实时更新的。

网络状态前缀树包含每个帐户的键值对,它们位于以太坊网络上。

密钥是一个 160 字节的身份验证器(以太坊帐户的地址)。

网络状态前缀树的“值”是通过编译以太坊账户的以下账户详细信息得出的:

- 随机数

以太坊区块能挖出多少个

- 平衡

-storageRoot

-codeHash

状态前缀树的根节点(在某个时间点,全网状态前缀树的哈希)用于保证状态前缀树的安全性和唯一性;网络状态前缀树的根节点基于整个内部网络状态前缀树的数据进行加密。

区块链“状态”是什么意思?为了让区块链系统运行数据将如何存储在以太坊网络?

存储前缀树,存储智能合约数据

存储前缀树是存储智能合约数据的地方。每个以太坊账户都有自己的存储前缀树。存储前缀树的根节点是一个 256 字节的哈希值,作为 storageRoot 的值存储在网络状态前缀树中。

区块链“状态”是什么意思?为了让区块链系统运行数据将如何存储在以太坊网络?

传输前缀树 - 每个块一个

每个以太坊区块都有自己独立的传输前缀树。一个块将包含许多传输。一个区块中的转账顺序当然是由矿工决定的。对于传输前缀树中的特殊传输路径,它是块中传输的位置因子。挖矿区块不更新;块中转移的位置没有改变。这意味着一旦在块传输前树中定位到传输,就可以返回相同的路径得到相同的结果。

区块链“状态”是什么意思?为了让区块链系统运行数据将如何存储在以太坊网络?

分析以太坊数据库

在以太坊区块链中,有很多 MPT(Merkle Patricia Tries)(代表每个区块):

• 状态前缀树

• 存储前缀树

• 传输前缀树

• 收据前缀树

要获取特定区块中的 MPT,我们需要获取其哈希值作为参考。以下命令允许我们获取创世块中状态、传输和接收的根哈希。

注意:如果要获取最新块(不是创世块)的根哈希以太坊区块能挖出多少个,请使用以下命令。

安装 npm、node、level 和 ethereumjs

我们将结合使用 nodejs、level 和 ethereumjs 来检测 leveldb 数据库。以下命令可以帮助我们准备测试环境。

光盘~

sudo apt-get 更新

sudo apt-get 升级

卷曲-sL | sudo -E bash - sudo apt-get install -y nodejs

以太坊区块能挖出多少个

sudo apt-get install nodejs

npm -v

节点 -v

npm install levelup leveldown rlp merkle-patricia-tree --save

git 克隆

cd ethereumjs-vm

npm install ethereumjs-account ethereumjs-uTIl --save

从此时开始,运行以下代码将获得以太坊帐户密钥(将存储在以太坊网络的状态根中)。代码连接以太坊 leveldb 数据库,进入以太坊状态(使用区块链区块中的 stateRoot 值),然后可以使用秘钥进入以太坊网络中的所有账户。

//只需导入需求

var Trie = require('merkle-patricia-tree/secure');

var levelup = require('levelup');

var leveldown = require('leveldown');

var RLP = 要求('rlp');

var assert = require('assert');

//连接leveldb数据库

var db = levelup(leveldown('/home/TImothymccallum/gethDataDir/geth/chaindata'));

//从块中添加“stateRoot”值,以便我们可以检查该块高度的状态根。

var root = '0x8c77785e3e9171715dd34117b047dffe44575c32ede59bde39fbf5dc074f2976';

//创建 merkle-patricia-tree 库的 trie 对象

var trie = new Trie(db, root);

//创建一个nodejs流对象以太坊区块能挖出多少个,以便我们可以访问数据

var 流 = trie.createReadStream()

//开启流(因为node js流默认设置为暂停)

流.on('数据',函数(数据){

//打印出“状态树”的键

以太坊区块能挖出多少个

控制台.log(data.key);

});

有趣的是,一旦发生转账,以太坊中的账户就会被添加到状态树中(相对于该特定账户)。例如,使用“geth account new”创建一个新帐户将不会将该帐户包含在状态树中;即使在开采了许多块之后。但是,如果账户中记录了一次成功的转账(花费了 gas,并且已经包含在挖矿区块中),那么只有它会出现在状态树中。这是一个聪明的逻辑,因为它可以防止欺诈者不断创建新帐户并堵塞状态树。

解码数据

您已经注意到查询 leveldb 可以返回解码结果。这是因为以太坊使用自己特定的“修改版 MPT(Merkle Patricia Trie)”来与 leveldb 交互。Ethereum Wiki 提供有关设计和部署 Ethereum MPT (Merkle Patricia Trie) 和 RLP (Recursive Length Prefix) 解码的信息。简单来说,以太坊在前缀树数据结构上进行了扩展。例如,MPT(Merkle Patricia Trie)的修改版本包括一种通过“扩展”节点创建快捷方式的方法。

在以太坊中,MPT(Merkle Patricia Trie)节点的单个修改版本是:

• Null 字节(对应于 NULL)

• 17 个对象的数组(对应于分支)

• 2 个对象的数组(对应于叶子)

• 包含2个对象的数组(对应扩展)

以太坊前缀树是按照固定规则设计和创建的,检测它的最佳方法是使用计算机代码。以下示例使用 ethereumjs。Ethereumjs 易于安装和使用;它非常适合快速访问以太坊 leveldb 数据库。

以下代码(当提供特定的区块 stateRoot 和以太坊账户地址时)将以人类可读的形式返回账户的正确余额。

//Mozilla 公共许可证 2.0

//按照

//需要以下包作为nodejs文件运行

//获取需求

var Trie = require('merkle-patricia-tree/secure');

var levelup = require('levelup');

var leveldown = require('leveldown');

var utils = require('ethereumjs-util');

var BN = utils.BN;

var Account = require('ethereumjs-account');

//连接leveldb数据库

var db = levelup(leveldown('/home/timothymccallum/gethDataDir/geth/chaindata'));

//从块中添加“stateRoot”值,以便我们可以检查该块高度的状态根。

以太坊区块能挖出多少个

var root = '0x9369577baeb7c4e971ebe76f5d5daddba44c2aa42193248245cf686d20a73028';

//创建 merkle-patricia-tree 库的 trie 对象

var trie = new Trie(db, root);

变量地址 = '0xccc6b46fa5606826ce8c18fece6f519064e6130b';

trie.get(地址,函数(错误,原始){

if(err) 返回 cb(err)

//使用ethereumjs-account创建账户实例

var account = 新帐户(原始)

console.log('账户地址:' + 地址);

//使用ethereumjs-util解码并呈现账户余额

console.log('余额:' + (new BN(account.balance)).toString());

})

综上所述

我们已经证明以太坊能够管理状态。这种具有前瞻性的设计有很多好处。

流动性

假设移动设备和物联网设备无处不在,电子商务的未来取决于安全、稳定和快速的移动应用。

我们认识到可移植性的好处,我们也知道区块链规模的增量增长是不可思议的。将整个区块链存储在移动设备上是不可能的。

快速而不牺牲安全性

以太坊状态的设计和修改版 MPT(Merkle Patricia Trie)的使用提供了许多机会。以太坊前缀树上的每个函数都使用加密哈希。此外,前缀树可以根据节点的特殊密码散列来证明前缀树没有被欺骗。

例如,对前缀树的任何修改都会完全改变根哈希。这种加密功能为轻客户端(那些不存储整个区块链的设备)提供了快速访问区块链的机会。即账户“0x ... 4857”是否有足够的资金完成向区块高度“5044866”的转账?

速度极限

以太坊描述的一个有趣的问题是存储账户的概念。想象一个场景,两个用户每天都可以从他们的账户中提取全部余额的 1%。这个想法只是在未来的规划中提到,但它引起了很多兴趣,因为它理论上可以成为以太坊基础协议层的一部分(而不是必须是第二层和第三方钱包)。也许你会想起我们之前讨论过的比特币 UTXO。UTXO 对区块链数据视而不见,比特币区块链不存储用户账户余额。因此,比特币的底层协议层基本上不可能实现任何一种每日限速。

消费者信心

我们已经看到了轻客户端的大量开发,更具体地说,是可以与区块链技术交互的安全、稳定和快速的移动应用程序。

成功的电子商务区块链部署肯定会支持速度、安全性和可用性。这提高了消费者的信心,同时还通过智能设计提高了主流接受度,提供更高的可用性、安全性和性能。