# FlowとCadenceへの入門 **Published by:** [sagantaf](https://paragraph.com/@sagantaf/) **Published on:** 2022-10-26 **URL:** https://paragraph.com/@sagantaf/flow-cadence ## Content 最近、Flowを勉強してCadenceを触っているので、そのメモとして、FlowとCadenceの概要について整理。Flow の特徴BitcointやEthereumのようなブロックチェーンの1つブロックチェーンの専門家ではなく、一般人に向けて開発されているデジタルアイテムの「所有」を実現したいというモチベーションで開発がスタートしたリソース指向の言語で開発できる4種類のノードが存在するCollection, Consensus, Execution, Verificationマシンスペックに応じて、4種類の役割を分担することで、効率的な処理を実現しているEtherium は1種類のノードで全ての役割を担っているエンドユーザーが使うアプリケーションからのアクセスは最初に Access Node が受け、その後、4種類のノードにトランザクションが送られる仕組み概要を知れるTED Talk cadence の特徴Flowを扱うためのプログラミング言語強力な静的型付け言語Swift や Kotlin、TypeScript など最近の構文を取り入れているリソース指向プログラミングリソースが一度に一箇所にしか存在できない、コピーできない、削除されない、といった特徴があるこれによってデジタルの所有権をモデリングしやすくなっている - 関数とトランザクションの前後条件関数とトランザクションの前後に条件を記述して、テストができる更新可能一定の条件下でコントラクトをアップデート可能最小権限の原則オブジェクトへのアクセスは所有者と参照を持つものに制限されるCadence を使う上で理解しておくべき用語アセット:ブロックチェーンを使って所有権を主張したいモノそのもの。アカウント:ユーザーが持っているコントラクトとストレージ。通常はウォレットに格納して利用する。コントラクト:リソースやインターフェース、関数を定義したプログラム。アカウントにデプロイすることで利用できる。リソース:独自に定義されたフィールドと関数を持つ複合型のプログラム。トランザクション/スクリプト:コントラクトのリソースや関数を使って、オンチェーンで取引や参照などのロジックを実行するプログラム。Capability:アカウントストレージにアクセスするためのリファレンス。アカウント公式解説ページ: https://developers.flow.com/cadence/language/accountsアカウントとは、Flow ブロックチェーンを扱う上での個人個人が管理する対象のことコントラクトやリソース、秘密鍵などが含まれるFlow では秘密鍵を複数持てる(multi sig)Flow ではアカウント内に2つの領域があるコントラクト領域スマートコントラクトのプログラムを格納する領域アカウントの所有者はここにコントラクトをデプロイし、管理するトランザクションやスクリプトはこの領域には直接アクセスできない(ストレージを経由してコントラクトを利用することになる)他のコントラクトからコントラクトを利用するためには専用のインターフェースを定義する必要があるファイルシステム領域アカウントが所有するオブジェクトと capability(実行可能な関数へのリファレンス)を格納する領域トランザクションやスクリプトからアクセスできるどのアカウントもファイルシステムの root には storage private publicという3つのドメインだけが存在するstorage: 全てのオブジェクト(token や NFT など)を保存する。アカウントの所有者のみがアクセスできるprivate: storage に保存したオブジェクトへの capability を保存する。アカウントの所有者とアクセス権を持っている人だけがアクセスできるpublic: ネットワーク内の誰もがアカウントの情報を参照できるような capability を保存するコントラクト公式解説ページ: https://developers.flow.com/cadence/language/contractsコントラクトはアカウントのオーナーが追加、更新、削除できるコード変数、関数、リソース、インターフェース、Capability などを定義するコントラクトのサンプル:pub contract HelloWorld { pub let greeting: String // 変数定義 pub fun hello(): String { // 関数定義 return self.greeting } init() { // 初期化処理 self.greeting = "Hello World!" } } 各アカウントのコントラクトは、トランザクションや他のアカウントから import することによって利用できる。ただし変数や関数にはアクセス制御がされているpub/access(all)は誰でも利用可能access(account)はコントラクトの作成者のみ利用可能access(contract)はそのコントラクト内でのみ利用可能priv/access(self)は現在のスコープ以下のみ利用可能pub/access(all) > access(account) > access(contract) > priv/access(self) の順にスコープが狭くなる詳細は https://developers.flow.com/cadence/language/access-control を参照init()関数はデプロイ時のみ稼働する。デプロイ後はデプロイしたアカウントであっても利用できないimport HelloWorld from 0x02 log(HelloWorld.hello()) // prints "Hello World!" log(HelloWorld.greeting) // prints "Hello World!" HelloWorld.init() // Error リソース公式解説ページ: https://developers.flow.com/cadence/language/resourcesリソースとは、データと関数の集まりであり、構造体や Class に似ている cadence 独自の考え方。構造体や Class との違いはコピーができない点コピーができないことで、所有権を表現することに使えるリソースは以下のルールに従うよう作られている1つの場所にだけ存在できる(コピーして同時に複数の場所に存在することはできない)場所とは、アカウントのストレージや、関数実行中の変数などを指すリソースは取り出された時、確実にある場所から他の場所への移動しなければならないリソースはスコープの外側には移動できず、そのスコープ内で最後にはどこかに保存するか、破壊するかを明示しなければならない上記ルールに従うことで、コーディングミスによるリソースの紛失やリソースのコピーを防ぎ、所有権の主張ができる状態を生み出しているインスタンス化したリソースは、アカウントのストレージに保存し、リソースの所有権をアカウントに直接結びつけているトランザクションが稼働するマシンのストレージを使わないため、アカウント間で自由にリソースを転送できるイーサリアムなどでは、所有権がスマートコントラクトに保存されるため、リソースの追跡のために全てのスマートコントラクト(つまりトランザクション)を検索する必要があるトランザクション公式解説ページ: https://developers.flow.com/cadence/language/transactionsトランザクションとしてオンチェーンで実行させたいプログラムデータの変更が伴う処理に利用され、そのためにはそのデータの更新権限を取得する必要があるデータの更新権限を取得するには、トランザクションのプログラムに対して対象データを保存しているアカウントが秘密鍵で署名する必要がある署名したアカウントは Authorizers や Signers と呼ばれる例えば アカウント A と アカウント B で NFT の所有者を変更したい時には、アカウント A と B でトランザクションを承認(sign)することになるトランザクション実行にはガス代がかかるトランザクションコードの例:import HelloWorld from 0x01 transaction { prepare(acct: AuthAccount) {} execute { log(HelloWorld.hello()) log(HelloWorld.greeting) } } スクリプトトランザクションとは異なり、データの変更が発生しない、情報を参照するだけの処理のことを指すそのため、署名のプロセスは発生しないガス代はかからない開発する時には開発の流れスマートコントラクトを実装する実装エミュレータ環境でテストテストネット環境にデプロイして動作確認メインネット環境にデプロイして動作確認フロントエンド/バックエンドを実装するFlow Client Library(JavaScript)や Flow Go SDK を利用cadence のプレイグラウンドスマートコントラクトを実際に書いて試せる Palyground を Flow 公式が用意している https://play.onflow.org/local-project:embedテストネットFlow のテストネット https://docs.onflow.org/concepts/accessing-testnet/Flow CLIエミュレータ、テストネット、メインネットでの開発に使えるコマンドflow emulatorでエミュレータを起動したりflow deplyでコントラクトをデプロイしたりといった使い方ができる参考にできるソースコードcadence で書かれた NFT マーケットプレイスのサンプルプロジェクト https://github.com/onflow/kitty-itemsNBA Top Shot のコントラクトの実装 https://github.com/dapperlabs/nba-smart-contracts ## Publication Information - [sagantaf](https://paragraph.com/@sagantaf/): Publication homepage - [All Posts](https://paragraph.com/@sagantaf/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@sagantaf): Subscribe to updates