はじめてのブロックチェーン実践講座その１

# はじめに
本講座では、金融庁認定の暗号資産：**Symbol** ブロックチェーンを利用し、
**プログラム知識ゼロ**でブロックチェーンを自由に利用、体験していただきます。

また、本講座はTaka Nobu(@nem_takanobu）様の「[速習Symbolブロックチェーン](https://github.com/xembook/quick_learning_symbol/blob/main/01_introduction.md)」を元に作成しております。

また、本講座では、**Symbolブロックチェーンを利用しての送金、送金ツールの作成**を実施することが誰にでも可能となります。

# 準備するもの
・インターネット接続環境
・Google Chromeブラウザ
・PC環境

# １．Symbolウォレット作成
### Symbolウォレットのインストール

[**こちら**](https://note.com/nembear/n/n56d2c9a28e8a)のリンク先を参照し、Symbolウォレットのインストールと作成を実施してください。
※**大項目１～３まで実施**すればOKです。
※**小項目３－４**は必ず「**testnet**」を選択してください。
※Symbolウォレットとは、暗号資産Symbol(XYM)を保管する金庫だと認識していただければOKです。

# ２．Symbol利用環境構築
### ２－１.開発者コンソール画面の起動
まずは、開発者コンソール画面を開くことから始めましょう。
[**こちら**](https://sym-test-01.opening-line.jp:3001/chain/info)のリンク先を別タブで起動してください。以下の画面が表示されます。
※表示される文字内容は気にする必要はありません。
![Capt_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/2260643f-19c7-f7ff-47a2-e83635107840.jpeg)

では、上記画面にて「**F12**」または、「**Ctrl + Shift + I**」を押下してください。
※表示がされない場合は、**右上の三点ドットから、[その他のツール] > [ディベロッパーツール]を選択**すると開発者ツールを開けます。
![image-1681901714637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/65e439d0-7029-3986-8ee5-3211b387bc3e.png)

以下のConsole画面が表示されます。
※PCによっては、右端、下段に表示されることがあります。どこに表示されても問題はありません。

![Capt_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/50ca7598-8615-4749-6a0d-db43cc3e03d6.jpeg)

### ２－２.Symbol利用環境の構築
Console上で以下のコマンド全文をコピーして入力してください。
```js
(script = document.createElement('script')).src = 'https://xembook.github.io/nem2-browserify/symbol-sdk-pack-2.0.4.js';
document.getElementsByTagName('head')[0].appendChild(script);
```
以下の状態になりました。
![Capt_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/0739d21c-af49-fc44-05c2-cb3dc44f927d.jpeg)
では、そのままEnterキーを押下してください。以下の状態になればOKです。
もしそうならない場合は、以下をチェックしましょう。
・指定した画面でConsole画面を開きましたか？
・コマンドをすべてコピーしましたか？
![Capt_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/c4b2f883-345b-dbc8-8886-3394bd0ecca9.jpeg)
続いて、Console上で以下のコマンド全文をコピーして入力してください。
```js
NODE = window.origin; //現在開いているページのURLがここに入ります
sym = require("/node_modules/symbol-sdk");
repo = new sym.RepositoryFactoryHttp(NODE);
txRepo = repo.createTransactionRepository();
(async() =>{
    networkType = await repo.getNetworkType().toPromise();
    generationHash = await repo.getGenerationHash().toPromise();
    epochAdjustment = await repo.getEpochAdjustment().toPromise();
})();

function clog(signedTx){
    console.log(NODE + "/transactionStatus/" + signedTx.hash);
    console.log(NODE + "/transactions/confirmed/" + signedTx.hash);
    console.log("https://symbol.fyi/transactions/" + signedTx.hash);
    console.log("https://testnet.symbol.fyi/transactions/" + signedTx.hash);
}
```
以下の状態になりました。
![Capt_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/b66226a9-2a9e-91c9-30c8-5e68e091eefa.jpeg)
ここでもまた、Enterを押下してください。以下の状態になれば「Symbol利用環境構築」は完了です。
![Capt_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/57abcf71-6e0c-e81d-9daa-518924ea4036.jpeg)
※ここから先は、この***2つのコマンドが入力されていること***を前提に進めていきます。ブラウザを閉じてしまった場合は、必ずこのコマンドを入力してから講座を進めてください。

# ３．Symbolアカウントの作成
### ３－１．コマンドによるSymbolアカウント作成
早速、Symbolブロックチェーンを利用し、あなたのSymbolアカウントの作成を実施しましょう。
**※注意点：項目２の環境設定が完了していること。（一度画面を閉じた場合は、再度設定が必要です）**

あなたのアカウントを作成します。
Console上で以下のコマンド全文をコピーして入力後にエンターキーを押下してください。
```js
alice = sym.Account.generateNewAccount(networkType);
console.log(alice);
```
以下の状態になればOKです。たったこれだけのコマンドで、***あなただけのSymbolアカウント***が生成されました。「address」欄に記載された文字列があなただけのアドレスとなります。
（ここでは「***TADB6XZW6YDUNNHGUXLSV2G5DO44G2ISXBV73TQ***」）
![Capt_10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/11e4000b-0317-d97d-3460-1f7db2333945.jpeg)

次に、あなただけの「***秘密鍵***」と「***公開鍵***」を確認しましょう。「privatekey(秘密鍵)」と「publickey(公開鍵)」の横にある「***（．．．）***」を押下してください。以下のように、あなただけの「秘密鍵、公開鍵」が表示されます。
※秘密鍵は本来、「***絶対に他人に見せてはいけない、無くしてはいけない***」大切な文字列となります。
***※あなたの「アドレス」と「秘密鍵」を新規のテキストにコピペし、保存してください。***
![Capt_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/be91047b-c6ed-82e0-00fb-aca808ff896b.jpeg)

### ３－２．Symbolウォレットとの連動
Symbolウォレットを起動し、あなたが設定した「プロファイル名」「パスワード」を入力して「ログイン」してください。
![Capt_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/e35065f7-b3f4-22f3-77cf-5d11c65cf052.jpeg)
「アカウント」から「アカウント追加」をクリックしてください。
![Capt_13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/9b5d74c1-b896-a625-ffc8-7dcbf3d9fe81.jpeg)
「新しいアカウントを設定」にて、
***・アカウントタイプの選択：既存アカウントに秘密鍵をインポート***
***・新しいアカウント名：alice***
***・秘密鍵を入力してください：前項目で保存したあなたの秘密鍵***
***・パスワード：あなたが設定したパスワード***
を入力後に、確認を押下してください。
![Capt_14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/9cfb944d-049e-4167-b520-dd32d26d7c52.jpeg)
これで、あなたがコマンドで作成したアカウントがSymbolウォレットと同期しました。アドレスが一致していることを確認してください。
![Capt_15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/cc25204c-11f6-9a45-6a8f-57b9b665a354.jpeg)
続けて、アカウントを２つ作成します。Console上で以下のコマンド全文を１つずつコピーして入力後にエンターキーを押下してください。
```js
bob = sym.Account.generateNewAccount(networkType);
console.log(bob);
```
```js
carol = sym.Account.generateNewAccount(networkType);
console.log(carol);
```
それぞれの「アドレス」と「秘密鍵」をそれぞれテキストに保存してください。
そして、先程と同様に、Symbolウォレットと同期してください。アカウント名は「bob、carol」で設定しましょう。これで、***あなた自身でSymbolブロックチェーンを利用し、３つアカウントを作成***することが出来ました。
![Capt_16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/578806ee-a662-e323-4ea6-f2cd2d9d2f32.jpeg)
最後に、「alice」アカウントへ「XYM（テスト用）」を入金しましょう。Symbolウォレットを立ち上げたまま、[**こちら**](https://testnet.symbol.tools/)のリンク先を別タブで起動してください。以下の画面が表示されます。下記を入力後、「CLAIM！」押下してください。
***・Mosaic：変更なし***
***・Recipient：aliceのアドレス***
***・XYM Amount：１０***
![Capt_18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/800f6d6c-a31d-6e10-5b2c-24a254a04ed8.jpeg)
少し待つと、Symbolウォレットに「チャリン」と音がすると思います。その後、Symbolウォレットにて、aliceのアカウントを確認してみましょう。aliceアカウントに「１０」が表示されていればOKです。
![Capt_19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/1b2f2373-a4eb-a3cf-a31a-8364939082d2.jpeg)


# ４．Symbolでのトークン（XYM）送信
### ４－１．事前確認
前項目でツール送信したXYMを、今度は***コマンド入力***で送信してみましょう。
もし、本項目を実施する際、***前項目で実施したconsole画面を閉じていた場合***は、以下の操作をconsole画面にて再度実施してください。(***閉じていない場合は必要ありません***。）

***※以下はconsole画面を閉じるたびに実施すること***
１．環境設定コマンドを入力(項目２参照）
２．以下のコマンドを入力（秘密鍵のみ、あなたがテキスト保存した秘密鍵を入力）
```js
alice = sym.Account.createFromPrivateKey('aliceの秘密鍵を入力しましょう', sym.NetworkType.TEST_NET);
console.log(alice);
```
```js
bob = sym.Account.createFromPrivateKey('bobの秘密鍵を入力しましょう', sym.NetworkType.TEST_NET);
console.log(bob);
```
```js
carol = sym.Account.createFromPrivateKey('carolの秘密鍵を入力しましょう', sym.NetworkType.TEST_NET);
console.log(carol);
```
### ４－２．トランザクション作成
ここでは、トランザクションを作成します。ここでいうトランザクションとは、
***１．有効期限***
***２．送信先***
***３．トークンとその枚数の指定***
***４．メッセージの有無***
***５．ネットワークタイプ（ここではTestnet）***
***６．手数料***
こちらを１つにまとめたものとなります。平たく言うと、誰に何をどう送るか？のセットだと思っていただければOKです。

では早速、トランザクション生成のコマンドを観ていきましょう。
```js
 tx = sym.TransferTransaction.create(
                sym.Deadline.create(epochAdjustment, 6),
                sym.Address.createFromRawAddress("あなたのbobのアドレスを入力してください。"),
                [new sym.Mosaic(new sym.MosaicId('72C0212E67A08BCE'), sym.UInt64.fromUint(1000000))],
                sym.PlainMessage.create('Hello Symbol'),
                sym.NetworkType.TEST_NET,
            ).setMaxFee(100);
```
トランザクション内容の説明をしていきます（聞き流しでOKです）
・sym.Deadline.create(epochAdjustment, 6)
　***⇒トランザクションの有効期限(ここでは６時間を設定）***
・sym.Address.createFromRawAddress("送信先アドレス")
　***⇒誰のアドレスに送信するかの設定***
・ [new sym.Mosaic(new sym.MosaicId('72C0212E67A08BCE'), sym.UInt64.fromUint(1000000))]
　***⇒どのトークンを（ここではtestnet用のXYMを設定）何枚送るか（ここでは１枚を設定）***
　※「72C0212E67A08BCE」はtestnetXYMのIDとなります。
・sym.PlainMessage.create('Hello Symbol')
　***⇒メッセージに何を入れるか（ここでは「Hello Symbol」を設定。自由に変更可能です。）***
・sym.NetworkType.TEST_NET
　***⇒ネットワークタイプを指定（ここではtestnetを設定）***
・.setMaxFee(100)
　***⇒送信手数料を指定（ここでは１００：約０.０１８９XYMを設定）***
以上となります。
では、早速トランザクションをコンソール画面にコピーして貼り付けてみましょう。***（送信先の部分は、bobのアドレスを入力してください）***

![Capt_21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/97db0eb7-6d7a-66dd-9ae7-4963f155f981.jpeg)
続いてエンターキーを押下しましょう。以下のように表示されればOKです。トランザクションが反映しました。
![Capt_22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/45ccd66f-8926-3f08-1c53-9adfc4c9fde8.jpeg)

### ４－３．署名
トランザクションは「誰に何をどう送るか？のセット」だとお伝えしたと思います。ですがそれだけでは、「***誰が送るのか？***」が足りていません。そこで、***送信元のサインを秘密鍵を利用して実施***いたします。以下のコマンドをご覧ください。
```js
signedTx = alice.sign(tx,generationHash);
console.log(signedTx);
```
ここでは、**aliceの秘密鍵を利用して、サイン**を行っています。前項目はbobへの送信トランザクションを作成したため、***aliceからbobへ送信を行う***ことになります。早速、コマンドをconsole画面に入力→エンターキーを押下してください。

![Capt_23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/83f0f2a4-7c5e-311c-4d1e-47a52d0baf3b.jpeg)
これで、***トランザクションにAliceの署名***が入りました。

### ４－４．アナウンス
ここまで、トランザクション（誰に何を何枚送るか）を作成し、そこに署名（誰が送るか）をいたしました。では、いよいよこれを ***Symbolブロックチェーンノードにアナウンス***（送信)しましょう。以下のコマンドを入力してください。
***※エンターキーは押下しないこと***
```js
res = await txRepo.announce(signedTx).toPromise();
console.log(res);
```

![Capt_24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/d9f20c52-a3e7-8d45-bc53-25122e4ad312.jpeg)
上記の状態になればOKです。それではアナウンスをする前に、Symbolウォレットでaliceのホーム画面を表示させてください。（実際は１０XYM格納されていると思います。）
![Capt_25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/fad9b394-b981-6d16-190f-01aee316d0a2.jpeg)
では、Symbolウォレットを起動したまま、console画面にてエンターキーを押下しアナウンスをしてください。
![Capt_26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/0f8476c4-0528-dde3-ca9c-e6eb589abe81.jpeg)
上記と同時に、Symbolウォレットから「チャリン」と音が鳴ると思います。Symbolウォレットを確認してください。あなたのコマンド入力で、Symbolウォレットに反映されました。
![Capt_27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/285b9b3d-c7d7-9baa-d1dc-36f862ab911d.jpeg)
少し待つと、ブロック高が確定します。
![Capt_31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/dae7884d-a1b0-8cfd-7683-c52d4cda0354.jpeg)
bobのアカウントを確認してみましょう。指定した「***１XYM***」が入金されていることが確認できます。おめでとうございます。***これであなたはブロックチェーンでの送金を自身で可能となりました。***
![Capt_32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/8c966d19-6892-9004-389b-f3bea0d4aa87.jpeg)
### ４－５．送信ツール作成
ここまででSymbolブロックチェーンでの送金処理を出来るようになりました。
ですが、送金するのに毎回、console画面から環境設定→コマンド入力をするだけでは大変ですし、つまらないと思います。
ここでは、***ボタンを押しただけで送金出来るツール***を作成したいと思います。

まずは、下記のプログラムを新規のテキストファイルに張り付けてください。
ファイル名を「pop.txt」としましょう。
**拡張子（ここでは「.txt」）が表示されない場合は、以下の操作を実施し、拡張子を表示させてください。**
◆Windowsは[**こちら**](https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=6111-3211)から
◆Macは[**こちら**](https://support.apple.com/ja-jp/guide/mac-help/mchlp2304/mac#:~:text=Mac%E3%81%A7%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%81%B8%E6%8A%9E,%E9%81%B8%E6%8A%9E%E3%82%92%E8%A7%A3%E9%99%A4%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)から

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>testpop</title>
</head>
<body>
    <p>button click</p>
    <input type="button" value="button" id="btn">
    <script>
        function butotnClick() {
            alert('Ok');
        }
        let button = document.getElementById('btn');
        button.addEventListener('click', butotnClick);
    </script>
</body>
</html>
```
では、このプログラムの内容を少し解説します。本講座、プログラムの勉強ではないのでフィーリングで聞き流せばOKです。
・「 function butotnClick() {　} 」の処理で「ボタンクリックをしたら、{　} 内の処理をします」と命令してます。
・「　alert('Ok')　」の処理で「ボタンクリックした際の処理＝'Ok'のアラートを出す処理をします」と命令してます。
```html
<p>button click</p>
<input type="button" value="button" id="btn">
<script>
 function butotnClick() {  //ボタンをクリックした時の処理を以下に書き出します
    alert('Ok');  //クリック処理で「Ok」のアラートを出します。
}
let button = document.getElementById('btn');
button.addEventListener('click', butotnClick);
```
では、先程用意した「pop.txt」の拡張子を変更し「pop.**html**」としましょう。その後「pop.html」をダブルクリックし、以下の画面が表示されることを確認しましょう。
![Capt_33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/cbc85b14-874f-4827-9241-e5638b0e1d47.jpeg)

早速、ボタンをクリックしてみましょう。
![Capt_35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/0ad614e8-74ca-a7cc-62f7-c678e07353c8.jpeg)
予定していた通り、「Ok」のアラートPOPが表示されました。では、***ここに先程までに実施したSymbolブロックチェーン「送金処理」を組み込みましょう***。組み込む個所は何処か分かりますか？そうです。
・「　alert('Ok')　」の処理で「ボタンクリックした際の処理＝'Ok'のアラートを出す処理をします」と命令してます。
この個所を「***ボタンクリックした際の処理＝Symbol(XYM)を１枚bobに送金する処理をします***」に変更すれば良いのです。では早速見てみましょう。

下記のプログラムを新規のテキストファイルに張り付けてください。
ファイル名を「test.txt」としましょう。
```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Test Symbol</title>
</head>
<body>
    <script src="https://xembook.github.io/nem2-browserify/symbol-sdk-2.0.4.js"></script>
    <script language="JavaScript">
        NODE = 'https://sym-test-01.opening-line.jp:3001';
        sym = require("/node_modules/symbol-sdk");
        repo = new sym.RepositoryFactoryHttp(NODE);
        txRepo = repo.createTransactionRepository();
        (async () => {
            networkType = await repo.getNetworkType().toPromise();
            generationHash = await repo.getGenerationHash().toPromise();
            epochAdjustment = await repo.getEpochAdjustment().toPromise();
        })();
        function clog(signedTx) {
            console.log(NODE + "/transactionStatus/" + signedTx.hash);
            console.log(NODE + "/transactions/confirmed/" + signedTx.hash);
            console.log("https://symbol.fyi/transactions/" + signedTx.hash);
            console.log("https://testnet.symbol.fyi/transactions/" + signedTx.hash);
        }
    </script>
    <p>button click</p>
    <input type="button" value="button" id="btn">
    <script>//ここからボタンクリックした際の処理が書かれています。
        function butotnClick() {
//aliceのアカウント呼び出します。
            alice = sym.Account.createFromPrivateKey('aliceの秘密鍵を入力しましょう。', sym.NetworkType.TEST_NET);
            console.log(alice);
//bobへ１XYM送信するトランザクションを生成しています。
            tx = sym.TransferTransaction.create(
                sym.Deadline.create(epochAdjustment, 6),
                sym.Address.createFromRawAddress("bobのアドレスを入力しましょう"),
                [new sym.Mosaic(new sym.MosaicId('72C0212E67A08BCE'), sym.UInt64.fromUint(1000000))],
                sym.PlainMessage.create('Hello Symbol'),
                sym.NetworkType.TEST_NET,
            ).setMaxFee(100);
            console.log(tx);
//aliceの秘密鍵で署名をしています。
            signedTx = alice.sign(tx, generationHash);
            console.log(signedTx);
//ノードへ署名されたアカウントをアナウンスします。
            new sym.TransactionHttp(NODE)
                .announce(signedTx)
                .subscribe((x) => console.log(x), (err) => console.error(err));
//すべてが正常に処理された際に「send」のPOPを出します。
            alert('send');
        }

        let button = document.getElementById('btn');
        button.addEventListener('click', butotnClick);
    </script>
</body>
</html>
```
では、先程用意した「test.txt」の拡張子を変更し「test.**html**」としましょう。その後「test.html」をダブルクリックし、以下の画面が表示されることを確認しましょう。
![Capt_36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/d94eb112-42a6-6d26-8479-75545d24b34d.jpeg)
画面上は、前回と同様の画面ですね。ですが、内部的にはSymbolブロックチェーンが組み込まれています。***Symbolウォレットを立ち上げたまま***、ボタンをクリックしてみましょう。「send」アラートPOPが表示されます。

![Capt_37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/f2a18bac-4ae0-4979-c16d-ef805a45a094.jpeg)

aliceアドレスのアカウントでも、送金が確認できます。
![Capt_43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/1161721b-9650-2af8-73de-607d7a49d827.jpeg)
bobアドレスのアカウントでも、入金が確認できます。赤線部をクリックしてください。
![Capt_44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/aee181e6-05cd-9053-e67a-32142113e736.jpeg)
このように、あなたが作成したトランザクションが表示されます。
・手数料　　：0.0189XYM
・送信者　　：aliceのアドレス
・宛先　　　：bobのアドレス
・モザイク　：１XYM
・メッセージ：Hello Symbol
![Capt_45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/0bc5f6bf-d727-8bec-06e8-ad5436668e2c.jpeg)
おめでとうございます。これであなたは、**ブロックチェーンを利用しての送金ツール**を作ることが出来ました。これで、**ウォレットに頼ることなく**、自身で世界中の誰にでも送金が出来るようになります。(webアプリにするには秘密鍵を公開しているためセキュリティが非常に気弱である点はご注意ください）

この様に、**Symbolブロックチェーンは誰にでも簡単に利用できるように設計**してあります。是非、この利便性を利用してオリジナルのツールを作ってみてください。また、「[はじめてのブロックチェーン実践講座その２](https://qiita.com/nembear/items/c7f39f5060d2209f1bfb)」ではあなたの**オリジナルのトークン作成**や、**今回とは異なるトランザクション作成が可能**となります。是非、そちらも実施していただけますと幸いです。また、本講座を実施した方は、「[速習Symbolブロックチェーン](https://github.com/xembook/quick_learning_symbol/blob/main/01_introduction.md)」を実施することが可能となります。是非、試してみてください。より、Symbolブロックチェーンの見識が深まるはずです。皆様「はじめてのブロックチェーン実践講座その１」の学習お疲れさまでした。ご覧いただきありがとうございました。