Solidity

我無法完全理解 nonce 在solidity 範例中的用法

  • September 15, 2022

我正在閱讀來自solidity docs的一些範例:docs。我遇到了這個功能:

function claimPayment(uint256 amount, uint256 nonce, bytes memory signature) external {
       require(!usedNonces[nonce]);
       usedNonces[nonce] = true;

       // this recreates the message that was signed on the client
       bytes32 message = prefixed(keccak256(abi.encodePacked(msg.sender, amount, nonce, this)));

       require(recoverSigner(message, signature) == owner);

       payable(msg.sender).transfer(amount);
   }

我的問題是:如何處理來自前端的隨機數?它是我使用 Math.random() 生成的隨機數嗎?還是 ethers.js 處理這個?如果是這樣,當我呼叫這個合約函式時,我必須傳遞什麼作為參數?

謝謝。

編輯#1:固定錯字

一般來說,乙太坊中有兩種類型的賬戶。EOA 和契約賬戶。

EOA 是錢包,合約賬戶是用於儲存合約的賬戶。

對於 EOA,nonce 等於 EOA 賬戶發送的交易數量。

而對於合約賬戶,nonce 等於合約賬戶保存的合約數量。

在乙太坊區塊鏈中,一個 EOA 賬戶不能用相同的 nonce 簽署兩個交易,這是為了防止重放攻擊。

您共享的連結中提到了它。

solidity 文件中的合約僅供參考如何驗證簽名。實際上,他們只是試圖解釋我們如何通過 ecrecover 在solidity 中驗證簽名。

如果你想提供唯一的隨機數,你可以在鏈下編寫一個唯一的數字生成器並從前端提供它。

告訴我它是否有幫助!

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