-
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"
}