트랜잭션
- 외부소유계정(EOA)에 의해 서명된 메세지
- 즉, EOA에서 발생된 서명된 건만 트랜잭션이다!!
세부 Tx Flow
- 사용자가 서명한 Tx은 로컬”이더리움 노드에 의해 검증됨(유효성 검사)
- 해당 트랜잭션이 문법에 맞게 구성되어 있는지
- 전자서명은 유효한지 (1-a)
- 사용자A의 계정에 있는 NONCE 와 맞는지를 점검
- 트랜잭션 처리 비용을 계산
- 전자서명 수신처인 사용자B의 주소를 확인. (1-a)
- 유효성 검사가 성공하면 현재 노드는 모든 피어 노드(연결된 노드)에 트랜잭션을 브로드캐스트
- 트랜잭션은 검증된 후 트랜잭션을 생성한 ‘직접’ 연결된 다른 모든 이더리움 이웃 노드로 전송됨(적어도 13개의 노드들에 전파)
- 각 이웃노드들은 트랜잭션을 수신하자마자 즉시 유효성 검사
- 트랜잭션은 네트워크의 모든 노드가 트랜잭션 사본을 가질 때 까지 플러드(flood)됨 => flood routing 프로토콜 사용
- 이 때의 노드는 Go Ethereum(geth라고도 함) 또는 Parity와 같은 기존 Ethereum 클라이언트 중 하나를 실행하는 서버를 의미
- 트랜잭션은 결국 다양한 “채굴 노드”에 도달
- 마이닝 노드는 단순히 들어오는 트랜잭션의 유효성을 검사하는 것이 아니라 보상을 받을 수 있도록 적극적으로 처리하는 특수 노드
- 사용자A의 계정 잔액에서 처리 비용을 빼고 AccountNonce 를 +1 증가시킴. 잔액이 충분하지 않을 경우 에러를 반환하고 오류가 없다면 가스 총량에 가스 가격을 곱해 가스 비용을 계산하고 최종 실행을 위해 트랜잭션 풀에 등록함.
- 마이너는 트랜잭션 풀에서 트랜잭션 처리 비용이 높은 순으로 트랜잭션의 송금값을 A계정에서 B계정으로 전송함. B계정이 컨트랙트 어카운트 일 경우, 해당 컨트랙트 코드를 동작시킴. 이 코드는 - 컨트랙트가 완료되거나 실행비용(가스)가 모두 소진될 때까지 계속 실행.
- 만약 사용자 A 에게 충분한 돈이 없거나 가스가 소비되어 코드 실행을 할 수 없을 경우 등의 이유로 송금이 실패한다면 트랜잭션 처리 비용을 제외하고 모든 상태를 원복하고 트랜잭션 처리 대가를 마이너 계정에 추가함.
- 트랜잭션이 성공하면 처리 결과를 상태 DB 에 반영하고 남은 모든 가스를 이더로 환산한 후 A 에게 반환하고, 트랜잭션 처리 비용을 마이너에게 전송한다.
- 검증된 모든 수신 트랜잭션을 나열하는 새 블록을 생성
- 마이닝 노드가 블록체인에 새 블록을 성공적으로 추가하면 이를 피어 노드로 브로드캐스트
- 각 수신 노드는 블록의 유효성을 검사
- 블록에 포함된 트랜잭션을 처리한 다음 로컬 트랜잭션 Patricia-Merkle trie의 루트 해시와 로컬 Dapp 상태 Patricia-Merkle trie의 루트 해시가 해당 트랜잭션 루트 해시 및 상태 트리 루트 해시와 일치하는지 확인