이더리움 Nonce(논스) 란 무엇인가?

Ohun Kwon
Hexlant
Published in
3 min readOct 26, 2018

이더리움을 이용한 서비스를 구축하고 운영할 때 필수적으로 알아야 할 내용이라고 생각되어 트랜잭션을 구성하고 있는 필드 중 하나인 nonce에 대해 알아보겠습니다.

- 모든 거래(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를 이용하여 해당 트랜잭션을 재전송하여 취소된 효과를 보실 수 있습니다.

참고 : https://kb.myetherwallet.com/transactions/check-status-of-ethereum-transaction.html

지금까지 이더리움 nonce 에 대해서 알아보았습니다. 블록체인 서비스를 운영한다면 꼭 필요한 내용으로 다시 찾아 뵙겠습니다.

감사합니다.

--

--