Solidity

在兩個映射中儲存相同的結構

  • July 30, 2017

我有一個這樣的構造:

var s = SomeStruct(a, b);
map1[addr1] = s;
map2[addr2] = s;

…並希望兩個地圖都指向相同的數據。

現在如果我以後做

map1[addr1].field1 = x;

… 然後map2[addr2].field1仍然返回初始值而不是 x - 這表明在最初分配給地圖時創建了 2 個數據副本。

問題:如何避免這種重複?

沒有一種簡單的方法可以直接做到這一點。來自solidity docs

根據上述規則(或通過遞歸地將此規則應用於映射或數組的數組),映射或動態數組本身在某個位置 p 處佔用儲存中的(未填充的)槽。對於動態數組,此槽儲存數組中元素的數量(字節數組和字元串在這裡是一個例外,見下文)。對於一個映射,該槽是未使用的(但它是必需的,以便彼此之後的兩個相等的映射將使用不同的散列分佈)。數組數據位於 keccak256(p),映射鍵 k 對應的值位於 keccak256(k . p),其中 . 是串聯。如果該值再次是非基本類型,則通過添加偏移量 keccak256(k . p) 來找到位置。

也就是說,映射不包含指向值的指針。映射是將任意鍵轉換為指向值的指針的方法。對於兩個不同的映射鍵指向記憶體中的相同位置,因此共享一個值,在天文數字上是不可能的。

但是有一個解決方法。

Letmap1map2be 地址到 uint 的映射。然後,使用 someStructs 的動態數組或 uint 到 someStructs 的映射。將實際結構儲存在後一個數組或映射中。使用 和 的 uintsmap1作為map2一種指向所述結構的自製指針。這最終不應該使用更多的氣體。

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