Web3js

簽署交易參數伺服器端,然後使用 Metamask 簽署交易

  • March 11, 2022

我在幣安智能鏈 (BSC) 上創建了一份供應有限的合約 (ERC-20)。

我希望我的使用者能夠從他們在我的網站上賺取的錢包合約中領取一些代幣(伺服器決定他們可以領取多少代幣),但我希望我的使用者支付交易費用。

如果我理解正確,為此我需要我的伺服器使用契約私鑰簽署參數交易(包含使用者被允許索取的硬幣數量及其目標地址的參數),然後將簽署的參數傳遞給使用者所以他可以在 Metamask 中籤署交易並支付發送費用。

然後合約必須能夠以某種方式檢索/解碼參數,以了解要提供多少代幣以及給誰。

這是正確的方法嗎?我沒有找到任何好的資源來解釋這一點。我已經設法處理了其他所有事情(存款、確認、簽署交易……)。

我在伺服器(nodejs)和客戶端(js)端都使用web3。

我認為您的方法是正確的(考慮到您編寫的要求,我也會這樣做)。

檢查EIP-712以了解它是如何工作的(OpenZeppelin 提供了一個實現)。

只需要注意:你的合約還應該記住使用者認領了代幣,我會bytes signature => bool alreadyClaimed在合約中儲存一個映射變數來做到這一點。

是的,你的推理是正確的。您可以通過此連結找到一種方法:https ://solidity-by-example.org/signature/

您的伺服器將準備一個請求,使用您的私鑰使用 javascript 對其進行簽名。然後,您將請求連同簽名一起傳遞給使用者,他們將在元遮罩中執行。合約將檢查簽名是否有效,如果有效,將執行交易(在這種情況下,將代幣發送給使用者)

你必須非常小心地使用這個算法。最近,一個 NFT 遊戲由於未能使用該算法而損失了 25 萬美元。參見例如這個 hack -> <https://solidity-by-example.org/hacks/signature-replay/>

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