블로그 1뉴스 개발자 엔터프라이즈 블록 체인 설명 이벤트 및 컨퍼런스 보도 자료뉴스 레터

뉴스 레터 구독.

이메일 주소

우리는 귀하의 개인 정보를 존중합니다

홈 블로그 블록 체인 개발

zk-SNARK 소개

영 지식 증명에 대한 개요와 zk-SNARK를 이더 리움에 통합하는 방법. by ConsenSys 3 월 27, 2017 게시일 3 월 27, 2017

홈 영웅

이 포스트에서 우리는 실용적인 관점에서 zk-SNARK에 대한 개요를 제공하는 것을 목표로합니다. 우리는 실제 수학을 블랙 박스로 취급하고 그것을 어떻게 사용할 수 있는지에 대한 몇 가지 직감을 개발하려고 노력할 것입니다. 또한 최근 작업을 간단히 적용하여 이더 리움에 zk-SNARK 통합.

영 지식 증명

영 지식 증명의 목표는 검증자가 증인이나 다른 사람에게 증인을 공개하지 않고 증인이라고하는 비밀 매개 변수에 대한 지식을 보유하고 있다는 것을 스스로 확신 할 수 있도록하는 것입니다..

우리는 C (x, w)라는 두 가지 입력을받는 C로 표시된 프로그램을 갖는 것으로보다 구체적으로 생각할 수 있습니다. 입력 x는 공개 입력이고 w는 비밀 감시 입력입니다. 프로그램의 출력은 부울, 즉 true 또는 false입니다. 목표에는 특정 공개 입력 x가 주어지고 증명자가 C (x, w) == true가되는 비밀 입력 w를 알고 있음을 증명합니다..

특히 비대화 형 제로 지식 증명에 대해 논의 할 것입니다. 즉, 증명 자체는 증명 자의 상호 작용없이 확인할 수있는 데이터 덩어리입니다..

예제 프로그램

Bob에게 어떤 값의 해시 H가 주어지고 Alice가 H에 해시되는 값 s를 알고 있다는 증거를 갖고 싶다고 가정합니다. 일반적으로 Alice는 Bob에게 s를 제공하여이를 증명 한 다음 Bob이 해시를 계산하고 확인합니다. H와 같다.

그러나 Alice가 s 값을 Bob에게 공개하고 싶지 않고 대신 자신이 값을 알고 있다는 것을 증명하고 싶다고 가정 해 보겠습니다. 그녀는이를 위해 zk-SNARK를 사용할 수 있습니다..

다음 프로그램을 사용하여 Alice의 시나리오를 설명 할 수 있습니다. 여기에서는 Javascript 함수로 작성되었습니다.

function C (x, w) {return (sha256 (w) == x);} 코드 언어 : JavaScript (javascript)

즉, 프로그램은 공개 해시 x와 비밀 값 w를 가져와 w의 SHA–256 해시가 x와 같으면 true를 반환합니다..

함수 C (x, w)를 사용하여 Alice의 문제를 번역하면 Alice가 s를 공개 할 필요없이 C (H, s) == true와 같은 s를 소유하고 있다는 증거를 만들어야한다는 것을 알 수 있습니다. 이것이 zk-SNARK가 해결하는 일반적인 문제입니다..

zk-SNARK의 정의

zk-SNARK는 다음과 같이 정의 된 세 가지 알고리즘 G, P, V로 구성됩니다.

키 생성기 G는 비밀 매개 변수 람다와 프로그램 C를 가져 와서 공개적으로 사용 가능한 키 2 개, 증명 키 pk, 확인 키 vk를 생성합니다. 이러한 키는 특정 프로그램에 대해 한 번만 생성하면되는 공개 매개 변수입니다..

제공자 P는 증명 키 pk, 공개 입력 x 및 개인 증인 w를 입력으로받습니다. 알고리즘은 증명자가 증인 w를 알고 있고 증인이 프로그램을 충족한다는 증거 prf = P (pk, x, w)를 생성합니다..

검증 자 V는 증명이 정확하면 true를 반환하고 그렇지 않으면 false를 반환하는 V (vk, x, prf)를 계산합니다. 따라서이 함수는 증명자가 C (x, w) == true를 만족하는 증인을 알고 있으면 true를 반환합니다..

여기에서 생성기에서 사용되는 비밀 매개 변수 람다를 확인하세요. 이 매개 변수로 인해 실제 애플리케이션에서 zk-SNARK를 사용하기가 까다로울 수 있습니다. 그 이유는이 매개 변수를 아는 사람은 누구나 가짜 증명을 생성 할 수 있기 때문입니다. 특히 모든 프로그램 C와 공개 입력 x가 주어지면 람다를 아는 ​​사람은 v (vk, x, fake_prf)가 비밀 w를 알지 못해도 참으로 평가되는 fake_prf 증명을 생성 할 수 있습니다..

따라서 실제로 생성기를 실행하려면 아무도 매개 변수에 대해 배우고 저장하지 못하도록하는 매우 안전한 프로세스가 필요합니다. 이것이 매우 정교한 의식 Zcash 팀은 검증 키와 검증 키를 생성하기 위해 수행했으며, 프로세스에서 “독성 폐기물”매개 변수 람다가 폐기되었는지 확인했습니다..

예제 프로그램을위한 zk-SNARK

Alice와 Bob은 Alice가 위의 예에서 비밀 값을 알고 있음을 증명하기 위해 실제로 zk-SNARK를 어떻게 사용합니까??

우선 위에서 논의한 바와 같이 다음 함수로 정의 된 프로그램을 사용합니다.

function C (x, w) {return (sha256 (w) == x); } 코드 언어 : JavaScript (자바 스크립트)

첫 번째 단계는 Bob이 검증 키 pk 및 검증 키 vk를 생성하기 위해 생성기 G를 실행하는 것입니다. 먼저 람다를 무작위로 생성하고이를 입력으로 사용합니다.

(pk, vk) = G (C, 람다)

앨리스가 람다의 값을 알게되면 가짜 증명을 만들 수 있기 때문에 매개 변수 람다를주의해서 다루십시오. Bob은 Alice와 pk 및 vk를 공유합니다..

앨리스는 이제 증명 자의 역할을 할 것입니다. 그녀는 알려진 해시 H에 해시되는 값 s를 알고 있음을 증명해야합니다. 입력 pk, H 및 s를 사용하여 증명 알고리즘 P를 실행하여 증명 prf를 생성합니다.

prf = P (pk, H, s)

다음으로 Alice는 확인 함수 V (vk, H, prf)를 실행하는 Bob에게 증명 prf를 제공합니다.이 경우 Alice는 비밀 s를 제대로 알고 있었으므로이 경우 true를 반환합니다. Bob은 Alice가 비밀을 알고 있다고 확신 할 수 있지만 Alice는 Bob에게 비밀을 공개 할 필요가 없습니다..

재사용 가능한 증명 및 검증 키

위의 예에서 Bob이 람다 매개 변수를 저장하지 않았다는 사실을 Alice가 알 수 없기 때문에 Bob이 Alice에게 비밀을 알고 있음을 증명하려는 경우 zk-SNARK를 사용할 수 없습니다. Bob은 그럴듯하게 증명을 위조 할 수 있습니다..

프로그램이 많은 사람들에게 유용하다면 (Zcash의 예와 같이) Alice와 Bob과 분리 된 신뢰할 수있는 독립 그룹이 생성기를 실행하고 아무도 람다에 대해 배우지 않는 방식으로 검증 키 pk 및 검증 키 vk를 생성 할 수 있습니다..

그룹이 속이지 않았다고 믿는 사람은 누구나이 키를 향후 상호 작용에 사용할 수 있습니다..

이더 리움의 zk-SNARK

개발자는 이미 zk-SNARK를 이더 리움에 통합하기 시작했습니다. 이것은 어떻게 생겼습니까? 구체적으로 사전 컴파일 된 계약의 형태로 검증 알고리즘의 빌딩 블록을 이더 리움에 추가 할 수 있습니다. 방법은 다음과 같습니다. 생성기를 오프 체인으로 실행하여 검증 키와 검증 키를 생성합니다. 그러면 모든 증명자는 증명 키를 사용하여 오프 체인 증명을 만들 수 있습니다. 그런 다음 증명, 검증 키 및 공개 입력을 입력 매개 변수로 사용하여 스마트 계약 내에서 일반 검증 알고리즘을 실행할 수 있습니다. 그런 다음 확인 알고리즘의 결과를 사용하여 다른 온 체인 활동을 트리거 할 수 있습니다..

예 : 기밀 거래

다음은 zk-SNARK가 이더 리움의 개인 정보 보호를 어떻게 도울 수 있는지에 대한 간단한 예입니다. 간단한 토큰 계약이 있다고 가정합니다. 일반적으로 토큰 계약은 주소에서 잔액으로의 매핑을 핵심으로합니다.

매핑 (주소 => uint256) 잔액; 코드 언어 : JavaScript (JavaScript)

균형을 균형의 해시로 대체하는 것을 제외하고는 동일한 기본 코어를 유지합니다.

매핑 (주소 => bytes32) balanceHashes; 코드 언어 : JavaScript (JavaScript)

우리는 거래의 발신자 또는 수신자를 숨기지 않을 것입니다. 하지만 잔액을 숨기고 금액을 보냈습니다. 이 속성은 때때로 기밀 거래.

두 개의 zk-SNARK를 사용하여 한 계정에서 다른 계정으로 토큰을 보냅니다. 하나의 증명은 보낸 사람이 만들고 다른 하나는받는 사람이 만듭니다..

일반적으로 크기 값의 거래가 유효하려면 토큰 계약에서 다음을 확인해야합니다.

잔액 [fromAddress] >= 가치

zk-SNARK는 이것이 유지되고 업데이트 된 해시가 업데이트 된 잔액과 일치 함을 증명해야합니다..

