> For the complete documentation index, see [llms.txt](https://whs3-doge5k.gitbook.io/smartcontract-security-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://whs3-doge5k.gitbook.io/smartcontract-security-docs/basics/1./undefined/pow.md).

# 작업증명(PoW)

합의 알고리즘은 신뢰 관계가 없는 객체들이 분산된 네트워크에서 시스템의 무결성을 보장하기 위해 미리 정의된 절차를 따라 수학적 계산 결과를 서로 검증하는 방법이다.

어떻게 수학적 계산이 시스템의 무결성을 보장할 수 있는지 작업증명(Proof-of-Work, PoW)의 절차를 따라가며 설명하겠다.

PoW 방식에서는 컴퓨터가 수학적 계산을 수행하고, 특정 기준을 만족하면 트랜잭션 데이터를 포함하는 블록을 생성하여 이전 블록에 연결한다. 이를 흔히 "채굴"이라 부른다. 여기서 이전 블록은 가장 많은 계산 수행량(computational work)을 가진, 즉 가장 긴 블록체인이 기준이 된다. "가장 긴 블록체인을 이전 블록으로 정한다"는 원칙이 시스템의 무결성을 보장하는 핵심이다.

<figure><img src="https://2462457462-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLf9vwRuaws92ULgGvzTi%2Fuploads%2FIhAxJL2DMokIq74r5E7X%2Fimage.png?alt=media&amp;token=559c46ea-6690-4d72-8694-38bc6025d100" alt=""><figcaption></figcaption></figure>

***

### PoW 절차

1. **블록 후보 생성:** 트랜잭션 데이터를 포함한 새 블록을 구성한다.
2. **nonce 찾기(채굴):** 특정 조건(예: 해시값 앞부분에 특정 개수의 연속된 0)을 만족하는 SHA-256 해시값을 얻기 위해 nonce 값을 반복적으로 변경하며 계산한다.
3. **해시 조건 충족 시 블록 생성:** 조건을 최초로 만족하는 nonce를 찾은 노드가 블록을 생성하여 네트워크 전체에 전파한다.
4. **다른 노드의 검증:** 다른 참여자들이 생성된 블록을 검증하고 자신의 장부에 추가한다.

왜 가장 긴 블록체인을 이전 블록으로 정해야 하는지 이해하려면 위의 2, 3단계를 주의 깊게 살펴보아야 한다.

***

### 채굴 과정: nonce 찾기

채굴 과정을 이해하려면 먼저 SHA-256 해시함수의 원리를 알아야 한다. 해시함수는 입력값(문자열)을 넣으면 예측 불가능한 무작위의 해시값을 만든다. 암호화된 해시값으로부터 원본 입력값을 역으로 알아내려면 무차별 대입 방식으로 추론하는 수밖에 없다.

즉, 트랜잭션 데이터와 특정 숫자(nonce)를 결합하여 SHA-256 해시함수에 입력하면 무작위의 해시값이 생성된다. 이 해시값이 특정 조건(예: 30개의 연속된 0으로 시작하는 이진수보다 작은 값)을 만족하도록 nonce를 반복적으로 시도해 찾는 것이 블록 채굴 과정이다. 이때 연속된 0의 개수(조건)는 자동으로 조절되며, 평균적으로 10분마다 새로운 블록이 생성되도록 설계되어 있다. 조건을 만족시키는 nonce를 가장 먼저 찾은 채굴자가 블록을 생성하고, 이전 블록에 연결하여 블록체인에 추가하며, 보상으로 코인을 받게 된다. 이 보상 체계 때문에 전세계 수많은 사람이 채굴을 위해 컴퓨팅 자원을 사용한다.&#x20;

{% embed url="<https://andersbrownworth.com/blockchain/blockchain>" %}

이 링크로 채굴하는 과정을 실습해보자. 이전 블록의 해시값에 따라 이후 블록의 해시값과 Nonce 모두 영향받음을 알 수 있다.

<figure><img src="https://2462457462-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLf9vwRuaws92ULgGvzTi%2Fuploads%2FmqnWVp04lUdz9surxs15%2Fimage.png?alt=media&amp;token=2577dfe1-b5ae-41e4-9685-d2b709fe3382" alt=""><figcaption><p><a href="https://andersbrownworth.com/blockchain/blockchain">https://andersbrownworth.com/blockchain/blockchain</a></p></figcaption></figure>

이처럼 추가되는 블록은 이전 블록 해시도 포함하고 있기 때문에, 위조된 트랜잭션 내역을 추가하더라도 그 블록을 유효한 것으로 유지하려면 이후의 모든 블록을 지속적으로 가장 먼저 채굴하여 연결해야 한다. 그러나 nonce를 계산하기 위해서는 직접 값을 하나씩 넣어보는 방법밖에 없기 때문에, 전체 네트워크 채굴 파워의 51% 이상을 확보하지 않는 한 현실적으로 불가능한 작업이다. 따라서 "가장 많은 계산 수행량을 가진 블록체인에 블록을 연결한다"는 원칙이 시스템의 무결성을 보장하게 된다.
