TinyRAM 是由大名鼎鼎的BCTGTV 五⼈組(Eli Ben-Sasson, Alessandro Chiesa、Daniel Genkin、Eran Tromer、Madars Virza) 和SCIPR 實驗室提出的⼀種隨機訪問器架構,旨在成為表達⾮確定性計算證明性的便捷⼯具。具體來說,TinyRAM 是⼀種精簡指令集計算機(RISC),具有字節級可尋址的隨機存取存儲器。它在“擁有足夠表達能力”和“足夠簡約”這兩個對立面之間取得平衡:

當從高級編程語言編譯時,有足夠的表達能力來支持簡短高效的彙編代碼

小指令集,指令通過運算電路簡單驗證,利⽤ SCIPR 的算法和密碼機制實現⾼效驗證。

架構

TinyRAM 由兩個整數參數化:字長W,需要是2 的冪且可以被8 整除(這點和現代計算機⼀樣,如32、64),以及寄存器的數量K。 ⼀般⽤ TinyRAM(W,K) 來表示,機器的狀態包括以下內容:

1.程序計數器pc(program counter),由W 個bit 組成。

2. K 個通⽤寄存器,以r0, r1, …, r(K-1) 表示,每個寄存器都是W 個bit。

3.條件標誌flag,由⼀個bit 組成。

4.內存,2^W 個字節的線性數組,使⽤⼩端約定排列字節。

5. 2 個磁帶(tape),每個包含⼀串W bit 的字。每個磁帶都是單向只讀的。其中,⼀個磁帶是⽤於公開輸⼊ x,另⼀個⽤於私有輸⼊ w。其實就是TinyRAM 的輸⼊載體。

TinyRAM 機的輸⼊是2 個磁帶以及內存,輸出是answer 指令,該指令有⼀個參數A,代表返回值,A = 0 表示接受。也可以使⽤該指令終⽌執⾏程序。

TinyRAM 根據執⾏指令的位置不同有兩種變體:⼀種變體遵循哈佛架構(Harvard architecture),另⼀種遵循馮諾依曼架構(von Neumann architecture)。前⼀種架構的數據和程序存放在不同的地址空間中,且程序是只讀的;後⼀種架構數據和程序存放在同⼀個可讀寫的地址空間中。具體⽤圖表的⽅式來表示這兩者的區別:

Sin7Y團隊深入解讀—— TinyRAM

以下兩個架構的圖示:

Sin7Y團隊深入解讀—— TinyRAM

Sin7Y團隊深入解讀—— TinyRAM

在開始更詳細的TinyRAM 設計細節之前,我們以官⽅⽩⽪書的例⼦說明,TinyRAM 是如何做到既簡潔⼜全⾯,能夠滿⾜⾮確定性的計算問題的。

意義

Alice 擁有x,Bob 擁有w。 Alice 想知道算法A(x,w)的計算結果的正確性,但是不想⾃⼰計算。這樣的場景,在零知識證明系統中⾮常常⻅,有證明者(prover)和驗證者(verifier),驗證者想知道證明者提供的證據的正確性,但不必⾃⼰重新計算⼀次。 TinyRAM 架構就滿⾜這樣的場景,兩個磁帶可以傳⼊私有輸⼊ w 和公開輸⼊ x,證明計算和驗證程序在其中執⾏。 SCIPR 實驗室實現的libsnark 庫中,已實現了TinyRAM。具體參⻅: https://github.co m/scipr-lab/libsnark

Sin7Y團隊深入解讀—— TinyRAM

以Circuit Generator 為例,C 程序經過編譯器之後,編譯成TinyRAM 的程序,再經過Circuit Generator 之後,⽣成電路,最後得到ZK-SNARK 電路。

Sin7Y團隊深入解讀—— TinyRAM

指令

TinyRAM 支持29 個指令,每條指令都通過1 個操作碼和最多3 個操作數指定。操作數可以是寄存器名稱(即0 到K-1 的整數)或者立即數(即W 位字符串)。除非另有說明,否則每條指令都不會修改flag,且將pc 增加i(模掉2^W),對於哈佛架構來說,i=1,對於馮諾依曼架構來說,i=2W /8。通常,第一個操作數是指令執行計算的目標寄存器,其他操作(如果有)指定指令的參數。最後,所有指令都需要機器的一個週期來執行。

指令包含幾種類型,指令名稱和intel x86 彙編指令類似,可顧名思義。

位操作指令:

and

or

xor

not

整數操作指令:

add

sub

mull

umulh

smulh

udiv

umod

shift操作指令:

shl

shr

比較操作指令

cmpe

cmpa

cmpae

cmpg

cmpge

move操作指令

mov

cmov

jump操作指令

jmp

cjmp

