問題一覧に戻る
上級セキュリティパターン
問題81: 署名検証

SolidityのECDSA署名検証を学習 - オフチェーン承認とメタトランザクションを可能にします。デジタル署名は秘密鍵を明かすことなくメッセージの真正性を証明。ecrecover関数がハッシュと署名コンポーネント(v,r,s)から署名者アドレスを復元。これによりガスレストランザクション、オフチェーン許可、高度な認証パターンが可能に。署名検証の理解はモダンDeFiプロトコル、ウォレット連携、UX改善に重要です。

pragma solidity ^0.8.0;

contract SignatureVerify {
// 署名から署名者を復元
function verify(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) public pure returns (address) {
return (, v, r, s);
}

// オフチェーン承認パターン
function permit(
address owner,
address spender,
uint256 value,
bytes memory signature
) public {
bytes32 digest = keccak256(
abi.encodePacked(owner, spender, value)
);

// 署名をコンポーネントに分割
(uint8 v, bytes32 r, bytes32 s) = (signature);

address signer = ecrecover(digest, v, r, s);
require(signer == , "Invalid signature");
}

// 署名をコンポーネントに分割
function splitSignature(bytes memory sig)
internal
pure
returns (uint8 v, bytes32 r, bytes32 s)
{
require(sig.length == , "Invalid signature length");

assembly {
r := mload(add(sig, 32))
s := mload(add(sig, 64))
v := byte(0, mload(add(sig, 96)))
}
}
}