Solidity
在兩個映射中儲存相同的結構
我有一個這樣的構造:
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) 來找到位置。
也就是說,映射不包含指向值的指針。映射是將任意鍵轉換為指向值的指針的方法。對於兩個不同的映射鍵指向記憶體中的相同位置,因此共享一個值,在天文數字上是不可能的。
但是有一個解決方法。
Let
map1
和map2
be 地址到 uint 的映射。然後,使用 someStructs 的動態數組或 uint 到 someStructs 的映射。將實際結構儲存在後一個數組或映射中。使用 和 的 uintsmap1
作為map2
一種指向所述結構的自製指針。這最終不應該使用更多的氣體。