이더리움 백서 톺아보기 - 6편
이더리움 상태변환함수
이더리움도 비트코인과 동일하게 하나의 큰 상태변환함수로 동작합니다. 어떠한 트랜잭션의 요청에 의해서 이더리움의 현재상태(S)가 다음상태(S’)로 변하는 것입니다. 다만, 상태를 변화시킬 수 있는 데이터의 범위 및 방법이 비트코인과 조금 다릅니다. 그럼 지금부터 이더리움은 어떤 방법으로 상태가 변하고, 변한 상태를 블록체인에 어떻게 기록하는지 살펴보겠습니다.
이더리움 상태 전이 함수 APPLY(S, TX) -> S’ 은 다음처럼 정의될 수 있다.
1. 트랜잭션이 형식에 제대로 맞는지(즉, 올바른 개수의 값을 가지고 있는지) 체크하고, 서명이 유효한지, 논스가 발신처 어카운트의 논스와 일치하는지를 체크한다. 그렇지 않다면 오류를 반환한다.
2. STARTGAS * GASPRICE 로 트랜잭션 수수료를 계산하고, 서명으로부터 발신처 주소를 결정한다. 발신처 어카운트 잔고에서 이 수수료를 빼고 발신자 논스를 증가시킨다. 발신처 잔고가 충분하지 않으면 오류를 반환한다.
3. GAS = STARTGAS 로 초기화한 후, 트랜잭션에서 사용된 바이트에 대한 값을 지불하기 위해 바이트당 gas 의 특정양을 차감한다.
4. 발신처 어카운트에서 수신처 어카운트로 트랜잭션 값을 보낸다. 수신처 어카운트가 존재하지 않으면 새로 생성한다. 수신처 어카운트가 컨트랙트이면, 컨트랙트의 코드를 끝까지 또는 gas가 모두 소모될 때 까지 수행한다.
5. 발신처가 충분한 ‘돈'을 가지고 있지 못해서 값 전송이 실패하거나, 코드 수행 시 gas가 부족하면, 모든 상태 변경을 원상태로 돌려놓는다. 단, 수수료 지불은 제외되고, 이 수수료는 채굴자 어카운트에 더해지게 된다.
6. 그 외에는 모든 남아있는 모든 gas에 대한 수수료를 발신처에게 돌려주고, 소모된 gas에 지불된 수수료를 채굴자에게 보낸다.
- 이더리움 백서 중-
이더리움 백서에 설명된 이더리움의 상태전이함수 절차에 대해서 조금 자세히 살펴보도록 하겠습니다.
APPLY( )라는 이름의 이더리움 상태전이함수가 있습니다. 이 함수는 음료자판기와 같이 어떠한 입력값을 넣으면, 프로그램된 방식으로 결과값을 출력합니다. 여기서 말하는 입력값은 S라는 현재상태와 TX이라는 사용자에 의한 트랜잭션 요청이 됩니다. 이 두 값을 입력받아서 APPLY( ) 함수에 정의된 방식대로 프로그램이 동작하고 그 결과를 S’(다음상태)의 형태로 출력값을 얻을 수 있습니다. 블록체인에는 이러한 상태변환함수가 동작 한 뒤에 나온 결과값을 지속적으로 업데이트하여 기록하게 됩니다.
백서에 설명하고 있는 6개의 절차를 하나씩 살펴보겠습니다.
1. 트랜잭션의 형식과 서명, 논스를 체크합니다. 트랜잭션의 형식은 기본적인 메세지 규약을 따르고 있는지 체크하는 것이며, 서명의 유효성 확인을 통해서 트랜잭션을 요청한 개인키에 대한 검증을 확인합니다.
2. 이더리움의 트랜잭션은 채굴자가 처리하기 위해서 가스비를 요구합니다. 이 가스비에 대한 수수료를 계산하는 과정입니다. 그리고 첫 번째 과정에서 체크했던 서명으로부터 발신자의 주소를 확인할 수 있습니다. 이 과정을 통해서 이더리움 블록체인에서 발신자 주소로부터 수수료나 기타 이더의 정보를 수정할 수 있게 됩니다.
3. 실제 가스비용을 처리하는 과정입니다. 이더리움 내부에는 각 명령어마다 정해진 가스비용이 있습니다. 그 비용에 대한 계산 후에 사용자가 트랜잭션 요청에 부과하기 원했던 가스비용에서 해당 사용하는 양만큼 가스비를 차감하는 과정이 수행됩니다.
4. 수신처로 트랜잭션의 값을 보내고 처리하는 과정입니다. 수신처의 주소가 이더리움에 블록체인에 한번도 기록된 적이 없다면, 해당하는 수신처의 주소를 등록합니다. (개인키-공개키 방식의 주소는 개인이 먼저 주소를 만들고 이후에 채굴자들이 블록체인에 주소를 등록하는 방식입니다.) 수신처의 주소가 EOA(외부소유계정)가 아닌 CA(컨트랙트 계정)인 경우에는 해당하는 컨트랙트 코드를 GAS를 모두 사용할때까지 수행하게 됩니다.
5. 트랜잭션을 요청한 발신저의 이더잔고나 가스비가 부족한 경우는 1~4번까지 진행했던 모든 내역을 취소합니다. 그렇지만 이걸 수행한 채굴자에게는 보상이 주어져야 하므로 수행했던 과정까지 소모되었던 가스비만 채굴자에게 전송이 됩니다.
6. 5번의 예외상황 없이 모든 게 정상적으로 진행되었다면 총 사용된 가스비에서 남은 가스비를 원 발신처에 돌려주고 트랜잭션 처리에 소요된 가스비를 채굴자에게 전송을 하고 모든 과정을 마치게 됩니다.
이 과정을 계속 반복하면서 정상적으로 처리된 트랜잭션의 결과들은 지속적으로 블록체인에 기록합니다. 그리고 이렇게 기록을 하도록 채굴자에게 요청한 트랜잭션에 대한 가스비용은 채굴자에게 주어집니다. 우리가 일반적으로 이용하는 인터넷 서비스의 경우는 정보요청과 응답에 대한 비용이 무료인 것 같지만 실제로는 해당 서비스를 제공하고 있는 서비스업체에서 지불을 하고 있는 것입니다.
이더리움과 같이 탈중앙화된 네트워크에서는 누구나 이와 같은 서비스를 제공할 수 있기 때문에 서비스를 제공한 풀노드(채굴자)들에게 서비스 요청에 대한 비용을 지불하고, 그 비용을 근거로 채굴자들은 사용자들의 요청사항들을 처리하여 블록체인에 기록을 할 수 있게 됩니다. 이러한 방식의 변화는 열려 있는 서비스를 만들게 되고, 가스비의 특징으로 인해서 인터넷에서 빈번히 일어나는 DDOS(디도스) 해킹도 막아주는 효과를 얻을 수 있습니다.
정리하기
- 이더리움도 비트코인과 동일한 상태변환함수로 존재한다.
- 상태변환함수를 실행시키는 데는 가스비(수수료)가 발생한다.
- 채굴자(풀노드)는 이더리움 상태변환함수를 실행하고, 그 결과를 블록체인에 과정에서 가스비를 수수료로 받는다.