Solidity

垃圾收集

  • February 22, 2017

對於一個項目,我為一個樹建模,每個節點都有一些關聯的數據。該樹的一個屬性是,在某些情況下,一個節點可以被刪除,這會自動使它所代表的整個子樹變得無用,並且它也可以被刪除。

通常這棵樹很小,但偶爾它們是較大的樹,尤其是對手可能會強迫一棵大樹。目前,樹節點在從 uint -> treeNode 的映射中表示為結構,該結構包含表示其子級的數據 uint。

我現在的問題是,當我遞歸地刪除整個子樹時,我很快就會遇到氣體問題,因為重新找到的只是在最後返回,而最大可能的重新找到是已用氣體的一半。

作為一種解決方案,我只刪除一個節點而不是它的子節點,並確保沒有兩個節點獲得相同的映射鍵。

但我真的不喜歡在區塊鏈上留下這麼多垃圾,但它的設計方式(最多一半已使用重新發現)我大部分時間都為刪除節點而不是拿回一些東西和真正罕見的東西付費(除了涉及諮詢)大樹枝我用完了氣體(氣體限制),因此這不是一個選擇,因為對手可能會使契約無用。

他們是一種擺脫區塊鏈中垃圾的方法,而不會讓使用者支付巨額費用並給對手攻擊機會嗎?

(所有這些範例都假定以某種方式將節點標記為“死”而不立即刪除它。)

一種可能性是,在每次“正常”交易期間,刪除足夠多的節點以最大化退款。因此,普通使用會慢慢消除狀態的膨脹。您必須計算金額,而且可能並不准確(即使是這樣,未來汽油價格也有可能發生變化。)

另一種可能性是相同的,只是您使用前端來計算要刪除的節點。這可能會使您的程式碼稍微複雜化,但它會更有效。

另一個(這可能是最簡單的)是跟踪列表中的死節點,然後重用它們。具體來說,當您不再需要某個節點時,將其推送到死列表中。當你需要一個新節點時,首先檢查死列表,然後嘗試覆蓋它。您也可以通過將他們推到死亡名單上來處理現在成為孤兒的孩子。本質上,您會隨著時間的推移遞歸刪除,而不是一次全部刪除。

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