이더리움 구성요소
- Peer-to-Peer 네트워크(P2P network) - 이더리움은 TCP 포트 3030으로 접속 가능한 이더리움 메인 네트워크(Ethereum man network)에서 실행된다.
- 합의 규칙(Consensus rules) - 이더리움의 합의 규칙은 기준 사양인 황서(Yellow paper)에 정의되어 있다.
- 트랜잭션(Transaction) - 이더리움 트랜잭션은 보낸 사람, 받는 사람, 값 및 데이터 페이로드가 포함된 네트워크 메시지이다.
- 상태 머신(State Machine) - 이더리움 상태 전이는 바이트코드(기계명령어)를 실행하는 스택 기반 가상 머신인 EVM(이더리움 가상 머신)에 의해 처리된다.
- 데이터 구조(Data Structure) - 이더리움의 상태는 트랜잭션 및 시스템 상태가 머클 트리(Merkle Tree)라고 하는 직렬화(Seriallize)된 해시 데이터 구조로 각 노트의 데이터 베이스에 저장된다.
- 합의 알고리즘 - 이더리움은 비트코인의 합의 모델인 나카모토 합의를 사용한다. 나카모토 합의는 순차 단일 서명 블록을 사용하여 작업 증명(PoW)의 중요도 가중치가 가장 긴 체인(현재 상태)를 결정한다. 그러나 이더리움 2.0부턴 지분증명(PoS) 가중 투포 시스템으로 전환할 계획인다.
- 경제적 보안성 - 이더리움은 현재 Ethash라는 작업 증명(PoW) 알고리즘을 사용하지만, 향후에는 결국 지분 증명(PoS) 알고리즘을 사용할 예정이다.
- 클라이언트 - 이더리움은 클라이언트 소프트웨어를 상호운용할 수 있는 구조체를 갖고 있다. 가장 유명한 것은 게스(Go-Ethereum, Geth)와 패리티(Parity)이다.
작동 방식
- 이더리움은 본질적으로 트랜잭션에 기반한 상태 머신이다.
- 상태 머신은 일련의 정보를 읽고 바탕으로 새로운 State로 이동하는 시스템을 의미한다.
- 이더리움 상태 머신은 소위 제네시스(Genesis)라 불리는 state에서 출발하며 제네시스는 네트워크에서 어떠한 트랜잭션도 발생하지 않은 State를 말한다.
- 이더리움의 State는 수백만의 트랜잭션으로 이루어져 있는데, 이는 블록 단위로 묶여있다.
- 블록은 일련의 트랜잭션들을 포함하고, 각각의 블록들은 이전 블록과 블록 해시를 매개로 연결되어 있다.
- 하나의 State로부터 다음 State로 넘어가기 위해서는 반드시 해당 트랜잭션이 유효한 트랜잭션이어야 한다.
- 트랜잭션이 유효하다면, 네트워크에 참여하는 다수의 채굴자 노드들로부터 경쟁적인 채굴을 거쳐 블록으로 병합 및 등록된다.
이더리움 계정(Account)
- 이더리움의 상태(State)는 글로벌하게 공유되며 이는 계정(Account)을 매핑시킨 주소들의 집합이다.
- 특정 계정은 메시지 전달 프레임워크를 통해 다른 계정과 상호작용한다.
- 각 계정은 자신에 대한 정보와 20바이트의 주소를 가진다.
계정 종류
- 외부 소유 계정(EOA: Externally Owned Account)
개인 키가 있다.
개인키로 제어되며 코드를 저장할 수 없다.
자금 또는 컨트랙트에 대한 접근을 제어한다.
트랜잭션을 시작할 수 있다.
- 컨트랙트 계정(CA: Contract Address)
개인 키가 없다.
스마트 컨트랙트 로직에 의해 제어되며 스마트 컨트랙트 코드를 저장할 수 있다.
개인키가 없어 스스로 트랜잭션을 시작할 수 없다.
외부 트랜잭션에 대한 응답을 통해 트랜잭션을 실행할 수 있다.
계정의 구성 요소
(1) Nonce - 각 트랜잭션이 오직 한번만 처리되게 하는 카운터
EOA의 경우, 해당 계정의 주소로부터 시작한 트랜잭션들의 수를 의미하며, CA의 경우, 해당 계정에 의해 생성된 컨트랙트의 수를 의미한다. (블록 헤더에 식별자로 기록되는 Nonce와 다름. 계정의 nonce는 숫자 세는 용도)
(2) Balance - 계정의 현재 Ether 잔고
해당 계정이 소유하고 있는 Wei의 양 (10^(-18)Wei = 1 ETH).
(3) StorageRoot -계정의 저장공간(초기 설정에는 비어있음)
머클 패트리샤 트리의 루트 노드를 해싱한 값으로 이더리움의 TX(트랜잭션)를 보관하고 유효성을 검증하기 위한 자료구조로 계정에 저장된 요소들을 해시값으로 암호화 하였다. 초기값은 비어있다.
(4) Codehash - 계정의 컨트랙트 코드(값이 없을 수 있음)
EVM(Ethereum Virtual Machine)에서 실행될 코드의 해시값이며 CA의 경우, 해당 계정에서 실행시킬 스마트 컨트랙트 코드의 해시값이다.
EOA의 경우, 코드를 저장할 수 없기 때문에 비어있는 문자열의 해시값이다.
트랜잭션(Transaction)
트랜잭션(Transaction)은 외부 소유 계정(EOA)에 의해 서명된 바이너리 메시지이다. 이더리움 네트워크에 의해 전송되고 이더리움 블록체인에 기록된다. 트랜잭션은 EVM에서 상태 변경을 유발하거나 컨트랙트를 실행할 수 있는 유일한 방법이다.
트랜잭션 구조
- 논스(nonce)
발신 EOA에 의해 발행되어 메시지 재사용을 방지하는데 사용되는 일련번호로 탈중앙화된 시스템에서 트랜잭션 처리 우선순위를 판별할 때 사용된다. - 가스 가격(gas price)
발신자가 지급하는 가스의 가격 - 가스 한도(gas limit)
이 트랜잭션을 위해 구입할 가스의 최대량 - 수신자(recipient)
목적지 이더리움 주소 - 값(value)
목적지에 보낼 이더의 양 - 데이터(data)
선택적(optional) 데이터 필드 => 컨트랙트 메시지를 담을 수 있는 데이터 필드, 가변 길이 바이너리 데이터 페이로드 - v,r,s
EOA의 ECDSA 디지털 서명의 세가지 구성요소
!!! 트랜잭션 구조를 살펴보면 발신자(from)의 데이터가 없다는 것을 알 수 있다. 이 발신자에 대한 정보는 v,r,s 구성요소부터 알아낼 수 있고 이는 공개키를 통해 주소를 알아낼 수 있음을 의미한다.
트랜잭션은 하나의 서명된 데이터 패키지이다. 이더를 한 계정에서 다른 계정으로, 또는 컨트랙트로 보내거나 컨트랙트의 함수 호출 및 새 컨트랙트를 배포할 때의 서명으로 쓰인다.
타원곡선암호를 기반으로 하는 디지털 서명 알고리즘인 ECDSA(타원곡선 디지털 서명 알고리즘)를 이용하여 서명되며 메시지 수신자, 송신자를 식별하고 의도를 증명하기 위한 서명, 전송할 이더의 양, 트랜잭션 실행을 위해 허용되는 최대 연산 단계, 트랜잭션 송신자가 각 연산 단계를 위해 지불할 의사가 있는 비용을 포함한다.
위 트랜잭션 이미지에서 포함하고 있는 값들 중, 세 항목 to, signature, value는 암호화폐에서 거의 표준처럼 사용되는 값이다.
data는 초기값으로 설정된 기능을 가지고 있지 않지만, EVM(이더리움 가상 머신)은 컨트랙트가 이 데이터에 접근할 때 사용할 수행코드(opcode)를 가지고 있다.
예를 들어, 블록체인 위에 도메인 등록 서비스로 기능하고 있는 컨트랙트가 있을 경우, 이 컨트랙트로 보내지는 data는 두개의 필드를 가지고 있는 것으로 해석할 수 있다. 첫번째 필드는 등록하고자 하는 도메인이고, 두번째 필드는 IP 주소이다. 컨트랙트는 메시지 데이터로부터 이 값들을 읽어서 저장소 내 적당한 위치에 저장한다.
내용이 복잡할 수 있는데 간단하게 EVM에는 해당 데이터에 어떤값이 존재하는 지 미리 알고 있다고 이해하면 편하다.
트랜잭션 가스
가스는 이더리움의 연료로 트랜잭션 및 연산 발생 시 발신자가 부담하는 수수료이며 이는 채굴자에게 보상으로 지급된다.
이더리움은 트랜잭션에 가스를 부과하여 트랜잭션 발생과 트랜잭션이 이용하는 자원의 양을 제어하며, 가스 가격을 조정해 트랜잭션 컨펌 우선순위를 조정할 수 있다.
트랜잭션에서 과도한 연산이 발생해 가스 한도(gas limit)를 넘어설 경우 해당 트랜잭션 처리를 중단한다.
가스 가격(gas price) * 가스 한도(gas limit) = 최대 수수료
트랜잭션 수신자
20바이트의 이더리움 주소를 포함하며 EOA 또는 CA일 수 있다.
이더리움은 해당 필드를 검증하지 않으며 모든 20바이트 값은 유효하다고 간주한다.
트랜잭션 페이로드
트랜잭션의 주요 페이로드는 값과 데이터에 포함된다.
값과 데이터, 값만, 데이터만, 값과 데이터 모두 가지지 않는 네가지 조합이 모두 유효하다. 값만 있는 트랜잭션은 지급(payment), 데이터만 있는 트랜잭션은 호출(invocation), 값과 데이터를 모두 사용하는 트랜잭션은 지급과 호출이다.
지급 트랜잭션은 EOA인지 CA인지에 따라 다르게 작동한다.
EOA의 경우, 이더리움은 상태 변경을 기록하여 주소 잔액에 보낸 값을 추가하고 CA인 경우, EVM은 컨트랙트를 실행하고 트랜잭션의 데이터 페이로드에 지정된 함수를 호출하려 한다.
데이터가 없으면 폴백 함수를 호출하고, 폴백함수가 설정되지 않은 경우, EOA와 마찬가지로 컨트랙트의 잔액을 늘린다.
호출 트랜잭션은 대부분 컨트랙트로 향하며 전달된 데이터는 EVM에 의해 컨트랙트 호출로서 해석되고 컨트랙트에서는 이를 함수 호출로 사용한다.
컨트랙트 생성 트랜잭션
컨트랙트 생성 트랜잭션은 제로 어드레스라고 하는 특수 대상 주소로 전송된다.
컨트랙트 생성의 수신자 주소는 0x0으로, 해당 주소는 EOA나 CA를 나타내지 않으며 이더를 소비하거나 트랜잭션을 시작할 수 없다.
트랜잭션 전파
이더리움 네트워크는 '플러드 라우딩(flood routing)' 프로토콜을 사용한다.
각 이더리움 클라이언트는 메시 네트워크를 형성하는 P2P 네트워크 에서 노드 역할을 한다.
트랜잭션 전파는 서명된 트랜잭션을 생성한 이더리움 노드에서 시작해 이웃 노드라 불리는 직접 연결된 다른 모든 이더리움 노드로 전송된다.
각 이웃 노드는 트랜잭션을 수신하면 즉시 유효성을 검사한다.
트랜잭션의 유효성이 입증되면 이웃 노드들은 해당 사본을 저장하고 모든 이웃에세 트랜잭샨을 전파한다.
결과적으로 트랜잭션은 네트워크의 모든 노드가 트랜잭션 사본을 가질 때까지 시작 노드에서 바깥쪽으로 물결 치며 퍼진다(flooding).
메시지(Message)
위 트랜잭션에서 설명한 것과 같이 컨트랙트는 다른 컨트랙트에게 메시지를 전달할 수 있다. 메시지는 따로 저장될 필요가 없는 이더리움 실행환경(EVM)에서만 존재하는 가상의 객체이다. 메시지는 다음 값들을 포함하고 있다.
- from: (암묵적으로) 메시지 발신처
- to: 메시지 수신처
- value: 메시지와 함께 전달되는 이더
- data: 선택적 데이터 필드
- gaslimit: STARTGAS 값
메시지는 EOA가 아닌 컨트랙트에 의해 생성된다는 것을 제외하면 트랜잭션과 유사합니다. 현재 코드 수행을 하고 있는 컨트랙트가 메시지를 생성하고 실행하라는 수행코드(opcode)를 만나게 되면 메시지를 생성한다. 트랜잭션과 마찬가지로, 메시지는 해당 코드를 실행하는 수신자 계정(컨트랙트 계정)에 도달하게 된다.
따라서, 컨트랙트는 EOA가 하는 것과 정확히 같은 방식으로 다른 컨트랙트와 관계를 맺을 수 있다. 트랜잭션이나 컨트랙트에 의해 할당된 gas 허용치는 그 트랜잭션과 모든 하위 실행에 의해 소모된 총 gas에 적용된다.
예를 들어, EOA인 A가 B에게 1000gas와 함께 트랜잭션을 보내고, B는 600gas를 소모한 뒤 C에게 메시지를 보내고, C의 내부 실행에 300gas소모한 후 반환하면, B는 gas가 모두 소모되기 전에 100 gas를 더 사용할 수 있다.
예시.
A가 B에게 5ETH를 전송하면서 이더리움이 100만원이 되면 B가 2ETH를 C에게 전송
위와 같은 트랜잭션을 만든다고 가정했을 때
우선 A는 자신의 EOA로 이 내용을 담은 트랜잭션을 만들어서 서명을하고 블록에 포함시켜야 한다. A가 보낸 트랜잭션은 모든 노드들이 검증한 후 블록에 담겨 B에게 전송된다. 이 트랜잭션에는 이더를 송금하는 것 외에 이더리움이 100만원이 되면 C에게 2ETH 전송이라는 조건을 담은 메시지가 들어 있어 B의 CA는 이 메시지를 저장한다. 이더리움이 100만원이 되면, B의 CA는 A로부터 받은 계약을 자동으로 실행시킨다. 3ETH를 B의 EOA에 전송하고 남은 2ETH를 C의 EOA로 전송한다. C에게 전송할 땐 조건이 없어 CA로 보낼 필요가 없다.
이렇게 자동으로 실행되는 것이 스마트 컨트랙트이다.
https://brownbears.tistory.com/385
스마트 컨트랙트
스마트 컨트랙트는 계약의 내용과 실행의 조건을 코드를 통해 사전에 설정한 후 해당 조건이 충족되면 블록체인 네트워크에서 자동적으로 계약을 집행하는 것을 말한다.
솔리디티나 바이터와 같은 프로그래밍 언어로 작성된 스마트 컨트랙트는 EVM 위에서 실행되며 이를 위해서 저수준의 바이트 코드로 컴파일 되어야 한다.
스마트 컨트랙트 코드는 일단 배포되면 변경할 수 없으며 수정하는 유일한 벙법은 새로운 인스턴스를 배포하는 것이다. 실행한 결과물은 그것을 실행한 모든 노드에게 동일한데, 이는 실행을 시작한 트랜잭션의 컨텍스트와 실행 시점에 이더리움 블록 체인의 상태가 동일하기 때문이다.
작동 방식
- 스마트 컨트랙트를 작성한다.
- 컨트랙트를 EVM에서 실행되는 저수준의 바이트 코드로 컴파일 한다.
- 컴파일되면 컨트랙트 생성 트랜잭션을 사용하여 이더리움 플랫폼에 배포된다.
- 배포된 컨트랙트는 트랜잭션에 의해 호출된 경우에만 실행되며 자체적으로 백그라운드에서 실행되지 않는다.
- 트랜잭션은 원자성(atomic)을 가지는데 모든 실행이 성공적으로 종료된 경우에만 상태 변경 사항이 기록 및 실행되고 오류로 인해 실행이 실패하면 모든 상태 변경 트랜잭션이 실행되지 않은 것처럼 롤백된다.
- 한번 배포된 컨트랙트는 수정이 불가하지만 삭제하여 해당 주소에서 코드와 스토리지를 제거하고 빈계정으로 남길 수 있다.
- 컨트랙트를 삭제하면 가스 환불이 발생하며, 이는 삭제를 통해 네트워크 클라이언트 자원을 반환하도록 하는 동기부여로 작용한다.
- 컨트랙트를 삭제하더라도 트랜잭션 내역은 제거되지 않는다.
'Block chain' 카테고리의 다른 글
스마트 컨트랙트(Smart Contract)의 작동 원리 (2) | 2022.08.23 |
---|---|
ABI (2) | 2022.08.23 |
Defi 용어 정리 (0) | 2022.07.08 |