Amazon Web Services ブログ

トークンベースアクセスを使用した Amazon Managed Blockchain Ethereum Node API への接続方法のご紹介

このブログは、Everton Fraga によって書かれた Introducing token-based access to Ethereum node APIs on Amazon Managed Blockchain を翻訳したものです。

2022 年 10 月 22 日、Amazon Managed Blockchain for Ethereum は、Ethereum ノードへの相互運用可能なアクセスの代替方法として、トークンベースアクセスを用いたHTTPS とセキュア WebSocket 用のJSON-RPC API の提供を開始しました。このブログでは、Ethereum ノードをデプロイし、Accessor トークンを使用して JSON-RPC API にアクセスする方法を紹介します。

Amazon Managed Blockchain は、プロダクショングレードのブロックチェーンインフラをセットアップして運用することができるフルマネージドサービスです。このサービスでは、パブリックな Ethereum ネットワーク (Mainnet、Goerli、Ropsten、Rinkeby) に接続するためのフルノードを迅速に構築することができます。Amazon Managed Blockchain for Ethereum は、完全同期した Go-ethereum (geth) ノードのスピンアップという重作業を行い、ブロックチェーンからのデータ読み取り、トランザクションのブロードキャスト、オンチェーンイベントへのサブスクライブを可能にします。このサービスでは、インスタンスの設定、ソフトウェアのパッチ適用、およびノードが常に正常であることの確認を行います。

Amazon Managed Blockchain から Ethereum RPC API にアクセスする一般的な方法は、AWS SDK 呼び出しの認証に使用されるハッシュベースのメッセージ認証コード (HMAC) メカニズムである 署名バージョン 4 (SigV4) を使用する方法です。署名時にリクエストの有効期限を設定したり、リクエストごとに明示的なペイロード署名を行えるなど、いくつかのセキュリティ機能を備えています。

SigV4 はリクエストを認証する主な方法ですが、Ethereum RPC エンドポイントへの直接接続を前提とした確立されたコミュニティツール (Ethers.js、HardHat、MetaMask、The Graph、Chainlink、POKT Network、Ethereum ETLなど)との相互運用性に課題があります。これらはリクエストに AWS SigV4 署名を作成および付加するように設計されていません。お客様は、Ethereum 開発者ツールを使用するアプリケーションから Amazon Managed Blockchain でホストされているノードへのミッドフライトリクエストに署名できるミドルウェアまたはカスタムプロキシに依存してきました。Amazon Managed Blockchain 上の Ethereum ノードへの新しいアクセス方法であるトークンベースアクセスは、お客様が SigV4 署名ではなく、トークンを使用してノードにアクセスできるようにすることで、この相互運用性の問題を解決します。これらのトークン (Accessor) は、新しく導入されたエンドポイントに対するリクエストオブジェクトの一部として提供できるようになりました。

SigV4 と Accessors はどう使い分けるべきか?

AWS SigV4 または Accessors を使用するオプションがあるため、Amazon Managed Blockchain 上の Ethereum ノードにアクセスするための各方法を、いつ使用するべきかを理解することが重要です。SigV4 は利便性よりもセキュリティと監査性を優先し、Accessors は利便性とアクセスの容易さを優先します。Accessors は、インターネットを介して Amazon Managed Blockchain の Ethereum ノードに直接アクセスする必要があるローカル開発環境、特に Hardhat や Ethers.js のような開発ツールを使用する場合には最適な方法です。しかし、本番アプリケーション、特にバックエンドアプリケーションを使用して Ethereum ノードとやり取りする場合は、Sigv4 がアクセス方法として推奨されます。AWS スタック内のバックエンドアプリケーションから Ethereum ノードへのリクエストに適切な SigV4 署名を付与するのに必要な労力は最小限です。
トークンベースアクセスによる Accessor の使用に関するその他の検討事項については、Amazon Managed Blockchain Ethereum Developer Guide を参照してください。

前提条件

このガイドでは、AWS Command-Line Interface (CLI) が必要です。AWS CLI の最新バージョンをインストールまたは更新します。のページを参照してください。

