블록체인 채용 과제
3 min readSep 5, 2021
(본 채용 과제는 종료되었으며, 관련 조직도 더이상 존재하지 않습니다. 참고로 기록을 남깁니다. )
목적
- 블록체인의 기본적인 합의 알고리즘인
PoW (Proof of Work)
를 이해하고, 이를 바탕으로 간단한 블록체인 시뮬레이션 프로그램을 구현해 본다.
필수 요구 사항
- 개발 언어는 무관하나 개발한 프로그램의 빌드 및 실행 환경 구성 방법을 반드시 명시
- 하기의 체인 구현의 PoW 채굴 합의 구현 필수
- 하기의 검증 구현 필수
참고 사항
- User address는 고려하지 않아도 무관함
- P2P network는 고려하지 않아도 무관함
- Transaction은 실제로 이루어지지 않아도 무관함
- 채굴은 자동으로 이루어지지 않아도 무관함
- 블록은 파일에 저장하지 않아도 무관함
- 암호화 관련 라이브러리(sha256 등)는 새로 작성하지 않아도 무관함
체인 구현
- 블록은 이전 블록의
hash, prevHash, nonce, transactions, timestamp
를 content로 가진다.
import java.util.List;
class Block {
public String hash;
public String prevHash;
public long nonce;
public List transactions;
public String timestamp;
}
hash
는sha256
으로 블록의 content를 string화 하여 계산한다. (Hash를 계산할 때 content의 자신의 hash는 제외한다.)
public String getContent() {
return prevHash + Long.toString(nonce) + transactions.toString() + timestamp;
}
- PoW 채굴 합의 구현 (필수)
- 체인은 난이도(
difficulty_bits
)를 가지며 난이도를 기준으로nonce
를 계산한다. - 채굴 대상 블록의 hash를 계산하여 나온 값이 목표 난이도 보다 작아야 한다.
- 목표 난이도의 경우 다음과 같은 공식을 따른다.
double target = Math.pow(2, 256 - difficulty_bits);
검증 구현
- 아래의 두가지 원칙에 의해 블록체인 제네시스 블록 (최초 블록)부터 마지막 블록까지 검증한다. (필수)
- 현재 블록에서 저장된 hash와 실시간으로 직접 계산한 hash가 같은지
- 현재 블록에 저장된 이전 블록의 hash와 실시간으로 직접 계산한 이전 블록의 hash가 같은지
주요 평가 기준
- 기능 적합성 : 요건을 정확하게 이해하고 요건에 맞게 구현하였는가?
- 설계 적합성 : 필요한 기능 구현을 위해 최대한 간결한 구조를 유지하면서도 적절한 유연성을 갖는가?
- 코드 가독성 : 소스 코드의 부분 부분이 의도하는 바가 명확하게 읽히고, 코드 상호간에 불필요한 결합이 없는가?