본 저장소의 작업물은 Zcash foundation의 지원을 받아 네트워크의 다양한 측면 가속에 사용될 오픈소스 FPGA 코드를 개발한 결과입니다.
아키텍처 문서(Architecture document)는 여기에서 확인할 수 있습니다.
또한, Taipei Ethereum Meetup에서 발표도 진행했습니다.여기를 참고하십시오.
여기에 발표 슬라이드 사본이 있습니다.
주로 secp256k1 및 bls12-381 곡선에서의 Equihash 검증과 타원 곡선 연산에 대해 개발되었지만, 이 저장소에서 사용된 코드(ip_cores)는 매개변수 변경 또는 방정식의 최소한 수정만으로 다른 곡선에도 적용할 수 있습니다. 현재 Ethereum 2.0 SNARKs를 위한 FPGA 가속기가 개발 중입니다.여기 (기본 핵심 모듈들은 모두 이 Zcash 저장소에서 서브모듈로 재사용됩니다).
시작하기
아키텍처 문서에는 AWS 이미지를 빌드하거나 최상위 설계를 시뮬레이션하는 지침이 포함되어 있습니다. 가장 쉬운 방법은 모든 .sv 및 .xci 파일을 새 Vivado 프로젝트에 추가한 다음, 테스트하려는 모듈을 최상위 _tb.sv 파일로 설정하는 것입니다. 모든 것은 Vivado 2018.3과 2019.1 모두에서 시뮬레이션과 FPGA(AWS 및 Bittware) 양쪽에서 합성 및 테스트되었습니다.
저장소 폴더 구조
각 최상위 폴더는 아래에 설명되어 있습니다. 각 폴더 안에는 SystemVerilog로 작성된 소스 코드가 있으며, 대부분의 블록은 독립적인 자체 검사 테스트벤치(self-checking testbench)를 가지고 있습니다.
AWS
여기는 AWS F1 인스턴스(Amazon FPGA VU9P w/ 64GB DDR4)에서 빌드하기 위한 최상위/프로젝트 파일을 포함하고 있습니다.
- 이 파일은 PCIe를 통해 FPGA와 인터페이스할 수 있는 zcash_fpga 라이브러리(aws/cl_zcash/software/runtime/zcash_fpga.hpp)를 포함합니다.
- 빌드 방법 지침은 아키텍처 문서에 나와 있습니다.
bittware_xupvvh
이 폴더는 Bittware VVH 보드(VU37P FPGA w/ 8GB HBM, 16GB DDR4)에서 빌드하기 위한 최상위/프로젝트 파일을 포함합니다.
ip_cores
여기는 이 레포지토리의 프로젝트들에서 사용되는 공유 IP 코어들을 담고 있습니다. 여기에는 다음과 같은 많은 기능들이 포함됩니다:
- 해싱 (Hashing)
- Blake2b - blake2b의 단일 파이프 구현과 고성능을 위한 파이프라인 언롤드 버전(초기 52 클럭 지연 후 200MHz에서 단일 클럭 해시).
- SHA256 및 SHA256d
- 공통 사용 패키지 및 인터페이스, 그리고 시뮬레이션을 단순화하기 위한 많은 작업들
- AXI4
- AXI4-lite
- 블록 RAM (Block RAM)
- FIFO 구현체
- 해시 맵 구현체
- 비트 폭에 대해 완벽하게 매개변수화되었으며, 해싱 함수로 CRC를 사용합니다.
- 스트림 파싱/처리용 블록
- 카라츠바 승수(Karatsuba multiplier)
- 레벨 수에 대해 완벽하게 매개변수화되었습니다.
- 바레트 축소(Barret reduction) - 법(modulus)이 빠른 축소를 허용하지 않을 때 모듈로 축소용
- 완벽하게 파이프라인 처리된 고성능 버전과 느리지만 자원 활용도가 낮은 버전 두 가지 모두 제공됩니다.
- 캐리 세이브 애더 트리와 RAM을 사용한 완전 병렬 승수 (Fully parallel multiplier)
- 완벽하게 파이프라인 처리되었으며, 카라츠바 + 바레트보다 3배의 성능을 보이지만 FPGA RAM을 사용합니다.
- 모듈로 축소를 위해 캐리 트리를 사용하여 곱셈 결과를 누적하는 승수
- 카라츠바 + 바레트 방식보다 3배의 성능을 보이지만 더 많은 LUTs/RAM을 사용합니다.
- 덧셈 및 뺄셈 모듈
- 대용량 비트 폭 산술에 사용될 수 있도록 완벽하게 매개변수화되었습니다.
- 승산 역원(multiplicative inverses) 계산을 위한 확장 유클리드 알고리즘 (Extended Euclidean algorithm)
- 자원 중재기 (Resource arbitrators)
- 범용 타원 곡선(Weierstrass) 포인트 및 요소 모듈
- Fp^12까지의 포인트 곱셈, 배가(doubling), 덧셈 (Fp^6 및 Fp^2를 포함하는 탑 구조)
- 아핀 좌표계와 자코비안 좌표계 모두에서의 연산
zcash_fpga
이것은 Zcash FPGA의 최상위 레벨입니다. Zcash 가속 엔진에 사용되는 블록들의 소스 코드와 테스트벤치를 포함합니다.
옵션으로 다음 최상위 엔진들을 포함할 수 있습니다 (최상위 패키지의 파라미터를 통해 빌드에 포함할 수 있음):
- Equihash 검증 엔진
- 투명 서명 검증 엔진 (secp256k1 ECDSA 코어)
- 효율적인 endomorphism을 사용하여 키 비트 크기 감소
- 서명 검증은 리소스 공유 단일 완전 파이프라인 karatsuba 승수와 빠른 모듈로 축소 기법을 사용하여 여러 EC 포인트 연산을 병렬로 계산함
- BLS12-381 코프로세서 (zk-SNARK 가속기)
- 2kB 명령어 메모리를 가진 커스텀 명령어 세트
- 곡선 네이티브 비트 폭 381b의 12kB 데이터 슬롯 URAM
- bls12-381 곡선 위 Fp^12까지 일반 산술 연산 (Towering Fp -> Fp^2 -> Fp^6 -> Fp^12)
- Fp 및 Fp^2에서의 이중 포인트 곱셈 (G1 및 G2)
- Fp^12 Frobenius 맵 연산
- Fp^12 역원 계산
- Fp^12 지수화
- 최적의 ate 페어링
- Miller 루프와 최종 지수화 단계, 다중 페어링 사용을 위한 별도 명령어 제공