# Cadence言語とは

* * *

Go言語で書かれたスマートコントラクト用言語です。この言語では変数、Collection型(配列・ディクショナリ)、Struct(構造体)、リソースの4種類しか覚える事はありません。しかし、スマートコントラクトをデプロイしておけば、お金の管理が出来るだけでなく、その情報を更新したり参照することで、無人野菜販売所やライドシェアの金融取引システム等が数十行で書けます。また、ゲーム向けのランキングシステムなんかも数十行で書けます。

* * *

Cadence言語はよくResource Oriented (リソース指向)言語と呼ばれます。リソースを持っている人はそのリソースの内部メソッドを実行することができ、リソースの持ち主はそのリソースをブロックチェーン内部のストレージに保存します。

* * *

リソース以外 (変数 / 配列・ディクショナリ / 構造体) は物理的に移動しないので特定のアカウントストレージに保存することはしません。そして誰でも共通にアクセスすることができます。リソースは基本的にその所有者しか内部メソッドを呼び出せないことからスマートコントラクトの中心的役割を担うことになり、所有者のストレージに保管されます。

* * *

スマートコントラクトを見るとよく以下のような形が見られます。

```swift
contract A {

  access(all) resource  B {
    access(all) fun setRankingAndDeliverPrize() {
    }
  }

  init {
    self.account.storage.save(<- new B(), to: /storage/B)
  }
}
```

スマートコントラクトのデプロイ者はスマートコントラクトの中では`self.account`と表現されます。そして`init`はスマートコントラクトのデプロイ時の一回しか実行されないため、システム上重要なリソースをひとつしか生成したくない場合にこのようなコードが書かれます。上記だとBリソースはスマートコントラクトのデプロイ者だけが所有できることになります。そしてそのアカウントだけがスマートコントラクトのsetRankingAndDeliverPrize メソッドを実行できます。このブロックチェーン(Flow)では予約実行が可能なので、一週間おきにランキングを再計算し、上位3チームに賞金を配布する、といった公正な自動運用が可能となります。

* * *

### Regarding the deep technical relationship between the Flow team (Dapper Labs) and the original Diem/Libra team at Meta:

### Move & Cadence Shared Roots

While Flow and Libra/Diem were developed in parallel, the Dapper Labs team and Meta's crypto research team collaborated extensively through technical working groups in the 2018–2020 era.

Both teams shared the same fundamental thesis: **existing blockchains (like Ethereum's EVM) were structurally unsafe and poorly suited for mainstream consumer applications and NFTs.**

1.  **Resource-Oriented Architecture:** Meta created the **Move** language for Libra, while Dapper Labs created **Cadence** for Flow. Both languages adopted the "Resource-Oriented Programming" paradigm—a concept originally inspired by Rust's linear type system where digital assets are treated as physical objects in memory that cannot be duplicated, implicit-dropped, or re-entered.
    
2.  **Technical Exchange:** Engineers from Dapper Labs and Meta regularly cross-pollinated ideas regarding resource safety, access control capabilities, and account abstractions during the initial design phases of both languages.
    

### Why Instagram Supported Flow at NFT Feature Launch

When Meta launched its native NFT and digital collectibles feature on Instagram in May 2022, **Flow was chosen as one of the primary launch blockchains** alongside Ethereum and Polygon.

This choice was directly tied to those technical roots and operational history:

*   **Mass-Consumer Scaling:** Flow was designed specifically for high-throughput consumer apps (like *NBA Top Shot*), making it a natural fit for Instagram's massive user base without exposing users to high gas fees or network congestion.
    
*   **Shared Developer Philosophy:** Because Meta's internal crypto teams were already intimately familiar with Cadence's resource model and Flow's account architecture through their earlier Libra-era working groups, integrating Flow into Instagram's backend infrastructure was smooth and architecturally aligned with Meta's standards.
    

* * *

Flow TeamはMeta（メタ）のLibra (後年、Diemと改称) 財団とワーキンググループを頻繁に開催していました。それは共通の既存ブロックチェーンに対する問題意識があったからでした。ただ、NFTブームを引き起こしたのはMetaの開発チームではなくFlowチームの方でした。人間工学的にRustより優れたGo言語で書かれていたCadenceスマートコントラクト言語は書くのが簡単で覚えやすく、プログラムを書くのが楽しい、という特徴があります。

* * *

### Why Resource-Oriented Programming Prevents Exploits at Compile Time

Ethereum（EVM）などの従来のスマートコントラクトでは、トークンを送金する際は、コントラクト内の残高テーブルを更新する処理（`balances[from] -= amount; balances[to] += amount`）を行います。しかし、この構造はリエントラント攻撃（再入攻撃）や不正な書き換え、権限チェック漏れなど、バグや資産紛失を引き起こす最大の要因となっていました。Flowの**Cadence**は、これを「リソース指向プログラミング (Resource-Oriented Programming)」によって根本から解決しました。

### Cadenceにおける3つの技術的柱

#### **1\. 線形型システムと「実体」としてのデジタル資産**

Cadenceにおける「リソース」は、Rustの線形型システムに着想を得た実体オブジェクトです。

*   複製（コピー）の不可: コピー処理はコンパイルエラーになります。
    
*   暗黙の破棄の不可: 生成されたリソースは、アカウントのストレージに保存されるか、`destroy` キーワードで明示的に破棄されない限りコンパイルが通りません。
    
*   常に空間上に1つしか存在しない: ダブルスペンディングが物理的に不可能な設計
    

```swift
// リソース（SomeResource）の定義
access(all) resource SomeResource {
    access(all) let id: UInt64
    init(id: UInt64) {
        self.id = id
    }
}

// リソースの生成とアカウントへの移動
access(all) fun mintAndStore(account: &Account) {
    // 代入 '=' ではなく、移動演算子 '<-' を使用
    let newNFT <- create SomeResource(id: 1001)
    
    // リソースをストレージに移動させないとコンパイルエラーが発生する
    account.storage.save(<-newNFT, to: /storage/SomeResource)
}
```

#### **2\. 移動演算子 (**`<-`**) による明確な視覚化**

資産の上書き事故を防ぐため、通常の代入演算子 `=` ではなく、専用の移動演算子 `<-` を使用します。これにより、コード上で「資産の所有権がどこからどこへ移動したか」が一目で判別できます。

#### 3\. ケーパビリティ（Capability）ベースのアクセス制御

Solidityのように実行時に `msg.sender == owner` などの権限チェック（ヒューマンエラーの温床）を行うのではなく、CadenceではCapability（操作権限への参照）を発行します。「閲覧のみ」「受領のみ」といった最小限のアクセス権限を第三者に安全に委任できます。

* * *

言語としてはSwiftに似ています。Crypto Kitties作者が元AppleでKeynoteを2010年ごろ開発していたエンジニアであったため、Appleの開発した情報と親和性が非常にあります。

１枚のプログラミングコードにお金の計算、ランキングなどゲーム情報の管理、資産の分配などを全て書くことができます。それも**Resourceをselfに対して登録しておくだけ**でバックエンドから自由にこれらの処理を行うことができます。
