首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算在自毁合同后可以节省多少空间。

计算在自毁合同后可以节省多少空间。
EN

Ethereum用户
提问于 2018-03-21 18:39:26
回答 2查看 284关注 0票数 4

我想做一些简短的分析,量化一个人在自我破坏合同时可以释放多少。当自动销毁给定的契约时,如何计算节点可以节省多少空间?

我知道“区块链上没有任何东西被破坏”,但我也明白,如果这个合同现在是自毁的,就没有必要在当地储存合同的状态。没有人可以称此合同为未来的国家trie将永远不受本合同的影响后,自毁,因为状态的合同不能改变(除了ETH发送给它)也不被调用。此外,在自毁代码(即负气体)中建立了一种激励机制,如果节点从销毁合同中一无所获,这种激励就没有任何意义。为什么要为没有好处的事情创造动力呢?解除合同必然会带来潜在的好处。

这是在客户层面处理的吗?如果是这样的话,我假设不同的客户可能会以不同的方式处理自毁合同。在这两种情况下,我如何计算?

例子:看看KyberNetwork大众销售合同,很明显这份合同再也不会被使用了,在大多数象征性的销售合同中也是如此。如果不存储该契约的状态,节点可以释放多少空间?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2018-04-18 12:30:01

https://ethereum.stackexchange.com/a/40280/7457的启发下,我找到了一种相对简单的方法来做到这一点。

在对整个节点进行同步之后,您需要在感兴趣的契约地址上查询状态trie,使用如下所示

代码语言:javascript
复制
//Create database, where dbPath is the path to your data
var db = levelup(leveldown(dbPath));

// Can be obtained with web3.eth.getBlock(<blockNumber>).stateRoot
var ROOT = '0x5e27b33d4fa2349b744f7c80c60f5bcdfa9c0754b7f2be61972b220bf2ec4d78'; // 2092500

//Create trie object
var trie = new Trie(db, ROOT);

// ... 

//Query the contract at 
trie.get('0x' + addressHash, function (err, val) { ... })

然后,您需要解码所获得的值(因为rlp编码了),这样

代码语言:javascript
复制
var decodedVal = rlp.decode(val); 

这将返回4个值,其中第三个值是该特定契约的storageRoot。

指定新的根,我们创建一个readStream来遍历这个状态trie中的所有节点;

代码语言:javascript
复制
// 3rd element in the array is storage root, 1st - nonce, 2nd - balance, var storageRoot = decodedVal[2];

//Set trie root to storageRoot
trie.root = storageRoot;

//Create stream for nodes in trie
 var stream = trie.createReadStream();

然后,您只需读取契约存储trie中的每个子节点,计算它们接收的字节数,并将所有这些值之和;

代码语言:javascript
复制
// Will count the byte size of the contract's storage
var contractStorageSize = 0;

stream.on('data', function (data) {
  // Obtain Buffer value for current storage node
  var decodedValNode = rlp.decode(data.value);

  // Update contract Storage size
  contractStorageSize += decodedValNode.byteLength;
});

可以找到完整的脚本这里

票数 0
EN

Ethereum用户

发布于 2018-03-21 20:25:16

根据的答案,您可以使用assembly { size := extcodesize(addr) }知道地址上的代码的确切大小。对此的解释是这里

因此,您可以在进行自毁之前调用它,并将其作为事件发出,或者将其存储在某个值中。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/43478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档