スマートコントラクト開発(dApp開発)に関した技術情報

[Previous << Burner](https://qiita.com/flowcadence/items/ee2edba3ed870402dac3)
[Next >> Introduction](https://qiita.com/flowcadence/items/87147a26f1d2b89b46ca)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#cadenceの言語仕様を学ぶ

1. **[ブロックチェーンでこれが出来る！](#ブロックチェーンでこれが出来る)**
2. **[スマートコントラクト言語のセキュリティの仕組み①](#スマートコントラクト言語のセキュリティの仕組み1)**
3. **[スマートコントラクトで資産を作ってみる](#スマートコントラクトで資産を作ってみる)**
4. **[トランザクションは普通のユーザーには難しい?](#トランザクションは普通のユーザーには難しい)**
5. **[トランザクションを実行するとリソースがPathに保存される](#トランザクションを実行するとリソースがpathに保存される)**
6. **[スマートコントラクト言語のセキュリティの仕組み②](#スマートコントラクト言語のセキュリティの仕組み2)**
7. **[Linear Typesとは何か](#linear-typesとは何か)**
8. **[最新ブロックチェーンのトランザクションはとっても簡単](#最新ブロックチェーンのトランザクションはとっても簡単)**
9. **[最新ブロックチェーンの情報取得は無料でJavaScriptでとっても簡単](#最新ブロックチェーンの情報取得は無料でjavascriptでとっても簡単)**
10. **[ブロックチェーンゲームのデモビデオ](#ブロックチェーンゲームのデモビデオ)**
11. **[Playground攻略でスマートコントラクトの雛形を作成する!](#playground攻略でスマートコントラクトの雛形を作成する)**
12. **[後はfclという専用のライブラリでトランザクションやScriptを実行するだけ](#後はfclという専用のライブラリでトランザクションやscriptを実行するだけ)**

<h2 id="ブロックチェーンでこれが出来る">ブロックチェーンでこれが出来る！</h2>

:::note info
[乱数生成もスマートコントラクト言語Cadenceであれば一発で生成が簡単!](https://qiita.com/flowcadence/items/e1528810ca4a72c8f521?utm_campaign=post_article&utm_medium=twitter&utm_source=twitter_share#revertiblerandom)
:::

:::note info
[スマートコントラクトで現在時刻を楽々取得!](https://qiita.com/flowcadence/items/1aefd14bce23a00518ec)
:::

:::note info
[文字列、配列、ディクショナリの組み込み関数がCadenceなら既視感、エンジニアなら誰でも扱える!](https://qiita.com/flowcadence/items/c917af1e35cd46cf6a7f)
:::

<h2 id="スマートコントラクト言語のセキュリティの仕組み1">スマートコントラクト言語のセキュリティの仕組み1</h2>

:::note warn
アカウントとは日本語で口座という意味で、ブロックチェーンではユーザー一つ一つが持つものもアカウントと言います。そこにNFTやコインなどの資産を紐解けます。Linear Typeを資産(Resource)が性質として持っているSui, Aptos, Flowの3つのブロックチェーンは、資産が文字通りアカウント間で動きます。
(ストレージはアカウント毎に用意されています)

これを知ったら次の技術は間違いなくブロックチェーンだと思っちゃいますよね。特にFlowブロックチェーンはGo言語で出来てるため誰にとっても書きやすく(easy to write)、シードフレーズのような詐欺の温床になるようなものが無く安全で、世界中の人がデジタル資産として猫の帽子を持つようなブロックチェーンの魅力を味わってほしいという製作者の感性を味わえます。彼はAppleでスティーブ・ジョブズの元でKeynoteを開発していたので、万人が愛する製品の開発を得意としており、その製品は一度味わうとずっと使いたくなる魅力を持っています。

あと、Cadenceが完璧なプログラミング言語なのも凄いですよね。他のブロックチェーン言語とは雲泥の差です。
:::
<h5>プロジェクトの安全対策がわかりやすく設計されています!</h5>

:::note info
[アカウントに保存された機能群(Capability)がなぜ安全なのかに関する記述 (Accounts)](https://qiita.com/flowcadence/items/5ddbb79fe8438850cf57)
:::
:::note info
[Cadenceを使うと何故安全なのかが分かる（Access Control)](https://qiita.com/flowcadence/items/572df270135946f5290e)
:::
:::note info
[Cadenceがモダンプログラミング言語の域をふんだんに使っていると分かる (4. Capability Tutorial)](https://qiita.com/flowcadence/items/87b1cc1ff58417dc086d)
:::

<h2 id="スマートコントラクトで資産を作ってみる">スマートコントラクトで資産を作ってみる</h2>

:::note warn
スマートコントラクトとはコンピュータプログラムです。ビットコインも単なるプログラムですが、これらビットコインに代表されるトークン(日本語だとお札)をアカウント間で条件に従って自動で移動させるプログラムの事をスマートコントラクトと言います。

トークンだけではなく、NFTでも、何か機能を持ったコピー出来ない何かでも、プログラムで移動できます。
NFTも元々は、何か機能を持ったコピー出来ない何か、だったので、工夫次第で次のNFTを作れます。

これ(コピー出来ない何か)を作れるのがSuiやAptosなどLibraから引き継いだMove言語が生み出すリソースであり、Flow blockchainのCadence言語が生み出すリソースです。(Rust言語にはLinear TypeがBuilt-inで存在するのでそれをFacebookの開発陣は活用したか)

リソースは、NFTにもビットコインのようなトークンにもなれます。また、これら既に価値があるものを動かすものもリソースで作れます。価値は他のリソースに任せてそれを条件に従って移動させるものもリソースです。

だから最初に書いた通り、スマートコントラクトはコンピュータプログラムであり、そこから生み出すリソースは価値があるか、それ自体はないかもしれないがコピー出来ない”もの”なので、所有者に権利を与える”もの”です。そのリソースを"ゲームプレイヤー"として作れば、トークンでゲーム内通貨を買い、ゲーム内通貨で勝敗を増やしていき、賞金を獲得するといったことが可能なのです。

スマートコントラクト凄いですね！
:::
ではちょっとリソースの記事を見てみませんか?

:::note info
[リソース作成チュートリアル](https://qiita.com/flowcadence/items/891aaf12938b0e697ad3)
:::

<h2>トランザクションは普通のユーザーには難しい?</h2>

:::note warn
スマートコントラクトの開発は、関数をリソースの内部に定義して、保持したい値をリソースの内部でフィールドとして宣言します。そしてリソースの内部に`init`関数を作ってフィールドに初期値をセットする処理を書きます。

ユーザーがウォレット経由でトランザクションを実行した時、このリソースを作成して(`init`関数が呼ばれます)アカウントのストレージに保存します。（**アカウントはウォレットが作成し、ストレージはアカウント生成と同時にブロックチェーン内部で作られます**）

このトランザクションというのが、かなりITリテラシーを必要としますので、よっぽどでないとユーザーはしません。(お金を取られるかもしれない処理は誰でも慎重になって当然です)

だから、**ゲームプレイヤーを作ります**！とか**ゲーム内通貨を買います**！ぐらいの時しかユーザーはトランザクションをしないと考えてよく、その為、リソース作成時に実行される`init`関数には必要な値を目いっぱい引数として全て渡します。（例: 賞金の送金先アドレスなど。そうすることでユーザーが抵抗するトランザクションの回数を減らします。ゲーム内通貨を採用するのも**トランザクション回数を減らす為**です。**ゲーム内通貨であれば運営側のトランザクションで増減が可能**だからです。（スマートコントラクトでは運営のことをAdminと言います。スマートコントラクトをデプロイしたアカウントはこうした特権を持つことが普通で、このアカウントのことをAdminと呼びます。））
:::
:::note info
[ブロックチェーンアプリの根幹部分。なのに分かりやすい。(トランザクション)](https://qiita.com/flowcadence/items/0d73ce09c9da04d8b697)
:::
ウォレットアプリに自由度の高い安全性を実現する方法が記載されています。👇

> 例えば、ユーザーがトランザクションに署名して送信する際に使用する(ウォレット)ソフトウェアは、トランザクションを分析し、人間が読める形で説明することができます。「このトランザクションは、AからBに30トークンを転送します。Aの残高は30トークン減少し、Bの残高は30トークン増加します」といった具合にトランザクション実行時にユーザーに注意喚起するウォレットアプリを作る事が出来ます

上記はウォレット側の実装な為、トランザクションコードの解析という処理が必要になりますが、これを実装したウォレットは**安全さ**を他ウォレットに対してアピールすることが出来るようになります。

:::note info
[販売所(ウォレット)作成に欠かせないアカウント作成も ’Account(payer: signer)’ だけ! (Account)](https://qiita.com/flowcadence/items/5ddbb79fe8438850cf57#creating-an-account)
:::

<h2 id="トランザクションを実行するとリソースがpathに保存される">トランザクションを実行するとリソースがPathに保存される</h2>

:::note warn
ブロックチェーンの強みは承認さえ押してもらったらお金を支払って貰えることです。賞金でもそうですが、返金も簡単です。逆をすればいいだけです。スマートコントラクトをデプロイしたアカウントは管理上しっかりプライベートキーを保存する必要があります。そこで、機能の一部を他のアカウントに移譲する事が出来るので、その機能の一部を受け持ったアカウントを運用アカウントにします。(すぐ下で解説致します)

前置きが少し長くなりましたが、その運用アカウントが承認することで返金処理をします。(それだけでなく、文字通り誰でも出来ます。ビジネスDAppを作ればユーザーがアプリで稼いで返金もユーザーが承認さえ押せば出来る完全分散型アプリを作れます)

このお金の流れは全てのビジネスに活用できるはずです。なぜなら手数料が0で出来るからで、信じられない機会です。

この運用アカウントを安全に、分かりやすく、最初から用意してくれているのがFlowとそのプログラミング言語Cadenceです。作者はAppleの従業員時代から、この直感的に利用できる使いやすさを実装することをスティーブ・ジョブズから言われてました。

ユーザーが安心して使えるウォレットを提供する事が得意な会社、Bloctoは昨年日本法人を設立してあり、Flow blockchainは他には無い有利さを有しています。
:::

:::note info
[ユーザー(又はAdmin)が持つリソースやそのPublic関数はここに保存されます (Paths)](https://qiita.com/flowcadence/items/9767ec3f9b8d757d75bf)
:::
☝直感的にトランザクションを実行できるのがこのPathのおかげです。他のブロックチェーンと違い、文字通りリソースをstorageのパスに保存するので、直感的にリソース関数を呼び出せます。


:::note info
[Capabilityを他のアカウントに渡して運営用アカウントを作れます (Inbox)](https://qiita.com/flowcadence/items/db88a071c732f68cc7fb)
:::
👆 Version 1.0の新機能です。「AさんにならこのCapability使っていいよ、とトランザクションを実行し、AさんはそのCapabilityを下さい、というトランザクションを実行する」、これだけで運営用アカウントが作れるという、とても直感的になりました。

以前は ([以前作ったビジネスDAppのコントラクトのここのように](https://github.com/temt-ceo/tickets-on-flow/blob/main/cadence/Tickets.cdc#L198)) Private Capabilityを作ってそれに機能群を渡す関数を作る必要があったのですがもう必要ありません。

Cadence v1.0凄い！

<h2 id="スマートコントラクト言語のセキュリティの仕組み2">スマートコントラクト言語のセキュリティの仕組み2</h2>

:::note warn
CadenceのインタフェースはJavaのインタフェースと全く同じであり、「ある機能を実現するクラスが実現するべきメソッドの名前や型といった作法のみを定義するもの」です。(クラスの部分をリソースやStructで置き換えてもらって全く同じ仕様です)

このインタフェース自体も型として利用出来る為(Cadenceではリソース宣言も型なので同じリソースは違うスマートコントラクト内では作れない)、インターセクション型{I} として(鉤括弧で囲みます)リソースの後ろにつけてCapabilityを作ります。Capabilityを作って何するの？というと、1番大事なものとして、リソースのIDを取得します。

あとはぶっちゃけ無くても。。(スマコンに保存した情報を取得したいだけなら[スマートコントラクト直下の関数を呼び出すだけでOK](https://github.com/temt-ceo/game-on-svelte-and-flow/blob/main/src/lib/cadence/scripts.ts#L36)なのでIDさえとれれば後はディクショナリ型から詳細情報を読み取ればいいからです。) 
storageパスに入ってるリソースには本人しかアクセスできない為、最低限id をインタフェースに含めて作成します。それを型としてCapabilityをpublicパスに保存する事でその情報をどこからでも読み取る事が可能です。

どのみちリソースは本人しか移動出来ませんので、そこまで安全に気を配る必要はない気もします
トランザクションは権限が巨大(リソースを移動できる)なので、気にする必要がありますが..
:::

<h5>セキュリティ対策をわかりやすく!</h5>

:::note info
[簡単に、コストかけずに、安全に、が実現されてるのでそれに従うこと
(セキュリティベストプラクティス)](https://qiita.com/flowcadence/items/352281011d0049abcdeb)
:::

 👆トランザクションはアカウントに対しあらゆる操作が出来ます故、監査(するシステム)は必要と述べられています。システム対応ですとウォレットレベルの対策が必要です

:::note info
[代替性トークン(俗に言う仮想通貨 or デジタル通貨) (6. Fungible Token Tutorial)](https://qiita.com/flowcadence/items/d4f98c76d5f88d447345)
:::
👆 最もセキュリティが敏感な場所なので、Flowのセキュリティについて詳細に書かれています。

:::note info
[インターセクション型は、適合するフィールドをアクセス可能にし、それ以外をアクセス制限します(Intersection Type)](https://qiita.com/flowcadence/items/582db1a97e279dfe033f)
:::
:::note info
[Pathのstorageパスにはリソースがそのまま保存されますが、publicパスにはCapability (リソースの全部または一部の関数)が保存されます。 (Capability)](https://qiita.com/flowcadence/items/85e1aaf7e41d1134fa6c)
:::
👆 インタフェースでリソースの関数を絞ってpublicパス配下におきます。インタフェースが無いとリソース全体がCapabilityになります。

⇨[これはCOF.ninjaでCapabilityを作ってる所です](https://github.com/temt-ceo/game-on-svelte-and-flow/blob/main/src/lib/cadence/transactions.ts#L13)(v1.0でなくて申し訳ないです..)
(この行の1行上は賞金や返金の為のユーザーへの振込口(アドレス)を、リソース作成と同時にスマートコントラクトに保存している所です。ユーザーはトランザクションが多いと抵抗感を感じるのでこのように一度にしています)

<h2 id="linear-typesとは何か">Linear Typesとは何か</h2>

:::note warn
Linear TypesとはFlowとLibra(今のAptosとSui)だけが持つ資産の移動方法です。

最新ブロックチェーンFlowには資産の移動と安全デプロイの為に、Linear Typesが実装されています。

これはイーサリアムが実は資産をコピーできた為、これへの対応を考えた時に導入された、コンピュータサイエンスの一分野です。

Flowを開発していた人は論文を読んでこれをCadenceスマートコントラクト言語に組み込みました。

Cadenceのresource は<-という演算子を使わないと変数等に値を渡せないのですが、この<-演算子が内部でLinear Typesとして働き、値が移ると元の変数からは値が消えます。

Flow blockchain以外にもLibraを引き継いだAptosとSuiにもLinear Typeがあります(どちらもLibraのMove言語を使用します)

Linear Typesを採用した、Cadence、Move言語はまた、プログラミングコード中でリソースが保管されない状態(イーサリアムでよくあったゴックス状態)になるとそのトランザクションは必ず失敗します。これもLinear Typesの特徴でありその目的です。もしスマートコントラクトにそのようなコードがあるとそのデプロイ自体が失敗しますのでコード監査の負担は非常に軽減します。
:::
:::note info
[これはもはやカナダの"まつもとゆきひろ"と言っていい完璧なブロックチェーン言語 (Control Flow)](https://qiita.com/flowcadence/items/49857b417bbc90cfa50b)
:::
:::note info
[Flow blockchainのスマートコントラクト言語で型比較をする(Run-time Types)](https://qiita.com/flowcadence/items/043595e6f6e738cfbece)
:::
:::note info
[トランザクションで値を更新させないview関数! それ以外にも盛りたくさんな（Functions）](https://qiita.com/flowcadence/items/6518644e68d32b032530)
:::
<h2 id="最新ブロックチェーンのトランザクションはとっても簡単">最新ブロックチェーンのトランザクションはとっても簡単</h2>

:::note warn
COF.ninjaはEsportsゲームであり、AWS Lambdaにアップロードされるzipファイル内の[トランザクションコードはこのようなファイル](https://github.com/temt-ceo/CODE-of-flow/blob/master/aws_lambda/src/index.js)です

ユーザーがトークンを使ってゲーム内通貨を購入するロジックは、[フロントエンドに配置します (スマートコントラクトのbuy_en関数を実行しています)](https://github.com/temt-ceo/game-on-svelte-and-flow/blob/main/src/lib/cadence/transactions.ts)。

どちらもVersion1.0の書き方に書き換えないといけないのですがこのスマートコントラクトが3000行近くもあり..
:::
:::note info
[実際にJavaScriptでトランザクション実行や、スマートコントラクトを開発してデプロイする場合はこれをインストール (Flow CLI と FCL)](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-%E3%81%A8-fcl)
:::
:::note info
[研究者のようなDeteの考え方(開発スタンダード)](https://qiita.com/flowcadence/items/d3c85d8bdec700424c5b)
:::
👆一つのアカウントだけ(Admin)がロジック処理をする必要がある場合は、そのリソースはinit内でしか作成させない、といったはっきり見て分かるコードが好まれます。

Adminのトランザクションはバックエンドで実行することが多いと思います。バックエンドによるトランザクションは、ウォレットが必要ないので自動化できる為です。詳しくは[こちら](https://www.amazon.co.jp/dp/B0D3JBRJF5)。

<h2 id="最新ブロックチェーンの情報取得は無料でJavaScriptでとっても簡単">最新ブロックチェーンの情報取得は無料でjavascriptでとっても簡単</h2>

:::note warn
Svelteでブロックチェーン情報を読み込む時は[このようなファイル](https://github.com/temt-ceo/game-on-svelte-and-flow/blob/main/src/lib/cadence/scripts.ts)を使用します。 

Capabilityから情報を取得する時にリソースの後ろにインタフェースを{}で囲ってしていますよね？これがインターチェンジ型という型の一種になります。

Capabilityをpublicパスに保存させる時にこのインターチェンジ型を指定してあるので、このインタフェース内しかアクセスが出来ないというアクセスコントロールがCapabilityを作成する時に出来ています。

また、[これはCOF.ninjaのFlutterプロジェクトのwebフォルダの `index.html` 内で読み込んでいる `index.js` ](https://github.com/temt-ceo/CODE-of-flow/blob/master/web/index.js)です。fcl.jsはES6フォーマットですがこのようにコンパイルすることで普通のindex.htmlでも読み込めます。全ての(2015年以前のでも)htmlからブロックチェーン情報を読み込む事が可能なのです。コンパイルの仕方は[こちらに載っています](https://medium.com/@tickets.on.flow/how-to-call-blockchains-wallet-in-flutter-apps-633416720f23)。

どちらもVer1.0になり書き換えないといけないのですがCOF.ninjaのコントラクトが3000行近くあるので..
:::
:::note info
[リソースのうちインターフェースにある関数だけをCapabilityからアクセス可能にします (Interface)](https://qiita.com/flowcadence/items/765a76e4fac1220ea7d9#interfaces-in-types)
:::
> インターフェースは、次のようにして型として使用できます。{I}という型は、インターフェースIを実装する全オブジェクトの型になります。この型はこのインターフェースの機能（メンバーおよび関数）にしかアクセスできなくなります。

:::note info
参考になるか分かりませんが、私が作ったスマートコントラクトがこちらにあります。(コードはv1.0のものではありません)

[Tickets(ビジネスdApp)](https://github.com/temt-ceo/tickets-on-flow/blob/main/cadence/Tickets.cdc)
[ESports(ゲームdApp)](https://github.com/temt-ceo/game-built-on-flow/blob/hackathon/cadence/contracts/CODEOfFlow.cdc)

Ticketsのurlは https://tickets-onchain.com
Esportsに関しては[詳しくはこちら](https://www.amazon.co.jp/dp/B0D3JBRJF5)
:::


<h2 id="ブロックチェーンゲームのデモビデオ">ブロックチェーンゲームのデモビデオ</h2>

:::note warn
[実際にゲーム勝利の賞金を受け取る様子が最後の10秒で見れます](https://m.youtube.com/watch?v=TzxgaaAhM3c)。

ちなみにどうやって賞金を受け取ったかを判定するか、は簡単で、所持金を1秒おきに見て増えたら賞金Getと判定します。
:::
```ruby
        let account = getAccount(address)
        let vaultRef = account.getCapability(/public/flowTokenBalance).borrow<&FlowToken.Vault{FungibleToken.Balance}>()
            ?? panic("Could not borrow Balance reference to the Vault")

        var retArr: [CodeOfFlow.CyberScoreStruct] = []
        if player_id != nil {
          let cap = getAccount(address).getCapability<&CodeOfFlow.Player{CodeOfFlow.IPlayerPublic}>(CodeOfFlow.PlayerPublicPath).borrow()
              ?? panic("Doesn't have capability!")

          let player_arr = cap.get_players_score()

          let playerCyberData = player_arr[0]
          playerCyberData.balance = vaultRef.balance
          retArr.append(playerCyberData)
          if player_arr.length >= 2 {
            retArr.append(player_arr[1])
          }
          return retArr
        }
        let guestData = CodeOfFlow.CyberScoreStruct(player_name: "Guest")
        guestData.balance = vaultRef.balance
        retArr.append(guestData)
        return retArr
```
:::note warn
こういうCadenceのコードを書きます。($FLOW所持金だけなら数行、ゲーム内通貨残高も知りたいならこれぐらい書きます。複数情報を取るので配列に入れてます)

{CodeOfFlow.IPlayerPublic}の部分がインターフェースです。インターフェースはエンジニアお馴染みですね。

getAccountはグローバル関数です。Scriptというブロックチェーンの情報取得を行うところで書くとアカウントの情報を取得できます。

あとVersion1.0で少し変更あったので上記は動かないです。
:::
:::note info
[ERC-721(NFT)発明者のDieter Shirleyが考案したNFTをコレクションしてストレージに格納する (Composable Resources)](https://qiita.com/flowcadence/items/729d4317f64df7882783)
:::

:::note info
[応用で出来る事いろいろ(Marketplace)](https://qiita.com/flowcadence/items/4ccd756d0a2a71c6059b)
:::
> これらのCapabilityはどこにでも保存できますが、ユーザーが使用を望まなくなった場合、getControllersメソッドでアカウントからCapabilityコントローラを取得し、それを無効にすることができます

<h2 id="playground攻略でスマートコントラクトの雛形を作成する">Playground攻略でスマートコントラクトの雛形を作成する!</h2>

:::note warn
コードを書かない人でもわかるやり方（Jacob君の2021年のビデオ）

Let’s try!

シンプルに先週紹介したコードでPlayground上で作ります。私も一から作るのは一年ぶりです。Flowのサイトを見てもチンプンカンプンですから、Jacob君のYouTubeを見ます。

[@jacobmtucker](https://m.youtube.com/@jacobmtucker)で検索。ver1.0だろうがなんだろうが2021年のが1番分かりやすいのでそれを見ます。

彼のチャンネル上で「動画」タブをクリックして「古い順」をクリックして一番上の段の右端に「Learn Cadence (Part 2) - Intro to Smart Contracts」があるのでそれを見ます。YouTubeの検索窓に「Learn Cadence (Part 2)」と入れて検索するだけでも一番上に出ます。

3分目ぐらいから「FlowのPlayground」を使った画面が現れますのでそれを見ながら作業できるように、「FlowのPlayground」で検索して一番上に出たサイトを開きながら見ます。

①3分目でJacob君が言っているようにPlaygroundサイトのコメントを削除します。

②気分を入れるために１行目のコントラクト名をAwesomeCardGameに変えます。

③6分30秒でJacob君が言っているようにdeployボタンを押します。(Macの人はSafariブラウザでやってください。)左端の一番上のアイコンにAwesomeCardGameと表示されます。

④7分目でJacob君が言っているようにScriptの下のGetGreetingをクリックします。赤字になっているところをAwesomeCardGameにコピペで全部置き換えます。

⑤Executeボタンを押します。"Hello, World!”と表示されます。（エミュレータ上ですが初めてブロックチェーンから情報を取得しました🎉)

⑥そのままYouTubeを見てPart3を見ます。

⑦4分目でJacob君が言っているようにTransactionsの下のChangeGreetingをクリックします。赤字になっているところをAwesomeCardGameにコピペで全部置き換えます。

⑧右にポップアップが出てますので「Goodbye, world!」と入れてみてSendボタンを押します。(もしエラーになったらContractsに戻ってデプロイボタンの上に表示される🔺をクリックして0x07にデプロイして、Transactionsもimportの右端を0x07に変えてください。ver1.0になって間もなくなのでリソース足りてないんですね) Cadence log: 0x0000000000000007と表示されます。（エミュレータ上ですが初めてブロックチェーンにトランザクションを実行しました🎉)

⑨⑤に戻って同じようにしてみましょう。(0x07のスマコンに対して⑧を実行したのであれば、importの右端を0x07に変えてください)「Goodbye, world!」と表示されます。エミュレータでなければ世界中でこれが無料で取得できます。（トランザクションは実行者を選べましたが、Scriptsは選べません。誰でも無料で取得できるからです。Flowのリソースが不足しているようですので、誰かコントリビュータを派遣してください）

➓後は自分のやりたいようにやるだけ。2021年の時点でこれが出来たんです。NFTブームのせいでEthereumのずっと後塵を拝しましたが。(あとLukeのせい。彼には気をつけて) 

AwesomeCardGameに戻って2行目に
:::
```ruby
access(self) let playerDeck: {UInt: [UInt16]}
```
:::note warn
を、13行目のinit(){の下に
:::
```ruby
self.playerDeck = {}
```
:::note warn
を書きます。Deployボタンを押します。(上手くいかないなら0x08で試します)
:::
```ruby
access(all) resource Admin {
 access(all) fun save_deck(player_id: UInt, user_deck: [UInt16]) {
  if user_deck.length == 30 {
   AwesomeCardGame.playerDeck[player_id] = user_deck
  }
 }
}
```
:::note warn
というのをどこでもいいので書きます(12行目辺り)

11)以下を3行目に
:::
```ruby
access(self) let AdminStoragePath: StoragePath
```
:::note warn
以下を25行目辺り(initの下)に書きます
:::
```ruby
self.AdminStoragePath = /storage/CodeOfFlowAdmin
self.account.storage.save( <- create Admin(), to: self.AdminStoragePath)
```
:::note warn
Deployボタンを押してデプロイします。

Transactionsに戻り、今デプロイしたアカウント(と同じ番号を右下の🔺で選択し、またそ)のアドレスをimportの後ろにセットします。
トランザクション全体として以下のように書きます。
:::
```ruby
import AwesomeCardGame from 0x06

transaction(id: UInt, cards: [UInt16]) {

 prepare(acct: auth(BorrowValue) &Account) {
  if let om = acct.storage.borrow<&AwesomeCardGame.Admin>(from: /storage/CodeOfFlowAdmin) {
   om.save_deck(player_id: id, user_deck: cards)
  }
 }

 execute {
 }
}
```
:::note warn
右にポップアップが出てきますので1と[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]

とそれぞれ入力してSendボタンを押します。

これでデッキ保存機能をブロックチェーンに保存できました🎉。

ちなみ[Playgroundのコードは共有できます。[こちら](](https://play.flow.com/a4ebcad7-f3df-4d08-9ad8-66b890610d6e?type=contract&id=02634bb0-10e4-47de-bba5-30550e085c3c))をクリックすればこのページに書いたコードを見れます。
:::

<h2 id="後はfclという専用のライブラリでトランザクションやscriptを実行するだけ">後はfclという専用のライブラリでトランザクションやScriptを実行するだけ</h2>

:::note info
FCL jsライブラリで以下のことが全部できます。フロントエンド、バックエンドどちらでも使えます。(クリックするとFCLのAPIリファレンスに飛びます)

🌟 [fclの設定を行う](https://qiita.com/flowcadence/items/82c4e2d91df09051b1de#configuration%E8%A8%AD%E5%AE%9A)

🌟 [Walletにログインするロジックを書く](https://qiita.com/flowcadence/items/82c4e2d91df09051b1de#wallet-interactions%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B5%E3%82%A4%E3%83%B3)

🌟 [ログインしているユーザの情報を取得する](https://qiita.com/flowcadence/items/82c4e2d91df09051b1de#current-user%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6)

🌟 [さまざまなオンチェーン情報を取得する](https://qiita.com/flowcadence/items/82c4e2d91df09051b1de#builders%E3%82%AA%E3%83%B3%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E6%83%85%E5%A0%B1%E3%83%93%E3%83%AB%E3%83%80)

🌟 [トランザクションを行うロジックを書く, ユーザの持つリソース情報を取得する](https://qiita.com/flowcadence/items/82c4e2d91df09051b1de#on-chain-interactions%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)

🌟 [ノンカストディアルウォレットとして行うトランザクションのロジックを書く](https://qiita.com/flowcadence/items/82c4e2d91df09051b1de#apputils%E3%83%8E%E3%83%B3%E3%82%AB%E3%82%B9%E3%83%88%E3%83%87%E3%82%A3%E3%82%A2%E3%83%AB)

🌟 [実行したトランザクションのステータスを取得する](https://qiita.com/flowcadence/items/82c4e2d91df09051b1de#transaction-status-utilitytx%E6%83%85%E5%A0%B1)

🌟 [トランザクションにより発火されたイベントを取得する](https://qiita.com/flowcadence/items/82c4e2d91df09051b1de#event-polling-utility%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88)
:::
:::note warn
因みにGraphQLやgRPCを開発で触った事がある方なら、通信方法が殆ど一緒だ、という感覚に襲われます。GraphQLもgql という専用の言語に対して専用のライブラリでメソッドを呼んで、GraphQLサーバーと通信します。
gRPCもそうですね。専用のフォーマットを用意して専用のライブラリでgRPCサーバーと通信します。Flow blockchain はこれらモダン技術を使った事がある人にとってはよく知った技術という感覚に襲われます。 cadence言語というフォーマットを使って実行ノードと通信しているだけなのですから。また、いずれも速度が要求される通信であるため、速度要件に合わせた実装がされていると思われ、Flow開発陣の技術力の高さが伺えます。scriptやtransactionのコードをクライアント側に見立て、スマートコントラクトを実行ノード側(サーバー側)に見立ててOKです。

エラーになったらFlowScanでメッセージを確認して、もう一度Playground(CadenceをエミュレートしてくれるWebサイト)でエラーにならない方法を検証します。
情報が少ない時はこの方法が1番早いんです。エミュレータだとFlowScan使えないし..(今はどうか知らない)

(NFTは元々クリプトキティズというゲームの帽子とか鞄でした。ERC-721のコードに例として書かれてあります。因みに2017-2018年頃をYouTubeで検索すると、Deteが学会かワークショップで熱くNFTの意味を説いているのが見つかります。猫の帽子を大の大人が連呼するので、女性から笑いが生まれてます。NFTは今でこそ知られるようになりましたが、最初は1人の男性が猫の帽子に熱く情熱を込めたものだったのです。動画は[こちら💁](https://www.youtube.com/watch?app=desktop&v=Rw-hG031krE)。 この人が世界で初めてブロックチェーンゲームを、NFTを作り、FlowとCadenceを作り、あとAppleのKeynoteを開発してた人です。ブロックチェーン業界のレジェンドです)

ここまで読んだあなたならもう出来るはず、Let’s try!

あとこれ！10/1(火)に出された[ブロックチェーンゲーム(aiSports)のスマートコントラクト](https://contractbrowser.com/A.4fdb077419808080.aiSportsEscrow)ですがFlowトークンによるリワード配布含めて、ほぼCadence で出来る事全て、 1行も無駄なく書かれててほぼスマコンの教科書 📗

このコントラクト読んでてCadence version1.0って美しいんだなぁって思いました。 Javaに近くなりましたよね。Javaに寄せたかったんだろうか.. 綺麗なコントラクト言語になったと思います。二度とsolidity触りたくなくなる。

ほんとにCadenceで出来る事全てがこのコードに詰め込まれてて凄すぎです。
:::

***
<b>[Previous << Burner](https://qiita.com/flowcadence/items/ee2edba3ed870402dac3)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (スマートコントラクト開発(dApp開発)に関した技術情報)

<b>[Next >> Introduction](https://qiita.com/flowcadence/items/87147a26f1d2b89b46ca)</b>