블록체인은 트랜잭션을 블록 단위의 체인 형태로 저장하는 기술이다.
블록은 헤더(Header)와 바디(Body)로 이루어져 있으며 헤더에는 메타데이터, 바디에는 트랜잭션들의 리스트가 담겨있다. 블록 데이터를 설명하는 메타데이터에는 다음과 같은 정보들이 담길 수 있다.
트랜잭션 (Transaction)
- 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위
- 상호작용 및 작업 수행의 논리적 단위
- 블록체인의 상태(state)를 변화시키는 일련의 작업
보내는 사람의 주소, 받는 사람의 주소, 금액, 수수료 등 거래를 위한 정보가 작성된 것이 트랜잭션 데이터이다.
트랜잭션은 묶여있는 모든 작업을 완료해야 정상적으로 종료한다. 하나의 트랜잭션 속 여러 작업 중 단 하나라도 실패하면 이 트랜잭션의 모든 작업을 실패한 것으로 판단한다. 트랜잭션은 성공/실패 두 가지 결과만 존재하며 미완료된 작업 없이 모든 작업을 성공해야 한다.
데이터베이스 내에서 발생하는 트랜잭션의 안전성을 보장하기 위해 4가지 성질이 필요하다.
하나의 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 한다. 작업중 하나라도 실패한다면 묶여있는 모든 작업을 실패하게 만들어 기존 데이터를 보호한다.
데이터베이스의 상태가 일관되어야 한다. 하나의 트랜잭션 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다. 즉 트랜잭션 이후에도 데이터베이스의 제약이나 규칙을 만족해야 한다.
모든 트랜잭션은 다른 트랜잭션들로부터 독립되어야 한다. 동시에 여러 트랜잭션을 실행해도, 각 트랜잭션은 독립되어 있기 때문에 연속으로 실행한 것의 결과 및 데이터베이스 상태가 동일해야 한다.
하나의 트랜잭션이 성공적으로 수행되었다면 해당 트랜잭선에 대한 로그가 남아야 하며 이 기록은 영구적이어야 한다. 거래 이후 데이터베이스에 오류가 발생하더라도 거래 내역은 기록으로 남아있어야 한다. 로그 기록 이전에 시스템 오류가 발생한다면 해당 트랜잭션은 실패로 돌아가고 트랜잭션 이전 상태로 돌아간다.
주목해야 할 차이점은 논스(Nonce)의 유무이다. 이더리움에만 논스가 존재하며 논스는 이중지불의 방지를 위한 것이다. 이중지불(Double Spending)이란 원본에 저장된 가치를 지불한 뒤, 해당 파일을 복사하여 다른 사람에게 또 다시 지불하는 것을 말한다. 모든 트랜잭션은 일회성이기 때문에, 하나의 트랜잭션은 하나의 상태만 변화시켜야 하고 이중 지불이 발생해서는 안된다.
이더리움 트랜잭션 논스
발신 계정에서 트랜잭션에 할당된 번호로, 이중 지불 문제를 방지한다.
트랜잭션 발생시 논스는 1씩, 순서대로 증가하며 순번을 건너뛰지 않는다.
(Ex. 논스가 3인 트랜잭션을 전송하려면, 논스가 0~2인 트랜잭션의 전송 내역이 있어야 한다. 현재 계정의 논스가 1인 상태에서 논스가 3인 트랜잭션을 전송한다면, 해당 트랜잭션은 처리되지 않고 멤풀(Mempool)에 저장되었다가 논스가 2인 트랜잭션이 전송될 때 2,3이 연달아 처리된다.)
논스는 계정에서 유일하며, 동일한 논스는 존재하지 않는다.
같은 논스에 여러 트랜잭션 전송이 발생하였다면, 제일 높은 가스비를 지불한 트랜잭션이 처리된다.
이더리움의 경우, 이중 지불 문제를 방지 하기 위해 위와 같이 어카운트(Account) 기반 논스를 활용하여 각 트랜잭션이 오직 한 번만 처리되게 하는 카운터로 논스를 이용한다. 비트코인의 경우에는 UTXO(Unspent Transaction Output, 미사용 트랜잭션 출력값)을 통해 거래의 유효성을 검사하여 코인의 존재 여부를 확인한다.