트랜잭션은 evm에서 상태 변경을 유발하거나 컨트랙트를 실행하는 유일한 방법이다.
아래 데이터를 포함한 serialized binary message(By RLP: Recursive Length Prefix)
발신자의 데이터는 EOA의 공개키를 ECDSA 서명의 v, r, s 구성요소로부터 알아낼 수 있다.
즉, 발신자 데이터는 트랜잭션에서 파생된 것이지 트랜잭션 메시지의 일부가 아니다.
정의
: 해당 주소에서 보낸 트랜잭션 건수 또는 연결된 코드가 있는 계정의 경우 이 계정에서 만든 컨트랙트 생성 건수와 동일한 스칼라 값.
--> 트랜잭션에 할당된 번호
nonce가 포함되어 있다면 두 트랜잭션의 우선 순위를 정하거나, 개별 트랜잭션의 복제를 막을 수 있다.
논스가 0인 트랜잭션 전송 후 2인 트랜잭션을 전송하면, 두번째 트랜잭션은 어떤 블록에도 포함되지 않다가 누락된 논스가 나타날 때까지 기다린다.
2개 이상의 컴퓨터에서 출금을 실행 시 문제가 발생할 수 있다.
해결책
1. 단일 컴퓨터를 사용하여 트랜잭셩에 서명하는 컴퓨터에 선착순으로 논스를 할당.
2. 트랜잭션 생성 후 논스를 할당하지 않다가 서명되지 않은 트랜잭션들을 한 노드의 대기열에 올려서 이 노드가 트랜잭션을 서명하고 논스를 관리하게 하는 것. --> 병목 발생, but 대부분의 솔루션이 출금 트랜잭션을 처리하는 단일 프로세스를 만든다.
트랜잭션이 사용할 수 있는 자원의 양 제한.
20바이트 이더리움 주소.
이더리움은 이 필드를 검증하지 않고 유효한 것으로 간주.
잘못된 주소로 보내면 영구 소실된 것으로 간주.
payload는 value 와 data라는 2개의 필드에 포함된다.
src=web3.eth.accounts[0];
dst=web3.eth.accounts[1];
web3.eth.sendTransection({from: src, to: dst, value: web3.towei(0.01, "ether"), data: ""});
지급의 경우 트랜잭션은 대상 주소가 컨트랙트인지 여부에 따라 다르게 작동한다.
to가 컨트랙트라면 EVM은 컨트랙트를 실행하고 data 페이로드에 지정된 함수 호출, 데이터가 없으면 fallback 실행.
새로운 컨트랙트를 만들어 배포하는 경우에는 zero address라고 하는 특수 대상 주소로 전송된다.
이 필드는 목적지로만 사용되며, 컨트랙트 작성이라는 특별한 의미로 사용된다.
개인키-공개키 쌍을 생성.
용도
1. 계정과 개인키 소유자가 이더 지출 또는 컨트랙트 이행을 승인했음을 증명
2. 부인 방지
3. 트랜잭션 데이터를 수정할 수 없음을 증명
Sig = F_sig(F_keccak256(m), k)
m: RLP 인코딩된 트랜잭션
F_keccak256: Keccak-256
F_sig: 서명 알고리즘
Sig: 결과 설명 =(r,s)
s = q^-1 (Keccak256(m) + r k) (mod p)
q: 일시적인 개인키
계산을 통해 얻어낸 Q의 x좌표가 r과 같으면 유효하다.
발신자 필드가 포함된 이유: ECDSA를 통해 계산될 수 있기 때문
K_1 = r^-1(sR-zG)
K_2 = r^-1(sR'-zG)
s: 서명 값
G: 타원 곡선 생성자 점
목적 보안 때문
트랜잭션에 서명하는 컴퓨터는 잠금 해제된 개인키가 메모리에 로드되어 있어야 한다.
전송을 수행하는 컴퓨터는 인터넷에 연결되어서, 이더리움 클라이언트를 실행해야 한다.
--> 개인 키 유출 위험.
서로 다른 시스템에서 서명과 전송을 하는 것을 오프라인 서명이라고 한다.
'flood routing' 프로토콜
각 이더리움 클라이언트는 mesh 네트워크를 형성하는 P2P 네트워크에서 node 역할을 한다.
트랜잭션은 검증된 후 트랜잭션을 생성한 '직접' 연결된 다른 모든 이더리움 노드로 전송된다.
적어도 13개 이상의 노드에서 유효성 검사 후 모든 이웃에게 전파.
모든 노드가 사본을 가질 때까지 flooding 하게 되는 것.
일부 노드의 경우 GPU가 장착된 컴퓨터인 채굴팜에 트랜잭션 및 블록을 제공한다.
채굴 팜은 블록 후보를 유효하게 하는 작업증명을 찾으려 시도한다.
여러 당사자가 트랜잭션에서명할 때만 자금을 사용할 수 있는 다중 서명 계정이 비트코인에 있다.
이 기능을 이더리움에서 사용하려면 이더를 다중 서명 요구사항이나 지출 한도와 같이 원하는 지출 규칙으로 프로그래밍한 '지갑 컨트랙트'로 보내야 한다.