Differences vs. EVM

[Previous << Why Flow](https://qiita.com/flowcadence/items/b6acebdde2b9a6a417c3)
[Next >> Blocks](https://qiita.com/flowcadence/items/5242f5342667771f4d30)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-developers

Flow [Cadence](https://cadence-lang.org/)は、これまでのブロックチェーンネットワークに多くの改善を加えて設計されています。その結果、Flowと他のブロックチェーン、特にEthereumとの間には多くの違いがあります。このドキュメントは、EVM上での構築にすでに精通している開発者にとって最も有用ですが、すべての開発者にとって役立つ詳細情報が含まれています。Flowブロックチェーンのより一般的な概要については、[Why Flow](https://qiita.com/flowcadence/items/b6acebdde2b9a6a417c3)をご覧ください。

:::note info
TIP
Flowは、[EVM](https://developers.flow.com/evm/about)完全互換もサポートしていることをお忘れなく！ 既存のスマートコントラクトを移行することから始め、Cadenceのパワーを活用した新機能の構築を開始することができます。
:::

<h1>The Flow Cadence Account Model</h1>

キーペアはブロックチェーン上の所有権を確立します。他のブロックチェーン（ビットコインやイーサリアムなど）では、ユーザーのアドレスも公開鍵に基づいて計算され、アカウント（アドレス）と公開鍵の間には一対一の関係が一意で構築されます。これは、有効なキーペアを生成する以外に具体的な「アカウント作成」プロセスがないことを意味します。

スマートコントラクトの出現により、イーサリアムはストレージスペース（すなわち、コントラクトバイトコードを保存する）を使用できるコントラクトをデプロイするための新しいアカウントタイプを導入しました。EOAとContract の違いについて、[accounts on Ethereum](https://ethereum.org/en/developers/docs/accounts/)でさらに詳しく知ることができます。

[Flowアカウントモデル](https://qiita.com/flowcadence/items/83d778f84f462cb43318)は、EOAとコントラクトアカウントの概念を単一のアカウントモデルに統合し、アカウントと公開鍵を切り離します。Flowアカウントはさまざまな重みの1つ以上の公開鍵に関連付けられており、そのアカウントによって承認された各トランザクションに対する有効な暗号署名を作成する為に必要なものとしてそれらのいずれかを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/4cfa618e-4588-3c1f-1811-490da4fa42cf.png)

これにより、キーの無効化、ローテーション、マルチ署名トランザクションなど、興味深いユースケースがネイティブで(生まれながらに)有効になります。Flowアカウントはすべて、保有するFLOWトークンの数に基づいて、ネットワークストレージ（例: スマートコントラクトのデプロイやNFTなどのリソースの保存）を使用できます。

:::note warn
WARNING
新しいアカウントを作成するには、Flowで明示的なアカウント作成トランザクションを実行する必要があります。[Flow CLI](https://qiita.com/flowcadence/items/4348fc03cefc88920920)は、任意のネットワークで指定の公開鍵を使用してアカウントを作成できます。これを行うには、FLOWで[非常に少額の手数料](https://qiita.com/flowcadence/items/c4c24a01ec3d6b7429e2)を支払う必要があります。
:::

もう一つの重要な違いは、アカウントに関連するデータやアセットのための[ストレージ](https://qiita.com/flowcadence/items/83d778f84f462cb43318#storage)が、EVMのようにスマートコントラクトに**ではなく**、アカウント内に保存される点です。

Flowアカウントについてさらに詳しく知りたい場合は、[Accounts](https://qiita.com/flowcadence/items/83d778f84f462cb43318)のコンセプトドキュメントをご覧ください。
<h1>Smart Contracts</h1>

Flowでは、スマートコントラクトはCadenceまたはSolidityで記述することができます。Cadenceの構文はユーザーフレンドリーで、Swiftなどの現代的な言語から着想を得ています。Cadenceのユニークな特徴であり、Flowブロックチェーンの主な強みとなるのは、以下の通りです。
* **リソース指向**：Cadenceは「リソース」と呼ばれる新しい型を導入しています。リソースは、デジタル資産をネイティブかつ安全にオンチェーンで表現することを可能にします。リソースは同時に1つの場所にしか存在できず、一般的な誤使用によるミスを回避するために実行環境によって厳密に制御されます。各リソースには、ブロックチェーン上で一意の`UUID`が関連付けられています。使用例としては、Fungibleトークン、NFT、または現実世界の資産を表すカスタムデータ構造などがあります。詳しくは、[リソース](https://qiita.com/flowcadence/items/f9b95df70c80a90d3a20)をご覧ください。
* **Capabilityベース**：Cadenceは[Capabilityベースのセキュリティ](https://en.wikipedia.org/wiki/Capability-based_security)モデルを提供しています。これにより、リソースをアクセス制御を構築するための構造として使用することも可能になります。Capabilityと[Entitlement](https://qiita.com/flowcadence/items/572df270135946f5290e#entitlements)により、基盤となるオブジェクトへの粒度の細かいアクセスを提供し、セキュリティを向上させることができます。例えば、ユーザーがFlowマーケットプレイスにNFTをリスティングする時、アカウントに保存されているNFTに対して新しいCapabilityを作成し、購入者がトークンを提供した際に購入者がその資産を受け取れるようにします。CadenceのCapabilityについてさらに詳しく知りたい方は、[Capabilityベースのアクセス制御](https://qiita.com/flowcadence/items/85e1aaf7e41d1134fa6c)をご覧ください。

:::note warn
WARNING
Cadenceはコンパイルされません。Flow上では、すべてのスマートコントラクトは公開されており、難読化されません。これはEVMとそれほど違いはなく、スマートコントラクトをSolidityに逆コンパイルするのは簡単です。
:::
Cadenceプログラミング言語の詳細については、[Cadence](https://cadence-lang.org/)のウェブサイトをご覧ください。

Solidity開発者の方は、Cadenceの[Solidity開発者向けガイド](https://qiita.com/flowcadence/items/13279fc2ca2970c3e433)から始め、2つの言語の違いについてより深く理解することをお勧めします。

Cadenceの使用を開始する際に役立つ追加リソースをいくつか紹介します。
* [Cadenceチュートリアル](https://qiita.com/flowcadence/items/d74e796356935d409ba4)
* FlowのERC-20相当は、Flow Fungible Token Standardです。
  * [リポジトリ](https://github.com/onflow/flow-ft)
  * [チュートリアル](https://qiita.com/flowcadence/items/d4f98c76d5f88d447345)
* ERC-721のFlowへの対応は、Flow Non-Fungible Token Standardです。
  * [リポジトリ](https://github.com/onflow/flow-nft)
  * [チュートリアル](https://qiita.com/flowcadence/items/ee22ed2ce344620c79da)
* Cadenceを使用したアセットマーケットプレイス
  * [チュートリアル](https://qiita.com/flowcadence/items/20c399a90a9cd9eb5250)
  * [NFT Storefront](https://github.com/onflow/nft-storefront/)は、マーケットプレイス スタンダードの例

<h1>Transactions and Scripts</h1>

ほとんどの他のブロックチェーンでは、スマートコントラクトの関数呼び出しを暗号を使って承認することで、ステート(状態)とやりとりすることができます。Flowでは、トランザクションはCadenceコードを通じて豊富な機能を提供しています。これにより、複数のスマートコントラクトと関数呼び出しをシームレスに結合し、ブロックチェーンのステートを更新する単一のトランザクションにまとめることができます。すべてが1つの統合された操作として同時に実行されます。

Testnet上の`ExampleNFT`スマートコントラクトからNFTを発行するトランザクションのサンプルは次のとおりです。
```ruby
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"
    }
}
```

<h3>Authorizing Transactions</h3>

Flow Cadenceでのトランザクションの承認プロセスは、EVMトランザクションよりも複雑ですが、より強力です。
* [アカウント](https://qiita.com/flowcadence/items/83d778f84f462cb43318)は、異なる重み付けを持つ複数のキーを持つことができます。
* 複数のアカウントで単一のトランザクションに署名することができます（`prepare`は、任意の数の引数を使用できます）。
* トランザクションの(計算)手数料は、`Payer`アカウントと呼ばれる別のアカウントで支払うことができます。
* [トランザクションのノンス(nonce)](https://ethereum.org/en/developers/docs/accounts/#an-account-examined)は、`Proposer`アカウントによって提供されます。これにより、必要に応じてレート制御や注文を別の当事者が指示することが可能になります。
* 上記のすべての役割を同一のアカウントにすることも可能です。

スクリプトを使用してブロックチェーンの状態(ステート)を照会する場合にも、同じ強力なコンセプトが適用されます。以下は、指定されたアカウントがTestnet上で保有する`ExampleNFT` のIDを取得するスクリプトのサンプルです。
```ruby
/** 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()

}
```
概念についてさらに詳しく知るには、[トランザクション](https://qiita.com/flowcadence/items/6393a2af33f82475a7ca)および[スクリプト](https://qiita.com/flowcadence/items/dad3bb9e1b7c90b855e8)を参照してください。Cadence言語リファレンスの[トランザクション](https://qiita.com/flowcadence/items/6393a2af33f82475a7ca)に関する項も参照してください。

<h1>Flow Nodes</h1>

開発者は、トランザクションの送信やステートの取得を行うためにブロックチェーンノード(に対するアクセス)を必要とします。Flowは、コンセンサスや計算などのタスクを個別のノードに分離するマルチノードアーキテクチャに基づいています。Flowアーキテクチャの詳細については、[Flow Primer](https://flow.com/primer#primer-how-flow-works)をご覧ください。

アクセスノードは、Flowネットワークへのアクセスを[API経由で](https://developers.flow.com/networks/flow-networks)提供する、開発者にとって最も便利なノードタイプです。
<h1>SDKs and Tools</h1>

ブロックチェーン開発にすでに精通している方のために、人気のソフトウェアパッケージとFlowのツールを比較してみましょう。
* [hardhat](https://hardhat.org/) / [Truffle](https://archive.trufflesuite.com/) / [Foundry](https://github.com/foundry-rs/foundry)
  * [Flow CLI](https://github.com/onflow/flow-cli/) はローカル開発ツールと[Flow Emulator](https://github.com/onflow/flow-emulator) を提供します。
* [OpenZeppelin](https://www.openzeppelin.com/)
  * [Emerald OZ](https://oz.ecdao.org/overview)
* [go-ethereum](https://geth.ethereum.org/)
  * [Flow Go SDK](https://github.com/onflow/flow-go-sdk/)
  * [FCL](https://github.com/onflow/fcl-js/) はJSのFlow用バックエンドAPIも提供します。(=Go SDKの一部が使えます)
* [web3.js](https://github.com/web3/web3.js)
  * [FCL](https://github.com/onflow/fcl-js/)
  * [flow-cadut](https://github.com/onflow/flow-cadut) は、ウェブ上でFlowを使用するためのより多くのユーティリティを提供します
* [Remix](https://remix.ethereum.org/)
  * [Flow Playground](https://play.flow.com/) は、ウェブ上での基本的な実験場を提供します
  * [Cadence VSCode Extension](https://marketplace.visualstudio.com/items?itemName=onflow.cadence) は、ローカル開発用にインストールすることが強く推奨されます
* [スマートコントラクトのテスト](https://ethereum.org/en/developers/docs/smart-contracts/testing/)
  * [Cadenceテストフレームワーク](https://qiita.com/flowcadence/items/831eeb4521c4b645fb04) は、Cadenceでネイティブテストを可能にします。
  * [overflow](https://github.com/bjartek/overflow) はGoによるテスト用。


*Last updated on **Dec 9, 2024** by **Alex***

翻訳元

https://developers.flow.com/build/differences-vs-evm

***

<b>[Previous << Why Flow](https://qiita.com/flowcadence/items/b6acebdde2b9a6a417c3)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Differences vs. EVM)

<b>[Next >> Blocks](https://qiita.com/flowcadence/items/5242f5342667771f4d30)</b>