以太坊的数据记录就仿佛在银行。雷同利用 ATM 呆板和存储卡。银行会追踪每个借记卡来确保在在完成转账之前,有足够的余额。
[/code]
[/code]
我们认知到了可移动性的优势,我们也知道区块链巨细的逐渐增加是难以置信的。将整个区块链存储在移动设备是不行能的。首先我们需要领略为了让区块链系统运行,我们需要存储的对象。让我们简朴地看下关于 Alice 给 Bob 转账 10 美金的例子。
举例来说,追踪状态的智能合约,而且基于它处理惩罚差异的任务。UTXO 的无状态模子会让转账包括状态信息,并且这也不须腹地切合合约的设计。
• 存储前缀树c) 配置转账用度
• 回执前缀树
//Creating a nodejs stream object so that we can access the data var stream = trie.createReadStream()
发文时比特币价值 ¥45052.78
我们必需要追踪余额以及差异人(状态)的其他细节,尚有在区块链之间产生的细节(转账)。差异的平台会有差异地处理惩罚要领。我们可以看出,比特币和以太坊是如那里理惩罚的。
//Connecting to the leveldb database var db = levelup(leveldown('/home/timothymccallum/gethDataDir/geth/chaindata'));
状态前缀树- 是独一和奇特的。
在存储层中,我们存储的是什么?
作者:vasa和以上的信息相反,以太坊的状态可以或许打点账户余额,以及更多信息。以太坊的状态并不是个抽象的观念。它是以太坊底层协议的部门。按照黄皮书中的描写,以太坊是一个基于转账的状态呆板;基于状态呆板的转账技能可以或许被建设。
重腹地是,譬喻账户余额之类的数据并不是直接存储在以太坊区块链的区块中。只有根节点哈希的转账,状态数据和回执数据是直接存储在区块链上的。可以按照下图看出。
e) 描写 UTXO 状态(展示可行性,待转账以及全部的余额)和大大都计较机架构沟通,,这两个模子都有本身的长处和弊端。有些区块链,譬喻超等账本,也应用了 UTXO,因为他们从比特币区块链中得到创新。接下来,我们来看看更多的基于这两个模子的技能。
[code]
也许你也留意到了,从上面的图表中,存储树的根节点哈希(所有的智能合约数据存储在个中)其实都是指向状态树的,从而指向区块链。接下来,我们会接头更多细节。
[code]
[/code]
[code]
[code]
结论
• 效率- 除了简朴化,账户 / 余额模子越发有效,因为每个转账都只需要来验证发出金额的账户是否有足够的余额来付出转账。
对数据解码
速度限制
以太坊
安装 npm,节点,level 和 ethereumjs
• 扩容性 – 因为可以同时处理惩罚多个 UTXO,所以可以或许完成同步转账而且勉励扩容创新。[code]
以太坊中的数据树布局是什么?
• 包括 2 个工具的数组(对应树叶)• 包括 17 个工具的数组(对应分支)
UTXO 模子让比特币和以太坊差异。我们可以看这些例子来领略个中的区别。
UTXO 模子中的转账可以类比为纸币转账。每个账户城市追踪钱包添加的账单(UTXO)。当我们想要费钱的时候,我们会利用一个可能多个账单(此刻的 UTXO),这已经足够来包袱花销,或者还会获得一些找零。(新的 UTXO)。每个账单只能耗费一次,一旦消费,UTXO 就会从资金池移走。
b) 存储秘钥[code]
比特币
//Getting the requirements 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');
[/code]
• 隐私 – 尽量比特币并是不完全的匿名系统,可是 UTXO 可以提供更高条理的隐私性,只要用户利用为每个转账提供新的地点。假如有需要提高隐私性,更多巨大的布局,譬喻环形布局,也可以思量利用。在以太坊中,单个的修改版的 MPT (Merkle Patricia Trie)节点是:
其次,在最根基的层面,比特币没有包括用户账户余额。通过比特币,用户可以简朴地持有私钥,在任何时间点都可以举办一个可能多个 UTXO。数字钱包看起来像是让比特币区块链可以或许自动地存储和打点用户账户余额,其实不是这样。
账户 / 余额模子的缺陷是双花进攻。可以增加递增的随机数来抵消这种范例的进攻。在以太坊中,每个账户都有空开可见的随机数,每次举办转账的时候,随机数就会增加。这可以辅佐防备同样的转账会举办两次。(留意,这个随机数并不是事情量证明中的随机数,这是个随机数字)
有趣地是,一旦转账产生了,以太坊中的账户只是添加到状态树中(和谁人特定账户相关的)。譬喻,利用“geth account new”建设新的账户不会包括在状态树中包括谁人账户;甚至在许多区块被挖出后。可是,假如乐成的转账(耗费燃料费而且已经包括在挖矿区块)是记录在账户中,然后只有它会呈此刻状态树中。这是很智慧的逻辑,因为会掩护欺诈者无法持续建设新的账户以及使得状态树堵塞。
从这时候开始,运行以下代码会获得以太坊账户秘钥(会存储在以太坊网络的状态根部)。代码和以太坊 leveldb 数据库毗连,进入以太坊的状态(从区块链的区块中利用 stateRoot 数值),而且然后可以利用秘钥进入到以太坊网络中的所有账户。
网络状态前缀树包括秘钥和每个账户的代价对,这些是在以太坊网络上。//Mozilla Public License 2.0 //As per https://github.com/ethereumjs/ethereumjs-vm/blob/master/LICENSE //Requires the following packages to run as nodejs file https://gist.github.com/tpmccallum/0e58fc4ba9061a2e634b7a877e60143a
• 状态前缀树//Adding the "stateRoot" value from the block so that we can inspect the state root at that block height. var root = '0x8c77785e3e9171715dd34117b047dffe44575c32ede59bde39fbf5dc074f2976';
原文:https://hackernoon.com/getting-deep-into-ethereum-how-data-is-stored-in-ethereum-e3f669d96033
存储前缀树是智能合约数据存储的处所。每个以太坊账户都有本身的存储前缀树。存储前缀树根节点是 256 字节的哈希值,作为 storageRoot 的数值存储在网络状态前缀树。
每个以太坊区块都有本身独立的转账前缀树。一个区块会包括许多转账。区块中的转账顺序虽然是由矿工来抉择的。对付转账前缀树中的非凡转账路径,是通过这个转账在区块中的位置因子。挖矿区块不会更新;转账在区块中的位置不会改变。这意味着一旦你在区块转账前置树中定位了转账,你可以返回到同样的路径来得到同样的功效。
首先,比特币 UTXO 不能部门耗费。假如比特币用户耗费 0.5 个比特币(利用他们仅有的 UTXO,代价 1 比特币),他们需要特意地发回 0.5 个比特币。假如他们不发送这部门,那么这个 0.5 比特币就会丢失,而且给到挖出转账的矿工。
[code]
//Turning on the stream (because the node js stream is set to pause by default) stream.on('data', function (data){ //printing out the keys of the "state trie" console.log(data.key); });
我们可以看出,通过执行转账可以改变个中的状态。
我们会利用 nodejs,level 和 ethereumjs 的团结来检测 leveldb 数据库。以下的呼吁可以辅佐我们筹备测试情况。
以太坊描写了个很有趣的问题,就是存储账户的观念。想象这种场景,两个用户都可以天天从账户中拿出全部余额的 1%。这个概念只在将来筹划中提到,可是它却得到了许多乐趣,因为理论上来说,它可以作为以太坊基本协议层的一部门(和必需要作为第二层和第三方钱包相反)。也许你想起了我们之前接头的比特币 UTXO。UTXO 对付区块链数据是盲目标,比特币区块链没有存储用户的账户余额。因此,比特币的底层协议层根基上不行能完成任何范例的逐日速度限制。
电子商务的区块链乐成陈设,必然会支持速度,安详和可用性。这可以或许提高消费者的信心,同时也通过智慧的设计,提供更高的可用性,安详性和机能,进而提高了主流的接管本领。
存储前缀树,智能合约数据存储的处所
• 比特币区块链不会持有账户余额[code]
我们已经表示出以太坊有本领来打点状态。这种超前的设计有许多长处。
[code]
• 包括 2 个工具的数组 (对应扩展) • 简朴化- 以太坊利用的模子,可以辅佐开拓者来举办巨大的智能合约,出格是需要状态信息可能包括多方的。[code]
以太坊中有两种差异的数据范例:永久数据和临时数据。永久数据的例子就是转账。一旦转账确认,就会在区块链中记录;然后就再也不行以变动。临时数据的例子就是特定以太坊账户地点的余额。账户的余额就会存储在状态树中,而且当有特定账户转账的时候,就会改变。永久数据是有意义的,就仿佛挖矿转账,临时数据,就譬喻账户余额,应该被分隔存储。以太坊会利用数据树布局来打点数据。
[/code]
-codeHash郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。