首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获得智能合同的完整状态

获得智能合同的完整状态
EN

Ethereum用户
提问于 2018-02-20 06:06:48
回答 1查看 2.3K关注 0票数 11

从黄纸上,我发现一个合同有4个组成部分: 1. nonce,2. balance,3.代码,4.存储。要了解智能契约的当前状态,我们需要了解智能契约的所有这些组件。

如果我使用geth客户端来获取智能契约的状态,我可以使用

1.eth.getBalance(地址)获取合同余额

获取合同代码的2.eth.getCode(地址)

3.eth.getTransactionCount(地址)

4.类似地,eth.getStorageAt(地址、索引)用于在特定索引中获取存储。

我既无法立即下载完整的存储,也无法直接下载契约的完整状态。

那么,有什么方法可以获得合同的完整状态吗?

关于完全状态的问题已经被问到了这里,但是答案并不是很有帮助。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2018-02-20 07:42:51

没有办法通过JSON或使用JSON实现它。

我使用一个示例创建了一个在Github上的存储库,演示如何使用nodejs https://github.com/medvedev1088/ethereum-merkle-patricia-trie-example读取块中和任何合同存储中的所有Patricia条目

代码语言:javascript
复制
var Trie = require('merkle-patricia-tree');
var rlp = require('rlp');
var levelup = require('levelup');
var leveldown = require('leveldown');
var db = levelup(leveldown('/your_home_dir/Library/Ethereum/rinkeby/geth/chaindata'));
var keccak256 = require('js-sha3').keccak256;

// the block state root, rinkeby, block number 1775804
// the block state root can be obtained by invoking web3.eth.getBlock(<blockNumber>) in `stateRoot` field
var root = '0xe4a6ff741ec2e0d0cd274a745756028df27312161bdb4557b6da434349f716a9';
var trie = new Trie(db, root);

trie.checkRoot(root, function (err, val) {
  console.log('Root exists:', val);
});

var address = '398A7A69f3c59181A1ffe34bed11DCb5DF863A8a';
var addressHash = keccak256(new Buffer(address, 'hex'));

trie.get('0x' + addressHash, function (err, val) {
  var decodedVal = rlp.decode(val);
  console.log(decodedVal);

  if (!decodedVal || decodedVal.length < 4) {
    console.log('The value for the address must be an array of 4 elements');
    return;
  }

  // 3rd element in the array is storage root, 1st - nonce, 2nd - balance, 4th - codeHash
  var storageRoot = decodedVal[2];
  console.log('storageRoot', storageRoot);

  trie.root = storageRoot;

  trie.checkRoot(storageRoot, function (err, val) {
    console.log('Storage root exists:', val);
  });

  // Read storage slot with index 0

  var slotZeroHash = keccak256(new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex'));
  trie.get('0x' + slotZeroHash, function (err, val) {
    var decodedVal = rlp.decode(val);
    console.log('Value at slot 0: ', decodedVal);
  });

  // Read all entries from contract storage

  var stream = trie.createReadStream();

  stream.on('data', function (data) {
    console.log('key:' + data.key.toString('hex'));

    // values are rlp encoded
    var decodedVal = rlp.decode(data.value);
    console.log(decodedVal);
  });

  stream.on('end', function (val) {
    console.log('done reading!');
  });
});

示例输出:

代码语言:javascript
复制
Root exists: true
Account data: 398A7A69f3c59181A1ffe34bed11DCb5DF863A8a [ <Buffer 01>,
  <Buffer >,
  <Buffer 24 21 83 63 90 de b4 32 ce 0e ac fe 5f 49 be 88 99 17 bf 8a fa 07 72 24 1c 30 9e 61 e0 4a 0d 42>,
  <Buffer 61 60 55 49 c9 7c 3e 7a d6 68 63 3b 72 b2 60 d3 00 5e ab be f3 22 a2 d6 33 2a 49 76 80 89 77 7a> ]
Storage root: <Buffer 24 21 83 63 90 de b4 32 ce 0e ac fe 5f 49 be 88 99 17 bf 8a fa 07 72 24 1c 30 9e 61 e0 4a 0d 42>
Storage root exists: true
Value at slot 0 - key: 290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563
<Buffer 40 9f 9c d8 52 a3 ba e9 52 5d 2a aa>
key:0205d9ce8b4a26409d40486b0ac7b8dc356714e840016b19cc5c0f2c8adbcd74
<Buffer 36 35 c9 ad c5 de a0 00 00>
key:0249d346d51fad5ef0b6fae89b4907e63c831f4f8af088d602baef47cda4eab7
<Buffer 0a 07 64 07 d3 f7 44 00 00>

有趣的是,这些数据几乎毫无用处,因为您不知道时隙索引(您只能看到它们的散列),也不知道值的数据类型。至少你知道合同占用了多少储藏室。

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

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

复制
相关文章

相似问题

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