For the complete documentation index, see llms.txt
ZK Loan tutorial
선행 요건: 먼저 shielded chips 예제를 끝까지 해 보세요. 이 튜토리얼은 이미 컨트랙트를 컴파일하고, 로컬 devnet을 실행하고, MidnightJS 테스트를 읽을 수 있으며, 컨트랙트가 witness가 반환하는 모든 값을 왜 검사해야 하는지 (Battleship 튜토리얼의 주제) 안다고 전제합니다.
이 튜토리얼은 실제 사용 사례인 비공개 신용 평가를 다룹니다. 대출자는 자신의 신용 점수, 소득, 재직 기간을 드러내지 않고도 특정 대출 등급 자격이 있음을 증명합니다. ledger에는 결과, 즉 대출의 상태와 승인 금액만 도달합니다. 컨트랙트는 그 결정을 기록할 뿐 토큰은 옮기지 않습니다.
witness만으로는 그 데이터를 신뢰할 수 없습니다. witness는 대출자의 기기에서 실행되므로, 대출자가 신용 점수를 마음대로 주장할 수 있습니다. 해결책은 attestation입니다. 은행이나 신용 평가 기관을 대신하는 신뢰할 수 있는 provider가 대출자의 실제 수치에 서명하고, 컨트랙트는 그 서명을 ZK 증명 안에서 검증합니다. 다음을 살펴봅니다.
- in-circuit 서명 검증. Jubjub 곡선 위의 Schnorr signature를 Compact 모듈이 검사하므로, 조작된 신용 데이터는 증명에 실패합니다.
- 오프체인 attestation API. circuit과 동일한 challenge 해시로 신용 데이터에 서명하는 작은 REST 서버입니다. 컨트랙트 자체의 pure circuit을 호출하기 때문입니다.
- witness에서 파생한 신원. private state에 있는 32바이트 비밀 하나에서 admin 키와 PIN에 묶인
대출자 키가 모두 나옵니다. 컨트랙트는
ownPublicKey()를 결코 신뢰하지 않습니다. - 고정 크기 배치 처리. circuit은 대출 건수가 가변적인 루프를 돌 수 없으므로, PIN을 바꾸면 ledger에 커서를 두고 한 번에 다섯 건씩 이전합니다.
이 튜토리얼의 소스는 midnight-examples의
examples/zk-loan에 있습니다.
Set up
midnight-examples를 클론하고, workspace를 설치한 뒤, 모든 컨트랙트를 컴파일합니다:
git clone https://github.com/midnightntwrk/midnight-examples.git
cd midnight-examples
yarn install && yarn compile
그런 다음 예제 디렉터리로 이동합니다:
cd examples/zk-loan
로컬 네트워크는 세 번째 파트에서 테스트를 실행할 때 시작합니다.
ZK Loan contract
서명된 attestation을 in-circuit으로 검증하고, 신청자를 비공개로 평가하며, 결과만 기록하는 Compact contract를 읽어 봅니다.
Attestation API
신용 데이터를 Schnorr signature로 서명하는 REST 서버를 읽어 봅니다. 그래야 컨트랙트가 데이터의 출처가 신뢰할 수 있는 provider인지 검증할 수 있습니다.
ZK Loan tests
MidnightJS로 로컬 devnet에서 전체 흐름을 실행합니다. 배포하고, provider를 등록하고, 대출을 받고, 조작된 데이터와 블랙리스트에 오른 대출자, 전직 admin이 거부되는 것을 지켜봅니다.