Erc-721
用作簽名的按位異或
在從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 (
^
) 運算將這些值連接在一起?我知道這是一種將所有這些雜湊“混合”在一起的廉價而有效的方法,但我不確定這在碰撞和其他怪異方面是否“安全”,這是標準做法還是只是一個簡單的黑客攻擊在一個可能安全的“獨特”簽名?
我不確定這是否是一種可能安全的方法,但在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
定義是:
我們將介面標識符定義為介面中所有函式選擇器的異或。