3주에 걸쳐(2주차는 복습) 이더리움 트랜잭션 구조에 대해 하나하나 다 살펴보았는데 반복해서 나오는 개념이 있었다. RLP
라는 개념인데 이번주차는 이 부분에 대해서 먼저 알아보고 나머지 구조들을 공부했다.
이더리움 네트워크에서 노드에 데이터 구조를 저장하거나, 혹은 노드끼리 데이터 구조를 주고 받으려면 통일된 형식이 필요하다. 그리고 이 통일된 형식을 만드는 것을 직렬화(serialization)라고 하고, 만들어진 통일된 형식을 바이트 스트림이라고 한다.
RLP(Recursive Length Prefix)
는 이더리움 네트워크에서 쓰이는 직렬화(serialization) 기법이다. 바이트 스트림은 최소 단위를 바이트로 하는 데이터 묶음이다. 데이터를 파일에 저장하거나 네트워크에서 전송하기 위해서는 바이트 스트림 형식으로 변환되어야 한다.
RLP는 데이터를 저장하거나 전송하는데 필요한 통일된 포맷을 제공한다. 데이터는 RLP로 변환되어 트랜잭션 전송, 블록 state 및 receipt 저장, DB 저장 등에 사용된다.
(RLP 인코딩과 디코딩에 관한 내용은 아래 참고 자료 링크 참고)
이번주는 트랜잭션 구조의 수신자, 값과 데이터, 디지털 서명의 세 가지 구성 요소(v, r, s)를 살펴보았다.
수신자는 말 그대로 목적지 이더리움 주소이다. 이더리움 프로토콜은 트랜잭션의 수신자 주소를 검증하지 않는다. 해당하는 개인키 또는 컨트랙트가 없는 주소로 보낼 수도 있다. 그러면 이더가 연소(burning)되어 영구적으로 사용할 수 없게 된다. 유효성 검사는 사용자 인터페이스 수준에서 수행되어야 한다.
값은 목적지에 보낼 이더의 양이고, 데이터는 가변 길이 바이너리 데이터 페이로드이다. 트랜잭션의 주요 '페이로드(payload)'는 값(value)과 데이터(data)라는 2개의 필드에 포함된다. 트랜잭션은 값과 데이터, 값만, 데이터만 또는 값이나 데이터를 모두 가지지 않는 네 가지 조합이 모두 유효하다.
값만 있는 트랜잭션은 지급(payment)이다. 데이터만 있는 트랜잭션은 호출(invocation)이다. 값과 데이터 모두를 사용한 트랜잭션은 지급과 호출이다. 값과 데이터가 모두 없는 트랜잭션은 단지 가스 낭비일 뿐이다.
이더리움에서 사용되는 디지털 서명 알고리즘은 ECDSA(Elliptic Curve Digital Signature Algorithm)이다. 타원 곡선의 개인키-공개키 쌍을 기반으로 한다.
디지털 서명은 이더리움에서 세 가지 용도로 사용된다. 첫째, 서명은 이더리움 계정과 개인키의 소유자가 이더 지출 또는 컨트랙트 이행을 승인했음을 증명한다. 둘째, 부인방지(non-repudiation)를 보장한다. 즉, 허가의 증거는 부인할 수 없다. 셋째, 서명은 트랜잭션이 서명된 후에는 트랜잭션 데이터가 수정되지 않았고 어느 누구도 트랜잭션 데이터를 수정할 수 없음을 증명한다.
(더 자세한 내용과 디지털 서명 작동 방법은 아래 링크 chapter6 정리한 글 참고)
『Mastering Ethereum』 chapter6 정리한 글
RLP 참고 자료
RLP 인코딩 & 디코딩 참고 자료