19 — 거래 증명 — 지갑 소유와 재전송 방지
예전 학습 예제의 공유 비밀 HMAC 대신 니드모어코인은 공개값으로 검증할 수 있는 슈노르 계열 증명을 거래의 서명 역할로 사용합니다. 비밀값은 지갑 소유자만 알고, 공개값은 다른 검증자가 사용할 수 있습니다.
거래에 무엇을 묶는가
거래 증명은 최소한 다음 문맥에 묶입니다.
- 보내는 주소
- 받는 주소
- 금액
- 수수료
- 거래번호
한국어 문장형에서는 다음처럼 작성합니다.
거래하나내용은 민수주소 에서 지수주소 에게 거래하나금액 코인 전송 수수료 거래하나수수료 거래번호 거래하나번호
거래하나서명은 민수비밀과 거래하나내용으로 영지식 비대화 증명 만들기
거래하나서명검증은 민수주소와 거래하나서명과 거래하나내용으로 영지식 비대화 검증
실행해 보기 →내장 어댑터는 보안 난수와 3072비트 MODP Group 15 부분군 계산, SHA-256 Fiat-Shamir 도전을 실제로 수행합니다. 이 예제에서는 그 비대화형 지식 증명을 거래 승인 서명 역할로 사용합니다.
변조를 시험하기
정상 거래는 25코인을 보냅니다. 프로그램 마지막에서는 금액만 250으로 바꾼 새 문맥에 기존 증명을 붙여 봅니다. 증명은 원래 문맥에 묶여 있으므로 검증이 실패하고, 그 거래를 담은 블록 해시도 원래 블록과 달라집니다.
재전송을 시험하기
서명 자체가 올바르더라도 이미 처리한 거래를 다시 적용하면 이중 지출이 생길 수 있습니다. 그래서 주소마다 마지막 거래번호를 상태에 저장합니다. 민수가 번호 1을 사용한 뒤 다음 정상 번호는 2입니다. 번호 1인 기존 거래를 다시 제출하면 거부합니다.
nme 실행 examples/needmorecoin-sentence.ko
정상 실행에서는 거래 변조와 재전송이 모두 거부되었다는 결과를 확인할 수 있습니다.
다음 20 — 전체 사슬 검증에서는 생성할 때 저장한 값을 믿지 않고 창세 상태부터 모든 거래와 블록을 다시 계산합니다.