1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Solidityのecrecover()の使い方

Last updated at Posted at 2023-06-14

ecrecover()

ecrecoverは、EthereumのSolidityプログラミング言語で使用される組み込み関数で、Elliptic Curve Digital Signature Algorithm (ECDSA) から公開鍵を復元します。主にメッセージが特定のアカウントから署名されたことを確認するために使用されます。

詳細については、関数は以下のパラメータを取ります:

  • hash: 署名するメッセージのKeccak256ハッシュ
  • v, r, s: ECDSA署名のコンポーネント

ecrecover関数は、署名したアカウントのアドレスを返します。このアドレスを比較することにより、署名が正当であること、つまりメッセージが特定のアカウントから発信されたことを確認できます。

次の例は、署名者がメッセージを署名したことを検証する方法を示しています:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ECRecoverDemo {
    function recover(bytes32 hash, bytes memory sig) public pure returns (address) {
        bytes32 r;
        bytes32 s;
        uint8 v;

        // Check the signature length
        if (sig.length != 65) {
            return (address(0));
        }

        // Divide the signature in r, s and v variables
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }

        // Version of signature should be 27 or 28, but 0 and 1 are also possible versions
        if (v < 27) {
            v += 27;
        }

        // If the version is correct return the signer address
        if (v != 27 && v != 28) {
            return (address(0));
        } else {
            // solhint-disable-next-line arg-overflow
            return ecrecover(hash, v, r, s);
        }
    }
}

このコードは、recover関数を定義し、それは署名されたメッセージのハッシュと署名そのものをパラメータとして受け取ります。関数は署名を分解し、それをecrecoverに渡して署名者のアドレスを取得します。これは特定のアカウントがメッセージを署名したことを確認するために使用されます。

See also:

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?