見出し画像

Nuxt.jsで@solana/web3.jsを使用する

はじめに

前回、下記のnoteで、簡単なSolanaのオンチェーンプログラムをdevnetにデプロイしました。今回のnoteでは、デプロイしたSolanaのオンチェーンプログラムを、Nuxt.jsを使ったフロントエンドから実行する流れを記載します。

環境構築

まずは、Nuxt.jsの環境構築です。前回同様にDockerを使って環境を構築します。ここでも、前回同様に、Dockerについての詳細な解説はしませんので、予めご了承ください。

それでは、デスクトップに好きな名前でフォルダを作り、以下のようにフォルダとファイルを作成します。

.
├── docker-compose.yml
├── docker-sync.yml
└── frontend
   ├── Dockerfile
   └── frontend
       ├── package.json
       └── pages
           └── index.vue

次に、それぞれのファイルに以下のように記載します。

docker-compose.yml

version: '3'

volumes:
 solana-nuxt-app-sync:
   external: true

services:
 frontend:
   # Dockerfileの場所
   build: ./frontend
   # ホストOSとコンテナ内でソースコードを共有
   volumes:
     - ./frontend:/usr/src/app
   environment:
     - HOST=0.0.0.0
   # コンテナ内部の3000を外部から8080でアクセス
   ports:
     - "8080:3000"
   tty: true

docker-sync.yml

version: '2'

syncs:
 solana-nuxt-app-sync:
   src: '.'

frontend/Dockerfile

FROM node:14

RUN mkdir -p /usr/src/app
ENV HOME=/usr/src/app
WORKDIR $HOME
ADD . $HOME
WORKDIR $HOME/frontend
RUN npm install

frontend/frontend/package.json

"scripts": {
  "dev": "nuxt"
},

frontend/frontend/pages/index.vue

<template>
  <h1>Hello world!</h1>
</template>

ここまで作成すると、frontendディレクトリが2つありますが、1つ目のfrontendディレクトリに移動して、以下のコマンドを実行します。

$ cd frontend
$ ls

Dockerfile      frontend

$ docker run -it -v "$(pwd):/usr/src" node:14 bash

するとDocker内に入りますので、Docker内で下記のコマンドを実行します。

$ cd /usr/src/frontend/
$ npm i @vue/cli nuxt
$ exit

`exit`コマンドでDockerを抜けますので、次に下記のコマンドを実行します。

$ cd ../
$ docker volume create --name=solana-nuxt-app-sync
$ docker-sync start
$ docker-compose up -d --build

少し時間がかかりますが、これでDocker環境が構築できました。下記のコマンドでDocker内に入ります。

$ docker-compose exec frontend /bin/bash

そして、Docker内で以下のコマンドを実行すると、ブラウザからhttp://localhost:8080にアクセスすれば、pages/index.vueに作成したファイルがブラウザで表示されます。

$ npm run dev

少し長くなってしまいましたが、ここまででNuxt.jsのDocker環境が構築できました。

@solana/web3.jsを使ってSolanaのオンチェーンプログラムを実行する

次に、@solana/web3.jsを使えるように設定します。

`npm run dev` コマンドを実行した状態かと思いますので、一旦 `ctrl + c` キーを押してnuxt.jsのサーバーを停止し、以下のコマンドで@solana/web3.jsをインストールします。

$ npm i @solana/web3.js

そして、先程作成したfrontend/frontend/pages/index.vueファイルを下記のように修正します。

frontend/frontend/pages/index.vue

<template>
<div>
  <h1>プログラム実行</h1>
  <button @click="main">プログラム実行</button>
</div>
</template>

<script>
import {
TransactionInstruction,
PublicKey,
sendAndConfirmTransaction,
Transaction,
Connection,
Account
} from '@solana/web3.js';

export default {
 methods: {
   test(connection, account){
     const instruction = new TransactionInstruction({
       keys: [],
       // sampleプログラムのID
       programId: new PublicKey('CZUgyTgTymhzaswZV2qLAFfMw856KJCb8WL2bqQQ38RB'),
       data: '',
     });
     console.log("account:", account.publicKey.toBase58())
     sendAndConfirmTransaction(
         connection,
         new Transaction().add(instruction),
         [account],
         {
             skipPreflight: true,
             commitment: "singleGossip",
         },
     ).then(()=>{console.log("done")}).catch((e)=>{console.log("error",e)});
   },
   main() {
     // devnetのコネクション作成
     let connection = new Connection("https://devnet.solana.com", 'singleGossip');
     // プログラム実行するためのアカウント作成
     const account = new Account()
     const lamports = 10*1000000000
     connection.requestAirdrop(account.publicKey, lamports).then(()=>{
       console.log("airdrop done")
       this.test(connection, account)
     });
   },
 },
}
</script>

ここで `programId` で指定した `CZUgyTgTymhzaswZV2qLAFfMw856KJCb8WL2bqQQ38RB` は、前回のnoteで作成したプログラムのIDです。

ファイルを修正したら、再度下記のコマンドでnuxtを実行します。

$ npm run dev

ブラウザに表示されたボタンをクリックすると、devnetにデプロイしたSolanaのプログラムを実行できていることが分かります。

実行結果はこちら

上記のリンク先から、ご自身のプログラムのIDを検索すると、実行されたトランザクションを確認することができます。

まとめ

簡単でしたが、Nuxt.jsを使って、前回下記の記事でデプロイしたSolanaのオンチェーンプログラムを実行することができました。次回以降、Solanaのhelloworldサンプルプログラムを触って解説したり、Solanaでの開発に関するnoteを記載したいと思います。


この記事が気に入ったらサポートをしてみませんか?