Solidity

如何在鏈下簽署消息並在合約方法中驗證它是由特定地址簽署的?

  • November 18, 2020

我有一個公鑰/私鑰。我用這些鑰匙發布了一份契約。我希望一些使用者提取令牌/乙太幣,所以我簽署了一些像{withdraw: 10, nonce:1}脫鏈這樣的消息。使用者使用此簽名消息呼叫某些withdraw方法。我怎樣才能用那種withdraw方法確認我簽署了那條消息?用於簽署消息的 Python 或 PHP 都可以。

您正在尋找“元交易”概念。

一般的想法和通常的方法是:

  1. 在鏈下組織交易參數並對值進行雜湊處理。
  2. 對鏈下雜湊進行簽名,例如 MetaMask。
  3. 現在將參數和簽名組合成一條消息並將其發送給中繼器。

必須有人將其發送到區塊鏈,並且必須為簽名者探勘合約。中繼者通常被認為是不可知的,但他們支付 gas 並將交易發送到其目的地合約。

接收合約必須知道元交易,以便它可以解釋這個包並正確響應。它通常會:

  1. 解包參數並自行計算出消息雜湊必須是什麼。
  2. 使用給定的簽名參數和計算的雜湊來確定簽名者地址ecrecover
  3. 使用派生地址代替msg.sender進行。
  4. 這樣的契約可能會提示中繼者(msg.sender)創建一個補償所投資天然氣的商業模式。

這裡有一個例子突出了一個棘手的實現細節。該範例使用 OpenZeppelin ECDCA 庫 - 一個很好的起點。使用 web3 簽署消息並使用 openzeppelin-solidity ECDSA.sol 進行驗證

希望能幫助到你。

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