ブロックチェーン構築入門 with Avalanche

# 概要
普段AWS上でサーバの構築・運用をしているインフラエンジニアがブロックチェーンを初構築したので記念に構築作業を記事にしました。
使用したのはAvalanche。:small_red_triangle:がシンボルマークのブロックチェーンです。


:::note info
**ブロックチェーン：**
汎用系ともオープン系とも違う新しい技術を使った情報システム。今回使用したAvalanche以外にもEthereumなどの色々なブロックチェーンがあります。
:::


# 環境
**OS**： macOS Ventura13.1
**Webブラウザ**：Sidekick Ver. 108.36.1.29778 (Official Build) (arm64)
**ウォレット**： Core wallet Ver. 1.57.0（Avalancheの開発元Ava Labsが開発してるウォレットらしい。）


:::note info
**ウォレット：**
WebアプリケーションサーバにWebブラウザでアクセスするように、ブロックチェーンへのアクセスに使用するアプリケーションをウォレットと言います。ブロックチェーン界隈の人は皆当然のように使いこなしているようです。
:::


# Avalancheとサブネットについて
構築作業の前に、今回構築に利用したAvalancheについて補足。
AvalancheはAva Labsが提供するブロックチェーンプラットフォームの総称です。
仮想通貨のトレードをしたり、アプリケーションをサーバにデプロイするように自分で書いたプログラムをデプロイしたりと様々な用途で利用することができ、用途ごとに最適化された「チェーン」が提供されています。チェーンの一つ一つが独立したシステムプラットフォームということです。
また、Avalancheでは既存チェーンを利用する以外に、オリジナルのチェーンを自分で作成することもできます。これらのAvalancheチェーンのことを「サブネット」と呼ぶそうです。つまり、今回私が構築したのはAvalancheのサブネットです。　

ブロックチェーンといえば仮想通貨ですが、サブネットを作るとなんとオリジナルの仮想通貨も発行することができます！元々電子決済のために発明された技術なだけあって、ブロックチェーンは仮想通貨と切っても切れない関係みたいですね。なお、界隈では仮想通貨のことを「トークン」と呼ぶようです。
発行したトークンはまず手数料の支払いに使います。ブロックチェーンはチェーンを利用する毎に処理を行うノードに対しトークンで手数料を支払うという斬新な仕組みになっており、チェーン上にトークンが存在していないと誰もシステムを利用できません。
また、ウォレットを持っている友達がいれば自分で発行したトークンをプレゼントすることもできます。


# サブネット構築
ここからが私が実施したサブネット構築作業です。　
今回はサブネットを作成し、サブネット上の2つのアカウント間で自作トークンを送金してみました。いわゆる自鯖のようにPC上にシステムを構築することができます。

:::note info
**アカウント：**
Avalancheはチェーン上のアカウントというオブジェクトが保有する形でトークンを管理します。アカウントは1つのアドレス（後述）と1つの秘密鍵に紐づけられています。ITパスポートなどによく出る公開鍵暗号方式の秘密鍵です。

:::

通貨を取り扱う機能がデフォルトで組み込まれているため簡単に自作トークンが流通するミニチュア経済圏を作成できるのが、サーバとの特徴的な違いだと感じました。

###### 1. Avalanche CLIをインストール ######
サブネットはAvalanche CLIというコマンドベースのツールで構築するためまずこのツールをインストールします。
※Homebrewインストール済みの前提です。
ターミナルを開いて下記作業を実施

Avalanche CLIをインストール
```
curl -sSfL https://raw.githubusercontent.com/ava-labs/avalanche-cli/main/scripts/install.sh | sh -s
```


インストールできたかどうかbinディレクトリ下を確認
```
cd ~/bin
ls
```
binの中に"avalanche"というコマンドがインストールされていれば成功！

###### 2. サブネットを作成 ######
サブネット名や設定、運用ルールを定義し、これをAvalancheのノードが構成する「ネットワーク」にデプロイするという流れになります。
引き続きターミナル上でCLIを使用し、いつも仕事で使ってるWebアプリケーションサーバと同じようにcreateとかstartとかいうコマンドを打って作っていきます。

