Skip to content

Instantly share code, notes, and snippets.

@YoshihitoAso
Last active May 6, 2018 07:47
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YoshihitoAso/7082fc94137ed9ce5856f33a067087e0 to your computer and use it in GitHub Desktop.
Save YoshihitoAso/7082fc94137ed9ce5856f33a067087e0 to your computer and use it in GitHub Desktop.
ECDSAの署名検証:ECVerify.solの使い方 (※rinkeby testnet で実行してます)

サンプルコントラクトの使い方(ECDSAの署名検証:ECVerify)

  • signer --> 0x9a58141b42eebc98446d2567f5edfa38cfee6778 とする。

  • solidity-sha3 使って、文字列(hogehoge)のSHAを取得する。

  • nodeにログインして以下の通り実行する。

$ node
> const sha3 = require("solidity-sha3");
> var hash = sha3.sha3num('hogehoge');
> console.log(hash);
0xc3e1d90114d961c9a0c1950b764f4631a0c1c6c455c3b5421ef19e0ab0ea17e3
  • 次にWEB3を使って署名を行う。gethのコンソールで以下を実行していく。
> var hash = "0xc3e1d90114d961c9a0c1950b764f4631a0c1c6c455c3b5421ef19e0ab0ea17e3"
> personal.unlockAccount("0x9a58141b42eebc98446d2567f5edfa38cfee6778", "******")
true
> var sig = web3.eth.sign("0x9a58141b42eebc98446d2567f5edfa38cfee6778", hash);
undefined
> sig
"0x7fe65d302678c56e6c5a1aecd0229ffdcffb69c19afdbd935b0ae6444c15b6974a68cb2ed62d4bd43ac5d0e0b328743857f299e482896b15e145fbc83e1d53811c"
> var r = sig.slice(0, 66)
undefined
> r
"0x7fe65d302678c56e6c5a1aecd0229ffdcffb69c19afdbd935b0ae6444c15b697"
> var s = '0x' + sig.slice(66, 130)
undefined
> s
"0x4a68cb2ed62d4bd43ac5d0e0b328743857f299e482896b15e145fbc83e1d5381"
> var v = '0x' + sig.slice(130, 132)
undefined
>  v = web3.toDecimal(v)
28
  • コントラクトとして、以下のようなコードを用意する。
  • コントラクトアドレス: 0x9dbd83195407fd75ba8a4a1571fe8d5868561477 (※2017/8/25最新版)
pragma solidity ^0.4.8;

contract ECVerify {

    event VerifyResult(bool ret, address indexed addr, address indexed recoverAddress);

    function verify(bytes32 hash, uint8 v, bytes32 r, bytes32 s, address signer) returns(bool) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHash = sha3(prefix, hash);

        bool ret = false;
        address recoverAddress = ecrecover(prefixedHash, v, r, s);

        if (recoverAddress == signer)
            ret = true;

        VerifyResult(ret, signer, recoverAddress);

        return ret;

    }
}
  • verify("0xc3e1d90114d961c9a0c1950b764f4631a0c1c6c455c3b5421ef19e0ab0ea17e3",28,"0x7fe65d302678c56e6c5a1aecd0229ffdcffb69c19afdbd935b0ae6444c15b697","0x4a68cb2ed62d4bd43ac5d0e0b328743857f299e482896b15e145fbc83e1d5381","0x9a58141b42eebc98446d2567f5edfa38cfee6778") で実行すると、VerifyResultとして以下が返ってくる。
VerifyResult{
  "ret": true,
  "addr": "0x9a58141b42eebc98446d2567f5edfa38cfee6778",
  "recoverAddress": "0x9a58141b42eebc98446d2567f5edfa38cfee6778"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment