Zilch는 Scalable and Transparent (신뢰할 수 있는 설정이 필요 없음) ARguments of Knowledge (STARK)를 구현하는 프레임워크입니다. Zilch는 프런트엔드와 백엔드라는 두 가지 주요 구성 요소로 구성됩니다.
프런트 엔드는 ZeroJava 프로그래밍 언어, 영지식 인수용으로 설계된 Java의 하위 집합, ZeroJava 코드를 zMIPS 어셈블리 명령으로 변환하기 위한 컴파일러로 구성됩니다. zMIPS는 ZKP 프로그래밍을 지원하기 위한 MIPS ISA의 확장입니다.
백엔드는 zMIPS 조립 지침을 산술 회로로 변환하고 이러한 회로의 평가를 확인하기 위한 ZKP를 생성합니다. 백엔드는 zkSTARK 라이브러리의 ZKP 구성을 기반으로 구축되며 libSTARK의 프로그래밍 모델을 zMIPS 추상 머신으로 확장합니다.
면책 조항: 코드는 학술 등급 이며 학술 동료 검토 및 평가를 위한 것입니다. 저자는 Ubuntu 20.04
사용하여 코드를 테스트했습니다.
우리 작업이 유용하다고 생각되면 출판물(IEEE Xplore, Cryptology ePrint Archive)을 인용해 주십시오.
D. Mouris and N. G. Tsoutsos, "Zilch: A Framework for Deploying Transparent Zero-Knowledge Proofs,"
in IEEE Transactions on Information Forensics and Security (TIFS), 2021, DOI: 10.1109/TIFS.2021.3074869
apt install g++
apt install libssl-dev
apt install libboost-all-dev
apt install libjsoncpp-dev
apt-get install libgtest-dev
ZeroJava 컴파일러 종속성에 대해서는 ZeroJava 저장소를 참조하세요.
$ git clone --recursive https://github.com/TrustworthyComputing/Zilch
$ cd Zilch
$ make -j8
$ make zilch-tests -j8
설치 유형을 확인하려면 ./zilch-tests
.
$ cd ZeroJava-compiler
$ mvn initialize
$ mvn package
$ ./zilch --asm <zMIPS assembly file path> [--tsteps <trace length log_2>] [--security <security parameter]> [--pubtape <primaryTapeFile>] [--auxtape <auxTapeFile>] [--verifier | --prover] [--address <address:port_number>]
--help : Display this help message
--examples : Display some usage examples
--show-asm : Display zMIPS assembly input
--verbose : Verbose output, print BAIR, ACSP, APR and FRI specifications
--asm : Path to the zMIPS assembly code (required)
--tsteps : trace length log_2 (optional, default = 5)
--security : security parameter (optional, default = 60)
--pubtape : path to the primary tape file (optional, default = none)
--auxtape : path to the auxiliary tape file (optional, default = none)
The flags below enable verification over the network; if neither is enabled, the execution will be locally. Verifier acts as the server and thus should be executed first.
--address : verifier-address:port-number (optional, default = 'localhost:1234')
--verifier : enables execution of the verifier, listening on port-number (optional, default = false)
--prover : enables execution of the prover, transmitting to verifier-address:port-number (optional, default = false)
플래그를 사용하는 방법에 대한 아래 예를 참조하세요.
참고: Zilch는 개인 및 공용 테이프가 zMIPS 어셈블리 파일과 동일한 디렉토리에 있고 이름이 pubtape.txt
및 auxtape.txt
인 경우 자동으로 이를 감지합니다.
example-zmips 디렉토리에는 다양한 zMIPS 예제가 포함되어 있습니다.
어셈블러 수준에서 레이블은 이중 밑줄(예: __example_label__
)로 시작하고 끝나는 영숫자 태그인 반면, Zilch 내부에서는 이러한 레이블이 명령 번호로 변환됩니다.
예를 들어, 다음은 5의 계승을 계산하는 zMIPS 코드입니다.
move $t3, 5
move $t1, 1
move $t2, 1
__L1__:
mult $t1, $t1, $t2
add $t2, $t2, 1
bge $t3, $t2, __L1__
answer $t1
Macros.json에서는 기존 zMIPS 명령어를 기반으로 사용자 정의 매크로 명령어를 정의합니다. 예를 들어, 아래와 같이 inc
및 min
매크로 명령어를 정의했습니다.
"inc": {
"reg1": "$x",
"macro": "add $x, $x, 1"
}
이는 inc
하나의 레지스터를 사용한다는 의미입니다. zMIPS 프로그램은 inc 명령어를 다음과 같이 사용할 수 있습니다.
move $t0, 5
inc $t0
answer $t0
대답은 6이 될 것이다.
min
매크로 명령어는 세 개의 레지스터와 라벨도 사용합니다.
"min": {
"reg1": "$x",
"reg2": "$y",
"reg3": "$z",
"uses_label" : "true",
"macro" : "blt $y, $z, __min_label__
move $x, $z
j __end_min_label__
__min_label__
move $x, $y
__end_min_label__"
}
기본 테이프에는 1, 2, 3, 4, ...
가 채워지고 보조 테이프에는 101, 102, 103, 104, ...
가 포함됩니다.
pubread $t0 ; consume next word from public tape and store it to r0
print $t0
secread $t1 ; consume next word from auxiliary tape and store it to r1
print $t1
pubseek $t0, 3 ; read the 4th word from the public tape and store it to r0
print $t0
secseek $t1, 3 ; read the 4th word from the auxiliary tape and store it to r1
print $t1
answer $t0
위 프로그램을 실행하려면 ./zilch --asm ./examples-zmips/read_test/read_test.zmips --tsteps 5 --pubtape ./examples-zmips/read_test/read_test.pubtape --auxtape ./examples-zmips/read_test/read_test.auxtape
실행하면 됩니다. ./zilch --asm ./examples-zmips/read_test/read_test.zmips --tsteps 5 --pubtape ./examples-zmips/read_test/read_test.pubtape --auxtape ./examples-zmips/read_test/read_test.auxtape
.
zilch
실행 파일의 기본 동작(플래그 --address
, --verifier
, --prover
없음)은 로컬 실행을 초래합니다. 네트워크 검증을 활성화하려면 먼저 검증 프로그램( --verifier
플래그)을 실행한 다음 증명 프로그램( --prover
플래그)을 실행해야 합니다. 검증자는 증명자가 연결되기를 기다리는 서버 역할을 하며, 실행 및 인쇄하고 결정 사항을 증명자에게 반환합니다.
예를 들어 네트워크를 통한 테이프 예제의 간단한 읽기는 다음과 같습니다.
먼저 포트 2324
에서 수신 대기하는 검증기를 실행합니다.
./zilch --asm ./examples-zmips/read_test/read_test.zmips --tsteps 10 --security 120 --pubtape ./examples-zmips/read_test/read_test.pubtape --auxtape ./examples-zmips/read_test/read_test.auxtape --verifier --address localhost:2324
그런 다음 증명자는 포트 2324
에 연결합니다.
./zilch --asm ./examples-zmips/read_test/read_test.zmips --tsteps 10 --security 120 --pubtape ./examples-zmips/read_test/read_test.pubtape --auxtape ./examples-zmips/read_test/read_test.auxtape --prover --address localhost:2324