tp钱包矿工费太低会不会转不出来,tp钱包矿工费查询

  

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

  

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

  

     

  

  首先,我们需要理解为了让区块链系统运行,我们需要存储什么。让我们简单看一下Alice给Bob转账10美元的例子。   

  

  我们可以看到,通过执行转移可以改变状态。   

  

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

  

  比特币   

  

  比特币的地位是通过UTXO实现的。比特币价值转移是通过转账实现的。更具体地说,比特币用户可以通过创建转账来消费一个或多个UTXOs,并使用其UTXOs作为转账输入。   

  

  UTXO模型使得比特币不同于以太坊。我们可以看看这些例子来理解不同之处。   

  

  首先,比特币UTXO不能部分消费。如果比特币用户消费了0.5个比特币(使用自己唯一的UTXO,价值1个比特币),需要特意寄回0.5个比特币。如果他们不发这部分,那么这0.5的比特币就会丢失,给挖出转账的矿工。   

  

     

  

  其次,在最基本的层面上,比特币不包含用户账户余额。使用比特币,用户只需持有私钥,就可以在任何时间点制作一个或多个UTXO。数字钱包看起来像是让比特币区块链能够自动存储和管理用户账户余额,但事实并非如此。   

  

     

  

  比特币的UTXO系统运行良好,因为数字钱包可以完成大部分转账任务。包括但不限于:   

  

  a)处理UTXO   

  

  b)存储秘密密钥   

  

  c)设置转账费用。   

  

  d)提供寄信人地址。   

  

  e)描述UTXO状态(显示可行性、要转移的余额等)   

  

  UTXO模型中的转账可以比作纸币转账。每个账户都会跟踪钱包添加的账单(UTXO)。当我们想花钱时,我们会使用一张或多张钞票(现在的UTXO),这些钞票足以支付开销,也许还能得到一些零钱。(新UTXO)。每张钞票只能消费一次。一旦花费,UTXO将从资金池中移除。   

  

  总而言之,我们知道:   

  

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

  

  秘密钥匙   

  

  如果包括在传输中,完整的UTXO将被消耗(有时,一些将获得新的UTXO作为更改)   

  

  以太坊   

  

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

  

  让我们从头开始。像其他区块链一样,以太坊区块链是从创作开始的。从那以后,像资金转移、合同和采矿这样的事情将逐渐改变以太坊区块链的状态。以以太坊为例,是账户余额(存储在状态树中),随着转账而变化,与账户相关联。   

  

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

  

     

  

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

  

  以太坊中有两种不同类型的数据:永久数据和临时数据。永久数据的一个例子是资金转移。一旦转让被确认,将被记录在区块链中;那你永远也改变不了。数据的一个临时例子是特定以太坊账户地址的余额。帐户的余额将被存储在状态树中,并且当有特定的帐户转移时会改变。永久数据是有意义的,就像挖掘转移一样。临时数据(如帐户余额)应单独存储。以太坊将使用数据树结构来管理数据。   

  

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

  

  UTXO和账户方案之间的对比   

  

  UTXO模型的优势:   

  

  容量扩展——因为可以同时处理多个UTXO,所以可以完成同步传输,鼓励容量扩展和创新。   

  

隐私 – 尽管比特币并是不完全的匿名系统,但是UTXO可以提供更高层次的隐私性,只要用户使用为每个转账提供新的地址。如果有需要提高隐私性,更多复杂的结构,例如环形结构,也可以考虑使用。

  

账户/余额模式的好处:

  

简单化- 以太坊使用的模型,可以帮助开发者来进行复杂的智能合约,特别是需要状态信息或者包含多方的。

  

举例来说,追踪状态的智能合约,并且基于它处理不同的任务。UTXO的无状态模型会让转账包含状态信息,而且这也不必要地符合合约的设计。

  

效率- 除了简单化,账户/余额模型更加有效,因为每个转账都只需要来验证发出金额的账户是否有足够的余额来支付转账。

  

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

  

和大多数计算机架构相同,这两个模型都有自己的好处和坏处。有些区块链,例如超级账本,也应用了UTXO,因为他们从比特币区块链中获得创新。接下来,我们来看看更多的基于这两个模型的技术。

  

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

  

我们来深入看看,状态,存储和转账的树结构是怎样的。

  

状态前缀树- 是唯一和独特的。

  

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

  

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

  

网络状态前缀树包含秘钥和每个账户的价值对,这些是在以太坊网络上。

  

秘钥是单个160字节的认证器(以太坊账户的地址)。

  

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

  

-随机数

  

-余额

  

-storageRoot

  

-codeHash

  

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

  

  

  

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

  

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

  

  

转账前缀树- 每个区块都有一个

  

每个以太坊区块都有自己独立的转账前缀树。一个区块会包含很多转账。区块中的转账顺序当然是由矿工来决定的。对于转账前缀树中的特殊转账路径,是通过这个转账在区块中的位置因子。挖矿区块不会更新;转账在区块中的位置不会改变。这意味着一旦你在区块转账前置树中定位了转账,你可以返回到同样的路径来获得同样的结果。

  

  

分析以太坊数据库

  

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

  

状态前缀树

  

