블록체인 전자 투표의 핵심 기술 — 스마트 컨트랙트와 영지식 증명 완전 정리

블록체인 전자 투표의 핵심 기술 — 스마트 컨트랙트와 영지식 증명 완전 정리

비밀을 지키면서도 거짓말하지 않는다는 걸 증명할 수 있을까? 수학은 "그렇다"고 답한다.

이 글은 2026년 6월 기준으로 작성됐다. 영지식 증명 관련 기술은 빠르게 발전하는 분야이므로 최신 연구 동향도 함께 확인하길 권한다.

이 글은 블록체인 전자 투표 시리즈 2편이다. 블록체인 전자투표의 개념과 기존 전자투표의 문제점을 정리한 1편을 먼저 읽으면 이해가 빠르다.

1편에서 블록체인이 투표에 왜 필요한지를 다뤘다면, 이번 편은 "그래서 어떻게 작동하는가"의 차례다. 블록체인 전자 투표 시스템을 실제로 돌아가게 만드는 두 가지 기술, 스마트 컨트랙트영지식 증명(ZKP)을 중심으로 파고든다.


스마트 컨트랙트 — 중개인 없이 규칙을 집행하는 코드

스마트 컨트랙트는 블록체인 위에서 실행되는 자동화 프로그램으로, 조건이 충족되면 중개인 없이 자동으로 실행되는 계약 코드다. 이더리움을 포함한 대부분의 스마트 컨트랙트 플랫폼에서는 Solidity 같은 언어로 로직을 작성하고, 그 코드가 블록체인에 배포된다.

투표에 적용하면 이렇게 된다.

// 블록체인 전자투표 스마트 컨트랙트 개념 예시
contract BlockchainVote {
    // 후보자별 득표 수 저장
    mapping(address => uint) public votes;
    // 중복 투표 방지: 주소별 투표 여부 기록
    mapping(address => bool) public hasVoted;

    // 투표 함수: 조건 불충족 시 자동 거부
    function castVote(address candidate) public {
        require(!hasVoted[msg.sender], "이미 투표했습니다");
        hasVoted[msg.sender] = true;
        votes[candidate] += 1;
    }
}

이 코드에서 중요한 점은 어떤 관리자도 결과를 임의로 수정할 수 없다는 것이다. 조건(require)을 만족하지 않으면 거래 자체가 블록체인에서 거부된다. "선관위 직원이 숫자를 바꾼다"는 시나리오가 구조적으로 불가능해진다.

투표 스마트 컨트랙트의 4단계 실행 흐름

1. 배포 단계 — 투표 규칙(후보자 목록, 투표 기간)을 코드로 작성해 블록체인에 올린다
       ↓
2. 등록 단계 — 유권자 자격을 코드가 검증한다 (중복 방지 로직 포함)
       ↓
3. 투표 단계 — 유권자가 선택지를 전송하면 스마트 컨트랙트가 자동 기록
       ↓
4. 집계 단계 — 투표 종료 시각이 되면 코드가 자동으로 집계, 결과 공개

관리자가 집계 버튼을 누를 필요도 없고, 결과를 조작할 타이밍도 없다. 이 흐름 전체가 코드로 정의되어 있고, 그 코드는 블록체인에 공개되어 있다.


영지식 증명(ZKP)이란 무엇인가 — 비밀을 지키며 사실을 증명하는 수학

영지식 증명(Zero-Knowledge Proof, ZKP)은 어떤 정보의 내용을 공개하지 않으면서 그 정보가 사실임을 상대방에게 증명하는 암호학적 기법이다. 1985년 MIT 연구팀이 처음 제안한 개념으로, MIT의 영지식 증명 원론 논문(Goldwasser, Micali, Rackoff, 1985)이 이 분야의 출발점으로 알려져 있다.

직관적인 비유로 이해해보자.

친구에게 "나는 동굴의 비밀 문을 열 수 있는 암호를 알고 있다"는 것을 증명하고 싶다. 단, 암호 자체는 알려주기 싫다. 어떻게 할까?

방법: 친구가 보는 앞에서 동굴에 들어가 비밀 문을 통과해 반대쪽으로 나온다. 암호를 말하지 않았지만, 알고 있다는 사실은 증명했다.

투표에서 ZKP는 이렇게 활용된다.

증명해야 할 것 ZKP 적용 방식
"나는 유권자 명부에 있다" 명부의 특정 항목을 공개하지 않고 포함 여부만 증명
"나는 중복 투표하지 않았다" 어떤 후보에게 투표했는지 드러내지 않고 유효성만 증명
"내 표는 올바르게 집계됐다" 개인 투표 내용을 공개하지 않고 집계 포함 여부만 확인

