📜 [專欄新文章] ZKP 與智能合約的開發入門
✍️ Johnson
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
這篇文章將以程式碼範例,說明 Zero Knowledge Proofs 與智能合約的結合,能夠為以太坊的生態系帶來什麼創新的應用。
本文為 Tornado Cash 研究系列的 Part 2,本系列以 tornado-core 為教材,學習開發 ZKP 的應用,另兩篇為:
Part 1:Merkle Tree in JavaScript
Part 3:Tornado Cash 實例解析
Special thanks to C.C. Liang for review and enlightenment.
近十年來最強大的密碼學科技可能就是零知識證明,或稱 zk-SNARKs (zero knowledge succinct arguments of knowledge)。
zk-SNARKs 可以將某個能得出特定結果 (output) 的計算過程 (computation),產出一個證明,而儘管計算過程可能非常耗時,這個證明卻可以快速的被驗證。
此外,零知識證明的額外特色是:你可以在不告訴對方輸入值 (input) 的情況下,證明你確實經過了某個計算過程並得到了結果。
上述來自 Vitalik’s An approximate introduction to how zk-SNARKs are possible 文章的首段,該文說是給具有 “medium level” 數學程度的人解釋 zk-SNARKs 的運作原理。(可惜我還是看不懂 QQ)
本文則是從零知識證明 (ZKP) 應用開發的角度,結合電路 (circuit) 與智能合約的程式碼來說明 ZKP 可以為既有的以太坊智能合約帶來什麼創新的突破。
基本上可以謹記兩點 ZKP 帶來的效果:
1. 擴容:鏈下計算的功能。
2. 隱私:隱藏秘密的功能。
WithoutZK.sol
首先,讓我們先來看一段沒有任何 ZKP 的智能合約:
這份合約的主軸在 process(),我們向它輸入一個秘密值 secret,經過一段計算過程後會與 answer 比對,如果驗證成功就會改寫變數 greeting 為 “answer to the ultimate question of life, the universe, and everything”。
Computation
而計算過程是一個簡單的函式:f(x) = x**2 + 6。
我們可以輕易推出秘密就是 42。
這個計算過程有很多可能的輸入值 (input) 與輸出值 (output):
f(2) = 10
f(3) = 15
f(4) = 22
…
但是能通過驗證的只有當輸出值和我們存放在合約的資料 answer 一樣時,才會驗證成功,並執行 process 的動作。
可以看到有一個 calculate 函式,說明這份合約在鏈上進行的計算,以及 process 需要輸入參數 _secret,而我們知道合約上所有交易都是公開的,所以這個 _secret 可以輕易在 etherscan 上被看到。
從這個簡單的合約中我們看到 ZKP 可以解決的兩個痛點:鏈下計算與隱藏秘密。
Circuits
接下來我們就改寫這份合約,加入 ZKP 的電路語言 circom,使用者就能用他的 secret 在鏈下進行計算後產生一個 proof,這 proof 就不會揭露有關 secret 的資訊,同時證明了當 secret 丟入 f(x) = x**2 + 6 的計算過程後會得出 1770 的結果 (output),把這個 proof 丟入 process 的參數中,經過 Verifier 的驗證即可執行 process 的內容。
有關電路 circuits 的環境配置,可以參考 ZKP Hello World,這裡我們就先跳過去,直接來看 circom 的程式碼:
template Square() { signal input in; signal output out; out <== in * in;}template Add() { signal input in; signal output out; out <== in + 6;}template Calculator() { signal private input secret; signal output out; component square = Square(); component add = Add(); square.in <== secret; add.in <== square.out; out <== add.out;}component main = Calculator();
這段就是 f(x) = x**2 + 6 在 circom 上的寫法,可能需要時間去感受一下。
ZK.sol
circom 寫好後,可以產生一個 Verifier.sol 的合約,這個合約會有一個函式 verifyProof,於是我們把上方的合約改寫成使用 ZKP 的樣子:
我們可以發現 ZK 合約少了 calculate 函式,顯然 f(x) = x**2 + 6 已經被我們寫到電路上了。
snarkjs
產生證明的程式碼以 javascript 寫成如下:
let { proof, publicSignals } = await groth16.fullProve(input, wasmPath, zkeyPath);
於是提交 proof 給合約,完成驗證,達到所謂鏈下計算的功能。
最後讓我們完整看一段 javascript 的單元測試,使用 snarkjs 來產生證明,對合約的 process 進行測試:
對合約來說, secret = 42 是完全不知情的,因此隱藏了秘密。
publicSignals
之前不太清楚 publicSignals 的用意,因此在這裡特別說明一下。
基本上在產生證明的同時,也會隨帶產生這個 circom 所有的 public 值,也就是 publicSignals,如下:
let { proof, publicSignals } = await groth16.fullProve(input, wasmPath, zkeyPath);
在我們的例子中 publicSignals 只有一個,就是 1770。
而 verifyProof 要輸入的參數除了 proof 之外,也要填入 public 值,簡單來說會是:
const isValid = verifyProof(proof, publicSignals);
問題來了,我們在設計應用邏輯時,當使用者要提交參數進行驗證的時候,publicSignals 會是由「使用者」填入嗎?或者是說,儘管是使用者填入,那它需不需要先經過檢查,才可以填入 verifyProof?
關鍵在於我們的合約上存有一筆資料:answer = 1770
回頭看合約上的 process 在進行 verifyProof 之前,必須要檢查 isAnswer(publicSignals[0]):
想想要是沒有檢查 isAnswer,這份合約會發生什麼事情?
我們的應用邏輯就會變得毫無意義,因為少了要驗證的答案,就只是完成計算 f(42) = 1770,那麼不論是 f(1) = 7 或 f(2) = 10,使用者都可以自己產生證明與結果,自己把 proof 和 publicSignals 填入 verifyProof 的參數中,都會通過驗證。
至此可以看出,ZKP 只有把「計算過程」抽離到鏈下的電路,計算後的結果仍需要與鏈上既有的資料進行比對與確認後,才能算是有效的應用 ZKP。
應用邏輯的開發
本文主要談到的是 zk-SNARKs 上層應用邏輯的開發,關於 ZKP 的底層邏輯如上述使用的 groth16 或其他如 plonk 是本文打算忽略掉的部分。
從上述的例子可以看到,即使我們努力用 circom 實作藏住 secret,但由於計算過程太過簡單,只有 f(x) = x**2+6,輕易就能從 answer 反推出我們的 secret 是 42,因此在應用邏輯的開發上,也必須注意 circom 的設計可能出了問題,導致私密訊息容易外洩,那儘管使用再強的 ZKP 底層邏輯,在應用邏輯上有漏洞,也沒辦法達到隱藏秘密的效果。
此外,在看 circom 的程式碼時,可以關注最後一個 template 的 private 與 public 值分別是什麼。以本文的 Calculator 為例,private 值有 secret,public 值有 out。
另外補充:
如果有個 signal input 但它不是 private input,就會被歸類為 public。
一個 circuit 至少會有一個 public,因為計算過程一定會有一個結果。
最後,在開發的過程中我會用 javascript 先實作計算過程,也可以順便產出 input.json,然後再用 circom 語言把計算過程實現,產生 proof 和 public 後,再去對照所有 public 值和 private 值,確認是不是符合電路計算後所要的結果,也就是比較 javascript 算出來的和 circom 算出來的一不一樣,如果不一樣就能確定程式碼是有 bug 的。
參考範例:https://github.com/chnejohnson/circom-playground
總結
本文的程式碼展現 ZKP 可以做到鏈下計算與隱藏秘密的功能,在真實專案中,可想而知電路的計算過程不會這麼單純。
會出現在真實專案中的計算像是 hash function,複雜一點會加入 Merkle Tree,或是電子簽章 EdDSA,於是就能產生更完整的應用如 Layer 2 擴容方案之一的 ZK Rollup,或是做到匿名交易的 Tornado Cash。
本文原始碼:https://github.com/chnejohnson/mini-zkp
下篇文章就來分享 Tornado Cash 是如何利用 ZKP 達成匿名交易的!
參考資料
概念介紹
Cryptography Playground
zk-SNARKs-Explainer
神奇的零知識證明!既能保守秘密,又讓別人信你!
認識零知識證明 — COSCUP 2019 | Youtube
應用零知識證明 — COSCUP 2020 | Youtube
ZK Rollup
動手實做零知識 — circom — Kimi
ZK-Rollup 开发经验分享 Part I — Fluidex
ZkRollup Tutorial
ZK Rollup & Optimistic Rollup — Kimi Wu | Medium
Circom
circom/TUTORIAL.md at master · iden3/circom · GitHub
ZKP Hello World
其他
深入瞭解 zk-SNARKs
瞭解神秘的 ZK-STARKs
zk-SNARKs和zk-STARKs解釋 | Binance Academy
[ZKP 讀書會] MACI
Semaphore
Zero-knowledge Virtual Machines, the Polaris License, and Vendor Lock-in | by Koh Wei Jie
Introduction & Evolution of ZK Ecosystem — YouTube
The Limitations of Privacy — Barry Whitehat — YouTube
Introduction to Zero Knowledge Proofs — Elena Nadolinski
ZKP 與智能合約的開發入門 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
「component數學」的推薦目錄:
- 關於component數學 在 Taipei Ethereum Meetup Facebook 的最讚貼文
- 關於component數學 在 八鄉朱凱廸 Chu Hoi Dick Facebook 的精選貼文
- 關於component數學 在 國立陽明交通大學電子工程學系及電子研究所 Facebook 的最佳貼文
- 關於component數學 在 10410韓永楷教授離散數學_第27A講Connected Component ... 的評價
- 關於component數學 在 10410韓永楷教授離散數學_第27B講Connected Component ... 的評價
- 關於component數學 在 Graph: Intro(簡介) 的評價
- 關於component數學 在 還是因子權重(理性資產訂價)的一部份。 IPCA詳細的計量性質 ... 的評價
- 關於component數學 在 component數學在PTT/Dcard完整相關資訊 的評價
- 關於component數學 在 component數學在PTT/Dcard完整相關資訊 的評價
component數學 在 八鄉朱凱廸 Chu Hoi Dick Facebook 的精選貼文
【香港選舉成中美升級藥引 是否押後由習近平發落】
擺明是中共黨員的前立法會主席曾鈺成昨日發布了一條評論片( https://bit.ly/32UnWgy ),呼籲特區政府押後立法會選舉一年,期間的真空期由特首按《立法會條例》11條召開「緊急(立法會)會議」填補。
係人都估到屬保皇鴿派的曾主席的建議是想為中共解窘:他要林鄭當機立斷,是希望趕在立法會提名期結束前完事,令中共不需為DQ候選人作判斷,避免刺激美國。將選舉押後一年,也不是考慮什麼香港立法習慣,而是中共希望將香港問題暫時凍結的時間。
最可笑的是,雖然所有都是政治盤算,但曾鈺成這位數學老師,在18分鐘的發言中隻字不提政治,只講疫情。什麼冇人能保證排隊不會播毒;限聚令令各黨派擺不了街站;選舉論壇亦難以進行。總之就係寶藥黨,信者得救,不信者沉淪。
經過記者深入追蹤,豁免近30萬入境人士不用強制隔離(又冇足夠檢測),以及不戴口罩的近距離接觸(主要是食肆),才是第三波爆發的主因。61萬人參與的民主派初選亦以事實證明,只要人人戴口罩,票站做好措施,排隊投票不是問題。
疫情當然有可能影響選舉能否如期進行,但到底「能」還是「不能」,判斷基礎應是防疫科學,咁你信曾鈺成還是許樹昌( https://news.rthk.hk/…/ch/component/k2/1539799-20200725.htm… )?
雖然我認為目前的疫情絕未嚴重到押後立法會選舉的程度,不過,從中共的角度看,疫情確實是千載難逢的藉口可讓他們體面地減少與美國硬碰。
美國國務卿蓬佩奧發表討共檄文吹響集結號後,有傳歐洲即將將跟進制裁,澳洲亦向聯合國發信否定中國南海主權。全方位的「超限戰」已經進行中,形勢令香港立法會選舉成為國際政治風眼中的風眼,甚至可能是點燃火藥庫的藥引。
相信紅頭決策文件已經放在習近平枱頭:
A)主和派:押後立法會選舉,押後及低調處理國安法案件,暫時凍結香港問題,不跟美國硬碰
B)主戰派:繼續立法會選舉,大規模DQ候選人,擺明要在總統選舉前和美國硬碰
(A)的機會稍高,民主派議員需決定是否參與林鄭召開的緊急立法會會議;若果是(B)的話,香港人只管繼續選票抗共,坐看局勢升級。
component數學 在 國立陽明交通大學電子工程學系及電子研究所 Facebook 的最佳貼文
光電工程獎40年首位女性得主 交大電子洪瑞華主任團結女力
上下滑動Line訊息,電子系洪瑞華教授自信地說,在「Women in optics @Taiwan」平台上,女性光電研究者互相交流研究資訊,展現團結力量。獲選為中華民國光電學會「光電工程獎」40年來首位女性得主,洪瑞華教授不只積極推廣光電研究國際化,還盡其所能,協助女性研究者平衡教研與家庭。
「雖然現在倡議男女平等,但在亞洲社會,女性的家庭角色往往還是比男性吃重得多!」洪瑞華教授觀察到,女性研究者生產育兒後,常常得挑燈夜戰改論文、備課,長期蠟燭兩頭燒下,很可能全然放棄研究工作;即使繼續操守本業,也可能因育嬰留停,公開發表著作的時間出現斷層,導致在申請計畫補助時,研究能力受質疑。
女人生兒育女,沒想到成為事業絆腳石,為了打破社會上的隱性藩籬,洪瑞華教授今年在中華民國光電學會裡,成立Women in optics @Taiwan委員會,有系統地整理計畫申請重點和科學新知,讓「媽媽」研究者有效率地交流資訊,「如果有一套經驗傳承,或許她們能免於焦頭爛額,平衡工作與家庭。」由於成員同質性高,大家在工作之餘,也偶爾分享生活趣事,儼然成為一處緊密扶持的交友圈。
問到是否也是一路苦過來,洪瑞華教授欣慰地說,還好小姑願意幫忙照顧孩子,先生也很會下廚,稍微分擔家務,讓她不致於在工作與家庭間被迫選擇。由於先生同樣從事光電領域研究,兩人時常互相討論交流,「缺點就是我們下班後還在討論研究問題,好像無時無刻都在做研究。」她開玩笑地表示。
除了Women in optics @Taiwan資訊流通平台,洪瑞華教授也舉辦國內首場女性光電科學家論壇,體貼媽媽們需要「帶小孩」,還特別規劃孩童光電區,將軟糖設計成各種透鏡,讓孩子不只吃軟糖,也學習光的折射原理,寓教於樂;孩子玩得開心,媽媽們也專心聆聽演講。
投入教研35年,洪瑞華教授春風化雨無數學生,對於學生研究表現,她笑說,女孩子做實驗和歸納資料,還是比較細心和敏銳。採訪過程中,有同學繳交焊接好的線路,只見洪老師摘下眼鏡左右端倪一會兒,再娓娓給予建議,似乎應證女性細膩的性格。
洪瑞華教授研究橫跨光電、電子和微機電,致力於提升發光二極體製程,以及太陽能電池和產氫系統效能,研究成果技轉國內相關廠商,專利更曾獲得國家發明獎、5次科技部傑出技術移轉貢獻獎、科技部之傑出獎。未來她將繼續貢獻光電產業與研究,並以女性獲獎者身分,鼓勵女性研究者投入光電領域創新創業。
新聞來源
https://www.nctu.edu.tw/component/k2/item/3936-40
component數學 在 10410韓永楷教授離散數學_第27B講Connected Component ... 的推薦與評價

10410韓永楷教授離散 數學 _第27B講Connected Component & Path. 570 views570 views. May 16, 2019. 1. Dislike. Share. Save. ... <看更多>
component數學 在 Graph: Intro(簡介) 的推薦與評價
Discrete Mathematics(離散數學), None ... connected component:若在一個undirected graph中,存在某一個subgraph是connected,而且沒有任何vertex、edge再加入 ... ... <看更多>
component數學 在 10410韓永楷教授離散數學_第27A講Connected Component ... 的推薦與評價
10410韓永楷教授離散 數學 _第27A講Connected Component & Path. 770 views770 views. May 16, 2019. 1. Dislike. Share. Save. ... <看更多>