![見出し画像](https://assets.st-note.com/production/uploads/images/145229720/rectangle_large_type_2_55013931bd0e9b76ff424f83184c445d.png?width=1200)
SolanaのActionsとBlinksについて学ぼう!
この記事は、公式のこちらのBlinksまでの章を翻訳・編集したものです。
1 Actions とBlinks
1 Actionsとは
Solana Actionsは、APIに準拠した仕様を使用してトランザクションを返します。
それにより、QRコード、ボタン+ウィジェット、インターネット上のウェブサイトなど、さまざまなコンテキストでブロックチェーントランザクションをプレビュー、署名、送信できます。
Actionsを使用すると、開発者はSolanaエコシステム全体で行える操作を簡単に統合でき、別のアプリやウェブページにナビゲートすることなくブロックチェーントランザクションを実行できます。
2 Blinksとは
Blockchain links(Blinks)は、任意のSolana Actionを共有可能でメタデータ豊富なリンクに変換します。
ブリンクは、Action対応クライアント(ブラウザ拡張ウォレット、ボット)がユーザーに追加機能を表示できるようにします。
ウェブサイト上では、ブリンクはウォレットでのトランザクションプレビューを即座にトリガーするかもしれません。
Discordでは、ボットがブリンクを対話型のボタンのセットに展開するかもしれません。
補足
翻訳者の理解としては、例えば、ウェブサイト上で何かの投票に対して、「賛成」「反対」というボタンがあり、それを押すと実行されるようなイメージを持っています。
これにより、URLを表示できる任意のウェブサーフェスでオンチェーンでの対話が可能になります。
2 Actions
Solana Actions仕様は、アプリケーションからユーザーへ直接署名可能なトランザクション(将来的には署名可能なメッセージ)を提供する標準APIのセットを使用します。
これらは公開URLでホストされ、任意のクライアントがこのURLを介して対話できます。
INFO
Actionsは、メタデータとユーザーのブロックチェーンウォレットで署名する何か(トランザクションまたは認証メッセージ)を返すAPIエンドポイントと考えることができます。
Actions APIは、ActionのURLエンドポイントに対してGETおよびPOSTリクエストを行い、Actionsインタフェースに準拠するレスポンスを処理することで構成されます。
GETリクエストは、このURLで利用可能なアクションについてクライアントに人間が読める情報を提供するメタデータを返します。
POSTリクエストは、クライアントがユーザーのウォレットに署名と実行を促す署名可能なトランザクションまたはメッセージを返します。
2 Action Execution and Lifecycle
実際には、Actionsとの対話は典型的なREST APIとの対話に非常に似ています。
2ー1 GETリクエスト
クライアントは、利用可能なActionsに関するメタデータを取得するためにAction URLへの初期GETリクエストを行います。
![](https://assets.st-note.com/img/1719355861606-uvQLDgLZxn.png?width=1200)
2ー2 リスポンスの返し
エンドポイントは、エンドポイントに関するメタデータ(アプリケーションのタイトルやアイコンなど)とこのエンドポイントで利用可能なアクションのリストを含むレスポンスを返します。
![](https://assets.st-note.com/img/1719355993176-59g4cbXaEJ.png?width=1200)
2ー3 UIの表示
クライアントアプリケーション(モバイルウォレット、チャットボット、ウェブサイトなど)は、ユーザーがアクションの1つを実行するためのUIを表示します。
![](https://assets.st-note.com/img/1719356013342-T3K1GXYrk3.png?width=1200)
2ー4 POSTリクエスト
ユーザーがアクションを選択すると(ボタンをクリックするなど)、クライアントはエンドポイントにPOSTリクエストを行い、ユーザーが署名するトランザクションを取得します。
![](https://assets.st-note.com/img/1719356096912-hoboU8a612.png?width=1200)
2ー5 ブロックチェーンへの送信
ウォレットはユーザーのトランザクション署名を促進し、最終的にはトランザクションをブロックチェーンに送信して確認します。
![](https://assets.st-note.com/img/1719356192647-iBxoKTTX2B.png?width=1200)
Solana Actionsの実行とライフサイクルでは、Actions URLからトランザクションを受け取る際、クライアントはこれらのトランザクションをブロックチェーンに送信し、その状態ライフサイクルを管理する必要があります。
Actionsは実行前に無効化の一定レベルをサポートしています。GETおよびPOSTリクエストは、アクションが実行可能かどうかを示すメタデータを返すことがあります(たとえば「disabled」フィールドを使用して)。
例えば、DAOガバナンス提案に投票するためのActionエンドポイントがあり、投票ウィンドウが閉じていた場合、初期のGETリクエストは「この提案はもはや投票の対象ではありません」というエラーメッセージを返し、「賛成投票」と「反対投票」のボタンを「無効」にします。
3 Blinks
ブリンク(ブロックチェーンリンク)は、Action APIを内省し、Actionsの対話および実行を周囲のユーザーインターフェイスで構築するクライアントアプリケーションです。
ブリンクに対応するクライアントアプリケーションは単にAction互換のURLを検出し、それを解析し、標準化されたユーザーインターフェースでユーザーがそれらと対話できるようにします。
INFO
完全にAction APIを内省して完全なインターフェースを構築するクライアントアプリケーションはブリンクです。したがって、Action APIを利用するすべてのクライアントがブリンクであるわけではありません。
2 Blink URL Specification
ブリンクURLは、ユーザーがActionを完全に実行するためのライフサイクルを含む、ウォレットでの署名を可能にするクライアントアプリケーションを記述します。
https://example.domain/?action=<action_url>
クライアントアプリケーションがブリンクになるためには
2ー1 URLエンコードの要求
ブリンクURLは、URLエンコードされたAction URLの値であるactionというクエリパラメータを含む必要があります。
この値は他のプロトコルパラメータとの衝突を避けるためにURLエンコードされている必要があります。
2ー2 URLデコードと内省
クライアントアプリケーションは、actionクエリパラメータをURLデコードし、提供されたAction APIリンクを内省します。
これにより、正しいアクションが処理されることを確認します。
補足
内省(introspection)とは、プログラムが自身の構造や、他のプログラムの構造(この場合はAPIのエンドポイント)を調べることを意味します。
2ー3 リッチUIのレンダリング
クライアントは、ユーザーがActionの完全なライフサイクルを実行するための豊かなユーザーインターフェースをレンダリングする必要があります。
INFO
すべてのブリンククライアントアプリケーション(例えば、ウェブサイトやdApps)がすべてのActionsをサポートするわけではありません。
アプリケーション開発者は、自身のブリンクインターフェイスでサポートするActionsを選択することができます。
以下の例は、アクション値が
solana-action:https://actions.alice.com/donate
であり、URLエンコードされている有効なブリンクURLを示しています。
https://example.domain/?action=solana-action%3Ahttps%3A%2F%2Factions.alice.com%2Fdonate
補足
一見何だか難しそうですが、「:(コロン)」は「%3A」に、「/(スラッシュ)」 は「%2F」にURLエンコードしているだけです。
3 Blinksを通じてActionsを検出する
ブリンクは少なくとも3つの方法でActionsにリンクすることができます:
3ー1 明示的なAction URLを共有する
solana-action:https://actions.alice.com/donate
この場合、サポートされているクライアントのみがブリンクをレンダリングできます。
![](https://assets.st-note.com/img/1719357593694-hwhGKRrfOG.png?width=1200)
サポートされていないクライアントではフォールバックリンクプレビューは表示されず、訪問できるサイトも存在しません。
3ー2 JSONファイルを介した共有
ウェブサイトのドメインルートにあるactions.jsonファイルを介してActions APIにリンクされたウェブサイトへのリンクを共有する。
例えば、https://alice.com/actions.jsonは、ユーザーがAliceに寄付できるウェブサイトURL https://alice.com/donateをAPI URL https://actions.alice.com/donateにマッピングします。
![](https://assets.st-note.com/img/1719357819258-nESCzY6NBn.png?width=1200)
3 Action URLの埋め込み
Actionsを解析する方法を理解している「中間」サイトURLにAction URLを埋め込む。
https://example.domain/?action=<action_url>
![](https://assets.st-note.com/img/1719357905625-KzMPqKWwVa.png?width=1200)
ブリンクをサポートするクライアントは、上記のいずれかの形式を取り、クライアントでアクションを直接実行するためのインターフェースを正しくレンダリングすることができるはずです。
サポートされていないクライアントの場合、基礎となるウェブサイトがあるべきであり(ブラウザが普遍的なフォールバックになる)、ユーザーがアクションボタンやテキスト入力フィールド以外のどこかをタップすると、基礎となるサイトに連れて行かれるべきです。
補足
つまり、ユーザーがどのデバイスやアプリケーションを使用していても、関連するアクションにアクセスしやすくなるようにするための措置ですね。
4 Blinkのテストと検証
SolanaのActionsとBlinksはパーミッションレス(事前の許可なしで利用できる)プロトコルです。
しかし、最終的にはクライアントアプリケーションやウォレットがユーザーがトランザクションを署名するための手続きを容易にする必要があります。
各クライアントアプリケーションやウォレットは、どのActionエンドポイントを自動的に展開(unfurl)し、ソーシャルメディアプラットフォーム上で即座にユーザーに表示するかについて異なる要件を持っている可能性があります。
例えば、いくつかのクライアントは、「許可リスト」アプローチを採用し、クライアントがユーザーのためにActionを自動的に展開(unfurl)する前に検証を要求する場合があります(以下で詳述するDialectのActions Registryを参照)。
すべてのブリンクは、Dialectのdial.to blinks Interstitialサイト上でレンダリングされ、署名が可能になります。
このサイトでは、各ブリンクのレジストリステータスが表示されるため、ユーザーはそのブリンクが信頼できるものかどうかを一目で確認することができます。
![](https://assets.st-note.com/img/1719354987369-g2tTFIgG9z.png?width=1200)
5 DialectのActions Registry
Solanaエコシステムのための公共財として、DialectはSolana Foundationや他のコミュニティメンバーの協力を得て、既知のソースから事前に検証されたブロックチェーンリンクの公共レジストリを維持しています。
ローンチ時点で、Dialectレジストリに登録されているActionsのみがTwitterフィードに投稿された際に自動的に展開されます。
クライアントアプリケーションやウォレットは、この公共レジストリを自由に使用するか、ユーザーの安全とセキュリティを確保するために他のソリューションを選択することができます。
Dialectレジストリを通じて検証されていない場合、ブロックチェーンリンクはブリンククライアントに触れられず、一般的なURLとしてレンダリングされます。
開発者はこちらで検証を申請することができます。 dial.to/register
これにより、ブリンクとActionsの全体的な概要と動作メカニズムが完了します。
これらの概念は、ブロックチェーンアクションの統合と実行を簡素化し、開発者やユーザーがSolanaプラットフォームをより広範囲にわたって利用できるように設計されています。
いいなと思ったら応援しよう!
![ユウキ](https://assets.st-note.com/production/uploads/images/52347520/profile_e7d36b385c74618d7fec56da47f68a35.jpeg?width=600&crop=1:1,smart)