블록체인

Nonce란?

ziwookim 2022. 11. 8. 00:56

Nonce (논스: 임시값)

블록체인에서 목표값 이하의 블록 해시를 찾기 위해 임시로 사용하는 숫자이다. 임시값이라고도 한다.

 블록을 대표하는 해시값인 블록해시를 생성하려면, 일정한 조건을 만족해야 한다. 그 일정한 조건이란, 블록 난이도에 따라 자동으로 설정된 '목표값'보다 더 작은 블록 해시값을 찾아야 한다는 제약조건이다. 해시는 랜덤하게 생성되기 때문에, 수없이 많은 연산을 반복해서 미리 정해진 목표값 이하의 해시값이 나오도록 해야 한다. 이때 랜덤한 해시값을 생성할 수 있도록 매번 임시값을 사용해야 하는데, 그 임시값이 바로 Nonce이다.

 

비트코인 Nonce

비트코인 nonce는 블록 헤더의 일부분을 구성하며, 이를 PoW(Power of Work) 작업증명 프로세스의 일부로 엔트로피를 제공하여 난이도 요건을 충족하는 해시를 찾기 위해 사용한다. 이는 마이닝 소프트웨어 및 하드웨어의 환경 설정에 따라 달라질 수 있지만, 이론상 nonce 값의 분포는 무작위적이어야 한다.

 

Nonce 값의 계산

결론부터 말하자면 nonce 값은, 이 nonce 값을 입력값 중의 하나로 해서 계산되는 블록 해쉬값이 특정 숫자보다 작아지게 하는 값을 말한다. 그리고 해쉬 함수의 특성상, 어떤 해쉬값(A라고 하면)을 결과로 나오게 하는 입력값을 찾으려면, A에서 역산을 하는 방식으로는 찾을 수 없고, 결과가 A가 될 때까지 무작위로 입력값을 계속 바꿔가면서 찾아낼 수 밖에 없다. 그 입력값을 바꿀 수 있는 유일한 통로가 바로 nonce다. 다시 말해, ‘블록 헤더’란에 포함된 6가지 정보 중에서 확정되지 않아서 값을 바꿀 수 있는 유일한 항목이 nonce다. nonce 값을 1씩 증가시키면서 반복적으로 계산한 블록 해쉬값이 특정 숫자보다 작은 값이 나오면, 그 때의 nonce 값으로 계산한 블록 해쉬가 그 블록의 블록 해쉬로 확정되고, 블록 해쉬라는 식별자를 얻은 그 블록은 새로운 블록으로서 블록 체인에 추가되며 작업이 완료 된다. 블록 해쉬가 특정 숫자보다 낮게 나올 때의 nonce 값이 바로 작업 증명을 나타내는 nonce 값이다.

 

작업 난이도

블록 해쉬가 특정 숫자보다 낮게 나올 때의 nonce 값을 찾아내는 것이 작업 증명이라고 했다. 작업 난이도는 nonce 값 계산의 어려운 정도를 나타낸다.

 

비트코인 Nonce 사례

예를 들어, 비트코인의 제520,654번째 블록의 해시값을 찾기 위해 사용한 nonce값은 0xe1c63570이었다.

 

이더리움 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 중 가장 높은 가스비를 지불한 트랜잭션이 처리된다. 이더리움에서는 이러한 방법으로 이중 지불 문제(double spending)를 방지다.

 

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

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

출처:

https://medium.com/hexlant/%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80-nonce-%EB%85%BC%EC%8A%A4-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-60819346c803

https://peterdrinker.tistory.com/101

http://wiki.hash.kr/index.php/%EB%85%BC%EC%8A%A4_(%EC%9E%84%EC%8B%9C%EA%B0%92)