📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
同時也有2部Youtube影片,追蹤數超過18萬的網紅公視新聞網,也在其Youtube影片中提到,※ 本單元是公共電視及李江却台語文教基金會合作製作。歡迎大家 link 做非營利教學使用。 新聞標題:嗽個外月攏袂好 變肺炎就煩惱 Sàu tsiânn kò gue̍h lóng bē hó piàn hì-iām tō huân-ló 咳嗽蓋著磨 直嗽袂好愛斟酌檢查 Ka-s...
koh檢查 在 邱品齊醫師幸福美肌大公開 Facebook 的最佳解答
認識皮膚表面貼片檢查與KOH檢查
https://vocus.cc/skindocchiu/5ef05778fd897800019b0c0f
koh檢查 在 皮膚科 胡怡萱醫師 Facebook 的最讚貼文
#皮膚科的武器 #顯微鏡 microscope
在住院醫師訓練過程中,我們幾乎每天都會碰顯微鏡!專科考試也要考我們看玻片的能力。
主要分為看兩種類型的玻片,一個是皮膚抹片檢查,一個是皮膚切片、皮膚腫瘤切除後的病理玻片。
🔍皮膚抹片可以看什麼?
最常使用:皮膚黴菌感染、念珠菌感染
特殊染色:疑似皰疹 (目前診所無法檢驗)
寄生蟲檢查:臉部蠕型蟎蟲、頭蝨、體蝨、疥瘡
(太多檢查了沒有辦法全部列出來...)
🔍皮膚抹片檢查怎麼做?
大部分是拿刀片輕輕刮下皮屑(不是切下去喔),用KOH溶液溶解皮屑中的角質,再用顯微鏡來找蛛絲馬跡!
檢查需依照醫師判斷後安排喔~
koh檢查 在 公視新聞網 Youtube 的精選貼文
※ 本單元是公共電視及李江却台語文教基金會合作製作。歡迎大家 link 做非營利教學使用。
新聞標題:嗽個外月攏袂好 變肺炎就煩惱
Sàu tsiânn kò gue̍h lóng bē hó piàn hì-iām tō huân-ló
咳嗽蓋著磨 直嗽袂好愛斟酌檢查
Ka-sàu kài tio̍h-buâ ti̍t sàu bē hó ài tsim-tsiok kiám-tsa
著磨/tio̍h-buâ:華語講「辛苦」、「折磨」
諺語:醫生驚治嗽,做塗水驚掠漏。
I-sing kiann tī sàu, tsò thôo-tsuí kiann lia̍h lāu
咳嗽上歹醫,因為原因真濟,真僫掠著源頭,所以,嗽著毋通拖,緊予醫生斟酌檢查,才袂拖久過頭傷重。
「黴漿菌」華語嘛叫做「支原體」,是一種比細菌擱較原始ê微生物,英語號做mycoplasma,差不多通世界ê語言攏直接取mycoplasma ê發音來叫--伊,包括日語「マイコプラズマ」佮韓語「마이코플라스마」嘛攏是mycoplasma ê音譯,所以建議台語嘛直接音譯就好。另外有請教執業醫師,in用台語門診ê時,嘛是直接講做「mycoplasma」。
內文:
流感流行高峰過去矣
Liû-kám liû-hîng ko-hong kuè--khì-ah,
猶毋過最近病院門診
iáu-m̄-koh tsuè-kīn pēnn-īnn mn̂g-tsín,
猶是出現袂少人咳嗽一直無好
iáu sī tshut-hiān bē tsió lâng ka-sàu it-ti̍t bô hó.
感染科醫生講
Kám-jiám-kho i-sing kóng,
一般感冒嗽上濟兩禮拜
it-puann kám-mōo sàu siōng-tsē nn̄g lé-pài,
猶毋過這波嗽無停的病人
iáu-m̄-koh tsit pho sàu bô thîng ê pēnn-lâng,
誠濟攏是穢著mycoplasma(『黴漿菌』)
tsiânn tsē lóng sī uè-tio̍h mycoplasma,
若是無去看醫生
nā-sī bô khì khuànn i-sing,
毋但會嗽真久
m̄-nā ē sàu tsin kú,
閣有可能會引起肺炎
koh ū khó-lîng ē ín-khí hì-iām
*黃立民 感染科醫師
真濟人去hông穢著mycoplasma
Tsin tsē lâng khì hông uè-tio̍h mycoplasma,
造成呼吸系統感染
tsō-sîng hoo-khip hē-thóng kám-jiám,
甚至造成肺炎
sīm-tsì tsō-sîng hì-iām,
蹛院的病人嘛明顯咧增加
tuà-īnn ê pēnn-lâng mā bîng-hián teh tsing-ka.
醫生表示予mycoplasma感染的病人
I-sing piáu-sī hōo mycoplasma kám-jiám ê pēnn-lâng,
毋但嗽真久
m̄-nā sàu tsin kú,
而且閣以焦嗽為主
jî-tshiánn koh í ta-sàu uî tsú,
鼻水也較少
phīnn-tsuí iā khah tsió.
若是嗽真久
Nā-sī sàu tsin kú,
傳染的機會也增加
thuân-jiám ê ki-huē iā tsing-ka.
有袂少病人攏是一个人嗽
Ū bē-tsió pēnn-lâng lóng sī tsi̍t ê lâng sàu,
規家伙仔穢著
kui-ke-hué-á uè--tio̍h.
疾管局講
Tsi̍t-kuán-kio̍k kóng,
mycoplasma流行可能會到五月
mycoplasma liû-hîng khó-lîng ē kàu gōo--gue̍h,
而且臨床上治療已經發現抗藥性
jî-tshiánn lîm-tshn̂g siōng tī-liâu í-king huat-hiān khòng-io̍h-sìng.
*周志浩 疾管局副局長
只要是細菌
Tsí-iàu sī sè-khún,
加加減減會有抗藥性的問題
ke-ke-kiám-kiám ē ū khòng-io̍h-sìng ê būn-tê,
應該是 佇治療上猶OK
ing-kai sī tī tī-liâu siōng iáu OK,
毋過嘛是愛斟酌
m̄-koh mā sī ài tsim-tsiok.
疾管局表示
Tsi̍t-kuán-kio̍k piáu-sī,
目前掌握抗藥性閣無真嚴重
bo̍k-tsîng tsiáng-ak khòng-io̍h-sìng koh bô tsin giâm-tiōng,
而且醫生建議
jî-tshiánn i-sing kiàn-gī
嗽真久攏無好的民眾
sàu tsin kú lóng bô hó ê bîn-tsiòng,
上好去病院檢查
siōng-hó khì pēnn-īnn kiám-tsa,
才袂引起併發症
ttsiah bē ín-khí pīng-huat-tsìng.
koh檢查 在 公視新聞網 Youtube 的最佳解答
"看世事講台語"單元所有影片及文字,是公共電視及李江却台語文教基金會合作製作。歡迎大家 link 做非營利教學使用。
標題:
赤崁樓步道 墓牌踏跤下
Tshiah-khàm-lâu pōo-tō, bōng-pâi ta̍h kha-ē
以早有整修 市府怎驗收
Í-tsá ū tsíng-siu, Tshī-hú tsuánn giām-siu
諺語:共天公借膽
Kā thinn-kong tsioh tánn
啥物人遐好膽,曷(ā)敢偷挖墓牌賣--人,敢講是共天公借膽?貪財嘛毋通做這款僥倖(hiau-hīng)的代誌!
內文:
真正是墓牌neh
Tsin-tsiànn sī bōng-pâi neh
頂面有字neh
Tíng-bīn ū jī neh
一早起
Tsi̍t tsái-khí
台南市政府就派人
Tâi-lâm Tshī-tsìng-hú tō phài lâng
kā所有的地板反(píng)開
kā sóo-ū ê tē-pán píng khui
一塊一塊倚佇壁邊
tsi̍t-tè tsi̍t-tè uá tī piah pinn
欲清查看覓仔所有的步道石枋
beh tshing-tsa khuànn-māi-á sóo-ū ê pōo-tō tsio̍h-pang
敢猶閣有墓牌
kám iáu-koh ū bōng-pâi
台南市國定的一級古蹟赤崁樓
Tâi-lâm-tshī kok-tīng ê it-kip kóo-tsik Tshiah-khàm-lâu
去予民眾發現用墓牌舖步道
khì hōo bîn-tsiòng huat-hiān īng bōng-pâi phoo pōo-tō
當場驚著
tong-tiûnn kiann--tio̍h
更加批評台南市政府
kìng-ka phue-phîng Tâi-lâm Tshī-tsìng-hú
無尊重往生的人
bô tsun-tiōng óng-sing ê lâng
(余基吉科長 台南市文化局)
文昌閣本身是佇81年就整修
Bûn-tshiong-koh pún-sin sī tī peh-tsa̍p-it nî tō tsíng-siu
整修了後
tsíng-siu liáu-āu
伊這个遺址
i tsit-ê uî-tsí
可能佇下底重做一个鋪面
khó-lîng tī ē-té tîng tsò tsi̍t-ê phoo-bīn
到底這个石材來源是按怎
Tàu-té tsit-ê tsio̍h-tsâi lâi-guân sī án-tsuánn
阮目前咧做調查
guán bo̍k-tsîng teh tsò tiau-tsa
國內外有名的景點赤崁樓
Kok-lāi-guā ū-miâ ê kíng-tiám Tshiah-khàm-lâu
一年有上百萬的人來遮tshit迌
tsi̍t nî ū tsiūnn pah-bān ê lâng lâi tsia tshit-thô
這馬竟然去予人發現
tsit-má kíng-jiân khì hōo lâng huat-hiān
用墓牌做步道
īng bōng-pâi tsò pōo-tō
台南市文化局趕緊
Tâi-lâm-tshī Bûn-huà-kio̍k kuánn-kín
kā所有的石枋徙開
kā sóo-ū ê tsio̍h-pang suá khui
就驚造成遊客無好的感覺
tō kiann tsō-sîng iû-kheh bô-hó ê kám-kak
(余基吉科長 台南市文化局)
目前全部反起來
Bo̍k-tsîng tsuân-pōo píng--khí-lâi
紲落閣檢查看覓
suà--lo̍h koh kiám-tsa khuànn-māi
仝款會重閣
kâng-khuán ē tîng koh
kā這个路面重新kā伊做予整齊
kā tsit-ê lōo-bīn tîng-sin kā i tsò hōo tsíng-tsê
閣經過市府人員詳細清點了後
Koh king-kuè Tshī-hú jîn-uân siông-sè tshing-tiám liáu-āu
確定有兩塊石枋是墓牌
khak-tīng ū nng-tè tsio̍h-pang sī bōng-pâi
為啥物步道會出現墓牌
uī-siánn-mi̍h pōo-tō ē tshut-hiān bōng-pâi
是對佗位來
sī tuì tó-uī lâi
市府猶閣愛調出當初整修的資料
Tshī-hú iáu-koh ài tiàu-tshut tong-tshoo tsíng-siu ê tsu-liāu
調查驗收的過程敢有確實
tiau-tsa giām-siu ê kuè-thîng kám-ū khak-si̍t
而且愛進一步追查
jî-tshiánn ài tsìn-tsi̍t-pōo tui-tsa
敢有行政的疏失
kám-ū hîng-tsìng ê soo-sit
koh檢查 在 成大醫院- 刮取皮屑可在KOH檢查下看到黴菌。 - Facebook 的推薦與評價
刮取皮屑可在KOH檢查下看到黴菌。 ... 刮取皮屑可在KOH檢查下看到黴菌。 Timeline photos · Aug 29, 2016 ·. View Full Size · 鍾羽琇 likes this. Loading. ... <看更多>