「與眾趨同將無法生存
這是我以亞馬遜執行長身分所寫的最後一封年度股東信,在這最後,我很希望你明白一個極重要的觀念,也希望所有亞馬遜人銘記於心。
理查。道金斯(Richard Dawkins)在他非常了不起的著作《盲眼鐘錶匠》(The Blind Watchmaker)中,有一段談到生物的原理:
生物要努力,才能避免死亡。順其自然什麼都不做,就會死亡,回到與環境一致的狀態。去量一量生物的體溫,酸鹼度,含水量或電位,你會發現,活著的生物體狀態數值與周遭環境迥異。例如,人類的身體溫度通常高於周遭環境,在寒冷的天氣裡,人體必須努力運作,才能維持這溫度上的差異。假如一個人死了,他的身體不再運作,溫度的差異就會開始消失,到最後,他的身體溫度會變得與周遭環境的溫度一樣。並非所有動物都會努力避度趨同,但所有動物都有似的機制。舉個例子,乾燥國家的動植物會想辦法避免體內水分散失至體外,努力保持細胞含水量,對抗水往乾燥處流失的自然作用。如果這些動植物的努力失敗就會死亡。總的來說,要是生命體不積極防止差異消失,就會融入周遭環境,再也不是自主生物。生命體死亡後,便是這情景。
道金斯寫這段話並未暗指什麼,但這段話真是太好的隱喻,對亞馬遜深具意義,我認為,這段話也是在說所有企業,組織和我們每個人。請想一想,這個世界多努力地讓你變得與眾無異?你要多努力才能保持與眾不同?你要多努力,才能一直保有讓你與眾不同之處?」
https://www.books.com.tw/products/0010890096
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
introduction例子 在 紙羊 papergoat Facebook 的最佳解答
#新紀元短課程 #廣告與創意文案寫作
#廣告與文案入門 #羊老師
-
今天第一堂課。全班一共23位同學,年齡從18到28歲不等,有的是媒體係新生,其餘大部分都是即將畢業準備踏入職場的學生(且大多才20歲,就已經要被社會蹂躪了)。其中一位同學因為尚在實習當中所以由姐姐代為上課兩周(羊老師自我感覺良好想說天哪兩姐妹是多想上我的課)。
我請同學花一些時間分享自己當初選擇媒體係的理由,以及畢業之後想要工作的領域。畢竟這群少年即將會是媒體行業的生力軍,我也好藉機做個小調查。學生們的初衷不外乎“好玩”、“八卦”、“喜歡新聞”、“對拍攝有興趣”、“對媒體領域有熱忱”,而畢業後想要踏入的領域,羊老師很意外,佔大部分的竟然是“想進電台”。(羊老師懷疑是不是因為電台課的講師988DJ冠賢教得太好,所以學生對電台與廣播特別憧憬?)。其餘有的想跑新聞線、有的想當攝製幕後團隊、有的想和朋友經營自媒體、有的想當記者、有的已經投身數碼營銷。對,沒有人想進入廣告圈(羊老師玻璃心碎淚灑屏幕)。其中一位同學說他畢業後想當編輯,我就問,為什麼選擇了媒體係而不是中文係?同學回答說他其實是從中文係轉進媒體係,因為媒體係的課程更多元,“技術活”也更多。我想說也對,羊老師當初就是在中文與媒體這兩個分岔路上走向中文,而後於職場擺向媒體的例子;同學則相反。我說無妨,都是學習的過程,路會越走越清晰,就先好好浸染媒體的學識。
當然也請同學用一樣物件來形容自己。有白開水、放大鏡、天秤、一本書、一支筆、一杯咖啡、i3 的電腦(羊老師:哀傷的電腦?喔,是i3 processor的電腦)、白開水、仙人掌種子……二十二樣物件,只有白開水重疊。這其實是一道蠻無聊的問題,目的是為了探聽同學如何包裝自己(廣告的第一步),並且激發他們去思考自己何以為此無,對自身的認識與理解,以及對自己潛能的展望(怎麼變哲學課了?)。某位同學說她不知道自己是什麼。我說那不行的,廣告人無論什麼處境都會有法子的,同學後來回答,她會形容自己成一塊雲,因為還飄忽不定,不知道自己要飄向哪裡——我說你看,你知道的。你只是還不夠敢於表達真實的自己。
於是進入課堂的部分。基於今天這堂只是introduction,先大致講了“廣告”和“文案”的定義,再介紹廣告媒介類型——平面、電視、電台、數碼,以及它們各自精彩又經典的案例。羊老師每回講文案課必提 #全聯經濟美學,畢竟這是中文廣告業界一個很好的例子,講品牌包裝與廣告企劃如何拯救了一家行將倒逼的購物中心,以及如何將一個品牌的“弱點”扭轉成優勢並強化,一直沿用到今天,且每年都能提煉不一樣的經濟美學概念。前陣子才推出了一系列的宅經濟美學。
好的廣告必定是好idea先行。好的idea就像一顆發光的種子。你用文案、設計、影像、音樂去施予它養料,灌溉它,它就會生長成一棵肥美大樹。於是學生問我,如果沒有idea怎麼辦?是不是就不能踏進這個行業?我說我初入行時也沒什麼idea的,是的,沒什麼創意的點子,也對這行業沒什麼概念。但idea是可以累積的。多看,多讀,多想,多聽,多認真生活。從別人的作品裡學習,反思,萃取(不要抄襲),再創作。重要的是,你一定要去看這個世界的巔峰創意之作。今天你以大師為學習指標,哪怕你做的東西只是大師的50-60%,那你也達成了普遍世俗的70-80%。當然還要持續精進,求知若渴,尋求突破,敢於創新。這其實就是所謂的,站在巨人的肩膀上看世界。
我和學生說了沒有太多的理論可以教導他們,課堂也沒什麼規矩(羊老師本身就是一個抗拒規矩的人)。但我們可以一起看看世界的寬廣,且行且解惑,或製造更多疑惑,讓未來的人生替我們各自解答。並沒有亦不想要成為他們通往世界的門,但至少可以成為他們曾經的一扇窗,讓他們得以窺看窗外的風光明媚與暴雨雷擊,再讓他們打開自己的門,用自己的腳步往更遼遠的世界走去。
今天就到這裡。我們下堂課見。
introduction例子 在 Taipei Ethereum Meetup Facebook 的最佳解答
📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