Amazon Managed Blockchain for Ethereum からデータにアクセスするには、少なくとも 1 つの Ethereum ノードが利用可能である必要があります。以下のコマンドは、us-east-1 リージョン (バージニア北部) の us-east-1a アベイラビリティゾーンにあるパブリック Goerli テストネット上に Ethereum ノードを作成する方法を示しています。Amazon Managed Blockchain 上での Ethereum ノードの作成について詳しく知りたい場合は、Working with Ethereum nodes using Managed Blockchain を参照してください。または、Amazon Managed Blockchain Console にアクセスしてノードを作成します。

$ aws managedblockchain create-node \
--network-id=n-ethereum-goerli \
--region=us-east-1 \
--node-configuration='{"InstanceType":"bc.t3.large","AvailabilityZone":"us-east-1a"}'

注:Goerli と Mainnet ノードの作成には、それぞれ約30分から60分かかります。
Amazon Managed Blockchainが利用できるリージョンの完全なリストは、Service Endpoints Page または AWS Regional Services List を参照してください。

最初の Accessor を作成する

Ethereum サーバーの RPC データにアクセスするには、まずアカウントと選択したリージョンに対して、少なくとも 1 つのアクティブな Accessor を用意する必要があります。アカウント内で利用可能な Ethereum ノードに対応する特定のエンドポイント URL に、Accessor の属性の 1 つである BillingToken を後ほど追加します。以下のコマンドで Accessor を作成します。

$ aws managedblockchain create-accessor --accessor-type=BILLING_TOKEN
{
    "AccessorId": "ac-XXXXXXXXXXXXXXXXXXXXXXXXXX",
    "BillingToken": "Abc-D01efGhiJKLmn234MNOPqrS_TuvWxyzA56bcd7"
}

注:aws: error: argument operation: Invalid choice というエラーメッセージが表示された場合は、最新のAWS CLIバージョンを使用していることを確認してください。

billing token は、create-accessorget-accessor SDK の呼び出しでのみ返されます。あるいは、次のコードは、既存の Accessors に関する情報を表示する2つの方法を示しています。

$ aws managedblockchain list-accessors
{
    "Accessors": [
        {
            "Id": "ac-XXXXXXXXXXXXXXXXXXXXXXXXXX",
            "Type": "BILLING_TOKEN",
            "Status": "AVAILABLE",
            "CreationDate": "2022-10-11T14:47:56.827000+00:00",
            "Arn": "arn:aws:managedblockchain:us-east-1:1234567890:accessors/ac-XXXXXXXXXXXXXXXXXXXXXXXXXX"
        }
    ]
}

$ aws managedblockchain get-accessor --accessor-id="ac-XXXXXXXXXXXXXXXXXXXXXXXXXX"
{
    "BillingToken": "Abc-D01efGhiJKLmn234MNOPqrS_TuvWxyzA56bcd7"
    "Id": "ac-XXXXXXXXXXXXXXXXXXXXXXXXXX",
    "Type": "BILLING_TOKEN",
    "Status": "AVAILABLE",
    "CreationDate": "2022-10-11T14:47:56.827000+00:00",
    "Arn": "arn:aws:managedblockchain:us-east-1:1234567890:accessors/ac-XXXXXXXXXXXXXXXXXXXXXXXXXX"
}

Accessor の操作に関する情報については、ドキュメント Using token based access to make Ethereum API calls to Ethereum nodes in Amazon Managed Blockchain を参照してください。

トークンでアクセス可能なエンドポイントの HTTPS およびセキュアな WebSocket URL を構築する

HTTPS とセキュア WebSocket の URL を構築するには、以下のコードを使用します。

# Ethereum Goerli テストネットワーク用のノード情報の取得
$ aws managedblockchain list-nodes --network-id=n-ethereum-goerli
{
    "Nodes": [
        {
            "Id": "nd-YYYYYYYYYYYYYYYYYYYYYYYYYY",
            "Status": "AVAILABLE",
            "CreationDate": "2022-01-01T00:00:00.000000+00:00",
            "AvailabilityZone": "us-east-1a",
            "InstanceType": "bc.t3.xlarge",
            "Arn": "arn:aws:managedblockchain:us-east-1:199335414706:nodes/nd-YYYYYYYYYYYYYYYYYYYYYYYYYY"
        }
    ]
}

エンドポイント URL は、SigV4 で使用される従来のものとは異なる特定の形式を持っています。以下の Python コードは、最終的なエンドポイント URL を得るために必要なテキスト補間を行っています。

