Addresses
msg.sender 和時間戳的 Keccak256:輸出重合的可能性有多大?
讓我們考慮一下這段程式碼:
function publishEtherBox (bytes32 _label, string _ownerUrl, uint _lifespan) external onlyWhenRunning() payable { require(ownerToEtherBoxes[msg.sender].length < 10); assert(bytes(_ownerUrl).length <= 200); address etherBoxAddress = address(keccak256(msg.sender, now)); ownerToEtherBoxes[msg.sender].push(etherBoxAddress); etherBoxes[etherBoxAddress] = EtherBox({ label: _label, owner: msg.sender, ownerUrl: _ownerUrl, expiration: now + _lifespan }); emit EtherBoxPublished(msg.sender, nicknames[msg.sender], etherBoxAddress, _label, now); if(msg.value > 0){ owner.transfer(msg.value); } }
參考第 4 行,很明顯,如果來自同一 msg.sender 的多個事務在同一時間戳上打包在同一塊中,則可能導致輸出重合。如何避免這種情況以及使用漸進式隨機數而不是現在獲得相同行為的機會是什麼?
如果同一個賬戶在同一個區塊中呼叫這個函式兩次,那麼
keccak256(msg.sender, now)
返回相同值的機率是 100%。如果你散列一個每次
publishEtherBox
呼叫都會增加的隨機數,那麼發生衝突的機率大約為 0%。你需要 20 字節的雜湊輸出,這是乙太坊本身用來生成帳戶的。數學表明幾乎不可能生成重複帳戶,因此etherBoxAddress
如果您使用隨機數,您幾乎不可能成為重複帳戶。