이더리움 계정으로 데이터 서명 및 검증
블록체인 사용자들간에 데이터를 주고받을때, 보내는 사람은 데이터를 서명해서 전달하고 받는 사람은 전달받은 데이터가 올바른 데이터인지를 검증을 하는 과정이 이루어 진다. 이때 비밀키와 공개키를 이용한 작업이 이루어 지는데, 블록체인 사용자는 계정별로 비밀키와 공개키를 가지고 있다. 이더리움계정에 포함된 비밀키,공개키와 제공하는 라이브러리를 이용하면 데이터를 서명하고 검증하는 과정을 쉽게 구현 할 수 있다.
이번 글에서는 이더리움 계정의 비밀키와 공개키를 이용하여 데이터를 서명 및 검증 하는 과정을 알아본다. 이 과정은 RayonProtocol에서 대출자와 대출제공자 사이의 개인 금융 정보 및 인증 정보를 전달 하고 검증하는데 활용 하게 된다.
데이터 서명 (Sign)
데이터 서명은 보내는 사람이 개인키를 이용하여 데이터의 서명값을 만들어 낸다. 주로 Client 프로그램에서 서명이 이루어 진다. 이번 글에서는 web3 기반의 javascript client 프로그램을 통해 데이터 서명이 이루어 지는 과정을 살펴본다.
이더리움의 web3 라이브러리에는 데이터 서명 함수가 제공된다. web3 버전은 1.0.0-beta.35을 이용하였다.
아래 예제를 살펴보자.
- web3.util.sha3(data) 함수를 통해서 서명할 데이터의 hash값을 얻어 낸다.
- web3.eth.accounts.sign(hash, privatekey) 함수를 통해서 데이터를 서명한다.
- 서명값은 v,r,s 로 구성되어 있다. v,r,s 값은 서명값의 byte위치로 계산해도 되지만 web3.eth.accounts.sign() 함수를 이용하면 v,r,s값을 포함한 객체값을 전달받게 된다. v,r,s 값을 직접 계산해서 얻는 코드는 아래와 같다
데이터 검증 (Verify)
데이터 검증은 전달받은 사용자가 데이터가 전달해준 사용자가 서명한 올바른 데이터인지를 확인하는 과정이다. 검증 과정은 이더리움 smart contract에서 제공되는 함수로 쉽게 구현이 가능하다.
아래 예제를 살펴보자
contract에 포함된 ecrecover()를 이용하면 쉽게 데이터 검증을 할 수 있다. 앞서 서명값인 v,r,s값과 데이터의 hash값을 ecrecover()에 넣고 실행하면 데이터를 서명한 사용자의 주소가 나오게 된다.
사용자는 ecrecover()함수를 실행해서 나온 주소값와 데이터를 전송한 사용자의 주소값을 비교하여 일치하면 해당 데이터는 전송한 사용자가 서명한 데이터라고 검증을 하게 된다.
데이터 서명과 검증 테스트 코드
truffle 테스트 코드를 통해 데이터 서명과 검증 과정을 확인 볼 수 있다.
위 테스트 코드에서는 데이터 서명과 검증과정이 같이 포함되어 있다. 데이터 서명후 Validator contract의 함수를 실행하여 검증을 하게 된다. 검증을 통해 전달된 사용자 주소값과 데이터를 전송한 사용자의 주소값이 일치하면 데이터의 검증이 완료된다.
위 예제 코드는 github(https://github.com/rayonprotocol-research/solidity-sign-and-verify) 을 통해서 확인 해 볼수 있다.