Erc-721

用作簽名的按位異或

  • March 13, 2018

在從loom-network medium post連結的範例 ERC721 合約中,我看到了以下程式碼:

bytes4 constant InterfaceSignature_ERC721 =
   bytes4(keccak256('name()')) ^
   bytes4(keccak256('symbol()')) ^
   bytes4(keccak256('totalSupply()')) ^
   bytes4(keccak256('balanceOf(address)')) ^
   bytes4(keccak256('ownerOf(uint256)')) ^
   bytes4(keccak256('approve(address,uint256)')) ^
   bytes4(keccak256('transfer(address,uint256)')) ^
   bytes4(keccak256('transferFrom(address,address,uint256)')) ^
   bytes4(keccak256('tokensOfOwner(address)')) ^
   bytes4(keccak256('tokenMetadata(uint256,string)'));

為什麼要使用按位 XOR ( ^) 運算將這些值連接在一起?

我知道這是一種將所有這些雜湊“混合”在一起的廉價而有效的方法,但我不確定這在碰撞和其他怪異方面是否“安全”,這是標準做法還是只是一個簡單的黑客攻擊在一個可能安全的“獨特”簽名?

程式碼來源:https ://ethfiddle.com/09YbyJRfiI 上的第 481 行

我不確定這是否是一種可能安全的方法,但在Google搜尋一段時間後,似乎 XOR 通常被認為“足夠好”。

這個stackoverflow答案有很多關於這個話題的討論:https ://stackoverflow.com/questions/5889238/why-is-xor-the-default-way-to-combine-hashes

如果有人能找到的話,我真的很想讀一篇關於組合雜湊策略的學術論文。

請參閱 ERC-165 中的標準介面檢測。(我是這方面的作者。)

https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md

定義是:

我們將介面標識符定義為介面中所有函式選擇器的異或。

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