반응형

Nonce란?


가장 위에 위치한 nonce는 “이 트랜잭션이 트랜잭션을 생성하는 어카운트 내에서 몇 번째로 발생하는 트랜잭션인지”를 나타내는 16진수 값이다. 


이더리움은 이중 지불과 같은 악의적인 공격이나 트랜잭션 순서가 뒤섞이는 것을 방지하기 위해 nonce 값을 활용한다. 


201번째인 위 트랜잭션이 성공적으로 수행된 뒤에는 반드시 nonce 값 0xca(202)를 가진 트랜잭션이 발생해야 하며 그 외의 경우에는 client가 잘못된 트랜잭션으로 판단해 네트워크에 반영하지 않는다.


즉, Nonce는 해당하는 사용자가 보낸 트랜잭션의 넘버링에 해당될 수 있다.


A 클라이언트가 2번째 트랜잭션을 보냈고 B 클라이언트도 2번째 트랜잭션을 보내면 서로 각 트랜잭션의 Nonce는 2이다.



- 모든 거래(Trancsaction)는 일회성이다.

- nonce는 계정에서 보내는 트랜잭션에 할당 된 번호이다.


● 거래(transaction)를 전송시 nonce는 1씩 증가합니다.

● nonce는 계정에서 유일합니다. 동일한 nonce 가 존재 하지 않습니다.


예)최초 계정 생성시 nonce는 0 (계정 기준으로 전송된 트랜잭션이 하나도 없을때 )

전송한 Transaction1 : 1(nonce)

전송한 Transaction2 : 2(nonce)

전송한 Transaction3 : 3(nonce)

....

...

...

전송한 Transaction10 : 10(nonce)




nonce 규칙


트랜잭션은 순서대로 이루어져야 한다.

현재 계정의 nonce가 1이라면, nonce가 0인 트랜잭션을 전송할 수 없다. (오류발생 : 순서를 역행할 수 없다)


순번을 건너 뛰지 않는다.

nonce 는 순차적으로 증가하고 처리되기 때문에 nonce 가 3인 트랜잭션을 전송하려면, nonce의 값 0~2까지 전송한 내역이 있어야 한다.


예) nonce 가 3 인 트랜잭션 전송 시, 현재 계정의 nonce가 1일 경우, 트랜잭션이 처리되지 않고 Transaction Pool Queue 에 남아있게 된다. 만약 nonce가 2인 트랜잭션을 전송하였을 경우 2, 3 이 연달아 처리된다.




왜 nonce가 필요할까?


nonce는 중복되지 않고 순차적이기 때문에, 같은 nonce 에 여러 트랜잭션 전송이 발생하였다면 해당 nonce 중 제일 높은 가스비를 지불한 트랜잭션이 처리된다. 이더리움에서는 이러한 방법으로 이중 지불 문제를 방지한다.




그럼 nonce 를 통해 트랜잭션을 취소할 수 있을까?


결론적으로 트랜잭션이 네트워크에 정상적으로 전파되었다면 취소하는 방법은 존재하지 않는다. 그러나 nonce 를 기존보다 높게 설정되었거나, 너무 낮은 가스를 지불하였을 경우 아직 Transaction Pool 에 남아있는 상태(Pending)라면 nonce를 이용하여 해당 트랜잭션을 재전송하여 취소된 효과를 보실 수 있다.









(비트코인 Nonce 정의, 이더리움에서 채굴할때 Nonce는 아래와 유사 위의 Nonce는 트랜잭션 Nonce임을 알아야 한다.)


- 64비트의 부호 없는 정수(unsigned integer)


- White Paper에는 "각 트랜잭션이 오직 한번만 처리되게 하는 일종의 카운터"로 설명된다.


- 보통 채굴자는 nonce를 하나씩 증가시키면서 블록 해시값이 목표값을 달성하는지 검사한다.


즉, 목표값(앞에서부터 0의 개수가 k개인걸 찾아야함)을 찾았다면 종료되지만 목표값을 찾지 못했다면(0의 개수가 k개 이상을 만족못하면) nonce를 늘려가며 목표값을 찾아가는 과정을 반복한다. 블록의 해쉬는 타임스탬프, 채굴자 주소 등에 의존적이기 때문에, 채굴자마다 서로 다른 nonce값을 찾아야 한다.



반응형