Go-Ethereum
我不能再在完全同步模式下通過 RPC 訪問舊塊?
我有一個基於 geth v1.9.25 的專用網路。我從 v1.8.27 升級。最近,我看到我根本無法訪問以前的塊。就像,例如
eth.getBlockByNumber(1)
給了我null
,即使我可以得到最新的塊就好了。我對此有幾個問題:
- 這和以前的區塊的遠古深度凍結有什麼關係嗎?如果是這樣,是否可以 a、禁用它(在配置中找不到任何相關內容)和 b、將凍結的塊恢復/帶回/將它們從古代數據庫中解凍到活動數據庫中?我正在研究
debug
選項,但我似乎找不到任何像我正在尋找的東西。- 這是否意味著“完全”同步不會跟踪塊?我知道這
gcmode=archive
是完整狀態持久性所必需的,但我的印syncmode=full
像是至少會持久化整個區塊鏈(所有塊)。我已經閱讀了EVM 跟踪,並沒有發現任何與我的理解相矛盾的東西。更新@ 4 月 29 日
這似乎不是geth的正常行為。我已經通過 geth v1.9.25 和 rinkeby 鏈的實驗證實了這一點。所以我的版本有問題(我已將 Quorum 的共識引入 v1.9.25)。
**更新:**我原本以為 OP 的問題是關於儲存狀態的,但後來意識到即使是塊頭似乎也不可用。對答案進行了一些編輯以反映這一點,但仍保留其一般格式,以幫助任何可能擁有標題但想知道他們的狀態去了哪裡的人。
全節點驗證整個鏈,但它們不會保留其整個狀態。我相信不同的客戶端會保留不同的數量,但它們的共同點是,如果不執行存檔節點,狀態就不會被持久化。查看 Geth 儲存狀態的時間長度,我找到了對“3 epochs”的引用(在下面連結的部落格文章中),並且我發現對 epoch 的引用是 30,000 個塊,這意味著 Geth 將儲存最後 90K 塊的狀態。如果有人知道關於這一點的更準確資訊,請指出。
更直接地回答您的問題:
- 只有抬頭和收據進入冰箱,而不是狀態源。如果僅缺少狀態,則根本不是問題-一切都按應有的方式執行(見下文)。如果標題失去,則冰箱中可能存在一些損壞。不幸的是,這意味著重新同步 afaik - 沒有辦法重新生成冷凍機。在 OP 的情況下,如果整個專用網路同時升級並經歷相同的損壞,這可能會更成問題。
- 完整(非歸檔)節點不會跟踪所有塊的所有狀態,但會保留所有標題和收據。所以我想答案是肯定的和否定的——它保留了舊塊的一部分(足以跟踪區塊鏈,並驗證有關實際塊的數據),但不是該塊的狀態。