實現鏈下默克爾樹
我對 Merkle Tree 及其工作原理有了基本的了解,現在我將它作為白名單驗證實施到我的智能合約中。
我將根儲存在智能合約中,在智能合約中實現了驗證功能(以證明為參數)。
為了與智能合約進行驗證,我們將呼叫智能合約中的驗證函式,並傳入證明。現在這就是困擾我的地方。為了得到證明,我們需要整個葉子列表,生成一棵樹,然後得到證明。
實現這一點的最佳方法是什麼?我有幾個想法。
- 生成樹,並獲取每個葉子的證明,儲存在鍵值對中。當葉子(key)需要驗證時,獲取proof(value)並發送到智能合約進行驗證。
- 每次使用者要求證明時生成樹。
大多數教程都沒有顯示鏈下部分。
希望您能夠幫助我。
謝謝。
如果葉子集合是不可變的,這意味著一旦生成它們就不會改變(不會添加新的葉子)。然後,您可以在需要時生成特定休假的證明,然後將其記憶體。僅在需要時生成證明,然後如果您知道它會經常使用,則可以將其記憶體。如果沒有,則不需要記憶體它,它可以在需要時生成。
如果要經常使用任何葉子,那麼您可以創建樹並將其持久化/記憶體在某處,因此,當有人想要為特定葉子生成證明時,他們可以
O(log n)
及時完成,這真的是高效的。現在,問題是如果要向集合中添加更多葉子,那麼葉子集合是否會是可變的。因為您將無法簡單地生成樹一次並重用它。如果葉子集已被修改,則每次要為葉子生成證明時都需要生成樹,因為根顯然會改變。
如果葉子集合是可變的,那麼合約需要知道根何時更改並更新其根
這是區塊鏈的優勢之一,因為交易儲存在一個不可變的塊中,所以每次不需要時都不需要生成 Merkle 樹。因此,請檢查您的需求並驗證葉子集是否不可變,或者您是否可以採取其他措施來確保它們不會可變。
結論
如果葉子集是不可變的,則只生成一次樹,並且需要
O(log n)
為任何葉子生成證明。這是有效的,可以隨時完成。保存每次休假的證明很費空間。如果您儲存 Merkle 樹,則無需這樣做,因為從中生成任何證明非常有效。
沒有必要每次都生成樹然後證明,除非葉子集是可變的,我不建議你保留一個可變的葉子集。檢查您是否可以以某種方式避免它是可變的,並在需要時將它們組織在“塊”中。