needmoreeasy EN 한국어
배우기

니드모어코인 만들기 — 여섯 문법으로 배우는 실제 블록체인 핵심

이 가이드는 같은 작은 암호화폐를 NME의 세 문법 단계와 두 언어로 비교합니다. 목표는 코인 가격이나 투자 이야기가 아니라 블록체인이 실제로 어떤 상태와 검증 규칙을 가져야 하는지를 실행 가능한 코드로 확인하는 것입니다.

이 프로젝트는 학습용 단일 프로세스 블록체인입니다. 네트워크의 여러 컴퓨터가 서로 블록을 전파하는 P2P 노드, 영구 데이터베이스, 포크 선택, 멤풀, 난이도 조정, 프로덕션 키 보관은 포함하지 않습니다. 따라서 실제 돈을 맡기는 서비스나 투자 상품으로 사용하면 안 됩니다.

여섯 예제

문법 단계한국어영어핵심 목적
문장형needmorecoin-sentence.ko.nmeneedmorecoin-sentence.en.nme블록체인 흐름을 문장처럼 읽기
초급needmorecoin-beginner.ko.nmeneedmorecoin-beginner.en.nme따옴표, 연산자, 콜론, 들여쓰기로 구조를 더 정확히 보기
고급needmorecoin-advanced.ko.nmeneedmorecoin-advanced.en.nmePython과 같은 고급 NME로 자료구조와 검증 함수를 직접 구현하기

여섯 파일은 같은 개념을 가르치지만 문자 그대로 한 줄씩 번역한 파일은 아닙니다. 각 단계에서 가장 읽기 좋은 표현을 우선합니다.

한국어 문장형의 강한 순수성 규칙

needmorecoin-sentence.ko.nme는 실행 소스에 한글, 십진 숫자, 공백만 들어갑니다. 영문 식별자, 밑줄, 따옴표, 괄호, 쉼표, 콜론, 등호, 연산자, Python import, 주석조차 넣지 않습니다. 테스트는 문자 집합뿐 아니라 모든 비어 있지 않은 줄이 NME 컴파일러에 의해 실제로 변환되는지도 확인합니다. 따라서 Python 한 줄을 한국어 변수명으로 숨겨 놓는 방식도 통과하지 못합니다.

needmorecoin-sentence.en.nme도 같은 수준의 순수성 규칙을 적용합니다. 실행 소스에는 영문자, 십진 숫자, 공백만 들어가며 밑줄, 따옴표, 괄호, 쉼표, 콜론, 등호, 연산자, Python 함수 호출이나 주석을 넣지 않습니다. zero knowledge secret make, secret zero knowledge public make 같은 영어 문장형 암호 문구를 컴파일러가 실제 영지식 연산으로 낮춥니다. 한국어판과 마찬가지로 모든 비어 있지 않은 줄이 실제 NME 문장으로 변환되는지 회귀 테스트가 확인합니다.

실제로 계산하는 부분

문장형·초급 예제는 NME에 내장된 영지식 / zero_knowledge 어댑터를 사용합니다. 이 어댑터는 보안 난수, 3072비트 MODP Group 15 부분군, 유한체 슈노르 지식 증명, SHA-256 Fiat-Shamir 도전을 실제로 계산합니다. 여기서는 비대화형 슈노르 증명을 거래의 서명 역할로 사용합니다. 거래 문맥이 바뀌면 같은 증명이 검증되지 않습니다.

고급 예제는 같은 원리를 표준 Python 라이브러리만으로 직접 구현합니다. 지갑 비밀값은 secrets에서 만들고, 공개값과 슈노르 응답을 모듈러 지수 계산으로 구하며, 블록 작업증명은 hashlib.sha256으로 직접 계산합니다.

여섯 예제에서 공통으로 확인하는 보안 속성은 다음과 같습니다.

  1. 지갑 소유 증명 — 비밀값을 가진 사람만 거래 문맥에 맞는 증명을 만들 수 있습니다.
  2. 거래 변조 검출 — 25코인 거래를 250코인으로 바꾸면 원래 증명이 실패합니다.
  3. 재전송 방지 — 주소마다 증가하는 거래번호를 사용해 같은 거래를 다시 적용하지 않습니다.
  4. 작업증명 — 목표보다 작은 해시가 나올 때까지 후보를 반복해서 계산합니다.
  5. 블록 연결 — 새 블록 데이터에 이전 블록 해시가 들어가므로 과거 데이터를 바꾸면 뒤 블록도 달라집니다.
  6. 상태 재실행 — 검증기는 초기 잔액에서 거래를 다시 적용해 최종 상태를 계산합니다.
  7. 통화량 보존 — 초기 발행량과 새 채굴 보상의 합이 모든 지갑 잔액 합과 같은지 확인합니다.

실행하기