주요 아이디어는 발신자가 시작 잔액과 거래 값을 개인 입력으로 사용한다는 것입니다. 공개 입력으로 시작 잔액, 기말 잔액 및 값의 해시를 사용합니다. 마찬가지로 수신자는 시작 잔액과 값을 비밀 입력으로 사용합니다. 공개 입력으로 시작 잔액, 기말 잔액 및 가치의 해시를 사용합니다..

아래는 송신자 zk-SNARK에 사용할 프로그램입니다. 이전과 같이 x는 공개 입력을 나타내고 w는 개인 입력을 나타냅니다..

function senderFunction (x, w) {return (w.senderBalanceBefore > w. 값 && sha256 (w.value) == x.hashValue && sha256 (w.senderBalanceBefore) == x.hashSenderBalanceBefore && sha256 (w.senderBalanceBefore-w.value) == x.hashSenderBalanceAfter)} 코드 언어 : JavaScript (javascript)

수신자가 사용하는 프로그램은 다음과 같습니다.

function receiverFunction (x, w) {return (sha256 (w.value) == x.hashValue && sha256 (w.receiverBalanceBefore) == x.hashReceiverBalanceBefore && sha256 (w.receiverBalanceBefore + w.value) == x.hashReceiverBalanceAfter)} 코드 언어 : JavaScript (javascript)

프로그램은 전송 잔액이 전송되는 값보다 큰지 확인하고 모든 해시가 일치하는지 확인합니다. 신뢰할 수있는 사람들이 zk-SNARK에 대한 검증 및 검증 키를 생성합니다. confTxSenderPk, confTxSenderVk, confTxReceiverPk 및 confTxReceiverVk라고 부르겠습니다..

토큰 계약에서 zk-SNARK를 사용하면 다음과 같습니다.

function transfer (address _to, bytes32 hashValue, bytes32 hashSenderBalanceAfter, bytes32 hashReceiverBalanceAfter, bytes zkProofSender, bytes zkProofReceiver) {bytes32 hashSenderBalanceBefore = balanceHashes [msg.sender]; bytes32 hashReceiverBalanceBefore = balanceHashes [_to]; bool senderProofIsCorrect = zksnarkverify (confTxSenderVk, [hashSenderBalanceBefore, hashSenderBalanceAfter, hashValue], zkProofSender); bool receiverProofIsCorrect = zksnarkverify (confTxReceiverVk, [hashReceiverBalanceBefore, hashReceiverBalanceAfter, hashValue], zkProofReceiver); if (senderProofIsCorrect && receiverProofIsCorrect) {balanceHashes [msg.sender] = hashSenderBalanceAfter; balanceHashes [_to] = hashReceiverBalanceAfter; }} 코드 언어 : JavaScript (자바 스크립트)

따라서 블록 체인의 유일한 업데이트는 잔액 자체가 아니라 잔액의 해시입니다. 그러나 증거가 확인되었음을 확인할 수 있으므로 모든 잔액이 올바르게 업데이트되었음을 ​​알 수 있습니다..

세부

위의 기밀 거래 체계는 주로 이더 리움에서 zk-SNARK를 어떻게 사용할 수 있는지에 대한 실제적인 예를 제공하기위한 것입니다. 강력한 기밀 거래 체계를 만들려면 다음과 같은 여러 문제를 해결해야합니다.

  • 사용자는 클라이언트 측에서 잔액을 추적해야하며 잔액을 잃으면 해당 토큰을 복구 할 수 없습니다. 잔액은 서명 키에서 파생 된 키를 사용하여 체인에 암호화되어 저장 될 수 있습니다..
  • 잔액은 32 바이트의 데이터를 사용하고 엔트로피를 인코딩하여 잔액을 파악하기 위해 해시를 역방향으로 처리하는 것을 방지해야합니다..
  • 사용하지 않는 주소로 보내는 엣지 케이스 처리 필요.
  • 송신자는 송신을 위해 수신자와 상호 작용해야합니다. 발신자가 증명을 사용하여 거래를 시작하는 시스템을 잠재적으로 가질 수 있습니다. 그런 다음 수신자는 블록 체인에서 “보류중인 수신 트랜잭션”이 있음을 확인하고이를 완료 할 수 있습니다..

최신 이더 리움 뉴스, 엔터프라이즈 솔루션, 개발자 리소스 등을 보려면 뉴스 레터를 구독하십시오.성공적인 블록 체인 제품을 구축하는 방법웨비나

성공적인 블록 체인 제품을 구축하는 방법

이더 리움 노드를 설정하고 실행하는 방법웨비나

이더 리움 노드를 설정하고 실행하는 방법

나만의 Ethereum API를 구축하는 방법웨비나

나만의 Ethereum API를 구축하는 방법

소셜 토큰을 만드는 방법웨비나

소셜 토큰을 만드는 방법

스마트 계약 개발에서 보안 도구 사용웨비나

스마트 계약 개발에서 보안 도구 사용

금융 디지털 자산 및 DeFi의 미래웨비나

금융의 미래 : 디지털 자산 및 DeFi

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me