Dapp-Development

如何在 Solidity 中創建可迭代的 key->value 結構?

  • April 13, 2016

我正在嘗試為使用者創建一個框架來提供通用商品進行銷售。例如,一個通用商品(一個 Gizmo)可能有 14 個人以不同的價格在世界不同地區銷售。為了實現這一點,我需要管理一個價格列表,保存在儲存中,可以由 web3.js 驅動的前端查詢。

最好是映射之類的東西:

uint productId;  // Set automatically for each product
uint memberId;  // Set automatically at join
uint price;  // Prices are in US cents

/* (productId => (memberId => price)) */
mapping (uint => mapping (uint => uint)) priceLedgers;

/* Pseudo-JavaScript below */
for (var i=0, i < priceLedgers[productId].length, i++) {
   // List of members with their prices here.
}

也許另一種解釋我正在嘗試做的事情的方法是使用 Python。

priceOffers = {}
priceOffers[1] = 234
priceOffers[45] = 99392
priceOffers[23] = 111

>>> priceOffers
{1: 234, 45: 99392, 23: 111}

>>> for key, value in priceOffers.iteritems():
   print(key, value)
(1, 234)
(45,99392)
(23, 111)

productId = 34
priceLedgers = {}
priceLedgers[34] = priceOffers

這在 Solidity 中可能嗎?

您可以將映射的索引儲存在數組中。

uint[] indexes;
mapping (uint => uint) example;

function add(uint x){
 example[indexes.length] = x;
indexes.push(indexes.length);
}

然後只需遍歷數組索引作為鍵。

如果你想要自定義無序鍵,它是一樣的。您只需要在 add 函式中傳遞密鑰

function add(uint data,uint index){
 example[index] = data;
 indexes.push(index);
}

這是這種結構的實現: https ://github.com/chriseth/solidity-examples/blob/master/iterable_mapping.sol

引用自:https://ethereum.stackexchange.com/questions/2943