Solidity允许将关联数组与mapping
结合使用:
mapping(address => uint256) balances;
可以编写代码来迭代这个关联数组。但是,如何将所有的键和值输出到终端、网页或可下载的文件中呢?
发布于 2017-08-03 18:17:50
"Solidity允许使用具有映射的关联数组:映射(address => uint256) balances;可以编写代码来迭代这个关联数组。“
我不认为我们有一个预先定义的迭代器来循环映射。答案来自下面的链接,其中引入了一个索引来循环映射。
https://forum.ethereum.org/discussion/1995/iterating-mapping-types
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,你可以用它连接你的合同,如果你需要它的控制台,你可以使用松露控制台。
发布于 2017-08-03 22:54:36
Rangesh展示了一个要点,然后我得到了一个简单的演示。首先,我们创建一个简单的契约MappingTest
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功能。
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在等待矿山开采,然后执行矿井操作。
miner.start(1);admin.sleepBlock(1);miner.stop()
两个txs被打包到新块中,现在我们执行interator函数来显示结果。
> browser_test_sol_mappingtest.iterator()
[["0x0b46c35d2e823f9b1e69ff616f9e9bf2d9d52dd0", "0xc4b232913cb195f649086d1eea0f1eb3fd0ff825"], [1000000000000000000, 1000000000000000000]]
删除、包含、indexOf函数也是一样的。
对于JSON,如何使用eth调用合同方法_调用JSON-RPC将给出详细步骤。
希望这能帮你~
https://ethereum.stackexchange.com/questions/23651
复制相似问题