작업증명
피어 투 피어 방식으로 분산 타임스탬프 서버를 구현하기 위해, 우리는 신문이나 유즈넷 게시물 대신 애덤 백(Adam Back)의 해시캐시(Hashcash)[6]와 유사한 작업증명(proof-of-work) 시스템을 사용해야 합니다. 작업증명은 SHA-256과 같은 해시 함수로 해싱했을 때, 해시가 여러 개의 0 비트(zero bits)로 시작하는 값을 찾기 위해 특정 값을 스캔하는 과정을 포함합니다. 필요한 0 비트의 수에 따라 평균적으로 필요한 작업량은 지수적으로 증가하며, 단일 해시 실행으로 검증할 수 있습니다.
우리의 타임스탬프 네트워크에서는, 작업증명을 구현하기 위해 블록 내의 논스(nonce)를 증분(incrementing)하여 블록의 해시가 요구된 0 비트를 만족할 때까지 반복합니다. 작업증명을 충족시키기 위해 CPU가 소모된 후에는, 해당 블록은 작업을 재수행하지 않고는 변경할 수 없습니다. 이후에 이어지는 블록들이 그 뒤에 연결되기 때문에, 그 블록을 변경하려면 그 이후의 모든 블록들의 작업증명을 다시 수행해야 합니다.
Block: 블록
Prev Hash: 이전 블록 해시
Nonce: 임시 값
Tx(Transaction): 거래
작업증명은 또한 다수결(majority decision making)에서의 대표성 문제를 해결합니다. 만약 다수가 한 IP 주소당 한 표(one-IP-address-one-vote)에 기반한다면, 많은 IP 주소를 할당받을 수 있는 자에 의해 시스템이 장악될 수 있습니다. 작업증명은 본질적으로 CPU 당 한 표(one-CPU-one-vote)에 해당합니다. 다수의 결정은 가장 많은 작업증명이 투입된 가장 긴 체인(longest chain)으로 대표됩니다. 만약 다수의 CPU 파워가 정직한 노드들에 의해 통제된다면, 정직한 체인이 가장 빠르게 성장하여 경쟁 체인을 앞설 것입니다. 과거의 블록을 변경하려면 공격자는 해당 블록과 그 이후의 모든 블록들의 작업증명을 다시 수행한 후, 정직한 노드들의 작업을 따라잡아 앞서야 합니다. 이후에 이어지는 블록이 추가될수록, 더 느린 공격자가 이를 따라잡을 확률은 지수적으로 감소함을 우리는 나중에 증명할 것입니다.
시간이 지남에 따라 노드를 운영하는 하드웨어의 속도가 증가하고 노드 운영에 대한 관심이 변동함에 따라, 작업증명의 난이도(difficulty)는 시간당 평균 블록 수를 목표로 하는 이동 평균(moving average)에 의해 결정됩니다. 블록이 너무 빨리 생성되면 난이도가 증가합니다.