선택된 블록체인 회계 모델의 중요성은 사용자 경험과 확장 가능성에 대한 상당한 영향에도 불구하고 종종 과소평가됩니다. 이 기사에서는 Cardano와 Bitcoin에서 사용하는 UTxO 모델과 Ethereum 및 기타 수많은 EVM 호환 블록체인에서 사용하는 계정 기반 모델의 복잡성을 자세히 살펴보겠습니다. 기사에는 예시 이미지가 가득합니다. 자세히 살펴보면 Ethereum의 거래 검증이 비결정적이며 종종 실패하기 쉬운 반면 Cardano는 거래를 결정적으로 검증하는 이유를 이해하게 될 것입니다. 우리는 또한 Ethereum과 Cardano의 글로벌 상태 간의 차이점을 설명할 것입니다.
블록체인에서의 회계
회계는 현대 금융 환경의 기반이 됩니다. 모든 금융 기관은 개인 계좌 잔액과 현금 흐름에 대한 기록을 유지해야 합니다. 이 프로세스는 완전히 신뢰할 수 있고, 안전하고, 감사 가능해야 하며, 가장 중요하게는 신뢰할 수 있어야 합니다.
각 원장은 특정 순간에 자산의 소유권을 정확하게 표시할 수 있어야 합니다. 즉, 사용자 X는 Z 시간에 특정 수량의 Y 자산에 대한 소유권을 갖고 있었습니다. 개인 간의 금융 상호 작용이 지속적으로 발생하기 때문에 원장의 항목은 끊임없이 유동적입니다. 중앙 집중식이든 분산식이든 시스템은 각 거래를 정확하게 검증하고 이를 원장에 적절하게 기록해야 합니다.
역사적으로 종이 장부는 표준이었습니다. 그러나 컴퓨터의 등장으로 회계는 디지털 변혁을 겪었습니다. 블록체인 기술의 등장으로 분산회계가 가능해졌습니다.
블록체인 네트워크는 금융 시스템으로 인식될 수 있습니다. 분산 원장, 즉 중앙 기관의 통제를 받지 않는 회계 시스템으로 볼 수 있습니다. 사용자는 P2P(Peer-to-Peer) 방식으로 서로 금융 거래에 참여할 수 있습니다. 그러나 중개자, 즉 거래를 검증하는 주체는 중앙 기관이 아니라 자원 봉사자들로 구성된 분산 네트워크입니다. 일련의 자원봉사자들이 원장에 새로운 재무 항목을 추가하는 일을 담당합니다.
Satoshi Nakamoto는 비트코인에서 UTxO 모델을 구현했습니다. Vitalik Buterin은 Ethereum의 계정 기반 모델을 선택했습니다. IOG 팀은 Cardano에 확장된 UTxO 모델을 사용하기로 결정했습니다. 이러한 각 변형에는 고유한 장단점이 있으며, 이에 대해서는 후속 분석에서 자세히 살펴보겠습니다.
거래 검증을 위한 전제 조건으로 상태
블록체인은 기술적으로 상태 머신입니다. 시스템 상태 또는 전역 상태라고 하는 이전 이벤트를 기억합니다. 주로 트랜잭션으로 표현되는 이러한 이벤트는 사용자 간의 상호 작용입니다. 상태는 미리 정의된 조건에 따라 변경될 수 있습니다. 각 프로토콜은 상태 S-0에서 상태 S-1로의 전환을 허용하는 일련의 규칙과 논리를 구현했습니다. 정기적으로 블록체인 네트워크는 상태 전환이 발생하는 새 블록을 추가합니다.
블록은 기존 상태에서 새로운 상태로 전환하는 기본 단위 역할을 합니다. 거래로 구성되어 있습니다. 블록 생산자는 프로토콜의 규칙에 따라 새 블록을 생성하는 임무를 맡습니다. 즉, 블록 승인을 위한 모든 조건이 충족되어야 함을 의미합니다. 블록이 유효한 것으로 간주되려면 유효한 거래만 포함되어야 합니다.
둘 이상의 당사자 간의 가치 이전인 거래의 검증에는 검증을 위한 일부 컨텍스트 또는 상태가 필요합니다. 시스템은 유효한 서명과 같은 사항 중에서 송금인의 계좌에 적절한 자금이 있는지 확인해야 합니다. 또한 사용자가 동일한 자금을 두 번 이상 지출하는 것을 방지하여 악명 높은 이중 지출 문제를 해결해야 합니다. 거래를 단독으로 검증하는 것은 불가능합니다. 검증자는 원장의 현재 상태를 기반으로 트랜잭션을 검증합니다.
새로운 블록을 생성하는 작업을 맡은 노드와 새로 생성된 블록을 검증하는 노드 모두 검증을 위해 컨텍스트, 즉 원장의 현재 상태에 대한 지식이 필요합니다. 검증을 위한 컨텍스트는 블록체인에서 가장 최근에 유효한 블록입니다.
특정 라운드에서 새로운 블록을 생성하는 블록 생성 노드는 현재 상태를 나타내는 마지막 블록을 검증을 위한 입력으로 사용합니다. 그 후, 새 블록에 삽입될 모든 트랜잭션을 가져와서 유효성을 검사합니다. 그런 다음 다른 필수 데이터를 블록에 추가하고 이를 네트워크에 확산시킵니다.
그림에서 노드는 상태 S+3에서 다음 상태 S+4로 전환할 수 있는 새로운 블록을 구축하려고 시도하고 있습니다.
새로운 블록을 생성하는 노드와 모든 검증 노드는 모두 새로운 상태로 전환하기 위해 동일한 검증 컨텍스트를 공유해야 합니다. 여러 노드가 서로 다른 컨텍스트를 사용하는 경우 새로 제안된 블록은 네트워크의 일부 노드에서만 수락될 수 있습니다. 유효한 블록은 블록 생산자와 동일한 컨텍스트를 사용하는 노드에 대해서만 유효성 검사를 통과합니다.
전역 상태는 새로 추가된 블록이나 심지어 추가로 검증된 트랜잭션마다 끊임없이 변화하고 있습니다. 트랜잭션 발송과 네트워크 처리(즉, 블록에 트랜잭션 포함) 사이에 상당한 시간 경과가 있을 수 있으며, 그 동안 전역 상태가 변경될 수 있습니다. 트랜잭션을 발송할 때 사용자가 갖고 있던 컨텍스트는 블록 생산자 노드가 트랜잭션을 새로운 블록 후보에 통합할 때 변경될 수도 있고 변경되지 않을 수도 있습니다.
이미지에 표시된 것처럼 사용자는 블록 N+2를 추가한 직후 TX 10 트랜잭션을 발송했습니다. 이후 블록 N+3이 추가되어 전역 상태가 변경되었습니다. 블록 생산자 노드는 블록 N+4를 구성하는 중이며 트랜잭션 TX 10을 여기에 통합하려고 합니다. 블록 N+3의 추가로 전역 상태가 변경되었으며, 이는 잠재적으로 트랜잭션 TX 10의 검증과 직접 관련된 컨텍스트를 수정할 수도 있습니다.
사용자는 블록 N+2를 추가한 후 유효한 컨텍스트를 가졌습니다. 그러나 블록 생산자는 블록 N+3을 추가한 후에 유효한 컨텍스트를 갖습니다. 그래서 맥락이 다릅니다.
UTxO와 계정 기반 모델의 주요 차이점은 트랜잭션 검증을 위해 검증자가 요구하는 컨텍스트와 블록 내의 트랜잭션을 검증하는 방법에 뿌리를 두고 있습니다.
UTxO 기본
Unspent Transaction Output의 약어인 UTxO는 향후 트랜잭션에 활용할 수 있는 이전 트랜잭션의 출력을 나타냅니다.
UTxO 모델은 계정 및 잔액과 같은 개념을 인식하지 않습니다. UTxO는 어떤 명목 가치도 담을 수 있는 지폐와 같은 기능을 합니다. 예를 들어 UTxO는 6.9 ADA, 47 ADA 또는 459.7 ADA일 수 있습니다.
Cardano 지갑은 사용자가 UTxO를 계정 잔액처럼 관리하도록 지원합니다. 앞서 언급한 3개의 UTxO는 Alice의 지갑에 513.6 ADA로 표시됩니다.
그렇다면 Alice가 Bob에게 50 ADA를 보내려고 하면 어떻게 될까요?
Alice는 Cardano 지갑에서 거래를 시작합니다. 지갑은 UTxO 세트를 거래에 통합해야 하며, 이는 총 50 ADA에 0.17 ADA 수수료를 더해 처리하기에 충분합니다.
지갑은 거래를 위해 값이 459.7 ADA인 단일 입력 UTxO 또는 값이 6.9 ADA 및 47 ADA인 두 개의 입력 UTxO를 사용할 수 있습니다. 지갑은 거래 입력으로 총 53.9 ADA를 사용하여 후자를 선택합니다.
일반적으로 두 개의 UTxO가 트랜잭션의 출력으로 생성됩니다. 1) 수신자에게 전송된 UTxO, 2) 발신자에게 반환된 UTxO.
거래 입력은 Alice가 Bob에게 보내려는 것보다 더 많은 양의 ADA입니다(수수료 포함). 이는 대부분의 거래에 해당되며 UTxO 모델의 작동과 일치합니다.
거래를 통해 Alice는 50.17 ADA를 지출하고 새로 생성된 UTxO를 통해 3.73 ADA가 그녀의 계정으로 반환됩니다. 발신자가 지출하고자 하는 가치와 정확히 일치하는 UTxO를 사용할 수 있는 경우는 거의 발생하지 않습니다.
트랜잭션으로 인해 2개의 출력 UTxO가 생성됩니다. Bob의 경우 50 ADA, Alice의 경우 3.73 ADA입니다.
아래 이미지에서 설명된 대로 트랜잭션을 관찰할 수 있습니다. 두 입력 UTxO가 모두 소비되고 새 출력 UTxO가 생성됩니다. 출력 UTxO의 가치는 거래 수수료만큼 감소합니다. Bob은 정확히 50 ADA를 받습니다. 거래를 보낸 후 Alice의 지갑에는 2개의 UTxO가 있게 됩니다.
카르다노 UTxO 모델
이제 사용자 관점에서 UTxO가 어떻게 작동하는지 알게 되었습니다. 하지만 이것이 트랜잭션 유효성 검사와 전역 상태(컨텍스트)에 대해 무엇을 의미할까요?
UTxO는 독립적이고 변경할 수 없는 객체이며 독점적인 액세스가 보장될 수 있습니다. UTxO가 트랜잭션의 출력으로 생성되면 새 트랜잭션에서 사용될 때까지 변경되지 않습니다. 소비되면 완전히 소비되고 새 트랜잭션의 출력으로 새 UTxO가 생성됩니다.
유효성 검사기가 트랜잭션을 검증하는 데 필요한 컨텍스트는 유효성 검사 당시 기존의 모든 UTxO 집합입니다. 이 UTxO 세트는 블록체인의 활성 원장 상태(글로벌 상태)를 나타냅니다.
트랜잭션이 제출되면 하나 이상의 UTxO를 입력으로 참조하며 이는 사용됩니다. 검증인의 임무는 다음을 확인하는 것입니다:
모든 입력 UTxO는 실제로 현재 전역 상태의 일부입니다. 즉, 사용되지 않고 원장에 존재합니다.
입력 UTxO의 총 가치는 출력 UTxO의 총 가치보다 크거나 같으므로 가치 보존이 보장됩니다(차액은 거래 수수료가 됨).
입력 UTxO 소유자가 트랜잭션에 올바르게 서명하여 정당한 소유자만 UTxO를 사용할 수 있도록 합니다.
블록체인의 현재 상태는 사용되지 않은 모든 UTxO의 집합으로 표현될 수 있으며, 블록체인의 이력은 사용된 것과 사용되지 않은 모든 UTxO의 그래프로 볼 수 있습니다. 이 그래프는 블록체인에서 발생한 모든 거래에 대한 완전하고 감사 가능한 기록을 제공합니다.
아래 이미지에서는 트랜잭션에서 UTxO가 어떻게 사용되는지 확인할 수 있습니다. 출력 UTxO(녹색)는 입력 UTxO(빨간색)가 됩니다. 사용되지 않은 모든 UTxO는 현재 전역 상태 또는 활성 UTxO 세트(파란색)를 나타냅니다. 모든 파란색 UTxO는 트랜잭션 입력이 될 수 있습니다. 즉, 소비될 수 있습니다. 녹색 UTxO는 이미 사용되었으므로 다시 사용할 수 없습니다.
새로운 트랜잭션을 검증하려면 블록체인의 전체 기록을 알 필요가 없고 사용되지 않은 UTxO(블루 UTxO)의 활성 세트만 알면 됩니다. 그러나 활성 UTxO 세트를 얻으려면 일반적으로 전체 블록체인 기록을 처리해야 합니다.
활성 UTxO 세트에는 과거에 생성된 UTxO도 포함됩니다.
그림의 각 상태 N에서는 하나의 블록이 생성되었습니다. 새로운 상태 N+5에서는 N+2, N+3, N+4 상태의 UTxO를 포함하는 컨텍스트가 트랜잭션 검증에 사용됩니다. N+5 상태의 새 블록에는 트랜잭션 10의 UTxO를 사용하려고 하는 트랜잭션 14와 트랜잭션 11의 UTxO를 사용하려는 트랜잭션 15가 있습니다.
N+5 상태에서는 새로운 블록이 생성됩니다. 따라서 새로운 UTxO도 생성되어 활성 UTxO 세트에 삽입됩니다.
각 UTxO는 독립적으로 병렬로 처리될 수 있으므로 트랜잭션 유효성 검사는 서로 독립적입니다. 이제 우리는 Cardano의 거래가 결정론적으로 검증되는 이유에 대해 설명합니다.
UTxO 모델에서 트랜잭션의 유효성 검사는 입력과 출력에 따라 결정되므로 공유 전역 상태가 필요하지 않습니다. 이는 활성 UTxO 세트가 전역 상태를 구성한다고 언급한 이전 텍스트와 다소 모순되는 것처럼 보일 수 있습니다.
전체 UTxO 세트는 트랜잭션 검증에 필요하지 않지만 그 중 일부, 특히 입력 UTxO만 필요합니다. UTxO 세트의 나머지 UTxO는 관련이 없습니다.
트랜잭션의 유효성은 소비된 UTxO가 유효하고 사용되지 않았는지 여부와 입력의 집계 값이 출력의 집계 값과 일치하는지 여부에만 달려 있습니다.
트랜잭션 입력은 독립적인 불변 엔터티이므로 유효성 검사는 결정적입니다. 출력 UTxO를 포함하여 검증 결과를 높은 수준의 확실성으로 예측하는 것이 가능합니다.
동일한 트랜잭션이 네트워크에 의해 검증될 때, 즉 블록 생산자가 트랜잭션을 새로운 후보 블록. 유효성 검사 결과는 두 경우 모두 동일할 가능성이 높습니다. 따라서 트랜잭션이 로컬 검증을 통과하면 네트워크 검증도 통과합니다.
이미지는 트랜잭션 TX 9 및 TX 10을 포함하는 새 블록 N+4를 생성하는 유효성 검사기를 보여줍니다. 유효성 검사를 위한 입력은 노드가 해당 mem-pool에서 가져오는 트랜잭션과 각 노드가 유지 관리하는 활성 UTxO 세트입니다.
새로운 트랜잭션인 TX 9 및 TX 10은 사용되지 않은 이전 출력 UTxO(파란색 상자로 표시)를 사용하여 입력 UTxO(빨간색 상자로 표시)를 형성합니다. 블록 내의 트랜잭션 순서는 중요하지 않습니다. 트랜잭션은 자율적이고 서로 영향을 주지 않기 때문입니다. 블록 N+2가 생성된 직후에 전송된 트랜잭션 TX 10은 해당 블록 내의 트랜잭션에서 UTxO를 활용할 수 있습니다. 새로운 N+4 블록이 생성되면 입력 UTxO에서 새로운 UTxO가 생성됩니다. N+4 블록을 블록체인에 추가하면 네트워크가 새로운 전역 상태로 전환됩니다.
이미지에 표시된 것처럼 새로운 블록 N+4가 블록체인에 추가되어 전역 상태가 변경되었습니다. 활성 UTxO 세트에서 블록 N+4에 포함된 트랜잭션에 사용된 UTxO는 제거됩니다(녹색). 새로 생성된 UTxO(보라색)가 세트에 추가되었습니다. 블록은 네트워크 전체에 배포되므로 활성 UTxO 세트는 새 블록을 허용하는 네트워크의 모든 노드에서 업데이트됩니다.
결정론적 거래 검증
Alice의 지갑에 각각 6.9 ADA, 47 ADA 및 459.7 ADA의 가치가 있는 3개의 UTxO가 있는 예를 다시 살펴보겠습니다.
Alice는 Bob, Carol, Dave의 세 개인에게 각각 5개의 ADA를 보내 매번 새로운 거래를 시작하려고 합니다. Alice는 세 명의 수신자에게 단일 트랜잭션을 보낼 수 있지만 이 예에서는 결정론의 개념을 설명하기 위해 의도적으로 세 개의 개별 트랜잭션을 선택합니다. 모든 거래는 빠르게 연속적으로 발송되었으며 모두 후속 블록에서 처리될 수 있습니다.
이미지에 표시된 것처럼 각 거래는 Alice의 지갑(빨간색 상자로 표시)에서 하나의 UTxO를 활용하여 각 거래가 독립적인 입력을 갖도록 보장합니다. 각 트랜잭션은 파란색 상자로 표시되는 두 개의 출력 UTxO를 생성합니다. 5 ADA에 해당하는 하나의 UTxO가 수신자에게 할당되고 나머지 ADA가 포함된 두 번째 UTxO는 Alice의 지갑으로 반환됩니다. 출력 UTxO는 트랜잭션 제출 시 결정됩니다. 단순화를 위해 이 예에서는 거래 수수료를 생략했습니다.
로컬 검증에 성공하면 거래가 네트워크를 통해 전파됩니다. 모든 거래는 다음 블록에서 처리됩니다. 다음 이미지에서는 Alice와 모든 수신자의 지갑에 있는 UTxO를 관찰할 수 있습니다.
입력 UTxO가 소비되었음을 확인하세요(녹색 상자로 표시). 6개의 새로운 UTxO가 생성되었습니다. 3개의 UTxO가 Alice에게 반환됩니다. 세 명의 수신자 각각은 하나의 UTxO를 받았습니다.
각 트랜잭션에서 값이 보존되는지 확인하세요. 입력 UTxO의 합은 모든 출력 UTxO의 합과 같습니다. 이는 모든 거래에 적용됩니다.
거래가 검증되는 순서는 중요하지 않습니다. 어떤 이유로든 하나의 거래만 다음 블록에 도달하고 나머지 두 거래는 후속 블록에 포함되더라도 검증 결과는 변경되지 않습니다. 전역 상태는 트랜잭션 검증에 영향을 주지 않고 Bob에 대한 트랜잭션 검증과 Carol 및 Dave에 대한 트랜잭션 사이의 변경(여러 블록에 걸쳐)을 겪을 수 있습니다.
입력 UTxO가 서로 독립성으로 인해 트랜잭션 검증은 서로 독립적입니다. 따라서 트랜잭션 유효성 검사는 결정적입니다. 트랜잭션 제출과 네트워크 처리 사이에 전역 상태가 변경될 수 있지만 결과에는 영향을 미치지 않습니다. 결과(유효 또는 무효)는 트랜잭션 자체와 입력 UTxO에 따라서만 결정될 수 있습니다.
Cardano의 전역 상태는 독립적이고 변경 불가능한 UTxO의 모음입니다. 이러한 UTxO의 독립성을 고려하면 병렬로 작업하는 것이 가능합니다. 이는 여러 트랜잭션을 동시에 검증할 수 있어 네트워크의 처리량과 효율성을 크게 향상시킬 수 있음을 의미합니다.
그림에서 각 트랜잭션이 UTxO 세트에서 UTxO를 독점적으로 사용하는 방법을 볼 수 있습니다. 모든 지갑과 DApp이 잘 설계되면 두 트랜잭션이 동일한 UTxO를 소비하는 일이 발생할 수 없습니다. 소비된 UTxO는 활성 세트에서 제거되고 새 UTxO가 삽입됩니다.
UTxO를 소비하고 세트에 새 UTxO를 추가하는 것은 그림에 표시되지 않습니다. 그림은 트랜잭션이 입력 UTxO를 참조하는 방법만 보여줍니다.
추가적인 이점은 표준 트랜잭션에 적용되는 원칙이 유효성 검사기 스크립트 실행까지 확장된다는 것입니다. 스크립트 실행을 포함하여 로컬 유효성 검사를 통과하는 트랜잭션을 구축하는 것이 가능합니다. Datum과 Redeemer를 포함한 모든 검증 입력이 일관되게 유지된다는 점을 고려하면 이러한 거래는 네트워크 검증도 통과할 가능성이 높습니다. 즉, 스크립트 유효성 검사기 실행도 외부 전역 상태에 의존하지 않고 트랜잭션 입력에만 의존합니다. 유일한 차이점은 스크립트 트랜잭션의 경우 입력이 더 많다는 것입니다.
이미지에서 Cardano가 다른 블록을 추가하여 여러 트랜잭션을 병렬로 처리하는 방법을 확인할 수 있습니다. 블록을 추가하면 전역 상태가 변경됩니다. (글로벌 상태에서) 활성 UTxO 세트에서 제거된 입력 UTxO의 소비는 빨간색으로 표시됩니다. 새로운 출력 UTxO에 의한 활성 UTxO 세트의 확장(전역 상태의 확장)은 녹색으로 표시됩니다.
결정성은 UTxO에 대한 액세스의 독점성에 따라 결정됩니다.
표준 트랜잭션의 경우 UTxO 소유자는 트랜잭션을 시작하는 사람입니다. 에이전트 역할을 하는 지갑은 각 UTxO가 트랜잭션에 한 번만 포함되도록 보장합니다.
이 예에서 Alice는 자신이 사용하고 싶은 모든 UTxO를 소유했습니다. 그 누구도 유효한 서명으로 거래를 구축할 수 없었습니다.
지갑이 동일한 UTxO를 입력으로 사용하여 두 개의 트랜잭션을 제출하도록 허용한 경우 트랜잭션 중 하나만 성공할 수 있습니다. 그러나 잘 설계된 지갑은 사용자가 그러한 실수를 하는 것을 허용하지 않습니다.
분산형 애플리케이션(DApp)의 경우 에이전트는 지갑이 아닌 다른 엔터티(예: 배처)일 수 있습니다. 이 엔터티는 트랜잭션을 생성할 때 UTxO에 대한 독점 액세스를 제공하는 역할을 담당합니다. 이렇게 하면 각 UTxO가 정확히 한 번만 사용되어 시스템의 결정성과 보안이 유지됩니다.
아래 이미지에서는 토큰 X와 Y가 포함된 유동성 풀을 볼 수 있습니다. 이 경우 DEX의 오프체인 부분인 Batcher는 2개의 스왑을 수행하려고 합니다. 구체적으로, 배처 1과 배처 3입니다. 배처는 유동성 풀의 UTxO에 대한 독점적인 액세스를 보장하기 위해 오프체인에서 서로 통신해야 합니다(그림에서 오프체인 통신은 파란색으로 표시됨).
배처가 오프체인과 통신하지 않는 경우 동일한 UTxO를 트랜잭션 입력으로 사용하려고 시도할 수 있습니다. 이 상황을 사진에서 볼 수 있습니다. 서로의 의도를 알지 못하는 두 배처는 각각 유동성 풀에서 동일한 UTxO를 입력하는 트랜잭션을 제출할 수 있습니다. 두 트랜잭션 모두 로컬 유효성 검사를 통과하지만 해당 트랜잭션 중 하나만 네트워크 유효성 검사를 통과할 수 있습니다.
하나의 에이전트 또는 여러 에이전트가 서로 독립적으로 동일한 입력 UTxO를 사용하여 유효한 트랜잭션을 제출하는 경우 Cardano 트랜잭션이 실패할 수 있습니다. 이러한 상황은 잘못 설계된 지갑이나 Dapp으로 인해 발생합니다.
결론적으로 Cardano 거래는 무국적(stateless) 거래로 간주될 수 있다고 말할 수 있습니다.
이더리움 계정 기반 모델
이더리움 계정 기반 모델은 동작이 일반 은행 계좌의 동작과 유사하므로 설명하기 쉽습니다. Ethereum의 각 계정에는 현재 Ether(ETH) 잔액을 포함하는 상태가 연결되어 있습니다. 이 잔액은 계정 상태에 직접 저장되며 거래를 통해 업데이트될 수 있습니다.
아래 그림에서는 상태 간의 전환을 볼 수 있습니다. 사용자 계정 잔액의 변경 사항을 확인하세요. 단순화를 위해 ETH를 나타내는 잔액은 하나만 있습니다.
이더리움의 글로벌 상태는 모든 계정의 데이터베이스와 네트워크에 있는 다양한 자산의 현재 잔액으로 볼 수 있습니다. 새로운 블록이 추가될 때마다 해당 블록에 포함된 모든 트랜잭션에 따라 시스템 상태가 업데이트됩니다.
이 전역 상태는 Ethereum 네트워크의 각 노드에 로컬로 저장됩니다.
트랜잭션이 생성되면 보낸 사람 계정, 받는 사람 계정, 전송할 이더리움 양, 선택적으로 일부 데이터 및 GAS가 지정됩니다. 수신자가 계약 계정인 경우 거래는 계약 코드의 실행을 트리거합니다.
그림에서는 전역 상태 N을 상태 N+1로 변경하는 트랜잭션을 볼 수 있습니다. 거래로 인해 Alice와 Bob의 계좌 잔액이 변경됩니다.
거래가 처리되면 이더리움 네트워크는 보낸 사람의 계정에 이체 및 가스 비용을 감당할 만큼 충분한 잔액이 있는지 확인합니다. 검사가 통과되면 네트워크는 보낸 사람의 잔액에서 해당 금액을 공제하고 이를 받는 사람의 잔액(또는 받는 사람이 컨트랙트 계정인 경우 컨트랙트 잔액)에 추가합니다.
이더리움의 전역 상태는 처리된 각 트랜잭션마다 업데이트되며, 이 업데이트된 상태는 이더리움 블록체인에 추가된 각각의 새로운 블록에 저장됩니다.
트랜잭션이 처리되면 EVM은 현재 상태와 트랜잭션을 기반으로 새로운 상태를 계산합니다. 이 새로운 상태는 다음 트랜잭션의 현재 상태가 됩니다. 이러한 방식으로 이더리움 블록체인의 상태는 각 거래마다 지속적으로 발전하고 있습니다.
이미지에 표시된 대로 가장 최근에 추가된 블록은 N+3이므로 전역 상태는 N+3이 됩니다. 네트워크는 새로운 상태인 N+4로 전환을 시도하고 이에 따라 새로운 N+4 블록이 구성됩니다. 블록 N+4(녹색 상자로 표시)의 트랜잭션 TX 1의 유효성 검사는 전역 상태에 따라 다르다는 점에 유의하는 것이 중요합니다. TX 1은 블록 생산자 노드가 새로운 블록 N+4에 포함시키려고 시도하는 첫 번째 거래입니다.
전역 상태는 모든 계정과 스마트 계약의 현재 상태로 표시됩니다.
트랜잭션 TX 1이 블록 N+4에 통합되면 후속 트랜잭션이 검증될 수 있으며 이는 글로벌 상태와 이전 트랜잭션 모두에 따라 달라집니다.
그림은 트랜잭션 TX 2의 유효성 검사가 블록 N+3에서 유효했던 전역 상태뿐만 아니라 트랜잭션 TX 1에도 의존한다는 것을 보여줍니다.
이더리움 블록 생산자 노드는 트랜잭션을 순차적으로 처리합니다. 새로 구축된 블록에 추가된 각 추가 트랜잭션은 노드의 현재 전역 상태를 변경합니다. 블록이 네트워크에 확산되면 검증인 노드는 동일한 작업을 진행해야 합니다. 즉, 블록 생산자 노드가 블록에 삽입한 순서대로 트랜잭션을 순차적으로 검증해야 합니다.
이더리움 거래가 실패할 수 있는 이유 중 하나는 거래 검증 당시 전역 상태를 예측할 수 없기 때문입니다. 거래가 구성될 때 그 결과를 예측하는 것은 불가능합니다. 트랜잭션 유효성 검사 중 전역 상태는 트랜잭션 생성 중 상태와 다를 수 있습니다. 거래 제출과 검증 사이에 거래 참가자의 계정 잔액이 변경되었을 수 있습니다. 계정 잔액의 이러한 변경으로 인해 제출자가 원래 의도한 대로 거래가 실행되지 않을 수 있습니다.
그림은 블록 N+2(상태 +2) 주변에서 발생한 트랜잭션 TX 10의 제출과 트랜잭션 TX 9의 유효성 검사에 따른 트랜잭션의 후속 유효성 검사 사이의 기간을 보여줍니다. 상태가 발생했습니다. 트랜잭션 TX 10의 유효성 검사는 전역 상태와 트랜잭션 TX 9에 의해 도입된 변경 사항에 따라 달라집니다. 트랜잭션 TX 9 또는 이전 변경 사항으로 인해 트랜잭션 TX 10이 실패할 가능성이 있습니다.
거래 입력은 계정 잔액이며 이는 공유 리소스입니다. 이는 사용자가 거래를 제출하는 시점의 계정 잔액이 거래가 검증되는 시점과 다를 수 있음을 의미합니다. 트랜잭션 입력은 UTxO 모델의 경우처럼 결정적이지 않습니다. 트랜잭션이 나중에 네트워크 검증을 통과하는지 여부를 밝히는 로컬 검증을 수행하는 것은 의미가 없습니다.
차이점을 설명하는 가장 좋은 방법은 5명의 ETH를 3명의 수신자에게 보내려는 Alice의 예시로 돌아가는 것입니다. 이더리움의 경우 제출된 3개의 거래 모두 동일한 입력, 즉 Alice 계정의 잔액을 갖습니다.
거래 검증은 순차적으로 이루어지며 매번 5 ETH가 Alice의 잔액에서 차감되어 수신자 중 한 사람의 계좌에 적립됩니다.
모든 거래를 포함하는 새 블록을 추가하면 사용자 계정은 그림에 설명된 것과 같습니다.
이 사진은 정확하지 않습니다. 나중에 우리는 상태 간 전환이 정확히 어떻게 일어나는지 보여줄 것입니다.
Ethereum은 동일한 입력(거래 데이터)과 동일한 상태(Ethereum 블록체인의 현재 전역 상태)가 주어지면 EVM이 항상 동일한 출력을 생성한다는 의미에서 거래를 결정론적으로 검증합니다. 그러나 트랜잭션 유효성 검사 결과는 비결정적입니다. 검증 결과는 사용자의 기대와 다를 수 있습니다.
트랜잭션을 제출하는 동안 사용자는 트랜잭션 유효성 검사 시 전역 상태가 어떻게 될지 예측할 수 없습니다. 따라서 높은 확실성을 가지고 검증 결과를 추정하는 것은 불가능합니다. 그것은 단지 가정할 수 있을 뿐입니다.
여러 사용자가 동일한 잔액에 액세스할 수 있는 경우 동일한 잔액에서 일정 금액을 차감하는 여러 거래가 전송되는 일이 쉽게 발생할 수 있습니다. 금액이 1200ETH라고 가정해 보겠습니다. 세 명의 사용자가 독립적으로 금액에서 500 ETH를 공제하는 거래를 제출했습니다.
거래를 제출할 때 잔액에서 주어진 금액을 공제하는 것이 가능한 상황이 있을 수 있습니다. 아직 트랜잭션 중 하나도 전역 상태에 추가되지 않았습니다(네트워크에서 승인됨). 그러나 2개의 트랜잭션이 검증되면 세 번째 트랜잭션은 실패합니다. 두 거래에서 총 1000 ETH가 차감되었습니다. 잔액은 200 ETH에 불과합니다. 따라서 500ETH를 다시 인출하는 것은 불가능합니다. 2개의 트랜잭션이 성공했고 1개의 트랜잭션이 실패했습니다.
사진에서는 애플리케이션 계정에서 500 ETH를 가져오려는(공제) Bob과 Carol의 트랜잭션이 2번만 성공한 것을 볼 수 있습니다. Dave는 운이 좋지 않아 거래가 실패했습니다.
이 그림도 상태 전환 중 잔액의 점진적인 변화를 포착하지 못하기 때문에 완전히 정확하지는 않습니다. 다음 그림에서 이를 명확하게 설명할 것입니다.
이제 블록에 트랜잭션을 삽입할 때 순서의 중요성을 설명하겠습니다. Dave가 Bob과 Carol보다 먼저 거래를 제출했더라도 운이 좋지 않았을 수도 있습니다. 이는 블록 생산자 노드가 새 블록에 트랜잭션을 삽입하는 순서에 따라 다릅니다.
마찬가지로 Dave와 Carol의 거래가 블록에 첫 번째와 두 번째로 삽입되면 Bob의 거래는 실패합니다.
Bob, Carol 및 Dave가 거래를 제출하는 시점에는 거래에 대해서만 잔액 부분에 액세스할 수 없기 때문에 네트워크에 의한 성공적인 검증을 보장할 수 없습니다. 이는 트랜잭션이 입력 UTxO에 독점적으로 액세스할 수 있도록 허용한다는 점에서 UTxO 모델과 다릅니다.
그림에서 블록 준비 내의 상태 변화를 나타내는 4가지 상태를 볼 수 있습니다. 흰색 트랜잭션은 mem-pool에 있습니다. 2개의 녹색 거래는 N+1 및 N+2 상태의 DApp 잔액에서 500 ETH를 뺀 거래입니다. 빨간색은 N+3 상태에서 실패한 트랜잭션입니다. 각각의 새로운 상태에서 DApp 잔액(값이 점진적으로 차감됨)이 어떻게 변경되는지 확인할 수 있습니다. 처음에는 값이 1200, 그 다음에는 700, 마지막에는 200에 불과했습니다.
N+2 상태에서는 모든 트랜잭션이 동일한 DApp 잔액을 참조하지만 N+1 및 N 상태와는 다른 값을 갖습니다.
이더리움 글로벌 상태는 모든 계정과 컨트랙트 계정의 상태로 간주될 수 있습니다. 계정 상태에는 Ether 잔액이 포함되며, 계약 계정의 경우 계약에 정의된 모든 변수를 포함하여 스마트 계약의 현재 상태가 포함됩니다.
이더리움의 계정 기반 모델에서는 트랜잭션이 순차적으로 처리되어야 합니다. 이는 각 거래가 네트워크의 모든 계정 상태에 잠재적으로 영향을 미칠 수 있고 거래 결과가 처리 순서에 따라 달라질 수 있기 때문입니다. 따라서 일관성을 보장하고 이중 지출을 방지하려면 각 검증마다 전역 상태를 '잠금’해야 합니다. 즉, 한 번에 하나의 거래만 처리할 수 있습니다.
시스템의 무결성을 보장하려면 전역 상태를 잠그는 것이 필요합니다. 이러한 잠금 메커니즘이 없으면 두 거래가 동시에 동일한 자금을 사용하려고 시도하여 전역 상태에 불일치가 발생하고 잠재적으로 이중 지출이 허용될 수 있습니다. 트랜잭션을 순차적으로 처리하고 각 트랜잭션 후에 전역 상태를 업데이트함으로써 Ethereum은 각 트랜잭션이 일관된 상태로 처리되고 트랜잭션 순서가 시스템의 최종 상태에 영향을 미치지 않도록 보장합니다.
이미지는 이더리움의 글로벌 상태를 보여줍니다. 각 거래는 두 개의 잔액을 수정합니다. 빨간색 화살표는 잔액에서 가치가 차감되는 것을 나타내고 녹색 화살표는 잔액에 가치가 추가됨을 나타냅니다. 순차적으로 처리되는 일부 거래는 동일한 잔액을 조정한다는 점에 주목할 필요가 있습니다. 예를 들어, TX 1과 TX 2는 모두 동일한 잔액에서 값을 공제하고, TX 3과 TX 4는 동일한 잔액에 값을 추가합니다.
그림에서 이더리움이 트랜잭션을 순차적으로 처리하는 방법과 글로벌 상태의 잔액이 각 개별 상태에서 어떻게 변경되는지 확인할 수 있습니다. 빨간색 잔액은 잔액에서 값을 빼는 것을 나타내고, 녹색 잔액은 잔액에 값을 더함을 나타냅니다. 처리된 트랜잭션 내에서 두 잔액이 동시에(원자적으로) 변경됩니다.
이더리움 트랜잭션은 상태 저장으로 특징지어질 수 있습니다.
결론
컨텍스트나 전역 상태가 없으면 개인 키 소유자의 암호화 서명과 같은 트랜잭션의 특정 속성을 검증하는 것만 가능합니다. 자원을 소비하려면 상황이 필요합니다. 네트워크의 모든 노드는 노드가 새 블록을 구성할 때와 네트워크의 다른 노드에 의한 후속 검증 중에 활용되는 일관된 전역 상태를 유지해야 합니다.
Cardano에는 공유된 전역 상태가 부족하다는 말이 가끔 언급됩니다. 이는 이더리움의 경우 글로벌 상태의 중요성이라는 맥락에서 상당히 적절한 비유입니다. 그러나 Cardano에서는 거래 검증을 위한 컨텍스트도 중요합니다. Cardano의 경우 전역 상태는 단일 트랜잭션에서 한 번만 사용할 수 있는 고유하고 독립적인 개체 집합으로 구성됩니다. 입력 UTxO를 소비하면 새로운 UTxO가 생성됩니다. 이더리움의 경우 잔액은 언제든지 트랜잭션에 의해 반복적으로 수정될 수 있는 지속적인 개체입니다. 두 개의 이더리움 거래는 동일한 잔액을 동시에 수정할 수 없습니다. 따라서 트랜잭션의 순차적 처리가 필요합니다. 카르다노의 경우 트랜잭션이 서로 독립적이기 때문에 병렬화가 가능합니다.
결정론은 ZK 암호화에 유리합니다. 예를 들어 Cardano 생태계에서는 시퀀서가 필요하지 않은 ZK 롤업을 생성하는 것이 가능합니다.