Cryptography

我可以用 EIP712 儲存一個“真正私有”的變數嗎?

  • October 12, 2021

在 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 模式下找到有關此主題的更多資訊。

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