EIP-196 alt_bn128 곡선 덧셈·곱셈 프리컴파일 (Precompiled contracts for addition and scalar multiplication on the elliptic curve alt_bn128)
최종 확정 · EVM·실행 · 원문 상태 Final · 2017-02-02 작성
특정 타원곡선(alt_bn128) 위의 점 덧셈과 스칼라 곱셈을 미리 구현해 둔 계약(프리컴파일)을 주소 0x6과 0x7에 추가합니다. zkSNARK 검증을 블록 가스 한도 안에서 할 수 있게 하는 기초 연산입니다.
왜 필요한가
이더리움 스마트 컨트랙트 실행은 모든 내용이 공개되기 때문에 위치, 신원, 과거 거래 내역 같은 사적인 정보를 다루는 용도에는 맞지 않습니다. 영지식 증명 기술인 zkSNARK(지케이스나크)는 내용을 공개하지 않고도 계산이 올바르다는 사실을 증명할 수 있어 이 문제의 해법이 될 수도 있습니다. 이더리움 가상머신(EVM)이 이론상 zkSNARK를 다룰 수는 있지만 지금은 연산 비용이 너무 커서 블록 가스 한도 안에 들어가지 못합니다. 그래서 이 EIP는 zkSNARK를 이루는 기초 연산 몇 가지의 파라미터를 미리 정해 두고 클라이언트가 효율적으로 구현하게 해서 가스 비용을 낮추자고 제안합니다. 파라미터를 고정하면 쓰임새가 줄어들 것 같지만 이 연산들은 매우 기초적이어서 유연하게 조합이 가능하고 추가 하드포크 없이도 이후 zkSNARK 연구 발전을 수용할 수 있을 것이라고 원문은 설명합니다.
무엇이 바뀌나
지금
- 컨트랙트 실행 내용이 모두 투명하게 공개되어 사적인 정보를 다루는 응용을 만들기 어렵습니다
- EVM 코드만으로 zkSNARK 검증을 구현하면 비용이 블록 가스 한도를 넘습니다
- 주소 0x6과 0x7에는 정해진 기능이 없습니다
EIP-196 이후
- 주소 0x6에서 타원곡선 점 덧셈(ADD), 주소 0x7에서 스칼라 곱셈(MUL)을 바로 쓸 수 있습니다
- EIP-197의 페어링 검사와 묶으면 스마트 컨트랙트 안에서 zkSNARK를 검증할 수 있습니다
- ECADD 500 가스, ECMUL 40000 가스로 비용이 고정됩니다
누구에게 영향이 있나
- 사용자: 영지식 증명의 성질 덕분에 프라이버시를 지키는 응용이 가능해지고 간결한 증명과 효율적 검증은 확장성 해법이 될 수도 있습니다.
- 앱·컨트랙트 개발자: 곡선 연산을 직접 EVM 코드로 짜지 않고 두 프리컴파일을 호출해 zkSNARK 검증 컨트랙트를 만들 수 있습니다.
- 클라이언트 팀: 비잔티움(Byzantium) 포크 블록부터 두 프리컴파일을 구현해야 하며 잘못된 입력 처리와 가스 소모 규칙을 원문대로 맞춰야 합니다.
- 기존 컨트랙트: 해당 주소를 이미 쓰던 컨트랙트는 의미가 바뀌지만 주소를 256 미만의 예약 영역에서 골라 영향을 줄였습니다.
심층 설명
추가되는 프리컴파일과 곡선 정의
block.number가 BYZANTIUM_FORK_BLKNUM 이상이면 타원곡선 alt_bn128 위의 점 덧셈(ADD)과 스칼라 곱셈(MUL) 프리컴파일이 추가됩니다. ADD의 주소는 0x6, MUL의 주소는 0x7입니다. 곡선은 Y^2 = X^3 + 3으로 정의되고 체 F_p의 소수 p는 21888242871839275222246405745257275088696311157297823662689037894645226208583입니다.
인코딩 규칙
체 원소와 스칼라는 32바이트 빅엔디언 숫자로 인코딩합니다. 곡선 점은 체 원소 두 개 (x, y)로 적고 무한원점은 (0, 0)으로 적습니다. 여러 객체는 이어 붙여 전달합니다. 입력이 기대보다 짧으면 뒤를 0으로 채운 것으로 간주하는데, 이는 CALLDATALOAD 명령의 의미와 호환됩니다. 입력이 기대보다 길면 끝의 남는 바이트는 무시합니다. 반환 데이터의 길이는 항상 명세대로이며 줄이지 않습니다.
정확한 의미와 실패 조건
두 계약 모두 입력 점이 곡선 위에 없거나 점 좌표인 체 원소가 p 이상이면 실패하고 제공된 가스를 전부 소모합니다. 반면 스칼라는 0부터 2**256-1 사이의 어떤 수여도 됩니다. ADD는 두 곡선 점 (x, y)를 받아 alt_bn128 위의 점 덧셈 결과 x + y를 돌려줍니다. MUL은 곡선 점과 스칼라 (x, s)를 받아 스칼라 곱셈 결과 s * x를 돌려줍니다. 테스트 케이스에는 좌표를 mod p로 줄이면 유효해지는 점은 실패해야 하고 빈 입력은 성공해야 하며 군의 위수보다 크거나 체의 위수보다 큰 스칼라 곱셈은 성공해야 한다는 항목이 들어 있습니다.
가스 비용
ECADD의 가스 비용은 500, ECMUL의 가스 비용은 40000입니다. 곡선과 파라미터가 고정되어 있기 때문에 이렇게 비용을 미리 정할 수 있습니다. 원문 Rationale은 곡선과 체 파라미터를 입력으로 받는 방식도 검토했지만 가스 비용을 정하기가 훨씬 어려워지고 실제 타원곡선이 아닌 것에 대해 계약을 호출할 수 있게 되어 명세가 복잡해진다는 이유로 기각했다고 밝힙니다.
왜 alt_bn128인가
alt_bn128은 zkSNARK, 더 구체적으로는 그 검증의 핵심 블록인 페어링 함수에 특히 잘 맞아서 선택되었습니다. 이 곡선을 고르면 ZCash와의 시너지를 활용해 그쪽 구성 요소와 산출물 일부를 재사용할 수 있습니다. 점 인코딩은 압축하지 않는 방식을 택했는데, y 좌표 전체가 포함되어 컨트랙트 안에서도 일부 연산을 수행할 수 있고 세 번째 사영 좌표가 없어 인코딩된 두 점을 그대로 비교해 같은지 확인할 수 있기 때문입니다. 구현체로는 libff(C++), bn(Rust), py_pairing(Python)이 소개되어 있고 두 코드베이스에서 이 군을 G1이라고 부릅니다.
하위 호환성과 상태
어떤 프리컴파일이든 새로 도입되면 그 주소를 이미 쓰고 있던 컨트랙트의 의미가 바뀝니다. 그래서 주소를 256 미만의 예약 영역에서 가져왔습니다. 이 EIP는 상태가 Final이며 명세대로 BYZANTIUM_FORK_BLKNUM부터 적용되는 비잔티움 하드포크의 일부입니다. EIP-197의 페어링 검사와 결합하면 이더리움 스마트 컨트랙트에서 zkSNARK를 검증할 수 있습니다.