ECDSA 서명 검증 과정

jaewon·2024년 9월 16일

날짜 : 2024-06-21 15:07

주제: #블록체인


메모:

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. 서명자 검증

  1. 트랜잭션 해시 계산
    트랜잭션의 sender, receiver, amount를 abi.encodePacked를 사용하여 바이트 배열로 변환후, keccak256 해시 함수에 전달 -> messageHash

  2. 트랜잭션 해시 검증
    트랜잭션의 해시값과 messageHash값을 비교

  3. 서명자로부터 주소 복원
    erecover 함수로, 트랜잭션 해시와 서명값(v,r,s)을 바탕으로 서명자 복원.
    ecrecover는 해시 값과 서명을 받아 서명한 사람의 주소를 복원

  4. 서명자 검증
    복원된 주소와 트랜잭션 발신자 주소가 일치하는지 확인
    일치하면 서명 유효

출처(참고문헌)

연결문서

  • [[이더리움 상태 업데이트 과정]], [[이더리움 트랜잭션 할 때]], [[L2, rollup 관련 정리(3회 숙제 관련)]]
profile
블록체인, 암호학

0개의 댓글