
原文鏈接:https://www.onflow.org/post/flow-blockchain-cadence-programming-language-resources-assets
翻譯:Jihui Zheng(來自Flow開發社區)
前言
Flow 是一個新的區塊鏈,最初由 CryptoKitties 和 NBA Top Shot 的母公司 Dapper Labs 設計和開發,在接下來的一系列文章中,我們將從技術角度探討 Flow 鏈的各個基礎組件,
-
Cadence,一種使智能合約開發程序更快、更安全的新編程語言
-
Flow Client Library (FCL),它類似于以太坊上的 Web3.js,但更加簡潔通用
-
Flow 多節點架構,面向未來的主流擴展架構(即將推出)
隨著加密貨幣的大規模采用,區塊鏈應用程式上承載的價值在不斷增長, 但用來處理這些鏈上數字資產的技術工具仍不成熟,盡管有高成本且耗時的安全審計,但鏈上智能合約通常無法提供長期可持續的安全模型,一個可以安全且公平地處理鏈上存盤價值的模型,開發人員通常需要從頭創建一些工具才能實作一些基本的安全功能,直到現在,還缺乏一種能夠完全安全地處理數字資產的編程語言,
PROFILE
進入Cadence的世界
Cadence 是第一種專門用于鏈上數字資產所有權的編程語言,例如區塊鏈上的藝術品、收藏品或加密貨幣,在 Cadence 中,數字資產是一等公民,在可以很好的控制數字資產的訪問的同時,做到了防止數字資產意外丟失或惡意復制的可能性,
Cadence 使用一種獨特的數字資產資料模型:資源,資源使數字資產的創建、傳輸和存盤更容易、更安全,與基于權利屬性的的資源訪問控制策略相結合,讓這門編程語言的學習曲線更平緩、更容易被審計,并且比任何當前的其他替代方案的開發效率都更高,
基于 Flow 以用戶為中心的賬戶模型,Cadence 引入了數字資產的直接所有權模型,可實作更高程度的去中心化和抗攻擊性,用戶的數字資產被安全地存盤在用戶的帳戶中,
Cadence 在撰寫時考慮到了消費級用例,在其堅實的科學研究基礎之上構建了可擴展性,作為 NBA Top Shot 的支柱,它已經過大規模的實戰測驗,這是有史以來增長最快的區塊鏈應用程式之一,注冊人數超過一百萬,
除此之外,每天都有成千上萬的用戶與越來越多的 Cadence 驅動的應用程式(如市場、游戲或交易所)進行互動,證明了其耐用性和可靠性,這些好處每天都會吸引新的開發人員,使他們能夠享受 Cadence 改進的安全性、生產力和可讀性帶來的好處,
Diem (Move) 等行業的其他大玩家開始利用資源的力量這一事實暗示下一代智能合約編程可能會開啟面向資源的語言時代,而 Cadence 是第一個準備就緒的面向資源的語言今天在區塊鏈上使用
數字資產應對的挑戰
讓區塊鏈技術開辟一個充滿可能性的新世界的最大創新是實作原生數字價值,在區塊鏈上,代碼不僅僅是對某種外部資產的映射,而是這些鏈上的代碼本身就是資產,區塊鏈上的資料不會輕易丟失、無法被任意復制和篡改,這些鏈上的資料自身是有價值的,是用戶可以去持有的,無論是 NFT、收藏品、加密貨幣還是治理代幣,它們都是這一類新興數字資產類別的一部分,
盡管這種資產演變的前景令人興奮,但令人擔憂的是,目前用來管理這些數字資產的工具依然處于原始社會:像 Solidity 這樣的智能合約編程語言處理數字資產及其可能帶來的巨大價值和處理任何其他可變的資料結構沒有任何區別,同時這些數字資產又是存盤在一個中央賬本中,下面用一些例子來說明這些編程語言在處理數字資產方面所面臨的巨大風險和挑戰,
■ 案例1: 中央賬本創建蜜罐陷阱
以下代碼片段展示了使用 Solidity來簡易的實作同質化代筆,這個受 ERC-20標準啟發的同質化代幣智能合約包含兩個功能:允許生成新代幣的鑄幣功能,以及允許將資金轉移到不同地址的發送功能,
contract AnyCoin {mapping (address => uint) public balance;function mint(address receiver, uint amount) {balance[receiver] += amount;}function send(address receiver, uint amount) {balance[msg.sender] -= amount;balance[receiver] += amount;}}
關于數字資產的關鍵問題是:每個人的代幣持有量在哪里以及如何存盤?該片段顯示,這些代幣持有量由合約頂部的資料結構表示:余額映射,這種資料結構是一個中央賬本,將每個持有人的地址映射到特定的代幣余額,有效地將所有數字資產存盤在智能合約本身中,
mapping(address => uint) public balance;
這些中央映射通常負責一次處理數十億美元的等值價值,正如看一眼以太坊上最受歡迎的 ERC-20 代幣合約所示,以如此集中的方式存盤這些大量的數字資產為黑客創建了中央蜜罐,不幸的是,數百萬美元的黑客已經成為許多團隊和用戶的悲慘現實:僅在 2020 年,整個加密犯罪造成的總價值就達到了 19 億美元,其中黑客的總價值為 5.13 億美元[來源](https://www.securitymagazine.com/articles/94627-19b-in-crypto-currency-stolen-by-hackers-last-year),但這種集中存盤只是 Solidity 等語言存在的問題中的一個,
■ 案例2: 數字資產需要一個更靈活的資料模型
因為Solidity中的映射是可變的資料結構,它沒有強加任何處理數字資產的約束規則,所以沒有什么可以阻止開發人員錯誤地撰寫惡意代碼,為了說明這一點,讓我們看一下代幣合約的另一個實作,
contract BugCoin {mapping (address => uint) public balance;function mint(address receiver, uint amount) {balance[receiver] += amount;}function send(address receiver, uint amount) {balance[msg.sender] -= amount;// balance[receiver] += amount;}}
在這個例子中,發送函式中被注釋了一行必不可少的代碼:BugCoin 的轉移會導致發送方的余額被扣除 ,但接收方的余額永遠不會增加,由于缺少一行代碼,該合約的任何轉移的的價值都將永久丟失,令人震驚的是,沒有什么能阻止以太坊上的合約發生類似的情況,由于Solidity編譯器不會對這類語意錯誤做檢查,所以這段代碼可以毫無障礙地部署在測驗網甚至主網上,在每筆轉移資產的交易中吞噬轉移的代筆并讓用戶的權益受損,
智能合約的不可隨意修改的性質及其上承載的數額巨大的資產給區塊鏈開發人員帶來了巨大的責任和壓力,正如上面兩個例子所展示的,現有智能合約編程語言的局限性讓程式員的開發程序例外的艱難,事實上,還有更多底層代碼需要處理,比如管理數值上下溢位的問題,或者在不同貨幣單位之間進行轉換,這在一個每天需要處理大量資產的地方,這些問題會造成不少麻煩,這就產生了能夠有一種可以安全地處理數字資產的智能合約編程語言的需求,
> 認識 Cadence,這是為數字資產而設計的語言,
Cadence: 使用面向資源范式來解決數字資產安全問題
Cadence 通過為數字資產引入一種新的自定義資料模型:資源,來消除了現有智能合約編程語言所帶來的大部分風險,受線性型別的啟發,資源模型能讓開發人員提前發現運行時錯誤,在開發期間就可以即使發現并且做出代碼修改來規避,
開發人員在使用Cadence的時候可以很清楚的知道自己是否在處理資源型別資料,因為資源的創建或傳輸需要使用移動運算子 (<-),而資源資料的型別會使用符號 (@) 來標注說明,這些直觀的符號可以防止開發者錯誤地使用Cadence,并且讓代碼更易于閱讀、撰寫、學習和維護,
但是 Cadence 的資源模型并不僅僅只是現有資料模型的語法糖,而是在操作資產時會執行嚴格的規則約束,可以避免因為開發人員的錯誤而導致數字資產丟失,資源模型規定一個資源只能在一個確定的時間存在于一個確定的地方,使其不可以被惡意復制或意外洗掉,并提高所有涉及數字資產操作的安全性,
還記得我們在 BugCoin 合約中的制造的惡意發送功能嗎?在 Cadence 中,這種代碼從一開始就不會被編譯,這是因為 Cadence 中同質化代幣合約的代幣持有量是通過嚴格的規則約束的資源模型來實作的,每個代幣持有者都有自己的保險庫資源,用于在其賬戶中持有該代幣,并且該資源會提供提款和存款方法,
pub resource Vault: Provider, Receiver, Balance {// pub = publicly readable, internally writablepub var balance: UFix64init(balance: UFix64) {self.balance = balance}pub fun withdraw(amount: UFix64): @Vault {self.balance = self.balance - amountreturn <-create Vault(balance: amount)}pub fun deposit(from: @Vault) {self.balance = self.balance + from.balancedestroy from}}
資產在進行轉移的時候永遠是安全的,因為交易金額在被提款后會被放入臨時金庫資源中,這個臨時金庫然后可以存入其他人的存入功能,或被顯式洗掉,但與 Solidity 示例中的 send 函式不同,代幣是不可能會意外丟失的,因為如果有資源沒有被使用,Cadence編譯器將拋出錯誤,
transaction {var temporaryVault: @ExampleToken.Vaultprepare(...) {...self.temporaryVault <- myVault.withdraw(amount: 10.0)}execute {...// Type-check will not pass if temporaryVault is not explicitly used!receiverRef.deposit(from: <-self.temporaryVault)}post {...}}
這個例子說明了這種資料模型在安全性方面的兩個額外優勢:
-
首先,如果接收者沒有代幣保險庫 - 無論是因為地址錯誤還是該賬戶不想接收這些型別的代幣 - 交易將會被回滾,不會再有代幣因為發送地址拼寫錯誤而丟失!
-
其次,在事務和函式中包含前置和后置條件使得開發人員可以很容易實作對正確結果的斷言檢查,因此開發人員和用戶可以對其基于區塊鏈的互動的正確性充滿信心,
除了使對數字資產操作的開發更具可讀性和安全性之外,資源模型還允許使用組合和嵌套等高級用例,如果要對資源進行分組,您只需創建一個集合資源作為單個資源的包裝器,這使得開發人員很容易實作資源的批量轉移(多個資源同時轉移),加快開發程序,讓用戶更快、更安全地進行價值傳遞,
所有權模型: 讓資產呆在它們本應該呆的地方
Cadence 的另一個巨大優勢在于它與 Flow 協議的深度集成:資源存盤在它們所屬的地方,直接存盤在用戶的帳戶中,
let myCoolAsset <- create CoolAsset()account.save<@CoolAsset>(<-myAsset, to: /storage/myCoolAsset)
這種以人為本的賬戶模型對數字資產有更直接的所有權,并且與Solidity等語言提供的中央賬本方法相比具有多種優勢:
■更去中心化更安全
> 不同于Solidity等語言會將數字資產存盤在智能合約中會造成單點事故,Cadence永遠都將數字資產存盤在用戶自己的賬戶中,這顯著提高了安全性,因為它最大限度地減少和分散了大規模攻擊的載體,通過分散潛在攻擊目標使得攻擊成本足夠高使得攻擊行為性價比變低,
■ 提高效率
> 使用中央賬本模型很難完整地收集一個特定用戶擁有的所有資產的資訊,因為這需要對用戶可能持有資產的每一個智能合約進行查詢互動,使用 Flow,用戶的所有數字資產都在他們的賬戶中,使這些資產更易于查詢和互動,
■ 更容易使用
> 不僅僅是開發人員,Flow上的用戶也都會發現這種以人為中心的帳戶模型更容易去理解,因為它避免了不必要的復雜性并建立在大多數人的直覺模型上 ——顯然中央帳本模型違反直覺且難以理解,
但最重要的是,Flow 直觀的賬戶模型為基于權利屬性的訪問控制奠定了基礎,這是 Cadence 以細粒度和高度可讀的方式來管理資源訪問的方式,
■ 權利屬性: 易于理解的資源訪問權限控制
權利屬性類似于權限:它們控制用戶只可以對資源執行給定的操作,如果你想呼叫一個資源的方法,你需要有一個有效的權利屬性,
權利屬性是通往資源的門戶,與 REST API 一樣,權利屬性也有路徑,如果該路徑存在于帳戶的公共域中,則任何人都可以獲得該權利屬性;私有域中的權利屬性只能由該帳戶的所有者訪問,
無論是在公共域還是私有域,權利屬性總是鏈接到一個目標資源,該目標可以是整個資源,也可以只是這個資源所提供所有方法的一個子集,對于后者,介面可以作為權利屬性鏈接的目標,這就是權利屬性如何提供給用戶易讀且細粒度的資源訪問控制,
要與資源進行互動,您首先必須在借用其底層資源之前獲得特定的權利屬性,這可以在任何事務中輕松完成,
account.getCapability<...>(/public/MyCapability).borrow()
與Solidity中嚴重依賴檢查 `msg.sender` 值的基于訪問串列的模型相反,權利屬性允許靈活的資源訪問控制模型,允許以簡單,可讀和安全的方式授予、修改和撤銷對資源甚至部分資源的訪問的權限,
總而言之,資源模型、權利屬性和 Flow 的帳戶模型使 Cadence 成為一種學習速度更快、更易于審計且更高效的語言,讓開發人員可以在確保用戶資產安全的同時更快地構建應用程式,由于這些優勢,越來越多的團隊正在使用這種面向資源范式的模式來開發鏈上應用,
行業覺醒:開啟面向資源編程的鏈上開發時代
“當舊的思維模式或者做事方式被一種完全不同的方式所取代時,一種非常重要且全新的范式轉變就出現了”社會學家托馬斯·庫恩在他的著作《科學革命的結構》一書中簡潔地概述了這一點,
對于技術革命來說也是如此:新的挑戰引發了新的解決方案,隨著軟體開發逐漸進入新的領域,如何構建軟體的“正確方法”一致在發生變化 — 就像 SQL 是解決原子事務的答案一樣,對用戶圖形界面開發的需求導致了 Java 等面向物件語言的出現,
我們今天面臨的挑戰是如何在區塊鏈上安全地處理數以億記的資產,Cadence 提出的解決方案是整個行業在逐漸靠攏的新范式:面向資源編程,
目前位置,很多業內的大玩家都已經開始實作了面向資源范式的編程語言,比如 Diem 團隊開發了他們的智能合約語言 Move,因為資源導向范式的優點很容易被理解,所以會有越來越多的開發者和團隊會遵循這種開發范式,
Cadence 是第一個使用面向資源范式的智能合約編程語言,在安全性、可讀性和可組合性方面樹立了新的標準,由于這些優于現有其他智能合約編程語言的優勢,Cadence很有可能會成為下一代智能合約的通用語言,
您可以從今天開始使用我們為開發者量身定制的學習資源來學習 Cadence,成為這種智能合約編程新范式的一份子,這些學習資源都是由 Flow 和 Cadence 背后的核心團隊所撰寫的,
-
Cadence介紹:https://docs.onflow.org/cadence/
-
Cadence系列教程:https://docs.onflow.org/cadence/tutorial/01-first-steps/
-
Cadence語言手冊:https://docs.onflow.org/cadence/language/
-
Cadence playground:https://play.onflow.org/local?type=account&id=LOCAL-account-0
結論
希望這些資訊能對你有所幫助!一如既往的,有任何問題或者建議,都通過下面的這些渠道聯系我們!
Flow Discord: https://discord.gg/flow
Flow Forum: https://forum.onflow.org
Flow Github: https://github.com/onflow/flow
下周見!
👋
END
什么是Flow福洛鏈?
Flow福洛鏈是一個快速,去中心化,且對開發者友好的區塊鏈,旨在為新一代游戲、娛樂應用程式提供動力的數字資產的基礎,Flow是唯一一個由始至終為消費者提供出色體驗的Layer-1區塊鏈團隊,其團隊創造的dApp包括:CryptoKitties、Dapper Wallets、NBA Top shot,
CrytoKitties于2017年推出時便快速成為加密市場最受歡迎的dApp,因其成功而導致以太坊堵塞,在Flow上運營的NBA Top shot也已成為增長最快的dApp,在公開發布后的6個月創造了7億美金銷量,正因為Flow公鏈的可擴展性和消費者友好的體驗,讓這一切成為可能,目前有300多個專案正在Flow鏈上籌備中,我們期待看到一個偉大的生態系統蓬勃發展,
關于Dapper Labs
Dapper Labs是一家位于加拿大的全球頂尖區塊鏈服務商,在2017 年年底通過CryptoKitties收藏游戲成功進如?戶視野,并且因為加密貓的爆?導致以太坊擁堵,從而推出Flow公鏈以及全新的開發語言—— Cadence,旨在吸引更多的開發者在Flow 上開發應?,
Flow的合作伙伴們:








我們歡迎越來越多的小伙伴加入Flow星球,為星球增添色彩!
Flow 官網:https://zh.onflow.org/
Flow 論壇: https://forum.onflow.org/
Flow Discord:
https://discord.com/invite/flow
Flow CN Telegram: https://t.me/flow_zh
Flow B站:https://space.bilibili.com/1002168058
Flow 微博:
https://weibo.com/7610419699
Flow CSDN:
https://blog.csdn.net/weixin_57551966?spm=1010.2135.3001.5343

掃碼添加Flow官方賬號微信號,加入Flow生態群
微信號 : FlowChainOfficial
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/292252.html
標籤:區塊鏈
上一篇:透過DeFi看算力平臺的價值
下一篇:ETH有著更高的資本效率
