風險提示:防範以"虛擬貨幣""區塊鏈"名義進行非法集資的風險。——銀保監會等五部門
資訊
發現
搜索
登錄
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt
BTC
ETH
HTX
SOL
BNB
查看行情
深入理解TinyRAM
Sin7y
特邀专栏作者
2022-08-17 12:53
本文約3083字,閱讀全文需要約5分鐘
本文講述了TinyRAM的架構、設計、彙編指令、優勢等。

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)。前一種架構的數據和程序存放在不同的地址空間中,且程序是只讀的;後一種架構數據和程序存放在同一個可讀寫的地址空間中。具體用圖表的方式來表示這兩者的區別:

以下兩個架構的圖示:

在開始更詳細的TinyRAM設計細節之前,我們以官方白皮書的例子說明,TinyRAM是如何做到既簡潔又全面,能夠滿足非確定性的計算問題的。

意義

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

指令

指令

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

位操作指令

 位操作指令

•and

•or

•xor

•not

● shift操作指令:

•add

•sub

•mull

•umulh

•smulh

•udiv

•umod

● shift操作指令:

•shl

•shr

● 比較操作指令

•cmpe

•cmpa

•cmpae

•cmpg

•cmpge

jump操作指令

•mov

•cmov

● jump操作指令

•jmp

•cjmp

•cnjmp

● 內存操作指令

•store.b

•load.b

•store.w

•load.w

● 輸入操作指令:

•read

● 輸出操作指令:

•answer

彙編語言

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

• 哈佛架構

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

• 馮諾依曼架構

“; TinyRAM V=2.000 M=vn W=W K=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)

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

上述的前導語:

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

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

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

兩種架構的性能對比

TinyRAM 的兩種架構,其設計區別在前面的“架構”部分介紹了,此處對比兩種架構的性能。

第一個圖表展示兩種架構產生的門數量。

l 是指令數量,n是輸入大小,T是執行步數。

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

第二個圖表展示兩種架構在不同字長的曲線下,生成Key generator / prover / verifier 的時間及proof 大小。

總結

總結

總結

微信公眾號:Sin7Y

微信公眾號:Sin7Y

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/59

關於我們

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

微信公眾號:Sin7Y

GitHub | Twitter | Telegram | MediumMirror | HackMD | HackerNoon


智能合約