Etherscan

使用 ethers.js 告訴 EOA 的合約

  • March 29, 2022

我試圖弄清楚給定的地址是否是:

  • 契約
  • EOA
  • 未知

我知道只有合約才能有程式碼。因此,provider.getCode(address)返回任何內容,但0x明確告訴我我正在處理契約的地址。

反之僅在鏈的目前狀態方面才是正確的:provider.getCode(address)返回0x可能意味著有人部署了一個合約並立即給了我該合約的地址(在交易被包含在區塊鏈中之前)。這也可能意味著地址是隨機生成的,或者只是包含拼寫錯誤(地址的校驗和沒有發現或者給出的地址恰好都是小寫的)。因此,我不想基於沒有程式碼部署到地址的情況下得出該地址必須屬於 EOA 的結論。

我不擔心有人積極嘗試通過部署零大小的合約來破壞系統。但我確實想防止意外的錯誤分類。

我知道只有 EOA 可以發送(非內部)交易。因此,曾經發送過交易的給定地址告訴我它是一個 EOA,我可以使用區塊瀏覽器輕鬆找出它。乙太坊關於provider.getTransactionCount()狀態的文件:

返回截至 blockTag 的地址曾經發送過的交易數量。該值必須是從地址發送到網路的下一筆交易的隨機數。

然而,實際上它似乎返回了帳戶的 nonce。因此,此函式不能用於判斷給定地址是 EOA。

這個任務甚至可以用醚來完成嗎?我是否必須涉及區塊瀏覽器的 API?

(不,這不是一個自我回答的問題。我很努力地捂著臉。)

解決方案是:如果合約的 tx 計數大於零並且它沒有程式碼,它必須是 EOA,因為給定地址上存在的任何合約(除了故意使用空程式碼部署的合約)都會將地址的 nonce 提高到零以上還填寫地址的程式碼。

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