contract ECDSAVerification {
struct Transaction { address sender;
address receiver;
uint256 amount;
bytes32 hash;
uint8 v;
bytes32 r;
bytes32 s; }
function verifyTransaction(Transaction memory txn) public pure returns (bool) {
// 트랜잭션 해시 계산 bytes32 messageHash = keccak256(abi.encodePacked(txn.sender, txn.receiver, txn.amount));
require(messageHash == txn.hash, "Transaction hash mismatch");
// 서명자로부터 주소 복원
address recoveredAddress = ecrecover(txn.hash, txn.v, txn.r, txn.s); return (recoveredAddress == txn.sender); }
function getMessageHash(address sender, address receiver, uint256 amount) public pure returns (bytes32)
{ return keccak256(abi.encodePacked(sender, receiver, amount)); } }
총 두 번의 검증이 이루어짐 1. 트랜잭션 검증, 2. 서명자 검증
트랜잭션 해시 계산
트랜잭션의 sender, receiver, amount를 abi.encodePacked를 사용하여 바이트 배열로 변환후, keccak256 해시 함수에 전달 -> messageHash
트랜잭션 해시 검증
트랜잭션의 해시값과 messageHash값을 비교
서명자로부터 주소 복원
erecover 함수로, 트랜잭션 해시와 서명값(v,r,s)을 바탕으로 서명자 복원.
ecrecover는 해시 값과 서명을 받아 서명한 사람의 주소를 복원
서명자 검증
복원된 주소와 트랜잭션 발신자 주소가 일치하는지 확인
일치하면 서명 유효