Solidity
如何在鏈下簽署消息並在合約方法中驗證它是由特定地址簽署的?
我有一個公鑰/私鑰。我用這些鑰匙發布了一份契約。我希望一些使用者提取令牌/乙太幣,所以我簽署了一些像
{withdraw: 10, nonce:1}
脫鏈這樣的消息。使用者使用此簽名消息呼叫某些withdraw
方法。我怎樣才能用那種withdraw
方法確認我簽署了那條消息?用於簽署消息的 Python 或 PHP 都可以。
您正在尋找“元交易”概念。
一般的想法和通常的方法是:
- 在鏈下組織交易參數並對值進行雜湊處理。
- 對鏈下雜湊進行簽名,例如 MetaMask。
- 現在將參數和簽名組合成一條消息並將其發送給中繼器。
必須有人將其發送到區塊鏈,並且必須為簽名者探勘合約。中繼者通常被認為是不可知的,但他們支付 gas 並將交易發送到其目的地合約。
接收合約必須知道元交易,以便它可以解釋這個包並正確響應。它通常會:
- 解包參數並自行計算出消息雜湊必須是什麼。
- 使用給定的簽名參數和計算的雜湊來確定簽名者地址
ecrecover
。- 使用派生地址代替
msg.sender
進行。- 這樣的契約可能會提示中繼者(
msg.sender
)創建一個補償所投資天然氣的商業模式。這裡有一個例子突出了一個棘手的實現細節。該範例使用 OpenZeppelin ECDCA 庫 - 一個很好的起點。使用 web3 簽署消息並使用 openzeppelin-solidity ECDSA.sol 進行驗證
希望能幫助到你。