Cryptography
我可以用 EIP712 儲存一個“真正私有”的變數嗎?
我在 open zepplin 中遇到過 EIP712 實用程序。我還在這裡找到了一份使用草稿版本的契約。我已經將他們的契約修改為更類似於我想做的事情。
我很好奇在鏈上儲存一些東西的雜湊值並在以後揭示它。無論如何都可以操縱我下面的範常式式碼嗎?即在使用者顯示之前檢索“myParam”?
contract MyContract is EIP712 { mapping(address => bytes32) public digests; mapping (address => uint256) nonces; function storeDigest(address owner, uint256 myParam, uint256 deadline) { digests[msg.sender] = _hashTypedDataV4(keccak256(abi.encode( keccak256("MyFunction(address owner,uint256 myParam,uint256 nonce,uint256 deadline)"), owner, myParam, nonces[owner], deadline ))); } function revealMyParam( bytes memory signature, address owner, uint256 myParam, uint256 deadline ) external { bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( keccak256("MyFunction(address owner,uint256 myParam,uint256 nonce,uint256 deadline)"), owner, myParam, nonces[owner], deadline ))); require(digests[msg.sender] == digest, "different digest") address signer = ECDSA.recover(digests[msg.sender], signature); require(signer == owner, "MyFunction: invalid signature"); require(signer != address(0), "ECDSA: invalid signature"); require(block.timestamp < deadline, "MyFunction: signed transaction expired"); nonces[owner]++; _doSomethingWithMyParamSinceItIsNowRevealed(owner, myParam); } }
我會說是的,它可以在揭露之前被揭露。合約本身很好,但是當您的使用者呼叫 時
storeDigest
,該myParam
屬性在 mempool / 稍後在 etherscan 中公開可見。因此,如果攻擊者可以找到儲存的 tx,他/她可以看到純參數值。也許您想在鏈下創建雜湊並將其傳遞給合約。然後在揭示階段,您發送明文值並讓合約將原始雜湊(來自儲存階段)與來自明文值的計算雜湊值進行比較。您可以在用於鏈上投票的 commit-reveal 模式下找到有關此主題的更多資訊。