ZKP의 3가지 필수 조건

ZKP가 유효하려면 다음 세 조건을 모두 만족해야 한다.

완전성(Completeness): 주장이 참이면, 정직한 증명자는 항상 검증자를 납득시킬 수 있다.

건전성(Soundness): 주장이 거짓이면, 어떤 속임수를 써도 검증자를 납득시키기 극도로 어렵다.

영지식성(Zero-Knowledge): 검증자는 주장의 참/거짓 외에 추가 정보를 얻지 못한다.

투표에 적용하면, 유권자가 "나는 유효한 유권자이고 아직 투표하지 않았다"는 것을 수학적으로 증명하되, 신원이나 투표 내용은 어디에도 남지 않는다.


두 기술을 결합하면 어떤 시스템이 되는가

스마트 컨트랙트만으로는 비밀투표를 보장하기 어렵다. 코드가 공개되어 있고 원장도 공개되어 있기 때문에, 투표 내용이 추적될 가능성이 있다.

ZKP만으로는 자동화된 집계와 중복 방지가 어렵다.

둘을 결합하면 이 문제가 해소된다.

[유권자]
  → ZKP로 자격 증명 생성 (신원 비공개)
  → 암호화된 투표 + 증명값을 스마트 컨트랙트에 전송
  → 컨트랙트가 ZKP 증명 자동 검증
  → 유효하면 익명 투표를 원장에 기록
  → 집계 시 동형 암호화로 내용 비공개 상태에서 합산

한국의 zkCrypto가 개발한 zkVoting 시스템이 이 아키텍처를 실제로 구현한 사례로 알려져 있다. zkCrypto의 zkVoting 기술 소개에 따르면, 완전한 비밀투표와 공개 검증을 동시에 제공하는 것을 핵심 목표로 설계됐다.

동형 암호화 — 암호화된 채로 더하기

ZKP와 함께 자주 언급되는 또 하나의 기술이 동형 암호화(Homomorphic Encryption)다. 데이터를 암호화한 상태 그대로 연산할 수 있는 기법으로, 투표에 적용하면 개별 투표 내용을 복호화하지 않고도 최종 합산 결과를 구할 수 있다.

쉽게 말해, 잠긴 상자 안에 숫자가 들어 있는데 상자를 열지 않고도 전체 합계를 계산하는 것이다. 개표 과정에서 비밀투표 원칙을 수학적으로 보장하는 방식이다.


자주 묻는 질문 (FAQ)

Q. 영지식 증명은 일반인이 이해하기 너무 어렵지 않나요? A. 원리 자체는 수학적으로 복잡하지만, 사용자 입장에서는 복잡한 수식을 알 필요가 없다. 투표 앱이 내부적으로 ZKP 연산을 처리하고, 유권자는 기존 전자 투표와 동일하게 후보를 선택하기만 하면 된다. 은행 앱을 쓰기 위해 RSA 암호화를 이해할 필요가 없는 것과 같다.

Q. 스마트 컨트랙트에 버그가 있으면 어떻게 되나요? A. 이것이 실제로 가장 큰 리스크 중 하나다. 2016년 이더리움의 DAO 해킹 사건처럼, 스마트 컨트랙트의 코드 버그는 돌이킬 수 없는 피해로 이어질 수 있다. 투표 컨트랙트는 배포 전 철저한 감사(Audit)와 형식 검증이 필수다. 이 때문에 현재 대부분의 구현이 소규모 파일럿에 머물러 있다.

Q. ZKP 연산은 기존 투표 집계보다 느린가요? A. 그렇다. ZKP 증명 생성은 상당한 연산 자원을 소모한다. 최근 zk-SNARK, zk-STARK 같은 경량화 알고리즘이 빠르게 발전하고 있어 처리 속도가 개선되고 있지만, 수천만 명 규모의 동시 투표에 적용하기 위한 확장성은 여전히 연구 과제로 남아 있다.


📝 정리

이번 글에서 다룬 핵심 내용:

  • [x] 스마트 컨트랙트가 투표 규칙을 코드로 자동 집행하는 원리
  • [x] 영지식 증명(ZKP)이 비밀투표와 검증 가능성을 동시에 가능하게 하는 방식
  • [x] 두 기술을 결합한 블록체인 전자 투표 시스템 아키텍처
  • [x] 동형 암호화로 암호화 상태에서 집계하는 개념

기술적으로는 이미 작동한다. 그렇다면 왜 국가 선거에 도입되지 않는 것일까? 다음 편에서는 세계 각국의 실제 도입 사례와 한국이 풀어야 할 현실적 과제를 다룬다.