首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何输出合同映射变量中的所有数据

如何输出合同映射变量中的所有数据
EN

Ethereum用户
提问于 2017-08-03 16:47:46
回答 2查看 6.2K关注 0票数 0

Solidity允许将关联数组与mapping结合使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mapping(address => uint256) balances;

可以编写代码来迭代这个关联数组。但是,如何将所有的键和值输出到终端、网页或可下载的文件中呢?

EN

回答 2

Ethereum用户

发布于 2017-08-03 18:17:50

"Solidity允许使用具有映射的关联数组:映射(address => uint256) balances;可以编写代码来迭代这个关联数组。“

我不认为我们有一个预先定义的迭代器来循环映射。答案来自下面的链接,其中引入了一个索引来循环映射。

https://forum.ethereum.org/discussion/1995/iterating-mapping-types

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mapping (address => uint) accountBalances;
mapping (uint => address) accountIndex;
uint accountCount;
function iterateAccountsBalances()
{
    for(uint i=0;i<accountCount;i++)
    {
        doSomeStuff(accountBalances[accountIndex[i]]);
    }
}

在上述情况下,accountIndex是使顺序访问成为可能的索引。

但是,如何将所有的键和值输出到终端、网页或可下载的文件中呢?

做这件事有不同的方法,如果你需要Web3,你可以用它连接你的合同,如果你需要它的控制台,你可以使用松露控制台。

票数 4
EN

Ethereum用户

发布于 2017-08-03 22:54:36

Rangesh展示了一个要点,然后我得到了一个简单的演示。首先,我们创建一个简单的契约MappingTest

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
contract MappingTest {

  CustomMap balances;

  struct CustomMap {
     mapping (address => uint) maps;
     address[] keys;
  }

  function put() payable public {
     address sender = msg.sender;
     uint256 value = msg.value;
     bool contain = contains(sender);
     if (contain) {
       balances.maps[sender] = balances.maps[sender] + value;
     } else {
       balances.maps[sender] = value;
       balances.keys.push(sender);
     }
  }

  function iterator() constant returns (address[],uint[]){
      uint len = balances.keys.length;
      address[] memory keys = new address[](len);
      uint[] memory values = new uint[](len);
      for (uint i = 0 ; i <  len ; i++) {
         address key = balances.keys[i];
         keys[i] = key;
         values[i] = balances.maps[key];
      }
      return (keys,values);
  }

  function remove(address _addr) payable returns (bool) {
      int index = indexOf(_addr);
      if (index < 0) {
          return false;
      }
      delete balances.maps[_addr];
      delete balances.keys[uint(index)];
      return true;
  }

  function indexOf(address _addr) constant returns (int) {
    uint len = balances.keys.length;
    if (len == 0) {
        return -1;
    }
    for (uint i = 0 ; i < len ;i++) {
      if (balances.keys[i] == _addr) {
          return int(i);
      }
    }
    return -1;
  }

  function contains(address _addr) constant returns (bool) {
      if (balances.keys.length == 0) {
         return false;
      }
      uint len = balances.keys.length;
      for (uint i = 0 ; i < len ; i++) {
          if (balances.keys[i] == _addr) {
            return true;
          }
      }
      return false;
  } 

}

然后编译,按geth部署契约。现在,我们解锁帐户,然后执行put功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
browser_test_sol_mappingtest.put({from:eth.accounts[0],value:web3.toWei(1,'ether')})
browser_test_sol_mappingtest.put({from:eth.accounts[1],value:web3.toWei(1,'ether')})

现在,有两个txs在等待矿山开采,然后执行矿井操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
miner.start(1);admin.sleepBlock(1);miner.stop()

两个txs被打包到新块中,现在我们执行interator函数来显示结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> browser_test_sol_mappingtest.iterator()
[["0x0b46c35d2e823f9b1e69ff616f9e9bf2d9d52dd0", "0xc4b232913cb195f649086d1eea0f1eb3fd0ff825"], [1000000000000000000, 1000000000000000000]]

删除、包含、indexOf函数也是一样的。

对于JSON,如何使用eth调用合同方法_调用JSON-RPC将给出详细步骤。

希望这能帮你~

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

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

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文