📜 [專欄新文章] [zkp 讀書會] Cairo 語言介紹
✍️ NIC Lin
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Cairo 是 STARK 證明系統的其中一個編程語言,讓開發者能透過 Cairo 來使用 STARK,撰寫效能更高的 Dapp
Photo by Simon Berger on Unsplash
Warning:本篇會保持在 high level 的介紹,實際深入的部分請見文內附上的文檔或是官方開發者文件
背景介紹
建構於密碼學的零知識證明能提供計算的隱私性,但同時在區塊鏈生態系也被用來提升 Scalability — 我可以用 10 秒的運算資源來驗證原本耗費 1000 秒運算資源的計算過程
如同更多人熟悉的 SNARK,STARK 也是一個零知識證明的證明系統,但當前的 STARK 著重的是在 Scalability ,而非大家比較習以為常零知識證明提供的隱私性特質
其實目前基於 SNARK 的 Rollup 項目,例如 zkSync、Loopring、Aztec、zkopru,除了 Aztec 外,其他都是利用 SNARK 來增加 Scalability — 這些 Rollup 上資料都還是公開、沒有隱私性的
StarkWare 是目前唯一基於 STARK 的開發團隊
STARK 要加上隱私保護不會太難,只是 StarkWare 還沒有把這項功能放在未來規劃中
Cairo 簡介
標榜為圖靈完備的零知識證明系統語言,Cairo 對原本熟悉 Solidity 的開發者來說還是會感到比較難上手和陌生的。再加上套件庫還不夠充足,目前支援的雜湊函式是 Pedersen,數位簽章演算法是 ECDSA(相對於 SNARK,EdDSA 的效能反而比較差所以沒有支援)。
但 Cairo 還在早期開發的階段,相信開發體驗會越來越好的。
另外需要注意的是作為一個證明系統,會有 Prover 和 Verifier 的角色。而 STARK 的 Verifier 是公開的,但 Prover 軟體預計會有 License 保護。Prover 一般情況下不得用於商業用途,除非將 proof 上傳至官方的 Verifier。
最後要提及的是,第一版的 Cairo 是設計來方便開發者將 Dapp 的運算遷移至鏈下。不同於 Rollup,這個鏈下只會有它自己一個 Dapp。這個 Dapp 的項目方自己維護自己 Dapp 的 state。( Rollup 則是 operator 維護所有 Dapp 的 state,Dapp 開發者不需自己操煩)
這可能有點難懂。如果你有在寫 Solidity,想像一下今天你在合約要用到合約裡宣告的 storage 變數時,你要自己提供 merkle proof 上來,證明這個storage 變數真的是這個值。這個就是開發者要自己維護 state 的意思。
而第二版的 Cairo 則是 StarkNet 裡使用的 Cairo(第一和第二版是不同編譯器),這版的 Cairo 就是作為 Dapp 在 Rollup 開發所使用 — 開發者可以在合約裡宣告變數,變數的值不需開發者維護,可以直接假設存在。
註1:StarkWare 不喜歡 Rollup 這個詞,他們覺得 Data Availability 的需求是一段光譜:不一定得要把 data 全都送上 L1,中間有其他方式可以做不同層級的 Data Availability。
註2:第一版和第二版實際上在官方版本裡是 0.0.1 及 0.0.2,在撰文當前最新版即是 0.0.2
官方網站:https://www.cairo-lang.org
開發者文件:https://www.cairo-lang.org/docs/
開發環境
Cairo 有提供像是 Remix 的瀏覽器 IDE:playground。裡面提供各種範例練習和挑戰,除了可以編譯,還可以直接生成並上傳 proof。
註:但有些功能還是沒辦法在 playground 裡使用,例如要給你的程式 custom input 時。這時候只能在本地端開發才能使用這個功能。
開發 Cairo 要先安裝python,我將開發者文件整理出來的資料統整在這個 hackmd 文檔裡:https://hackmd.io/w690dpAQTsKeKZv3oikzTQ
裡面包含簡介、設置本地開發環境以及 Cairo 基礎(因為篇幅原因,所以不將內容複製到這裡)
註:我把開發者文件裡的代碼整理到這裡:https://github.com/NIC619/cairo_practice/tree/master/practices
如果不想在研究開發者文件過程中,還要自己手動拼湊裡面例子的話,可以直接用整理好的代碼來執行。同時 repo 裡還有包含一些額外自己測試 Cairo 功能的範例。
深入 Cairo
在那份 hackmd 文檔裡的開頭,可以連結到第二部分 — 深入 Cairo 的部分。裡面也是從開發者文件裡擷取出來我覺得比較重要的部分。如果你要讀開發者文件的話,我建議從 Hello Cairo 開始,它會從例子切入,會比較好知道 Cairo 怎麼使用。接著如果要更深入了解,再去讀 How Cairo Works。
StarkNet Cairo
第二版的 Cairo 其實功能和第一版的 Cairo 是差不多的,所以不必擔心在開發者文件裡學到的 Cairo 在 StarkNet 版本會不能用或差很多。在讀完 Hello Cairo/How Cairo works 後,就可以接著看 Hello StarkNet。會很順利的切換到 StarkNet 版本的 Cairo。
註1:我整理的文檔裡是按照第一版 Cairo 所寫的
註2:如果你從開發者文件一路看下來,體驗過非 StarkNet 版的 Cairo,那你在體驗 StarkNet 版的 Cairo 時一定會發現這更像一般智能合約的使用方式 — 你可以用 view 函式查詢 storage 變數,可以用 external 函式去執行合約(非 StarkNet 版本不是這樣操作 Dapp 的,這邊因為篇幅原因沒有詳細介紹)。
非常建議嘗試兩種版本的 Cairo,你會知道 1. 操作一個單獨在 L2 的 Dapp 和2. 操作與其他 Dapp 共存在 Rollup 上的 Dapp 的不同。這對了解 L2 怎麼運行、需要哪些資料、為什麼需要這些資料非常有幫助。
0.0.2 版的 StarkNet Cairo 目前還缺少一些功能:
函式還沒辦法宣告陣列或 struct 型態的參數
合約和合約之間還沒辦法互動
L1 沒有辦法讀取到 L2 的資料,L2 也沒辦法讀取到 L1 的資料。如果要建立跨 L2 Bridge,這個功能非常重要。
補充及個人心得
STARK 的 proof size 相比於 SNARK 系列的 proof size 大很多,又其證明所包含的交易數量對 proof size 和驗證時間的影響不大,所以把很多筆交易一併做一個 proof 會是對 STARK 非常有利、節省成本的方式(SNARK、STARK 比較表)。但這同時也是一個缺點,如果你的 Dapp 或 Rollup 的 TPS 不高,那就只能等更久時間搜集多一點的交易,要不然就只能提高成本來維持驗證 proof 的頻率。
StarkWare和 zkSync 一樣都有 Rollup 宇宙的概念( Rollup 宇宙的用詞並不精確,因為在他們的宇宙中不會所有子鏈都是 Rollup,而是會有依照 Data Availability 程度不同所區分的子鏈,像是 Validium、zk Porter 的設計),個人覺得能夠有(針對 Data Availability 程度的)選擇是會比只有一個選擇(完全 Data Available) 還好的方式,但實際上的可行性就要等其團隊釋出更多的資訊。
在 Rollup 越趨成熟的情況下,能夠提供快速跨 Rollup 服務的流動性提供者的角色會越來越重要。zk Rollup(StarkNet、zkSync、etc…)比 Optimistic Rollup (Optimism、Arbitrum、etc…)有著短上許多的 finalize 時間,這對降低流動性提供者的風險有很大的幫助,但目前 zk Rollup 支援合約功能甚至 L1 <-> L2 互動的完成度都比 Optimistic Rollup 還低上許多。短期內快速跨 Rollup 的服務應該還是侷限在 Optimitic Rollup 之間。
abbrev
[zkp 讀書會] Cairo 語言介紹 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
solidity意思 在 Taipei Ethereum Meetup Facebook 的精選貼文
📜 [專欄新文章] EIP-1014 產生可控的智能合約地址
✍️ 飛天的狸貓
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
先前在 Solidity Taiwan 讀書會 群中看到一個討論,裡面應該是一個套利機器人,打開他的合約會發現 Contract 標記著 Reinit,大致上意思是在相同地址上曾經 Self Destruct 後又佈署新的 Byte Code。這其中就用到了 Vitalik 提出的 EIP-1014,來達成在固定的地址上佈署。
合約地址是怎麼產生的
如果對於以太坊智能合約佈署不陌生,應該會知道合約地址是依據佈署者的地址和他的 Nonce 來決定的。假如地址 0xa1 在 Nonce 為 1 的交易中建立了合約,合約地址是 0x01,則當他到了其他鏈而再次使用 Nonce 1 建立合約時,就也會得到相同的合約地址 0x01。
而在以太坊中,Nonce 是嚴格遞增的,這主要是為了避免雙花攻擊,因此很顯然的,再次佈署到同一個地址是不可行的。而在 EIP-1014 以前,在合約中建立的子合約也是透過這個方式達成。
EIP-1014 做了什麼
前面說到合約中可以建立子合約,通常使用的指令是 create,這個指令便會根據主合約的地址與合約本身的 Nonce 來算出子合約的地址。在 EIP-1014 中,提出了另外一個指令 create2,接受的參數是一個 salt 和 init code(建立合約的 Byte Code)。這個指令會透過 keccak256 雜湊,混和參數和主合約的地址來算出子合約地址。
可以留意到,salt 和 init code 都是可控的,主合約地址是固定的,因此就讓子合約地址是可控制的(當然不是說想要產生在哪裡就在哪裡)。在 create 中,Nonce 是漸次增加的,所以無法重複,並且若要控制到特定 Nonce 需要發起多筆交易。
但是當再次佈署到相同地址時,EIP-684 說明若該地址 Nonce 不為零或者存在 Byte Code 時將直接拋出錯誤,因此若要佈署到同一個位置,就必須利用 Self Destruct 來抹去 Nonce 和 Byte Code。
為什麼要 EIP-1014
EIP-1014 在起初是基於 State Channel 的需求,主要是因為某些狀況下可能還沒有要和合約做互動,但需要先知道合約地址。因此只要是需要先知道地址,但沒有要立即使用的合約就十分適合通過這個指令來建立。
例如對於交易所來說,替所有要入金的人建立私鑰有管理上的問題,若透過智能合約則相對有彈性,但卻不是所有申請地址的人都真的會入金,此時就適合利用這個指令先行取得地址,當真的有入金時再佈署合約。
如何使用 EIP-1014
除了直接寫 Opcode 以外,Solidity 0.6.2 加入了利用 create2 建立合約的語法。使用方式是 new Contract{salt: someByte}(...args),其中 new Contract(...args) 就是傳統的佈署方式,而 someByte 是一個 bytes32。
資安疑慮
回到開頭,Etherscan 之所以會標記 Reinit 則是因為可能有資安的疑慮。回顧地址產生的過程,兩個參數都沒有限制條件,因此碰撞的可能也是存在的。如果不肖人士先佈署一個正常的合約,接著通過 Self Destruct 刪除後再佈署假的合約,就可能讓沒注意到的使用者上當。
但或許因為碰撞的機會太低,所以並不太構成問題。而若真的要從使用者的角度防範,可以通過檢查合約有沒有 Self Destruct、Delegate Call、Call Code 指令(如果沒有的話無法刪除合約,再次 create2 時就會被 revert)來避免。
2021/4/23 補充
後來看了幾個討論,也想了一下,資安的疑慮應該遠不只上面這麼簡單。
例如一個宣稱鎖定 ERC-20 代幣的合約,雖然使用者可以檢閱程式碼,並確認其中解鎖 function unlock() 必須在 uint256 block 之後才能執行,並且 block 是無法變更的,但攻擊者可能透過上述方法來消除 block 狀態,進而提前執行 unlock。
參考資料
https://consensys.net/diligence/blog/2019/02/smart-contract-security-newsletter-16-create2-faq/
https://www.chainnews.com/zh-hant/articles/803272341363.htm
如有錯誤敬請指正,原文載於:https://limaois.me/archives/265
EIP-1014 產生可控的智能合約地址 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
solidity意思 在 雷司紀的小道投資 Facebook 的最讚貼文
說個小故事。
-
我是在讀大二~大三(資工系)時知道比特幣的。具體細節也忘記了,只記得當時暗網「絲路」被 FBI 查禁後沒多久,裡面流通的交易貨幣「比特幣」開始漸為人知。
至今印象最深刻的一件事,發生是在某堂課的時候。
朋友因為老師講課太無聊,於是拿起手機開始分心。突然間,他把手機螢幕湊過來,給我看當時比特幣的價格。
因為同為資工人,平常對於這類技術就有討論,因此我們也都會關注相關消息。
我還記得,當時我們倆都笑了出來,搖頭直說瘋了。
那時一顆比特幣的價格 = 200-500 台幣左右。
-
等我上了研究所(差不多 2016 的時候),「區塊鏈」這個概念已經在資工圈內較為人知。
與此同時,還掀起了一股不亞於掏金熱的「挖礦熱」。
當時在各大論壇(Mobile01、PTT),都有人分享如何利用 CPU/GPU 進行挖礦,並且吸引不少人投入。
還記得看過最誇張的一則新聞:「有人包下一台飛機裝滿 Nvidia 的顯卡,準備載回國來賣/建立礦場」
我自己的話,則是一邊研究 AI,一邊投入體驗看看挖礦這件事。
當年用筆電的 CPU 就可以挖礦了,記得平均一天的收益約 5 美金。
雖然不多,但電腦擺著就可以挖礦,整體來說還滿有趣的。
當然之後隨著越來越多人投入,整體挖礦難度變高,CPU 挖礦已經變得毫無效率了。
除此之外,我也有玩 FreeBitco.in。
有經驗的人就會知道,這是一個老牌的水龍頭網站,靠著點點點來賺比特幣,並且後來還在 dcard 上寫了一系列「教你不耗電賺比特幣」的文章,可以說是年少輕狂😆
👉https://www.dcard.tw/f/money/p/227033709
-
2018 年出社會後,成功討到一份 AI 工程師的工作,也同時開始經營「雷司紀的小道投資」。
早期在 Medium 上寫作的時候,也以投資的觀點,寫了一些跟區塊鏈/加密貨幣有關的文章👉https://rayskyinvest.org.in/加密貨幣
這個時候正值Likecoin / Self tokens(聖人大盜)的創業,幣圈/鏈圈內的各種應用也百花盛開,因此便在下班之餘開始研究區塊鏈--
像是寫 Solidity + Truffle + Ganache 程式,成功在以太坊測試鏈上部署開發的加密貨幣;
把比特幣、以太坊的白皮書/黃皮書讀過一遍,並且找一些《區塊鏈資安攻擊》的論文來研究;
到最後(2019年底),還出任某間區塊鏈新創公司的BD。
-
對於加密貨幣/區塊鏈,我一直以來都抱持的好奇的心態去接觸。
當然以投資的觀點來看,有的人會嗤之以鼻,認為這就是炒作起來的「投機商品」。但你知道嗎?以嚴格的定義來說,期貨、選擇權、差價合約...等等,也是屬於「投機商品」,在市場上皆為零和遊戲。
我不會明確告訴你:「加密貨幣非常值得投資!」或是「加密貨幣很不值得投資!」,因為那沒有意義。
因為在投資理財這條路上,永遠有一條最多人容易犯、但也最重要的金律:「不要投資你不懂的東西。」
如果你非常熟悉某一樣東西,那投資/投機這項「資產」就不是什麼大問題,就如同《決戰 21 點》一樣,雖然賭博是投機,但主角們找到了賺錢的方式,那就是成功。
同理,那一批在 2012-2015 年看見比特幣潛力並投資的人,有的翻轉人生、有的登上富比世雜誌封面。
因此在市場上,採取什麼樣的投資手段從來就無關緊要;你所採取的手段是否能成功「獲利」,這才是真正重要的事。
-
故事說完了。
如果你看到這裡,表示你是個很有耐心的人,同時你現在應該真的滿閒的(?)......開玩笑的。
不過我還是很感謝你願意看到最後,因此為了獎勵你的耐心跟支持,這邊將會提供一項大回饋🎁(這是僅限看完整篇文章的人喔!)
最近由於幣安(全球最大加密貨幣交易所)找上門來,最後決定雙方展開合作,因此這邊就先提供一項跟幣安有關的回饋:
【幣安推薦碼:20% 回饋反佣(一般最多10%)】
🎁 https://rayskyinvest.org.in/幣安註冊優惠-20反佣
(這個推薦碼期限只到 6/4 24:00,之後會換回原本的)
-
對幣圈/有在使用幣安的人來說,應該知道這是多大的讓利,因為一般正常的推薦碼只提供最多 10% 的反佣。
如果是對加密貨幣不熟的人也不用擔心,所謂的反佣 20% = 你未來在幣安上的交易手續費都只要 8 折。(20%折扣的意思)
-
這項回饋僅限這篇貼文,為期三天,
等期限過後,未來將不會再開放。
因此我的建議是,可以先趁這個機會把幣安帳戶註冊起來放,註冊並不等於投資,只是先搶一個優惠帳戶,就算永遠放著也無妨。
🎁 https://rayskyinvest.org.in/幣安註冊優惠-20反佣
之後我也會開始寫一些區塊鏈、加密貨幣的文章,像是知識上的內容、投資上的細節風險....都會包含在內。
未來區塊鏈/加密貨幣的知識討論,也會集中在此社團:
♣ 台灣加密貨幣討論區-區塊鏈、加密貨幣、比特幣、以太幣、Ripple、TRON、幣安加密貨幣合約、幣安寶
-
即便永遠不會投資加密貨幣,但了解學習現在正在發展的區塊鏈技術、加密貨幣商業市場運作....具備這樣的知識,我認為並不是損失。
畢竟現在連各國政府、Facebook、Line...等等,也都開始注重這項技術了,不是嗎?
「最重要的投資並非金錢,而是投資你自己!」
-
https://www.facebook.com/BinanceChinese/posts/1895102983957648