목적
이 글에서는 논스를 자세히 살펴보며, 블록체인이 순서를 유지하는 동시에 블록이 중복되는 것을 막는 데 어떤 도움을 주는지에 대해 설명합니다.
참고 정보
요약
대부분의 블록체인에는 두 가지 유형의 논스가 있습니다. 하나는 계정 논스(account nonce), 다른 하나는 합의 증명 논스(proof of consensus nonce)입니다. 계정 논스는 지갑 주소와 관련된 트랜잭션들을 위한 대기열 역할을 합니다. 첫 번째로 추가된 블록의 계정 논스는 1이고, 두 번째 블록의 계정 논스는 2, 이렇게 계속 증가하는 방식입니다. 계정 논스의 기록을 유지함으로써, 해당 체인과 상호작용하는 모든 시스템들은 이러한 질서를 유지하기 위한 다음 계정 논스가 무엇인지 알 수 있습니다.
합의 증명 논스는 현재 블록에서 원하는 "다음" 해쉬를 생성하기 위해 계산된 숫자입니다. 계정 논스가 결정된 후, "이전" 해쉬가 기록되고 트랜잭션이 기록됩니다. 체인이 계속될 수 있도록 블록에는 "다음" 해쉬가 필요하게 됩니다. "다음" 해쉬가 0x0000과 같은 특정 수열로 반드시 시작해야 하는 경우, 이를 달성하는 유일한 방법은 생성된 "다음" 해쉬가 필요한 표준을 충족할 때까지 블록에 숫자를 추가하는 것입니다. 이렇게 생성된 숫자가 합의 증명 논스입니다. 검증자(validator)가 소프트웨어를 사용하여 블록체인 트랜잭션을 처리할 때, 블록이 체인에 추가될 수 있도록 블록의 논스를 결정하는 데 필요한 계산을 수행하는 경우가 많습니다. 올바른 논스를 얻기 위한 계산이 완료되면, 다음 블록을 찾은 검증자는 보통 블록체인의 암호화폐로 보상을 받습니다.
논스는 거래에 대한 보안을 더해줍니다. 아무도 거래 사본을 정확하게 만들 수 없기 때문입니다. 이를 리플레이 공격(replay attack)이라고 부릅니다. 리플레이 공격에서 악의적인 행위자들은 이미 진행되어 승인된 트랜잭션을 복사하여 자신에게 유리하게 일부 변경을 가합니다. 하지만, 블록을 체인에 추가하려면 합의 증명 논스를 계산해야 하므로, 원본을 먼저 작성해야 하는데요. 일단 작성이 되면, 계정 논스 덕분에 트랜잭션이 고유함을 확인하고, 추후 복사되어 다시 보내질 수 없다는 것을 보장할 수 있습니다. 또한, 계정 논스는 유저가 지갑에 있는 것보다 더 많이 지출하려고 트랜잭션을 여러 번 시도하는 중복 거래를 방지합니다. (이러한 중복 거래는 이중 지불(double spending)이라고 불립니다.) 각 트랜잭션에 대한 계정 논스는 고유값을 갖기 때문에, 블록체인이 동일한 논스를 여러 번의 시도에서 보는 경우, 하나의 시도만 수락하고 나머지는 거부합니다. 각 트랜잭션은 고유성을 보여주는 계정 논스와, 해쉬에 서명하고 리플레이 공격으로부터 블록을 보호하기 위한 합의 증명 논스라는 이중 장치를 통해 더 안전하게 만들어집니다.