:::note info
**ネットワーク：**
Webアプリケーションを動かすために専用のミドルウェアとそれを稼働させるノードが必要なように、サブネットを稼働させるためにもチェーンの基盤となるノードが必要です。このノードのグループのことをネットワークといい、Avalancheの既存のネットワークを利用することも可能ですが、今回は自分のMac上に小規模なローカルネットワークを作りました。

:::

サブネットの定義作成を開始
```
./avalanche subnet create <subnetName>
```
上記コマンドを打つと使用するVM、チェーンID、トークンシンボル、VMのバージョン、サブネット上の処理に必要な手数料、発行するトークンをどのようにエアドロップ（配布）するか、プレコンパイルの順で設定の入力を求められます。

チェーンIDとトークンシンボルは任意の値を入力、他は選択式なので好きな設定を選びます。
私はデフォルトのSubnet-EVMの最新バージョンを選択しました。
トークンシンボルは「円」のようなこのサブネット上で発行するトークンの単位です。
手数料の設定はよくわからないのでいつも一番安い"Low Throughput"を選んでいます。
エアドロップ設定で"Airdrop 1 million tokens to the default address (do not use in production)"を選択すると、100万（自分で設定するシンボルが単位になる）のトークンが発行され、デフォルトのエアドロップ用アドレスに送られます。このアドレスは"0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC"で固定なので、デフォルトのエアドロップ設定で作成したサブネットは必ずこのアドレスに100万のトークンが入った状態でスタートします。

:::note info
**アドレス：**
各チェーン内で一意の識別番号で、プライベートIPアドレスのようなもの。パブリックIPアドレスに該当する、全チェーン間で一意の識別番号はブロックチェーン界にはなさそう。

:::

プレコンパイルはサブネットの運用ルールです。このサブネット上のアドレスに送金できるアドレスを制限したい場合などにホワイトリストを作成できます。特に必要なければ"Would you like to add a custom precompile to modify the EVM?"に対し"No"を選択し、下記メッセージが表示されたらサブネット定義完了です。
```
Successfully created subnet configuration
```

次にこれをデプロイするネットワークをローカル環境に立ち上げます。
下記のコマンドを入力すると自分のMac上に５台ノードが立ち上がります。
```
./avalanche network start
```
また、下記コマンドでこのMac上に構築されたローカルネットワークのステータスを確認できます。
```
./avalanche network status
```
ローカルネットワークが稼働したらここに先ほど作成したサブネットの定義をデプロイ。
```
./avalanche subnet deploy <subnetName>
```
どのネットワークにデプロイするか聞かれるので"Local Network"を選択します。
正常にデプロイされるとローカルネットワークの各ノードのURLと続いてサブネットの情報が表示されます。後でウォレットにサブネットの情報やエアドロップ用アドレスの秘密鍵の値を入力する時に参照します。

例
```
Browser Extension connection details (any node URL from above works):
RPC URL:          http://127.0.0.1:9650/ext/bc/upwx2G4vdu59fhy5ZphJFdoabhVGJfk49GBqax8qY7C1nxH1k/rpc
Funded address:   0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC with 1000000 (10^18) - private key: 56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027
Network name:     yupi
Chain ID:         1
Currency Symbol:  YAO
```
サーバにアクセスする時のように、サブネットへのアクセスもノードのURLを指定する形で行うんですね。


