Previous << Why Flow
Next >> Blocks
Flow Cadenceは、これまでのブロックチェーンネットワークに多くの改善を加えて設計されています。その結果、Flowと他のブロックチェーン、特にEthereumとの間には多くの違いがあります。このドキュメントは、EVM上での構築にすでに精通している開発者にとって最も有用ですが、すべての開発者にとって役立つ詳細情報が含まれています。Flowブロックチェーンのより一般的な概要については、Why Flowをご覧ください。
TIP
Flowは、EVM完全互換もサポートしていることをお忘れなく! 既存のスマートコントラクトを移行することから始め、Cadenceのパワーを活用した新機能の構築を開始することができます。
The Flow Cadence Account Model
キーペアはブロックチェーン上の所有権を確立します。他のブロックチェーン(ビットコインやイーサリアムなど)では、ユーザーのアドレスも公開鍵に基づいて計算され、アカウント(アドレス)と公開鍵の間には一対一の関係が一意で構築されます。これは、有効なキーペアを生成する以外に具体的な「アカウント作成」プロセスがないことを意味します。
スマートコントラクトの出現により、イーサリアムはストレージスペース(すなわち、コントラクトバイトコードを保存する)を使用できるコントラクトをデプロイするための新しいアカウントタイプを導入しました。EOAとContract の違いについて、accounts on Ethereumでさらに詳しく知ることができます。
Flowアカウントモデルは、EOAとコントラクトアカウントの概念を単一のアカウントモデルに統合し、アカウントと公開鍵を切り離します。Flowアカウントはさまざまな重みの1つ以上の公開鍵に関連付けられており、そのアカウントによって承認された各トランザクションに対する有効な暗号署名を作成する為に必要なものとしてそれらのいずれかを指定します。
これにより、キーの無効化、ローテーション、マルチ署名トランザクションなど、興味深いユースケースがネイティブで(生まれながらに)有効になります。Flowアカウントはすべて、保有するFLOWトークンの数に基づいて、ネットワークストレージ(例: スマートコントラクトのデプロイやNFTなどのリソースの保存)を使用できます。
もう一つの重要な違いは、アカウントに関連するデータやアセットのためのストレージが、EVMのようにスマートコントラクトにではなく、アカウント内に保存される点です。
Flowアカウントについてさらに詳しく知りたい場合は、Accountsのコンセプトドキュメントをご覧ください。
Smart Contracts
Flowでは、スマートコントラクトはCadenceまたはSolidityで記述することができます。Cadenceの構文はユーザーフレンドリーで、Swiftなどの現代的な言語から着想を得ています。Cadenceのユニークな特徴であり、Flowブロックチェーンの主な強みとなるのは、以下の通りです。
-
リソース指向:Cadenceは「リソース」と呼ばれる新しい型を導入しています。リソースは、デジタル資産をネイティブかつ安全にオンチェーンで表現することを可能にします。リソースは同時に1つの場所にしか存在できず、一般的な誤使用によるミスを回避するために実行環境によって厳密に制御されます。各リソースには、ブロックチェーン上で一意の
UUID
が関連付けられています。使用例としては、Fungibleトークン、NFT、または現実世界の資産を表すカスタムデータ構造などがあります。詳しくは、リソースをご覧ください。 - Capabilityベース:CadenceはCapabilityベースのセキュリティモデルを提供しています。これにより、リソースをアクセス制御を構築するための構造として使用することも可能になります。CapabilityとEntitlementにより、基盤となるオブジェクトへの粒度の細かいアクセスを提供し、セキュリティを向上させることができます。例えば、ユーザーがFlowマーケットプレイスにNFTをリスティングする時、アカウントに保存されているNFTに対して新しいCapabilityを作成し、購入者がトークンを提供した際に購入者がその資産を受け取れるようにします。CadenceのCapabilityについてさらに詳しく知りたい方は、Capabilityベースのアクセス制御をご覧ください。
WARNING
Cadenceはコンパイルされません。Flow上では、すべてのスマートコントラクトは公開されており、難読化されません。これはEVMとそれほど違いはなく、スマートコントラクトをSolidityに逆コンパイルするのは簡単です。
Cadenceプログラミング言語の詳細については、Cadenceのウェブサイトをご覧ください。
Solidity開発者の方は、CadenceのSolidity開発者向けガイドから始め、2つの言語の違いについてより深く理解することをお勧めします。
Cadenceの使用を開始する際に役立つ追加リソースをいくつか紹介します。
- Cadenceチュートリアル
- FlowのERC-20相当は、Flow Fungible Token Standardです。
- ERC-721のFlowへの対応は、Flow Non-Fungible Token Standardです。
- Cadenceを使用したアセットマーケットプレイス
- チュートリアル
- NFT Storefrontは、マーケットプレイス スタンダードの例
Transactions and Scripts
ほとんどの他のブロックチェーンでは、スマートコントラクトの関数呼び出しを暗号を使って承認することで、ステート(状態)とやりとりすることができます。Flowでは、トランザクションはCadenceコードを通じて豊富な機能を提供しています。これにより、複数のスマートコントラクトと関数呼び出しをシームレスに結合し、ブロックチェーンのステートを更新する単一のトランザクションにまとめることができます。すべてが1つの統合された操作として同時に実行されます。
Testnet上のExampleNFT
スマートコントラクトからNFTを発行するトランザクションのサンプルは次のとおりです。
import NonFungibleToken from 0x631e88ae7f1d7c20
import ExampleNFT from 0x2bd9d8989a3352a1
/** Mints a new ExampleNFT into recipient's account */
transaction(recipient: Address) {
/** Reference to the receiver's collection */
let recipientCollectionRef: &{NonFungibleToken.Collection}
/** Previous NFT ID before the transaction executes */
let mintingIDBefore: UInt64
prepare(signer: &Account) {
self.mintingIDBefore = ExampleNFT.totalSupply
/* Borrow the recipient's public NFT collection reference */
self.recipientCollectionRef = getAccount(recipient)
.capabilities.get<&{NonFungibleToken.Collection}>(ExampleNFT.CollectionPublicPath)
.borrow()
?? panic("The recipient does not have a NonFungibleToken Receiver at "
.concat(ExampleNFT.CollectionPublicPath.toString())
.concat(" that is capable of receiving an NFT.")
.concat("The recipient must initialize their account with this collection and receiver first!"))
}
execute {
let currentIDString = self.mintingIDBefore.toString()
/* Mint the NFT and deposit it to the recipient's collection */
ExampleNFT.mintNFT(
recipient: self.recipientCollectionRef,
name: "Example NFT #".concat(currentIDString),
description: "Example description for #".concat(currentIDString),
thumbnail: "https://robohash.org/".concat(currentIDString),
royalties: []
)
}
post {
self.recipientCollectionRef.getIDs().contains(self.mintingIDBefore): "The next NFT ID should have been minted and delivered"
ExampleNFT.totalSupply == self.mintingIDBefore + 1: "The total supply should have been increased by 1"
}
}
Authorizing Transactions
Flow Cadenceでのトランザクションの承認プロセスは、EVMトランザクションよりも複雑ですが、より強力です。
- アカウントは、異なる重み付けを持つ複数のキーを持つことができます。
- 複数のアカウントで単一のトランザクションに署名することができます(
prepare
は、任意の数の引数を使用できます)。 - トランザクションの(計算)手数料は、
Payer
アカウントと呼ばれる別のアカウントで支払うことができます。 -
トランザクションのノンス(nonce)は、
Proposer
アカウントによって提供されます。これにより、必要に応じてレート制御や注文を別の当事者が指示することが可能になります。 - 上記のすべての役割を同一のアカウントにすることも可能です。
スクリプトを使用してブロックチェーンの状態(ステート)を照会する場合にも、同じ強力なコンセプトが適用されます。以下は、指定されたアカウントがTestnet上で保有するExampleNFT
のIDを取得するスクリプトのサンプルです。
/** Script to get NFT IDs in an account's collection */
import NonFungibleToken from 0x631e88ae7f1d7c20
import ExampleNFT from 0x2bd9d8989a3352a1
access(all) fun main(address: Address, collectionPublicPath: PublicPath): [UInt64] {
let account = getAccount(address)
let collectionRef = account
.capabilities.get<&{NonFungibleToken.Collection}>(collectionPublicPath)
.borrow()
?? panic("The account with address "
.concat(address.toString())
.concat("does not have a NonFungibleToken Collection at "
.concat(ExampleNFT.CollectionPublicPath.toString())
.concat(". The account must initialize their account with this collection first!")))
return collectionRef.getIDs()
}
概念についてさらに詳しく知るには、トランザクションおよびスクリプトを参照してください。Cadence言語リファレンスのトランザクションに関する項も参照してください。
Flow Nodes
開発者は、トランザクションの送信やステートの取得を行うためにブロックチェーンノード(に対するアクセス)を必要とします。Flowは、コンセンサスや計算などのタスクを個別のノードに分離するマルチノードアーキテクチャに基づいています。Flowアーキテクチャの詳細については、Flow Primerをご覧ください。
アクセスノードは、FlowネットワークへのアクセスをAPI経由で提供する、開発者にとって最も便利なノードタイプです。
SDKs and Tools
ブロックチェーン開発にすでに精通している方のために、人気のソフトウェアパッケージとFlowのツールを比較してみましょう。
-
hardhat / Truffle / Foundry
- Flow CLI はローカル開発ツールとFlow Emulator を提供します。
- OpenZeppelin
-
go-ethereum
- Flow Go SDK
- FCL はJSのFlow用バックエンドAPIも提供します。(=Go SDKの一部が使えます)
-
web3.js
- FCL
- flow-cadut は、ウェブ上でFlowを使用するためのより多くのユーティリティを提供します
-
Remix
- Flow Playground は、ウェブ上での基本的な実験場を提供します
- Cadence VSCode Extension は、ローカル開発用にインストールすることが強く推奨されます
-
スマートコントラクトのテスト
- Cadenceテストフレームワーク は、Cadenceでネイティブテストを可能にします。
- overflow はGoによるテスト用。
Last updated on Dec 9, 2024 by Alex
翻訳元
Flow BlockchainのCadence version1.0ドキュメント (Differences vs. EVM)