NFT(non-fungible token)はその名の通り「代替不可能」なトークンであり、本人認証ツールとしての利用に非常に適しています。

次に、簡単な例を通じて、NFT を登録証明書として使用する可能性を検討してみましょう。

序文

始める前に、次に使用するツールを紹介しましょう。

SPLトークン

新しい Solana コントラクトを最初から作成することもできますが、現在達成したい目的のためには、Solana: Token Program によって提供される一般的な実装を直接使用できます。

トークン プログラムは、Solana プログラム ライブラリ (SPL、 https://spl.solana.com/ ) の一部であり、トークン、スワップ、メモなどの複数の共通プログラム実装と、完全なクライアント ライブラリおよび CLI およびその他のツールを提供します。 、Solana 開発者にとって非常に容易になります。
トークン プログラムのプロジェクト ソース コードは、 https://github.com/solana-labs/solana-program-library/tree/master/token/programにあります。

ソラナ プレイグラウンド

Solpy ( https://beta.solpg.io/)は、Solana コントラクトをオンラインで作成および展開するための環境を提供し、前のセクションで紹介した SPL トークンなど、一般的に使用されるいくつかのツールがデフォルトで含まれています。これにより、spl-token-cli を通じてトークンを簡単に作成および管理できるようになります。

認証トークン

このパートでは、NFT トークンを作成します。ユーザーが Mint Token の場合、ウォレット アドレスはシステムに登録されているとみなされます。そうでない場合は、ユーザーは最初に登録するように求められます。

それでは、オンチェーン部分から始めましょう。

トークンの作成

spl-token を使用して新しいトークンを作成し、それが不可分トークン (NFT と同様) であることを指定するために「--decmals」を渡します。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

以下のようなログが出力されます。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

このうち、 69yXraTu3FqXZkATg6MiRnWT2qHd4tRzWsfCHHE9j2XEはミント アドレスと呼ばれることが多く、作成したトークンの ID でもあります。

トークンアドレスは次のとおりです。

https://solscan.io/token/69yXraTu3FqXZkATg6MiRnWT2qHd4tRzWsfCHHE9j2XE?cluster=devnet

トークンアカウントの作成

次に、前の手順で作成したトークンのトークン アカウントを作成する必要があります。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

ミント

他のウォレットアドレスで新しいトークンを鋳造する前に、まず前のステップで作成したトークンアカウントのトークンユニットを鋳造してみましょう。次のように入力するだけです:

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

以下のようなログが出力されます。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

あるいは:

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

1.9 など、ミントの他の値を試すこともできます。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

トランザクションの詳細を見ると、最初の手順でTokenを作成するときに「--decimals」を0に指定したため、実際にmintが実行されると、小数部分が切り捨てられるため、mintの量は1のままです。 。

mint トークンをウォレット アドレスに直接与えることもできます。ここでは4wztJ4CAH4GbAUopZrVk7nLvoAC3KAF6ttMMWfnBRG1tを使用して説明します。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

ウォレットアドレスのミント

上記のミント操作の対象はトークンミントアドレスであり、当初の考えによれば、ミントは私たちに属さない他のウォレットアドレスに与えられるべきです。

次に、Web3 ユーザーのウォレット アドレスを使用して上記のミント手順を完了しましょう。

  • 上記のトークンを直接使用します69yXraTu3FqXZkATg6MiRnWT2qHd4tRzWsfCHHE9j2XE
  • ウォレットアドレス: 4wztJ4CAH4GbAUopZrVk7nLvoAC3KAF6ttMMWfnBRG1tを使用します。

しかし、パラメータを直接置き換えるだけでは、予期しない結果が得られます。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

アドレスは存在しますが、Mint が必要とするアドレスは元のウォレットのアドレスではなく、それに関連付ける必要があるトークン アカウントです。

上記と同じプロセスを実行する必要があります。ウォレット アドレスのトークン アカウントを作成し、作成したトークン アカウントを使用して新しいトークン ユニットを作成します。

言い換えれば、特定のウォレット アドレスのトークン ユニットを鋳造したい場合は、最初にこのウォレット アドレスのトークン アカウントを作成する必要があります。なぜこのようなことをする必要があるのか​​というと、理由の 1 つは、特定のアドレスのデータを直接変更する権限がないためです。

Solana のドキュメントでは、トークン アカウントと関連トークン アカウント (ATA) という 2 つの類似した概念が登場することがあります。ドキュメントではこの 2 つは関連しているように見えますが、これについては説明されておらず、非常に混乱しています。
しかし、Metaplex のドキュメントを見ると、「関連付けられたトークン アカウント。単にトークン アカウントと呼ばれることもあります」と明確に記載されていることがわかります。
ここではこの 2 つについては詳しく説明しません。トークン アカウントがトークンとウォレット アドレスの間の仲介者であると想像してください。

次のコマンドを使用して、ウォレット アドレスのトークン アカウントを作成します。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

作成を繰り返すとエラーが発生します。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

決定された Mint アカウントとウォレット アドレスから派生したトークン アカウント ( 3JocyxV4LX4VbNU248CvNozZphgRW5JTyxn7FPWrF8bx ) が決定されたこともログで確認できますが、既に存在しているため、エラー メッセージが出力されます。

トークンアカウントの取得

RPC インターフェイスを使用して、特定のウォレット アドレスに作成した NFT がミントされているかどうかを取得する必要があります。具体的には、「getTokenAccountsByOwner」メソッドを通じてデータをクエリします。インターフェイスに必要なパラメータは次のとおりです。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

「_YOUR_RPC_PROVIDER_」を、選択した RPC プロバイダーから提供されるアドレスに置き換える必要があります。

Solana によって公式に提供されたアドレスを使用することも、パブリックの無料 RPC ネットワークをここで見つけることもできます: https://zan.top/service/public-rpc/solana

注: パブリック アドレスは不安定である可能性があります。安定した RPC サービスが必要な場合は、独自の API キーを作成することをお勧めします。

上記のウォレット アドレスの詳細は次のとおりです。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

コードを通じてリクエスト パラメーターを手動で入力するだけでなく、@solana/web3.js で提供される接続で "getParsedTokenAccountsByOwner" メソッドを使用することもできます。実際には、"getParsedTokenAccountsByOwner" メソッドは、繋がり。

すでにアカウント トークンを作成しているウォレットの場合は、次の値が返されます。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

役に立たなくなった削除されたデータ

成し遂げる

上記の試みを通じて、既存の機能を使用して必要な機能を実現できることがわかります。次に、クライアント コードの作成を開始します。

次のコードはhttps://github.com/gin-lsl/my-sol-token-auth-exampleにあります。
ここでプレビューできます: https://my-sol-token-auth-example.vercel.app/

Ant Design Web3 を使用してウォレットに接続する簡単な Nextjs プロジェクトを作成して実装します。

Nextjsプロジェクトの初期化

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

すべてのオプションにデフォルト値を使用します。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

すぐに始めるために、@ant-design/web3-solana を直接使用してウォレットに接続し、@solana/spl-token を使用してトークン プログラムと対話します。

関連する依存関係を追加します。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

ホーム ページに app/sign-in/page.tsx と app/sign-on/page.tsx を作成する 3 つのページを含める必要があります。これらはそれぞれ、ウォレットに接続してユーザーが登録したかどうか(ミント NFT かどうか)を確認するため、およびユーザーが登録プロセスを実行できるようにする(ミント NFT )ために使用されます。

デモ ページを開くと、最初にウェルカム メッセージとサインイン ページへのリンクが表示されます。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

ページに入ったら、まずサインインする必要があります。

「Solana で続行」をクリックすると、ウォレットが呼び出されます。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

まだ登録していない場合は、最初に登録するように求められます。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

これは、/api/sign-in のロジックで、関連付けられたトークン アカウントが接続されたウォレット アドレスに基づいて検索されるためです。これまで使ったことがないので当然データが見つからないので、システムはこのウォレットアドレスが登録されていないものとみなします。

次に、プロンプトに従ってサインオン ページに移動します。登録ページは、サーバー側の処理ロジックが異なることを除いて、ログイン ページとほぼ同じです。

実際には、2 つのロジックを組み合わせることができますが、ここではデモンストレーションの便宜上、それらを分離しています。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

とにかく、「Start with Solana」をクリックしてウォレットを接続しましょう。すべてがうまくいけば、成功メッセージが表示されます。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

Solscan にアクセスして、何が起こっているのか見てみましょう。 https://solscan.io/?cluster=devnet と入力し、ウォレットのアドレスを確認します。または、次のアドレスを確認することもできます: 79reVF46NyuuH7PADR3i6RpQ7hmBZgYkiieXNYPM1oLF

次のトランザクション データがあります。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

手順では、CreateAccount 命令がトランザクション内で実行されることがわかります。リンクをクリックして詳細を入力すると、作成されるのが TokenAccount: EXfDYkHw3UQw2VqiSLsRAfLMsxkgqnd3nhxbB4V5HAvAであることがわかります。 isOnCurve 値は False で、秘密キーのない関連付けられたアカウントであることを示します。

前のページに戻り、[ポートフォリオ] -> [NFT] に移動すると、サインオン内で行ったばかりの Mint 操作と Mint NFT が表示されます。

Web3 初心者シリーズ: Solana トークンを使用したログインを探索する

要約する

プロセス全体をまとめてみましょう。 spl-token-cli を使用して NFT を作成し、ウォレット アドレスにトークン アカウントがあるかどうかを確認し、トークンを作成して Web サイトに登録されているかどうかを判断します。

Web3 ユーザーがウォレットに接続すると、サインオンが自動的にバックエンドに送信され、内部でトークン アカウントが作成され、ユーザーの登録資格情報としてトークン ユニットが作成されます。

将来的には、ユーザーは同じウォレット アドレスを使用して当社の Web サイトに再度ログインできるようになります。

この記事は ZAN チーム (X アカウント@zan_team ) の gin-lsl が執筆しました。