먼저 beta를 설치한 뒤 원하는 파일을 검사하고 실행합니다.

nme 검사 examples/needmorecoin-sentence.ko
nme 실행 examples/needmorecoin-sentence.ko

nme 검사 examples/needmorecoin-sentence.en
nme 실행 examples/needmorecoin-sentence.en

nme 검사 examples/needmorecoin-beginner.ko
nme 실행 examples/needmorecoin-beginner.ko

nme 검사 examples/needmorecoin-beginner.en
nme 실행 examples/needmorecoin-beginner.en

nme 검사 examples/needmorecoin-advanced.ko
nme 실행 examples/needmorecoin-advanced.ko

nme 검사 examples/needmorecoin-advanced.en
nme 실행 examples/needmorecoin-advanced.en

채굴에는 난수가 들어가므로 작업 횟수와 블록 해시는 실행마다 달라질 수 있습니다. 정상 실행에서는 사슬 검증, 거래 변조 거부, 재전송 거부, 통화량 검증이 성공해야 합니다.

1단계 — 통화 규칙부터 정하기

암호화폐를 만들 때 해시 함수부터 쓰기 전에 상태 규칙을 먼저 정합니다. 니드모어코인은 다음 규칙을 사용합니다.

  • 초기 발행량: 100
  • 블록 보상: 거래 블록마다 10
  • 거래 수수료: 거래마다 1
  • 거래 금액: 0보다 커야 함
  • 보내는 사람 잔액: 금액 + 수수료 이상이어야 함
  • 거래번호: 같은 주소에서 1씩 증가해야 함
  • 작업증명: 블록 해시가 정해진 목표를 만족해야 함

이 규칙을 먼저 적는 이유는 블록체인이 단순한 “해시 목록”이 아니기 때문입니다. 블록체인의 핵심은 모든 검증자가 같은 입력을 보고 같은 상태 결과를 내는 결정적인 상태 전이 규칙입니다.

2단계 — 지갑 만들기

문장형 한국어에서는 다음처럼 비밀값과 공개값을 만듭니다.

영지식 사용 최신
민수비밀은 영지식 비밀 만들기
민수주소는 민수비밀로 영지식 공개값 만들기
실행해 보기 →

민수비밀은 외부에 공개하면 안 되는 지갑 비밀값이고, 민수주소는 다른 사람이 검증에 사용할 공개값입니다. 학습 예제에서는 공개값 전체를 주소처럼 사용합니다. 실제 시스템에서는 공개키 직렬화, 체크섬, 주소 인코딩 등의 추가 계층을 두는 경우가 많습니다.

3단계 — 거래를 문맥으로 고정하기

서명할 대상은 모호한 문장이 아니라 재현 가능한 거래 내용이어야 합니다. 예제는 최소한 다음 항목을 문맥에 포함합니다.

  • 보내는 주소
  • 받는 주소
  • 금액
  • 수수료
  • 거래번호

문장형에서는 이 값들을 하나의 문맥으로 저장하고 그 문맥에 증명을 묶습니다.

거래하나내용은 민수주소 에서 지수주소 에게 거래하나금액 코인 전송 수수료 거래하나수수료 거래번호 거래하나번호
거래하나서명은 민수비밀과 거래하나내용으로 영지식 비대화 증명 만들기
거래하나서명검증은 민수주소와 거래하나서명과 거래하나내용으로 영지식 비대화 검증
실행해 보기 →

금액만 바꿔도 문맥이 달라지므로 이전 증명을 그대로 붙여 넣을 수 없습니다.

4단계 — 잔액과 거래번호 검증하기

암호 서명이 맞는 것만으로 거래가 유효해지는 것은 아닙니다. 서명이 맞아도 잔액이 부족하거나 거래번호가 이미 사용되었다면 거부해야 합니다.

검증 순서는 다음처럼 잡으면 이해하기 쉽습니다.

  1. 증명이 공개값과 거래 문맥에 맞는가?
  2. 금액이 0보다 큰가?
  3. 보내는 사람 잔액이 금액 + 수수료 이상인가?
  4. 거래번호가 직전 번호 + 1인가?
  5. 모두 맞을 때만 잔액을 변경하는가?

검증이 끝나기 전에 잔액부터 변경하지 않는 것이 중요합니다.

5단계 — 블록에 이전 해시 넣기

블록 하나의 입력에는 다음 정보가 들어갑니다.

  • 블록 높이
  • 이전 블록 해시
  • 거래 문맥
  • 거래 증명
  • 채굴자 주소
  • 보상
  • 작업번호 또는 채굴 후보값

이전 블록 해시가 바로 체인을 만듭니다. 블록 1을 바꾸면 블록 1의 해시가 달라지고, 블록 2가 기억하는 이전 해시와 맞지 않게 됩니다.

