📜 [專欄新文章] [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.
👏 歡迎轉載分享鼓掌
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
「python 演算法 練習」的推薦目錄:
- 關於python 演算法 練習 在 Taipei Ethereum Meetup Facebook 的最佳貼文
- 關於python 演算法 練習 在 軟體開發學習資訊分享 Facebook 的最讚貼文
- 關於python 演算法 練習 在 軟體開發學習資訊分享 Facebook 的精選貼文
- 關於python 演算法 練習 在 コバにゃんチャンネル Youtube 的最讚貼文
- 關於python 演算法 練習 在 大象中醫 Youtube 的精選貼文
- 關於python 演算法 練習 在 大象中醫 Youtube 的最佳貼文
- 關於python 演算法 練習 在 [問題] 數據結構與演算法的學習與coding習慣雜問- 看板Python 的評價
- 關於python 演算法 練習 在 Python 資料結構×演算法刷題鍛鍊班 - YouTube 的評價
- 關於python 演算法 練習 在 這兩天翻完《寫程式前就該懂的演算法》 的評價
- 關於python 演算法 練習 在 [Python] 練習通用的機器學習法 的評價
- 關於python 演算法 練習 在 Python 程式設計技巧(APCS檢測): 教材影音(Youtube) 的評價
- 關於python 演算法 練習 在 資料結構與演算法/leetcode/lintcode題解 的評價
- 關於python 演算法 練習 在 演算法python的問題包括PTT、Dcard、Mobile01,我們都能 ... 的評價
- 關於python 演算法 練習 在 演算法python的問題包括PTT、Dcard、Mobile01,我們都能 ... 的評價
- 關於python 演算法 練習 在 演算法python的問題包括PTT、Dcard、Mobile01,我們都能 ... 的評價
python 演算法 練習 在 軟體開發學習資訊分享 Facebook 的最讚貼文
🔥udemy cyber monday ,課程最低價 NT 330 元起
課程說明
世界上所有電腦科學、資訊工程、資料管理主修的學生,都在學習電腦科學!
隨著電腦科學的飛速發展,離散數學的重要性則日益彰顯。它為許多資訊學課程提供了數學基礎,包括資料結構、演算法、資料庫理論、形式語言與作業系統等。如果沒有離散數學的相關數學基礎,學生在學習上述課程中,便會遇到較多的困難。
離散數學包含邏輯、證明、遞迴關係、演算法、數論與密碼學、演算法分析、圖形理論、路徑選擇、機率、排列組合、以及其他重要的程式開發演算法! 這堂課會深入淺出探討這些概念,並且用 Python 或JavaScript (二擇一) 來做演算法練習!
在學習這堂課之後,你將能夠:
1. 學會推導邏輯與驗證程式碼邏輯正確性。
2. 用邏輯來證明數學理論,做為資料科學的的重要演算法基礎。
3. 了解遞迴演算法與遞迴數列關係,準備好你自己回答Coding Interview面試中的問題。
4. 能夠用程式碼表現出「歐幾里得演算法」、「歐拉函數」、「河內塔問題」、「最小公倍數演算法」、「斐波那契數列」、「線性遞迴關係式」、還有其他重要的演算法!
5. 學習數論與集合理論,作為學習質數與密碼學的重要演算法基礎。
6. 學習基本圖形理論,判斷圖形資料結構。
7. 學會圖形演算法,例如「Floyd-Warshall 演算法 (Dynamic Programming)」、「Dijkstra’s Algorithm」、「Depth First Traversal」、「Breadth First Traversal」。
8. 計算離散架構中的排列組合,並了解機率計算方法。
9. 能夠判斷與分析不同的演算法。
10. 用 Python 或 JavaScript 來實現離散數學的演算法與架構!
https://softnshare.com/discrete-math-with-python-and-javascript/
python 演算法 練習 在 軟體開發學習資訊分享 Facebook 的精選貼文
今天 udemy 有雙 11 特價,最低價 NT330 起
--課程已於 2020 年 11 月更新--
udemy 最暢銷的機器學習入門課程,全球有 13 萬多人參加
課程介紹
有興趣機器學習領域?那麼這這堂課是為你準備的!
本課程是由兩個專業資料科學家所設計,所以我們就可以分享我們的知識,並幫助你以簡單的方式學習複雜的理論,演算法和程式庫。
我們將帶你一步一步進入機器學習的世界。隨著每一個教程中,將發展新的技能,提高你對於這一具有挑戰性又利潤豐厚的資料科學子領域的理解
本課程是以一個有趣和令人興奮的方式架構,同時,我們將深入了解機器學習。在這個課程中,你將了解以下的演算法:
Linear Regression
Multiple Linear Regression
K-Means Clustering
Hierarchical Clustering
K-Nearest Neighbour
Decision Trees
Random Forest
此外,該課程包含有生動的實例實踐練習。你不僅將學習到理論,但你也將得動手做實踐建立自己的模型
課程紅利,這課程包括 R 和 Python 程式碼樣板,你可以下載並在自己的專案中使用
https://softnshare.com/machinelearning/
python 演算法 練習 在 コバにゃんチャンネル Youtube 的最讚貼文
python 演算法 練習 在 大象中醫 Youtube 的精選貼文
python 演算法 練習 在 大象中醫 Youtube 的最佳貼文
python 演算法 練習 在 Python 資料結構×演算法刷題鍛鍊班 - YouTube 的推薦與評價
... 以及範例、面試題、延伸題型、 練習 題等總計234 個題目,盡可能增進讀者 ... Python 資料結構× 演算法 刷題鍛鍊班:234 題帶你突破Coding 面試的難關. ... <看更多>
python 演算法 練習 在 這兩天翻完《寫程式前就該懂的演算法》 的推薦與評價
用的程式碼是Python,但程式的部分很少。 練習的部分比較像是問讀者覺得這個情境適合該演算法嗎?下面哪些敘述是對的?大多是問基本觀念,沒什麼實際 ... ... <看更多>
python 演算法 練習 在 [問題] 數據結構與演算法的學習與coding習慣雜問- 看板Python 的推薦與評價
前言(廢話):
各位安安,
小弟之前有接觸過一咪咪autohotkey,因為最近找到了coding的樂趣,
開始透過youtube學習python,大概學到了用class建立對象與方法,
但一些很簡單的內置函數也都是看到別人用,才會知道有這東西。
在學習的過程中,我知道了leetcode這玩意,並在解題思路的幫助下,解出了第一題。
但到了第二題才發現,leetcode的入場門票是需要會數據結構與演算法,
這是我發文的主要原因。
以下問題:
1.數據結構與演算法資源推薦(中文偏好)
目前自己找到的資源,要嘛跟講得天書一樣難,
要嘛聽懂的卻又沒有code給我看實際到底長怎樣,有點難過
2.加强基礎的練習資源推薦
幫助手冊能教我如何使用,但如何運用或許就要透過刷題來學習了,
我知道leetcode和zerojudege,前者還不是我目前能面對的,
後者我也正在刷,只是想知道除了這些還有沒有其他推薦。
不限於刷題資源,教學文章、影片也可以(我覺得可以挑戰一下英文)
3.如何避免迴圈内的迴圈(for中for的改寫)
有時候會在for循環中再加入for循環,如果是一個兩個看起來還好,
但如果多起來的話,感覺邏輯上就會變得難釐清。
如果以下面的code來説的話),要如何避開或改善這個問題。
4.其他改善(同樣的code)
這部分像是註解、變數命名等等,因為沒參與過別人的開源項目,
也不知道怎麼做才是對其他開發人員友善,但又想早點培養習慣,
想來想去好像獻醜是最直接有效的改善方法,
如果在能力範圍內做得不夠好的話,希望各位能夠提點一下。
問完了,謝謝各位
這部分是code:
# 給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標
值 target 的那 兩個 整數,並返回它們的數組下標。
# 你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案裡不能重複出
現。
# 你可以按任意順序返回答案。
class Solution:
def twoSum(self, nums: list[int], target: int) -> list[int]:
"""
功能:
從列表中找尋二者之和與目標值相同的數,返回他們在列表中的位置
------------
參數:
nums:
數字所在的列表
target:
目標值
------------
變數:
numsLen:
列表nums的長度: len(nums)
num1Locat:
num1的位置: in range(numsLen)
num1:
第一個找到的數: nums[num1Locat]
num2Locat:
num2的位置: in range(num1Locat + 1, numsLen)
num2:
第二個找到的數: nums[num2Locat]
------------
返回值:
result:
結果: [num1Locat, num2Locat]
"""
numsLen = len(nums)
for num1Locat in range(numsLen):
num1 = nums[num1Locat]
for num2Locat in range(num1Locat + 1, numsLen):
num2 = nums[num2Locat]
if num1 + num2 == target:
result = [num1Locat, num2Locat]
return result
# testNums = [1, 3, 6, 7, 8, 11]
# testTarget = 19
# test = Solution()
# testResult = test.twoSum(testNums, testTarget)
# print(testResult)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.246.44.39 (澳門)
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1632659900.A.BCA.html
層的語言學習,我會好好考慮的
※ 編輯: souhang (60.246.44.39 澳門), 09/26/2021 22:37:06
※ 編輯: souhang (60.246.44.39 澳門), 09/26/2021 22:40:30
... <看更多>