📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
同時也有4部Youtube影片,追蹤數超過3萬的網紅EAT AT HOME 食・家,也在其Youtube影片中提到,【日式馬鈴薯沙律|柔軟如絲質感|細節步驟逐一跟著做】 . 這個馬鈴薯沙律在日本飲食中很流行,不但在日式餐廳吃得到,還會偶爾見到這個當作餡料夾在麵包裏。馬鈴薯沙律好像是西方的食物,但在日本飲食中十分常見的關係,好像是一種和洋風的日本食品了。 . 別以為沙律就是將所有東西拌在一起便成,要做得好吃當中有很...
koh測試 在 尼西健康小學堂 Facebook 的精選貼文
【脊椎側彎!?運動真的有效嗎?】
一個簡單的動作測試看看自己到底有沒有脊椎側彎。請你輕鬆地彎腰摸摸腳趾頭,並請一位朋友幫你看看是否有一邊的肋骨凸起來了呢?
哇!...我好像就凸起來了..為什麼呢?
脊椎側彎本身是一個3D的變化,雖然說是側彎,但也同時伴隨著旋轉面的變化,因此應該平貼的肋骨,會因為旋轉而展生了明顯的凸起。
#脊椎側彎有救嗎?
在以前我還是學生的時候,常常接受的教育是脊椎側彎是不可逆的,唯有做核心穩定運動,似乎可以稍微減緩脊椎側彎的進程。
但,最近看的文章當中,香港的研究團隊Kwan KYH等人,2017發表的研究中發現個別化的運動加上呼吸可以有效地減緩甚至改善脊椎側彎的進程。
因此脊椎側彎並非不能改善,但並須針對個別化的訓練,包含到底是C型的側彎抑或是S型的側彎,我們使用的擺位和運動方向就會不同。
#簡單小運動
若你今天是一個C型的脊椎側彎,代表右側的肌肉、韌帶、筋膜是相對較緊繃的,此時你可以嘗試用右手往右側膝蓋帶動,產生更明顯的C型,再往對側(左上方)帶動,帶出反方向的C行弧度,如此就能有效的延長右側緊繃的肌群。
#最後
脊椎側彎本身是一個令人害怕的字眼,但千萬記得,身為治療師我們看到的是身體的可能性,不是看到人們的問題,也鼓勵有脊椎側彎的朋友,不要放棄可以享受人生的各樣可能!
#PT_TALK傅傅
#尼西健康小學堂
參考資料:
Kwan KYH, Cheng ACS, Koh HY, Chiu AYY, Cheung KMC. Effectiveness of Schroth exercises during bracing in adolescent idiopathic scoliosis: results from a preliminary study. Scoliosis and Spinal Disorders 2017; 12: 1-7
歡迎大家參加7/6尼西主辦職場分享會,
我們希望帶給年輕一輩的治療師一個對於未來的展望,
如何將治療師的專業發揮到不同領域?
如何獨力面對個案?
如何從診所一步一步走到自費市場?
我們期待更多的人一起來參與
報名連結:https://reurl.cc/1WVKX
koh測試 在 尼西健康小學堂 Facebook 的精選貼文
【脊椎側彎!?運動真的有效嗎?】
一個簡單的動作測試看看自己到底有沒有脊椎側彎。請你輕鬆地彎腰摸摸腳趾頭,並請一位朋友幫你看看是否有一邊的肋骨凸起來了呢?
哇!...我好像就凸起來了..為什麼呢?
脊椎側彎本身是一個3D的變化,雖然說是側彎,但也同時伴隨著旋轉面的變化,因此應該平貼的肋骨,會因為旋轉而展生了明顯的凸起。
#脊椎側彎有救嗎?
在以前我還是學生的時候,常常接受的教育是脊椎側彎是不可逆的,唯有做核心穩定運動,似乎可以稍微減緩脊椎側彎的進程。
但,最近看的文章當中,香港的研究團隊Kwan KYH等人,2017發表的研究中發現個別化的運動加上呼吸可以有效地減緩甚至改善脊椎側彎的進程。
因此脊椎側彎並非不能改善,但並須針對個別化的訓練,包含到底是C型的側彎抑或是S型的側彎,我們使用的擺位和運動方向就會不同。
#簡單小運動
若你今天是一個C型的脊椎側彎,代表右側的肌肉、韌帶、筋膜是相對較緊繃的,此時你可以嘗試用右手往右側膝蓋帶動,產生更明顯的C型,再往對側(左上方)帶動,帶出反方向的C行弧度,如此就能有效的延長右側緊繃的肌群。
#最後
脊椎側彎本身是一個令人害怕的字眼,但千萬記得,身為治療師我們看到的是身體的可能性,不是看到人們的問題,也鼓勵有脊椎側彎的朋友,不要放棄可以享受人生的各樣可能!
#PT_TALK傅傅
#尼西健康小學堂
參考資料:
Kwan KYH, Cheng ACS, Koh HY, Chiu AYY, Cheung KMC. Effectiveness of Schroth exercises during bracing in adolescent idiopathic scoliosis: results from a preliminary study. Scoliosis and Spinal Disorders 2017; 12: 1-7
歡迎大家參加7/6尼西主辦職場分享會,
我們希望帶給年輕一輩的治療師一個對於未來的展望,
如何將治療師的專業發揮到不同領域?
如何獨力面對個案?
如何從診所一步一步走到自費市場?
我們期待更多的人一起來參與
報名連結:https://reurl.cc/1WVKX
koh測試 在 EAT AT HOME 食・家 Youtube 的最佳解答
【日式馬鈴薯沙律|柔軟如絲質感|細節步驟逐一跟著做】
.
這個馬鈴薯沙律在日本飲食中很流行,不但在日式餐廳吃得到,還會偶爾見到這個當作餡料夾在麵包裏。馬鈴薯沙律好像是西方的食物,但在日本飲食中十分常見的關係,好像是一種和洋風的日本食品了。
.
別以為沙律就是將所有東西拌在一起便成,要做得好吃當中有很多細節要注意喔。從日本的廚師 @Koh Kentetsu Kitchen 的YouTube學到這個食譜,當中技巧包括:
-馬鈴薯要做到如絲般幼滑,可以在煮馬鈴薯的時候加一點砂糖。
-馬鈴薯煮好後再以小火去掉水份,令馬鈴薯做出來質感完全乾爽。
-洋蔥要切非常幼絲,然後先放到室溫水中浸十分鐘左右,以去除辣味。
-青瓜要軟化完全融入沙律中,要先加一茶匙鹽,待水份完全釋出後,再用手和廚紙完全捏乾水份。
.
廚師還用了生雞蛋作醬汁,因為我不太習慣所以跳過了這步,有興趣的朋友也可跟著試試看。
.
另外,醬汁方面用到顆粒芥末醬。來自法國的芥末醬分別有第戎芥末醬和顆粒芥末醬兩類,第戎芥末醬質地平滑,顆粒芥末醬則由芥末種子連皮一起磨成,加了顆粒芥末醬的料理令人吃到芥末子的獨特質感。如果找不著顆粒芥末醬也可用其他芥末醬來代替。
.
逐一跟著步驟做,再調自己喜歡的味道,定能做出如日本餐廳吃到的味道,希望大家喜歡這個食譜吧。
馬鈴薯沙律
.
材料
.
馬鈴薯三隻(約320克)
雞蛋兩隻
洋蔥1/4個 (約60克)
青瓜半條
火腿三塊
.
煮馬鈴薯用調味料
.
白砂糖一茶匙
.
馬鈴薯調味
.
鹽一茶匙
白醋一茶匙
.
醬汁材料
.
蛋黃醬兩湯匙
顆粒芥末醬一茶匙
白醋1&1/2茶匙
鹽1/8茶匙
黑胡椒碎少許
.
做法
.
洋蔥切幼絲,放在室溫水中十分鐘,捏乾水份及用廚房紙抹乾。
火腿(已熟)切小塊。
青瓜切薄片,加一茶匙鹽拌好後放十分鐘,用手捏乾水份及用廚房紙抹乾。
馬鈴薯去皮後切成小塊,放入小鍋內,加入清水直至蓋過馬鈴薯面,開中火,加入白砂糖一茶匙。煮至馬鈴薯熟透,以筷子測試是否容易穿過馬鈴薯中心。關火,倒去水份。
馬鈴薯連鍋子再放在爐上,開小火直至水份完全蒸發。關火。
加入鹽一茶匙及白醋一茶匙。
放入洋蔥絲,拌勻。
雞蛋在底部刺上小洞。在小鍋內燒開水,放進雞蛋並烚至全熟(約八分鐘),盛起放入室溫水中浸一分鐘後剝殼,切碎備用。
將醬汁材料拌勻。
在一個拌碗內,放入馬鈴薯及洋蔥、雞蛋、火腿和青瓜拌勻,最後加入醬汁拌勻便完成馬鈴薯沙律。
![post-title](https://i.ytimg.com/vi/iI3uMeaFF0Q/hqdefault.jpg)
koh測試 在 CosEncounter Youtube 的精選貼文
| 目錄 |
0:23 | 精簡講下我的近況
2:23 | 皮膚敏感
7:21 | 生活壓力
8:40 | 霧眉事件
17:08 | 運動減壓
第二次霧眉姨姨:
EVA WECHAT: yoyo61999
$800 / $1000 / $1500 視乎顏料而收費
屯門元朗朋友可以去運動的地方:
有跳舞/YOGA/TRX 玩,每堂一個小時左右,適合運動新手!!
約幾個朋友去很開心:D
新會員$700/10堂;舊客$880/8堂; $1800/18堂
可以先去試堂 $60, 2人同行, 一人價錢
詳情可在FACEBOOK看
FACEBOOK PAGE: Twinkle Fit
| 片中提及過的產品 |
DR.WU | 玻尿酸保濕精華露500ML重量版
DR.WU | 潤透光美白系列*(PR Gift)
Natura Bisse | Diamond Extreme eye cream
Natura Bisse | Tensolift Neck Cream
Ampleur | Luxury White W protect UV SPF50+ PA++++
Koh Gen Do | Moisture Foundation #103
Koh Gen Do | Aqua Foundation #103
Anastasia | Brow Pencil #soft Brown
MAC | eye shadow #omega
Charlotte Tilbury | Cheek to chic Blusher #first love
Charlotte Tilbury | eye shadow palette #exagger eyes
Charlotte Tilbury | superstar lips #pillow talk
| 我的皮膚性質 |
乾性敏感肌 缺水型 角質受損 泛紅 容易出油
對分子較大產品敏感,導致出暗粒
間中會長荷爾蒙暗瘡
| 我的網店 |
http://instagram.com/cosencounter
| 其他影片 |
☮ 護膚 ☮
如何處理暗粒和暗瘡 My Skin Story
https://youtu.be/yqRmseDYtWs
日間護膚步驟 Morning Skincare Routine
https://youtu.be/hv_IZ_WNLlQ
如何令皮膚光澤無瑕 晚間護膚步驟 How I keep my skin Clear
https://youtu.be/X6jJXTOALew
☮ 化妝 ☮
心機自然妝 Better Me
https://youtu.be/YEXHypqsILk
各大遮瑕產品比拼 Top Ranked Concealer
https://youtu.be/4OIPPc9Zx4g
十枝不同色系的唇膏 My Top 10 Lipsticks
https://youtu.be/FXpL116dYgk
☮ 測試一天 ☮
滋潤型 Cle de Peau Silky Cream Foundation
https://youtu.be/UIkY7P9FV6w
光澤感 Cle de Peau Radiant Fluid Foundation VS Dior Star Foundation
https://youtu.be/XVoLo_mL3js
零粉感 Chantecaille Future Skin Foundation
https://youtu.be/o2dJcDhEi_I
自然感 NARS Sheer Glow Foundation
https://youtu.be/TSrE0u2Dw08
☮ 心靈分享 ☮
Real Life: Losing Friends
https://youtu.be/lQGjddWLBUY
Losing myself 我們都曾經失去自己...
https://youtu.be/cuVzUf6M-0A
抑鬱症教會我的10件事
https://youtu.be/8xXWyXPooaM
感激你們抽時間睇呢一片短片同支持。如果你有任何問題,或者有咩Video Request,都可以係下面留言話我知。
DISCLAIMER:
The trip is NOT sponsored. All opinions and ideas are 100% honest and my own.
I get sent products, which were marked with an *, from time to time for reviewing purpose. But I DO follow the discipline that trying out new products for more objective reviews for audiences/viewers (you). I do not have the obligation to review these products in positive light nor give opinions from any third party. Instead, I would analysis/review these products same as what I do on self-purchased products. I am obligated to select what products could be featured on this channel in terms of the features of the merchandise. Yet all opinions would be 100% honest and my own.
Without you guys, I would not be able to make videos on this channel and have loads of wonderful opportunities. I am constantly devoting to improve the contexts of my videos and, therefore I would try my best to balance the controversial of this sensitive issue and not to put the cart before the horse. Lastly, I am truly thankful for all of your continuous supports. I love you all and hope you have a wonderful day.
Peta
![post-title](https://i.ytimg.com/vi/2c2R9l385is/hqdefault.jpg)
koh測試 在 Spice Travel 辣旅遊 Youtube 的最佳貼文
年底假期機票價格都破表,選到冬天適合前往的地點才可以開心度假又不花冤旺錢,冷冷的冬天不只可以去賞雪、泡溫泉、大嗑美食;也可以去熱情的海島避冬,享受寧靜的沙灘,和不受污染的淨海
Spice App 測試版邀請表單:https://goo.gl/forms/97Ad7tuFkCFtf3Pu1
訂閱 Spice : https://goo.gl/dQoypP
景點
然別湖冰上村
青池
白鬚瀑布
美瑛之丘
Long Beach
Bamboo Bay
Koh Rok Nok
Khao Mai Kaew Cave
Mangodlong Beach
Santiago White Beach
Buho Rock
Bukilat Cave
Timubo Cave
餐廳
麵屋彩未
------------------
追蹤我們 -
Instagram ► https://www.instagram.com/spicetaiwan
Facebook ► https://www.facebook.com/spicetw
Spice 部落格 ► https://blog.spiceup.io
Spice VR頻道 ► https://www.youtube.com/SpiceVR
------------------
音樂來源 -
Joakim Karud - Loudness Clarity (Upbeat Vlog Music for Youtube):https://youtu.be/4yFAnw2U_uA
One minute - Noodles [Future Bass]:https://youtu.be/V29KEUB01a0
Junklicious - Space Gelato (No Copyright Future Bass Music):https://youtu.be/uoXKMy07HtA
NOWE - Heart of Gold (Vlog No Copyright Music) :https://youtu.be/EALgD9ZjFyo
![post-title](https://i.ytimg.com/vi/YvnYSJcGBbs/hqdefault.jpg)