Ens

如何找到所有已註冊的 ENS 域和子域?

  • January 30, 2022

我想確定所有活動的 ENS 域及其子域,從“.eth”開始。

我已經閱讀了 ENS 規範並蒐索了網路,但我還沒有找到一種方法來做到這一點。

所以我懷疑要麼這是不可能的,要麼真的很難?

此外,到目前為止,我一直在使用 go-ethereum 和 github.com/wealdtech/go-ens 來嘗試完成這項工作。

感謝您的任何想法。羅伯特

好吧,我對此很晚了,但是由於沒有人回應,我會試一試!(僅供參考,答案是“真的很難”)

關於 ENS 要實現的一點是,域實際上並不是以明文形式儲存的,而是以散列形式儲存的(它們使用的函式是 namehash)。閱讀:https ://www.npmjs.com/package/eth-ens-namehash

因此,為了做到這一點,您需要:

  1. 查看 ENS 智能合約以確定所有具有域的地址。
  2. 檢索這些地址已註冊的雜湊
  3. 確定可能導致此雜湊的人類可讀名稱

3 是肯定會搞砸你的部分,因為除了預先計算已知值的雜湊並在所有已知的 eth 地址中尋找命中之外,你基本上沒有其他方法可以做到這一點。(蠻力)

然而,由於一些限制,這是可行的:

  1. 註冊域的數量始終是公開的(感謝區塊鏈!),因此您將始終知道地址的數量以及您已將其中多少個地址解碼為人類可讀的。
  2. 註冊域的數量仍然相對較少(40kish),因此蠻力並非完全不可能
  3. 註冊一個比註冊它的地址長的 .eth 是不切實際的……所以至少你可以在你的字典上設置一個上限,它應該涵蓋 99% 的註冊案例。

假設每個新域都是使用合約的setSubnodeRecord()功能創建的ENSRegistry(我相信是這種情況),那麼一種方法是使用NewOwner(bytes32 indexed node, bytes32 indexed label, address owner)日誌。通過查詢NewOwner具有給定node參數的所有日誌,您可以獲得該節點的所有子節點。通過重複應用這種方法,您可以從某個根節點(例如.eth)獲取整個節點樹

ENS合約程式碼來源:https ://github.com/ensdomains/ens/blob/ff0f41747c05f1598973b0fe7ad0d9e09565dfcd/contracts/ENSRegistry.sol#L53

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