6단계 — 작업증명 채굴하기

한국어 문장형 예제는 내장 영지식 어댑터의 SHA-256 Fiat-Shamir 도전값을 256비트 블록 해시 후보로 재사용합니다. 후보가 작업목표보다 작을 때까지 새로운 일회값과 약속값을 만듭니다.

동안 블록하나채굴중
블록하나일회값은 영지식 일회값 만들기
블록하나약속후보는 블록하나일회값으로 영지식 약속 만들기
블록하나해시후보는 채굴자주소와 블록하나약속후보와 블록하나문맥으로 영지식 비대화 도전 만들기
블록하나시도에 1 더해
만약에 블록하나해시후보가 작업목표보다 작으면
블록하나해시는 블록하나해시후보
블록하나채굴중은 0
끝
끝
실행해 보기 →

고급 예제는 더 전형적인 형태로 블록 직렬화 결과를 SHA-256으로 계산하고 해시가 0으로 시작할 때까지 정수 nonce를 증가시킵니다. 두 방식 모두 학습용으로 낮은 난이도를 사용합니다. 난이도를 크게 올리면 실행 시간이 급격히 늘어날 수 있습니다.

7단계 — 블록을 믿지 말고 다시 검증하기

블록을 만들 때 사용한 변수만 보고 “정상”이라고 판단하면 검증기가 아닙니다. 검증 단계에서는 다음을 다시 계산해야 합니다.

  • 거래 문맥
  • 거래 증명 검증
  • 거래번호와 잔액 조건
  • 블록 해시
  • 작업증명 목표
  • 이전 해시 연결
  • 보상으로 증가한 발행량
  • 최종 잔액 합

고급 예제의 사슬검증 / validate_chain 함수는 이 과정을 처음부터 재실행합니다. 문장형 예제도 별도의 검증... 상태를 만들어 같은 원칙을 보여 줍니다.

8단계 — 일부러 공격해 보기

좋은 보안 예제는 정상 경로만 보여 주지 않습니다. 니드모어코인은 마지막에 두 공격을 직접 시도합니다.

거래 금액 변조

원래 25코인인 거래를 250코인으로 바꾸고 기존 서명을 붙입니다. 거래 문맥이 달라졌으므로 서명 검증이 실패하고 블록 해시도 원래 값과 달라집니다.

거래 재전송

민수가 이미 거래번호 1을 사용한 뒤 같은 거래번호 1을 다시 내려고 합니다. 검증기가 기대하는 번호는 2이므로 거부합니다.

새 보안 기능을 추가했다면 정상 동작과 함께 그 기능이 막아야 하는 공격도 예제에 추가하는 것을 권장합니다.

나만의 코인으로 바꾸기

처음에는 구조를 바꾸지 말고 아래 값만 수정하세요.

  1. 코인 이름을 바꿉니다.
  2. 초기 발행량을 바꿉니다.
  3. 채굴 보상과 수수료를 바꿉니다.
  4. 거래 금액 두 개를 바꾸고 잔액 검증이 계속 성공하는지 확인합니다.
  5. 문장형의 작업목표 또는 고급형의 채굴접두사를 조정해 난이도를 비교합니다.
  6. 세 번째 지갑을 만들고 거래 하나를 더 추가합니다.
  7. 새 거래를 담은 블록을 하나 더 만들고 이전 해시를 직전 블록으로 연결합니다.
  8. 검증기에 새 거래와 블록을 다시 계산하는 단계를 추가합니다.
  9. 기존 거래번호를 재사용하거나 금액을 바꾸어 거부되는지 확인합니다.

기능을 하나 추가할 때마다 먼저 nme 검사, 다음에 nme 실행을 사용하세요.

실제 네트워크로 확장하려면

이 예제 다음에는 다음 문제를 별도로 설계해야 합니다.

  • 블록과 거래의 명확한 바이너리 또는 정규 직렬화 형식
  • 디스크에 저장되는 체인 상태와 손상 복구
  • 멤풀과 중복 거래 처리
  • 여러 노드의 P2P 연결, 메시지 인증, 속도 제한
  • 경쟁 체인의 선택 규칙과 재구성 처리
  • 난이도 조정 또는 다른 합의 방식
  • 키 파일 암호화와 백업
  • 네트워크 식별자와 체인 ID
  • 시간, 최대 블록 크기, 최대 거래 크기 같은 자원 제한
  • 테스트넷, 퍼징, 재현 가능한 테스트 벡터, 보안 감사

이 항목들이 빠진 상태를 “프로덕션 암호화폐”라고 부르면 안 됩니다. 니드모어코인 예제의 목표는 그 전에 필요한 검증 가능한 단일 노드 블록체인 핵심을 작고 읽기 쉬운 코드로 익히는 것입니다.

다음 읽을거리

GitHub에서 이 문서 보기