存储前缀树

  

转账前缀树

  

回执前缀树

  

为了得到某个特定区块中的MPT,我们需要获得它的跟哈希,作为参考。以下的命令可以让我们获得状态,转账和创世区块中回执的根哈希。

  

  

注意:如果你想得到最新区块(而不是创世区块)的根哈希,请使用以下命令。

  

安装npm,节点,level和ethereumjs

  

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

  

cd ~

  

sudo apt-get update

  

sudo apt-get upgrade

  

curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash - sudo apt-get install -y nodejs

  

sudo apt-get install nodejs

  

npm -v

  

nodejs -v

  

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

  

git clone https://github.com/ethereumjs/ethereumjs-vm.git

  

cd ethereumjs-vm

  

npm install ethereumjs-account ethereumjs-util --save

  

从这时候开始,运行以下代码会得到以太坊账户秘钥(会存储在以太坊网络的状态根部)。代码和以太坊leveldb数据库连接,进入以太坊的状态(从区块链的区块中使用stateRoot数值),并且然后可以使用秘钥进入到以太坊网络中的所有账户。

  

//Just importing the requirements

  

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

  

var levelup = require('levelup');

  

var leveldown = require('leveldown');

  

var RLP = require('rlp');

  

var assert = require('assert');

  

//Connecting to the leveldb database

  

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

  

//Adding the "stateRoot" value from the block so that we can inspect the state root at that block height.

  

var root = '0x8c77785e3e9171715dd34117b047dffe44575c32ede59bde39fbf5dc074f2976';

  

//Creating a trie object of the merkle-patricia-tree library

  

var trie = new Trie(db, root);

  

//Creating a nodejs stream object so that we can access the data

  

var stream = trie.createReadStream()

  

//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);

  

});

  

有趣地是,一旦转账发生了,以太坊中的账户只是添加到状态树中(和那个特定账户相关的)。例如,使用“geth account new”创建新的账户不会包含在状态树中包含那个账户;甚至在很多区块被挖出后。但是,如果成功的转账(花费燃料费并且已经包含在挖矿区块)是记录在账户中,然后只有它会出现在状态树中。这是很聪明的逻辑,因为会保护欺诈者无法连续创建新的账户以及使得状态树堵塞。

  

对数据解码

  

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

  

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

  

空的字节(对应NULL)

  

包含17个对象的数组(对应分支)

  

包含2个对象的数组(对应树叶)

  

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

  

以太坊前缀树是通过固定的规则来设计和创建的,最好的检测方法是使用电脑代码。接下来的例子使用了ethereumjs。Ethereumjs很容易安装和使用;它是完美地可以快速对接到以太坊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

  

//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');

  

//Connecting to the leveldb database

  

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

  

//Adding the "stateRoot" value from the block so that we can inspect the state root at that block height.

  

var root = '0x9369577baeb7c4e971ebe76f5d5daddba44c2aa42193248245cf686d20a73028';

  

//Creating a trie object of the merkle-patricia-tree library

  

var trie = new Trie(db, root);

  

var address = '0xccc6b46fa5606826ce8c18fece6f519064e6130b';

  

trie.get(address, function (err, raw) {

  

if (err) return cb(err)

  

//Using ethereumjs-account to create an instance of an account

  

var account = new Account(raw)

  

console.log('Account Address: ' + address);

  

//Using ethereumjs-util to decode and present the account balance

  

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

  

})

  

结论

  

我们已经表现出以太坊有能力来管理状态。这种超前的设计有很多好处。

  

可移动性

  

假设移动设备和物联网设备是很普遍的,未来电商就取决于安全,稳定和快速的移动应用。

  

我们认知到了可移动性的优势,我们也知道区块链大小的逐渐增加是难以置信的。将整个区块链存储在移动设备是不可能的。

  

快速,并且不会损失安全性

  

以太坊状态的设计以及对于修改版的MPT(Merkle Patricia Trie)的使用,提供了很多机会。以太坊前缀树上的每个功能都使用了加密哈希。而且,前缀树根据节点的特殊加密哈希可以用来证明前缀树没有被欺诈。

  

例如,任何对于前缀树的修改,都会完全改变根部哈希。这个加密功能会为轻客户端提供一个机会(那些没有存储整个区块链的设备),从而可以快速地访问区块链。也就是说,账户“0x … 4857”是否有足够的资金来完成对于区块高度“5044866”的转账?

  

速度限制

  

以太坊描述了个很有趣的问题,就是存储账户的概念。想象这种场景,两个用户都可以每天从账户中拿出全部余额的1%。这个观点只在未来规划中提到,但是它却获得了很多兴趣,因为理论上来说,它可以作为以太坊基础协议层的一部分(和必须要作为第二层和第三方钱包相反)。也许你想起了我们之前讨论的比特币UTXO。UTXO对于区块链数据是盲目的,比特币区块链没有存储用户的账户余额。因此,比特币的底层协议层基本上不可能完成任何类型的每日速度限制。

  

消费者的信心

  

我们看到了关于轻客户端的很多开发,更为特别地是,安全、稳定、快速的移动应用,可以和区块链技术交互。

  

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

相关文章