aws_region = "us-east-1"
node_id = "nd-YYYYYYYYYYYYYYYYYYYYYYYYYY"
accessor_token = "Abc-D01efGhiJKLmn234MNOPqrS_TuvWxyzA56bcd7"

endpoint_https = "https://{node_id}.t.ethereum.managedblockchain.{aws_region}.amazonaws.com/?billingtoken={accessor_token}".format(node_id=node_id, aws_region=aws_region, accessor_token=accessor_token)
# https://nd-YYYYYYYYYYYYYYYYYYYYYYYYYY.t.ethereum.managedblockchain.us-east-1.amazonaws.com/?billingtoken=Abc-D01efGhiJKLmn234MNOPqrS_TuvWxyzA56bcd7

endpoint_wss = "wss://{node_id}.wss.t.ethereum.managedblockchain.{aws_region}.amazonaws.com/?billingtoken={accessor_token}".format(node_id=node_id, aws_region=aws_region, accessor_token=accessor_token)
# wss://nd-YYYYYYYYYYYYYYYYYYYYYYYYYY.wss.t.ethereum.managedblockchain.us-east-1.amazonaws.com/?billingtoken=Abc-D01efGhiJKLmn234MNOPqrS_TuvWxyzA56bcd7

トークンベースのエンドポイントをテストする

このセクションでは、トークンベースのエンドポイントをテストするための 2 つの方法を紹介します。

HTTPS エンドポイントを使ったテスト

以下のコードは、RPC リクエストを処理するためのライブラリ Web3.py をインストールし、Python REPL を使用して、HTTPS接続を介してコマンドを実行する方法を示しています。エンドポイントは従来の SigV4 とは異なり、.t. のサブドメインを含んでいることに注意してください。

$ pip install web3

$ python

>>> from web3 import Web3

>>> endpoint_https = "https://nd-YYYYYYYYYYYYYYYYYYYYYYYYYY.t.ethereum.managedblockchain.us-east-1.amazonaws.com/?billingtoken=Abc-D01efGhiJKLmn234MNOPqrS_TuvWxyzA56bcd7"

# Create a HTTPProvider with the proper endpoint
>>> w3 = Web3(Web3.HTTPProvider(endpoint_https))

# Check the latest block number
>>> w3.eth.blockNumber
7925328

# Check how many gas units were consumed in the latest block
>>> w3.eth.getBlock("latest", False).gasUsed
4607505

wscat を使用したセキュアな WebSocket エンドポイントのテスト

wscat は、WebSocket エンドポイントへの簡単なインターフェイスを提供するコミュニティ Node.js ツールです。接続先の URL を指定してコマンドを実行すると、プロンプトに入力された内容がリモートエンドポイントに転送されます。レスポンスはすべて、現在のセッションですぐに表示されます。次のコードを参照してください。

$ wscat -c "wss://nd-YYYYYYYYYYYYYYYYYYYYYYYYYY.wss.t.ethereum.managedblockchain.us-east-1.amazonaws.com/?billingtoken=Abc-D01efGhiJKLmn234MNOPqrS_TuvWxyzA56bcd7"

Connected (press CTRL+C to quit)
> {"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id": 1}

> {"jsonrpc":"2.0","id":1,"result":"0x78d07b"}

まとめ

Accessors は Amazon Managed Blockchain が提供する Ethereum ノードと対話する新しい方法を開放し、Ethers.js、HardHat、MetaMask などの一般的なツールを使用して Ethereum アプリケーションを開発およびテストする際に必要なミドルウェアやプロキシへの依存を軽減します。セキュリティと監査可能性が最も重要な場合、SigV4 認証を使用することができますし使用すべきですが、トークンベースアクセスは、Ethereum ノードにアクセスするための便利な方法を提供します。

質問がある場合は、Ethereum Stack Exchange、または AWS re:post を使用して、AWS Blockchain コミュニティに参加できます。

著者について

Everton Fraga は、AWS の Sr.Blockchain/Web3 Specialist SA として勤務しています。彼は世界中の企業が Web3 インフラストラクチャとアプリケーションを構築するのを支援しています。Ethereum Foundation の元ソフトウェアエンジニアです。

このブログは、ソリューションアーキテクトの 木村 直登 が翻訳しました。原文はこちらをご覧ください。