이더리움 상태
EVM의 작업은 이더리움 프로토콜에 정의된 대로 스마트 컨트랙트 코드의 실행 결과로 유효한 상태 변화를 계산하여 이더리움 상태를 업데이트하는것이다. 이러한 측면에서 이더리움을 트랜잭션 기반 상태 머신으로 설명할수 있고, 이것은 외부의 주체가 트랜잭션 생성, 수락 및 주문을 통해 상태 변화를 시작한다는 사실을 반영한다.
가장 상위 레벨에서보면 이더리움 월드상태(world state)가 있다. 월드 상태는 이더리움 주소를 계정(account)에 매핑한것이다. 이더리움 주소는 이더 잔액(balance), 논스, 계정의 스토리지, 계정의 프로그램 코드를 의미한다.
- 이더 잔액은 계좌가 소유한 웨이로 저장된다.
- 논스는 계정이 EOA일 경우 해당 계정에서 성공적으로 전송한 트랜잭션의 수를 나타낸다. 컨트랙트 계정일 경우엔 생성-된 컨트랙트의 수를 나타낸다.
- 계정의 스토리지는 스마트 컨트랙트에서만 사용하는 영구 데이터 저장소이다.
- 프로그램 코드는 계정이 스마트 컨트랙트 계정일 때만 존재한다. EOA에는 항상 코드가 없고 스토리지는 비어 있다.
- 트랜잭션이 스마트 컨트랙트 코드를 실행하면, EVM은 생성중인 현재 블록 및 처리중인 특정 트랜잭션과 관련하여 필요한 모든 정보로 인스턴스화된다.
- EVM의 프로그램 코드 ROM에는 컨트랙트 계정 코드가 로드되고, 프로그램 카운터는 0으로 설정되며, 스토리지는 먼트랙트 계정의 스토리지에서 로드되고, 메모리는 모두 0으로 설정되어 모든 블록 및 환경 변수가 설정된다.
- 코드가 실행될 때 가스 비용에 따라 가스 공급량이 감소하다 0이되면 Out Of Gas, OOG 예외가 발생하고 실행이 즉시 중단되고 트랜잭션이 중단된다.
- 이더리움 상태는 변경되지 않으며, 단지 송금자의 논스가 증가되고 이더 잔액이 정지 지점까지 코드를 실행하는 데 사용한 자원에 대한 블록의 수혜자에게 지급하기 위해 줄어든다.
- 이 시점에서 EVM은 이더리움 월드 상태의 샌드박스 사본에서 실행되고 있다고 생각할 수 있으며, 실행을 완료할 수 없는 경우 이 샌드박스 버전은 완전히 삭제된다.
- 실행이 완료되면 실제 상태가 호출된 컨트랙트의 저장 데이터 변경, 생성된 새로운 컨트랙트 및 시작된 모든 이더 잔액 전송을 포함하여 샌드박스 버전과 일치하도록 업데이트한다.
- 스마트 컨트랙트가 사실상 트랜잭션을 시작할 수 있기 때문에 코드 실행은 재귀적 프로세스다.
컨트랙트는 다른 컨트랙트를 호출할 수 있으며, 각 호출이 새로운 호출 대상을 중심으로 다른 EVM을 인스턴스화 한다.
- 각 인스턴스는 상위 레벨 EVM 샌드박스의 초기화된 샌드박스 월드상태를 가진다. 만약 각 인스턴스가 지정된 양의 가스를 공급받지 못하면 예외가 발생하여 샌드박스 상태는 삭제되고 실행은 상위 레벨 EVM으로 돌아간다.
'BlockChain' 카테고리의 다른 글
Solidity 취약점 #1 (0) | 2022.01.11 |
---|---|
Solidity 취약점 카테고리화 (0) | 2022.01.11 |
Solidity #4 (0) | 2022.01.07 |
Solidity #3 (0) | 2022.01.06 |
Solidity #2 (0) | 2022.01.05 |