###### 3. ウォレットのセットアップ ######
Coreウォレットをブラウザにインストールします。
[Chrome Webストア](https://chrome.google.com/webstore/detail/core-crypto-wallet-nft-ex/agoakfejjabomempkjlepdflaleeobhb) からCoreウォレットをインストールできます。


以降ブラウザのツールバーからCoreウォレットを開けます。指示に従ってセットアップを完了すると１つ目のアカウント（以下Account1）がウォレット内に作成されます。

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533091/1f64b498-a93a-7cbe-88b4-ea8a161c91e7.png">

ウォレットでアカウントを作るとアカウントに紐づくアドレスが自動で1つ作成されます。画像の「資産」タブで既存の大手ブロックチェーンの名前ごとに区切られたスペースが表示されていますが、ここには各チェーン上におけるそのアドレスが保有する資産を示しています。
LANで考えるとある会社の社内ネットワークのプライベートIPアドレスを別の会社の社内ネットワークで使い回したりしない（偶々重複することはありうる）ですが、ブロックチェーン界では1つのアドレスをチェーンを越えて使い回すのが面白いです。また、一度作成されたアドレスは削除することができないのも特徴です。

画像にも表示されている「View All Networks」をクリックし、ネットワーク一覧画面を開いて右上の「＋」ボタンから自作サブネットもここに追加することができます。「ネットワークの追加」画面で、先程サブネット定義をデプロイした時に表示されたノードのURLやサブネット名、チェーンID、シンボルを入力して「保存」を押下すると追加できます。



:::note info
同じローカルネットワーク上で稼働していても異なるサブネットは別々のネットワークとして管理するので、Coreウォレットの画面で表示される「ネットワーク」は「チェーン」の意味なのだと私は思っています。
:::

Account1のアドレスはトークンを全く持っていません。そこで、先程作成したサブネット内で発行されたトークンを保有している唯一のアドレスである0x…FCもウォレットで操作できるようセットアップします。

Account1は新規に作成しましたが、ウォレットには既存のアドレスに紐づくアカウントを作成する機能もあります。アカウント名「Account1」をクリックすると「Account Manager」画面に遷移するので、ここで画面下の「Create Account」ボタン右横の矢印マークから「Import Private Key」を選択します。秘密鍵の入力を求められたらサブネットデプロイ時に表示された0x…FCの秘密鍵の値を入力し「Import Private Key」をクリック。すると「Account Manager」画面に「Imported」というタブが増え、「Imported Account1」という0x…FCのアドレスに紐づけられたアカウントが表示されています。
アカウント名は管理しやすいように変更してもいいです。

これでウォレットに2つアカウントが作成できたので、ウォレットを操作し作成したサブネット上で2つのアカウント間のトークンの送金ができるようになりました。


###### 4. 作成したサブネット上のトークンを操作  ######
ウォレットで「Imported Account1」の画面を開き、サブネットのトークンを100万保有していることを確認します。
もしアクティブネットワークがサブネットになっていなかったら「View All Networks」＞「カスタム」からサブネット名をクリックしてサブネットをアクティブネットワークに選択した状態にしておきます。
「右下の＋ボタン」＞「送信」で送金画面を開きます。「Sending To」にAccount1を選択し、送るトークンの量に「10000」、手数料は「普通」を入力して「次へ」をクリックし確認画面で「今すぐ送信」を押し「Send Successful」と表示されたら送金成功です。
「Imported Account1」のトークン残高が減り「Account1」のトークン残高が増えています。


## 執筆者について
Webアプリケーションサーバの製品サポートから転職し、自分が担当していた製品を含むクラウド基盤〜ミドルウェア周りの構築と運用をしているインフラエンジニアです。エンジニアの中でもプログラムの中身は詳しく見ない分、ネットワークレベルからシステムを管理できるポジションです。
Web（アプリケーション）サーバもスマホのアプリもブロックチェーンもPCさえ持っていれば手軽に構築して学べるのがいいですね。
メインフレームもかっこいいですが自宅に置けないので、プライベートでもPCで簡単に自分のサーバをたてられるオープン系の配属になってよかった、と新卒の時に思いました。
[根性ある人は置くけど。すごい](https://gigazine.net/news/20180128-mainframe-kid/ "大学生にしてIBM製メインフレームを自宅に設置＆IBMにスカウトされた「メインフレームキッド」のニッチな生き方とは？")


:::note info
最近ではクラウド上で利用できるメインフレームのエミュレータがありますね
:::