Etherscan
使用 ethers.js 告訴 EOA 的合約
我試圖弄清楚給定的地址是否是:
- 契約
- EOA
- 未知
我知道只有合約才能有程式碼。因此,
provider.getCode(address)
返回任何內容,但0x
明確告訴我我正在處理契約的地址。反之僅在鏈的目前狀態方面才是正確的:
provider.getCode(address)
返回0x
可能意味著有人部署了一個合約並立即給了我該合約的地址(在交易被包含在區塊鏈中之前)。這也可能意味著地址是隨機生成的,或者只是包含拼寫錯誤(地址的校驗和沒有發現或者給出的地址恰好都是小寫的)。因此,我不想基於沒有程式碼部署到地址的情況下得出該地址必須屬於 EOA 的結論。我不擔心有人積極嘗試通過部署零大小的合約來破壞系統。但我確實想防止意外的錯誤分類。
我知道只有 EOA 可以發送(非內部)交易。因此,曾經發送過交易的給定地址告訴我它是一個 EOA,我可以使用區塊瀏覽器輕鬆找出它。乙太坊關於
provider.getTransactionCount()
狀態的文件:返回截至 blockTag 的地址曾經發送過的交易數量。該值必須是從地址發送到網路的下一筆交易的隨機數。
然而,實際上它似乎返回了帳戶的 nonce。因此,此函式不能用於判斷給定地址是 EOA。
這個任務甚至可以用醚來完成嗎?我是否必須涉及區塊瀏覽器的 API?
(不,這不是一個自我回答的問題。我很努力地捂著臉。)
解決方案是:如果合約的 tx 計數大於零並且它沒有程式碼,它必須是 EOA,因為給定地址上存在的任何合約(除了故意使用空程式碼部署的合約)都會將地址的 nonce 提高到零以上還填寫地址的程式碼。