📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
同時也有1部Youtube影片,追蹤數超過14萬的網紅SELF PICK,也在其Youtube影片中提到,嘉凱導演因為電影籌備有好長一段時間消失在辦公室,但有了各個夥伴的協助,新的世界新的故事正在慢慢發生。 訂閱 SELFPICK ▶ http://bit.ly/sp-subscribe - 📖 小編補充 ■ 什麼是 SELF ? SELF 是透過以太坊智能合約所創建的代幣,同時也是開啟「沉浸式娛...
以太坊智能合約 在 雷司紀的小道投資 Facebook 的最讚貼文
【一】
除了美股以外,我另一個有在深入研究的資產是加密貨幣。
-
我研究股票和加密貨幣差不多是同一時期,也就是讀碩士的那段時間。第一次聽到比特幣是大二,但當時什麼都不懂,小屁孩一枚,而且加密貨幣的服務也不像現在那麼成熟,沒有一定的技術門檻也是沒辦法進入的,所以基本上大學那幾年都沒碰。
-
直到上研究所,才從比特幣/以太幣的挖礦開始,有用過水龍頭,也有用 CPU (後來進化到 GPU) 連上 nicehash 進行挖礦,當年還發生過 nicehas 被駭客入侵的狀況,服務停擺了一陣子。同時,我也見證了幣託、MaiCoin、Coinbase、幣安交易所的創立。認真算算,其實也不過是五、六年前的事情而已。
-
那時候,我的加密貨幣 100% 都是靠挖礦得來的,而且是挖多少就到幣託/Maicoin 上換多少,因為只是玩票性質,所以沒有賺很多,頂多幾萬元而已。然後 2018 年的幣災,我就索性不玩了,並把心力都放在美股投資、產學合作以及研究所的論文上(我研究所是做 AI 的)。
-
直到畢業以後,2018-2019 才又重拾對加密貨幣的研究。不過這麼說也不太對,因為嚴格說起來,是重拾對「區塊鏈技術」的研究。要知道,當時那段時間大家很愛把這個圈子分成「幣圈」和「鏈圈」,定義也很簡單:前者就是專門做炒幣的群體(例如發行 ICO、空投、槓桿交易...),後者則是專門做技術應用的群體(例如 Defi、NFT、智能合約...)。
-
我算是比較接近「鏈圈人」,研究過 Solidity 程式語言和以太坊智能合約的撰寫,也曾加入過某知名區塊鏈新創 (但後來離開了,這又是另外一段故事)。我很感謝在這段時間所累積的知識、經驗、以及遇到的人,這些經歷對我之後在投資加密貨幣上、分析幣圈鏈圈未來的趨勢上、判斷項目的潛力價值上,都有著非常大的幫助。
-
2020,我重新開始投資加密貨幣,當時買最多的是 SOL,在 2020/9 就開始買,一路買,一直買,最低曾買過 1.8 美元的價格(這篇發文的時候差不多 35 美金),而過程中我也有數次轉換資產的操作,曾經換過 CAKE、SRM、ADA、SAND、BNB,並且跟到了 2020-2021 年初這一波幣圈大爆發的漲勢,賺了不少,多虧了馬哥、木頭姐、以及美國無限量化寬鬆的原因。(這一年我的美股操作過 AMD、PLTR、GPRO,也翻倍了)
-
然後來到了上個月的 519 的幣災!這大概是近期幣圈最哀鴻遍野的時段,導致不少人紛紛痛斥馬哥,但我卻覺得大家都怪錯人了,其實真正的罪人是星野源才對(?)。總之,在這一波災情中,我在比特幣上認賠了差不多 450 萬,現在仍繼續持有的平台幣 FTT 也縮水了 6 成。
-
看起來很傷對吧,我當下也這麼認為。
-
不過當我把時間區間設定成 2020 年中(詳細日期忘了) ~ 2021/06/20,並發現我在幣圈投入的資產已經翻了 2.5 倍後,就還算平常心看待了。因為 519 這一波幣災,只是把原本賺的吐一部分回去而已。
-
在投資領域中,真正重要的事情從來就不是「過去」,而是「未來」。(註:並非說歷史不重要,我很愛歷史,因為歷史是過去經驗的積累,是很有價值的參考資訊。這邊所要傳達的觀念是:投資屬於不可回溯的行為,投資報酬/虧損永遠存在於「未來」,非常簡單、但很多人卻時常會忽略的觀念)
-
所以自從 519 幣災後,這一個月來我和團隊每天追蹤幣圈、研究各種指標、觀看其他大神的評論、內部討論現在的幣圈情況究竟為何、未來的走勢可能會有哪些劇本?
-
然後,終於有了一個比較完整的心得......
-
(續)👇
https://www.facebook.com/raysky.invest/posts/2842099106119295
-
Photo by Icons8 Team on Unsplash
以太坊智能合約 在 動區動趨 BlockTempo - 由社群而生的區塊鏈媒體 - Media for Blockchain Facebook 的精選貼文
#Nvidia #顯卡挖礦 #產品分流 #CMP
【Nvidia黃仁勳坦言礦工搶卡難防!認為 Arm 運算架構不會取代 x86 市場】
👁Nvidia 執行長黃仁勳在 Computex 線上連訪上表示,市場上顯示卡遭礦工搶購的現象,短期間內應該難以改善。
不過,他也提到了自己非常清楚以太坊、智能合約、DeFi 和 NFT 等區塊鏈技術,並看好未來更多元的應用出現...
-
#同場加映
① 玩家注意!Nvidia 推出新顯卡 RTX 3070Ti、 3080Ti,定價補足產品線缺口、最快6/3上市
https://tempo.pse.is/3gs797
② 防毒軟體|諾頓 LifeLock 推「以太坊挖礦」功能, 供客戶用 PC 挖礦賺ETH
https://pse.is/3gll3a
-
✅ 即時新聞鎖定 #動區Telegram
https://t.me/blocktemponews
✅ 每日新聞精選訂閱 #LINE:
https://line.me/R/ti/p/%40kgx9780p
✅ 右轉動區 #千人投資討論群:
https://line.me/ti/g2/htySqS7SoKOuGGFx4Gn9dg
以太坊智能合約 在 SELF PICK Youtube 的最佳貼文
嘉凱導演因為電影籌備有好長一段時間消失在辦公室,但有了各個夥伴的協助,新的世界新的故事正在慢慢發生。 訂閱 SELFPICK ▶ http://bit.ly/sp-subscribe
-
📖 小編補充
■ 什麼是 SELF ?
SELF 是透過以太坊智能合約所創建的代幣,同時也是開啟「沉浸式娛樂」體驗的關鍵鑰匙,將在電影《聖人大盜》與現實世界同步發生,邀請您與我們共同創造一個打破現實、虛擬疆界的新世界
■ 要怎麼擁有 SELF ?
贊助支持電影《聖人大盜》群眾募資計畫,用虛擬貨幣 SELF 進場看電影! → http://bit.ly/2zdzJa2
-
🔎更多 SELFPICK 經典影片
寫手經典歌曲 《自由歌》
https://youtu.be/pbLJxFBOs80
《Mr.Bartender》愛情哪有什麼自私不自私
https://youtu.be/YVdt5MKElro
《Mr.Bartender》人生有機會成本可以算嗎
https://youtu.be/RyCamzLHi4w
《To My World》- Mr.Bartender 主題曲
https://youtu.be/CGjeT6Qj2pc
《灼火》- 網路影集 Mr.Bartender 片尾曲
https://youtu.be/VJlbwQZ2Xgo
《私室》- 台灣首部 4K 網路影集
https://youtu.be/OSIIXmxPJ8g
《BURN》- 私室 主題曲
https://youtu.be/XHmdFcNIciU
-
🎬Follow us
https://www.facebook.com/selfpick
https://www.instagram.com/selfpick
https://www.facebook.com/selftoken
📪合作邀約/廣告製作
ourselves@selfpick.cc