cnjmp

內存操作指令

store.b

load.b

store.w

load.w

輸入操作指令:

read

輸出操作指令:

answer

彙編語⾔

TinyRAM 的程序是由TinyRAM 彙編語言編寫的,這個語言受Intel x86 彙編語言語法啟發。程序是包含多行TinyRAM 彙編代碼的文本文件。程序按照哈佛架構還是馮諾依曼架構的不同,第一行包含的字符串也不同:

哈佛架構

Plaintext
“; TinyRAM V=2.000 M=hv W=WK=K”

馮諾依曼架構

Plaintext
“; TinyRAM V=2.000 M=vn W=WK=K”

其中,W 是十進製表示的字長,K 是十進製表示的寄存器數量。程序文件中,其他每一行依次包含的內容需要滿足:

1.可選的空格。

2.可選的label,用於定義為引用其後的第一條指令。

3.可選的指令,由指令助記符,以及後面的操作數。

4.可選的空格。

5.可選的以分號;開始的註釋,到該行尾結束。

一個程序中,最多可以有2^W 個指令。一個label 只能定義一次,有點像高級語言中的變量。

示例代碼https://github.com/scipr-lab/libsnark/blob/master/tinyram_examples/answer0/answer0.s :

Plaintext
; TinyRAM V=2.000 M=vn W=16 K=16
store.w 0, r0
mov r0, 32768
read r1, 0
cjmp 28
add r0, r0, 2
store.w r0, r1
jmp 12
store.w 32768, r0
answer 0

為了滿⾜計算的需要,提⾼電路可滿⾜性的效率,TinyRAM 增加了前導語。如果⼀個TinyRAM 的程序以前導語的⽅式啟動,則說明該程序是個合適(proper)的程序。

Sin7Y團隊深入解讀—— TinyRAM

上述的前導語:

對於哈佛架構來說,I(i)= 1 * i,並且inc = 1

對於馮諾依曼架構來說,I(i) = 2W/8 * i,並且inc = W/8

前⾯的示例代碼,也遵循這樣的前導語寫法。

兩種架構的性能對⽐

TinyRAM 的兩種架構,其設計區別在前⾯的“架構”部分介紹了,此處對⽐兩種架構的性能。第⼀個圖表展示兩種架構產⽣的⻔數量。

l 是指令數量,n 是輸⼊⼤⼩,T 是執⾏步數。

n=10^2, T=2^20

哈佛架構

馮諾依曼架構

l=10^3

1872

1368

l=10^4

10872

1371

l=10^5

100872

1400

l=10^6

1000872

1694

可以看出,前者的⻔數量和指令數量呈線性增加。後者改善很⼤,指令越多,改善的越⼤。

第⼆個圖表展示兩種架構在不同字⻓的曲線下,⽣成Key generator/prover/verifier 的時間及proof ⼤⼩。

哈佛-愛德華曲線80bit

馮諾依曼-愛德華曲線80bit

哈佛-BN曲線128bit

馮諾依曼-BN曲線128bit

key generator

306s

97s

123s

117s

prover

351s

115s

784s

147s

verifier

66.1ms

4.9ms

9.2ms

5.1ms

proof size

332B

230B

288B

288B

可以看出,在80 bit 時,馮諾依曼架構相較於哈佛架構有較⼤提升,在128 bit 時,也有少許提升。
由上述表格數據可以看出,馮諾依曼架構的效率更⾼,這也是為什麼馮依諾曼架構TinyRAM 是後來在哈佛架構TinyRAM 的基礎上提出的。

總結

我們講了TinyRAM 的架構、設計、彙編指令等,介紹了它的優勢:可以⽤來便捷的進⾏⾮確定性計算。尤其在零知識證明系統中,有更多的發揮空間。最後介紹了兩種TinyRAM 架構的性能對⽐,在⽣成的⻔數量和時間以及proof ⼤⼩上,馮諾依曼架構都更勝⼀籌。

引⽤

http://www.scipr-lab.org/doc/TinyRAM-spec-2.000.pdf

https://www.cs.tau.ac.il/~tromer/slides/csnark-usenix13rump.pdf

http://eprint.iacr.org/2014/595

關於我們

Sin7Y成立於2021年,由頂尖的區塊鏈開發者和密碼學工程師組成。我們既是項目孵化器也是區塊鏈技術研究團隊,探索EVM、Layer2、跨鏈、隱私計算、自主支付解決方案等最重要和最前沿的技術。

微信公眾號:Sin7Y

GitHub:Sin7Y

Twitter:@Sin7Y_Labs

Medium:Sin7Y

Mirror:Sin7Y

HackMD:Sin7Y

HackerNoon:Sin7Y

Email:contact@sin7y.org