為什麼乙太坊地址沒有校驗和?
校驗和,類似於它在比特幣地址中的使用,主要可以防止在構造具有無效地址的交易之前使用錯誤輸入或無效地址。
為什麼乙太坊地址沒有校驗和?在 Frontier 推出之前,設計師、審核員和社區是否忽略了這一疏忽?(這個問題更多的是關於歷史,而不是正在進行的和未來的糾正努力。)
編輯補充:正如預測的那樣,隨著乙太坊名稱服務(ENS)的推出,使用者和錢包已經逐漸開始切換到使用像“mywallet.eth”這樣的字元串,而不是原始的十六進制地址。 由於在撰寫此答案時該名稱尚不為人所知,因此它指的是與“namereg”相同的概念。
我可以稍微詳細說明一下,因為這不僅僅是最終使用者最終希望將人類可讀的字元串用於正常的日常事務的事實。你稱之為“乙太坊地址”的原始十六進製字元串甚至不打算成為表示該資訊的標準方式。
您可能知道也可能不知道,當您將比特幣交易發送到諸如1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3之類的“比特幣地址”時,實際交易本身不包含字元串“1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3”。相反,它將該表示解碼為實際地址 0xfc916f213a3d7f1369313d5fa30f6168f9446a2d,這是一種不會在校驗和和版本位上浪費空間的純十六進製表示。看起來熟悉?
確實,純十六進制地址本身不包含任何校驗和。但是沒有什麼能阻止你編寫軟體,它使用與比特幣完全相同的方法來創建基於 58 的字元串編碼,並帶有內置的版本號和校驗和。通過將新的“乙太坊地址”靜默解碼為原始十六進制形式,它將與網路完美互操作。只要您小心始終在原始格式的前麵包含“0x”(無論如何您都應該這樣做),它甚至可以接受這兩種格式。 然後,您可以使用與比特幣完全相同的體驗發送和接收。也許使用不同的版本號,這樣您就不會意外混淆地址,
Vitalik 已經指出了沒有人為大多數 Frontier 應用程序這樣做的原因之一。但還有另一個,更相關。乙太坊應用程序不採用比特幣方法,因為有一種更具特色的方式來表示原始乙太坊地址,稱為ICAP,如下所示:“XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS”。與標準比特幣地址表示一樣,它使用更廣泛的字母數字字元來節省空間並包括校驗和。但這還不是全部,伙計們!
一方面,ICAP 是一個完全有效的國際銀行帳號(或 IBAN)。這意味著現有的銀行軟體可以理解它並與之互動。
另一方面,ICAP 不必使用十六進制地址。相反,一旦我們都切換到使用 namereg 合約,它就可以使用您實際的人類可讀字元串來結束類似“XE81ETHXREGJEFFCOLEMAN”之類的內容,它仍然與銀行格式匹配,但實際上可能會記住!
對 ICAP 的支持正在逐漸增加,包括在官方乙太坊客戶端中。也許很快有一天,乙太坊地址的最常見表示形式將不再缺少校驗和!
編輯: 截至 2016 年 2 月,Vitalik 還實施了一種過渡校驗和方法,其中不區分大小寫的十六進制地址的大寫用於提供一些額外的保護以防止意外錯誤,同時保持與不支持校驗和的軟體的向後兼容(和將忽略大小寫差異)。 強烈建議任何開發支持輸入或顯示原始十六進制編碼的軟體的人實施這種“基於大寫的校驗和”方法。
詳情:
使用Vitalik的方法,地址:
0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826
與地址字節的原始二進制keccack-256 散列進行比較,如果在與“1”位相同的對應位置有字母,則字母大寫(留下與“0”位對應的字母小寫形式,數字不變)。這導致:
0xCd2a3d9f938e13Cd947eC05ABC7fe734df8DD826
幾乎所有不知道校驗和的程式碼都將簡單地忽略上面的大小寫差異,並以與第一個相同的方式解釋此表示,因此實現基於大寫的校驗和幾乎沒有缺點。